summaryrefslogtreecommitdiff
path: root/src/ati.c
diff options
context:
space:
mode:
authorGeorge Sapountzis <gsap7@yahoo.gr>2007-08-28 16:01:12 +0300
committerGeorge Sapountzis <gsap7@yahoo.gr>2007-08-28 16:01:12 +0300
commit7b38d9a1209f87255e5bb0aefe46a363ce4fb6ef (patch)
tree981bce7b10ffe6dc3940cada74d558213208b51b /src/ati.c
parent2e3d43af1e5077cc61dd8668551a6291368d9ed2 (diff)
parent673f799729824f4439dd5f681f75dd5aab50947f (diff)
Merge branch 'master' into pci-rework
Conflicts: src/ati.c
Diffstat (limited to 'src/ati.c')
-rw-r--r--src/ati.c601
1 files changed, 556 insertions, 45 deletions
diff --git a/src/ati.c b/src/ati.c
index 803ac0bf..3f6cc0c2 100644
--- a/src/ati.c
+++ b/src/ati.c
@@ -60,14 +60,12 @@
#include "atipcirename.h"
#include "ati.h"
-#include "atichip.h"
+#include "atimodule.h"
#include "ativersion.h"
#include "atimach64probe.h"
#include "radeon_probe.h"
-#include "radeon_version.h"
#include "r128_probe.h"
-#include "r128_version.h"
/*
* ATIIdentify --
@@ -80,10 +78,13 @@ ATIIdentify
int flags
)
{
+ /*
+ * Only print chip families here, chip lists are printed when a subdriver
+ * is loaded.
+ */
xf86Msg(X_INFO, "%s: %s\n", ATI_NAME,
- "ATI driver (version " ATI_VERSION_NAME ") for chipset: mach64");
- R128Identify(flags);
- RADEONIdentify(flags);
+ "ATI driver wrapper (version " ATI_VERSION_NAME ") for chipsets: "
+ "mach64, rage128, radeon");
}
/*
@@ -99,61 +100,100 @@ ATIProbe
int flags
)
{
- pciVideoPtr pVideo, *xf86PciVideoInfo = xf86GetPciVideoInfo();
- Bool ProbeSuccess = FALSE;
+ pciVideoPtr pVideo;
+ pciVideoPtr *xf86PciVideoInfo;
Bool DoMach64 = FALSE;
Bool DoRage128 = FALSE, DoRadeon = FALSE;
- int i;
ATIChipType Chip;
- if (!(flags & PROBE_DETECT))
+ xf86PciVideoInfo = xf86GetPciVideoInfo();
+
+ if (xf86PciVideoInfo == NULL)
+ return FALSE;
+
+ while ((pVideo = *xf86PciVideoInfo++) != NULL)
{
- if (xf86MatchDevice(ATI_NAME, NULL) > 0)
+ if ((PCI_DEV_VENDOR_ID(pVideo) != PCI_VENDOR_ATI) ||
+ (PCI_DEV_DEVICE_ID(pVideo) == PCI_CHIP_MACH32))
+ continue;
+
+ /* Check for Rage128's, Radeon's and later adapters */
+ Chip = ATIChipID(PCI_DEV_DEVICE_ID(pVideo), PCI_DEV_REVISION(pVideo));
+ if (Chip <= ATI_CHIP_Mach64)
DoMach64 = TRUE;
- if (xf86MatchDevice(R128_NAME, NULL) > 0)
+ else if (Chip <= ATI_CHIP_Rage128)
DoRage128 = TRUE;
- if (xf86MatchDevice(RADEON_NAME, NULL) > 0)
+ else if (Chip <= ATI_CHIP_Radeon)
DoRadeon = TRUE;
}
- if (xf86PciVideoInfo)
+ /* Call Radeon driver probe */
+ if (DoRadeon)
{
- for (i = 0; (pVideo = xf86PciVideoInfo[i++]); )
+ pointer radeon = xf86LoadDrvSubModule(pDriver, "radeon");
+
+ if (!radeon)
{
- if ((PCI_DEV_VENDOR_ID(pVideo) != PCI_VENDOR_ATI) ||
- (PCI_DEV_DEVICE_ID(pVideo) == PCI_CHIP_MACH32))
- continue;
+ xf86Msg(X_ERROR,
+ ATI_NAME ": Failed to load \"radeon\" module.\n");
+ return FALSE;
+ }
- /* Check for Rage128's, Radeon's and later adapters */
- Chip = ATIChipID(PCI_DEV_DEVICE_ID(pVideo), PCI_DEV_REVISION(pVideo));
+ xf86LoaderReqSymLists(RADEONSymbols, NULL);
- if (Chip > ATI_CHIP_Mach64)
- {
- if (Chip <= ATI_CHIP_Rage128)
- DoRage128 = TRUE;
- else if (Chip <= ATI_CHIP_Radeon)
- DoRadeon = TRUE;
+ RADEONIdentify(flags);
- continue;
- }
+ if (RADEONProbe(pDriver, flags))
+ return TRUE;
- DoMach64 = TRUE;
+ xf86UnloadSubModule(radeon);
+ }
+
+ /* Call Rage 128 driver probe */
+ if (DoRage128)
+ {
+ pointer r128 = xf86LoadDrvSubModule(pDriver, "r128");
+
+ if (!r128)
+ {
+ xf86Msg(X_ERROR,
+ ATI_NAME ": Failed to load \"r128\" module.\n");
+ return FALSE;
}
+
+ xf86LoaderReqSymLists(R128Symbols, NULL);
+
+ R128Identify(flags);
+
+ if (R128Probe(pDriver, flags))
+ return TRUE;
+
+ xf86UnloadSubModule(r128);
}
/* Call Mach64 driver probe */
- if (DoMach64 && Mach64Probe(pDriver, flags))
- ProbeSuccess = TRUE;
+ if (DoMach64)
+ {
+ pointer atimisc = xf86LoadDrvSubModule(pDriver, "atimisc");
- /* Call Rage 128 driver probe */
- if (DoRage128 && R128Probe(pDriver, flags))
- ProbeSuccess = TRUE;
+ if (!atimisc)
+ {
+ xf86Msg(X_ERROR,
+ ATI_NAME ": Failed to load \"atimisc\" module.\n");
+ return FALSE;
+ }
- /* Call Radeon driver probe */
- if (DoRadeon && RADEONProbe(pDriver, flags))
- ProbeSuccess = TRUE;
+ xf86LoaderReqSymLists(ATISymbols, NULL);
+
+ Mach64Identify(flags);
+
+ if (Mach64Probe(pDriver, flags))
+ return TRUE;
- return ProbeSuccess;
+ xf86UnloadSubModule(atimisc);
+ }
+
+ return FALSE;
}
/*
@@ -161,22 +201,27 @@ ATIProbe
*
* Return recognised options that are intended for public consumption.
*/
-const OptionInfoRec *
+static const OptionInfoRec *
ATIAvailableOptions
(
int ChipId,
int BusId
)
{
- const OptionInfoRec *pOptions;
+ CARD16 ChipType = ChipId & 0xffff;
+ ATIChipType Chip;
- if ((pOptions = R128AvailableOptions(ChipId, BusId)))
- return pOptions;
+ /* Probe should have loaded the appropriate subdriver by this point */
- if ((pOptions = RADEONAvailableOptions(ChipId, BusId)))
- return pOptions;
+ Chip = ATIChipID(ChipType, 0x0); /* chip revision is don't care */
+ if (Chip <= ATI_CHIP_Mach64)
+ return Mach64AvailableOptions(ChipId, BusId);
+ else if (Chip <= ATI_CHIP_Rage128)
+ return R128AvailableOptions(ChipId, BusId);
+ else if (Chip <= ATI_CHIP_Radeon)
+ return RADEONAvailableOptions(ChipId, BusId);
- return Mach64AvailableOptions(ChipId, BusId);
+ return NULL;
}
/* The root of all evil... */
@@ -190,3 +235,469 @@ _X_EXPORT DriverRec ATI =
NULL,
0
};
+
+/*
+ * Chip-related definitions.
+ */
+const char *ATIChipNames[] =
+{
+ "Unknown",
+ "ATI 88800GX-C",
+ "ATI 88800GX-D",
+ "ATI 88800GX-E",
+ "ATI 88800GX-F",
+ "ATI 88800GX",
+ "ATI 88800CX",
+ "ATI 264CT",
+ "ATI 264ET",
+ "ATI 264VT",
+ "ATI 3D Rage",
+ "ATI 264VT-B",
+ "ATI 3D Rage II",
+ "ATI 264VT3",
+ "ATI 3D Rage II+DVD",
+ "ATI 3D Rage LT",
+ "ATI 264VT4",
+ "ATI 3D Rage IIc",
+ "ATI 3D Rage Pro",
+ "ATI 3D Rage LT Pro",
+ "ATI 3D Rage XL or XC",
+ "ATI 3D Rage Mobility",
+ "ATI unknown Mach64",
+ "ATI Rage 128 GL",
+ "ATI Rage 128 VR",
+ "ATI Rage 128 Pro GL",
+ "ATI Rage 128 Pro VR",
+ "ATI Rage 128 Pro ULTRA",
+ "ATI Rage 128 Mobility M3",
+ "ATI Rage 128 Mobility M4",
+ "ATI unknown Rage 128"
+ "ATI Radeon 7200",
+ "ATI Radeon 7000 (VE)",
+ "ATI Radeon Mobility M6",
+ "ATI Radeon IGP320",
+ "ATI Radeon IGP330/340/350",
+ "ATI Radeon 7000 IGP",
+ "ATI Radeon 7500",
+ "ATI Radeon Mobility M7",
+ "ATI Radeon 8500/9100",
+ "ATI Radeon 9000",
+ "ATI Radeon Mobility M9",
+ "ATI Radeon 9100 IGP",
+ "ATI Radeon 9200 IGP",
+ "ATI Radeon 9200",
+ "ATI Radeon Mobility M9+",
+ "ATI Radeon 9700/9500",
+ "ATI Radeon 9600/9550",
+ "ATI Radeon 9800",
+ "ATI Radeon 9800XT",
+ "ATI Radeon X300/X550/M22",
+ "ATI Radeon X600/X550/M24",
+ "ATI Radeon X800/M18 AGP",
+ "ATI Radeon X800/M28 PCIE",
+ "ATI Radeon X800XL PCIE",
+ "ATI Radeon X850 PCIE",
+ "ATI Radeon X850 AGP",
+ "ATI Radeon X700",
+ "ATI Xpress 200"
+ "ATI unknown Radeon",
+ "ATI Rage HDTV"
+};
+
+#include "atichip.h"
+
+/*
+ * ATIChipID --
+ *
+ * This returns the ATI_CHIP_* value (generally) associated with a particular
+ * ChipID/ChipRev combination.
+ */
+ATIChipType
+ATIChipID
+(
+ const CARD16 ChipID,
+ const CARD8 ChipRev
+)
+{
+ switch (ChipID)
+ {
+ case OldChipID('G', 'X'): case NewChipID('G', 'X'):
+ switch (ChipRev)
+ {
+ case 0x00U:
+ return ATI_CHIP_88800GXC;
+
+ case 0x01U:
+ return ATI_CHIP_88800GXD;
+
+ case 0x02U:
+ return ATI_CHIP_88800GXE;
+
+ case 0x03U:
+ return ATI_CHIP_88800GXF;
+
+ default:
+ return ATI_CHIP_88800GX;
+ }
+
+ case OldChipID('C', 'X'): case NewChipID('C', 'X'):
+ return ATI_CHIP_88800CX;
+
+ case OldChipID('C', 'T'): case NewChipID('C', 'T'):
+ return ATI_CHIP_264CT;
+
+ case OldChipID('E', 'T'): case NewChipID('E', 'T'):
+ return ATI_CHIP_264ET;
+
+ case OldChipID('V', 'T'): case NewChipID('V', 'T'):
+ /* For simplicity, ignore ChipID discrepancy that can occur here */
+ if (!(ChipRev & GetBits(CFG_CHIP_VERSION, CFG_CHIP_REV)))
+ return ATI_CHIP_264VT;
+ return ATI_CHIP_264VTB;
+
+ case OldChipID('G', 'T'): case NewChipID('G', 'T'):
+ if (!(ChipRev & GetBits(CFG_CHIP_VERSION, CFG_CHIP_REV)))
+ return ATI_CHIP_264GT;
+ return ATI_CHIP_264GTB;
+
+ case OldChipID('V', 'U'): case NewChipID('V', 'U'):
+ return ATI_CHIP_264VT3;
+
+ case OldChipID('G', 'U'): case NewChipID('G', 'U'):
+ return ATI_CHIP_264GTDVD;
+
+ case OldChipID('L', 'G'): case NewChipID('L', 'G'):
+ return ATI_CHIP_264LT;
+
+ case OldChipID('V', 'V'): case NewChipID('V', 'V'):
+ return ATI_CHIP_264VT4;
+
+ case OldChipID('G', 'V'): case NewChipID('G', 'V'):
+ case OldChipID('G', 'W'): case NewChipID('G', 'W'):
+ case OldChipID('G', 'Y'): case NewChipID('G', 'Y'):
+ case OldChipID('G', 'Z'): case NewChipID('G', 'Z'):
+ return ATI_CHIP_264GT2C;
+
+ case OldChipID('G', 'B'): case NewChipID('G', 'B'):
+ case OldChipID('G', 'D'): case NewChipID('G', 'D'):
+ case OldChipID('G', 'I'): case NewChipID('G', 'I'):
+ case OldChipID('G', 'P'): case NewChipID('G', 'P'):
+ case OldChipID('G', 'Q'): case NewChipID('G', 'Q'):
+ return ATI_CHIP_264GTPRO;
+
+ case OldChipID('L', 'B'): case NewChipID('L', 'B'):
+ case OldChipID('L', 'D'): case NewChipID('L', 'D'):
+ case OldChipID('L', 'I'): case NewChipID('L', 'I'):
+ case OldChipID('L', 'P'): case NewChipID('L', 'P'):
+ case OldChipID('L', 'Q'): case NewChipID('L', 'Q'):
+ return ATI_CHIP_264LTPRO;
+
+ case OldChipID('G', 'L'): case NewChipID('G', 'L'):
+ case OldChipID('G', 'M'): case NewChipID('G', 'M'):
+ case OldChipID('G', 'N'): case NewChipID('G', 'N'):
+ case OldChipID('G', 'O'): case NewChipID('G', 'O'):
+ case OldChipID('G', 'R'): case NewChipID('G', 'R'):
+ case OldChipID('G', 'S'): case NewChipID('G', 'S'):
+ return ATI_CHIP_264XL;
+
+ case OldChipID('L', 'M'): case NewChipID('L', 'M'):
+ case OldChipID('L', 'N'): case NewChipID('L', 'N'):
+ case OldChipID('L', 'R'): case NewChipID('L', 'R'):
+ case OldChipID('L', 'S'): case NewChipID('L', 'S'):
+ return ATI_CHIP_MOBILITY;
+
+ case NewChipID('R', 'E'):
+ case NewChipID('R', 'F'):
+ case NewChipID('R', 'G'):
+ case NewChipID('S', 'K'):
+ case NewChipID('S', 'L'):
+ case NewChipID('S', 'M'):
+ /* "SN" is listed as ATI_CHIP_RAGE128_4X in ATI docs */
+ case NewChipID('S', 'N'):
+ return ATI_CHIP_RAGE128GL;
+
+ case NewChipID('R', 'K'):
+ case NewChipID('R', 'L'):
+ /*
+ * ATI documentation lists SE/SF/SG under both ATI_CHIP_RAGE128VR
+ * and ATI_CHIP_RAGE128_4X, and lists SH/SK/SL under Rage 128 4X only.
+ * I'm stuffing them here for now until this can be clarified as ATI
+ * documentation doesn't mention their details. <mharris@redhat.com>
+ */
+ case NewChipID('S', 'E'):
+ case NewChipID('S', 'F'):
+ case NewChipID('S', 'G'):
+ case NewChipID('S', 'H'):
+ return ATI_CHIP_RAGE128VR;
+
+ /* case NewChipID('S', 'H'): */
+ /* case NewChipID('S', 'K'): */
+ /* case NewChipID('S', 'L'): */
+ /* case NewChipID('S', 'N'): */
+ /* return ATI_CHIP_RAGE128_4X; */
+
+ case NewChipID('P', 'A'):
+ case NewChipID('P', 'B'):
+ case NewChipID('P', 'C'):
+ case NewChipID('P', 'D'):
+ case NewChipID('P', 'E'):
+ case NewChipID('P', 'F'):
+ return ATI_CHIP_RAGE128PROGL;
+
+ case NewChipID('P', 'G'):
+ case NewChipID('P', 'H'):
+ case NewChipID('P', 'I'):
+ case NewChipID('P', 'J'):
+ case NewChipID('P', 'K'):
+ case NewChipID('P', 'L'):
+ case NewChipID('P', 'M'):
+ case NewChipID('P', 'N'):
+ case NewChipID('P', 'O'):
+ case NewChipID('P', 'P'):
+ case NewChipID('P', 'Q'):
+ case NewChipID('P', 'R'):
+ case NewChipID('P', 'S'):
+ case NewChipID('P', 'T'):
+ case NewChipID('P', 'U'):
+ case NewChipID('P', 'V'):
+ case NewChipID('P', 'W'):
+ case NewChipID('P', 'X'):
+ return ATI_CHIP_RAGE128PROVR;
+
+ case NewChipID('T', 'F'):
+ case NewChipID('T', 'L'):
+ case NewChipID('T', 'R'):
+ case NewChipID('T', 'S'):
+ case NewChipID('T', 'T'):
+ case NewChipID('T', 'U'):
+ return ATI_CHIP_RAGE128PROULTRA;
+
+ case NewChipID('L', 'E'):
+ case NewChipID('L', 'F'):
+ /*
+ * "LK" and "LL" are not in any ATI documentation I can find
+ * - mharris
+ */
+ case NewChipID('L', 'K'):
+ case NewChipID('L', 'L'):
+ return ATI_CHIP_RAGE128MOBILITY3;
+
+ case NewChipID('M', 'F'):
+ case NewChipID('M', 'L'):
+ return ATI_CHIP_RAGE128MOBILITY4;
+
+ case NewChipID('Q', 'D'):
+ case NewChipID('Q', 'E'):
+ case NewChipID('Q', 'F'):
+ case NewChipID('Q', 'G'):
+ return ATI_CHIP_RADEON;
+
+ case NewChipID('Q', 'Y'):
+ case NewChipID('Q', 'Z'):
+ case NewChipID('Q', '^'):
+ return ATI_CHIP_RADEONVE;
+
+ case NewChipID('L', 'Y'):
+ case NewChipID('L', 'Z'):
+ return ATI_CHIP_RADEONMOBILITY6;
+
+ case NewChipID('A', '6'):
+ case NewChipID('C', '6'):
+ return ATI_CHIP_RS100;
+
+ case NewChipID('A', '7'):
+ case NewChipID('C', '7'):
+ return ATI_CHIP_RS200;
+
+ case NewChipID('D', '7'):
+ case NewChipID('B', '7'):
+ return ATI_CHIP_RS250;
+
+ case NewChipID('L', 'W'):
+ case NewChipID('L', 'X'):
+ return ATI_CHIP_RADEONMOBILITY7;
+
+ case NewChipID('Q', 'H'):
+ case NewChipID('Q', 'I'):
+ case NewChipID('Q', 'J'):
+ case NewChipID('Q', 'K'):
+ case NewChipID('Q', 'L'):
+ case NewChipID('Q', 'M'):
+ case NewChipID('Q', 'N'):
+ case NewChipID('Q', 'O'):
+ case NewChipID('Q', 'h'):
+ case NewChipID('Q', 'i'):
+ case NewChipID('Q', 'j'):
+ case NewChipID('Q', 'k'):
+ case NewChipID('Q', 'l'):
+ case NewChipID('B', 'B'):
+ return ATI_CHIP_R200;
+
+ case NewChipID('Q', 'W'):
+ case NewChipID('Q', 'X'):
+ return ATI_CHIP_RV200;
+
+ case NewChipID('I', 'f'):
+ case NewChipID('I', 'g'):
+ return ATI_CHIP_RV250;
+
+ case NewChipID('L', 'd'):
+ case NewChipID('L', 'f'):
+ case NewChipID('L', 'g'):
+ return ATI_CHIP_RADEONMOBILITY9;
+
+ case NewChipID('X', '4'):
+ case NewChipID('X', '5'):
+ return ATI_CHIP_RS300;
+
+ case NewChipID('x', '4'):
+ case NewChipID('x', '5'):
+ return ATI_CHIP_RS350;
+
+ case NewChipID('Y', '\''):
+ case NewChipID('Y', 'a'):
+ case NewChipID('Y', 'b'):
+ case NewChipID('Y', 'd'):
+ case NewChipID('Y', 'e'):
+ return ATI_CHIP_RV280;
+
+ case NewChipID('\\', 'a'):
+ case NewChipID('\\', 'c'):
+ return ATI_CHIP_RADEONMOBILITY9PLUS;
+
+ case NewChipID('A', 'D'):
+ case NewChipID('A', 'E'):
+ case NewChipID('A', 'F'):
+ case NewChipID('A', 'G'):
+ case NewChipID('N', 'D'):
+ case NewChipID('N', 'E'):
+ case NewChipID('N', 'F'):
+ case NewChipID('N', 'G'):
+ return ATI_CHIP_R300;
+
+ case NewChipID('A', 'H'):
+ case NewChipID('A', 'I'):
+ case NewChipID('A', 'J'):
+ case NewChipID('A', 'K'):
+ case NewChipID('N', 'H'):
+ case NewChipID('N', 'I'):
+ case NewChipID('N', 'K'):
+ return ATI_CHIP_R350;
+
+ case NewChipID('A', 'P'):
+ case NewChipID('A', 'Q'):
+ case NewChipID('A', 'R'):
+ case NewChipID('A', 'S'):
+ case NewChipID('A', 'T'):
+ case NewChipID('A', 'U'):
+ case NewChipID('A', 'V'):
+ case NewChipID('N', 'P'):
+ case NewChipID('N', 'Q'):
+ case NewChipID('N', 'R'):
+ case NewChipID('N', 'S'):
+ case NewChipID('N', 'T'):
+ case NewChipID('N', 'V'):
+ return ATI_CHIP_RV350;
+
+ case NewChipID('N', 'J'):
+ return ATI_CHIP_R360;
+
+ case NewChipID('[', '\''):
+ case NewChipID('[', 'b'):
+ case NewChipID('[', 'c'):
+ case NewChipID('[', 'd'):
+ case NewChipID('[', 'e'):
+ case NewChipID('T', '\''):
+ case NewChipID('T', 'b'):
+ case NewChipID('T', 'd'):
+ return ATI_CHIP_RV370;
+
+ case NewChipID('>', 'P'):
+ case NewChipID('>', 'T'):
+ case NewChipID('1', 'P'):
+ case NewChipID('1', 'R'):
+ case NewChipID('1', 'T'):
+ return ATI_CHIP_RV380;
+
+ case NewChipID('J', 'H'):
+ case NewChipID('J', 'I'):
+ case NewChipID('J', 'J'):
+ case NewChipID('J', 'K'):
+ case NewChipID('J', 'L'):
+ case NewChipID('J', 'M'):
+ case NewChipID('J', 'N'):
+ case NewChipID('J', 'O'):
+ case NewChipID('J', 'P'):
+ case NewChipID('J', 'T'):
+ return ATI_CHIP_R420;
+
+ case NewChipID('U', 'H'):
+ case NewChipID('U', 'I'):
+ case NewChipID('U', 'J'):
+ case NewChipID('U', 'K'):
+ case NewChipID('U', 'P'):
+ case NewChipID('U', 'Q'):
+ case NewChipID('U', 'R'):
+ case NewChipID('U', 'T'):
+ case NewChipID(']', 'W'):
+ /* those are m28, not 100% certain they are r423 could
+ be r480 but not r430 as their pci id names indicate... */
+ case NewChipID(']', 'H'):
+ case NewChipID(']', 'I'):
+ case NewChipID(']', 'J'):
+ return ATI_CHIP_R423;
+
+ case NewChipID('U', 'L'):
+ case NewChipID('U', 'M'):
+ case NewChipID('U', 'N'):
+ case NewChipID('U', 'O'):
+ return ATI_CHIP_R430;
+
+ case NewChipID(']', 'L'):
+ case NewChipID(']', 'M'):
+ case NewChipID(']', 'N'):
+ case NewChipID(']', 'O'):
+ case NewChipID(']', 'P'):
+ case NewChipID(']', 'R'):
+ return ATI_CHIP_R480;
+
+ case NewChipID('K', 'I'):
+ case NewChipID('K', 'J'):
+ case NewChipID('K', 'K'):
+ case NewChipID('K', 'L'):
+ return ATI_CHIP_R481;
+
+ case NewChipID('^', 'H'):
+ case NewChipID('^', 'J'):
+ case NewChipID('^', 'K'):
+ case NewChipID('^', 'L'):
+ case NewChipID('^', 'M'):
+ case NewChipID('^', 'O'):
+ case NewChipID('V', 'J'):
+ case NewChipID('V', 'K'):
+ case NewChipID('V', 'O'):
+ case NewChipID('V', 'R'):
+ case NewChipID('V', 'S'):
+ return ATI_CHIP_RV410;
+
+ case NewChipID('Z', 'A'):
+ case NewChipID('Z', 'B'):
+ case NewChipID('Z', 'a'):
+ case NewChipID('Z', 'b'):
+ case NewChipID('Y', 'T'):
+ case NewChipID('Y', 'U'):
+ case NewChipID('Y', 't'):
+ case NewChipID('Y', 'u'):
+ return ATI_CHIP_RS400;
+
+ case NewChipID('H', 'D'):
+ return ATI_CHIP_HDTV;
+
+ default:
+ /*
+ * Treat anything else as an unknown Radeon. Please keep the above
+ * up-to-date however, as it serves as a central chip list.
+ */
+ return ATI_CHIP_Radeon;
+ }
+}