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

drm/amdgpu: enable IH doorbell for ring 1&2 on Vega

The doorbells should already be reserved, just enable them.

Signed-off-by: Christian König <christian.koenig@amd.com>
Acked-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
1ae64cec 0133690e

+45 -24
+2 -1
drivers/gpu/drm/amd/amdgpu/nbio_v6_1.c
··· 118 118 119 119 if (use_doorbell) { 120 120 ih_doorbell_range = REG_SET_FIELD(ih_doorbell_range, BIF_IH_DOORBELL_RANGE, OFFSET, doorbell_index); 121 - ih_doorbell_range = REG_SET_FIELD(ih_doorbell_range, BIF_IH_DOORBELL_RANGE, SIZE, 2); 121 + ih_doorbell_range = REG_SET_FIELD(ih_doorbell_range, 122 + BIF_IH_DOORBELL_RANGE, SIZE, 6); 122 123 } else 123 124 ih_doorbell_range = REG_SET_FIELD(ih_doorbell_range, BIF_IH_DOORBELL_RANGE, SIZE, 0); 124 125
+43 -23
drivers/gpu/drm/amd/amdgpu/vega10_ih.c
··· 136 136 return ih_rb_cntl; 137 137 } 138 138 139 + static uint32_t vega10_ih_doorbell_rptr(struct amdgpu_ih_ring *ih) 140 + { 141 + u32 ih_doorbell_rtpr = 0; 142 + 143 + if (ih->use_doorbell) { 144 + ih_doorbell_rtpr = REG_SET_FIELD(ih_doorbell_rtpr, 145 + IH_DOORBELL_RPTR, OFFSET, 146 + ih->doorbell_index); 147 + ih_doorbell_rtpr = REG_SET_FIELD(ih_doorbell_rtpr, 148 + IH_DOORBELL_RPTR, 149 + ENABLE, 1); 150 + } else { 151 + ih_doorbell_rtpr = REG_SET_FIELD(ih_doorbell_rtpr, 152 + IH_DOORBELL_RPTR, 153 + ENABLE, 0); 154 + } 155 + return ih_doorbell_rtpr; 156 + } 157 + 139 158 /** 140 159 * vega10_ih_irq_init - init and enable the interrupt ring 141 160 * ··· 169 150 static int vega10_ih_irq_init(struct amdgpu_device *adev) 170 151 { 171 152 struct amdgpu_ih_ring *ih; 153 + u32 ih_rb_cntl; 172 154 int ret = 0; 173 - u32 ih_rb_cntl, ih_doorbell_rtpr; 174 155 u32 tmp; 175 156 176 157 /* disable irqs */ ··· 196 177 upper_32_bits(ih->wptr_addr) & 0xFFFF); 197 178 198 179 /* set rptr, wptr to 0 */ 199 - WREG32_SOC15(OSSSYS, 0, mmIH_RB_RPTR, 0); 200 180 WREG32_SOC15(OSSSYS, 0, mmIH_RB_WPTR, 0); 181 + WREG32_SOC15(OSSSYS, 0, mmIH_RB_RPTR, 0); 201 182 202 - ih_doorbell_rtpr = RREG32_SOC15(OSSSYS, 0, mmIH_DOORBELL_RPTR); 203 - if (adev->irq.ih.use_doorbell) { 204 - ih_doorbell_rtpr = REG_SET_FIELD(ih_doorbell_rtpr, 205 - IH_DOORBELL_RPTR, OFFSET, 206 - adev->irq.ih.doorbell_index); 207 - ih_doorbell_rtpr = REG_SET_FIELD(ih_doorbell_rtpr, 208 - IH_DOORBELL_RPTR, 209 - ENABLE, 1); 210 - } else { 211 - ih_doorbell_rtpr = REG_SET_FIELD(ih_doorbell_rtpr, 212 - IH_DOORBELL_RPTR, 213 - ENABLE, 0); 214 - } 215 - WREG32_SOC15(OSSSYS, 0, mmIH_DOORBELL_RPTR, ih_doorbell_rtpr); 183 + WREG32_SOC15(OSSSYS, 0, mmIH_DOORBELL_RPTR, 184 + vega10_ih_doorbell_rptr(ih)); 216 185 217 186 ih = &adev->irq.ih1; 218 187 if (ih->ring_size) { ··· 217 210 WREG32_SOC15(OSSSYS, 0, mmIH_RB_CNTL_RING1, ih_rb_cntl); 218 211 219 212 /* set rptr, wptr to 0 */ 220 - WREG32_SOC15(OSSSYS, 0, mmIH_RB_RPTR_RING1, 0); 221 213 WREG32_SOC15(OSSSYS, 0, mmIH_RB_WPTR_RING1, 0); 214 + WREG32_SOC15(OSSSYS, 0, mmIH_RB_RPTR_RING1, 0); 215 + 216 + WREG32_SOC15(OSSSYS, 0, mmIH_DOORBELL_RPTR_RING1, 217 + vega10_ih_doorbell_rptr(ih)); 222 218 } 223 219 224 220 ih = &adev->irq.ih2; ··· 230 220 WREG32_SOC15(OSSSYS, 0, mmIH_RB_BASE_HI_RING2, 231 221 (ih->gpu_addr >> 40) & 0xff); 232 222 233 - ih_rb_cntl = RREG32_SOC15(OSSSYS, 0, mmIH_RB_CNTL_RING1); 223 + ih_rb_cntl = RREG32_SOC15(OSSSYS, 0, mmIH_RB_CNTL_RING2); 234 224 ih_rb_cntl = vega10_ih_rb_cntl(ih, ih_rb_cntl); 235 225 WREG32_SOC15(OSSSYS, 0, mmIH_RB_CNTL_RING2, ih_rb_cntl); 236 226 237 227 /* set rptr, wptr to 0 */ 238 - WREG32_SOC15(OSSSYS, 0, mmIH_RB_RPTR_RING2, 0); 239 228 WREG32_SOC15(OSSSYS, 0, mmIH_RB_WPTR_RING2, 0); 229 + WREG32_SOC15(OSSSYS, 0, mmIH_RB_RPTR_RING2, 0); 230 + 231 + WREG32_SOC15(OSSSYS, 0, mmIH_DOORBELL_RPTR_RING2, 232 + vega10_ih_doorbell_rptr(ih)); 240 233 } 241 234 242 235 tmp = RREG32_SOC15(OSSSYS, 0, mmIH_STORM_CLIENT_LIST_CNTL); ··· 466 453 if (r) 467 454 return r; 468 455 456 + adev->irq.ih.use_doorbell = true; 457 + adev->irq.ih.doorbell_index = adev->doorbell_index.ih << 1; 458 + 469 459 if (adev->asic_type == CHIP_VEGA10) { 470 460 r = amdgpu_ih_ring_init(adev, &adev->irq.ih1, PAGE_SIZE, true); 471 461 if (r) 472 462 return r; 473 463 464 + adev->irq.ih1.use_doorbell = true; 465 + adev->irq.ih1.doorbell_index = 466 + (adev->doorbell_index.ih + 1) << 1; 467 + 474 468 r = amdgpu_ih_ring_init(adev, &adev->irq.ih2, PAGE_SIZE, true); 475 469 if (r) 476 470 return r; 477 - } 478 471 479 - /* TODO add doorbell for IH1 & IH2 as well */ 480 - adev->irq.ih.use_doorbell = true; 481 - adev->irq.ih.doorbell_index = adev->doorbell_index.ih << 1; 472 + adev->irq.ih2.use_doorbell = true; 473 + adev->irq.ih2.doorbell_index = 474 + (adev->doorbell_index.ih + 2) << 1; 475 + } 482 476 483 477 r = amdgpu_irq_init(adev); 484 478