summaryrefslogtreecommitdiff
path: root/src/atiprobe.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/atiprobe.c')
-rw-r--r--src/atiprobe.c297
1 files changed, 66 insertions, 231 deletions
diff --git a/src/atiprobe.c b/src/atiprobe.c
index f250f94..658fbd0 100644
--- a/src/atiprobe.c
+++ b/src/atiprobe.c
@@ -39,7 +39,6 @@
#include "ativalid.h"
#include "ativersion.h"
#include "atividmem.h"
-#include "atiwonderio.h"
/*
* NOTES:
@@ -66,57 +65,6 @@ typedef struct _ATIGDev
CARD8 Chipset;
} ATIGDev, *ATIGDevPtr;
-#ifndef AVOID_CPIO
-
-/*
- * ATIVGAProbe --
- *
- * This function looks for an IBM standard VGA, or clone, and sets
- * pATI->VGAAdapter if one is found.
- */
-static ATIPtr
-ATIVGAProbe(ATIPtr pVGA)
-{
- CARD8 IOValue1, IOValue2, IOValue3;
-
- if (!pVGA)
- pVGA = (ATIPtr)xnfcalloc(1, SizeOf(ATIRec));
-
- /*
- * VGA has one more attribute register than EGA. See if it can be read and
- * written. Note that the CRTC registers are not used here, so there's no
- * need to unlock them.
- */
- ATISetVGAIOBase(pVGA, inb(R_GENMO));
- (void)inb(GENS1(pVGA->CPIO_VGABase));
- IOValue1 = inb(ATTRX);
- (void)inb(GENS1(pVGA->CPIO_VGABase));
- IOValue2 = GetReg(ATTRX, 0x14U | 0x20U);
- outb(ATTRX, IOValue2 ^ 0x0FU);
- IOValue3 = GetReg(ATTRX, 0x14U | 0x20U);
- outb(ATTRX, IOValue2);
- outb(ATTRX, IOValue1);
- (void)inb(GENS1(pVGA->CPIO_VGABase));
- if (IOValue3 == (IOValue2 ^ 0x0FU))
- {
- /* VGA device detected */
- if (pVGA->Chip == ATI_CHIP_NONE)
- pVGA->Chip = ATI_CHIP_VGA;
- if (pVGA->VGAAdapter == ATI_ADAPTER_NONE)
- pVGA->VGAAdapter = ATI_ADAPTER_VGA;
- if (pVGA->Adapter == ATI_ADAPTER_NONE)
- pVGA->Adapter = ATI_ADAPTER_VGA;
- }
- else
- {
- pVGA->VGAAdapter = ATI_ADAPTER_NONE;
- }
-
- return pVGA;
-}
-
-#endif /* AVOID_CPIO */
-
/*
* ATIMach64Detect --
*
@@ -124,12 +72,7 @@ ATIVGAProbe(ATIPtr pVGA)
* address.
*/
static Bool
-ATIMach64Detect
-(
- ATIPtr pATI,
- const CARD16 ChipType,
- const ATIChipType Chip
-)
+ATIMach64Detect(ATIPtr pATI, const CARD16 ChipType, const ATIChipType Chip)
{
CARD32 IOValue, bus_cntl, gen_test_cntl;
@@ -166,12 +109,10 @@ ATIMach64Detect
/* Test odd bits */
outr(SCRATCH_REG0, 0x55555555U);
- if (inr(SCRATCH_REG0) == 0x55555555U)
- {
+ if (inr(SCRATCH_REG0) == 0x55555555U) {
/* Test even bits */
outr(SCRATCH_REG0, 0xAAAAAAAAU);
- if (inr(SCRATCH_REG0) == 0xAAAAAAAAU)
- {
+ if (inr(SCRATCH_REG0) == 0xAAAAAAAAU) {
/*
* *Something* has a R/W 32-bit register at this address. Try to
* make sure it's a Mach64. The following assumes that ATI will
@@ -179,8 +120,7 @@ ATIMach64Detect
* themselves in PCI configuration space.
*/
ATIMach64ChipID(pATI, ChipType);
- if ((pATI->Chip != ATI_CHIP_Mach64) ||
- (pATI->CPIODecoding == BLOCK_IO))
+ if ((pATI->Chip != ATI_CHIP_Mach64) || (pATI->CPIODecoding == BLOCK_IO))
pATI->Adapter = ATI_ADAPTER_MACH64;
}
}
@@ -189,8 +129,7 @@ ATIMach64Detect
outr(SCRATCH_REG0, IOValue);
/* If no Mach64 was detected, return now */
- if (pATI->Adapter != ATI_ADAPTER_MACH64)
- {
+ if (pATI->Adapter != ATI_ADAPTER_MACH64) {
outr(GEN_TEST_CNTL, gen_test_cntl);
outr(BUS_CNTL, bus_cntl);
ATIUnmapApertures(-1, pATI);
@@ -211,53 +150,39 @@ ATIMach64Detect
* ATIRec if one is found.
*/
static ATIPtr
-ATIMach64Probe
-(
- pciVideoPtr pVideo,
- const IOADDRESS IOBase,
- const CARD8 IODecoding,
- const ATIChipType Chip
-)
+ATIMach64Probe(pciVideoPtr pVideo, const IOADDRESS IOBase,
+ const CARD8 IODecoding, const ATIChipType Chip)
{
- ATIPtr pATI = (ATIPtr)xnfcalloc(1, SizeOf(ATIRec));
- CARD16 ChipType = 0;
+ ATIPtr pATI = (ATIPtr)xnfcalloc(1, SizeOf(ATIRec));
pATI->CPIOBase = IOBase;
pATI->CPIODecoding = IODecoding;
+ pATI->PCIInfo = pVideo;
- if (pVideo)
- {
- pATI->PCIInfo = pVideo;
- ChipType = pVideo->chipType;
-
- /*
- * Probe through auxiliary MMIO aperture if one exists. Because such
- * apertures can be enabled/disabled only through PCI, this probes no
- * further.
- */
- if ((pVideo->size[2] >= 12) &&
- (pATI->Block0Base = pVideo->memBase[2]) &&
- (pATI->Block0Base < (CARD32)(-1 << pVideo->size[2])))
- {
- pATI->Block0Base += 0x00000400U;
- goto LastProbe;
- }
+ /*
+ * Probe through auxiliary MMIO aperture if one exists. Because such
+ * apertures can be enabled/disabled only through PCI, this probes no
+ * further.
+ */
+ if ((pVideo->size[2] >= 12) &&
+ (pATI->Block0Base = pVideo->memBase[2]) &&
+ (pATI->Block0Base < (CARD32)(-1 << pVideo->size[2]))) {
+ pATI->Block0Base += 0x00000400U;
+ goto LastProbe;
+ }
- /*
- * Probe through the primary MMIO aperture that exists at the tail end
- * of the linear aperture. Test for both 8MB and 4MB linear apertures.
- */
- if ((pVideo->size[0] >= 22) && (pATI->Block0Base = pVideo->memBase[0]))
- {
- pATI->Block0Base += 0x007FFC00U;
- if ((pVideo->size[0] >= 23) &&
- ATIMach64Detect(pATI, ChipType, Chip))
- return pATI;
-
- pATI->Block0Base -= 0x00400000U;
- if (ATIMach64Detect(pATI, ChipType, Chip))
- return pATI;
- }
+ /*
+ * Probe through the primary MMIO aperture that exists at the tail end
+ * of the linear aperture. Test for both 8MB and 4MB linear apertures.
+ */
+ if ((pVideo->size[0] >= 22) && (pATI->Block0Base = pVideo->memBase[0])) {
+ pATI->Block0Base += 0x007FFC00U;
+ if ((pVideo->size[0] >= 23) && ATIMach64Detect(pATI, pVideo->chipType, Chip))
+ return pATI;
+
+ pATI->Block0Base -= 0x00400000U;
+ if (ATIMach64Detect(pATI, pVideo->chipType, Chip))
+ return pATI;
}
/*
@@ -268,7 +193,7 @@ ATIMach64Probe
pATI->Block0Base = 0x000BFC00U;
LastProbe:
- if (ATIMach64Detect(pATI, ChipType, Chip))
+ if (ATIMach64Detect(pATI, pVideo->chipType, Chip))
return pATI;
xfree(pATI);
@@ -284,38 +209,25 @@ LastProbe:
* ATIRec if one is found.
*/
static ATIPtr
-ATIMach64Probe
-(
- pciVideoPtr pVideo,
- const IOADDRESS IOBase,
- const CARD8 IODecoding,
- const ATIChipType Chip
-)
+ATIMach64Probe(pciVideoPtr pVideo, const IOADDRESS IOBase,
+ const CARD8 IODecoding, const ATIChipType Chip)
{
ATIPtr pATI;
- CARD32 IOValue;
- CARD16 ChipType = 0;
if (!IOBase)
return NULL;
- if (pVideo)
- {
- if ((IODecoding == BLOCK_IO) &&
- ((pVideo->size[1] < 8) ||
- (IOBase >= (CARD32)(-1 << pVideo->size[1]))))
- return NULL;
-
- ChipType = pVideo->chipType;
- }
-
+ if ((IODecoding == BLOCK_IO) &&
+ ((pVideo->size[1] < 8) ||
+ (IOBase >= (CARD32)(-1 << pVideo->size[1]))))
+ return NULL;
+
pATI = (ATIPtr)xnfcalloc(1, SizeOf(ATIRec));
pATI->CPIOBase = IOBase;
pATI->CPIODecoding = IODecoding;
pATI->PCIInfo = pVideo;
- if (!ATIMach64Detect(pATI, ChipType, Chip))
- {
+ if (!ATIMach64Detect(pATI, pVideo->chipType, Chip)) {
xfree(pATI);
return NULL;
}
@@ -324,93 +236,33 @@ ATIMach64Probe
* Determine VGA capability. VGA can always be enabled on integrated
* controllers. For the GX/CX, it's a board strap.
*/
- if (pATI->Chip >= ATI_CHIP_264CT)
- {
- pATI->VGAAdapter = ATI_ADAPTER_MACH64;
- }
- else
- {
+ if (pATI->Chip < ATI_CHIP_264CT) {
+ CARD32 IOValue;
+
IOValue = inr(CONFIG_STATUS64_0);
pATI->BusType = GetBits(IOValue, CFG_BUS_TYPE);
IOValue &= (CFG_VGA_EN | CFG_CHIP_EN);
+
if (pATI->Chip == ATI_CHIP_88800CX)
IOValue |= CFG_VGA_EN;
- if (IOValue == (CFG_VGA_EN | CFG_CHIP_EN))
- {
+
+ if (IOValue == (CFG_VGA_EN | CFG_CHIP_EN)) {
pATI->VGAAdapter = ATI_ADAPTER_MACH64;
pATI->CPIO_VGAWonder = 0x01CEU;
pATI->VGAOffset = 0x80U;
- }
- }
-
- return pATI;
-}
-
-/*
- * ATIAssignVGA --
- *
- * This function is called to associate a VGA interface with an accelerator.
- * This is done by temporarily configuring the accelerator to route VGA RAMDAC
- * I/O through the accelerator's RAMDAC. A value is then written through the
- * VGA DAC ports and a check is made to see if the same value shows up on the
- * accelerator side.
- */
-static void
-ATIAssignVGA(pciVideoPtr pVideo, ATIPtr pATI)
-{
- CARD32 DACCntl = inr(DAC_CNTL);
- CARD8 OldDACMask;
-
- /* Assume unassignable VGA */
- pATI->VGAAdapter = ATI_ADAPTER_NONE;
- if (pATI->CPIO_VGAWonder)
- pATI->CPIO_VGAWonder = 0;
-
- if (!(DACCntl & DAC_VGA_ADR_EN))
- outr(DAC_CNTL, DACCntl | DAC_VGA_ADR_EN);
-
- OldDACMask = inb(VGA_DAC_MASK);
-
- if (in8(M64_DAC_MASK) == OldDACMask) {
- outb(VGA_DAC_MASK, 0xA5U);
-
- if (in8(M64_DAC_MASK) == 0xA5U) {
- pATI->VGAAdapter = ATI_ADAPTER_MACH64;
- pATI->SharedVGA = TRUE;
} else
- pATI->CPIO_VGAWonder = 0;
-
- outb(VGA_DAC_MASK, OldDACMask);
+ pATI->VGAAdapter = ATI_ADAPTER_NONE;
+ } else
+ pATI->VGAAdapter = ATI_ADAPTER_MACH64;
+
+ /* Ensure that the VGA isn't in sleep mode. */
+ if (pATI->VGAAdapter != ATI_ADAPTER_NONE) {
+ outb(GENENA, 0x16U);
+ outb(GENVS, 0x01U);
+ outb(GENENA, 0x0EU);
}
- if (!(DACCntl & DAC_VGA_ADR_EN))
- outr(DAC_CNTL, DACCntl);
-}
-
-/*
- * ATIFindVGA --
- *
- * This function determines if a VGA associated with an ATI PCI adapter is
- * shareable.
- */
-static void
-ATIFindVGA(pciVideoPtr pVideo, ATIPtr *ppATI)
-{
- ATIPtr pATI = *ppATI;
-
- /*
- * An ATI PCI adapter has been detected at this point, and its VGA, if
- * any, is shareable. Ensure the VGA isn't in sleep mode.
- */
- outb(GENENA, 0x16U);
- outb(GENVS, 0x01U);
- outb(GENENA, 0x0EU);
-
- pATI = ATIVGAProbe(pATI);
- if (pATI->VGAAdapter == ATI_ADAPTER_NONE)
- return;
-
- ATIAssignVGA(pVideo, pATI);
+ return pATI;
}
#endif /* AVOID_CPIO */
@@ -537,11 +389,6 @@ ATIProbe(DriverPtr pDriver, int flags)
pATI->SharedAccelerator = TRUE;
pATI->PCIInfo = pVideo;
-
-#ifndef AVOID_CPIO
- if (pATI->VGAAdapter != ATI_ADAPTER_NONE)
- ATIFindVGA(pVideo, &pATI);
-#endif /* AVOID_CPIO */
}
xf86SetPciVideo(NULL, NONE);
@@ -581,27 +428,15 @@ ATIProbe(DriverPtr pDriver, int flags)
{
pATI = ATIPtrs[i];
-#ifndef AVOID_CPIO
-
- if ((pATI->Adapter != ATI_ADAPTER_VGA) &&
- ((pATI->Adapter != ATI_ADAPTER_8514A) ||
- ((pATI->VGAAdapter != ATI_ADAPTER_VGA) &&
- (pATI->VGAAdapter != ATI_ADAPTER_NONE))))
-
-#endif /* AVOID_CPIO */
-
- {
- ProbeSuccess = TRUE;
- pGDev = xf86AddDeviceToConfigure(ATI_DRIVER_NAME,
- pATI->PCIInfo, ATI_CHIPSET_ATI);
- if (pGDev)
- {
- /* Fill in additional information */
- pGDev->vendor = ATI_NAME;
- pGDev->chipset = (char *)ATIChipsetNames[ATI_CHIPSET_ATI];
- if (!pATI->PCIInfo)
- pGDev->busID = NULL;
- }
+ ProbeSuccess = TRUE;
+ pGDev = xf86AddDeviceToConfigure(ATI_DRIVER_NAME,
+ pATI->PCIInfo, ATI_CHIPSET_ATI);
+ if (pGDev) {
+ /* Fill in additional information */
+ pGDev->vendor = ATI_NAME;
+ pGDev->chipset = (char *)ATIChipsetNames[ATI_CHIPSET_ATI];
+ if (!pATI->PCIInfo)
+ pGDev->busID = NULL;
}
xfree(pATI);