@@ -111,6 +111,7 @@ struct ipmmu_features {
unsigned int num_utlbs;
unsigned int ctx_offset_base;
unsigned int ctx_offset_stride;
+ unsigned int utlb_offset_base;
};
/* Root/Cache IPMMU device's information */
@@ -374,7 +375,7 @@ static void ipmmu_ctx_write_all(struct ipmmu_vmsa_domain *domain,
static uint32_t ipmmu_utlb_reg(struct ipmmu_vmsa_device *mmu, uint32_t reg)
{
- return reg;
+ return mmu->features->utlb_offset_base + reg;
}
static void ipmmu_imuasid_write(struct ipmmu_vmsa_device *mmu,
@@ -738,6 +739,7 @@ static const struct ipmmu_features ipmmu_features_rcar_gen3 = {
.num_utlbs = 48,
.ctx_offset_base = 0,
.ctx_offset_stride = 0x40,
+ .utlb_offset_base = 0,
};
static void ipmmu_device_reset(struct ipmmu_vmsa_device *mmu)