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 25... | Line 25... | ||
25 | * Alex Deucher |
25 | * Alex Deucher |
26 | * Jerome Glisse |
26 | * Jerome Glisse |
27 | */ |
27 | */ |
28 | #include |
28 | #include |
29 | #include |
29 | #include |
30 | #include "drmP.h" |
30 | #include |
31 | #include "rv515d.h" |
31 | #include "rv515d.h" |
32 | #include "radeon.h" |
32 | #include "radeon.h" |
33 | #include "radeon_asic.h" |
33 | #include "radeon_asic.h" |
34 | #include "atom.h" |
34 | #include "atom.h" |
35 | #include "rv515_reg_safe.h" |
35 | #include "rv515_reg_safe.h" |
Line 36... | Line 36... | ||
36 | 36 | ||
37 | /* This files gather functions specifics to: rv515 */ |
37 | /* This files gather functions specifics to: rv515 */ |
38 | int rv515_debugfs_pipes_info_init(struct radeon_device *rdev); |
38 | static int rv515_debugfs_pipes_info_init(struct radeon_device *rdev); |
39 | int rv515_debugfs_ga_info_init(struct radeon_device *rdev); |
39 | static int rv515_debugfs_ga_info_init(struct radeon_device *rdev); |
40 | void rv515_gpu_init(struct radeon_device *rdev); |
40 | static void rv515_gpu_init(struct radeon_device *rdev); |
Line 41... | Line 41... | ||
41 | int rv515_mc_wait_for_idle(struct radeon_device *rdev); |
41 | int rv515_mc_wait_for_idle(struct radeon_device *rdev); |
42 | 42 | ||
43 | void rv515_debugfs(struct radeon_device *rdev) |
43 | void rv515_debugfs(struct radeon_device *rdev) |
Line 51... | Line 51... | ||
51 | if (rv515_debugfs_ga_info_init(rdev)) { |
51 | if (rv515_debugfs_ga_info_init(rdev)) { |
52 | DRM_ERROR("Failed to register debugfs file for pipes !\n"); |
52 | DRM_ERROR("Failed to register debugfs file for pipes !\n"); |
53 | } |
53 | } |
54 | } |
54 | } |
Line 55... | Line 55... | ||
55 | 55 | ||
56 | void rv515_ring_start(struct radeon_device *rdev) |
56 | void rv515_ring_start(struct radeon_device *rdev, struct radeon_ring *ring) |
57 | { |
57 | { |
Line 58... | Line 58... | ||
58 | int r; |
58 | int r; |
59 | 59 | ||
60 | r = radeon_ring_lock(rdev, 64); |
60 | r = radeon_ring_lock(rdev, ring, 64); |
61 | if (r) { |
61 | if (r) { |
62 | return; |
62 | return; |
63 | } |
63 | } |
64 | radeon_ring_write(rdev, PACKET0(ISYNC_CNTL, 0)); |
64 | radeon_ring_write(ring, PACKET0(ISYNC_CNTL, 0)); |
65 | radeon_ring_write(rdev, |
65 | radeon_ring_write(ring, |
66 | ISYNC_ANY2D_IDLE3D | |
66 | ISYNC_ANY2D_IDLE3D | |
67 | ISYNC_ANY3D_IDLE2D | |
67 | ISYNC_ANY3D_IDLE2D | |
68 | ISYNC_WAIT_IDLEGUI | |
68 | ISYNC_WAIT_IDLEGUI | |
69 | ISYNC_CPSCRATCH_IDLEGUI); |
69 | ISYNC_CPSCRATCH_IDLEGUI); |
70 | radeon_ring_write(rdev, PACKET0(WAIT_UNTIL, 0)); |
70 | radeon_ring_write(ring, PACKET0(WAIT_UNTIL, 0)); |
71 | radeon_ring_write(rdev, WAIT_2D_IDLECLEAN | WAIT_3D_IDLECLEAN); |
71 | radeon_ring_write(ring, WAIT_2D_IDLECLEAN | WAIT_3D_IDLECLEAN); |
72 | radeon_ring_write(rdev, PACKET0(R300_DST_PIPE_CONFIG, 0)); |
72 | radeon_ring_write(ring, PACKET0(R300_DST_PIPE_CONFIG, 0)); |
73 | radeon_ring_write(rdev, R300_PIPE_AUTO_CONFIG); |
73 | radeon_ring_write(ring, R300_PIPE_AUTO_CONFIG); |
74 | radeon_ring_write(rdev, PACKET0(GB_SELECT, 0)); |
74 | radeon_ring_write(ring, PACKET0(GB_SELECT, 0)); |
75 | radeon_ring_write(rdev, 0); |
75 | radeon_ring_write(ring, 0); |
76 | radeon_ring_write(rdev, PACKET0(GB_ENABLE, 0)); |
76 | radeon_ring_write(ring, PACKET0(GB_ENABLE, 0)); |
77 | radeon_ring_write(rdev, 0); |
77 | radeon_ring_write(ring, 0); |
78 | radeon_ring_write(rdev, PACKET0(R500_SU_REG_DEST, 0)); |
78 | radeon_ring_write(ring, PACKET0(R500_SU_REG_DEST, 0)); |
79 | radeon_ring_write(rdev, (1 << rdev->num_gb_pipes) - 1); |
79 | radeon_ring_write(ring, (1 << rdev->num_gb_pipes) - 1); |
80 | radeon_ring_write(rdev, PACKET0(VAP_INDEX_OFFSET, 0)); |
80 | radeon_ring_write(ring, PACKET0(VAP_INDEX_OFFSET, 0)); |
81 | radeon_ring_write(rdev, 0); |
81 | radeon_ring_write(ring, 0); |
82 | radeon_ring_write(rdev, PACKET0(RB3D_DSTCACHE_CTLSTAT, 0)); |
82 | radeon_ring_write(ring, PACKET0(RB3D_DSTCACHE_CTLSTAT, 0)); |
83 | radeon_ring_write(rdev, RB3D_DC_FLUSH | RB3D_DC_FREE); |
83 | radeon_ring_write(ring, RB3D_DC_FLUSH | RB3D_DC_FREE); |
84 | radeon_ring_write(rdev, PACKET0(ZB_ZCACHE_CTLSTAT, 0)); |
84 | radeon_ring_write(ring, PACKET0(ZB_ZCACHE_CTLSTAT, 0)); |
85 | radeon_ring_write(rdev, ZC_FLUSH | ZC_FREE); |
85 | radeon_ring_write(ring, ZC_FLUSH | ZC_FREE); |
86 | radeon_ring_write(rdev, PACKET0(WAIT_UNTIL, 0)); |
86 | radeon_ring_write(ring, PACKET0(WAIT_UNTIL, 0)); |
87 | radeon_ring_write(rdev, WAIT_2D_IDLECLEAN | WAIT_3D_IDLECLEAN); |
87 | radeon_ring_write(ring, WAIT_2D_IDLECLEAN | WAIT_3D_IDLECLEAN); |
88 | radeon_ring_write(rdev, PACKET0(GB_AA_CONFIG, 0)); |
88 | radeon_ring_write(ring, PACKET0(GB_AA_CONFIG, 0)); |
89 | radeon_ring_write(rdev, 0); |
89 | radeon_ring_write(ring, 0); |
90 | radeon_ring_write(rdev, PACKET0(RB3D_DSTCACHE_CTLSTAT, 0)); |
90 | radeon_ring_write(ring, PACKET0(RB3D_DSTCACHE_CTLSTAT, 0)); |
91 | radeon_ring_write(rdev, RB3D_DC_FLUSH | RB3D_DC_FREE); |
91 | radeon_ring_write(ring, RB3D_DC_FLUSH | RB3D_DC_FREE); |
92 | radeon_ring_write(rdev, PACKET0(ZB_ZCACHE_CTLSTAT, 0)); |
92 | radeon_ring_write(ring, PACKET0(ZB_ZCACHE_CTLSTAT, 0)); |
93 | radeon_ring_write(rdev, ZC_FLUSH | ZC_FREE); |
93 | radeon_ring_write(ring, ZC_FLUSH | ZC_FREE); |
94 | radeon_ring_write(rdev, PACKET0(GB_MSPOS0, 0)); |
94 | radeon_ring_write(ring, PACKET0(GB_MSPOS0, 0)); |
95 | radeon_ring_write(rdev, |
95 | radeon_ring_write(ring, |
96 | ((6 << MS_X0_SHIFT) | |
96 | ((6 << MS_X0_SHIFT) | |
97 | (6 << MS_Y0_SHIFT) | |
97 | (6 << MS_Y0_SHIFT) | |
98 | (6 << MS_X1_SHIFT) | |
98 | (6 << MS_X1_SHIFT) | |
99 | (6 << MS_Y1_SHIFT) | |
99 | (6 << MS_Y1_SHIFT) | |
100 | (6 << MS_X2_SHIFT) | |
100 | (6 << MS_X2_SHIFT) | |
101 | (6 << MS_Y2_SHIFT) | |
101 | (6 << MS_Y2_SHIFT) | |
102 | (6 << MSBD0_Y_SHIFT) | |
102 | (6 << MSBD0_Y_SHIFT) | |
103 | (6 << MSBD0_X_SHIFT))); |
103 | (6 << MSBD0_X_SHIFT))); |
104 | radeon_ring_write(rdev, PACKET0(GB_MSPOS1, 0)); |
104 | radeon_ring_write(ring, PACKET0(GB_MSPOS1, 0)); |
105 | radeon_ring_write(rdev, |
105 | radeon_ring_write(ring, |
106 | ((6 << MS_X3_SHIFT) | |
106 | ((6 << MS_X3_SHIFT) | |
107 | (6 << MS_Y3_SHIFT) | |
107 | (6 << MS_Y3_SHIFT) | |
108 | (6 << MS_X4_SHIFT) | |
108 | (6 << MS_X4_SHIFT) | |
109 | (6 << MS_Y4_SHIFT) | |
109 | (6 << MS_Y4_SHIFT) | |
110 | (6 << MS_X5_SHIFT) | |
110 | (6 << MS_X5_SHIFT) | |
111 | (6 << MS_Y5_SHIFT) | |
111 | (6 << MS_Y5_SHIFT) | |
112 | (6 << MSBD1_SHIFT))); |
112 | (6 << MSBD1_SHIFT))); |
113 | radeon_ring_write(rdev, PACKET0(GA_ENHANCE, 0)); |
113 | radeon_ring_write(ring, PACKET0(GA_ENHANCE, 0)); |
114 | radeon_ring_write(rdev, GA_DEADLOCK_CNTL | GA_FASTSYNC_CNTL); |
114 | radeon_ring_write(ring, GA_DEADLOCK_CNTL | GA_FASTSYNC_CNTL); |
115 | radeon_ring_write(rdev, PACKET0(GA_POLY_MODE, 0)); |
115 | radeon_ring_write(ring, PACKET0(GA_POLY_MODE, 0)); |
116 | radeon_ring_write(rdev, FRONT_PTYPE_TRIANGE | BACK_PTYPE_TRIANGE); |
116 | radeon_ring_write(ring, FRONT_PTYPE_TRIANGE | BACK_PTYPE_TRIANGE); |
117 | radeon_ring_write(rdev, PACKET0(GA_ROUND_MODE, 0)); |
117 | radeon_ring_write(ring, PACKET0(GA_ROUND_MODE, 0)); |
118 | radeon_ring_write(rdev, GEOMETRY_ROUND_NEAREST | COLOR_ROUND_NEAREST); |
118 | radeon_ring_write(ring, GEOMETRY_ROUND_NEAREST | COLOR_ROUND_NEAREST); |
119 | radeon_ring_write(rdev, PACKET0(0x20C8, 0)); |
119 | radeon_ring_write(ring, PACKET0(0x20C8, 0)); |
120 | radeon_ring_write(rdev, 0); |
120 | radeon_ring_write(ring, 0); |
Line 121... | Line 121... | ||
121 | radeon_ring_unlock_commit(rdev); |
121 | radeon_ring_unlock_commit(rdev, ring); |
122 | } |
122 | } |
123 | 123 | ||
Line 141... | Line 141... | ||
141 | { |
141 | { |
142 | WREG32(R_000300_VGA_RENDER_CONTROL, |
142 | WREG32(R_000300_VGA_RENDER_CONTROL, |
143 | RREG32(R_000300_VGA_RENDER_CONTROL) & C_000300_VGA_VSTATUS_CNTL); |
143 | RREG32(R_000300_VGA_RENDER_CONTROL) & C_000300_VGA_VSTATUS_CNTL); |
144 | } |
144 | } |
Line 145... | Line 145... | ||
145 | 145 | ||
146 | void rv515_gpu_init(struct radeon_device *rdev) |
146 | static void rv515_gpu_init(struct radeon_device *rdev) |
147 | { |
147 | { |
Line 148... | Line 148... | ||
148 | unsigned pipe_select_current, gb_pipe_select, tmp; |
148 | unsigned pipe_select_current, gb_pipe_select, tmp; |
149 | 149 | ||
150 | if (r100_gui_wait_for_idle(rdev)) { |
150 | if (r100_gui_wait_for_idle(rdev)) { |
151 | printk(KERN_WARNING "Failed to wait GUI idle while " |
151 | printk(KERN_WARNING "Failed to wait GUI idle while " |
152 | "reseting GPU. Bad things might happen.\n"); |
152 | "resetting GPU. Bad things might happen.\n"); |
153 | } |
153 | } |
154 | rv515_vga_render_disable(rdev); |
154 | rv515_vga_render_disable(rdev); |
155 | r420_pipes_init(rdev); |
155 | r420_pipes_init(rdev); |
Line 159... | Line 159... | ||
159 | tmp = (1 << pipe_select_current) | |
159 | tmp = (1 << pipe_select_current) | |
160 | (((gb_pipe_select >> 8) & 0xF) << 4); |
160 | (((gb_pipe_select >> 8) & 0xF) << 4); |
161 | WREG32_PLL(0x000D, tmp); |
161 | WREG32_PLL(0x000D, tmp); |
162 | if (r100_gui_wait_for_idle(rdev)) { |
162 | if (r100_gui_wait_for_idle(rdev)) { |
163 | printk(KERN_WARNING "Failed to wait GUI idle while " |
163 | printk(KERN_WARNING "Failed to wait GUI idle while " |
164 | "reseting GPU. Bad things might happen.\n"); |
164 | "resetting GPU. Bad things might happen.\n"); |
165 | } |
165 | } |
166 | if (rv515_mc_wait_for_idle(rdev)) { |
166 | if (rv515_mc_wait_for_idle(rdev)) { |
167 | printk(KERN_WARNING "Failed to wait MC idle while " |
167 | printk(KERN_WARNING "Failed to wait MC idle while " |
168 | "programming pipes. Bad things might happen.\n"); |
168 | "programming pipes. Bad things might happen.\n"); |
169 | } |
169 | } |
Line 187... | Line 187... | ||
187 | rdev->mc.vram_width = 128; |
187 | rdev->mc.vram_width = 128; |
188 | break; |
188 | break; |
189 | } |
189 | } |
190 | } |
190 | } |
Line 191... | Line 191... | ||
191 | 191 | ||
192 | void rv515_mc_init(struct radeon_device *rdev) |
192 | static void rv515_mc_init(struct radeon_device *rdev) |
Line 193... | Line 193... | ||
193 | { |
193 | { |
194 | 194 | ||
195 | rv515_vram_get_type(rdev); |
195 | rv515_vram_get_type(rdev); |
Line 259... | Line 259... | ||
259 | static struct drm_info_list rv515_ga_info_list[] = { |
259 | static struct drm_info_list rv515_ga_info_list[] = { |
260 | {"rv515_ga_info", rv515_debugfs_ga_info, 0, NULL}, |
260 | {"rv515_ga_info", rv515_debugfs_ga_info, 0, NULL}, |
261 | }; |
261 | }; |
262 | #endif |
262 | #endif |
Line 263... | Line 263... | ||
263 | 263 | ||
264 | int rv515_debugfs_pipes_info_init(struct radeon_device *rdev) |
264 | static int rv515_debugfs_pipes_info_init(struct radeon_device *rdev) |
265 | { |
265 | { |
266 | #if defined(CONFIG_DEBUG_FS) |
266 | #if defined(CONFIG_DEBUG_FS) |
267 | return radeon_debugfs_add_files(rdev, rv515_pipes_info_list, 1); |
267 | return radeon_debugfs_add_files(rdev, rv515_pipes_info_list, 1); |
268 | #else |
268 | #else |
269 | return 0; |
269 | return 0; |
270 | #endif |
270 | #endif |
Line 271... | Line 271... | ||
271 | } |
271 | } |
272 | 272 | ||
273 | int rv515_debugfs_ga_info_init(struct radeon_device *rdev) |
273 | static int rv515_debugfs_ga_info_init(struct radeon_device *rdev) |
274 | { |
274 | { |
275 | #if defined(CONFIG_DEBUG_FS) |
275 | #if defined(CONFIG_DEBUG_FS) |
276 | return radeon_debugfs_add_files(rdev, rv515_ga_info_list, 1); |
276 | return radeon_debugfs_add_files(rdev, rv515_ga_info_list, 1); |
277 | #else |
277 | #else |
278 | return 0; |
278 | return 0; |
Line 279... | Line 279... | ||
279 | #endif |
279 | #endif |
280 | } |
280 | } |
281 | - | ||
282 | void rv515_mc_stop(struct radeon_device *rdev, struct rv515_mc_save *save) |
- | |
283 | { |
281 | |
284 | save->d1vga_control = RREG32(R_000330_D1VGA_CONTROL); |
282 | void rv515_mc_stop(struct radeon_device *rdev, struct rv515_mc_save *save) |
285 | save->d2vga_control = RREG32(R_000338_D2VGA_CONTROL); |
- | |
286 | save->vga_render_control = RREG32(R_000300_VGA_RENDER_CONTROL); |
- | |
Line 287... | Line 283... | ||
287 | save->vga_hdp_control = RREG32(R_000328_VGA_HDP_CONTROL); |
283 | { |
288 | save->d1crtc_control = RREG32(R_006080_D1CRTC_CONTROL); |
284 | save->vga_render_control = RREG32(R_000300_VGA_RENDER_CONTROL); |
289 | save->d2crtc_control = RREG32(R_006880_D2CRTC_CONTROL); |
285 | save->vga_hdp_control = RREG32(R_000328_VGA_HDP_CONTROL); |
290 | 286 | ||
Line 309... | Line 305... | ||
309 | WREG32(R_006918_D2GRPH_SECONDARY_SURFACE_ADDRESS, rdev->mc.vram_start); |
305 | WREG32(R_006918_D2GRPH_SECONDARY_SURFACE_ADDRESS, rdev->mc.vram_start); |
310 | WREG32(R_000310_VGA_MEMORY_BASE_ADDRESS, rdev->mc.vram_start); |
306 | WREG32(R_000310_VGA_MEMORY_BASE_ADDRESS, rdev->mc.vram_start); |
311 | /* Unlock host access */ |
307 | /* Unlock host access */ |
312 | WREG32(R_000328_VGA_HDP_CONTROL, save->vga_hdp_control); |
308 | WREG32(R_000328_VGA_HDP_CONTROL, save->vga_hdp_control); |
313 | mdelay(1); |
309 | mdelay(1); |
314 | /* Restore video state */ |
- | |
315 | WREG32(R_000330_D1VGA_CONTROL, save->d1vga_control); |
- | |
316 | WREG32(R_000338_D2VGA_CONTROL, save->d2vga_control); |
- | |
317 | WREG32(R_0060E8_D1CRTC_UPDATE_LOCK, 1); |
- | |
318 | WREG32(R_0068E8_D2CRTC_UPDATE_LOCK, 1); |
- | |
319 | WREG32(R_006080_D1CRTC_CONTROL, save->d1crtc_control); |
- | |
320 | WREG32(R_006880_D2CRTC_CONTROL, save->d2crtc_control); |
- | |
321 | WREG32(R_0060E8_D1CRTC_UPDATE_LOCK, 0); |
- | |
322 | WREG32(R_0068E8_D2CRTC_UPDATE_LOCK, 0); |
- | |
323 | WREG32(R_000300_VGA_RENDER_CONTROL, save->vga_render_control); |
310 | WREG32(R_000300_VGA_RENDER_CONTROL, save->vga_render_control); |
324 | } |
311 | } |
Line 325... | Line 312... | ||
325 | 312 | ||
326 | void rv515_mc_program(struct radeon_device *rdev) |
313 | static void rv515_mc_program(struct radeon_device *rdev) |
327 | { |
314 | { |
Line 328... | Line 315... | ||
328 | struct rv515_mc_save save; |
315 | struct rv515_mc_save save; |
329 | 316 | ||
Line 399... | Line 386... | ||
399 | r = r100_cp_init(rdev, 1024 * 1024); |
386 | r = r100_cp_init(rdev, 1024 * 1024); |
400 | if (r) { |
387 | if (r) { |
401 | dev_err(rdev->dev, "failed initializing CP (%d).\n", r); |
388 | dev_err(rdev->dev, "failed initializing CP (%d).\n", r); |
402 | return r; |
389 | return r; |
403 | } |
390 | } |
- | 391 | ||
404 | r = r100_ib_init(rdev); |
392 | r = radeon_ib_pool_init(rdev); |
405 | if (r) { |
393 | if (r) { |
406 | dev_err(rdev->dev, "failed initializing IB (%d).\n", r); |
394 | dev_err(rdev->dev, "IB initialization failed (%d).\n", r); |
407 | return r; |
395 | return r; |
408 | } |
396 | } |
- | 397 | ||
409 | return 0; |
398 | return 0; |
410 | } |
399 | } |
Line 411... | Line 400... | ||
411 | 400 | ||
Line 475... | Line 464... | ||
475 | return r; |
464 | return r; |
476 | r = rv370_pcie_gart_init(rdev); |
465 | r = rv370_pcie_gart_init(rdev); |
477 | if (r) |
466 | if (r) |
478 | return r; |
467 | return r; |
479 | rv515_set_safe_registers(rdev); |
468 | rv515_set_safe_registers(rdev); |
- | 469 | ||
480 | rdev->accel_working = true; |
470 | rdev->accel_working = true; |
481 | r = rv515_startup(rdev); |
471 | r = rv515_startup(rdev); |
482 | if (r) { |
472 | if (r) { |
483 | /* Somethings want wront with the accel init stop accel */ |
473 | /* Somethings want wront with the accel init stop accel */ |
484 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); |
474 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); |
Line 733... | Line 723... | ||
733 | fixed20_12 priority_mark_max; |
723 | fixed20_12 priority_mark_max; |
734 | fixed20_12 priority_mark; |
724 | fixed20_12 priority_mark; |
735 | fixed20_12 sclk; |
725 | fixed20_12 sclk; |
736 | }; |
726 | }; |
Line 737... | Line 727... | ||
737 | 727 | ||
738 | void rv515_crtc_bandwidth_compute(struct radeon_device *rdev, |
728 | static void rv515_crtc_bandwidth_compute(struct radeon_device *rdev, |
739 | struct radeon_crtc *crtc, |
729 | struct radeon_crtc *crtc, |
740 | struct rv515_watermark *wm) |
730 | struct rv515_watermark *wm) |
741 | { |
731 | { |
742 | struct drm_display_mode *mode = &crtc->base.mode; |
732 | struct drm_display_mode *mode = &crtc->base.mode; |