summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJerome Glisse <jglisse@redhat.com>2011-10-20 14:17:14 -0400
committerJerome Glisse <jglisse@redhat.com>2011-10-20 15:09:10 -0400
commit856583dbca9319c77fed40daa9956e81a0068f9e (patch)
tree72a5c2cb886cd7e4b56e73a467ef9c2e33ce2e8b
parentf6f1b4f7789cfef763c063e671b76b60be8bdd8e (diff)
radeon/kms: fallback to vesa if GPU is not supported by UMS
For GPU not supported by UMS, test in probe so that we properly fallback to vesa. Signed-off-by: Jerome Glisse <jglisse@redhat.com> Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r--src/radeon.h66
-rw-r--r--src/radeon_probe.c29
-rw-r--r--src/radeon_probe.h66
3 files changed, 94 insertions, 67 deletions
diff --git a/src/radeon.h b/src/radeon.h
index f66ffd01..50ce62fc 100644
--- a/src/radeon.h
+++ b/src/radeon.h
@@ -313,62 +313,6 @@ typedef struct {
DisplayModePtr mode;
} RADEONFBLayout;
-typedef enum {
- CHIP_FAMILY_UNKNOW,
- CHIP_FAMILY_LEGACY,
- CHIP_FAMILY_RADEON,
- CHIP_FAMILY_RV100,
- CHIP_FAMILY_RS100, /* U1 (IGP320M) or A3 (IGP320)*/
- CHIP_FAMILY_RV200,
- CHIP_FAMILY_RS200, /* U2 (IGP330M/340M/350M) or A4 (IGP330/340/345/350), RS250 (IGP 7000) */
- CHIP_FAMILY_R200,
- CHIP_FAMILY_RV250,
- CHIP_FAMILY_RS300, /* RS300/RS350 */
- CHIP_FAMILY_RV280,
- CHIP_FAMILY_R300,
- CHIP_FAMILY_R350,
- CHIP_FAMILY_RV350,
- CHIP_FAMILY_RV380, /* RV370/RV380/M22/M24 */
- CHIP_FAMILY_R420, /* R420/R423/M18 */
- CHIP_FAMILY_RV410, /* RV410, M26 */
- CHIP_FAMILY_RS400, /* xpress 200, 200m (RS400) Intel */
- CHIP_FAMILY_RS480, /* xpress 200, 200m (RS410/480/482/485) AMD */
- CHIP_FAMILY_RV515, /* rv515 */
- CHIP_FAMILY_R520, /* r520 */
- CHIP_FAMILY_RV530, /* rv530 */
- CHIP_FAMILY_R580, /* r580 */
- CHIP_FAMILY_RV560, /* rv560 */
- CHIP_FAMILY_RV570, /* rv570 */
- CHIP_FAMILY_RS600,
- CHIP_FAMILY_RS690,
- CHIP_FAMILY_RS740,
- CHIP_FAMILY_R600, /* r600 */
- CHIP_FAMILY_RV610,
- CHIP_FAMILY_RV630,
- CHIP_FAMILY_RV670,
- CHIP_FAMILY_RV620,
- CHIP_FAMILY_RV635,
- CHIP_FAMILY_RS780,
- CHIP_FAMILY_RS880,
- CHIP_FAMILY_RV770, /* r700 */
- CHIP_FAMILY_RV730,
- CHIP_FAMILY_RV710,
- CHIP_FAMILY_RV740,
- CHIP_FAMILY_CEDAR, /* evergreen */
- CHIP_FAMILY_REDWOOD,
- CHIP_FAMILY_JUNIPER,
- CHIP_FAMILY_CYPRESS,
- CHIP_FAMILY_HEMLOCK,
- CHIP_FAMILY_PALM,
- CHIP_FAMILY_SUMO,
- CHIP_FAMILY_SUMO2,
- CHIP_FAMILY_BARTS,
- CHIP_FAMILY_TURKS,
- CHIP_FAMILY_CAICOS,
- CHIP_FAMILY_CAYMAN,
- CHIP_FAMILY_LAST
-} RADEONChipFamily;
-
#define IS_RV100_VARIANT ((info->ChipFamily == CHIP_FAMILY_RV100) || \
(info->ChipFamily == CHIP_FAMILY_RV200) || \
(info->ChipFamily == CHIP_FAMILY_RS100) || \
@@ -501,16 +445,6 @@ struct radeon_exa_pixmap_priv {
Bool bo_mapped;
};
-typedef struct {
- uint32_t pci_device_id;
- RADEONChipFamily chip_family;
- int mobility;
- int igp;
- int nocrtc2;
- int nointtvout;
- int singledac;
-} RADEONCardInfo;
-
#define RADEON_2D_EXA_COPY 1
#define RADEON_2D_EXA_SOLID 2
diff --git a/src/radeon_probe.c b/src/radeon_probe.c
index 78190272..26dec285 100644
--- a/src/radeon_probe.c
+++ b/src/radeon_probe.c
@@ -59,9 +59,31 @@
#include "radeon_pci_chipset_gen.h"
+#include "radeon_chipinfo_gen.h"
#ifdef XSERVER_LIBPCIACCESS
#include "radeon_pci_device_match_gen.h"
+
+static Bool radeon_ums_supported(ScrnInfoPtr pScrn, struct pci_device *pci_dev)
+{
+ unsigned family = 0, i;
+
+ for (i = 0; i < sizeof(RADEONCards) / sizeof(RADEONCardInfo); i++) {
+ if (pci_dev->device_id == RADEONCards[i].pci_device_id) {
+ family = RADEONCards[i].chip_family;
+ break;
+ }
+ }
+
+ if (family >= CHIP_FAMILY_SUMO) {
+ xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 0,
+ "GPU only supported with KMS, using vesa instead.\n");
+ return FALSE;
+ }
+ return TRUE;
+}
+#else
+#define radeon_ums_supported(x, y) TRUE
#endif
#ifndef XSERVER_LIBPCIACCESS
@@ -131,8 +153,13 @@ radeon_get_scrninfo(int entity_num, void *pci_dev)
return FALSE;
if (pci_dev) {
- if (radeon_kernel_mode_enabled(pScrn, pci_dev))
+ if (radeon_kernel_mode_enabled(pScrn, pci_dev)) {
kms = 1;
+ } else {
+ if (!radeon_ums_supported(pScrn, pci_dev)) {
+ return FALSE;
+ }
+ }
}
pScrn->driverVersion = RADEON_VERSION_CURRENT;
diff --git a/src/radeon_probe.h b/src/radeon_probe.h
index d97bb06d..94f6d7d1 100644
--- a/src/radeon_probe.h
+++ b/src/radeon_probe.h
@@ -55,6 +55,72 @@ extern DriverRec RADEON;
#define RADEON_MAX_CRTC 6
#define RADEON_MAX_BIOS_CONNECTOR 16
+typedef enum {
+ CHIP_FAMILY_UNKNOW,
+ CHIP_FAMILY_LEGACY,
+ CHIP_FAMILY_RADEON,
+ CHIP_FAMILY_RV100,
+ CHIP_FAMILY_RS100, /* U1 (IGP320M) or A3 (IGP320)*/
+ CHIP_FAMILY_RV200,
+ CHIP_FAMILY_RS200, /* U2 (IGP330M/340M/350M) or A4 (IGP330/340/345/350), RS250 (IGP 7000) */
+ CHIP_FAMILY_R200,
+ CHIP_FAMILY_RV250,
+ CHIP_FAMILY_RS300, /* RS300/RS350 */
+ CHIP_FAMILY_RV280,
+ CHIP_FAMILY_R300,
+ CHIP_FAMILY_R350,
+ CHIP_FAMILY_RV350,
+ CHIP_FAMILY_RV380, /* RV370/RV380/M22/M24 */
+ CHIP_FAMILY_R420, /* R420/R423/M18 */
+ CHIP_FAMILY_RV410, /* RV410, M26 */
+ CHIP_FAMILY_RS400, /* xpress 200, 200m (RS400) Intel */
+ CHIP_FAMILY_RS480, /* xpress 200, 200m (RS410/480/482/485) AMD */
+ CHIP_FAMILY_RV515, /* rv515 */
+ CHIP_FAMILY_R520, /* r520 */
+ CHIP_FAMILY_RV530, /* rv530 */
+ CHIP_FAMILY_R580, /* r580 */
+ CHIP_FAMILY_RV560, /* rv560 */
+ CHIP_FAMILY_RV570, /* rv570 */
+ CHIP_FAMILY_RS600,
+ CHIP_FAMILY_RS690,
+ CHIP_FAMILY_RS740,
+ CHIP_FAMILY_R600, /* r600 */
+ CHIP_FAMILY_RV610,
+ CHIP_FAMILY_RV630,
+ CHIP_FAMILY_RV670,
+ CHIP_FAMILY_RV620,
+ CHIP_FAMILY_RV635,
+ CHIP_FAMILY_RS780,
+ CHIP_FAMILY_RS880,
+ CHIP_FAMILY_RV770, /* r700 */
+ CHIP_FAMILY_RV730,
+ CHIP_FAMILY_RV710,
+ CHIP_FAMILY_RV740,
+ CHIP_FAMILY_CEDAR, /* evergreen */
+ CHIP_FAMILY_REDWOOD,
+ CHIP_FAMILY_JUNIPER,
+ CHIP_FAMILY_CYPRESS,
+ CHIP_FAMILY_HEMLOCK,
+ CHIP_FAMILY_PALM,
+ CHIP_FAMILY_SUMO,
+ CHIP_FAMILY_SUMO2,
+ CHIP_FAMILY_BARTS,
+ CHIP_FAMILY_TURKS,
+ CHIP_FAMILY_CAICOS,
+ CHIP_FAMILY_CAYMAN,
+ CHIP_FAMILY_LAST
+} RADEONChipFamily;
+
+typedef struct {
+ uint32_t pci_device_id;
+ RADEONChipFamily chip_family;
+ int mobility;
+ int igp;
+ int nocrtc2;
+ int nointtvout;
+ int singledac;
+} RADEONCardInfo;
+
typedef enum
{
MT_UNKNOWN = -1,