mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-06-17 20:25:19 +00:00
drm/amdgpu: add read/write function for GC CAC programming
Create a GC_CAC_IND_INDEX/DATA pair of funcitons to program all the CAC registers Signed-off-by: Rex Zhu <Rex.Zhu@amd.com> Reviewed-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
5e037834eb
commit
ccdbb20a75
5 changed files with 40 additions and 0 deletions
|
@ -2018,6 +2018,10 @@ struct amdgpu_device {
|
||||||
spinlock_t didt_idx_lock;
|
spinlock_t didt_idx_lock;
|
||||||
amdgpu_rreg_t didt_rreg;
|
amdgpu_rreg_t didt_rreg;
|
||||||
amdgpu_wreg_t didt_wreg;
|
amdgpu_wreg_t didt_wreg;
|
||||||
|
/* protects concurrent gc_cac register access */
|
||||||
|
spinlock_t gc_cac_idx_lock;
|
||||||
|
amdgpu_rreg_t gc_cac_rreg;
|
||||||
|
amdgpu_wreg_t gc_cac_wreg;
|
||||||
/* protects concurrent ENDPOINT (audio) register access */
|
/* protects concurrent ENDPOINT (audio) register access */
|
||||||
spinlock_t audio_endpt_idx_lock;
|
spinlock_t audio_endpt_idx_lock;
|
||||||
amdgpu_block_rreg_t audio_endpt_rreg;
|
amdgpu_block_rreg_t audio_endpt_rreg;
|
||||||
|
@ -2147,6 +2151,8 @@ void amdgpu_mm_wdoorbell(struct amdgpu_device *adev, u32 index, u32 v);
|
||||||
#define WREG32_UVD_CTX(reg, v) adev->uvd_ctx_wreg(adev, (reg), (v))
|
#define WREG32_UVD_CTX(reg, v) adev->uvd_ctx_wreg(adev, (reg), (v))
|
||||||
#define RREG32_DIDT(reg) adev->didt_rreg(adev, (reg))
|
#define RREG32_DIDT(reg) adev->didt_rreg(adev, (reg))
|
||||||
#define WREG32_DIDT(reg, v) adev->didt_wreg(adev, (reg), (v))
|
#define WREG32_DIDT(reg, v) adev->didt_wreg(adev, (reg), (v))
|
||||||
|
#define RREG32_GC_CAC(reg) adev->gc_cac_rreg(adev, (reg))
|
||||||
|
#define WREG32_GC_CAC(reg, v) adev->gc_cac_wreg(adev, (reg), (v))
|
||||||
#define RREG32_AUDIO_ENDPT(block, reg) adev->audio_endpt_rreg(adev, (block), (reg))
|
#define RREG32_AUDIO_ENDPT(block, reg) adev->audio_endpt_rreg(adev, (block), (reg))
|
||||||
#define WREG32_AUDIO_ENDPT(block, reg, v) adev->audio_endpt_wreg(adev, (block), (reg), (v))
|
#define WREG32_AUDIO_ENDPT(block, reg, v) adev->audio_endpt_wreg(adev, (block), (reg), (v))
|
||||||
#define WREG32_P(reg, val, mask) \
|
#define WREG32_P(reg, val, mask) \
|
||||||
|
|
|
@ -312,6 +312,8 @@ static uint32_t amdgpu_cgs_read_ind_register(struct cgs_device *cgs_device,
|
||||||
return RREG32_UVD_CTX(index);
|
return RREG32_UVD_CTX(index);
|
||||||
case CGS_IND_REG__DIDT:
|
case CGS_IND_REG__DIDT:
|
||||||
return RREG32_DIDT(index);
|
return RREG32_DIDT(index);
|
||||||
|
case CGS_IND_REG_GC_CAC:
|
||||||
|
return RREG32_GC_CAC(index);
|
||||||
case CGS_IND_REG__AUDIO_ENDPT:
|
case CGS_IND_REG__AUDIO_ENDPT:
|
||||||
DRM_ERROR("audio endpt register access not implemented.\n");
|
DRM_ERROR("audio endpt register access not implemented.\n");
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -336,6 +338,8 @@ static void amdgpu_cgs_write_ind_register(struct cgs_device *cgs_device,
|
||||||
return WREG32_UVD_CTX(index, value);
|
return WREG32_UVD_CTX(index, value);
|
||||||
case CGS_IND_REG__DIDT:
|
case CGS_IND_REG__DIDT:
|
||||||
return WREG32_DIDT(index, value);
|
return WREG32_DIDT(index, value);
|
||||||
|
case CGS_IND_REG_GC_CAC:
|
||||||
|
return WREG32_GC_CAC(index, value);
|
||||||
case CGS_IND_REG__AUDIO_ENDPT:
|
case CGS_IND_REG__AUDIO_ENDPT:
|
||||||
DRM_ERROR("audio endpt register access not implemented.\n");
|
DRM_ERROR("audio endpt register access not implemented.\n");
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -1488,9 +1488,12 @@ int amdgpu_device_init(struct amdgpu_device *adev,
|
||||||
adev->uvd_ctx_wreg = &amdgpu_invalid_wreg;
|
adev->uvd_ctx_wreg = &amdgpu_invalid_wreg;
|
||||||
adev->didt_rreg = &amdgpu_invalid_rreg;
|
adev->didt_rreg = &amdgpu_invalid_rreg;
|
||||||
adev->didt_wreg = &amdgpu_invalid_wreg;
|
adev->didt_wreg = &amdgpu_invalid_wreg;
|
||||||
|
adev->gc_cac_rreg = &amdgpu_invalid_rreg;
|
||||||
|
adev->gc_cac_wreg = &amdgpu_invalid_wreg;
|
||||||
adev->audio_endpt_rreg = &amdgpu_block_invalid_rreg;
|
adev->audio_endpt_rreg = &amdgpu_block_invalid_rreg;
|
||||||
adev->audio_endpt_wreg = &amdgpu_block_invalid_wreg;
|
adev->audio_endpt_wreg = &amdgpu_block_invalid_wreg;
|
||||||
|
|
||||||
|
|
||||||
DRM_INFO("initializing kernel modesetting (%s 0x%04X:0x%04X 0x%04X:0x%04X 0x%02X).\n",
|
DRM_INFO("initializing kernel modesetting (%s 0x%04X:0x%04X 0x%04X:0x%04X 0x%02X).\n",
|
||||||
amdgpu_asic_name[adev->asic_type], pdev->vendor, pdev->device,
|
amdgpu_asic_name[adev->asic_type], pdev->vendor, pdev->device,
|
||||||
pdev->subsystem_vendor, pdev->subsystem_device, pdev->revision);
|
pdev->subsystem_vendor, pdev->subsystem_device, pdev->revision);
|
||||||
|
@ -1515,6 +1518,7 @@ int amdgpu_device_init(struct amdgpu_device *adev,
|
||||||
spin_lock_init(&adev->pcie_idx_lock);
|
spin_lock_init(&adev->pcie_idx_lock);
|
||||||
spin_lock_init(&adev->uvd_ctx_idx_lock);
|
spin_lock_init(&adev->uvd_ctx_idx_lock);
|
||||||
spin_lock_init(&adev->didt_idx_lock);
|
spin_lock_init(&adev->didt_idx_lock);
|
||||||
|
spin_lock_init(&adev->gc_cac_idx_lock);
|
||||||
spin_lock_init(&adev->audio_endpt_idx_lock);
|
spin_lock_init(&adev->audio_endpt_idx_lock);
|
||||||
|
|
||||||
adev->rmmio_base = pci_resource_start(adev->pdev, 5);
|
adev->rmmio_base = pci_resource_start(adev->pdev, 5);
|
||||||
|
|
|
@ -203,6 +203,29 @@ static void vi_didt_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
|
||||||
spin_unlock_irqrestore(&adev->didt_idx_lock, flags);
|
spin_unlock_irqrestore(&adev->didt_idx_lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static u32 vi_gc_cac_rreg(struct amdgpu_device *adev, u32 reg)
|
||||||
|
{
|
||||||
|
unsigned long flags;
|
||||||
|
u32 r;
|
||||||
|
|
||||||
|
spin_lock_irqsave(&adev->gc_cac_idx_lock, flags);
|
||||||
|
WREG32(mmGC_CAC_IND_INDEX, (reg));
|
||||||
|
r = RREG32(mmGC_CAC_IND_DATA);
|
||||||
|
spin_unlock_irqrestore(&adev->gc_cac_idx_lock, flags);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void vi_gc_cac_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
|
||||||
|
{
|
||||||
|
unsigned long flags;
|
||||||
|
|
||||||
|
spin_lock_irqsave(&adev->gc_cac_idx_lock, flags);
|
||||||
|
WREG32(mmGC_CAC_IND_INDEX, (reg));
|
||||||
|
WREG32(mmGC_CAC_IND_DATA, (v));
|
||||||
|
spin_unlock_irqrestore(&adev->gc_cac_idx_lock, flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static const u32 tonga_mgcg_cgcg_init[] =
|
static const u32 tonga_mgcg_cgcg_init[] =
|
||||||
{
|
{
|
||||||
mmCGTT_DRM_CLK_CTRL0, 0xffffffff, 0x00600100,
|
mmCGTT_DRM_CLK_CTRL0, 0xffffffff, 0x00600100,
|
||||||
|
@ -1158,6 +1181,8 @@ static int vi_common_early_init(void *handle)
|
||||||
adev->uvd_ctx_wreg = &vi_uvd_ctx_wreg;
|
adev->uvd_ctx_wreg = &vi_uvd_ctx_wreg;
|
||||||
adev->didt_rreg = &vi_didt_rreg;
|
adev->didt_rreg = &vi_didt_rreg;
|
||||||
adev->didt_wreg = &vi_didt_wreg;
|
adev->didt_wreg = &vi_didt_wreg;
|
||||||
|
adev->gc_cac_rreg = &vi_gc_cac_rreg;
|
||||||
|
adev->gc_cac_wreg = &vi_gc_cac_wreg;
|
||||||
|
|
||||||
adev->asic_funcs = &vi_asic_funcs;
|
adev->asic_funcs = &vi_asic_funcs;
|
||||||
|
|
||||||
|
|
|
@ -49,6 +49,7 @@ enum cgs_ind_reg {
|
||||||
CGS_IND_REG__SMC,
|
CGS_IND_REG__SMC,
|
||||||
CGS_IND_REG__UVD_CTX,
|
CGS_IND_REG__UVD_CTX,
|
||||||
CGS_IND_REG__DIDT,
|
CGS_IND_REG__DIDT,
|
||||||
|
CGS_IND_REG_GC_CAC,
|
||||||
CGS_IND_REG__AUDIO_ENDPT
|
CGS_IND_REG__AUDIO_ENDPT
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue