diff options
author | Keith Packard <keithp@keithp.com> | 2004-07-22 18:17:59 +0000 |
---|---|---|
committer | Keith Packard <keithp@keithp.com> | 2004-07-22 18:17:59 +0000 |
commit | 9565d9e0cf85e6f5fb47acebdd66212bd6cc3e08 (patch) | |
tree | 83923ca98ab55366f600838d7ae3c173bced4b99 | |
parent | 67dbad6b3b9163eafae7d9dd7698708e10372a21 (diff) |
Correct pitch so that accelerator can run on 1400x1050 screens. Add a few
more register sets for cursors.
-rw-r--r-- | hw/kdrive/ati/ati.c | 113 | ||||
-rw-r--r-- | hw/kdrive/ati/ati.h | 2 | ||||
-rw-r--r-- | hw/kdrive/ati/ati_cursor.c | 16 | ||||
-rw-r--r-- | hw/kdrive/ati/ati_reg.h | 22 |
4 files changed, 132 insertions, 21 deletions
diff --git a/hw/kdrive/ati/ati.c b/hw/kdrive/ati/ati.c index 23b9d76a3..d421d0c33 100644 --- a/hw/kdrive/ati/ati.c +++ b/hw/kdrive/ati/ati.c @@ -291,12 +291,37 @@ ATICardFini(KdCardInfo *card) static void ATISetOffscreen (KdScreenInfo *screen) { -#if defined(USE_DRI) && defined(GLXEXT) ATICardInfo(screen); +#if defined(USE_DRI) && defined(GLXEXT) ATIScreenInfo *atis = (ATIScreenInfo *)screen->driver; int l; #endif - int screen_size = screen->fb[0].byteStride * screen->height; + int screen_size; + char *mmio = atic->reg_base; + + /* check (and adjust) pitch */ + if (mmio) + { + int byteStride = screen->fb[0].byteStride; + int bitStride; + int pixelStride; + int bpp = screen->fb[0].bitsPerPixel; + + /* + * Ensure frame buffer is correctly aligned + */ + if (byteStride & 0x3f) + { + byteStride = (byteStride + 0x3f) & ~0x3f; + bitStride = byteStride * 8; + pixelStride = bitStride / bpp; + + screen->fb[0].byteStride = byteStride; + screen->fb[0].pixelStride = pixelStride; + } + } + + screen_size = screen->fb[0].byteStride * screen->height; screen->off_screen_base = screen_size; @@ -350,6 +375,62 @@ ATISetOffscreen (KdScreenInfo *screen) #endif /* USE_DRI && GLXEXT */ } +static void +ATISetPitch (KdScreenInfo *screen) +{ + ATICardInfo(screen); +#if defined(USE_DRI) && defined(GLXEXT) + ATIScreenInfo *atis = (ATIScreenInfo *)screen->driver; + int l; +#endif + char *mmio = atic->reg_base; + + /* check (and adjust) pitch for radeon */ + if (mmio) + { + int byteStride = screen->fb[0].byteStride; + int bitStride; + int pixelStride; + int bpp = screen->fb[0].bitsPerPixel; + CARD32 crtc_pitch; + CARD32 crtc2_pitch; +#if 0 + CARD32 crtc_ext_cntl; + CARD32 dac_cntl; +#endif + bitStride = byteStride * 8; + pixelStride = bitStride / bpp; + + crtc_pitch = (pixelStride >> 3); + crtc_pitch |= crtc_pitch << 16; + crtc2_pitch = (pixelStride >> 3); + crtc2_pitch |= crtc2_pitch << 16; +#if 0 + crtc_ext_cntl = MMIO_IN32 (mmio, ATI_REG_CRTC_EXT_CNTL); + dac_cntl = MMIO_IN32 (mmio, ATI_REG_DAC_CNTL); + /* Turn off the screen */ + MMIO_OUT32 (mmio, ATI_REG_CRTC_EXT_CNTL, + crtc_ext_cntl | + ATI_CRTC_VSYNC_DIS | + ATI_CRTC_HSYNC_DIS | + ATI_CRTC_DISPLAY_DIS); + MMIO_OUT32 (mmio, ATI_REG_DAC_CNTL, + dac_cntl | + ATI_DAC_RANGE_CNTL | + ATI_DAC_BLANKING); +#endif + MMIO_OUT32 (mmio, ATI_REG_CRTC_PITCH, crtc_pitch); + MMIO_OUT32 (mmio, ATI_REG_CRTC2_PITCH, crtc2_pitch); +#if 0 + /* Turn the screen back on */ + MMIO_OUT32 (mmio, ATI_REG_CRTC_EXT_CNTL, + crtc_ext_cntl); + MMIO_OUT32 (mmio, ATI_REG_DAC_CNTL, + dac_cntl); +#endif + } +} + static Bool ATIScreenInit(KdScreenInfo *screen) { @@ -406,6 +487,18 @@ ATIRandRSetConfig (ScreenPtr pScreen, ATIDrawDisable (pScreen); ret = atic->backend_funcs.randrSetConfig(pScreen, randr, rate, pSize); ATISetOffscreen (screen); + ATISetPitch (screen); + /* + * Set frame buffer mapping + */ + (*pScreen->ModifyPixmapHeader) (fbGetScreenPixmap (pScreen), + pScreen->width, + pScreen->height, + screen->fb[0].depth, + screen->fb[0].bitsPerPixel, + screen->fb[0].byteStride, + screen->fb[0].frameBuffer); + ATIDrawEnable (pScreen); return ret; } @@ -502,15 +595,25 @@ static void ATIPreserve(KdCardInfo *card) { ATICardInfo *atic = card->driver; + char *mmio = atic->reg_base; atic->backend_funcs.preserve(card); + if (atic->is_radeon && mmio) + { + atic->crtc_pitch = MMIO_IN32(mmio, ATI_REG_CRTC_PITCH); + atic->crtc2_pitch = MMIO_IN32(mmio, ATI_REG_CRTC2_PITCH); + + } } static void ATIRestore(KdCardInfo *card) { ATICardInfo *atic = card->driver; + char *mmio = atic->reg_base; + MMIO_OUT32(mmio, ATI_REG_CRTC_PITCH, atic->crtc_pitch); + MMIO_OUT32(mmio, ATI_REG_CRTC2_PITCH, atic->crtc2_pitch); ATIUnmapReg(card, atic); atic->backend_funcs.restore(card); @@ -534,13 +637,13 @@ ATIEnable(ScreenPtr pScreen) if (!atic->backend_funcs.enable(pScreen)) return FALSE; - ATISetOffscreen (pScreenPriv->screen); - if ((atic->reg_base == NULL) && !ATIMapReg(pScreenPriv->screen->card, atic)) return FALSE; - ATIDPMS(pScreen, KD_DPMS_NORMAL); + ATISetOffscreen (pScreenPriv->screen); + + ATISetPitch (pScreenPriv->screen); return TRUE; } diff --git a/hw/kdrive/ati/ati.h b/hw/kdrive/ati/ati.h index 6f2d3d02b..6e5f3038c 100644 --- a/hw/kdrive/ati/ati.h +++ b/hw/kdrive/ati/ati.h @@ -146,6 +146,8 @@ typedef struct _ATICardInfo { Bool is_r300; Bool is_agp; char *busid; + CARD32 crtc_pitch; + CARD32 crtc2_pitch; #ifdef USE_DRI int drmFd; #endif /* USE_DRI */ diff --git a/hw/kdrive/ati/ati_cursor.c b/hw/kdrive/ati/ati_cursor.c index f8bcc7027..9ea51c404 100644 --- a/hw/kdrive/ati/ati_cursor.c +++ b/hw/kdrive/ati/ati_cursor.c @@ -256,9 +256,14 @@ RadeonLoadCursor(ScreenPtr pScreen) h = bits->height; if (h > ATI_CURSOR_HEIGHT) h = ATI_CURSOR_HEIGHT; + + tmp = MMIO_IN32(mmio, 0x7c); + tmp = 0x00010f80; + MMIO_OUT32 (mmio, 0x7c, tmp); tmp = MMIO_IN32(mmio, ATI_REG_GEN_CNTL); - MMIO_OUT32(mmio, ATI_REG_GEN_CNTL, tmp & ~ATI_CRTC_CUR_EN); + tmp &= ~(ATI_CRTC_CUR_EN | ATI_CRTC_ICON_EN | ATI_CRTC_ARGB_EN); + MMIO_OUT32(mmio, ATI_REG_GEN_CNTL, tmp); /* Stick new image into cursor memory */ ram = (CARD32 *)(pScreenPriv->screen->memory_base + @@ -336,7 +341,7 @@ RadeonLoadCursor(ScreenPtr pScreen) /* Enable the cursor */ tmp &= ~(ATI_CRTC_ICON_EN); - tmp |= (ATI_CRTC_ARGB_EN); + tmp |= ATI_CRTC_ARGB_EN; tmp |= ATI_CRTC_CUR_EN; MMIO_OUT32(mmio, ATI_REG_GEN_CNTL, tmp); } @@ -349,7 +354,8 @@ ATIUnloadCursor(ScreenPtr pScreen) CARD8 *mmio = atic->reg_base; CARD32 tmp; - tmp = MMIO_IN32(mmio, ATI_REG_GEN_CNTL) & ~ATI_CRTC_CUR_EN; + tmp = MMIO_IN32(mmio, ATI_REG_GEN_CNTL); + tmp &= ~(ATI_CRTC_CUR_EN | ATI_CRTC_ICON_EN | ATI_CRTC_ARGB_EN); MMIO_OUT32(mmio, ATI_REG_GEN_CNTL, tmp); } @@ -471,11 +477,11 @@ ATICursorEnable(ScreenPtr pScreen) if (atic->is_radeon) pCurPriv->area = KdOffscreenAlloc(pScreen, ATI_CURSOR_HEIGHT * ATI_CURSOR_WIDTH * 4, - 1, TRUE, ATICursorSave, atis); + 128, TRUE, ATICursorSave, atis); else pCurPriv->area = KdOffscreenAlloc(pScreen, ATI_CURSOR_HEIGHT * ATI_CURSOR_PITCH * 2, - 1, TRUE, ATICursorSave, atis); + 32, TRUE, ATICursorSave, atis); } if (pCurPriv->area == NULL) FatalError("Couldn't allocate offscreen memory for cursor.\n"); diff --git a/hw/kdrive/ati/ati_reg.h b/hw/kdrive/ati/ati_reg.h index 5b5279596..063485dee 100644 --- a/hw/kdrive/ati/ati_reg.h +++ b/hw/kdrive/ati/ati_reg.h @@ -42,17 +42,17 @@ #define ATI_REG_GEN_INT_CNTL 0x0040 #define ATI_REG_GEN_CNTL 0x0050 -# define ATI_CRTC_DBL_SCAN_EN (1 << 0) -# define ATI_CRTC_INTERLACE_EN (1 << 1) -# define ATI_CRTC_CSYNC_EN (1 << 4) -# define ATI_CRTC_PIX_WIDTH_MASK (7 << 8) -# define ATI_CRTC_CUR_EN (1 << 16) -# define ATI_CRTC_CUR_MODE_MASK (7 << 17) -# define ATI_CRTC_ICON_EN (1 << 20) -# define ATI_CRTC_ARGB_EN (2 << 20) -# define ATI_CRTC_EXT_DISP_EN (1 << 24) -# define ATI_CRTC_EN (1 << 25) -# define ATI_CRTC_DISP_REQ_EN_B (1 << 26) +# define ATI_CRTC_DBL_SCAN_EN (1 << 0) /* 0x00000001 */ +# define ATI_CRTC_INTERLACE_EN (1 << 1) /* 0x00000002 */ +# define ATI_CRTC_CSYNC_EN (1 << 4) /* 0x00000010 */ +# define ATI_CRTC_PIX_WIDTH_MASK (7 << 8) /* 0x00000700 */ +# define ATI_CRTC_CUR_EN (1 << 16) /* 0x00010000 */ +# define ATI_CRTC_CUR_MODE_MASK (7 << 17) /* 0x000e0000 */ +# define ATI_CRTC_ICON_EN (1 << 20) /* 0x00100000 */ +# define ATI_CRTC_ARGB_EN (2 << 20) /* 0x00200000 */ +# define ATI_CRTC_EXT_DISP_EN (1 << 24) /* 0x01000000 */ +# define ATI_CRTC_EN (1 << 25) /* 0x02000000 */ +# define ATI_CRTC_DISP_REQ_EN_B (1 << 26) /* 0x04000000 */ #define ATI_REG_CRTC_EXT_CNTL 0x0054 # define ATI_CRTC_EN (1 << 25) |