|
@@ -2112,6 +2112,26 @@ struct radeon_device {
|
|
|
spinlock_t mmio_idx_lock;
|
|
|
/* protects concurrent SMC based register access */
|
|
|
spinlock_t smc_idx_lock;
|
|
|
+ /* protects concurrent PLL register access */
|
|
|
+ spinlock_t pll_idx_lock;
|
|
|
+ /* protects concurrent MC register access */
|
|
|
+ spinlock_t mc_idx_lock;
|
|
|
+ /* protects concurrent PCIE register access */
|
|
|
+ spinlock_t pcie_idx_lock;
|
|
|
+ /* protects concurrent PCIE_PORT register access */
|
|
|
+ spinlock_t pciep_idx_lock;
|
|
|
+ /* protects concurrent PIF register access */
|
|
|
+ spinlock_t pif_idx_lock;
|
|
|
+ /* protects concurrent CG register access */
|
|
|
+ spinlock_t cg_idx_lock;
|
|
|
+ /* protects concurrent UVD register access */
|
|
|
+ spinlock_t uvd_idx_lock;
|
|
|
+ /* protects concurrent RCU register access */
|
|
|
+ spinlock_t rcu_idx_lock;
|
|
|
+ /* protects concurrent DIDT register access */
|
|
|
+ spinlock_t didt_idx_lock;
|
|
|
+ /* protects concurrent ENDPOINT (audio) register access */
|
|
|
+ spinlock_t end_idx_lock;
|
|
|
void __iomem *rmmio;
|
|
|
radeon_rreg_t mc_rreg;
|
|
|
radeon_wreg_t mc_wreg;
|
|
@@ -2279,17 +2299,24 @@ void cik_mm_wdoorbell(struct radeon_device *rdev, u32 offset, u32 v);
|
|
|
*/
|
|
|
static inline uint32_t rv370_pcie_rreg(struct radeon_device *rdev, uint32_t reg)
|
|
|
{
|
|
|
+ unsigned long flags;
|
|
|
uint32_t r;
|
|
|
|
|
|
+ spin_lock_irqsave(&rdev->pcie_idx_lock, flags);
|
|
|
WREG32(RADEON_PCIE_INDEX, ((reg) & rdev->pcie_reg_mask));
|
|
|
r = RREG32(RADEON_PCIE_DATA);
|
|
|
+ spin_unlock_irqrestore(&rdev->pcie_idx_lock, flags);
|
|
|
return r;
|
|
|
}
|
|
|
|
|
|
static inline void rv370_pcie_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v)
|
|
|
{
|
|
|
+ unsigned long flags;
|
|
|
+
|
|
|
+ spin_lock_irqsave(&rdev->pcie_idx_lock, flags);
|
|
|
WREG32(RADEON_PCIE_INDEX, ((reg) & rdev->pcie_reg_mask));
|
|
|
WREG32(RADEON_PCIE_DATA, (v));
|
|
|
+ spin_unlock_irqrestore(&rdev->pcie_idx_lock, flags);
|
|
|
}
|
|
|
|
|
|
static inline u32 tn_smc_rreg(struct radeon_device *rdev, u32 reg)
|
|
@@ -2316,93 +2343,135 @@ static inline void tn_smc_wreg(struct radeon_device *rdev, u32 reg, u32 v)
|
|
|
|
|
|
static inline u32 r600_rcu_rreg(struct radeon_device *rdev, u32 reg)
|
|
|
{
|
|
|
+ unsigned long flags;
|
|
|
u32 r;
|
|
|
|
|
|
+ spin_lock_irqsave(&rdev->rcu_idx_lock, flags);
|
|
|
WREG32(R600_RCU_INDEX, ((reg) & 0x1fff));
|
|
|
r = RREG32(R600_RCU_DATA);
|
|
|
+ spin_unlock_irqrestore(&rdev->rcu_idx_lock, flags);
|
|
|
return r;
|
|
|
}
|
|
|
|
|
|
static inline void r600_rcu_wreg(struct radeon_device *rdev, u32 reg, u32 v)
|
|
|
{
|
|
|
+ unsigned long flags;
|
|
|
+
|
|
|
+ spin_lock_irqsave(&rdev->rcu_idx_lock, flags);
|
|
|
WREG32(R600_RCU_INDEX, ((reg) & 0x1fff));
|
|
|
WREG32(R600_RCU_DATA, (v));
|
|
|
+ spin_unlock_irqrestore(&rdev->rcu_idx_lock, flags);
|
|
|
}
|
|
|
|
|
|
static inline u32 eg_cg_rreg(struct radeon_device *rdev, u32 reg)
|
|
|
{
|
|
|
+ unsigned long flags;
|
|
|
u32 r;
|
|
|
|
|
|
+ spin_lock_irqsave(&rdev->cg_idx_lock, flags);
|
|
|
WREG32(EVERGREEN_CG_IND_ADDR, ((reg) & 0xffff));
|
|
|
r = RREG32(EVERGREEN_CG_IND_DATA);
|
|
|
+ spin_unlock_irqrestore(&rdev->cg_idx_lock, flags);
|
|
|
return r;
|
|
|
}
|
|
|
|
|
|
static inline void eg_cg_wreg(struct radeon_device *rdev, u32 reg, u32 v)
|
|
|
{
|
|
|
+ unsigned long flags;
|
|
|
+
|
|
|
+ spin_lock_irqsave(&rdev->cg_idx_lock, flags);
|
|
|
WREG32(EVERGREEN_CG_IND_ADDR, ((reg) & 0xffff));
|
|
|
WREG32(EVERGREEN_CG_IND_DATA, (v));
|
|
|
+ spin_unlock_irqrestore(&rdev->cg_idx_lock, flags);
|
|
|
}
|
|
|
|
|
|
static inline u32 eg_pif_phy0_rreg(struct radeon_device *rdev, u32 reg)
|
|
|
{
|
|
|
+ unsigned long flags;
|
|
|
u32 r;
|
|
|
|
|
|
+ spin_lock_irqsave(&rdev->pif_idx_lock, flags);
|
|
|
WREG32(EVERGREEN_PIF_PHY0_INDEX, ((reg) & 0xffff));
|
|
|
r = RREG32(EVERGREEN_PIF_PHY0_DATA);
|
|
|
+ spin_unlock_irqrestore(&rdev->pif_idx_lock, flags);
|
|
|
return r;
|
|
|
}
|
|
|
|
|
|
static inline void eg_pif_phy0_wreg(struct radeon_device *rdev, u32 reg, u32 v)
|
|
|
{
|
|
|
+ unsigned long flags;
|
|
|
+
|
|
|
+ spin_lock_irqsave(&rdev->pif_idx_lock, flags);
|
|
|
WREG32(EVERGREEN_PIF_PHY0_INDEX, ((reg) & 0xffff));
|
|
|
WREG32(EVERGREEN_PIF_PHY0_DATA, (v));
|
|
|
+ spin_unlock_irqrestore(&rdev->pif_idx_lock, flags);
|
|
|
}
|
|
|
|
|
|
static inline u32 eg_pif_phy1_rreg(struct radeon_device *rdev, u32 reg)
|
|
|
{
|
|
|
+ unsigned long flags;
|
|
|
u32 r;
|
|
|
|
|
|
+ spin_lock_irqsave(&rdev->pif_idx_lock, flags);
|
|
|
WREG32(EVERGREEN_PIF_PHY1_INDEX, ((reg) & 0xffff));
|
|
|
r = RREG32(EVERGREEN_PIF_PHY1_DATA);
|
|
|
+ spin_unlock_irqrestore(&rdev->pif_idx_lock, flags);
|
|
|
return r;
|
|
|
}
|
|
|
|
|
|
static inline void eg_pif_phy1_wreg(struct radeon_device *rdev, u32 reg, u32 v)
|
|
|
{
|
|
|
+ unsigned long flags;
|
|
|
+
|
|
|
+ spin_lock_irqsave(&rdev->pif_idx_lock, flags);
|
|
|
WREG32(EVERGREEN_PIF_PHY1_INDEX, ((reg) & 0xffff));
|
|
|
WREG32(EVERGREEN_PIF_PHY1_DATA, (v));
|
|
|
+ spin_unlock_irqrestore(&rdev->pif_idx_lock, flags);
|
|
|
}
|
|
|
|
|
|
static inline u32 r600_uvd_ctx_rreg(struct radeon_device *rdev, u32 reg)
|
|
|
{
|
|
|
+ unsigned long flags;
|
|
|
u32 r;
|
|
|
|
|
|
+ spin_lock_irqsave(&rdev->uvd_idx_lock, flags);
|
|
|
WREG32(R600_UVD_CTX_INDEX, ((reg) & 0x1ff));
|
|
|
r = RREG32(R600_UVD_CTX_DATA);
|
|
|
+ spin_unlock_irqrestore(&rdev->uvd_idx_lock, flags);
|
|
|
return r;
|
|
|
}
|
|
|
|
|
|
static inline void r600_uvd_ctx_wreg(struct radeon_device *rdev, u32 reg, u32 v)
|
|
|
{
|
|
|
+ unsigned long flags;
|
|
|
+
|
|
|
+ spin_lock_irqsave(&rdev->uvd_idx_lock, flags);
|
|
|
WREG32(R600_UVD_CTX_INDEX, ((reg) & 0x1ff));
|
|
|
WREG32(R600_UVD_CTX_DATA, (v));
|
|
|
+ spin_unlock_irqrestore(&rdev->uvd_idx_lock, flags);
|
|
|
}
|
|
|
|
|
|
|
|
|
static inline u32 cik_didt_rreg(struct radeon_device *rdev, u32 reg)
|
|
|
{
|
|
|
+ unsigned long flags;
|
|
|
u32 r;
|
|
|
|
|
|
+ spin_lock_irqsave(&rdev->didt_idx_lock, flags);
|
|
|
WREG32(CIK_DIDT_IND_INDEX, (reg));
|
|
|
r = RREG32(CIK_DIDT_IND_DATA);
|
|
|
+ spin_unlock_irqrestore(&rdev->didt_idx_lock, flags);
|
|
|
return r;
|
|
|
}
|
|
|
|
|
|
static inline void cik_didt_wreg(struct radeon_device *rdev, u32 reg, u32 v)
|
|
|
{
|
|
|
+ unsigned long flags;
|
|
|
+
|
|
|
+ spin_lock_irqsave(&rdev->didt_idx_lock, flags);
|
|
|
WREG32(CIK_DIDT_IND_INDEX, (reg));
|
|
|
WREG32(CIK_DIDT_IND_DATA, (v));
|
|
|
+ spin_unlock_irqrestore(&rdev->didt_idx_lock, flags);
|
|
|
}
|
|
|
|
|
|
void r100_pll_errata_after_index(struct radeon_device *rdev);
|