diff options
author | keithw <keithw> | 2003-07-25 17:48:31 +0000 |
---|---|---|
committer | keithw <keithw> | 2003-07-25 17:48:31 +0000 |
commit | 3a532af48f386042e2c1e542e848d7cfb7567901 (patch) | |
tree | e1b4312287e416ac278a88af1f975f6d08e16cf6 | |
parent | 1e17b63471e662c539d412e1239742186d712296 (diff) |
Agp 8x support
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 |