[PATCH] drm/amdgpu: keep init xcc0 for all xccs under sriov
Jane Jian
Jane.Jian at amd.com
Fri Jun 14 11:10:22 UTC 2024
[WHY]
sriov has the higher bit violation when flushing tlb
[HOW]
for sriov only init XCC0(lower 16-bit) for all XCCs to avoid higher bit violation
since kiq ring is always local, local address without XCC ID is enough to be sent to the XCC KIQ
Signed-off-by: Jane Jian <Jane.Jian at amd.com>
---
drivers/gpu/drm/amd/amdgpu/gfxhub_v1_2.c | 23 +++++++++++++++--------
1 file changed, 15 insertions(+), 8 deletions(-)
diff --git a/drivers/gpu/drm/amd/amdgpu/gfxhub_v1_2.c b/drivers/gpu/drm/amd/amdgpu/gfxhub_v1_2.c
index e14acab5cceb..4e38a66a52f4 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfxhub_v1_2.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfxhub_v1_2.c
@@ -537,29 +537,36 @@ static void gfxhub_v1_2_xcc_init(struct amdgpu_device *adev, uint32_t xcc_mask)
{
struct amdgpu_vmhub *hub;
int i;
+ uint32_t gc_index;
for_each_inst(i, xcc_mask) {
hub = &adev->vmhub[AMDGPU_GFXHUB(i)];
+ /* for sriov only init XCC0(lower 16-bit) to avoid higher bit violation */
+ if (amdgpu_sriov_vf(adev))
+ gc_index = 0;
+ else
+ gc_index = GET_INST(GC, i);
+
hub->ctx0_ptb_addr_lo32 =
- SOC15_REG_OFFSET(GC, GET_INST(GC, i),
+ SOC15_REG_OFFSET(GC, gc_index,
regVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32);
hub->ctx0_ptb_addr_hi32 =
- SOC15_REG_OFFSET(GC, GET_INST(GC, i),
+ SOC15_REG_OFFSET(GC, gc_index,
regVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_HI32);
hub->vm_inv_eng0_sem =
- SOC15_REG_OFFSET(GC, GET_INST(GC, i), regVM_INVALIDATE_ENG0_SEM);
+ SOC15_REG_OFFSET(GC, gc_index, regVM_INVALIDATE_ENG0_SEM);
hub->vm_inv_eng0_req =
- SOC15_REG_OFFSET(GC, GET_INST(GC, i), regVM_INVALIDATE_ENG0_REQ);
+ SOC15_REG_OFFSET(GC, gc_index, regVM_INVALIDATE_ENG0_REQ);
hub->vm_inv_eng0_ack =
- SOC15_REG_OFFSET(GC, GET_INST(GC, i), regVM_INVALIDATE_ENG0_ACK);
+ SOC15_REG_OFFSET(GC, gc_index, regVM_INVALIDATE_ENG0_ACK);
hub->vm_context0_cntl =
- SOC15_REG_OFFSET(GC, GET_INST(GC, i), regVM_CONTEXT0_CNTL);
+ SOC15_REG_OFFSET(GC, gc_index, regVM_CONTEXT0_CNTL);
hub->vm_l2_pro_fault_status =
- SOC15_REG_OFFSET(GC, GET_INST(GC, i),
+ SOC15_REG_OFFSET(GC, gc_index,
regVM_L2_PROTECTION_FAULT_STATUS);
hub->vm_l2_pro_fault_cntl =
- SOC15_REG_OFFSET(GC, GET_INST(GC, i), regVM_L2_PROTECTION_FAULT_CNTL);
+ SOC15_REG_OFFSET(GC, gc_index, regVM_L2_PROTECTION_FAULT_CNTL);
hub->ctx_distance = regVM_CONTEXT1_CNTL -
regVM_CONTEXT0_CNTL;
--
2.34.1
More information about the amd-gfx
mailing list