return 0;
}
+static uint32_t ih_v7_0_setup_retry_doorbell(u32 doorbell_index)
+{
+ u32 val = 0;
+
+ val = REG_SET_FIELD(val, IH_DOORBELL_RPTR, OFFSET, doorbell_index);
+ val = REG_SET_FIELD(val, IH_DOORBELL_RPTR, ENABLE, 1);
+
+ return val;
+}
+
/**
* ih_v7_0_irq_init - init and enable the interrupt ring
*
pci_set_master(adev->pdev);
+ if (amdgpu_ip_version(adev, OSSSYS_HWIP, 0) == IP_VERSION(7, 1, 0)) {
+ /* Allocate the doorbell for IH Retry CAM */
+ adev->irq.retry_cam_doorbell_index = (adev->doorbell_index.ih + 2) << 1;
+ WREG32_SOC15(OSSSYS, 0, regIH_DOORBELL_RETRY_CAM,
+ ih_v7_0_setup_retry_doorbell(adev->irq.retry_cam_doorbell_index));
+
+ /* Enable IH Retry CAM */
+ tmp = RREG32_SOC15(OSSSYS, 0, regIH_RETRY_INT_CAM_CNTL);
+ tmp = REG_SET_FIELD(tmp, IH_RETRY_INT_CAM_CNTL, ENABLE, 1);
+ tmp = REG_SET_FIELD(tmp, IH_RETRY_INT_CAM_CNTL, CAM_SIZE, 0xF);
+ WREG32_SOC15(OSSSYS, 0, regIH_RETRY_INT_CAM_CNTL, tmp);
+
+ adev->irq.retry_cam_enabled = true;
+ }
+
/* enable interrupts */
ret = ih_v7_0_toggle_interrupts(adev, true);
if (ret)
int r;
struct amdgpu_device *adev = ip_block->adev;
bool use_bus_addr;
+ unsigned int sw_ring_size;
r = amdgpu_irq_add_id(adev, SOC21_IH_CLIENTID_IH, 0,
&adev->irq.self_irq);
/* initialize ih control register offset */
ih_v7_0_init_register_offset(adev);
- r = amdgpu_ih_ring_init(adev, &adev->irq.ih_soft, PAGE_SIZE, true);
+ sw_ring_size = (amdgpu_ip_version(adev, OSSSYS_HWIP, 0) == IP_VERSION(7, 1, 0)) ?
+ IH_SW_RING_SIZE : PAGE_SIZE;
+ r = amdgpu_ih_ring_init(adev, &adev->irq.ih_soft, sw_ring_size, true);
if (r)
return r;