aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm
diff options
context:
space:
mode:
authorAlex Deucher <alexander.deucher@amd.com>2013-09-03 19:00:09 -0400
committerAlex Deucher <alexander.deucher@amd.com>2013-09-11 11:44:29 -0400
commit0a5b7b0bd97a212f5d8d28c5011b04a45dfb006e (patch)
treeac0d7f0e8a81cec0db2a1d4b9e19d4fe1ece0918 /drivers/gpu/drm
parentfe78118c4603ab91b88907eaabe4a1ca03a9f220 (diff)
drm/radeon: add spinlocks for indirect register accesss
This adds spinlocks to protect access to other indirect register apertures. These indirect spaces are used pretty infrequently and we haven't had an reported problems, but better safe than sorry. Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm')
-rw-r--r--drivers/gpu/drm/radeon/cik.c7
-rw-r--r--drivers/gpu/drm/radeon/dce6_afmt.c8
-rw-r--r--drivers/gpu/drm/radeon/r100.c7
-rw-r--r--drivers/gpu/drm/radeon/r420.c7
-rw-r--r--drivers/gpu/drm/radeon/r600.c14
-rw-r--r--drivers/gpu/drm/radeon/radeon.h69
-rw-r--r--drivers/gpu/drm/radeon/radeon_device.c10
-rw-r--r--drivers/gpu/drm/radeon/rs400.c7
-rw-r--r--drivers/gpu/drm/radeon/rs600.c12
-rw-r--r--drivers/gpu/drm/radeon/rs690.c7
-rw-r--r--drivers/gpu/drm/radeon/rv515.c8
11 files changed, 155 insertions, 1 deletions
diff --git a/drivers/gpu/drm/radeon/cik.c b/drivers/gpu/drm/radeon/cik.c
index 07aa13deaa15..e521d4c6676f 100644
--- a/drivers/gpu/drm/radeon/cik.c
+++ b/drivers/gpu/drm/radeon/cik.c
@@ -122,20 +122,27 @@ int kv_get_temp(struct radeon_device *rdev)
122 */ 122 */
123u32 cik_pciep_rreg(struct radeon_device *rdev, u32 reg) 123u32 cik_pciep_rreg(struct radeon_device *rdev, u32 reg)
124{ 124{
125 unsigned long flags;
125 u32 r; 126 u32 r;
126 127
128 spin_lock_irqsave(&rdev->pciep_idx_lock, flags);
127 WREG32(PCIE_INDEX, reg); 129 WREG32(PCIE_INDEX, reg);
128 (void)RREG32(PCIE_INDEX); 130 (void)RREG32(PCIE_INDEX);
129 r = RREG32(PCIE_DATA); 131 r = RREG32(PCIE_DATA);
132 spin_unlock_irqrestore(&rdev->pciep_idx_lock, flags);
130 return r; 133 return r;
131} 134}
132 135
133void cik_pciep_wreg(struct radeon_device *rdev, u32 reg, u32 v) 136void cik_pciep_wreg(struct radeon_device *rdev, u32 reg, u32 v)
134{ 137{
138 unsigned long flags;
139
140 spin_lock_irqsave(&rdev->pciep_idx_lock, flags);
135 WREG32(PCIE_INDEX, reg); 141 WREG32(PCIE_INDEX, reg);
136 (void)RREG32(PCIE_INDEX); 142 (void)RREG32(PCIE_INDEX);
137 WREG32(PCIE_DATA, v); 143 WREG32(PCIE_DATA, v);
138 (void)RREG32(PCIE_DATA); 144 (void)RREG32(PCIE_DATA);
145 spin_unlock_irqrestore(&rdev->pciep_idx_lock, flags);
139} 146}
140 147
141static const u32 spectre_rlc_save_restore_register_list[] = 148static const u32 spectre_rlc_save_restore_register_list[] =
diff --git a/drivers/gpu/drm/radeon/dce6_afmt.c b/drivers/gpu/drm/radeon/dce6_afmt.c
index 3853dda797dd..85a69d2ea3d2 100644
--- a/drivers/gpu/drm/radeon/dce6_afmt.c
+++ b/drivers/gpu/drm/radeon/dce6_afmt.c
@@ -28,22 +28,30 @@
28static u32 dce6_endpoint_rreg(struct radeon_device *rdev, 28static u32 dce6_endpoint_rreg(struct radeon_device *rdev,
29 u32 block_offset, u32 reg) 29 u32 block_offset, u32 reg)
30{ 30{
31 unsigned long flags;
31 u32 r; 32 u32 r;
32 33
34 spin_lock_irqsave(&rdev->end_idx_lock, flags);
33 WREG32(AZ_F0_CODEC_ENDPOINT_INDEX + block_offset, reg); 35 WREG32(AZ_F0_CODEC_ENDPOINT_INDEX + block_offset, reg);
34 r = RREG32(AZ_F0_CODEC_ENDPOINT_DATA + block_offset); 36 r = RREG32(AZ_F0_CODEC_ENDPOINT_DATA + block_offset);
37 spin_unlock_irqrestore(&rdev->end_idx_lock, flags);
38
35 return r; 39 return r;
36} 40}
37 41
38static void dce6_endpoint_wreg(struct radeon_device *rdev, 42static void dce6_endpoint_wreg(struct radeon_device *rdev,
39 u32 block_offset, u32 reg, u32 v) 43 u32 block_offset, u32 reg, u32 v)
40{ 44{
45 unsigned long flags;
46
47 spin_lock_irqsave(&rdev->end_idx_lock, flags);
41 if (ASIC_IS_DCE8(rdev)) 48 if (ASIC_IS_DCE8(rdev))
42 WREG32(AZ_F0_CODEC_ENDPOINT_INDEX + block_offset, reg); 49 WREG32(AZ_F0_CODEC_ENDPOINT_INDEX + block_offset, reg);
43 else 50 else
44 WREG32(AZ_F0_CODEC_ENDPOINT_INDEX + block_offset, 51 WREG32(AZ_F0_CODEC_ENDPOINT_INDEX + block_offset,
45 AZ_ENDPOINT_REG_WRITE_EN | AZ_ENDPOINT_REG_INDEX(reg)); 52 AZ_ENDPOINT_REG_WRITE_EN | AZ_ENDPOINT_REG_INDEX(reg));
46 WREG32(AZ_F0_CODEC_ENDPOINT_DATA + block_offset, v); 53 WREG32(AZ_F0_CODEC_ENDPOINT_DATA + block_offset, v);
54 spin_unlock_irqrestore(&rdev->end_idx_lock, flags);
47} 55}
48 56
49#define RREG32_ENDPOINT(block, reg) dce6_endpoint_rreg(rdev, (block), (reg)) 57#define RREG32_ENDPOINT(block, reg) dce6_endpoint_rreg(rdev, (block), (reg))
diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c
index 9fc61dd68bc0..24175717307b 100644
--- a/drivers/gpu/drm/radeon/r100.c
+++ b/drivers/gpu/drm/radeon/r100.c
@@ -2853,21 +2853,28 @@ static void r100_pll_errata_after_data(struct radeon_device *rdev)
2853 2853
2854uint32_t r100_pll_rreg(struct radeon_device *rdev, uint32_t reg) 2854uint32_t r100_pll_rreg(struct radeon_device *rdev, uint32_t reg)
2855{ 2855{
2856 unsigned long flags;
2856 uint32_t data; 2857 uint32_t data;
2857 2858
2859 spin_lock_irqsave(&rdev->pll_idx_lock, flags);
2858 WREG8(RADEON_CLOCK_CNTL_INDEX, reg & 0x3f); 2860 WREG8(RADEON_CLOCK_CNTL_INDEX, reg & 0x3f);
2859 r100_pll_errata_after_index(rdev); 2861 r100_pll_errata_after_index(rdev);
2860 data = RREG32(RADEON_CLOCK_CNTL_DATA); 2862 data = RREG32(RADEON_CLOCK_CNTL_DATA);
2861 r100_pll_errata_after_data(rdev); 2863 r100_pll_errata_after_data(rdev);
2864 spin_unlock_irqrestore(&rdev->pll_idx_lock, flags);
2862 return data; 2865 return data;
2863} 2866}
2864 2867
2865void r100_pll_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v) 2868void r100_pll_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v)
2866{ 2869{
2870 unsigned long flags;
2871
2872 spin_lock_irqsave(&rdev->pll_idx_lock, flags);
2867 WREG8(RADEON_CLOCK_CNTL_INDEX, ((reg & 0x3f) | RADEON_PLL_WR_EN)); 2873 WREG8(RADEON_CLOCK_CNTL_INDEX, ((reg & 0x3f) | RADEON_PLL_WR_EN));
2868 r100_pll_errata_after_index(rdev); 2874 r100_pll_errata_after_index(rdev);
2869 WREG32(RADEON_CLOCK_CNTL_DATA, v); 2875 WREG32(RADEON_CLOCK_CNTL_DATA, v);
2870 r100_pll_errata_after_data(rdev); 2876 r100_pll_errata_after_data(rdev);
2877 spin_unlock_irqrestore(&rdev->pll_idx_lock, flags);
2871} 2878}
2872 2879
2873static void r100_set_safe_registers(struct radeon_device *rdev) 2880static void r100_set_safe_registers(struct radeon_device *rdev)
diff --git a/drivers/gpu/drm/radeon/r420.c b/drivers/gpu/drm/radeon/r420.c
index 4e796ecf9ea4..6edf2b3a52b4 100644
--- a/drivers/gpu/drm/radeon/r420.c
+++ b/drivers/gpu/drm/radeon/r420.c
@@ -160,18 +160,25 @@ void r420_pipes_init(struct radeon_device *rdev)
160 160
161u32 r420_mc_rreg(struct radeon_device *rdev, u32 reg) 161u32 r420_mc_rreg(struct radeon_device *rdev, u32 reg)
162{ 162{
163 unsigned long flags;
163 u32 r; 164 u32 r;
164 165
166 spin_lock_irqsave(&rdev->mc_idx_lock, flags);
165 WREG32(R_0001F8_MC_IND_INDEX, S_0001F8_MC_IND_ADDR(reg)); 167 WREG32(R_0001F8_MC_IND_INDEX, S_0001F8_MC_IND_ADDR(reg));
166 r = RREG32(R_0001FC_MC_IND_DATA); 168 r = RREG32(R_0001FC_MC_IND_DATA);
169 spin_unlock_irqrestore(&rdev->mc_idx_lock, flags);
167 return r; 170 return r;
168} 171}
169 172
170void r420_mc_wreg(struct radeon_device *rdev, u32 reg, u32 v) 173void r420_mc_wreg(struct radeon_device *rdev, u32 reg, u32 v)
171{ 174{
175 unsigned long flags;
176
177 spin_lock_irqsave(&rdev->mc_idx_lock, flags);
172 WREG32(R_0001F8_MC_IND_INDEX, S_0001F8_MC_IND_ADDR(reg) | 178 WREG32(R_0001F8_MC_IND_INDEX, S_0001F8_MC_IND_ADDR(reg) |
173 S_0001F8_MC_IND_WR_EN(1)); 179 S_0001F8_MC_IND_WR_EN(1));
174 WREG32(R_0001FC_MC_IND_DATA, v); 180 WREG32(R_0001FC_MC_IND_DATA, v);
181 spin_unlock_irqrestore(&rdev->mc_idx_lock, flags);
175} 182}
176 183
177static void r420_debugfs(struct radeon_device *rdev) 184static void r420_debugfs(struct radeon_device *rdev)
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c
index ea4d3734e6d9..11cd99e3cbb5 100644
--- a/drivers/gpu/drm/radeon/r600.c
+++ b/drivers/gpu/drm/radeon/r600.c
@@ -1045,20 +1045,27 @@ int r600_mc_wait_for_idle(struct radeon_device *rdev)
1045 1045
1046uint32_t rs780_mc_rreg(struct radeon_device *rdev, uint32_t reg) 1046uint32_t rs780_mc_rreg(struct radeon_device *rdev, uint32_t reg)
1047{ 1047{
1048 unsigned long flags;
1048 uint32_t r; 1049 uint32_t r;
1049 1050
1051 spin_lock_irqsave(&rdev->mc_idx_lock, flags);
1050 WREG32(R_0028F8_MC_INDEX, S_0028F8_MC_IND_ADDR(reg)); 1052 WREG32(R_0028F8_MC_INDEX, S_0028F8_MC_IND_ADDR(reg));
1051 r = RREG32(R_0028FC_MC_DATA); 1053 r = RREG32(R_0028FC_MC_DATA);
1052 WREG32(R_0028F8_MC_INDEX, ~C_0028F8_MC_IND_ADDR); 1054 WREG32(R_0028F8_MC_INDEX, ~C_0028F8_MC_IND_ADDR);
1055 spin_unlock_irqrestore(&rdev->mc_idx_lock, flags);
1053 return r; 1056 return r;
1054} 1057}
1055 1058
1056void rs780_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v) 1059void rs780_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v)
1057{ 1060{
1061 unsigned long flags;
1062
1063 spin_lock_irqsave(&rdev->mc_idx_lock, flags);
1058 WREG32(R_0028F8_MC_INDEX, S_0028F8_MC_IND_ADDR(reg) | 1064 WREG32(R_0028F8_MC_INDEX, S_0028F8_MC_IND_ADDR(reg) |
1059 S_0028F8_MC_IND_WR_EN(1)); 1065 S_0028F8_MC_IND_WR_EN(1));
1060 WREG32(R_0028FC_MC_DATA, v); 1066 WREG32(R_0028FC_MC_DATA, v);
1061 WREG32(R_0028F8_MC_INDEX, 0x7F); 1067 WREG32(R_0028F8_MC_INDEX, 0x7F);
1068 spin_unlock_irqrestore(&rdev->mc_idx_lock, flags);
1062} 1069}
1063 1070
1064static void r600_mc_program(struct radeon_device *rdev) 1071static void r600_mc_program(struct radeon_device *rdev)
@@ -2092,20 +2099,27 @@ static void r600_gpu_init(struct radeon_device *rdev)
2092 */ 2099 */
2093u32 r600_pciep_rreg(struct radeon_device *rdev, u32 reg) 2100u32 r600_pciep_rreg(struct radeon_device *rdev, u32 reg)
2094{ 2101{
2102 unsigned long flags;
2095 u32 r; 2103 u32 r;
2096 2104
2105 spin_lock_irqsave(&rdev->pciep_idx_lock, flags);
2097 WREG32(PCIE_PORT_INDEX, ((reg) & 0xff)); 2106 WREG32(PCIE_PORT_INDEX, ((reg) & 0xff));
2098 (void)RREG32(PCIE_PORT_INDEX); 2107 (void)RREG32(PCIE_PORT_INDEX);
2099 r = RREG32(PCIE_PORT_DATA); 2108 r = RREG32(PCIE_PORT_DATA);
2109 spin_unlock_irqrestore(&rdev->pciep_idx_lock, flags);
2100 return r; 2110 return r;
2101} 2111}
2102 2112
2103void r600_pciep_wreg(struct radeon_device *rdev, u32 reg, u32 v) 2113void r600_pciep_wreg(struct radeon_device *rdev, u32 reg, u32 v)
2104{ 2114{
2115 unsigned long flags;
2116
2117 spin_lock_irqsave(&rdev->pciep_idx_lock, flags);
2105 WREG32(PCIE_PORT_INDEX, ((reg) & 0xff)); 2118 WREG32(PCIE_PORT_INDEX, ((reg) & 0xff));
2106 (void)RREG32(PCIE_PORT_INDEX); 2119 (void)RREG32(PCIE_PORT_INDEX);
2107 WREG32(PCIE_PORT_DATA, (v)); 2120 WREG32(PCIE_PORT_DATA, (v));
2108 (void)RREG32(PCIE_PORT_DATA); 2121 (void)RREG32(PCIE_PORT_DATA);
2122 spin_unlock_irqrestore(&rdev->pciep_idx_lock, flags);
2109} 2123}
2110 2124
2111/* 2125/*
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
index 6d6d099d9cb8..1cfcb1b27aaa 100644
--- a/drivers/gpu/drm/radeon/radeon.h
+++ b/drivers/gpu/drm/radeon/radeon.h
@@ -2112,6 +2112,26 @@ struct radeon_device {
2112 spinlock_t mmio_idx_lock; 2112 spinlock_t mmio_idx_lock;
2113 /* protects concurrent SMC based register access */ 2113 /* protects concurrent SMC based register access */
2114 spinlock_t smc_idx_lock; 2114 spinlock_t smc_idx_lock;
2115 /* protects concurrent PLL register access */
2116 spinlock_t pll_idx_lock;
2117 /* protects concurrent MC register access */
2118 spinlock_t mc_idx_lock;
2119 /* protects concurrent PCIE register access */
2120 spinlock_t pcie_idx_lock;
2121 /* protects concurrent PCIE_PORT register access */
2122 spinlock_t pciep_idx_lock;
2123 /* protects concurrent PIF register access */
2124 spinlock_t pif_idx_lock;
2125 /* protects concurrent CG register access */
2126 spinlock_t cg_idx_lock;
2127 /* protects concurrent UVD register access */
2128 spinlock_t uvd_idx_lock;
2129 /* protects concurrent RCU register access */
2130 spinlock_t rcu_idx_lock;
2131 /* protects concurrent DIDT register access */
2132 spinlock_t didt_idx_lock;
2133 /* protects concurrent ENDPOINT (audio) register access */
2134 spinlock_t end_idx_lock;
2115 void __iomem *rmmio; 2135 void __iomem *rmmio;
2116 radeon_rreg_t mc_rreg; 2136 radeon_rreg_t mc_rreg;
2117 radeon_wreg_t mc_wreg; 2137 radeon_wreg_t mc_wreg;
@@ -2279,17 +2299,24 @@ void cik_mm_wdoorbell(struct radeon_device *rdev, u32 offset, u32 v);
2279 */ 2299 */
2280static inline uint32_t rv370_pcie_rreg(struct radeon_device *rdev, uint32_t reg) 2300static inline uint32_t rv370_pcie_rreg(struct radeon_device *rdev, uint32_t reg)
2281{ 2301{
2302 unsigned long flags;
2282 uint32_t r; 2303 uint32_t r;
2283 2304
2305 spin_lock_irqsave(&rdev->pcie_idx_lock, flags);
2284 WREG32(RADEON_PCIE_INDEX, ((reg) & rdev->pcie_reg_mask)); 2306 WREG32(RADEON_PCIE_INDEX, ((reg) & rdev->pcie_reg_mask));
2285 r = RREG32(RADEON_PCIE_DATA); 2307 r = RREG32(RADEON_PCIE_DATA);
2308 spin_unlock_irqrestore(&rdev->pcie_idx_lock, flags);
2286 return r; 2309 return r;
2287} 2310}
2288 2311
2289static inline void rv370_pcie_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v) 2312static inline void rv370_pcie_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v)
2290{ 2313{
2314 unsigned long flags;
2315
2316 spin_lock_irqsave(&rdev->pcie_idx_lock, flags);
2291 WREG32(RADEON_PCIE_INDEX, ((reg) & rdev->pcie_reg_mask)); 2317 WREG32(RADEON_PCIE_INDEX, ((reg) & rdev->pcie_reg_mask));
2292 WREG32(RADEON_PCIE_DATA, (v)); 2318 WREG32(RADEON_PCIE_DATA, (v));
2319 spin_unlock_irqrestore(&rdev->pcie_idx_lock, flags);
2293} 2320}
2294 2321
2295static inline u32 tn_smc_rreg(struct radeon_device *rdev, u32 reg) 2322static 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)
2316 2343
2317static inline u32 r600_rcu_rreg(struct radeon_device *rdev, u32 reg) 2344static inline u32 r600_rcu_rreg(struct radeon_device *rdev, u32 reg)
2318{ 2345{
2346 unsigned long flags;
2319 u32 r; 2347 u32 r;
2320 2348
2349 spin_lock_irqsave(&rdev->rcu_idx_lock, flags);
2321 WREG32(R600_RCU_INDEX, ((reg) & 0x1fff)); 2350 WREG32(R600_RCU_INDEX, ((reg) & 0x1fff));
2322 r = RREG32(R600_RCU_DATA); 2351 r = RREG32(R600_RCU_DATA);
2352 spin_unlock_irqrestore(&rdev->rcu_idx_lock, flags);
2323 return r; 2353 return r;
2324} 2354}
2325 2355
2326static inline void r600_rcu_wreg(struct radeon_device *rdev, u32 reg, u32 v) 2356static inline void r600_rcu_wreg(struct radeon_device *rdev, u32 reg, u32 v)
2327{ 2357{
2358 unsigned long flags;
2359
2360 spin_lock_irqsave(&rdev->rcu_idx_lock, flags);
2328 WREG32(R600_RCU_INDEX, ((reg) & 0x1fff)); 2361 WREG32(R600_RCU_INDEX, ((reg) & 0x1fff));
2329 WREG32(R600_RCU_DATA, (v)); 2362 WREG32(R600_RCU_DATA, (v));
2363 spin_unlock_irqrestore(&rdev->rcu_idx_lock, flags);
2330} 2364}
2331 2365
2332static inline u32 eg_cg_rreg(struct radeon_device *rdev, u32 reg) 2366static inline u32 eg_cg_rreg(struct radeon_device *rdev, u32 reg)
2333{ 2367{
2368 unsigned long flags;
2334 u32 r; 2369 u32 r;
2335 2370
2371 spin_lock_irqsave(&rdev->cg_idx_lock, flags);
2336 WREG32(EVERGREEN_CG_IND_ADDR, ((reg) & 0xffff)); 2372 WREG32(EVERGREEN_CG_IND_ADDR, ((reg) & 0xffff));
2337 r = RREG32(EVERGREEN_CG_IND_DATA); 2373 r = RREG32(EVERGREEN_CG_IND_DATA);
2374 spin_unlock_irqrestore(&rdev->cg_idx_lock, flags);
2338 return r; 2375 return r;
2339} 2376}
2340 2377
2341static inline void eg_cg_wreg(struct radeon_device *rdev, u32 reg, u32 v) 2378static inline void eg_cg_wreg(struct radeon_device *rdev, u32 reg, u32 v)
2342{ 2379{
2380 unsigned long flags;
2381
2382 spin_lock_irqsave(&rdev->cg_idx_lock, flags);
2343 WREG32(EVERGREEN_CG_IND_ADDR, ((reg) & 0xffff)); 2383 WREG32(EVERGREEN_CG_IND_ADDR, ((reg) & 0xffff));
2344 WREG32(EVERGREEN_CG_IND_DATA, (v)); 2384 WREG32(EVERGREEN_CG_IND_DATA, (v));
2385 spin_unlock_irqrestore(&rdev->cg_idx_lock, flags);
2345} 2386}
2346 2387
2347static inline u32 eg_pif_phy0_rreg(struct radeon_device *rdev, u32 reg) 2388static inline u32 eg_pif_phy0_rreg(struct radeon_device *rdev, u32 reg)
2348{ 2389{
2390 unsigned long flags;
2349 u32 r; 2391 u32 r;
2350 2392
2393 spin_lock_irqsave(&rdev->pif_idx_lock, flags);
2351 WREG32(EVERGREEN_PIF_PHY0_INDEX, ((reg) & 0xffff)); 2394 WREG32(EVERGREEN_PIF_PHY0_INDEX, ((reg) & 0xffff));
2352 r = RREG32(EVERGREEN_PIF_PHY0_DATA); 2395 r = RREG32(EVERGREEN_PIF_PHY0_DATA);
2396 spin_unlock_irqrestore(&rdev->pif_idx_lock, flags);
2353 return r; 2397 return r;
2354} 2398}
2355 2399
2356static inline void eg_pif_phy0_wreg(struct radeon_device *rdev, u32 reg, u32 v) 2400static inline void eg_pif_phy0_wreg(struct radeon_device *rdev, u32 reg, u32 v)
2357{ 2401{
2402 unsigned long flags;
2403
2404 spin_lock_irqsave(&rdev->pif_idx_lock, flags);
2358 WREG32(EVERGREEN_PIF_PHY0_INDEX, ((reg) & 0xffff)); 2405 WREG32(EVERGREEN_PIF_PHY0_INDEX, ((reg) & 0xffff));
2359 WREG32(EVERGREEN_PIF_PHY0_DATA, (v)); 2406 WREG32(EVERGREEN_PIF_PHY0_DATA, (v));
2407 spin_unlock_irqrestore(&rdev->pif_idx_lock, flags);
2360} 2408}
2361 2409
2362static inline u32 eg_pif_phy1_rreg(struct radeon_device *rdev, u32 reg) 2410static inline u32 eg_pif_phy1_rreg(struct radeon_device *rdev, u32 reg)
2363{ 2411{
2412 unsigned long flags;
2364 u32 r; 2413 u32 r;
2365 2414
2415 spin_lock_irqsave(&rdev->pif_idx_lock, flags);
2366 WREG32(EVERGREEN_PIF_PHY1_INDEX, ((reg) & 0xffff)); 2416 WREG32(EVERGREEN_PIF_PHY1_INDEX, ((reg) & 0xffff));
2367 r = RREG32(EVERGREEN_PIF_PHY1_DATA); 2417 r = RREG32(EVERGREEN_PIF_PHY1_DATA);
2418 spin_unlock_irqrestore(&rdev->pif_idx_lock, flags);
2368 return r; 2419 return r;
2369} 2420}
2370 2421
2371static inline void eg_pif_phy1_wreg(struct radeon_device *rdev, u32 reg, u32 v) 2422static inline void eg_pif_phy1_wreg(struct radeon_device *rdev, u32 reg, u32 v)
2372{ 2423{
2424 unsigned long flags;
2425
2426 spin_lock_irqsave(&rdev->pif_idx_lock, flags);
2373 WREG32(EVERGREEN_PIF_PHY1_INDEX, ((reg) & 0xffff)); 2427 WREG32(EVERGREEN_PIF_PHY1_INDEX, ((reg) & 0xffff));
2374 WREG32(EVERGREEN_PIF_PHY1_DATA, (v)); 2428 WREG32(EVERGREEN_PIF_PHY1_DATA, (v));
2429 spin_unlock_irqrestore(&rdev->pif_idx_lock, flags);
2375} 2430}
2376 2431
2377static inline u32 r600_uvd_ctx_rreg(struct radeon_device *rdev, u32 reg) 2432static inline u32 r600_uvd_ctx_rreg(struct radeon_device *rdev, u32 reg)
2378{ 2433{
2434 unsigned long flags;
2379 u32 r; 2435 u32 r;
2380 2436
2437 spin_lock_irqsave(&rdev->uvd_idx_lock, flags);
2381 WREG32(R600_UVD_CTX_INDEX, ((reg) & 0x1ff)); 2438 WREG32(R600_UVD_CTX_INDEX, ((reg) & 0x1ff));
2382 r = RREG32(R600_UVD_CTX_DATA); 2439 r = RREG32(R600_UVD_CTX_DATA);
2440 spin_unlock_irqrestore(&rdev->uvd_idx_lock, flags);
2383 return r; 2441 return r;
2384} 2442}
2385 2443
2386static inline void r600_uvd_ctx_wreg(struct radeon_device *rdev, u32 reg, u32 v) 2444static inline void r600_uvd_ctx_wreg(struct radeon_device *rdev, u32 reg, u32 v)
2387{ 2445{
2446 unsigned long flags;
2447
2448 spin_lock_irqsave(&rdev->uvd_idx_lock, flags);
2388 WREG32(R600_UVD_CTX_INDEX, ((reg) & 0x1ff)); 2449 WREG32(R600_UVD_CTX_INDEX, ((reg) & 0x1ff));
2389 WREG32(R600_UVD_CTX_DATA, (v)); 2450 WREG32(R600_UVD_CTX_DATA, (v));
2451 spin_unlock_irqrestore(&rdev->uvd_idx_lock, flags);
2390} 2452}
2391 2453
2392 2454
2393static inline u32 cik_didt_rreg(struct radeon_device *rdev, u32 reg) 2455static inline u32 cik_didt_rreg(struct radeon_device *rdev, u32 reg)
2394{ 2456{
2457 unsigned long flags;
2395 u32 r; 2458 u32 r;
2396 2459
2460 spin_lock_irqsave(&rdev->didt_idx_lock, flags);
2397 WREG32(CIK_DIDT_IND_INDEX, (reg)); 2461 WREG32(CIK_DIDT_IND_INDEX, (reg));
2398 r = RREG32(CIK_DIDT_IND_DATA); 2462 r = RREG32(CIK_DIDT_IND_DATA);
2463 spin_unlock_irqrestore(&rdev->didt_idx_lock, flags);
2399 return r; 2464 return r;
2400} 2465}
2401 2466
2402static inline void cik_didt_wreg(struct radeon_device *rdev, u32 reg, u32 v) 2467static inline void cik_didt_wreg(struct radeon_device *rdev, u32 reg, u32 v)
2403{ 2468{
2469 unsigned long flags;
2470
2471 spin_lock_irqsave(&rdev->didt_idx_lock, flags);
2404 WREG32(CIK_DIDT_IND_INDEX, (reg)); 2472 WREG32(CIK_DIDT_IND_INDEX, (reg));
2405 WREG32(CIK_DIDT_IND_DATA, (v)); 2473 WREG32(CIK_DIDT_IND_DATA, (v));
2474 spin_unlock_irqrestore(&rdev->didt_idx_lock, flags);
2406} 2475}
2407 2476
2408void r100_pll_errata_after_index(struct radeon_device *rdev); 2477void r100_pll_errata_after_index(struct radeon_device *rdev);
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c
index b9032144c089..e29faa73b574 100644
--- a/drivers/gpu/drm/radeon/radeon_device.c
+++ b/drivers/gpu/drm/radeon/radeon_device.c
@@ -1250,6 +1250,16 @@ int radeon_device_init(struct radeon_device *rdev,
1250 /* TODO: block userspace mapping of io register */ 1250 /* TODO: block userspace mapping of io register */
1251 spin_lock_init(&rdev->mmio_idx_lock); 1251 spin_lock_init(&rdev->mmio_idx_lock);
1252 spin_lock_init(&rdev->smc_idx_lock); 1252 spin_lock_init(&rdev->smc_idx_lock);
1253 spin_lock_init(&rdev->pll_idx_lock);
1254 spin_lock_init(&rdev->mc_idx_lock);
1255 spin_lock_init(&rdev->pcie_idx_lock);
1256 spin_lock_init(&rdev->pciep_idx_lock);
1257 spin_lock_init(&rdev->pif_idx_lock);
1258 spin_lock_init(&rdev->cg_idx_lock);
1259 spin_lock_init(&rdev->uvd_idx_lock);
1260 spin_lock_init(&rdev->rcu_idx_lock);
1261 spin_lock_init(&rdev->didt_idx_lock);
1262 spin_lock_init(&rdev->end_idx_lock);
1253 if (rdev->family >= CHIP_BONAIRE) { 1263 if (rdev->family >= CHIP_BONAIRE) {
1254 rdev->rmmio_base = pci_resource_start(rdev->pdev, 5); 1264 rdev->rmmio_base = pci_resource_start(rdev->pdev, 5);
1255 rdev->rmmio_size = pci_resource_len(rdev->pdev, 5); 1265 rdev->rmmio_size = pci_resource_len(rdev->pdev, 5);
diff --git a/drivers/gpu/drm/radeon/rs400.c b/drivers/gpu/drm/radeon/rs400.c
index b8074a8ec75a..9566b5940a5a 100644
--- a/drivers/gpu/drm/radeon/rs400.c
+++ b/drivers/gpu/drm/radeon/rs400.c
@@ -274,19 +274,26 @@ static void rs400_mc_init(struct radeon_device *rdev)
274 274
275uint32_t rs400_mc_rreg(struct radeon_device *rdev, uint32_t reg) 275uint32_t rs400_mc_rreg(struct radeon_device *rdev, uint32_t reg)
276{ 276{
277 unsigned long flags;
277 uint32_t r; 278 uint32_t r;
278 279
280 spin_lock_irqsave(&rdev->mc_idx_lock, flags);
279 WREG32(RS480_NB_MC_INDEX, reg & 0xff); 281 WREG32(RS480_NB_MC_INDEX, reg & 0xff);
280 r = RREG32(RS480_NB_MC_DATA); 282 r = RREG32(RS480_NB_MC_DATA);
281 WREG32(RS480_NB_MC_INDEX, 0xff); 283 WREG32(RS480_NB_MC_INDEX, 0xff);
284 spin_unlock_irqrestore(&rdev->mc_idx_lock, flags);
282 return r; 285 return r;
283} 286}
284 287
285void rs400_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v) 288void rs400_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v)
286{ 289{
290 unsigned long flags;
291
292 spin_lock_irqsave(&rdev->mc_idx_lock, flags);
287 WREG32(RS480_NB_MC_INDEX, ((reg) & 0xff) | RS480_NB_MC_IND_WR_EN); 293 WREG32(RS480_NB_MC_INDEX, ((reg) & 0xff) | RS480_NB_MC_IND_WR_EN);
288 WREG32(RS480_NB_MC_DATA, (v)); 294 WREG32(RS480_NB_MC_DATA, (v));
289 WREG32(RS480_NB_MC_INDEX, 0xff); 295 WREG32(RS480_NB_MC_INDEX, 0xff);
296 spin_unlock_irqrestore(&rdev->mc_idx_lock, flags);
290} 297}
291 298
292#if defined(CONFIG_DEBUG_FS) 299#if defined(CONFIG_DEBUG_FS)
diff --git a/drivers/gpu/drm/radeon/rs600.c b/drivers/gpu/drm/radeon/rs600.c
index 670b555d2ca2..6acba8017b9a 100644
--- a/drivers/gpu/drm/radeon/rs600.c
+++ b/drivers/gpu/drm/radeon/rs600.c
@@ -847,16 +847,26 @@ void rs600_bandwidth_update(struct radeon_device *rdev)
847 847
848uint32_t rs600_mc_rreg(struct radeon_device *rdev, uint32_t reg) 848uint32_t rs600_mc_rreg(struct radeon_device *rdev, uint32_t reg)
849{ 849{
850 unsigned long flags;
851 u32 r;
852
853 spin_lock_irqsave(&rdev->mc_idx_lock, flags);
850 WREG32(R_000070_MC_IND_INDEX, S_000070_MC_IND_ADDR(reg) | 854 WREG32(R_000070_MC_IND_INDEX, S_000070_MC_IND_ADDR(reg) |
851 S_000070_MC_IND_CITF_ARB0(1)); 855 S_000070_MC_IND_CITF_ARB0(1));
852 return RREG32(R_000074_MC_IND_DATA); 856 r = RREG32(R_000074_MC_IND_DATA);
857 spin_unlock_irqrestore(&rdev->mc_idx_lock, flags);
858 return r;
853} 859}
854 860
855void rs600_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v) 861void rs600_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v)
856{ 862{
863 unsigned long flags;
864
865 spin_lock_irqsave(&rdev->mc_idx_lock, flags);
857 WREG32(R_000070_MC_IND_INDEX, S_000070_MC_IND_ADDR(reg) | 866 WREG32(R_000070_MC_IND_INDEX, S_000070_MC_IND_ADDR(reg) |
858 S_000070_MC_IND_CITF_ARB0(1) | S_000070_MC_IND_WR_EN(1)); 867 S_000070_MC_IND_CITF_ARB0(1) | S_000070_MC_IND_WR_EN(1));
859 WREG32(R_000074_MC_IND_DATA, v); 868 WREG32(R_000074_MC_IND_DATA, v);
869 spin_unlock_irqrestore(&rdev->mc_idx_lock, flags);
860} 870}
861 871
862static void rs600_debugfs(struct radeon_device *rdev) 872static void rs600_debugfs(struct radeon_device *rdev)
diff --git a/drivers/gpu/drm/radeon/rs690.c b/drivers/gpu/drm/radeon/rs690.c
index d8ddfb34545d..1447d794c22a 100644
--- a/drivers/gpu/drm/radeon/rs690.c
+++ b/drivers/gpu/drm/radeon/rs690.c
@@ -631,20 +631,27 @@ void rs690_bandwidth_update(struct radeon_device *rdev)
631 631
632uint32_t rs690_mc_rreg(struct radeon_device *rdev, uint32_t reg) 632uint32_t rs690_mc_rreg(struct radeon_device *rdev, uint32_t reg)
633{ 633{
634 unsigned long flags;
634 uint32_t r; 635 uint32_t r;
635 636
637 spin_lock_irqsave(&rdev->mc_idx_lock, flags);
636 WREG32(R_000078_MC_INDEX, S_000078_MC_IND_ADDR(reg)); 638 WREG32(R_000078_MC_INDEX, S_000078_MC_IND_ADDR(reg));
637 r = RREG32(R_00007C_MC_DATA); 639 r = RREG32(R_00007C_MC_DATA);
638 WREG32(R_000078_MC_INDEX, ~C_000078_MC_IND_ADDR); 640 WREG32(R_000078_MC_INDEX, ~C_000078_MC_IND_ADDR);
641 spin_unlock_irqrestore(&rdev->mc_idx_lock, flags);
639 return r; 642 return r;
640} 643}
641 644
642void rs690_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v) 645void rs690_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v)
643{ 646{
647 unsigned long flags;
648
649 spin_lock_irqsave(&rdev->mc_idx_lock, flags);
644 WREG32(R_000078_MC_INDEX, S_000078_MC_IND_ADDR(reg) | 650 WREG32(R_000078_MC_INDEX, S_000078_MC_IND_ADDR(reg) |
645 S_000078_MC_IND_WR_EN(1)); 651 S_000078_MC_IND_WR_EN(1));
646 WREG32(R_00007C_MC_DATA, v); 652 WREG32(R_00007C_MC_DATA, v);
647 WREG32(R_000078_MC_INDEX, 0x7F); 653 WREG32(R_000078_MC_INDEX, 0x7F);
654 spin_unlock_irqrestore(&rdev->mc_idx_lock, flags);
648} 655}
649 656
650static void rs690_mc_program(struct radeon_device *rdev) 657static void rs690_mc_program(struct radeon_device *rdev)
diff --git a/drivers/gpu/drm/radeon/rv515.c b/drivers/gpu/drm/radeon/rv515.c
index 8ea1573ae820..873eb4b193b4 100644
--- a/drivers/gpu/drm/radeon/rv515.c
+++ b/drivers/gpu/drm/radeon/rv515.c
@@ -209,19 +209,27 @@ static void rv515_mc_init(struct radeon_device *rdev)
209 209
210uint32_t rv515_mc_rreg(struct radeon_device *rdev, uint32_t reg) 210uint32_t rv515_mc_rreg(struct radeon_device *rdev, uint32_t reg)
211{ 211{
212 unsigned long flags;
212 uint32_t r; 213 uint32_t r;
213 214
215 spin_lock_irqsave(&rdev->mc_idx_lock, flags);
214 WREG32(MC_IND_INDEX, 0x7f0000 | (reg & 0xffff)); 216 WREG32(MC_IND_INDEX, 0x7f0000 | (reg & 0xffff));
215 r = RREG32(MC_IND_DATA); 217 r = RREG32(MC_IND_DATA);
216 WREG32(MC_IND_INDEX, 0); 218 WREG32(MC_IND_INDEX, 0);
219 spin_unlock_irqrestore(&rdev->mc_idx_lock, flags);
220
217 return r; 221 return r;
218} 222}
219 223
220void rv515_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v) 224void rv515_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v)
221{ 225{
226 unsigned long flags;
227
228 spin_lock_irqsave(&rdev->mc_idx_lock, flags);
222 WREG32(MC_IND_INDEX, 0xff0000 | ((reg) & 0xffff)); 229 WREG32(MC_IND_INDEX, 0xff0000 | ((reg) & 0xffff));
223 WREG32(MC_IND_DATA, (v)); 230 WREG32(MC_IND_DATA, (v));
224 WREG32(MC_IND_INDEX, 0); 231 WREG32(MC_IND_INDEX, 0);
232 spin_unlock_irqrestore(&rdev->mc_idx_lock, flags);
225} 233}
226 234
227#if defined(CONFIG_DEBUG_FS) 235#if defined(CONFIG_DEBUG_FS)