Skip to content

Commit 5b711e7

Browse files
jiadozhualexdeucher
authored andcommitted
drm/amdgpu: Implement gfx9 patch functions for resubmission
Patch the packages including CONTEXT_CONTROL and WRITE_DATA for gfx9 during the resubmission scenario. Signed-off-by: Jiadong Zhu <[email protected]> Acked-by: Alex Deucher <[email protected]> Signed-off-by: Alex Deucher <[email protected]> Cc: [email protected] # 6.3.x
1 parent 87af86a commit 5b711e7

File tree

1 file changed

+80
-0
lines changed

1 file changed

+80
-0
lines changed

drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5139,9 +5139,83 @@ static void gfx_v9_0_ring_emit_ib_gfx(struct amdgpu_ring *ring,
51395139
#endif
51405140
lower_32_bits(ib->gpu_addr));
51415141
amdgpu_ring_write(ring, upper_32_bits(ib->gpu_addr));
5142+
amdgpu_ring_ib_on_emit_cntl(ring);
51425143
amdgpu_ring_write(ring, control);
51435144
}
51445145

5146+
static void gfx_v9_0_ring_patch_cntl(struct amdgpu_ring *ring,
5147+
unsigned offset)
5148+
{
5149+
u32 control = ring->ring[offset];
5150+
5151+
control |= INDIRECT_BUFFER_PRE_RESUME(1);
5152+
ring->ring[offset] = control;
5153+
}
5154+
5155+
static void gfx_v9_0_ring_patch_ce_meta(struct amdgpu_ring *ring,
5156+
unsigned offset)
5157+
{
5158+
struct amdgpu_device *adev = ring->adev;
5159+
void *ce_payload_cpu_addr;
5160+
uint64_t payload_offset, payload_size;
5161+
5162+
payload_size = sizeof(struct v9_ce_ib_state);
5163+
5164+
if (ring->is_mes_queue) {
5165+
payload_offset = offsetof(struct amdgpu_mes_ctx_meta_data,
5166+
gfx[0].gfx_meta_data) +
5167+
offsetof(struct v9_gfx_meta_data, ce_payload);
5168+
ce_payload_cpu_addr =
5169+
amdgpu_mes_ctx_get_offs_cpu_addr(ring, payload_offset);
5170+
} else {
5171+
payload_offset = offsetof(struct v9_gfx_meta_data, ce_payload);
5172+
ce_payload_cpu_addr = adev->virt.csa_cpu_addr + payload_offset;
5173+
}
5174+
5175+
if (offset + (payload_size >> 2) <= ring->buf_mask + 1) {
5176+
memcpy((void *)&ring->ring[offset], ce_payload_cpu_addr, payload_size);
5177+
} else {
5178+
memcpy((void *)&ring->ring[offset], ce_payload_cpu_addr,
5179+
(ring->buf_mask + 1 - offset) << 2);
5180+
payload_size -= (ring->buf_mask + 1 - offset) << 2;
5181+
memcpy((void *)&ring->ring[0],
5182+
ce_payload_cpu_addr + ((ring->buf_mask + 1 - offset) << 2),
5183+
payload_size);
5184+
}
5185+
}
5186+
5187+
static void gfx_v9_0_ring_patch_de_meta(struct amdgpu_ring *ring,
5188+
unsigned offset)
5189+
{
5190+
struct amdgpu_device *adev = ring->adev;
5191+
void *de_payload_cpu_addr;
5192+
uint64_t payload_offset, payload_size;
5193+
5194+
payload_size = sizeof(struct v9_de_ib_state);
5195+
5196+
if (ring->is_mes_queue) {
5197+
payload_offset = offsetof(struct amdgpu_mes_ctx_meta_data,
5198+
gfx[0].gfx_meta_data) +
5199+
offsetof(struct v9_gfx_meta_data, de_payload);
5200+
de_payload_cpu_addr =
5201+
amdgpu_mes_ctx_get_offs_cpu_addr(ring, payload_offset);
5202+
} else {
5203+
payload_offset = offsetof(struct v9_gfx_meta_data, de_payload);
5204+
de_payload_cpu_addr = adev->virt.csa_cpu_addr + payload_offset;
5205+
}
5206+
5207+
if (offset + (payload_size >> 2) <= ring->buf_mask + 1) {
5208+
memcpy((void *)&ring->ring[offset], de_payload_cpu_addr, payload_size);
5209+
} else {
5210+
memcpy((void *)&ring->ring[offset], de_payload_cpu_addr,
5211+
(ring->buf_mask + 1 - offset) << 2);
5212+
payload_size -= (ring->buf_mask + 1 - offset) << 2;
5213+
memcpy((void *)&ring->ring[0],
5214+
de_payload_cpu_addr + ((ring->buf_mask + 1 - offset) << 2),
5215+
payload_size);
5216+
}
5217+
}
5218+
51455219
static void gfx_v9_0_ring_emit_ib_compute(struct amdgpu_ring *ring,
51465220
struct amdgpu_job *job,
51475221
struct amdgpu_ib *ib,
@@ -5337,6 +5411,8 @@ static void gfx_v9_0_ring_emit_ce_meta(struct amdgpu_ring *ring, bool resume)
53375411
amdgpu_ring_write(ring, lower_32_bits(ce_payload_gpu_addr));
53385412
amdgpu_ring_write(ring, upper_32_bits(ce_payload_gpu_addr));
53395413

5414+
amdgpu_ring_ib_on_emit_ce(ring);
5415+
53405416
if (resume)
53415417
amdgpu_ring_write_multiple(ring, ce_payload_cpu_addr,
53425418
sizeof(ce_payload) >> 2);
@@ -5448,6 +5524,7 @@ static void gfx_v9_0_ring_emit_de_meta(struct amdgpu_ring *ring, bool resume, bo
54485524
amdgpu_ring_write(ring, lower_32_bits(de_payload_gpu_addr));
54495525
amdgpu_ring_write(ring, upper_32_bits(de_payload_gpu_addr));
54505526

5527+
amdgpu_ring_ib_on_emit_de(ring);
54515528
if (resume)
54525529
amdgpu_ring_write_multiple(ring, de_payload_cpu_addr,
54535530
sizeof(de_payload) >> 2);
@@ -6858,6 +6935,9 @@ static const struct amdgpu_ring_funcs gfx_v9_0_sw_ring_funcs_gfx = {
68586935
.emit_reg_write_reg_wait = gfx_v9_0_ring_emit_reg_write_reg_wait,
68596936
.soft_recovery = gfx_v9_0_ring_soft_recovery,
68606937
.emit_mem_sync = gfx_v9_0_emit_mem_sync,
6938+
.patch_cntl = gfx_v9_0_ring_patch_cntl,
6939+
.patch_de = gfx_v9_0_ring_patch_de_meta,
6940+
.patch_ce = gfx_v9_0_ring_patch_ce_meta,
68616941
};
68626942

68636943
static const struct amdgpu_ring_funcs gfx_v9_0_ring_funcs_compute = {

0 commit comments

Comments
 (0)