Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/amdgpu: add sdma 7.0 support for copy dcc buffer

1. Add dcc buffer flag for copy buffer
2. Add sdma 7.0 support copy dcc buffer

Signed-off-by: Likun Gao <Likun.Gao@amd.com>
Signed-off-by: Frank Min <Frank.Min@amd.com>
Reviewed-by: Hawking Zhang <Hawking.Zhang@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Frank Min and committed by
Alex Deucher
faa64f63 7c85e970

+27 -4
+7 -1
drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
··· 295 295 struct amdgpu_res_cursor src_mm, dst_mm; 296 296 struct dma_fence *fence = NULL; 297 297 int r = 0; 298 - 299 298 uint32_t copy_flags = 0; 299 + struct amdgpu_bo *abo_src, *abo_dst; 300 300 301 301 if (!adev->mman.buffer_funcs_enabled) { 302 302 DRM_ERROR("Trying to move memory with ring turned off.\n"); ··· 325 325 if (r) 326 326 goto error; 327 327 328 + abo_src = ttm_to_amdgpu_bo(src->bo); 329 + abo_dst = ttm_to_amdgpu_bo(dst->bo); 328 330 if (tmz) 329 331 copy_flags |= AMDGPU_COPY_FLAGS_TMZ; 332 + if (abo_src->flags & AMDGPU_GEM_CREATE_GFX12_DCC) 333 + copy_flags |= AMDGPU_COPY_FLAGS_READ_DECOMPRESSED; 334 + if (abo_dst->flags & AMDGPU_GEM_CREATE_GFX12_DCC) 335 + copy_flags |= AMDGPU_COPY_FLAGS_WRITE_COMPRESSED; 330 336 331 337 r = amdgpu_copy_buffer(ring, from, to, cur_size, resv, 332 338 &next, false, true, copy_flags);
+2 -1
drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h
··· 112 112 }; 113 113 114 114 #define AMDGPU_COPY_FLAGS_TMZ (1 << 0) 115 + #define AMDGPU_COPY_FLAGS_READ_DECOMPRESSED (1 << 1) 116 + #define AMDGPU_COPY_FLAGS_WRITE_COMPRESSED (1 << 2) 115 117 116 118 int amdgpu_gtt_mgr_init(struct amdgpu_device *adev, uint64_t gtt_size); 117 119 void amdgpu_gtt_mgr_fini(struct amdgpu_device *adev); ··· 150 148 void amdgpu_ttm_fini(struct amdgpu_device *adev); 151 149 void amdgpu_ttm_set_buffer_funcs_status(struct amdgpu_device *adev, 152 150 bool enable); 153 - 154 151 int amdgpu_copy_buffer(struct amdgpu_ring *ring, uint64_t src_offset, 155 152 uint64_t dst_offset, uint32_t byte_count, 156 153 struct dma_resv *resv,
+8
drivers/gpu/drm/amd/amdgpu/sdma_v6_0_0_pkt_open.h
··· 91 91 #define SDMA_GCR_GLM_WB (1 << 4) 92 92 #define SDMA_GCR_GL1_RANGE(x) (((x) & 0x3) << 2) 93 93 #define SDMA_GCR_GLI_INV(x) (((x) & 0x3) << 0) 94 + 95 + #define SDMA_DCC_DATA_FORMAT(x) ((x) & 0x3f) 96 + #define SDMA_DCC_NUM_TYPE(x) (((x) & 0x7) << 9) 97 + #define SDMA_DCC_READ_CM(x) (((x) & 0x3) << 16) 98 + #define SDMA_DCC_WRITE_CM(x) (((x) & 0x3) << 18) 99 + #define SDMA_DCC_MAX_COM(x) (((x) & 0x3) << 24) 100 + #define SDMA_DCC_MAX_UCOM(x) (((x) & 0x1) << 26) 101 + 94 102 /* 95 103 ** Definitions for SDMA_PKT_COPY_LINEAR packet 96 104 */
+10 -2
drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c
··· 1568 1568 { 1569 1569 ib->ptr[ib->length_dw++] = SDMA_PKT_COPY_LINEAR_HEADER_OP(SDMA_OP_COPY) | 1570 1570 SDMA_PKT_COPY_LINEAR_HEADER_SUB_OP(SDMA_SUBOP_COPY_LINEAR) | 1571 - SDMA_PKT_COPY_LINEAR_HEADER_TMZ((copy_flags & AMDGPU_COPY_FLAGS_TMZ) ? 1 : 0); 1571 + SDMA_PKT_COPY_LINEAR_HEADER_TMZ((copy_flags & AMDGPU_COPY_FLAGS_TMZ) ? 1 : 0) | 1572 + SDMA_PKT_COPY_LINEAR_HEADER_CPV((copy_flags & 1573 + (AMDGPU_COPY_FLAGS_READ_DECOMPRESSED | AMDGPU_COPY_FLAGS_WRITE_COMPRESSED)) ? 1 : 0); 1574 + 1572 1575 ib->ptr[ib->length_dw++] = byte_count - 1; 1573 1576 ib->ptr[ib->length_dw++] = 0; /* src/dst endian swap */ 1574 1577 ib->ptr[ib->length_dw++] = lower_32_bits(src_offset); 1575 1578 ib->ptr[ib->length_dw++] = upper_32_bits(src_offset); 1576 1579 ib->ptr[ib->length_dw++] = lower_32_bits(dst_offset); 1577 1580 ib->ptr[ib->length_dw++] = upper_32_bits(dst_offset); 1581 + 1582 + if ((copy_flags & (AMDGPU_COPY_FLAGS_READ_DECOMPRESSED | AMDGPU_COPY_FLAGS_WRITE_COMPRESSED))) 1583 + ib->ptr[ib->length_dw++] = SDMA_DCC_DATA_FORMAT(4) | SDMA_DCC_NUM_TYPE(4) | 1584 + ((copy_flags & AMDGPU_COPY_FLAGS_READ_DECOMPRESSED) ? SDMA_DCC_READ_CM(2) : 0) | 1585 + ((copy_flags & AMDGPU_COPY_FLAGS_WRITE_COMPRESSED) ? SDMA_DCC_WRITE_CM(1) : 0) | 1586 + SDMA_DCC_MAX_COM(1) | SDMA_DCC_MAX_UCOM(1); 1578 1587 } 1579 1588 1580 1589 /** ··· 1612 1603 .copy_max_bytes = 0x400000, 1613 1604 .copy_num_dw = 7, 1614 1605 .emit_copy_buffer = sdma_v7_0_emit_copy_buffer, 1615 - 1616 1606 .fill_max_bytes = 0x400000, 1617 1607 .fill_num_dw = 5, 1618 1608 .emit_fill_buffer = sdma_v7_0_emit_fill_buffer,