aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu.h6
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c4
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_device.c4
-rw-r--r--drivers/gpu/drm/amd/amdgpu/vi.c25
-rw-r--r--drivers/gpu/drm/amd/include/cgs_common.h1
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
206static 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
218static 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
206static const u32 tonga_mgcg_cgcg_init[] = 229static 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