diff options
author | Alex Deucher <alexdeucher@gmail.com> | 2008-05-27 21:57:40 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2008-06-18 21:27:40 -0400 |
commit | 5b92c4045eaa42441b7ec249a406e4110ea400d4 (patch) | |
tree | 5ee8b6907868b0fb7cd62272f6df0b612ed8bb2c /drivers/char/drm/radeon_cp.c | |
parent | d396db321bcaec54345e7e9e87cea8482d6ae3a8 (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.c | 48 |
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 | ||
250 | static 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 | ||