xserver/hw/kdrive/ati ati.c, 1.16, 1.17 ati.h, 1.10,
1.11 ati_cursor.c, 1.5, 1.6 ati_reg.h, 1.6, 1.7
Keith Packard
xserver-commit at pdx.freedesktop.org
Thu Jul 22 11:18:01 PDT 2004
Committed by: keithp
Update of /cvs/xserver/xserver/hw/kdrive/ati
In directory pdx:/tmp/cvs-serv11126/hw/kdrive/ati
Modified Files:
ati.c ati.h ati_cursor.c ati_reg.h
Log Message:
2004-07-22 Keith Packard <keithp at keithp.com>
reviewed by: <delete if not using a buddy>
* hw/kdrive/ati/ati.c: (ATISetOffscreen), (ATISetPitch),
(ATIRandRSetConfig), (ATIPreserve), (ATIRestore), (ATIEnable):
* hw/kdrive/ati/ati.h:
* hw/kdrive/ati/ati_cursor.c: (RadeonLoadCursor),
(ATIUnloadCursor), (ATICursorEnable):
* hw/kdrive/ati/ati_reg.h:
Correct pitch so that accelerator can run on 1400x1050 screens.
Add a few more register sets for cursors.
Index: ati.c
===================================================================
RCS file: /cvs/xserver/xserver/hw/kdrive/ati/ati.c,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -d -r1.16 -r1.17
--- ati.c 19 Jul 2004 07:53:53 -0000 1.16
+++ ati.c 22 Jul 2004 18:17:59 -0000 1.17
@@ -291,12 +291,37 @@
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 @@
#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 @@
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 @@
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 @@
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;
}
Index: ati.h
===================================================================
RCS file: /cvs/xserver/xserver/hw/kdrive/ati/ati.h,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -d -r1.10 -r1.11
--- ati.h 19 Jul 2004 07:53:54 -0000 1.10
+++ ati.h 22 Jul 2004 18:17:59 -0000 1.11
@@ -146,6 +146,8 @@
Bool is_r300;
Bool is_agp;
char *busid;
+ CARD32 crtc_pitch;
+ CARD32 crtc2_pitch;
#ifdef USE_DRI
int drmFd;
#endif /* USE_DRI */
Index: ati_cursor.c
===================================================================
RCS file: /cvs/xserver/xserver/hw/kdrive/ati/ati_cursor.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -d -r1.5 -r1.6
--- ati_cursor.c 19 Jul 2004 11:42:49 -0000 1.5
+++ ati_cursor.c 22 Jul 2004 18:17:59 -0000 1.6
@@ -256,9 +256,14 @@
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 @@
/* 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 @@
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 @@
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");
Index: ati_reg.h
===================================================================
RCS file: /cvs/xserver/xserver/hw/kdrive/ati/ati_reg.h,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -d -r1.6 -r1.7
--- ati_reg.h 26 Jun 2004 04:13:03 -0000 1.6
+++ ati_reg.h 22 Jul 2004 18:17:59 -0000 1.7
@@ -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)
More information about the xserver-commit
mailing list