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/si_ih: Enable soft IRQ handler ring

We are going to use the soft IRQ handler ring on GMC v6 (SI)
to process interrupts from VM faults.

Signed-off-by: Timur Kristóf <timur.kristof@gmail.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Timur Kristóf and committed by
Alex Deucher
2a38b0ec a7fa4f2d

+12
+12
drivers/gpu/drm/amd/amdgpu/si_ih.c
··· 96 96 pci_set_master(adev->pdev); 97 97 si_ih_enable_interrupts(adev); 98 98 99 + if (adev->irq.ih_soft.ring_size) 100 + adev->irq.ih_soft.enabled = true; 101 + 99 102 return 0; 100 103 } 101 104 ··· 115 112 116 113 wptr = le32_to_cpu(*ih->wptr_cpu); 117 114 115 + if (ih == &adev->irq.ih_soft) 116 + goto out; 117 + 118 118 if (wptr & IH_RB_WPTR__RB_OVERFLOW_MASK) { 119 119 wptr &= ~IH_RB_WPTR__RB_OVERFLOW_MASK; 120 120 dev_warn(adev->dev, "IH ring buffer overflow (0x%08X, 0x%08X, 0x%08X)\n", ··· 133 127 tmp &= ~IH_RB_CNTL__WPTR_OVERFLOW_CLEAR_MASK; 134 128 WREG32(IH_RB_CNTL, tmp); 135 129 } 130 + 131 + out: 136 132 return (wptr & ih->ptr_mask); 137 133 } 138 134 ··· 180 172 struct amdgpu_device *adev = ip_block->adev; 181 173 182 174 r = amdgpu_ih_ring_init(adev, &adev->irq.ih, 64 * 1024, false); 175 + if (r) 176 + return r; 177 + 178 + r = amdgpu_ih_ring_init(adev, &adev->irq.ih_soft, IH_SW_RING_SIZE, true); 183 179 if (r) 184 180 return r; 185 181