summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkeithw <keithw>2003-07-25 17:48:31 +0000
committerkeithw <keithw>2003-07-25 17:48:31 +0000
commit3a532af48f386042e2c1e542e848d7cfb7567901 (patch)
treee1b4312287e416ac278a88af1f975f6d08e16cf6
parent1e17b63471e662c539d412e1239742186d712296 (diff)
Agp 8x support
-rw-r--r--xc/programs/Xserver/hw/xfree86/drivers/ati/radeon.h2
-rw-r--r--xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_dri.c19
-rw-r--r--xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_dri.h2
-rw-r--r--xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_driver.c26
-rw-r--r--xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_reg.h1
5 files changed, 43 insertions, 7 deletions
diff --git a/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon.h b/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon.h
index 81e0db7b7..80a55ab8d 100644
--- a/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon.h
+++ b/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon.h
@@ -516,6 +516,8 @@ typedef struct {
#ifdef PER_CONTEXT_SAREA
int perctx_sarea_size;
#endif
+ Bool usingAgp30;
+
#endif
/* XVideo */
diff --git a/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_dri.c b/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_dri.c
index d6c000fd6..2b9027255 100644
--- a/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_dri.c
+++ b/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_dri.c
@@ -716,14 +716,21 @@ static Bool RADEONDRIAgpInit(RADEONInfoPtr info, ScreenPtr pScreen)
device = drmAgpDeviceId(info->drmFD);
mode &= ~RADEON_AGP_MODE_MASK;
- switch (info->agpMode) {
- case 4: mode |= RADEON_AGP_4X_MODE;
- case 2: mode |= RADEON_AGP_2X_MODE;
- case 1: default: mode |= RADEON_AGP_1X_MODE;
+ if(info->usingAgp30) {
+ switch (info->agpMode) {
+ case 8: mode |= RADEON_AGP_2X_MODE;
+ case 4: default: mode |= RADEON_AGP_1X_MODE;
+ }
+ } else {
+ switch (info->agpMode) {
+ case 4: mode |= RADEON_AGP_4X_MODE;
+ case 2: mode |= RADEON_AGP_2X_MODE;
+ case 1: default: mode |= RADEON_AGP_1X_MODE;
+ }
}
if (info->agpFastWrite) mode |= RADEON_AGP_FW_MODE;
-
+
if ((vendor == PCI_VENDOR_AMD) &&
(device == PCI_CHIP_AMD761)) {
/* The combination of 761 with MOBILITY chips will lockup the
@@ -737,7 +744,7 @@ static Bool RADEONDRIAgpInit(RADEONInfoPtr info, ScreenPtr pScreen)
/* Disable fast write for AMD 761 chipset, since they cause
* lockups when enabled.
*/
- mode &= ~0x10; /* FIXME: Magic number */
+ mode &= ~RADEON_AGP_FW_MODE;
}
xf86DrvMsg(pScreen->myNum, X_INFO,
diff --git a/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_dri.h b/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_dri.h
index abfcb4ef0..361e32b28 100644
--- a/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_dri.h
+++ b/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_dri.h
@@ -52,7 +52,7 @@
#define RADEON_DEFAULT_CP_TIMEOUT 10000 /* usecs */
-#define RADEON_AGP_MAX_MODE 4
+#define RADEON_AGP_MAX_MODE 8
#define RADEON_CARD_TYPE_RADEON 1
diff --git a/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_driver.c b/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_driver.c
index ae584332e..f02c9f9c2 100644
--- a/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_driver.c
+++ b/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_driver.c
@@ -3012,6 +3012,28 @@ static Bool RADEONPreInitInt10(ScrnInfoPtr pScrn, xf86Int10InfoPtr *ppInt10)
}
#ifdef XF86DRI
+/* Read from the agp status register and see if the agp 3.0 bit is set. */
+
+/* The agp 3.0 mode bit will only be set in the status register if the
+ * whole system is using 3.0 capable devices.
+ */
+static Bool RADEONAgp30Active(ScrnInfoPtr pScrn)
+{
+ RADEONInfoPtr info = RADEONPTR(pScrn);
+ unsigned char *RADEONMMIO = info->MMIO;
+
+ if (INREG(RADEON_AGP_STATUS) & RADEON_AGP_MODE_3_0) {
+ xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "[agp] Detected AGP v3.0\n");
+ return TRUE;
+ }
+
+ xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "[agp] Using AGP v2.0\n", status);
+
+ return FALSE;
+}
+
+
+
static Bool RADEONPreInitDRI(ScrnInfoPtr pScrn)
{
RADEONInfoPtr info = RADEONPTR(pScrn);
@@ -3024,6 +3046,7 @@ static Bool RADEONPreInitDRI(ScrnInfoPtr pScrn)
}
info->agpMode = RADEON_DEFAULT_AGP_MODE;
+ info->usingAgp30 = FALSE;
info->agpSize = RADEON_DEFAULT_AGP_SIZE;
info->ringSize = RADEON_DEFAULT_RING_SIZE;
info->bufSize = RADEON_DEFAULT_BUFFER_SIZE;
@@ -3552,7 +3575,10 @@ Bool RADEONScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
if (info->IsSecondary) pScrn->fbOffset = pScrn->videoRam * 1024;
if (!RADEONMapMem(pScrn)) return FALSE;
+
#ifdef XF86DRI
+ info->usingAgp30 = RADEONAgp30Active( pScrn );
+
info->fbX = 0;
info->fbY = 0;
#endif
diff --git a/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_reg.h b/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_reg.h
index feca3e432..23a748042 100644
--- a/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_reg.h
+++ b/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_reg.h
@@ -68,6 +68,7 @@
#define RADEON_AGP_COMMAND 0x0f60 /* PCI */
#define RADEON_AGP_PLL_CNTL 0x000b /* PLL */
#define RADEON_AGP_STATUS 0x0f5c /* PCI */
+# define RADEON_AGP_MODE_3_0 (1<<3)
# define RADEON_AGP_1X_MODE 0x01
# define RADEON_AGP_2X_MODE 0x02
# define RADEON_AGP_4X_MODE 0x04