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

drm/amdgpu: add gmc v11_0 ip block (v3)

Add support for GPU memory controller v11.

v1: Add support for gmc v11.0
Add gmc 11 block (Tianci)
v2: drop unused amdgpu_bo_late_init (Hawking)
v3: squash in various fix

Signed-off-by: Tianci.Yin <tianci.yin@amd.com>
Signed-off-by: Likun Gao <Likun.Gao@amd.com>
Reviewed-by: Hawking Zhang <Hawking.Zhang@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Hawking Zhang <Hawking.Zhang@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Tianci.Yin and committed by
Alex Deucher
1c2014da d7dab4fc

+1000 -3
+1 -1
drivers/gpu/drm/amd/amdgpu/Makefile
··· 88 88 gmc_v8_0.o \ 89 89 gfxhub_v1_0.o mmhub_v1_0.o gmc_v9_0.o gfxhub_v1_1.o mmhub_v9_4.o \ 90 90 gfxhub_v2_0.o mmhub_v2_0.o gmc_v10_0.o gfxhub_v2_1.o mmhub_v2_3.o \ 91 - mmhub_v1_7.o gfxhub_v3_0.o mmhub_v3_0.o 91 + mmhub_v1_7.o gfxhub_v3_0.o mmhub_v3_0.o gmc_v11_0.o 92 92 93 93 # add UMC block 94 94 amdgpu-y += \
+4 -2
drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.h
··· 335 335 DECLARE_BITMAP (pipe_reserve_bitmap, AMDGPU_MAX_COMPUTE_QUEUES); 336 336 337 337 /*ras */ 338 - struct ras_common_if *ras_if; 339 - struct amdgpu_gfx_ras *ras; 338 + struct ras_common_if *ras_if; 339 + struct amdgpu_gfx_ras *ras; 340 + 341 + bool is_poweron; 340 342 }; 341 343 342 344 #define amdgpu_gfx_get_gpu_clock_counter(adev) (adev)->gfx.funcs->get_gpu_clock_counter((adev))
+965
drivers/gpu/drm/amd/amdgpu/gmc_v11_0.c
··· 1 + /* 2 + * Copyright 2021 Advanced Micro Devices, Inc. 3 + * 4 + * Permission is hereby granted, free of charge, to any person obtaining a 5 + * copy of this software and associated documentation files (the "Software"), 6 + * to deal in the Software without restriction, including without limitation 7 + * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 + * and/or sell copies of the Software, and to permit persons to whom the 9 + * Software is furnished to do so, subject to the following conditions: 10 + * 11 + * The above copyright notice and this permission notice shall be included in 12 + * all copies or substantial portions of the Software. 13 + * 14 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17 + * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 18 + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19 + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20 + * OTHER DEALINGS IN THE SOFTWARE. 21 + * 22 + */ 23 + #include <linux/firmware.h> 24 + #include <linux/pci.h> 25 + #include "amdgpu.h" 26 + #include "amdgpu_atomfirmware.h" 27 + #include "gmc_v11_0.h" 28 + #include "umc_v8_7.h" 29 + #include "athub/athub_3_0_0_sh_mask.h" 30 + #include "athub/athub_3_0_0_offset.h" 31 + #include "oss/osssys_6_0_0_offset.h" 32 + #include "ivsrcid/vmc/irqsrcs_vmc_1_0.h" 33 + #include "navi10_enum.h" 34 + #include "soc15.h" 35 + #include "soc15d.h" 36 + #include "soc15_common.h" 37 + #include "nbio_v4_3.h" 38 + #include "gfxhub_v3_0.h" 39 + #include "mmhub_v3_0.h" 40 + #include "athub_v3_0.h" 41 + 42 + 43 + static int gmc_v11_0_ecc_interrupt_state(struct amdgpu_device *adev, 44 + struct amdgpu_irq_src *src, 45 + unsigned type, 46 + enum amdgpu_interrupt_state state) 47 + { 48 + return 0; 49 + } 50 + 51 + static int 52 + gmc_v11_0_vm_fault_interrupt_state(struct amdgpu_device *adev, 53 + struct amdgpu_irq_src *src, unsigned type, 54 + enum amdgpu_interrupt_state state) 55 + { 56 + switch (state) { 57 + case AMDGPU_IRQ_STATE_DISABLE: 58 + /* MM HUB */ 59 + amdgpu_gmc_set_vm_fault_masks(adev, AMDGPU_MMHUB_0, false); 60 + /* GFX HUB */ 61 + amdgpu_gmc_set_vm_fault_masks(adev, AMDGPU_GFXHUB_0, false); 62 + break; 63 + case AMDGPU_IRQ_STATE_ENABLE: 64 + /* MM HUB */ 65 + amdgpu_gmc_set_vm_fault_masks(adev, AMDGPU_MMHUB_0, true); 66 + /* GFX HUB */ 67 + amdgpu_gmc_set_vm_fault_masks(adev, AMDGPU_GFXHUB_0, true); 68 + break; 69 + default: 70 + break; 71 + } 72 + 73 + return 0; 74 + } 75 + 76 + static int gmc_v11_0_process_interrupt(struct amdgpu_device *adev, 77 + struct amdgpu_irq_src *source, 78 + struct amdgpu_iv_entry *entry) 79 + { 80 + struct amdgpu_vmhub *hub = &adev->vmhub[entry->vmid_src]; 81 + uint32_t status = 0; 82 + u64 addr; 83 + 84 + addr = (u64)entry->src_data[0] << 12; 85 + addr |= ((u64)entry->src_data[1] & 0xf) << 44; 86 + 87 + if (!amdgpu_sriov_vf(adev)) { 88 + /* 89 + * Issue a dummy read to wait for the status register to 90 + * be updated to avoid reading an incorrect value due to 91 + * the new fast GRBM interface. 92 + */ 93 + if (entry->vmid_src == AMDGPU_GFXHUB_0) 94 + RREG32(hub->vm_l2_pro_fault_status); 95 + 96 + status = RREG32(hub->vm_l2_pro_fault_status); 97 + WREG32_P(hub->vm_l2_pro_fault_cntl, 1, ~1); 98 + } 99 + 100 + if (printk_ratelimit()) { 101 + struct amdgpu_task_info task_info; 102 + 103 + memset(&task_info, 0, sizeof(struct amdgpu_task_info)); 104 + amdgpu_vm_get_task_info(adev, entry->pasid, &task_info); 105 + 106 + dev_err(adev->dev, 107 + "[%s] page fault (src_id:%u ring:%u vmid:%u pasid:%u, " 108 + "for process %s pid %d thread %s pid %d)\n", 109 + entry->vmid_src ? "mmhub" : "gfxhub", 110 + entry->src_id, entry->ring_id, entry->vmid, 111 + entry->pasid, task_info.process_name, task_info.tgid, 112 + task_info.task_name, task_info.pid); 113 + dev_err(adev->dev, " in page starting at address 0x%016llx from client %d\n", 114 + addr, entry->client_id); 115 + if (!amdgpu_sriov_vf(adev)) 116 + hub->vmhub_funcs->print_l2_protection_fault_status(adev, status); 117 + } 118 + 119 + return 0; 120 + } 121 + 122 + static const struct amdgpu_irq_src_funcs gmc_v11_0_irq_funcs = { 123 + .set = gmc_v11_0_vm_fault_interrupt_state, 124 + .process = gmc_v11_0_process_interrupt, 125 + }; 126 + 127 + static const struct amdgpu_irq_src_funcs gmc_v11_0_ecc_funcs = { 128 + .set = gmc_v11_0_ecc_interrupt_state, 129 + .process = amdgpu_umc_process_ecc_irq, 130 + }; 131 + 132 + static void gmc_v11_0_set_irq_funcs(struct amdgpu_device *adev) 133 + { 134 + adev->gmc.vm_fault.num_types = 1; 135 + adev->gmc.vm_fault.funcs = &gmc_v11_0_irq_funcs; 136 + 137 + if (!amdgpu_sriov_vf(adev)) { 138 + adev->gmc.ecc_irq.num_types = 1; 139 + adev->gmc.ecc_irq.funcs = &gmc_v11_0_ecc_funcs; 140 + } 141 + } 142 + 143 + /** 144 + * gmc_v11_0_use_invalidate_semaphore - judge whether to use semaphore 145 + * 146 + * @adev: amdgpu_device pointer 147 + * @vmhub: vmhub type 148 + * 149 + */ 150 + static bool gmc_v11_0_use_invalidate_semaphore(struct amdgpu_device *adev, 151 + uint32_t vmhub) 152 + { 153 + return ((vmhub == AMDGPU_MMHUB_0) && 154 + (!amdgpu_sriov_vf(adev))); 155 + } 156 + 157 + static bool gmc_v11_0_get_atc_vmid_pasid_mapping_info( 158 + struct amdgpu_device *adev, 159 + uint8_t vmid, uint16_t *p_pasid) 160 + { 161 + #if 0 // TODO: 162 + uint32_t value; 163 + 164 + value = RREG32(SOC15_REG_OFFSET(ATHUB, 0, mmATC_VMID0_PASID_MAPPING) 165 + + vmid); 166 + *p_pasid = value & ATC_VMID0_PASID_MAPPING__PASID_MASK; 167 + 168 + return !!(value & ATC_VMID0_PASID_MAPPING__VALID_MASK); 169 + #else 170 + return 0; 171 + #endif 172 + } 173 + 174 + /* 175 + * GART 176 + * VMID 0 is the physical GPU addresses as used by the kernel. 177 + * VMIDs 1-15 are used for userspace clients and are handled 178 + * by the amdgpu vm/hsa code. 179 + */ 180 + 181 + static void gmc_v11_0_flush_vm_hub(struct amdgpu_device *adev, uint32_t vmid, 182 + unsigned int vmhub, uint32_t flush_type) 183 + { 184 + bool use_semaphore = gmc_v11_0_use_invalidate_semaphore(adev, vmhub); 185 + struct amdgpu_vmhub *hub = &adev->vmhub[vmhub]; 186 + u32 inv_req = hub->vmhub_funcs->get_invalidate_req(vmid, flush_type); 187 + u32 tmp; 188 + /* Use register 17 for GART */ 189 + const unsigned eng = 17; 190 + unsigned int i; 191 + 192 + spin_lock(&adev->gmc.invalidate_lock); 193 + /* 194 + * It may lose gpuvm invalidate acknowldege state across power-gating 195 + * off cycle, add semaphore acquire before invalidation and semaphore 196 + * release after invalidation to avoid entering power gated state 197 + * to WA the Issue 198 + */ 199 + 200 + /* TODO: It needs to continue working on debugging with semaphore for GFXHUB as well. */ 201 + if (use_semaphore) { 202 + for (i = 0; i < adev->usec_timeout; i++) { 203 + /* a read return value of 1 means semaphore acuqire */ 204 + tmp = RREG32_NO_KIQ(hub->vm_inv_eng0_sem + 205 + hub->eng_distance * eng); 206 + if (tmp & 0x1) 207 + break; 208 + udelay(1); 209 + } 210 + 211 + if (i >= adev->usec_timeout) 212 + DRM_ERROR("Timeout waiting for sem acquire in VM flush!\n"); 213 + } 214 + 215 + WREG32_NO_KIQ(hub->vm_inv_eng0_req + hub->eng_distance * eng, inv_req); 216 + 217 + /* Wait for ACK with a delay.*/ 218 + for (i = 0; i < adev->usec_timeout; i++) { 219 + tmp = RREG32_NO_KIQ(hub->vm_inv_eng0_ack + 220 + hub->eng_distance * eng); 221 + tmp &= 1 << vmid; 222 + if (tmp) 223 + break; 224 + 225 + udelay(1); 226 + } 227 + 228 + /* TODO: It needs to continue working on debugging with semaphore for GFXHUB as well. */ 229 + if (use_semaphore) 230 + /* 231 + * add semaphore release after invalidation, 232 + * write with 0 means semaphore release 233 + */ 234 + WREG32_NO_KIQ(hub->vm_inv_eng0_sem + 235 + hub->eng_distance * eng, 0); 236 + 237 + /* Issue additional private vm invalidation to MMHUB */ 238 + if ((vmhub != AMDGPU_GFXHUB_0) && 239 + (hub->vm_l2_bank_select_reserved_cid2)) { 240 + inv_req = RREG32_NO_KIQ(hub->vm_l2_bank_select_reserved_cid2); 241 + /* bit 25: RSERVED_CACHE_PRIVATE_INVALIDATION */ 242 + inv_req |= (1 << 25); 243 + /* Issue private invalidation */ 244 + WREG32_NO_KIQ(hub->vm_l2_bank_select_reserved_cid2, inv_req); 245 + /* Read back to ensure invalidation is done*/ 246 + RREG32_NO_KIQ(hub->vm_l2_bank_select_reserved_cid2); 247 + } 248 + 249 + spin_unlock(&adev->gmc.invalidate_lock); 250 + 251 + if (i < adev->usec_timeout) 252 + return; 253 + 254 + DRM_ERROR("Timeout waiting for VM flush ACK!\n"); 255 + } 256 + 257 + /** 258 + * gmc_v11_0_flush_gpu_tlb - gart tlb flush callback 259 + * 260 + * @adev: amdgpu_device pointer 261 + * @vmid: vm instance to flush 262 + * 263 + * Flush the TLB for the requested page table. 264 + */ 265 + static void gmc_v11_0_flush_gpu_tlb(struct amdgpu_device *adev, uint32_t vmid, 266 + uint32_t vmhub, uint32_t flush_type) 267 + { 268 + if ((vmhub == AMDGPU_GFXHUB_0) && !adev->gfx.is_poweron) 269 + return; 270 + 271 + /* flush hdp cache */ 272 + adev->hdp.funcs->flush_hdp(adev, NULL); 273 + 274 + /* For SRIOV run time, driver shouldn't access the register through MMIO 275 + * Directly use kiq to do the vm invalidation instead 276 + */ 277 + if (adev->gfx.kiq.ring.sched.ready && 278 + (amdgpu_sriov_runtime(adev) || !amdgpu_sriov_vf(adev))) { 279 + struct amdgpu_vmhub *hub = &adev->vmhub[vmhub]; 280 + const unsigned eng = 17; 281 + u32 inv_req = hub->vmhub_funcs->get_invalidate_req(vmid, flush_type); 282 + u32 req = hub->vm_inv_eng0_req + hub->eng_distance * eng; 283 + u32 ack = hub->vm_inv_eng0_ack + hub->eng_distance * eng; 284 + 285 + amdgpu_virt_kiq_reg_write_reg_wait(adev, req, ack, inv_req, 286 + 1 << vmid); 287 + return; 288 + } 289 + 290 + mutex_lock(&adev->mman.gtt_window_lock); 291 + gmc_v11_0_flush_vm_hub(adev, vmid, vmhub, 0); 292 + mutex_unlock(&adev->mman.gtt_window_lock); 293 + return; 294 + } 295 + 296 + /** 297 + * gmc_v11_0_flush_gpu_tlb_pasid - tlb flush via pasid 298 + * 299 + * @adev: amdgpu_device pointer 300 + * @pasid: pasid to be flush 301 + * 302 + * Flush the TLB for the requested pasid. 303 + */ 304 + static int gmc_v11_0_flush_gpu_tlb_pasid(struct amdgpu_device *adev, 305 + uint16_t pasid, uint32_t flush_type, 306 + bool all_hub) 307 + { 308 + int vmid, i; 309 + signed long r; 310 + uint32_t seq; 311 + uint16_t queried_pasid; 312 + bool ret; 313 + struct amdgpu_ring *ring = &adev->gfx.kiq.ring; 314 + struct amdgpu_kiq *kiq = &adev->gfx.kiq; 315 + 316 + if (amdgpu_emu_mode == 0 && ring->sched.ready) { 317 + spin_lock(&adev->gfx.kiq.ring_lock); 318 + /* 2 dwords flush + 8 dwords fence */ 319 + amdgpu_ring_alloc(ring, kiq->pmf->invalidate_tlbs_size + 8); 320 + kiq->pmf->kiq_invalidate_tlbs(ring, 321 + pasid, flush_type, all_hub); 322 + r = amdgpu_fence_emit_polling(ring, &seq, MAX_KIQ_REG_WAIT); 323 + if (r) { 324 + amdgpu_ring_undo(ring); 325 + spin_unlock(&adev->gfx.kiq.ring_lock); 326 + return -ETIME; 327 + } 328 + 329 + amdgpu_ring_commit(ring); 330 + spin_unlock(&adev->gfx.kiq.ring_lock); 331 + r = amdgpu_fence_wait_polling(ring, seq, adev->usec_timeout); 332 + if (r < 1) { 333 + dev_err(adev->dev, "wait for kiq fence error: %ld.\n", r); 334 + return -ETIME; 335 + } 336 + 337 + return 0; 338 + } 339 + 340 + for (vmid = 1; vmid < 16; vmid++) { 341 + 342 + ret = gmc_v11_0_get_atc_vmid_pasid_mapping_info(adev, vmid, 343 + &queried_pasid); 344 + if (ret && queried_pasid == pasid) { 345 + if (all_hub) { 346 + for (i = 0; i < adev->num_vmhubs; i++) 347 + gmc_v11_0_flush_gpu_tlb(adev, vmid, 348 + i, flush_type); 349 + } else { 350 + gmc_v11_0_flush_gpu_tlb(adev, vmid, 351 + AMDGPU_GFXHUB_0, flush_type); 352 + } 353 + break; 354 + } 355 + } 356 + 357 + return 0; 358 + } 359 + 360 + static uint64_t gmc_v11_0_emit_flush_gpu_tlb(struct amdgpu_ring *ring, 361 + unsigned vmid, uint64_t pd_addr) 362 + { 363 + bool use_semaphore = gmc_v11_0_use_invalidate_semaphore(ring->adev, ring->funcs->vmhub); 364 + struct amdgpu_vmhub *hub = &ring->adev->vmhub[ring->funcs->vmhub]; 365 + uint32_t req = hub->vmhub_funcs->get_invalidate_req(vmid, 0); 366 + unsigned eng = ring->vm_inv_eng; 367 + 368 + /* 369 + * It may lose gpuvm invalidate acknowldege state across power-gating 370 + * off cycle, add semaphore acquire before invalidation and semaphore 371 + * release after invalidation to avoid entering power gated state 372 + * to WA the Issue 373 + */ 374 + 375 + /* TODO: It needs to continue working on debugging with semaphore for GFXHUB as well. */ 376 + if (use_semaphore) 377 + /* a read return value of 1 means semaphore acuqire */ 378 + amdgpu_ring_emit_reg_wait(ring, 379 + hub->vm_inv_eng0_sem + 380 + hub->eng_distance * eng, 0x1, 0x1); 381 + 382 + amdgpu_ring_emit_wreg(ring, hub->ctx0_ptb_addr_lo32 + 383 + (hub->ctx_addr_distance * vmid), 384 + lower_32_bits(pd_addr)); 385 + 386 + amdgpu_ring_emit_wreg(ring, hub->ctx0_ptb_addr_hi32 + 387 + (hub->ctx_addr_distance * vmid), 388 + upper_32_bits(pd_addr)); 389 + 390 + amdgpu_ring_emit_reg_write_reg_wait(ring, hub->vm_inv_eng0_req + 391 + hub->eng_distance * eng, 392 + hub->vm_inv_eng0_ack + 393 + hub->eng_distance * eng, 394 + req, 1 << vmid); 395 + 396 + /* TODO: It needs to continue working on debugging with semaphore for GFXHUB as well. */ 397 + if (use_semaphore) 398 + /* 399 + * add semaphore release after invalidation, 400 + * write with 0 means semaphore release 401 + */ 402 + amdgpu_ring_emit_wreg(ring, hub->vm_inv_eng0_sem + 403 + hub->eng_distance * eng, 0); 404 + 405 + return pd_addr; 406 + } 407 + 408 + static void gmc_v11_0_emit_pasid_mapping(struct amdgpu_ring *ring, unsigned vmid, 409 + unsigned pasid) 410 + { 411 + struct amdgpu_device *adev = ring->adev; 412 + uint32_t reg; 413 + 414 + if (ring->funcs->vmhub == AMDGPU_GFXHUB_0) 415 + reg = SOC15_REG_OFFSET(OSSSYS, 0, regIH_VMID_0_LUT) + vmid; 416 + else 417 + reg = SOC15_REG_OFFSET(OSSSYS, 0, regIH_VMID_0_LUT_MM) + vmid; 418 + 419 + amdgpu_ring_emit_wreg(ring, reg, pasid); 420 + } 421 + 422 + /* 423 + * PTE format: 424 + * 63:59 reserved 425 + * 58:57 reserved 426 + * 56 F 427 + * 55 L 428 + * 54 reserved 429 + * 53:52 SW 430 + * 51 T 431 + * 50:48 mtype 432 + * 47:12 4k physical page base address 433 + * 11:7 fragment 434 + * 6 write 435 + * 5 read 436 + * 4 exe 437 + * 3 Z 438 + * 2 snooped 439 + * 1 system 440 + * 0 valid 441 + * 442 + * PDE format: 443 + * 63:59 block fragment size 444 + * 58:55 reserved 445 + * 54 P 446 + * 53:48 reserved 447 + * 47:6 physical base address of PD or PTE 448 + * 5:3 reserved 449 + * 2 C 450 + * 1 system 451 + * 0 valid 452 + */ 453 + 454 + static uint64_t gmc_v11_0_map_mtype(struct amdgpu_device *adev, uint32_t flags) 455 + { 456 + switch (flags) { 457 + case AMDGPU_VM_MTYPE_DEFAULT: 458 + return AMDGPU_PTE_MTYPE_NV10(MTYPE_NC); 459 + case AMDGPU_VM_MTYPE_NC: 460 + return AMDGPU_PTE_MTYPE_NV10(MTYPE_NC); 461 + case AMDGPU_VM_MTYPE_WC: 462 + return AMDGPU_PTE_MTYPE_NV10(MTYPE_WC); 463 + case AMDGPU_VM_MTYPE_CC: 464 + return AMDGPU_PTE_MTYPE_NV10(MTYPE_CC); 465 + case AMDGPU_VM_MTYPE_UC: 466 + return AMDGPU_PTE_MTYPE_NV10(MTYPE_UC); 467 + default: 468 + return AMDGPU_PTE_MTYPE_NV10(MTYPE_NC); 469 + } 470 + } 471 + 472 + static void gmc_v11_0_get_vm_pde(struct amdgpu_device *adev, int level, 473 + uint64_t *addr, uint64_t *flags) 474 + { 475 + if (!(*flags & AMDGPU_PDE_PTE) && !(*flags & AMDGPU_PTE_SYSTEM)) 476 + *addr = adev->vm_manager.vram_base_offset + *addr - 477 + adev->gmc.vram_start; 478 + BUG_ON(*addr & 0xFFFF00000000003FULL); 479 + 480 + if (!adev->gmc.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 + } 494 + } 495 + 496 + static void gmc_v11_0_get_vm_pte(struct amdgpu_device *adev, 497 + struct amdgpu_bo_va_mapping *mapping, 498 + uint64_t *flags) 499 + { 500 + *flags &= ~AMDGPU_PTE_EXECUTABLE; 501 + *flags |= mapping->flags & AMDGPU_PTE_EXECUTABLE; 502 + 503 + *flags &= ~AMDGPU_PTE_MTYPE_NV10_MASK; 504 + *flags |= (mapping->flags & AMDGPU_PTE_MTYPE_NV10_MASK); 505 + 506 + if (mapping->flags & AMDGPU_PTE_PRT) { 507 + *flags |= AMDGPU_PTE_PRT; 508 + *flags |= AMDGPU_PTE_SNOOPED; 509 + *flags |= AMDGPU_PTE_LOG; 510 + *flags |= AMDGPU_PTE_SYSTEM; 511 + *flags &= ~AMDGPU_PTE_VALID; 512 + } 513 + } 514 + 515 + static unsigned gmc_v11_0_get_vbios_fb_size(struct amdgpu_device *adev) 516 + { 517 + return 0; 518 + } 519 + 520 + static const struct amdgpu_gmc_funcs gmc_v11_0_gmc_funcs = { 521 + .flush_gpu_tlb = gmc_v11_0_flush_gpu_tlb, 522 + .flush_gpu_tlb_pasid = gmc_v11_0_flush_gpu_tlb_pasid, 523 + .emit_flush_gpu_tlb = gmc_v11_0_emit_flush_gpu_tlb, 524 + .emit_pasid_mapping = gmc_v11_0_emit_pasid_mapping, 525 + .map_mtype = gmc_v11_0_map_mtype, 526 + .get_vm_pde = gmc_v11_0_get_vm_pde, 527 + .get_vm_pte = gmc_v11_0_get_vm_pte, 528 + .get_vbios_fb_size = gmc_v11_0_get_vbios_fb_size, 529 + }; 530 + 531 + static void gmc_v11_0_set_gmc_funcs(struct amdgpu_device *adev) 532 + { 533 + adev->gmc.gmc_funcs = &gmc_v11_0_gmc_funcs; 534 + } 535 + 536 + static void gmc_v11_0_set_umc_funcs(struct amdgpu_device *adev) 537 + { 538 + switch (adev->ip_versions[UMC_HWIP][0]) { 539 + case IP_VERSION(8, 10, 0): 540 + break; 541 + default: 542 + break; 543 + } 544 + } 545 + 546 + 547 + static void gmc_v11_0_set_mmhub_funcs(struct amdgpu_device *adev) 548 + { 549 + adev->mmhub.funcs = &mmhub_v3_0_funcs; 550 + } 551 + 552 + static void gmc_v11_0_set_gfxhub_funcs(struct amdgpu_device *adev) 553 + { 554 + adev->gfxhub.funcs = &gfxhub_v3_0_funcs; 555 + } 556 + 557 + static int gmc_v11_0_early_init(void *handle) 558 + { 559 + struct amdgpu_device *adev = (struct amdgpu_device *)handle; 560 + 561 + gmc_v11_0_set_gfxhub_funcs(adev); 562 + gmc_v11_0_set_mmhub_funcs(adev); 563 + gmc_v11_0_set_gmc_funcs(adev); 564 + gmc_v11_0_set_irq_funcs(adev); 565 + gmc_v11_0_set_umc_funcs(adev); 566 + 567 + adev->gmc.shared_aperture_start = 0x2000000000000000ULL; 568 + adev->gmc.shared_aperture_end = 569 + adev->gmc.shared_aperture_start + (4ULL << 30) - 1; 570 + adev->gmc.private_aperture_start = 0x1000000000000000ULL; 571 + adev->gmc.private_aperture_end = 572 + adev->gmc.private_aperture_start + (4ULL << 30) - 1; 573 + 574 + return 0; 575 + } 576 + 577 + static int gmc_v11_0_late_init(void *handle) 578 + { 579 + struct amdgpu_device *adev = (struct amdgpu_device *)handle; 580 + int r; 581 + 582 + r = amdgpu_gmc_allocate_vm_inv_eng(adev); 583 + if (r) 584 + return r; 585 + 586 + r = amdgpu_gmc_ras_late_init(adev); 587 + if (r) 588 + return r; 589 + 590 + return amdgpu_irq_get(adev, &adev->gmc.vm_fault, 0); 591 + } 592 + 593 + static void gmc_v11_0_vram_gtt_location(struct amdgpu_device *adev, 594 + struct amdgpu_gmc *mc) 595 + { 596 + u64 base = 0; 597 + 598 + base = adev->mmhub.funcs->get_fb_location(adev); 599 + 600 + amdgpu_gmc_vram_location(adev, &adev->gmc, base); 601 + amdgpu_gmc_gart_location(adev, mc); 602 + 603 + /* base offset of vram pages */ 604 + adev->vm_manager.vram_base_offset = adev->mmhub.funcs->get_mc_fb_offset(adev); 605 + } 606 + 607 + /** 608 + * gmc_v11_0_mc_init - initialize the memory controller driver params 609 + * 610 + * @adev: amdgpu_device pointer 611 + * 612 + * Look up the amount of vram, vram width, and decide how to place 613 + * vram and gart within the GPU's physical address space. 614 + * Returns 0 for success. 615 + */ 616 + static int gmc_v11_0_mc_init(struct amdgpu_device *adev) 617 + { 618 + int r; 619 + 620 + /* size in MB on si */ 621 + adev->gmc.mc_vram_size = 622 + adev->nbio.funcs->get_memsize(adev) * 1024ULL * 1024ULL; 623 + adev->gmc.real_vram_size = adev->gmc.mc_vram_size; 624 + 625 + if (!(adev->flags & AMD_IS_APU)) { 626 + r = amdgpu_device_resize_fb_bar(adev); 627 + if (r) 628 + return r; 629 + } 630 + adev->gmc.aper_base = pci_resource_start(adev->pdev, 0); 631 + adev->gmc.aper_size = pci_resource_len(adev->pdev, 0); 632 + 633 + /* In case the PCI BAR is larger than the actual amount of vram */ 634 + adev->gmc.visible_vram_size = adev->gmc.aper_size; 635 + if (adev->gmc.visible_vram_size > adev->gmc.real_vram_size) 636 + adev->gmc.visible_vram_size = adev->gmc.real_vram_size; 637 + 638 + /* set the gart size */ 639 + if (amdgpu_gart_size == -1) { 640 + adev->gmc.gart_size = 512ULL << 20; 641 + } else 642 + adev->gmc.gart_size = (u64)amdgpu_gart_size << 20; 643 + 644 + gmc_v11_0_vram_gtt_location(adev, &adev->gmc); 645 + 646 + return 0; 647 + } 648 + 649 + static int gmc_v11_0_gart_init(struct amdgpu_device *adev) 650 + { 651 + int r; 652 + 653 + if (adev->gart.bo) { 654 + WARN(1, "PCIE GART already initialized\n"); 655 + return 0; 656 + } 657 + 658 + /* Initialize common gart structure */ 659 + r = amdgpu_gart_init(adev); 660 + if (r) 661 + return r; 662 + 663 + adev->gart.table_size = adev->gart.num_gpu_pages * 8; 664 + adev->gart.gart_pte_flags = AMDGPU_PTE_MTYPE_NV10(MTYPE_UC) | 665 + AMDGPU_PTE_EXECUTABLE; 666 + 667 + return amdgpu_gart_table_vram_alloc(adev); 668 + } 669 + 670 + static int gmc_v11_0_sw_init(void *handle) 671 + { 672 + int r, vram_width = 0, vram_type = 0, vram_vendor = 0; 673 + struct amdgpu_device *adev = (struct amdgpu_device *)handle; 674 + 675 + adev->mmhub.funcs->init(adev); 676 + 677 + spin_lock_init(&adev->gmc.invalidate_lock); 678 + 679 + r = amdgpu_atomfirmware_get_vram_info(adev, 680 + &vram_width, &vram_type, &vram_vendor); 681 + adev->gmc.vram_width = vram_width; 682 + 683 + adev->gmc.vram_type = vram_type; 684 + adev->gmc.vram_vendor = vram_vendor; 685 + 686 + switch (adev->ip_versions[GC_HWIP][0]) { 687 + case IP_VERSION(11, 0, 0): 688 + adev->num_vmhubs = 2; 689 + /* 690 + * To fulfill 4-level page support, 691 + * vm size is 256TB (48bit), maximum size, 692 + * block size 512 (9bit) 693 + */ 694 + amdgpu_vm_adjust_size(adev, 256 * 1024, 9, 3, 48); 695 + break; 696 + default: 697 + break; 698 + } 699 + 700 + /* This interrupt is VMC page fault.*/ 701 + r = amdgpu_irq_add_id(adev, SOC21_IH_CLIENTID_VMC, 702 + VMC_1_0__SRCID__VM_FAULT, 703 + &adev->gmc.vm_fault); 704 + 705 + if (r) 706 + return r; 707 + 708 + r = amdgpu_irq_add_id(adev, SOC21_IH_CLIENTID_GFX, 709 + UTCL2_1_0__SRCID__FAULT, 710 + &adev->gmc.vm_fault); 711 + if (r) 712 + return r; 713 + 714 + if (!amdgpu_sriov_vf(adev)) { 715 + /* interrupt sent to DF. */ 716 + r = amdgpu_irq_add_id(adev, SOC21_IH_CLIENTID_DF, 0, 717 + &adev->gmc.ecc_irq); 718 + if (r) 719 + return r; 720 + } 721 + 722 + /* 723 + * Set the internal MC address mask This is the max address of the GPU's 724 + * internal address space. 725 + */ 726 + adev->gmc.mc_mask = 0xffffffffffffULL; /* 48 bit MC */ 727 + 728 + r = dma_set_mask_and_coherent(adev->dev, DMA_BIT_MASK(44)); 729 + if (r) { 730 + printk(KERN_WARNING "amdgpu: No suitable DMA available.\n"); 731 + return r; 732 + } 733 + 734 + r = gmc_v11_0_mc_init(adev); 735 + if (r) 736 + return r; 737 + 738 + amdgpu_gmc_get_vbios_allocations(adev); 739 + 740 + /* Memory manager */ 741 + r = amdgpu_bo_init(adev); 742 + if (r) 743 + return r; 744 + 745 + r = gmc_v11_0_gart_init(adev); 746 + if (r) 747 + return r; 748 + 749 + /* 750 + * number of VMs 751 + * VMID 0 is reserved for System 752 + * amdgpu graphics/compute will use VMIDs 1-7 753 + * amdkfd will use VMIDs 8-15 754 + */ 755 + adev->vm_manager.first_kfd_vmid = 8; 756 + 757 + amdgpu_vm_manager_init(adev); 758 + 759 + return 0; 760 + } 761 + 762 + /** 763 + * gmc_v11_0_gart_fini - vm fini callback 764 + * 765 + * @adev: amdgpu_device pointer 766 + * 767 + * Tears down the driver GART/VM setup (CIK). 768 + */ 769 + static void gmc_v11_0_gart_fini(struct amdgpu_device *adev) 770 + { 771 + amdgpu_gart_table_vram_free(adev); 772 + } 773 + 774 + static int gmc_v11_0_sw_fini(void *handle) 775 + { 776 + struct amdgpu_device *adev = (struct amdgpu_device *)handle; 777 + 778 + amdgpu_vm_manager_fini(adev); 779 + gmc_v11_0_gart_fini(adev); 780 + amdgpu_gem_force_release(adev); 781 + amdgpu_bo_fini(adev); 782 + 783 + return 0; 784 + } 785 + 786 + static void gmc_v11_0_init_golden_registers(struct amdgpu_device *adev) 787 + { 788 + } 789 + 790 + /** 791 + * gmc_v11_0_gart_enable - gart enable 792 + * 793 + * @adev: amdgpu_device pointer 794 + */ 795 + static int gmc_v11_0_gart_enable(struct amdgpu_device *adev) 796 + { 797 + int r; 798 + bool value; 799 + 800 + if (adev->gart.bo == NULL) { 801 + dev_err(adev->dev, "No VRAM object for PCIE GART.\n"); 802 + return -EINVAL; 803 + } 804 + 805 + amdgpu_gtt_mgr_recover(&adev->mman.gtt_mgr); 806 + r = adev->mmhub.funcs->gart_enable(adev); 807 + if (r) 808 + return r; 809 + 810 + /* Flush HDP after it is initialized */ 811 + adev->hdp.funcs->flush_hdp(adev, NULL); 812 + 813 + value = (amdgpu_vm_fault_stop == AMDGPU_VM_FAULT_STOP_ALWAYS) ? 814 + false : true; 815 + 816 + adev->mmhub.funcs->set_fault_enable_default(adev, value); 817 + gmc_v11_0_flush_gpu_tlb(adev, 0, AMDGPU_MMHUB_0, 0); 818 + 819 + DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n", 820 + (unsigned)(adev->gmc.gart_size >> 20), 821 + (unsigned long long)amdgpu_bo_gpu_offset(adev->gart.bo)); 822 + 823 + return 0; 824 + } 825 + 826 + static int gmc_v11_0_hw_init(void *handle) 827 + { 828 + int r; 829 + struct amdgpu_device *adev = (struct amdgpu_device *)handle; 830 + 831 + /* The sequence of these two function calls matters.*/ 832 + gmc_v11_0_init_golden_registers(adev); 833 + 834 + r = gmc_v11_0_gart_enable(adev); 835 + if (r) 836 + return r; 837 + 838 + if (adev->umc.funcs && adev->umc.funcs->init_registers) 839 + adev->umc.funcs->init_registers(adev); 840 + 841 + return 0; 842 + } 843 + 844 + /** 845 + * gmc_v11_0_gart_disable - gart disable 846 + * 847 + * @adev: amdgpu_device pointer 848 + * 849 + * This disables all VM page table. 850 + */ 851 + static void gmc_v11_0_gart_disable(struct amdgpu_device *adev) 852 + { 853 + adev->mmhub.funcs->gart_disable(adev); 854 + } 855 + 856 + static int gmc_v11_0_hw_fini(void *handle) 857 + { 858 + struct amdgpu_device *adev = (struct amdgpu_device *)handle; 859 + 860 + if (amdgpu_sriov_vf(adev)) { 861 + /* full access mode, so don't touch any GMC register */ 862 + DRM_DEBUG("For SRIOV client, shouldn't do anything.\n"); 863 + return 0; 864 + } 865 + 866 + amdgpu_irq_put(adev, &adev->gmc.ecc_irq, 0); 867 + amdgpu_irq_put(adev, &adev->gmc.vm_fault, 0); 868 + gmc_v11_0_gart_disable(adev); 869 + 870 + return 0; 871 + } 872 + 873 + static int gmc_v11_0_suspend(void *handle) 874 + { 875 + struct amdgpu_device *adev = (struct amdgpu_device *)handle; 876 + 877 + gmc_v11_0_hw_fini(adev); 878 + 879 + return 0; 880 + } 881 + 882 + static int gmc_v11_0_resume(void *handle) 883 + { 884 + int r; 885 + struct amdgpu_device *adev = (struct amdgpu_device *)handle; 886 + 887 + r = gmc_v11_0_hw_init(adev); 888 + if (r) 889 + return r; 890 + 891 + amdgpu_vmid_reset_all(adev); 892 + 893 + return 0; 894 + } 895 + 896 + static bool gmc_v11_0_is_idle(void *handle) 897 + { 898 + /* MC is always ready in GMC v11.*/ 899 + return true; 900 + } 901 + 902 + static int gmc_v11_0_wait_for_idle(void *handle) 903 + { 904 + /* There is no need to wait for MC idle in GMC v11.*/ 905 + return 0; 906 + } 907 + 908 + static int gmc_v11_0_soft_reset(void *handle) 909 + { 910 + return 0; 911 + } 912 + 913 + static int gmc_v11_0_set_clockgating_state(void *handle, 914 + enum amd_clockgating_state state) 915 + { 916 + int r; 917 + struct amdgpu_device *adev = (struct amdgpu_device *)handle; 918 + 919 + r = adev->mmhub.funcs->set_clockgating(adev, state); 920 + if (r) 921 + return r; 922 + 923 + return athub_v3_0_set_clockgating(adev, state); 924 + } 925 + 926 + static void gmc_v11_0_get_clockgating_state(void *handle, u64 *flags) 927 + { 928 + struct amdgpu_device *adev = (struct amdgpu_device *)handle; 929 + 930 + adev->mmhub.funcs->get_clockgating(adev, flags); 931 + 932 + athub_v3_0_get_clockgating(adev, flags); 933 + } 934 + 935 + static int gmc_v11_0_set_powergating_state(void *handle, 936 + enum amd_powergating_state state) 937 + { 938 + return 0; 939 + } 940 + 941 + const struct amd_ip_funcs gmc_v11_0_ip_funcs = { 942 + .name = "gmc_v11_0", 943 + .early_init = gmc_v11_0_early_init, 944 + .sw_init = gmc_v11_0_sw_init, 945 + .hw_init = gmc_v11_0_hw_init, 946 + .late_init = gmc_v11_0_late_init, 947 + .sw_fini = gmc_v11_0_sw_fini, 948 + .hw_fini = gmc_v11_0_hw_fini, 949 + .suspend = gmc_v11_0_suspend, 950 + .resume = gmc_v11_0_resume, 951 + .is_idle = gmc_v11_0_is_idle, 952 + .wait_for_idle = gmc_v11_0_wait_for_idle, 953 + .soft_reset = gmc_v11_0_soft_reset, 954 + .set_clockgating_state = gmc_v11_0_set_clockgating_state, 955 + .set_powergating_state = gmc_v11_0_set_powergating_state, 956 + .get_clockgating_state = gmc_v11_0_get_clockgating_state, 957 + }; 958 + 959 + const struct amdgpu_ip_block_version gmc_v11_0_ip_block = { 960 + .type = AMD_IP_BLOCK_TYPE_GMC, 961 + .major = 11, 962 + .minor = 0, 963 + .rev = 0, 964 + .funcs = &gmc_v11_0_ip_funcs, 965 + };
+30
drivers/gpu/drm/amd/amdgpu/gmc_v11_0.h
··· 1 + /* 2 + * Copyright 2021 Advanced Micro Devices, Inc. 3 + * 4 + * Permission is hereby granted, free of charge, to any person obtaining a 5 + * copy of this software and associated documentation files (the "Software"), 6 + * to deal in the Software without restriction, including without limitation 7 + * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 + * and/or sell copies of the Software, and to permit persons to whom the 9 + * Software is furnished to do so, subject to the following conditions: 10 + * 11 + * The above copyright notice and this permission notice shall be included in 12 + * all copies or substantial portions of the Software. 13 + * 14 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17 + * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 18 + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19 + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20 + * OTHER DEALINGS IN THE SOFTWARE. 21 + * 22 + */ 23 + 24 + #ifndef __GMC_V11_0_H__ 25 + #define __GMC_V11_0_H__ 26 + 27 + extern const struct amd_ip_funcs gmc_v11_0_ip_funcs; 28 + extern const struct amdgpu_ip_block_version gmc_v11_0_ip_block; 29 + 30 + #endif