Correct pitch so that accelerator can run on 1400x1050 screens. Add a few

more register sets for cursors.
This commit is contained in:
Keith Packard 2004-07-22 18:17:59 +00:00
parent 67dbad6b3b
commit 9565d9e0cf
4 changed files with 132 additions and 21 deletions

View File

@ -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;
}

View File

@ -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 */

View File

@ -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");

View File

@ -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)