aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/char/drm/radeon_cp.c
diff options
context:
space:
mode:
authorAlex Deucher <alexdeucher@gmail.com>2008-05-27 21:57:40 -0400
committerDave Airlie <airlied@redhat.com>2008-06-18 21:27:40 -0400
commit5b92c4045eaa42441b7ec249a406e4110ea400d4 (patch)
tree5ee8b6907868b0fb7cd62272f6df0b612ed8bb2c /drivers/char/drm/radeon_cp.c
parentd396db321bcaec54345e7e9e87cea8482d6ae3a8 (diff)
drm/radeon: init pipe setup in kernel code.
This inits the card pipes in the kernel and lets userspace getparam the correct setup. Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers/char/drm/radeon_cp.c')
-rw-r--r--drivers/char/drm/radeon_cp.c48
1 files changed, 48 insertions, 0 deletions
diff --git a/drivers/char/drm/radeon_cp.c b/drivers/char/drm/radeon_cp.c
index 77bd90f6d414..599187558abb 100644
--- a/drivers/char/drm/radeon_cp.c
+++ b/drivers/char/drm/radeon_cp.c
@@ -247,6 +247,50 @@ static int radeon_do_wait_for_idle(drm_radeon_private_t * dev_priv)
247 return -EBUSY; 247 return -EBUSY;
248} 248}
249 249
250static void radeon_init_pipes(drm_radeon_private_t *dev_priv)
251{
252 uint32_t gb_tile_config, gb_pipe_sel = 0;
253
254 /* RS4xx/RS6xx/R4xx/R5xx */
255 if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R420) {
256 gb_pipe_sel = RADEON_READ(R400_GB_PIPE_SELECT);
257 dev_priv->num_gb_pipes = ((gb_pipe_sel >> 12) & 0x3) + 1;
258 } else {
259 /* R3xx */
260 if (((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_R300) ||
261 ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_R350)) {
262 dev_priv->num_gb_pipes = 2;
263 } else {
264 /* R3Vxx */
265 dev_priv->num_gb_pipes = 1;
266 }
267 }
268 DRM_INFO("Num pipes: %d\n", dev_priv->num_gb_pipes);
269
270 gb_tile_config = (R300_ENABLE_TILING | R300_TILE_SIZE_16 /*| R300_SUBPIXEL_1_16*/);
271
272 switch (dev_priv->num_gb_pipes) {
273 case 2: gb_tile_config |= R300_PIPE_COUNT_R300; break;
274 case 3: gb_tile_config |= R300_PIPE_COUNT_R420_3P; break;
275 case 4: gb_tile_config |= R300_PIPE_COUNT_R420; break;
276 default:
277 case 1: gb_tile_config |= R300_PIPE_COUNT_RV350; break;
278 }
279
280 if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_RV515) {
281 RADEON_WRITE_PLL(R500_DYN_SCLK_PWMEM_PIPE, (1 | ((gb_pipe_sel >> 8) & 0xf) << 4));
282 RADEON_WRITE(R500_SU_REG_DEST, ((1 << dev_priv->num_gb_pipes) - 1));
283 }
284 RADEON_WRITE(R300_GB_TILE_CONFIG, gb_tile_config);
285 radeon_do_wait_for_idle(dev_priv);
286 RADEON_WRITE(R300_DST_PIPE_CONFIG, RADEON_READ(R300_DST_PIPE_CONFIG) | R300_PIPE_AUTO_CONFIG);
287 RADEON_WRITE(R300_RB2D_DSTCACHE_MODE, (RADEON_READ(R300_RB2D_DSTCACHE_MODE) |
288 R300_DC_AUTOFLUSH_ENABLE |
289 R300_DC_DC_DISABLE_IGNORE_PE));
290
291
292}
293
250/* ================================================================ 294/* ================================================================
251 * CP control, initialization 295 * CP control, initialization
252 */ 296 */
@@ -464,6 +508,10 @@ static int radeon_do_engine_reset(struct drm_device * dev)
464 RADEON_WRITE(RADEON_RBBM_SOFT_RESET, rbbm_soft_reset); 508 RADEON_WRITE(RADEON_RBBM_SOFT_RESET, rbbm_soft_reset);
465 } 509 }
466 510
511 /* setup the raster pipes */
512 if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R300)
513 radeon_init_pipes(dev_priv);
514
467 /* Reset the CP ring */ 515 /* Reset the CP ring */
468 radeon_do_cp_reset(dev_priv); 516 radeon_do_cp_reset(dev_priv);
469 517