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

drm/amdgpu: implement 2+1 PD support for Raven v3

Instead of falling back to 2 level and very limited address space use
2+1 PD support and 128TB + 512GB of virtual address space.

v2: cleanup defines, rebase on top of level enum
v3: fix inverted check in hardware setup

Signed-off-by: Christian König <christian.koenig@amd.com>
Reviewed-and-Tested-by: Chunming Zhou <david1.zhou@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Christian König and committed by
Alex Deucher
6a42fd6f 78f99c6d

+89 -35
+1
drivers/gpu/drm/amd/amdgpu/amdgpu.h
··· 540 540 u64 private_aperture_end; 541 541 /* protects concurrent invalidation */ 542 542 spinlock_t invalidate_lock; 543 + bool translate_further; 543 544 }; 544 545 545 546 /*
+6
drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
··· 70 70 /* PDE is handled as PTE for VEGA10 */ 71 71 #define AMDGPU_PDE_PTE (1ULL << 54) 72 72 73 + /* PTE is handled as PDE for VEGA10 (Translate Further) */ 74 + #define AMDGPU_PTE_TF (1ULL << 56) 75 + 76 + /* PDE Block Fragment Size for VEGA10 */ 77 + #define AMDGPU_PDE_BFS(a) ((uint64_t)a << 59) 78 + 73 79 /* VEGA10 only */ 74 80 #define AMDGPU_PTE_MTYPE(a) ((uint64_t)a << 57) 75 81 #define AMDGPU_PTE_MTYPE_MASK AMDGPU_PTE_MTYPE(3ULL)
+29 -13
drivers/gpu/drm/amd/amdgpu/gfxhub_v1_0.c
··· 143 143 WREG32_SOC15(GC, 0, mmVM_L2_CNTL2, tmp); 144 144 145 145 tmp = mmVM_L2_CNTL3_DEFAULT; 146 - tmp = REG_SET_FIELD(tmp, VM_L2_CNTL3, BANK_SELECT, 9); 147 - tmp = REG_SET_FIELD(tmp, VM_L2_CNTL3, L2_CACHE_BIGK_FRAGMENT_SIZE, 6); 146 + if (adev->mc.translate_further) { 147 + tmp = REG_SET_FIELD(tmp, VM_L2_CNTL3, BANK_SELECT, 12); 148 + tmp = REG_SET_FIELD(tmp, VM_L2_CNTL3, 149 + L2_CACHE_BIGK_FRAGMENT_SIZE, 9); 150 + } else { 151 + tmp = REG_SET_FIELD(tmp, VM_L2_CNTL3, BANK_SELECT, 9); 152 + tmp = REG_SET_FIELD(tmp, VM_L2_CNTL3, 153 + L2_CACHE_BIGK_FRAGMENT_SIZE, 6); 154 + } 148 155 WREG32_SOC15(GC, 0, mmVM_L2_CNTL3, tmp); 149 156 150 157 tmp = mmVM_L2_CNTL4_DEFAULT; ··· 189 182 190 183 static void gfxhub_v1_0_setup_vmid_config(struct amdgpu_device *adev) 191 184 { 192 - int i; 185 + unsigned num_level, block_size; 193 186 uint32_t tmp; 187 + int i; 188 + 189 + num_level = adev->vm_manager.num_level; 190 + block_size = adev->vm_manager.block_size; 191 + if (adev->mc.translate_further) 192 + num_level -= 1; 193 + else 194 + block_size -= 9; 194 195 195 196 for (i = 0; i <= 14; i++) { 196 197 tmp = RREG32_SOC15_OFFSET(GC, 0, mmVM_CONTEXT1_CNTL, i); 197 198 tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, ENABLE_CONTEXT, 1); 198 199 tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, PAGE_TABLE_DEPTH, 199 - adev->vm_manager.num_level); 200 + num_level); 200 201 tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, 201 - RANGE_PROTECTION_FAULT_ENABLE_DEFAULT, 1); 202 + RANGE_PROTECTION_FAULT_ENABLE_DEFAULT, 1); 202 203 tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, 203 - DUMMY_PAGE_PROTECTION_FAULT_ENABLE_DEFAULT, 1); 204 + DUMMY_PAGE_PROTECTION_FAULT_ENABLE_DEFAULT, 205 + 1); 204 206 tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, 205 - PDE0_PROTECTION_FAULT_ENABLE_DEFAULT, 1); 207 + PDE0_PROTECTION_FAULT_ENABLE_DEFAULT, 1); 206 208 tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, 207 - VALID_PROTECTION_FAULT_ENABLE_DEFAULT, 1); 209 + VALID_PROTECTION_FAULT_ENABLE_DEFAULT, 1); 208 210 tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, 209 - READ_PROTECTION_FAULT_ENABLE_DEFAULT, 1); 211 + READ_PROTECTION_FAULT_ENABLE_DEFAULT, 1); 210 212 tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, 211 - WRITE_PROTECTION_FAULT_ENABLE_DEFAULT, 1); 213 + WRITE_PROTECTION_FAULT_ENABLE_DEFAULT, 1); 212 214 tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, 213 - EXECUTE_PROTECTION_FAULT_ENABLE_DEFAULT, 1); 215 + EXECUTE_PROTECTION_FAULT_ENABLE_DEFAULT, 1); 214 216 tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, 215 - PAGE_TABLE_BLOCK_SIZE, 216 - adev->vm_manager.block_size - 9); 217 + PAGE_TABLE_BLOCK_SIZE, 218 + block_size); 217 219 /* Send no-retry XNACK on fault to suppress VM fault storm. */ 218 220 tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, 219 221 RETRY_PERMISSION_OR_INVALID_PAGE_FAULT, 0);
+22 -4
drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
··· 476 476 *addr = adev->vm_manager.vram_base_offset + *addr - 477 477 adev->mc.vram_start; 478 478 BUG_ON(*addr & 0xFFFF00000000003FULL); 479 + 480 + if (!adev->mc.translate_further) 481 + return; 482 + 483 + if (level == AMDGPU_VM_PDB1) { 484 + /* Set the block fragment size */ 485 + if (!(*flags & AMDGPU_PDE_PTE)) 486 + *flags |= AMDGPU_PDE_BFS(0x9); 487 + 488 + } else if (level == AMDGPU_VM_PDB0) { 489 + if (*flags & AMDGPU_PDE_PTE) 490 + *flags &= ~AMDGPU_PDE_PTE; 491 + else 492 + *flags |= AMDGPU_PTE_TF; 493 + } 479 494 } 480 495 481 496 static const struct amdgpu_gart_funcs gmc_v9_0_gart_funcs = { ··· 788 773 switch (adev->asic_type) { 789 774 case CHIP_RAVEN: 790 775 adev->mc.vram_type = AMDGPU_VRAM_TYPE_UNKNOWN; 791 - if (adev->rev_id == 0x0 || adev->rev_id == 0x1) 776 + if (adev->rev_id == 0x0 || adev->rev_id == 0x1) { 792 777 amdgpu_vm_adjust_size(adev, 256 * 1024, 9, 3, 48); 793 - else 794 - /* vm_size is 64GB for legacy 2-level page support */ 795 - amdgpu_vm_adjust_size(adev, 64, 9, 1, 48); 778 + } else { 779 + /* vm_size is 128TB + 512GB for legacy 3-level page support */ 780 + amdgpu_vm_adjust_size(adev, 128 * 1024 + 512, 9, 2, 48); 781 + adev->mc.translate_further = 782 + adev->vm_manager.num_level > 1; 783 + } 796 784 break; 797 785 case CHIP_VEGA10: 798 786 /* XXX Don't know how to get VRAM type yet. */
+31 -18
drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.c
··· 155 155 tmp = REG_SET_FIELD(tmp, VM_L2_CNTL2, INVALIDATE_L2_CACHE, 1); 156 156 WREG32_SOC15(MMHUB, 0, mmVM_L2_CNTL2, tmp); 157 157 158 - tmp = mmVM_L2_CNTL3_DEFAULT; 159 - tmp = REG_SET_FIELD(tmp, VM_L2_CNTL3, BANK_SELECT, 9); 160 - tmp = REG_SET_FIELD(tmp, VM_L2_CNTL3, L2_CACHE_BIGK_FRAGMENT_SIZE, 6); 161 - WREG32_SOC15(MMHUB, 0, mmVM_L2_CNTL3, tmp); 158 + if (adev->mc.translate_further) { 159 + tmp = REG_SET_FIELD(tmp, VM_L2_CNTL3, BANK_SELECT, 12); 160 + tmp = REG_SET_FIELD(tmp, VM_L2_CNTL3, 161 + L2_CACHE_BIGK_FRAGMENT_SIZE, 9); 162 + } else { 163 + tmp = REG_SET_FIELD(tmp, VM_L2_CNTL3, BANK_SELECT, 9); 164 + tmp = REG_SET_FIELD(tmp, VM_L2_CNTL3, 165 + L2_CACHE_BIGK_FRAGMENT_SIZE, 6); 166 + } 162 167 163 168 tmp = mmVM_L2_CNTL4_DEFAULT; 164 169 tmp = REG_SET_FIELD(tmp, VM_L2_CNTL4, VMC_TAP_PDE_REQUEST_PHYSICAL, 0); ··· 201 196 202 197 static void mmhub_v1_0_setup_vmid_config(struct amdgpu_device *adev) 203 198 { 204 - int i; 199 + unsigned num_level, block_size; 205 200 uint32_t tmp; 201 + int i; 202 + 203 + num_level = adev->vm_manager.num_level; 204 + block_size = adev->vm_manager.block_size; 205 + if (adev->mc.translate_further) 206 + num_level -= 1; 207 + else 208 + block_size -= 9; 206 209 207 210 for (i = 0; i <= 14; i++) { 208 211 tmp = RREG32_SOC15_OFFSET(MMHUB, 0, mmVM_CONTEXT1_CNTL, i); 212 + tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, ENABLE_CONTEXT, 1); 213 + tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, PAGE_TABLE_DEPTH, 214 + num_level); 209 215 tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, 210 - ENABLE_CONTEXT, 1); 216 + RANGE_PROTECTION_FAULT_ENABLE_DEFAULT, 1); 211 217 tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, 212 - PAGE_TABLE_DEPTH, adev->vm_manager.num_level); 218 + DUMMY_PAGE_PROTECTION_FAULT_ENABLE_DEFAULT, 219 + 1); 213 220 tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, 214 - RANGE_PROTECTION_FAULT_ENABLE_DEFAULT, 1); 221 + PDE0_PROTECTION_FAULT_ENABLE_DEFAULT, 1); 215 222 tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, 216 - DUMMY_PAGE_PROTECTION_FAULT_ENABLE_DEFAULT, 1); 223 + VALID_PROTECTION_FAULT_ENABLE_DEFAULT, 1); 217 224 tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, 218 - PDE0_PROTECTION_FAULT_ENABLE_DEFAULT, 1); 225 + READ_PROTECTION_FAULT_ENABLE_DEFAULT, 1); 219 226 tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, 220 - VALID_PROTECTION_FAULT_ENABLE_DEFAULT, 1); 227 + WRITE_PROTECTION_FAULT_ENABLE_DEFAULT, 1); 221 228 tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, 222 - READ_PROTECTION_FAULT_ENABLE_DEFAULT, 1); 229 + EXECUTE_PROTECTION_FAULT_ENABLE_DEFAULT, 1); 223 230 tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, 224 - WRITE_PROTECTION_FAULT_ENABLE_DEFAULT, 1); 225 - tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, 226 - EXECUTE_PROTECTION_FAULT_ENABLE_DEFAULT, 1); 227 - tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, 228 - PAGE_TABLE_BLOCK_SIZE, 229 - adev->vm_manager.block_size - 9); 231 + PAGE_TABLE_BLOCK_SIZE, 232 + block_size); 230 233 /* Send no-retry XNACK on fault to suppress VM fault storm. */ 231 234 tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, 232 235 RETRY_PERMISSION_OR_INVALID_PAGE_FAULT, 0);