Rev 2005 | Rev 3120 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2005 | Rev 2997 | ||
---|---|---|---|
Line 31... | Line 31... | ||
31 | #include |
31 | #include |
32 | #include |
32 | #include |
33 | #include "radeon_reg.h" |
33 | #include "radeon_reg.h" |
34 | #include "radeon.h" |
34 | #include "radeon.h" |
35 | #include "radeon_asic.h" |
35 | #include "radeon_asic.h" |
36 | #include "radeon_drm.h" |
36 | #include |
Line 37... | Line 37... | ||
37 | 37 | ||
38 | #include "r300d.h" |
38 | #include "r300d.h" |
39 | #include "rv350d.h" |
39 | #include "rv350d.h" |
Line 72... | Line 72... | ||
72 | #define R300_PTE_WRITEABLE (1 << 2) |
72 | #define R300_PTE_WRITEABLE (1 << 2) |
73 | #define R300_PTE_READABLE (1 << 3) |
73 | #define R300_PTE_READABLE (1 << 3) |
Line 74... | Line 74... | ||
74 | 74 | ||
75 | int rv370_pcie_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr) |
75 | int rv370_pcie_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr) |
76 | { |
76 | { |
Line 77... | Line 77... | ||
77 | void __iomem *ptr = (void *)rdev->gart.table.vram.ptr; |
77 | void __iomem *ptr = rdev->gart.ptr; |
78 | 78 | ||
79 | if (i < 0 || i > rdev->gart.num_gpu_pages) { |
79 | if (i < 0 || i > rdev->gart.num_gpu_pages) { |
80 | return -EINVAL; |
80 | return -EINVAL; |
Line 91... | Line 91... | ||
91 | 91 | ||
92 | int rv370_pcie_gart_init(struct radeon_device *rdev) |
92 | int rv370_pcie_gart_init(struct radeon_device *rdev) |
93 | { |
93 | { |
Line 94... | Line 94... | ||
94 | int r; |
94 | int r; |
95 | 95 | ||
96 | if (rdev->gart.table.vram.robj) { |
96 | if (rdev->gart.robj) { |
97 | WARN(1, "RV370 PCIE GART already initialized\n"); |
97 | WARN(1, "RV370 PCIE GART already initialized\n"); |
98 | return 0; |
98 | return 0; |
99 | } |
99 | } |
Line 103... | Line 103... | ||
103 | return r; |
103 | return r; |
104 | r = rv370_debugfs_pcie_gart_info_init(rdev); |
104 | r = rv370_debugfs_pcie_gart_info_init(rdev); |
105 | if (r) |
105 | if (r) |
106 | DRM_ERROR("Failed to register debugfs file for PCIE gart !\n"); |
106 | DRM_ERROR("Failed to register debugfs file for PCIE gart !\n"); |
107 | rdev->gart.table_size = rdev->gart.num_gpu_pages * 4; |
107 | rdev->gart.table_size = rdev->gart.num_gpu_pages * 4; |
108 | rdev->asic->gart_tlb_flush = &rv370_pcie_gart_tlb_flush; |
108 | rdev->asic->gart.tlb_flush = &rv370_pcie_gart_tlb_flush; |
109 | rdev->asic->gart_set_page = &rv370_pcie_gart_set_page; |
109 | rdev->asic->gart.set_page = &rv370_pcie_gart_set_page; |
110 | return radeon_gart_table_vram_alloc(rdev); |
110 | return radeon_gart_table_vram_alloc(rdev); |
111 | } |
111 | } |
Line 112... | Line 112... | ||
112 | 112 | ||
113 | int rv370_pcie_gart_enable(struct radeon_device *rdev) |
113 | int rv370_pcie_gart_enable(struct radeon_device *rdev) |
114 | { |
114 | { |
115 | uint32_t table_addr; |
115 | uint32_t table_addr; |
116 | uint32_t tmp; |
116 | uint32_t tmp; |
Line 117... | Line 117... | ||
117 | int r; |
117 | int r; |
118 | 118 | ||
119 | if (rdev->gart.table.vram.robj == NULL) { |
119 | if (rdev->gart.robj == NULL) { |
120 | dev_err(rdev->dev, "No VRAM object for PCIE GART.\n"); |
120 | dev_err(rdev->dev, "No VRAM object for PCIE GART.\n"); |
121 | return -EINVAL; |
121 | return -EINVAL; |
122 | } |
122 | } |
Line 142... | Line 142... | ||
142 | tmp = RREG32_PCIE(RADEON_PCIE_TX_GART_CNTL); |
142 | tmp = RREG32_PCIE(RADEON_PCIE_TX_GART_CNTL); |
143 | tmp |= RADEON_PCIE_TX_GART_EN; |
143 | tmp |= RADEON_PCIE_TX_GART_EN; |
144 | tmp |= RADEON_PCIE_TX_GART_UNMAPPED_ACCESS_DISCARD; |
144 | tmp |= RADEON_PCIE_TX_GART_UNMAPPED_ACCESS_DISCARD; |
145 | WREG32_PCIE(RADEON_PCIE_TX_GART_CNTL, tmp); |
145 | WREG32_PCIE(RADEON_PCIE_TX_GART_CNTL, tmp); |
146 | rv370_pcie_gart_tlb_flush(rdev); |
146 | rv370_pcie_gart_tlb_flush(rdev); |
147 | DRM_INFO("PCIE GART of %uM enabled (table at 0x%08X).\n", |
147 | DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n", |
148 | (unsigned)(rdev->mc.gtt_size >> 20), table_addr); |
148 | (unsigned)(rdev->mc.gtt_size >> 20), |
- | 149 | (unsigned long long)table_addr); |
|
149 | rdev->gart.ready = true; |
150 | rdev->gart.ready = true; |
150 | return 0; |
151 | return 0; |
151 | } |
152 | } |
Line 152... | Line 153... | ||
152 | 153 | ||
153 | void rv370_pcie_gart_disable(struct radeon_device *rdev) |
154 | void rv370_pcie_gart_disable(struct radeon_device *rdev) |
154 | { |
155 | { |
155 | u32 tmp; |
- | |
Line 156... | Line 156... | ||
156 | int r; |
156 | u32 tmp; |
157 | 157 | ||
158 | WREG32_PCIE(RADEON_PCIE_TX_GART_START_LO, 0); |
158 | WREG32_PCIE(RADEON_PCIE_TX_GART_START_LO, 0); |
159 | WREG32_PCIE(RADEON_PCIE_TX_GART_END_LO, 0); |
159 | WREG32_PCIE(RADEON_PCIE_TX_GART_END_LO, 0); |
160 | WREG32_PCIE(RADEON_PCIE_TX_GART_START_HI, 0); |
160 | WREG32_PCIE(RADEON_PCIE_TX_GART_START_HI, 0); |
161 | WREG32_PCIE(RADEON_PCIE_TX_GART_END_HI, 0); |
161 | WREG32_PCIE(RADEON_PCIE_TX_GART_END_HI, 0); |
162 | tmp = RREG32_PCIE(RADEON_PCIE_TX_GART_CNTL); |
162 | tmp = RREG32_PCIE(RADEON_PCIE_TX_GART_CNTL); |
163 | tmp |= RADEON_PCIE_TX_GART_UNMAPPED_ACCESS_DISCARD; |
163 | tmp |= RADEON_PCIE_TX_GART_UNMAPPED_ACCESS_DISCARD; |
164 | WREG32_PCIE(RADEON_PCIE_TX_GART_CNTL, tmp & ~RADEON_PCIE_TX_GART_EN); |
- | |
165 | if (rdev->gart.table.vram.robj) { |
- | |
166 | r = radeon_bo_reserve(rdev->gart.table.vram.robj, false); |
- | |
167 | if (likely(r == 0)) { |
- | |
168 | radeon_bo_kunmap(rdev->gart.table.vram.robj); |
- | |
169 | radeon_bo_unpin(rdev->gart.table.vram.robj); |
- | |
170 | radeon_bo_unreserve(rdev->gart.table.vram.robj); |
- | |
171 | } |
164 | WREG32_PCIE(RADEON_PCIE_TX_GART_CNTL, tmp & ~RADEON_PCIE_TX_GART_EN); |
Line 172... | Line 165... | ||
172 | } |
165 | radeon_gart_table_vram_unpin(rdev); |
173 | } |
166 | } |
174 | 167 | ||
Line 180... | Line 173... | ||
180 | } |
173 | } |
Line 181... | Line 174... | ||
181 | 174 | ||
182 | void r300_fence_ring_emit(struct radeon_device *rdev, |
175 | void r300_fence_ring_emit(struct radeon_device *rdev, |
183 | struct radeon_fence *fence) |
176 | struct radeon_fence *fence) |
- | 177 | { |
|
- | 178 | struct radeon_ring *ring = &rdev->ring[fence->ring]; |
|
184 | { |
179 | |
185 | /* Who ever call radeon_fence_emit should call ring_lock and ask |
180 | /* Who ever call radeon_fence_emit should call ring_lock and ask |
186 | * for enough space (today caller are ib schedule and buffer move) */ |
181 | * for enough space (today caller are ib schedule and buffer move) */ |
187 | /* Write SC register so SC & US assert idle */ |
182 | /* Write SC register so SC & US assert idle */ |
188 | radeon_ring_write(rdev, PACKET0(R300_RE_SCISSORS_TL, 0)); |
183 | radeon_ring_write(ring, PACKET0(R300_RE_SCISSORS_TL, 0)); |
189 | radeon_ring_write(rdev, 0); |
184 | radeon_ring_write(ring, 0); |
190 | radeon_ring_write(rdev, PACKET0(R300_RE_SCISSORS_BR, 0)); |
185 | radeon_ring_write(ring, PACKET0(R300_RE_SCISSORS_BR, 0)); |
191 | radeon_ring_write(rdev, 0); |
186 | radeon_ring_write(ring, 0); |
192 | /* Flush 3D cache */ |
187 | /* Flush 3D cache */ |
193 | radeon_ring_write(rdev, PACKET0(R300_RB3D_DSTCACHE_CTLSTAT, 0)); |
188 | radeon_ring_write(ring, PACKET0(R300_RB3D_DSTCACHE_CTLSTAT, 0)); |
194 | radeon_ring_write(rdev, R300_RB3D_DC_FLUSH); |
189 | radeon_ring_write(ring, R300_RB3D_DC_FLUSH); |
195 | radeon_ring_write(rdev, PACKET0(R300_RB3D_ZCACHE_CTLSTAT, 0)); |
190 | radeon_ring_write(ring, PACKET0(R300_RB3D_ZCACHE_CTLSTAT, 0)); |
196 | radeon_ring_write(rdev, R300_ZC_FLUSH); |
191 | radeon_ring_write(ring, R300_ZC_FLUSH); |
197 | /* Wait until IDLE & CLEAN */ |
192 | /* Wait until IDLE & CLEAN */ |
198 | radeon_ring_write(rdev, PACKET0(RADEON_WAIT_UNTIL, 0)); |
193 | radeon_ring_write(ring, PACKET0(RADEON_WAIT_UNTIL, 0)); |
199 | radeon_ring_write(rdev, (RADEON_WAIT_3D_IDLECLEAN | |
194 | radeon_ring_write(ring, (RADEON_WAIT_3D_IDLECLEAN | |
200 | RADEON_WAIT_2D_IDLECLEAN | |
195 | RADEON_WAIT_2D_IDLECLEAN | |
201 | RADEON_WAIT_DMA_GUI_IDLE)); |
196 | RADEON_WAIT_DMA_GUI_IDLE)); |
202 | radeon_ring_write(rdev, PACKET0(RADEON_HOST_PATH_CNTL, 0)); |
197 | radeon_ring_write(ring, PACKET0(RADEON_HOST_PATH_CNTL, 0)); |
203 | radeon_ring_write(rdev, rdev->config.r300.hdp_cntl | |
198 | radeon_ring_write(ring, rdev->config.r300.hdp_cntl | |
204 | RADEON_HDP_READ_BUFFER_INVALIDATE); |
199 | RADEON_HDP_READ_BUFFER_INVALIDATE); |
205 | radeon_ring_write(rdev, PACKET0(RADEON_HOST_PATH_CNTL, 0)); |
200 | radeon_ring_write(ring, PACKET0(RADEON_HOST_PATH_CNTL, 0)); |
206 | radeon_ring_write(rdev, rdev->config.r300.hdp_cntl); |
201 | radeon_ring_write(ring, rdev->config.r300.hdp_cntl); |
207 | /* Emit fence sequence & fire IRQ */ |
202 | /* Emit fence sequence & fire IRQ */ |
208 | radeon_ring_write(rdev, PACKET0(rdev->fence_drv.scratch_reg, 0)); |
203 | radeon_ring_write(ring, PACKET0(rdev->fence_drv[fence->ring].scratch_reg, 0)); |
209 | radeon_ring_write(rdev, fence->seq); |
204 | radeon_ring_write(ring, fence->seq); |
210 | radeon_ring_write(rdev, PACKET0(RADEON_GEN_INT_STATUS, 0)); |
205 | radeon_ring_write(ring, PACKET0(RADEON_GEN_INT_STATUS, 0)); |
211 | radeon_ring_write(rdev, RADEON_SW_INT_FIRE); |
206 | radeon_ring_write(ring, RADEON_SW_INT_FIRE); |
Line 212... | Line 207... | ||
212 | } |
207 | } |
213 | 208 | ||
214 | void r300_ring_start(struct radeon_device *rdev) |
209 | void r300_ring_start(struct radeon_device *rdev, struct radeon_ring *ring) |
215 | { |
210 | { |
Line 216... | Line 211... | ||
216 | unsigned gb_tile_config; |
211 | unsigned gb_tile_config; |
Line 232... | Line 227... | ||
232 | default: |
227 | default: |
233 | gb_tile_config |= R300_PIPE_COUNT_RV350; |
228 | gb_tile_config |= R300_PIPE_COUNT_RV350; |
234 | break; |
229 | break; |
235 | } |
230 | } |
Line 236... | Line 231... | ||
236 | 231 | ||
237 | r = radeon_ring_lock(rdev, 64); |
232 | r = radeon_ring_lock(rdev, ring, 64); |
238 | if (r) { |
233 | if (r) { |
239 | return; |
234 | return; |
240 | } |
235 | } |
241 | radeon_ring_write(rdev, PACKET0(RADEON_ISYNC_CNTL, 0)); |
236 | radeon_ring_write(ring, PACKET0(RADEON_ISYNC_CNTL, 0)); |
242 | radeon_ring_write(rdev, |
237 | radeon_ring_write(ring, |
243 | RADEON_ISYNC_ANY2D_IDLE3D | |
238 | RADEON_ISYNC_ANY2D_IDLE3D | |
244 | RADEON_ISYNC_ANY3D_IDLE2D | |
239 | RADEON_ISYNC_ANY3D_IDLE2D | |
245 | RADEON_ISYNC_WAIT_IDLEGUI | |
240 | RADEON_ISYNC_WAIT_IDLEGUI | |
246 | RADEON_ISYNC_CPSCRATCH_IDLEGUI); |
241 | RADEON_ISYNC_CPSCRATCH_IDLEGUI); |
247 | radeon_ring_write(rdev, PACKET0(R300_GB_TILE_CONFIG, 0)); |
242 | radeon_ring_write(ring, PACKET0(R300_GB_TILE_CONFIG, 0)); |
248 | radeon_ring_write(rdev, gb_tile_config); |
243 | radeon_ring_write(ring, gb_tile_config); |
249 | radeon_ring_write(rdev, PACKET0(RADEON_WAIT_UNTIL, 0)); |
244 | radeon_ring_write(ring, PACKET0(RADEON_WAIT_UNTIL, 0)); |
250 | radeon_ring_write(rdev, |
245 | radeon_ring_write(ring, |
251 | RADEON_WAIT_2D_IDLECLEAN | |
246 | RADEON_WAIT_2D_IDLECLEAN | |
252 | RADEON_WAIT_3D_IDLECLEAN); |
247 | RADEON_WAIT_3D_IDLECLEAN); |
253 | radeon_ring_write(rdev, PACKET0(R300_DST_PIPE_CONFIG, 0)); |
248 | radeon_ring_write(ring, PACKET0(R300_DST_PIPE_CONFIG, 0)); |
254 | radeon_ring_write(rdev, R300_PIPE_AUTO_CONFIG); |
249 | radeon_ring_write(ring, R300_PIPE_AUTO_CONFIG); |
255 | radeon_ring_write(rdev, PACKET0(R300_GB_SELECT, 0)); |
250 | radeon_ring_write(ring, PACKET0(R300_GB_SELECT, 0)); |
256 | radeon_ring_write(rdev, 0); |
251 | radeon_ring_write(ring, 0); |
257 | radeon_ring_write(rdev, PACKET0(R300_GB_ENABLE, 0)); |
252 | radeon_ring_write(ring, PACKET0(R300_GB_ENABLE, 0)); |
258 | radeon_ring_write(rdev, 0); |
253 | radeon_ring_write(ring, 0); |
259 | radeon_ring_write(rdev, PACKET0(R300_RB3D_DSTCACHE_CTLSTAT, 0)); |
254 | radeon_ring_write(ring, PACKET0(R300_RB3D_DSTCACHE_CTLSTAT, 0)); |
260 | radeon_ring_write(rdev, R300_RB3D_DC_FLUSH | R300_RB3D_DC_FREE); |
255 | radeon_ring_write(ring, R300_RB3D_DC_FLUSH | R300_RB3D_DC_FREE); |
261 | radeon_ring_write(rdev, PACKET0(R300_RB3D_ZCACHE_CTLSTAT, 0)); |
256 | radeon_ring_write(ring, PACKET0(R300_RB3D_ZCACHE_CTLSTAT, 0)); |
262 | radeon_ring_write(rdev, R300_ZC_FLUSH | R300_ZC_FREE); |
257 | radeon_ring_write(ring, R300_ZC_FLUSH | R300_ZC_FREE); |
263 | radeon_ring_write(rdev, PACKET0(RADEON_WAIT_UNTIL, 0)); |
258 | radeon_ring_write(ring, PACKET0(RADEON_WAIT_UNTIL, 0)); |
264 | radeon_ring_write(rdev, |
259 | radeon_ring_write(ring, |
265 | RADEON_WAIT_2D_IDLECLEAN | |
260 | RADEON_WAIT_2D_IDLECLEAN | |
266 | RADEON_WAIT_3D_IDLECLEAN); |
261 | RADEON_WAIT_3D_IDLECLEAN); |
267 | radeon_ring_write(rdev, PACKET0(R300_GB_AA_CONFIG, 0)); |
262 | radeon_ring_write(ring, PACKET0(R300_GB_AA_CONFIG, 0)); |
268 | radeon_ring_write(rdev, 0); |
263 | radeon_ring_write(ring, 0); |
269 | radeon_ring_write(rdev, PACKET0(R300_RB3D_DSTCACHE_CTLSTAT, 0)); |
264 | radeon_ring_write(ring, PACKET0(R300_RB3D_DSTCACHE_CTLSTAT, 0)); |
270 | radeon_ring_write(rdev, R300_RB3D_DC_FLUSH | R300_RB3D_DC_FREE); |
265 | radeon_ring_write(ring, R300_RB3D_DC_FLUSH | R300_RB3D_DC_FREE); |
271 | radeon_ring_write(rdev, PACKET0(R300_RB3D_ZCACHE_CTLSTAT, 0)); |
266 | radeon_ring_write(ring, PACKET0(R300_RB3D_ZCACHE_CTLSTAT, 0)); |
272 | radeon_ring_write(rdev, R300_ZC_FLUSH | R300_ZC_FREE); |
267 | radeon_ring_write(ring, R300_ZC_FLUSH | R300_ZC_FREE); |
273 | radeon_ring_write(rdev, PACKET0(R300_GB_MSPOS0, 0)); |
268 | radeon_ring_write(ring, PACKET0(R300_GB_MSPOS0, 0)); |
274 | radeon_ring_write(rdev, |
269 | radeon_ring_write(ring, |
275 | ((6 << R300_MS_X0_SHIFT) | |
270 | ((6 << R300_MS_X0_SHIFT) | |
276 | (6 << R300_MS_Y0_SHIFT) | |
271 | (6 << R300_MS_Y0_SHIFT) | |
277 | (6 << R300_MS_X1_SHIFT) | |
272 | (6 << R300_MS_X1_SHIFT) | |
278 | (6 << R300_MS_Y1_SHIFT) | |
273 | (6 << R300_MS_Y1_SHIFT) | |
279 | (6 << R300_MS_X2_SHIFT) | |
274 | (6 << R300_MS_X2_SHIFT) | |
280 | (6 << R300_MS_Y2_SHIFT) | |
275 | (6 << R300_MS_Y2_SHIFT) | |
281 | (6 << R300_MSBD0_Y_SHIFT) | |
276 | (6 << R300_MSBD0_Y_SHIFT) | |
282 | (6 << R300_MSBD0_X_SHIFT))); |
277 | (6 << R300_MSBD0_X_SHIFT))); |
283 | radeon_ring_write(rdev, PACKET0(R300_GB_MSPOS1, 0)); |
278 | radeon_ring_write(ring, PACKET0(R300_GB_MSPOS1, 0)); |
284 | radeon_ring_write(rdev, |
279 | radeon_ring_write(ring, |
285 | ((6 << R300_MS_X3_SHIFT) | |
280 | ((6 << R300_MS_X3_SHIFT) | |
286 | (6 << R300_MS_Y3_SHIFT) | |
281 | (6 << R300_MS_Y3_SHIFT) | |
287 | (6 << R300_MS_X4_SHIFT) | |
282 | (6 << R300_MS_X4_SHIFT) | |
288 | (6 << R300_MS_Y4_SHIFT) | |
283 | (6 << R300_MS_Y4_SHIFT) | |
289 | (6 << R300_MS_X5_SHIFT) | |
284 | (6 << R300_MS_X5_SHIFT) | |
290 | (6 << R300_MS_Y5_SHIFT) | |
285 | (6 << R300_MS_Y5_SHIFT) | |
291 | (6 << R300_MSBD1_SHIFT))); |
286 | (6 << R300_MSBD1_SHIFT))); |
292 | radeon_ring_write(rdev, PACKET0(R300_GA_ENHANCE, 0)); |
287 | radeon_ring_write(ring, PACKET0(R300_GA_ENHANCE, 0)); |
293 | radeon_ring_write(rdev, R300_GA_DEADLOCK_CNTL | R300_GA_FASTSYNC_CNTL); |
288 | radeon_ring_write(ring, R300_GA_DEADLOCK_CNTL | R300_GA_FASTSYNC_CNTL); |
294 | radeon_ring_write(rdev, PACKET0(R300_GA_POLY_MODE, 0)); |
289 | radeon_ring_write(ring, PACKET0(R300_GA_POLY_MODE, 0)); |
295 | radeon_ring_write(rdev, |
290 | radeon_ring_write(ring, |
296 | R300_FRONT_PTYPE_TRIANGE | R300_BACK_PTYPE_TRIANGE); |
291 | R300_FRONT_PTYPE_TRIANGE | R300_BACK_PTYPE_TRIANGE); |
297 | radeon_ring_write(rdev, PACKET0(R300_GA_ROUND_MODE, 0)); |
292 | radeon_ring_write(ring, PACKET0(R300_GA_ROUND_MODE, 0)); |
298 | radeon_ring_write(rdev, |
293 | radeon_ring_write(ring, |
299 | R300_GEOMETRY_ROUND_NEAREST | |
294 | R300_GEOMETRY_ROUND_NEAREST | |
300 | R300_COLOR_ROUND_NEAREST); |
295 | R300_COLOR_ROUND_NEAREST); |
301 | radeon_ring_unlock_commit(rdev); |
296 | radeon_ring_unlock_commit(rdev, ring); |
Line 302... | Line 297... | ||
302 | } |
297 | } |
303 | 298 | ||
304 | void r300_errata(struct radeon_device *rdev) |
299 | static void r300_errata(struct radeon_device *rdev) |
Line 305... | Line 300... | ||
305 | { |
300 | { |
306 | rdev->pll_errata = 0; |
301 | rdev->pll_errata = 0; |
Line 325... | Line 320... | ||
325 | DRM_UDELAY(1); |
320 | DRM_UDELAY(1); |
326 | } |
321 | } |
327 | return -1; |
322 | return -1; |
328 | } |
323 | } |
Line 329... | Line 324... | ||
329 | 324 | ||
330 | void r300_gpu_init(struct radeon_device *rdev) |
325 | static void r300_gpu_init(struct radeon_device *rdev) |
331 | { |
326 | { |
Line 332... | Line 327... | ||
332 | uint32_t gb_tile_config, tmp; |
327 | uint32_t gb_tile_config, tmp; |
333 | 328 | ||
Line 380... | Line 375... | ||
380 | } |
375 | } |
381 | DRM_INFO("radeon: %d quad pipes, %d Z pipes initialized.\n", |
376 | DRM_INFO("radeon: %d quad pipes, %d Z pipes initialized.\n", |
382 | rdev->num_gb_pipes, rdev->num_z_pipes); |
377 | rdev->num_gb_pipes, rdev->num_z_pipes); |
383 | } |
378 | } |
Line 384... | Line -... | ||
384 | - | ||
385 | bool r300_gpu_is_lockup(struct radeon_device *rdev) |
- | |
386 | { |
- | |
387 | u32 rbbm_status; |
- | |
388 | int r; |
- | |
389 | - | ||
390 | rbbm_status = RREG32(R_000E40_RBBM_STATUS); |
- | |
391 | if (!G_000E40_GUI_ACTIVE(rbbm_status)) { |
- | |
392 | r100_gpu_lockup_update(&rdev->config.r300.lockup, &rdev->cp); |
- | |
393 | return false; |
- | |
394 | } |
- | |
395 | /* force CP activities */ |
- | |
396 | r = radeon_ring_lock(rdev, 2); |
- | |
397 | if (!r) { |
- | |
398 | /* PACKET2 NOP */ |
- | |
399 | radeon_ring_write(rdev, 0x80000000); |
- | |
400 | radeon_ring_write(rdev, 0x80000000); |
- | |
401 | radeon_ring_unlock_commit(rdev); |
- | |
402 | } |
- | |
403 | rdev->cp.rptr = RREG32(RADEON_CP_RB_RPTR); |
- | |
404 | return r100_gpu_cp_is_lockup(rdev, &rdev->config.r300.lockup, &rdev->cp); |
- | |
405 | } |
- | |
406 | 379 | ||
407 | int r300_asic_reset(struct radeon_device *rdev) |
380 | int r300_asic_reset(struct radeon_device *rdev) |
408 | { |
381 | { |
409 | struct r100_mc_save save; |
382 | struct r100_mc_save save; |
410 | u32 status, tmp; |
383 | u32 status, tmp; |
Line 452... | Line 425... | ||
452 | // pci_restore_state(rdev->pdev); |
425 | // pci_restore_state(rdev->pdev); |
453 | r100_enable_bm(rdev); |
426 | r100_enable_bm(rdev); |
454 | /* Check if GPU is idle */ |
427 | /* Check if GPU is idle */ |
455 | if (G_000E40_GA_BUSY(status) || G_000E40_VAP_BUSY(status)) { |
428 | if (G_000E40_GA_BUSY(status) || G_000E40_VAP_BUSY(status)) { |
456 | dev_err(rdev->dev, "failed to reset GPU\n"); |
429 | dev_err(rdev->dev, "failed to reset GPU\n"); |
457 | rdev->gpu_lockup = true; |
- | |
458 | ret = -1; |
430 | ret = -1; |
459 | } else |
431 | } else |
460 | dev_info(rdev->dev, "GPU reset succeed\n"); |
432 | dev_info(rdev->dev, "GPU reset succeed\n"); |
461 | r100_mc_resume(rdev, &save); |
433 | r100_mc_resume(rdev, &save); |
462 | return ret; |
434 | return ret; |
Line 633... | Line 605... | ||
633 | uint32_t tmp, tile_flags = 0; |
605 | uint32_t tmp, tile_flags = 0; |
634 | unsigned i; |
606 | unsigned i; |
635 | int r; |
607 | int r; |
636 | u32 idx_value; |
608 | u32 idx_value; |
Line 637... | Line 609... | ||
637 | 609 | ||
638 | ib = p->ib->ptr; |
610 | ib = p->ib.ptr; |
639 | track = (struct r100_cs_track *)p->track; |
611 | track = (struct r100_cs_track *)p->track; |
Line 640... | Line 612... | ||
640 | idx_value = radeon_get_ib_value(p, idx); |
612 | idx_value = radeon_get_ib_value(p, idx); |
641 | 613 | ||
Line 709... | Line 681... | ||
709 | idx, reg); |
681 | idx, reg); |
710 | r100_cs_dump_packet(p, pkt); |
682 | r100_cs_dump_packet(p, pkt); |
711 | return r; |
683 | return r; |
712 | } |
684 | } |
Line -... | Line 685... | ||
- | 685 | ||
- | 686 | if (p->cs_flags & RADEON_CS_KEEP_TILING_FLAGS) { |
|
- | 687 | ib[idx] = (idx_value & 31) | /* keep the 1st 5 bits */ |
|
- | 688 | ((idx_value & ~31) + (u32)reloc->lobj.gpu_offset); |
|
713 | 689 | } else { |
|
714 | if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO) |
690 | if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO) |
715 | tile_flags |= R300_TXO_MACRO_TILE; |
691 | tile_flags |= R300_TXO_MACRO_TILE; |
716 | if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO) |
692 | if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO) |
717 | tile_flags |= R300_TXO_MICRO_TILE; |
693 | tile_flags |= R300_TXO_MICRO_TILE; |
718 | else if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO_SQUARE) |
694 | else if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO_SQUARE) |
Line 719... | Line 695... | ||
719 | tile_flags |= R300_TXO_MICRO_TILE_SQUARE; |
695 | tile_flags |= R300_TXO_MICRO_TILE_SQUARE; |
720 | 696 | ||
721 | tmp = idx_value + ((u32)reloc->lobj.gpu_offset); |
697 | tmp = idx_value + ((u32)reloc->lobj.gpu_offset); |
- | 698 | tmp |= tile_flags; |
|
722 | tmp |= tile_flags; |
699 | ib[idx] = tmp; |
723 | ib[idx] = tmp; |
700 | } |
724 | track->textures[i].robj = reloc->robj; |
701 | track->textures[i].robj = reloc->robj; |
725 | track->tex_dirty = true; |
702 | track->tex_dirty = true; |
726 | break; |
703 | break; |
Line 768... | Line 745... | ||
768 | case 0x4E44: |
745 | case 0x4E44: |
769 | /* RB3D_COLORPITCH0 */ |
746 | /* RB3D_COLORPITCH0 */ |
770 | /* RB3D_COLORPITCH1 */ |
747 | /* RB3D_COLORPITCH1 */ |
771 | /* RB3D_COLORPITCH2 */ |
748 | /* RB3D_COLORPITCH2 */ |
772 | /* RB3D_COLORPITCH3 */ |
749 | /* RB3D_COLORPITCH3 */ |
- | 750 | if (!(p->cs_flags & RADEON_CS_KEEP_TILING_FLAGS)) { |
|
773 | r = r100_cs_packet_next_reloc(p, &reloc); |
751 | r = r100_cs_packet_next_reloc(p, &reloc); |
774 | if (r) { |
752 | if (r) { |
775 | DRM_ERROR("No reloc for ib[%d]=0x%04X\n", |
753 | DRM_ERROR("No reloc for ib[%d]=0x%04X\n", |
776 | idx, reg); |
754 | idx, reg); |
777 | r100_cs_dump_packet(p, pkt); |
755 | r100_cs_dump_packet(p, pkt); |
Line 786... | Line 764... | ||
786 | tile_flags |= R300_COLOR_MICROTILE_SQUARE_ENABLE; |
764 | tile_flags |= R300_COLOR_MICROTILE_SQUARE_ENABLE; |
Line 787... | Line 765... | ||
787 | 765 | ||
788 | tmp = idx_value & ~(0x7 << 16); |
766 | tmp = idx_value & ~(0x7 << 16); |
789 | tmp |= tile_flags; |
767 | tmp |= tile_flags; |
- | 768 | ib[idx] = tmp; |
|
790 | ib[idx] = tmp; |
769 | } |
791 | i = (reg - 0x4E38) >> 2; |
770 | i = (reg - 0x4E38) >> 2; |
792 | track->cb[i].pitch = idx_value & 0x3FFE; |
771 | track->cb[i].pitch = idx_value & 0x3FFE; |
793 | switch (((idx_value >> 21) & 0xF)) { |
772 | switch (((idx_value >> 21) & 0xF)) { |
794 | case 9: |
773 | case 9: |
Line 851... | Line 830... | ||
851 | } |
830 | } |
852 | track->zb_dirty = true; |
831 | track->zb_dirty = true; |
853 | break; |
832 | break; |
854 | case 0x4F24: |
833 | case 0x4F24: |
855 | /* ZB_DEPTHPITCH */ |
834 | /* ZB_DEPTHPITCH */ |
- | 835 | if (!(p->cs_flags & RADEON_CS_KEEP_TILING_FLAGS)) { |
|
856 | r = r100_cs_packet_next_reloc(p, &reloc); |
836 | r = r100_cs_packet_next_reloc(p, &reloc); |
857 | if (r) { |
837 | if (r) { |
858 | DRM_ERROR("No reloc for ib[%d]=0x%04X\n", |
838 | DRM_ERROR("No reloc for ib[%d]=0x%04X\n", |
859 | idx, reg); |
839 | idx, reg); |
860 | r100_cs_dump_packet(p, pkt); |
840 | r100_cs_dump_packet(p, pkt); |
Line 869... | Line 849... | ||
869 | tile_flags |= R300_DEPTHMICROTILE_TILED_SQUARE; |
849 | tile_flags |= R300_DEPTHMICROTILE_TILED_SQUARE; |
Line 870... | Line 850... | ||
870 | 850 | ||
871 | tmp = idx_value & ~(0x7 << 16); |
851 | tmp = idx_value & ~(0x7 << 16); |
872 | tmp |= tile_flags; |
852 | tmp |= tile_flags; |
873 | ib[idx] = tmp; |
853 | ib[idx] = tmp; |
874 | 854 | } |
|
875 | track->zb.pitch = idx_value & 0x3FFC; |
855 | track->zb.pitch = idx_value & 0x3FFC; |
876 | track->zb_dirty = true; |
856 | track->zb_dirty = true; |
877 | break; |
857 | break; |
878 | case 0x4104: |
858 | case 0x4104: |
Line 1167... | Line 1147... | ||
1167 | struct r100_cs_track *track; |
1147 | struct r100_cs_track *track; |
1168 | volatile uint32_t *ib; |
1148 | volatile uint32_t *ib; |
1169 | unsigned idx; |
1149 | unsigned idx; |
1170 | int r; |
1150 | int r; |
Line 1171... | Line 1151... | ||
1171 | 1151 | ||
1172 | ib = p->ib->ptr; |
1152 | ib = p->ib.ptr; |
1173 | idx = pkt->idx + 1; |
1153 | idx = pkt->idx + 1; |
1174 | track = (struct r100_cs_track *)p->track; |
1154 | track = (struct r100_cs_track *)p->track; |
1175 | switch(pkt->opcode) { |
1155 | switch(pkt->opcode) { |
1176 | case PACKET3_3D_LOAD_VBPNTR: |
1156 | case PACKET3_3D_LOAD_VBPNTR: |
Line 1407... | Line 1387... | ||
1407 | r = r100_cp_init(rdev, 1024 * 1024); |
1387 | r = r100_cp_init(rdev, 1024 * 1024); |
1408 | if (r) { |
1388 | if (r) { |
1409 | dev_err(rdev->dev, "failed initializing CP (%d).\n", r); |
1389 | dev_err(rdev->dev, "failed initializing CP (%d).\n", r); |
1410 | return r; |
1390 | return r; |
1411 | } |
1391 | } |
- | 1392 | ||
1412 | r = r100_ib_init(rdev); |
1393 | r = radeon_ib_pool_init(rdev); |
1413 | if (r) { |
1394 | if (r) { |
1414 | dev_err(rdev->dev, "failed initializing IB (%d).\n", r); |
1395 | dev_err(rdev->dev, "IB initialization failed (%d).\n", r); |
1415 | return r; |
1396 | return r; |
1416 | } |
1397 | } |
- | 1398 | ||
1417 | return 0; |
1399 | return 0; |
1418 | } |
1400 | } |
Line 1490... | Line 1472... | ||
1490 | r = r100_pci_gart_init(rdev); |
1472 | r = r100_pci_gart_init(rdev); |
1491 | if (r) |
1473 | if (r) |
1492 | return r; |
1474 | return r; |
1493 | } |
1475 | } |
1494 | r300_set_reg_safe(rdev); |
1476 | r300_set_reg_safe(rdev); |
- | 1477 | ||
1495 | rdev->accel_working = true; |
1478 | rdev->accel_working = true; |
1496 | r = r300_startup(rdev); |
1479 | r = r300_startup(rdev); |
1497 | if (r) { |
1480 | if (r) { |
1498 | /* Somethings want wront with the accel init stop accel */ |
1481 | /* Somethings want wront with the accel init stop accel */ |
1499 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); |
1482 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); |