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

Configure Feed

Select the types of activity you want to include in your feed.

drm/amdgpu: Enable IH CAM on IH 7.1.0

Enable IH CAM to handle retry faults on IH 7.1.0.
Also increase the soft ring size.

Signed-off-by: Mukul Joshi <mukul.joshi@amd.com>
Reviewed-by: Philip Yang <Philip.Yang@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Mukul Joshi and committed by
Alex Deucher
e06d1942 692c70f4

+29 -1
+29 -1
drivers/gpu/drm/amd/amdgpu/ih_v7_0.c
··· 279 279 return 0; 280 280 } 281 281 282 + static uint32_t ih_v7_0_setup_retry_doorbell(u32 doorbell_index) 283 + { 284 + u32 val = 0; 285 + 286 + val = REG_SET_FIELD(val, IH_DOORBELL_RPTR, OFFSET, doorbell_index); 287 + val = REG_SET_FIELD(val, IH_DOORBELL_RPTR, ENABLE, 1); 288 + 289 + return val; 290 + } 291 + 282 292 /** 283 293 * ih_v7_0_irq_init - init and enable the interrupt ring 284 294 * ··· 372 362 } 373 363 374 364 pci_set_master(adev->pdev); 365 + 366 + if (amdgpu_ip_version(adev, OSSSYS_HWIP, 0) == IP_VERSION(7, 1, 0)) { 367 + /* Allocate the doorbell for IH Retry CAM */ 368 + adev->irq.retry_cam_doorbell_index = (adev->doorbell_index.ih + 2) << 1; 369 + WREG32_SOC15(OSSSYS, 0, regIH_DOORBELL_RETRY_CAM, 370 + ih_v7_0_setup_retry_doorbell(adev->irq.retry_cam_doorbell_index)); 371 + 372 + /* Enable IH Retry CAM */ 373 + tmp = RREG32_SOC15(OSSSYS, 0, regIH_RETRY_INT_CAM_CNTL); 374 + tmp = REG_SET_FIELD(tmp, IH_RETRY_INT_CAM_CNTL, ENABLE, 1); 375 + tmp = REG_SET_FIELD(tmp, IH_RETRY_INT_CAM_CNTL, CAM_SIZE, 0xF); 376 + WREG32_SOC15(OSSSYS, 0, regIH_RETRY_INT_CAM_CNTL, tmp); 377 + 378 + adev->irq.retry_cam_enabled = true; 379 + } 375 380 376 381 /* enable interrupts */ 377 382 ret = ih_v7_0_toggle_interrupts(adev, true); ··· 567 542 int r; 568 543 struct amdgpu_device *adev = ip_block->adev; 569 544 bool use_bus_addr; 545 + unsigned int sw_ring_size; 570 546 571 547 r = amdgpu_irq_add_id(adev, SOC21_IH_CLIENTID_IH, 0, 572 548 &adev->irq.self_irq); ··· 599 573 /* initialize ih control register offset */ 600 574 ih_v7_0_init_register_offset(adev); 601 575 602 - r = amdgpu_ih_ring_init(adev, &adev->irq.ih_soft, PAGE_SIZE, true); 576 + sw_ring_size = (amdgpu_ip_version(adev, OSSSYS_HWIP, 0) == IP_VERSION(7, 1, 0)) ? 577 + IH_SW_RING_SIZE : PAGE_SIZE; 578 + r = amdgpu_ih_ring_init(adev, &adev->irq.ih_soft, sw_ring_size, true); 603 579 if (r) 604 580 return r; 605 581