Hi Shameer, On 2/6/26 3:48 PM, Shameer Kolothum wrote: > When a VCMDQ is mapped and VINTF page0 is available, read and write > VCMDQ registers directly via the VINTF page0 backing instead of using > cached register values.
At this stage of the reading I do not really understand the dance between mmap and not mmapped. Please could you elaborate? > > Signed-off-by: Shameer Kolothum <[email protected]> > --- > hw/arm/tegra241-cmdqv.c | 44 +++++++++++++++++++++++++++++++++++++++-- > 1 file changed, 42 insertions(+), 2 deletions(-) > > diff --git a/hw/arm/tegra241-cmdqv.c b/hw/arm/tegra241-cmdqv.c > index 153fd70edb..c7e70d8e1d 100644 > --- a/hw/arm/tegra241-cmdqv.c > +++ b/hw/arm/tegra241-cmdqv.c > @@ -38,12 +38,32 @@ static bool tegra241_cmdqv_mmap_vintf_page0(Tegra241CMDQV > *cmdqv, Error **errp) > * > * The caller normalizes the MMIO offset such that @offset0 always refers > * to a VCMDQ0_* register, while @index selects the VCMDQ instance. > - * > - * All VCMDQ accesses are currently trapped. Use cached registers > */ > static uint64_t tegra241_cmdqv_read_vcmdq(Tegra241CMDQV *cmdqv, hwaddr > offset0, s/offset0/offset? > int index) > { > + > + /* > + * If this VCMDQ is mapped and VINTF page0 is available, read directly > + * from the VINTF page0 backing. Otherwise, fall back to cached state. > + */ > + if (cmdqv->vcmdq[index] && cmdqv->vintf_page0_mapped) { > + uint64_t off = (index * 0x80) + (offset0 - 0x10000); > + uint32_t *ptr = (uint32_t *)(cmdqv->vintf_page0 + off); nit: you could introduce a static helper that return ptr from cmdqv, index, offset0 or returns NULL if the VINTF is not mapped. resuable in write(). > + > + switch (offset0) { > + case A_VCMDQ0_CONS_INDX: > + case A_VCMDQ0_PROD_INDX: > + case A_VCMDQ0_CONFIG: > + case A_VCMDQ0_STATUS: > + case A_VCMDQ0_GERROR: > + case A_VCMDQ0_GERRORN: > + return *ptr; > + default: > + break; > + } > + } > + > switch (offset0) { > case A_VCMDQ0_CONS_INDX: > return cmdqv->vcmdq_cons_indx[index]; > @@ -241,6 +261,26 @@ tegra241_cmdqv_write_vcmdq(Tegra241CMDQV *cmdqv, hwaddr > offset0, int index, > uint64_t value, unsigned size, Error **errp) > { > > + /* > + * If this VCMDQ is mapped and VINTF page0 is available, write directly > + * to the VINTF page0 backing. Otherwise, update cached state. > + */ > + if (cmdqv->vcmdq[index] && cmdqv->vintf_page0_mapped) { > + uint64_t off = (index * 0x80) + (offset0 - 0x10000); > + uint32_t *ptr = (uint32_t *)(cmdqv->vintf_page0 + off); > + > + switch (offset0) { > + case A_VCMDQ0_CONS_INDX: > + case A_VCMDQ0_PROD_INDX: > + case A_VCMDQ0_CONFIG: > + case A_VCMDQ0_GERRORN: > + *ptr = (uint32_t)value; > + return; > + default: > + break; > + } > + } > + > switch (offset0) { > case A_VCMDQ0_CONS_INDX: > cmdqv->vcmdq_cons_indx[index] = value; Thanks Eric
