diff options
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu.h | 6 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/vi.c | 25 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/include/cgs_common.h | 1 |
5 files changed, 40 insertions, 0 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h index 814f12cc7f08..eb09037a7161 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h | |||
@@ -2018,6 +2018,10 @@ struct amdgpu_device { | |||
2018 | spinlock_t didt_idx_lock; | 2018 | spinlock_t didt_idx_lock; |
2019 | amdgpu_rreg_t didt_rreg; | 2019 | amdgpu_rreg_t didt_rreg; |
2020 | amdgpu_wreg_t didt_wreg; | 2020 | amdgpu_wreg_t didt_wreg; |
2021 | /* protects concurrent gc_cac register access */ | ||
2022 | spinlock_t gc_cac_idx_lock; | ||
2023 | amdgpu_rreg_t gc_cac_rreg; | ||
2024 | amdgpu_wreg_t gc_cac_wreg; | ||
2021 | /* protects concurrent ENDPOINT (audio) register access */ | 2025 | /* protects concurrent ENDPOINT (audio) register access */ |
2022 | spinlock_t audio_endpt_idx_lock; | 2026 | spinlock_t audio_endpt_idx_lock; |
2023 | amdgpu_block_rreg_t audio_endpt_rreg; | 2027 | amdgpu_block_rreg_t audio_endpt_rreg; |
@@ -2147,6 +2151,8 @@ void amdgpu_mm_wdoorbell(struct amdgpu_device *adev, u32 index, u32 v); | |||
2147 | #define WREG32_UVD_CTX(reg, v) adev->uvd_ctx_wreg(adev, (reg), (v)) | 2151 | #define WREG32_UVD_CTX(reg, v) adev->uvd_ctx_wreg(adev, (reg), (v)) |
2148 | #define RREG32_DIDT(reg) adev->didt_rreg(adev, (reg)) | 2152 | #define RREG32_DIDT(reg) adev->didt_rreg(adev, (reg)) |
2149 | #define WREG32_DIDT(reg, v) adev->didt_wreg(adev, (reg), (v)) | 2153 | #define WREG32_DIDT(reg, v) adev->didt_wreg(adev, (reg), (v)) |
2154 | #define RREG32_GC_CAC(reg) adev->gc_cac_rreg(adev, (reg)) | ||
2155 | #define WREG32_GC_CAC(reg, v) adev->gc_cac_wreg(adev, (reg), (v)) | ||
2150 | #define RREG32_AUDIO_ENDPT(block, reg) adev->audio_endpt_rreg(adev, (block), (reg)) | 2156 | #define RREG32_AUDIO_ENDPT(block, reg) adev->audio_endpt_rreg(adev, (block), (reg)) |
2151 | #define WREG32_AUDIO_ENDPT(block, reg, v) adev->audio_endpt_wreg(adev, (block), (reg), (v)) | 2157 | #define WREG32_AUDIO_ENDPT(block, reg, v) adev->audio_endpt_wreg(adev, (block), (reg), (v)) |
2152 | #define WREG32_P(reg, val, mask) \ | 2158 | #define WREG32_P(reg, val, mask) \ |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c index f4130501c624..5556ce979199 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c | |||
@@ -312,6 +312,8 @@ static uint32_t amdgpu_cgs_read_ind_register(struct cgs_device *cgs_device, | |||
312 | return RREG32_UVD_CTX(index); | 312 | return RREG32_UVD_CTX(index); |
313 | case CGS_IND_REG__DIDT: | 313 | case CGS_IND_REG__DIDT: |
314 | return RREG32_DIDT(index); | 314 | return RREG32_DIDT(index); |
315 | case CGS_IND_REG_GC_CAC: | ||
316 | return RREG32_GC_CAC(index); | ||
315 | case CGS_IND_REG__AUDIO_ENDPT: | 317 | case CGS_IND_REG__AUDIO_ENDPT: |
316 | DRM_ERROR("audio endpt register access not implemented.\n"); | 318 | DRM_ERROR("audio endpt register access not implemented.\n"); |
317 | return 0; | 319 | return 0; |
@@ -336,6 +338,8 @@ static void amdgpu_cgs_write_ind_register(struct cgs_device *cgs_device, | |||
336 | return WREG32_UVD_CTX(index, value); | 338 | return WREG32_UVD_CTX(index, value); |
337 | case CGS_IND_REG__DIDT: | 339 | case CGS_IND_REG__DIDT: |
338 | return WREG32_DIDT(index, value); | 340 | return WREG32_DIDT(index, value); |
341 | case CGS_IND_REG_GC_CAC: | ||
342 | return WREG32_GC_CAC(index, value); | ||
339 | case CGS_IND_REG__AUDIO_ENDPT: | 343 | case CGS_IND_REG__AUDIO_ENDPT: |
340 | DRM_ERROR("audio endpt register access not implemented.\n"); | 344 | DRM_ERROR("audio endpt register access not implemented.\n"); |
341 | return; | 345 | return; |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c index 29d0055fe50d..9c9f28c1ce84 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | |||
@@ -1488,9 +1488,12 @@ int amdgpu_device_init(struct amdgpu_device *adev, | |||
1488 | adev->uvd_ctx_wreg = &amdgpu_invalid_wreg; | 1488 | adev->uvd_ctx_wreg = &amdgpu_invalid_wreg; |
1489 | adev->didt_rreg = &amdgpu_invalid_rreg; | 1489 | adev->didt_rreg = &amdgpu_invalid_rreg; |
1490 | adev->didt_wreg = &amdgpu_invalid_wreg; | 1490 | adev->didt_wreg = &amdgpu_invalid_wreg; |
1491 | adev->gc_cac_rreg = &amdgpu_invalid_rreg; | ||
1492 | adev->gc_cac_wreg = &amdgpu_invalid_wreg; | ||
1491 | adev->audio_endpt_rreg = &amdgpu_block_invalid_rreg; | 1493 | adev->audio_endpt_rreg = &amdgpu_block_invalid_rreg; |
1492 | adev->audio_endpt_wreg = &amdgpu_block_invalid_wreg; | 1494 | adev->audio_endpt_wreg = &amdgpu_block_invalid_wreg; |
1493 | 1495 | ||
1496 | |||
1494 | DRM_INFO("initializing kernel modesetting (%s 0x%04X:0x%04X 0x%04X:0x%04X 0x%02X).\n", | 1497 | DRM_INFO("initializing kernel modesetting (%s 0x%04X:0x%04X 0x%04X:0x%04X 0x%02X).\n", |
1495 | amdgpu_asic_name[adev->asic_type], pdev->vendor, pdev->device, | 1498 | amdgpu_asic_name[adev->asic_type], pdev->vendor, pdev->device, |
1496 | pdev->subsystem_vendor, pdev->subsystem_device, pdev->revision); | 1499 | pdev->subsystem_vendor, pdev->subsystem_device, pdev->revision); |
@@ -1515,6 +1518,7 @@ int amdgpu_device_init(struct amdgpu_device *adev, | |||
1515 | spin_lock_init(&adev->pcie_idx_lock); | 1518 | spin_lock_init(&adev->pcie_idx_lock); |
1516 | spin_lock_init(&adev->uvd_ctx_idx_lock); | 1519 | spin_lock_init(&adev->uvd_ctx_idx_lock); |
1517 | spin_lock_init(&adev->didt_idx_lock); | 1520 | spin_lock_init(&adev->didt_idx_lock); |
1521 | spin_lock_init(&adev->gc_cac_idx_lock); | ||
1518 | spin_lock_init(&adev->audio_endpt_idx_lock); | 1522 | spin_lock_init(&adev->audio_endpt_idx_lock); |
1519 | 1523 | ||
1520 | adev->rmmio_base = pci_resource_start(adev->pdev, 5); | 1524 | adev->rmmio_base = pci_resource_start(adev->pdev, 5); |
diff --git a/drivers/gpu/drm/amd/amdgpu/vi.c b/drivers/gpu/drm/amd/amdgpu/vi.c index 66effd2173a5..cda7def9dc2c 100644 --- a/drivers/gpu/drm/amd/amdgpu/vi.c +++ b/drivers/gpu/drm/amd/amdgpu/vi.c | |||
@@ -203,6 +203,29 @@ static void vi_didt_wreg(struct amdgpu_device *adev, u32 reg, u32 v) | |||
203 | spin_unlock_irqrestore(&adev->didt_idx_lock, flags); | 203 | spin_unlock_irqrestore(&adev->didt_idx_lock, flags); |
204 | } | 204 | } |
205 | 205 | ||
206 | static u32 vi_gc_cac_rreg(struct amdgpu_device *adev, u32 reg) | ||
207 | { | ||
208 | unsigned long flags; | ||
209 | u32 r; | ||
210 | |||
211 | spin_lock_irqsave(&adev->gc_cac_idx_lock, flags); | ||
212 | WREG32(mmGC_CAC_IND_INDEX, (reg)); | ||
213 | r = RREG32(mmGC_CAC_IND_DATA); | ||
214 | spin_unlock_irqrestore(&adev->gc_cac_idx_lock, flags); | ||
215 | return r; | ||
216 | } | ||
217 | |||
218 | static void vi_gc_cac_wreg(struct amdgpu_device *adev, u32 reg, u32 v) | ||
219 | { | ||
220 | unsigned long flags; | ||
221 | |||
222 | spin_lock_irqsave(&adev->gc_cac_idx_lock, flags); | ||
223 | WREG32(mmGC_CAC_IND_INDEX, (reg)); | ||
224 | WREG32(mmGC_CAC_IND_DATA, (v)); | ||
225 | spin_unlock_irqrestore(&adev->gc_cac_idx_lock, flags); | ||
226 | } | ||
227 | |||
228 | |||
206 | static const u32 tonga_mgcg_cgcg_init[] = | 229 | static const u32 tonga_mgcg_cgcg_init[] = |
207 | { | 230 | { |
208 | mmCGTT_DRM_CLK_CTRL0, 0xffffffff, 0x00600100, | 231 | mmCGTT_DRM_CLK_CTRL0, 0xffffffff, 0x00600100, |
@@ -1158,6 +1181,8 @@ static int vi_common_early_init(void *handle) | |||
1158 | adev->uvd_ctx_wreg = &vi_uvd_ctx_wreg; | 1181 | adev->uvd_ctx_wreg = &vi_uvd_ctx_wreg; |
1159 | adev->didt_rreg = &vi_didt_rreg; | 1182 | adev->didt_rreg = &vi_didt_rreg; |
1160 | adev->didt_wreg = &vi_didt_wreg; | 1183 | adev->didt_wreg = &vi_didt_wreg; |
1184 | adev->gc_cac_rreg = &vi_gc_cac_rreg; | ||
1185 | adev->gc_cac_wreg = &vi_gc_cac_wreg; | ||
1161 | 1186 | ||
1162 | adev->asic_funcs = &vi_asic_funcs; | 1187 | adev->asic_funcs = &vi_asic_funcs; |
1163 | 1188 | ||
diff --git a/drivers/gpu/drm/amd/include/cgs_common.h b/drivers/gpu/drm/amd/include/cgs_common.h index 4ea7f3dda2c0..0c8c85d2a2a5 100644 --- a/drivers/gpu/drm/amd/include/cgs_common.h +++ b/drivers/gpu/drm/amd/include/cgs_common.h | |||
@@ -49,6 +49,7 @@ enum cgs_ind_reg { | |||
49 | CGS_IND_REG__SMC, | 49 | CGS_IND_REG__SMC, |
50 | CGS_IND_REG__UVD_CTX, | 50 | CGS_IND_REG__UVD_CTX, |
51 | CGS_IND_REG__DIDT, | 51 | CGS_IND_REG__DIDT, |
52 | CGS_IND_REG_GC_CAC, | ||
52 | CGS_IND_REG__AUDIO_ENDPT | 53 | CGS_IND_REG__AUDIO_ENDPT |
53 | }; | 54 | }; |
54 | 55 | ||