On Thu, 26 Feb 2026 10:50:39 +0000 Shameer Kolothum <[email protected]> wrote:
> From: Nicolin Chen <[email protected]> > > Tegra241 CMDQV exposes per-VCMDQ register windows through two MMIO views: > > -Global VCMDQ registers at 0x10000/0x20000 > -VINTF VCMDQ (VI_VCMDQ) registers at 0x30000/0x40000 > > The VI_VCMDQ register ranges are an alias of the global VCMDQ registers > and are only meaningful when a VCMDQ is mapped to a VINTF via ioctl > IOMMU_HW_QUEUE_ALLOC. > > Add read side emulation for both global VCMDQ and VI_VCMDQ register > ranges. MMIO accesses are decoded to extract the VCMDQ instance index > and normalized to a VCMDQ0_* register offset, allowing a single helper > to service all VCMDQ instances. > > VI_VCMDQ accesses are translated to their equivalent global VCMDQ > offsets and reuse the same decoding path. All VCMDQ reads are currently > served from cached register state. > > Signed-off-by: Nicolin Chen <[email protected]> > Signed-off-by: Shameer Kolothum <[email protected]> Hi Shameer, As noted below there are a lot of repeats of 0x80 and the register window offsets in here. Maybe some defines would make things clearer? > static uint64_t tegra241_cmdqv_read_vintf(Tegra241CMDQV *cmdqv, hwaddr > offset) > { > int i; > @@ -42,6 +82,7 @@ static uint64_t tegra241_cmdqv_read_vintf(Tegra241CMDQV > *cmdqv, hwaddr offset) > static uint64_t tegra241_cmdqv_read(void *opaque, hwaddr offset, unsigned > size) > { > Tegra241CMDQV *cmdqv = (Tegra241CMDQV *)opaque; > + int index; > > if (offset >= TEGRA241_CMDQV_IO_LEN) { > qemu_log_mask(LOG_UNIMP, > @@ -67,6 +108,42 @@ static uint64_t tegra241_cmdqv_read(void *opaque, hwaddr > offset, unsigned size) > return cmdqv->cmdq_alloc_map[(offset - A_CMDQ_ALLOC_MAP_0) / 4]; > case A_VINTF0_CONFIG ... A_VINTF0_LVCMDQ_ERR_MAP_3: > return tegra241_cmdqv_read_vintf(cmdqv, offset); > + case A_VI_VCMDQ0_CONS_INDX ... A_VI_VCMDQ1_GERRORN: > + /* > + * VI_VCMDQ registers (VINTF logical view) have the same per-VCMDQ > + * layout as the global VCMDQ registers, but are based at 0x30000 > + * instead of 0x10000. > + * > + * Subtract 0x20000 to translate a VI_VCMDQ offset into the > equivalent > + * global VCMDQ offset, then fall through to reuse the common VCMDQ > + * decoding logic below. > + */ > + offset -= 0x20000; There are a lot of repeated numeric values of offsets and sizes in here. I'm a bit in two minds about whether they are clearer as numbers or you should add a few more defines. Jonathan
