geode_driver.c revision 04007eba
1f29dbc25Smrg/* 2f29dbc25Smrg * Copyright (c) 2006 Avanced Micro Devices, Inc. 3f29dbc25Smrg * 4f29dbc25Smrg * Permission is hereby granted, free of charge, to any person obtaining a 5f29dbc25Smrg * copy of this software and associated documentation files (the "Software"), 6f29dbc25Smrg * to deal in the Software without restriction, including without limitation 7f29dbc25Smrg * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8f29dbc25Smrg * and/or sell copies of the Software, and to permit persons to whom the 9f29dbc25Smrg * Software is furnished to do so, subject to the following conditions: 10f29dbc25Smrg * 11f29dbc25Smrg * The above copyright notice and this permission notice shall be included in 12f29dbc25Smrg * all copies or substantial portions of the Software. 13f29dbc25Smrg * 14f29dbc25Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15f29dbc25Smrg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16f29dbc25Smrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17f29dbc25Smrg * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18f29dbc25Smrg * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 19f29dbc25Smrg * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 20f29dbc25Smrg * DEALINGS IN THE SOFTWARE. 21f29dbc25Smrg * 22f29dbc25Smrg * Neither the name of the Advanced Micro Devices, Inc. nor the names of its 23f29dbc25Smrg * contributors may be used to endorse or promote products derived from this 24f29dbc25Smrg * software without specific prior written permission. 25f29dbc25Smrg */ 26f29dbc25Smrg 27f29dbc25Smrg/* 28f29dbc25Smrg * File Contents: This is the main module configures the interfacing 29f29dbc25Smrg * with the X server. The individual modules will be 30f29dbc25Smrg * loaded based upon the options selected from the 31f29dbc25Smrg * XF86Config. This file also has modules for finding 32f29dbc25Smrg * supported modes, turning on the modes based on options. 33f29dbc25Smrg * 34f29dbc25Smrg * Project: Amd Xfree Frame buffer device driver. 35f29dbc25Smrg * 36f29dbc25Smrg */ 37f29dbc25Smrg 38f29dbc25Smrg#ifdef HAVE_CONFIG_H 39f29dbc25Smrg#include "config.h" 40f29dbc25Smrg#endif 41f29dbc25Smrg 42f29dbc25Smrg/* Includes that are used by all drivers */ 43f29dbc25Smrg#include "xf86.h" 44f29dbc25Smrg#include "xf86_OSproc.h" 45f29dbc25Smrg#if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) < 6 46f29dbc25Smrg#include "xf86Resources.h" 47f29dbc25Smrg#endif 48f29dbc25Smrg#include "compiler.h" 49f29dbc25Smrg#include "xf86PciInfo.h" 50f29dbc25Smrg#include "xf86Pci.h" 51f29dbc25Smrg#include "xf86cmap.h" 52f29dbc25Smrg 53f29dbc25Smrg#include "geode.h" 54f29dbc25Smrg 55f29dbc25Smrg#define RC_MAX_DEPTH 24 56f29dbc25Smrg 57f29dbc25Smrg#include "fb.h" 58f29dbc25Smrg 59f29dbc25Smrg/* Machine independent stuff */ 60f29dbc25Smrg#include "mipointer.h" 61f29dbc25Smrg#include "micmap.h" 62f29dbc25Smrg#include "vgaHW.h" 63f29dbc25Smrg#include "vbe.h" 64f29dbc25Smrg 65f29dbc25Smrg#ifdef DPMSExtension 66f29dbc25Smrg#include "globals.h" 67f29dbc25Smrg#include "opaque.h" 68f29dbc25Smrg#ifdef HAVE_XEXTPROTO_71 69f29dbc25Smrg#include <X11/extensions/dpmsconst.h> 70f29dbc25Smrg#else 71f29dbc25Smrg#define DPMS_SERVER 72f29dbc25Smrg#include <X11/extensions/dpms.h> 73f29dbc25Smrg#endif 74f29dbc25Smrg 7504007ebaSmrg#endif /* DPMSExtension */ 76f29dbc25Smrg 77f29dbc25Smrg/* A few things all drivers should have */ 78f29dbc25Smrg#define GEODE_NAME "GEODE" 79f29dbc25Smrg#define GEODE_DRIVER_NAME "geode" 80f29dbc25Smrg#define GEODE_VERSION 4000 81f29dbc25Smrg#define GEODE_VERSION_MAJOR PACKAGE_VERSION_MAJOR 82f29dbc25Smrg#define GEODE_VERSION_MINOR PACKAGE_VERSION_MINOR 83f29dbc25Smrg#define GEODE_VERSION_PATCH PACKAGE_VERSION_PATCHLEVEL 84f29dbc25Smrg 85f29dbc25Smrg/* Forward definitions */ 86f29dbc25Smrgstatic const OptionInfoRec *AmdAvailableOptions(int chipid, int busid); 87f29dbc25Smrgstatic void AmdIdentify(int); 88f29dbc25Smrg 89f29dbc25Smrg#ifdef XSERVER_LIBPCIACCESS 90f29dbc25Smrgstatic Bool AmdPciProbe(DriverPtr, int, struct pci_device *, intptr_t); 91f29dbc25Smrg#else 92f29dbc25Smrgstatic Bool AmdProbe(DriverPtr, int); 93f29dbc25Smrg#endif 94f29dbc25Smrg 95f29dbc25Smrg#ifdef XSERVER_LIBPCIACCESS 96f29dbc25Smrgstatic const struct pci_id_match amdDeviceMatch[] = { 97f29dbc25Smrg {PCI_VENDOR_ID_NS, PCI_CHIP_GEODEGX, PCI_MATCH_ANY, PCI_MATCH_ANY, 0, 0, 9804007ebaSmrg 0}, 99f29dbc25Smrg {PCI_VENDOR_ID_AMD, PCI_CHIP_GEODELX, PCI_MATCH_ANY, PCI_MATCH_ANY, 0, 0, 10004007ebaSmrg 0}, 101f29dbc25Smrg {0, 0, 0} 102f29dbc25Smrg}; 10304007ebaSmrg#endif /* XSERVER_LIBPCIACCESS */ 104f29dbc25Smrg 105f29dbc25Smrg/* driver record contains the functions needed by the server after loading 106f29dbc25Smrg * the driver module. 107f29dbc25Smrg */ 108f29dbc25Smrg_X_EXPORT DriverRec AMD = { 109f29dbc25Smrg GEODE_VERSION, 110f29dbc25Smrg "amd", 111f29dbc25Smrg AmdIdentify, 112f29dbc25Smrg#ifdef XSERVER_LIBPCIACCESS 113f29dbc25Smrg NULL, 114f29dbc25Smrg#else 115f29dbc25Smrg AmdProbe, 116f29dbc25Smrg#endif 117f29dbc25Smrg AmdAvailableOptions, 118f29dbc25Smrg NULL, 119f29dbc25Smrg 0, 120f29dbc25Smrg NULL, 121f29dbc25Smrg#ifdef XSERVER_LIBPCIACCESS 122f29dbc25Smrg amdDeviceMatch, 123f29dbc25Smrg AmdPciProbe 124f29dbc25Smrg#endif 125f29dbc25Smrg}; 126f29dbc25Smrg 127f29dbc25Smrg_X_EXPORT DriverRec GEODE = { 128f29dbc25Smrg GEODE_VERSION, 129f29dbc25Smrg "geode", 130f29dbc25Smrg AmdIdentify, 131f29dbc25Smrg#ifdef XSERVER_LIBPCIACCESS 132f29dbc25Smrg NULL, 133f29dbc25Smrg#else 134f29dbc25Smrg AmdProbe, 135f29dbc25Smrg#endif 136f29dbc25Smrg AmdAvailableOptions, 137f29dbc25Smrg NULL, 138f29dbc25Smrg 0, 139f29dbc25Smrg NULL, 140f29dbc25Smrg#ifdef XSERVER_LIBPCIACCESS 141f29dbc25Smrg amdDeviceMatch, 142f29dbc25Smrg AmdPciProbe 143f29dbc25Smrg#endif 144f29dbc25Smrg}; 145f29dbc25Smrg 146f29dbc25Smrg/* Advanced Micro Devices Chip Models */ 14704007ebaSmrgtypedef struct _DEVICE_MODEL { 148f29dbc25Smrg int DeviceId; 149f29dbc25Smrg int Model; 15004007ebaSmrg} DeviceModel; 151f29dbc25Smrg 152f29dbc25SmrgDeviceModel ChipModel[] = { 153f29dbc25Smrg#ifdef HAVE_LX 154f29dbc25Smrg {PCI_CHIP_GEODELX, LX}, 155f29dbc25Smrg#endif 156f29dbc25Smrg#ifdef HAVE_GX 157f29dbc25Smrg {PCI_CHIP_GEODEGX, GX}, 158f29dbc25Smrg#endif 159f29dbc25Smrg {-1, 0} 160f29dbc25Smrg}; 161f29dbc25Smrg 162f29dbc25Smrg/* Supported chipsets */ 163f29dbc25SmrgSymTabRec GeodeChipsets[] = { 164f29dbc25Smrg#ifdef HAVE_LX 165f29dbc25Smrg {PCI_CHIP_GEODELX, "Geode LX"}, 166f29dbc25Smrg#endif 167f29dbc25Smrg#ifdef HAVE_GX 168f29dbc25Smrg {PCI_CHIP_GEODEGX, "Geode GX"}, 169f29dbc25Smrg#endif 170f29dbc25Smrg {-1, NULL} 171f29dbc25Smrg}; 172f29dbc25Smrg 173f29dbc25SmrgPciChipsets GeodePCIchipsets[] = { 174f29dbc25Smrg#ifdef HAVE_LX 175f29dbc25Smrg {PCI_CHIP_GEODELX, PCI_CHIP_GEODELX, RES_SHARED_VGA}, 176f29dbc25Smrg#endif 177f29dbc25Smrg#ifdef HAVE_GX 178f29dbc25Smrg {PCI_CHIP_GEODEGX, PCI_CHIP_GEODEGX, RES_SHARED_VGA}, 179f29dbc25Smrg#endif 180f29dbc25Smrg {-1, -1, RES_UNDEFINED}, 181f29dbc25Smrg}; 182f29dbc25Smrg 183f29dbc25Smrg#ifdef HAVE_LX 184f29dbc25Smrg 185f29dbc25SmrgOptionInfoRec LX_GeodeOptions[] = { 186f29dbc25Smrg {LX_OPTION_SW_CURSOR, "SWcursor", OPTV_BOOLEAN, {0}, FALSE}, 187f29dbc25Smrg {LX_OPTION_HW_CURSOR, "HWcursor", OPTV_BOOLEAN, {0}, FALSE}, 188f29dbc25Smrg {LX_OPTION_NOCOMPRESSION, "NoCompression", OPTV_BOOLEAN, {0}, FALSE}, 189f29dbc25Smrg {LX_OPTION_NOACCEL, "NoAccel", OPTV_BOOLEAN, {0}, FALSE}, 190f29dbc25Smrg {LX_OPTION_TV_SUPPORT, "TV", OPTV_ANYSTR, {0}, FALSE}, 191f29dbc25Smrg {LX_OPTION_TV_OUTPUT, "TV_Output", OPTV_ANYSTR, {0}, FALSE}, 192f29dbc25Smrg {LX_OPTION_TV_OVERSCAN, "TVOverscan", OPTV_ANYSTR, {0}, FALSE}, 193f29dbc25Smrg {LX_OPTION_ROTATE, "Rotate", OPTV_ANYSTR, {0}, FALSE}, 194f29dbc25Smrg {LX_OPTION_NOPANEL, "NoPanel", OPTV_BOOLEAN, {0}, FALSE}, 195f29dbc25Smrg {LX_OPTION_EXA_SCRATCH_BFRSZ, "ExaScratch", OPTV_INTEGER, {0}, FALSE}, 196f29dbc25Smrg {LX_OPTION_FBSIZE, "FBSize", OPTV_INTEGER, {0}, FALSE}, 197f29dbc25Smrg {LX_OPTION_PANEL_MODE, "PanelMode", OPTV_STRING, {0}, FALSE}, 198f29dbc25Smrg {-1, NULL, OPTV_NONE, {0}, FALSE} 199f29dbc25Smrg}; 200f29dbc25Smrg 201f29dbc25Smrg#endif 202f29dbc25Smrg 203f29dbc25Smrg#ifdef HAVE_GX 204f29dbc25Smrg 205f29dbc25SmrgOptionInfoRec GX_GeodeOptions[] = { 206f29dbc25Smrg {GX_OPTION_SW_CURSOR, "SWcursor", OPTV_BOOLEAN, {0}, FALSE}, 207f29dbc25Smrg {GX_OPTION_HW_CURSOR, "HWcursor", OPTV_BOOLEAN, {0}, FALSE}, 208f29dbc25Smrg {GX_OPTION_NOCOMPRESSION, "NoCompression", OPTV_BOOLEAN, {0}, FALSE}, 209f29dbc25Smrg {GX_OPTION_NOACCEL, "NoAccel", OPTV_BOOLEAN, {0}, FALSE}, 210f29dbc25Smrg {GX_OPTION_ACCEL_METHOD, "AccelMethod", OPTV_STRING, {0}, FALSE}, 211f29dbc25Smrg {GX_OPTION_TV_SUPPORT, "TV", OPTV_ANYSTR, {0}, FALSE}, 212f29dbc25Smrg {GX_OPTION_TV_OUTPUT, "TV_Output", OPTV_ANYSTR, {0}, FALSE}, 213f29dbc25Smrg {GX_OPTION_TV_OVERSCAN, "TVOverscan", OPTV_ANYSTR, {0}, FALSE}, 214f29dbc25Smrg {GX_OPTION_ROTATE, "Rotate", OPTV_ANYSTR, {0}, FALSE}, 215f29dbc25Smrg {GX_OPTION_NOPANEL, "NoPanel", OPTV_BOOLEAN, {0}, FALSE}, 216f29dbc25Smrg {GX_OPTION_OSM_IMG_BUFS, "OSMImageBuffers", OPTV_INTEGER, {0}, FALSE}, 217f29dbc25Smrg {GX_OPTION_OSM_CLR_BUFS, "OSMColorExpBuffers", OPTV_INTEGER, {0}, FALSE}, 218f29dbc25Smrg {GX_OPTION_FBSIZE, "FBSize", OPTV_INTEGER, {0}, FALSE}, 219f29dbc25Smrg {GX_OPTION_PANEL_GEOMETRY, "PanelGeometry", OPTV_STRING, {0}, FALSE}, 220f29dbc25Smrg {-1, NULL, OPTV_NONE, {0}, FALSE} 221f29dbc25Smrg}; 222f29dbc25Smrg#endif 223f29dbc25Smrg 224f29dbc25SmrgOptionInfoRec no_GeodeOptions[] = { 225f29dbc25Smrg {-1, NULL, OPTV_NONE, {0}, FALSE} 226f29dbc25Smrg}; 227f29dbc25Smrg 228f29dbc25Smrg#ifdef XFree86LOADER 229f29dbc25Smrg 230f29dbc25Smrg/* Module loader interface */ 231f29dbc25Smrg 232f29dbc25Smrgstatic MODULESETUPPROTO(AmdSetup); 233f29dbc25Smrg 234f29dbc25Smrgstatic XF86ModuleVersionInfo AmdVersionRec = { 235f29dbc25Smrg "amd", 236f29dbc25Smrg MODULEVENDORSTRING, 237f29dbc25Smrg MODINFOSTRING1, 238f29dbc25Smrg MODINFOSTRING2, 239f29dbc25Smrg XORG_VERSION_CURRENT, 240f29dbc25Smrg GEODE_VERSION_MAJOR, GEODE_VERSION_MINOR, GEODE_VERSION_PATCH, 24104007ebaSmrg ABI_CLASS_VIDEODRV, /* This is a video driver */ 242f29dbc25Smrg ABI_VIDEODRV_VERSION, 243f29dbc25Smrg MOD_CLASS_VIDEODRV, 244f29dbc25Smrg {0, 0, 0, 0} 245f29dbc25Smrg}; 246f29dbc25Smrg 247f29dbc25Smrgstatic XF86ModuleVersionInfo GeodeVersionRec = { 248f29dbc25Smrg "geode", 249f29dbc25Smrg MODULEVENDORSTRING, 250f29dbc25Smrg MODINFOSTRING1, 251f29dbc25Smrg MODINFOSTRING2, 252f29dbc25Smrg XORG_VERSION_CURRENT, 253f29dbc25Smrg GEODE_VERSION_MAJOR, GEODE_VERSION_MINOR, GEODE_VERSION_PATCH, 25404007ebaSmrg ABI_CLASS_VIDEODRV, /* This is a video driver */ 255f29dbc25Smrg ABI_VIDEODRV_VERSION, 256f29dbc25Smrg MOD_CLASS_VIDEODRV, 257f29dbc25Smrg {0, 0, 0, 0} 258f29dbc25Smrg}; 259f29dbc25Smrg 260f29dbc25Smrgstatic pointer 261f29dbc25SmrgGeodeSetup(pointer Module, pointer Options, int *ErrorMajor, int *ErrorMinor) 262f29dbc25Smrg{ 263f29dbc25Smrg static Bool init = FALSE; 264f29dbc25Smrg int flag = 0; 265f29dbc25Smrg 266f29dbc25Smrg#ifdef XSERVER_LIBPCIACCESS 267f29dbc25Smrg flag = HaveDriverFuncs; 268f29dbc25Smrg#endif 269f29dbc25Smrg if (init) { 27004007ebaSmrg *ErrorMajor = LDR_ONCEONLY; 27104007ebaSmrg return (pointer) NULL; 272f29dbc25Smrg } 273f29dbc25Smrg 274f29dbc25Smrg init = TRUE; 275f29dbc25Smrg xf86AddDriver(&GEODE, Module, flag); 276f29dbc25Smrg 277f29dbc25Smrg return (pointer) TRUE; 278f29dbc25Smrg} 279f29dbc25Smrg 280f29dbc25Smrgstatic pointer 281f29dbc25SmrgAmdSetup(pointer Module, pointer Options, int *ErrorMajor, int *ErrorMinor) 282f29dbc25Smrg{ 283f29dbc25Smrg static Bool Initialised = FALSE; 284f29dbc25Smrg 285f29dbc25Smrg if (!Initialised) { 28604007ebaSmrg Initialised = TRUE; 28704007ebaSmrg xf86AddDriver(&AMD, Module, 288f29dbc25Smrg#ifdef XSERVER_LIBPCIACCESS 28904007ebaSmrg HaveDriverFuncs 290f29dbc25Smrg#else 29104007ebaSmrg 0 292f29dbc25Smrg#endif 29304007ebaSmrg ); 294f29dbc25Smrg 29504007ebaSmrg return (pointer) TRUE; 296f29dbc25Smrg } 297f29dbc25Smrg 298f29dbc25Smrg /*The return value must be non-NULL on success */ 299f29dbc25Smrg if (ErrorMajor) 30004007ebaSmrg *ErrorMajor = LDR_ONCEONLY; 301f29dbc25Smrg return NULL; 302f29dbc25Smrg} 303f29dbc25Smrg 304f29dbc25Smrg_X_EXPORT XF86ModuleData amdModuleData = { &AmdVersionRec, AmdSetup, NULL }; 305f29dbc25Smrg_X_EXPORT XF86ModuleData geodeModuleData = 306f29dbc25Smrg { &GeodeVersionRec, GeodeSetup, NULL }; 307f29dbc25Smrg 30804007ebaSmrg#endif /*End of XFree86Loader */ 309f29dbc25Smrg 310f29dbc25Smrg/*------------------------------------------------------------------------- 311f29dbc25Smrg * AmdIdentify. 312f29dbc25Smrg * 313f29dbc25Smrg * Description : This function identify an Amdfamily version. 314f29dbc25Smrg * 315f29dbc25Smrg * 316f29dbc25Smrg * Parameters. 317f29dbc25Smrg * flags : flags may be used in PreInit* 318f29dbc25Smrg * 319f29dbc25Smrg * Returns : none 320f29dbc25Smrg * 321f29dbc25Smrg * Comments : none 322f29dbc25Smrg * 323f29dbc25Smrg*------------------------------------------------------------------------ 324f29dbc25Smrg*/ 325f29dbc25Smrgstatic void 326f29dbc25SmrgAmdIdentify(int flags) 327f29dbc25Smrg{ 328f29dbc25Smrg xf86PrintChipsets(GEODE_NAME, "Driver for AMD Geode Chipsets", 32904007ebaSmrg GeodeChipsets); 330f29dbc25Smrg} 331f29dbc25Smrg 332f29dbc25Smrg/*---------------------------------------------------------------------------- 333f29dbc25Smrg * AmdAvailableOptions. 334f29dbc25Smrg * 335f29dbc25Smrg * Description :This function returns the geodeoptions set geodeoption 336f29dbc25Smrg * 337f29dbc25Smrg * Parameters. 338f29dbc25Smrg * chipid :This will identify the chipset. 339f29dbc25Smrg * busid :This will identify the PCI busid 340f29dbc25Smrg * 341f29dbc25Smrg * Returns :ptr to GeodeOptions. 342f29dbc25Smrg * 343f29dbc25Smrg * Comments :none 344f29dbc25Smrg * 345f29dbc25Smrg*---------------------------------------------------------------------------- 346f29dbc25Smrg*/ 347f29dbc25Smrgstatic const OptionInfoRec * 348f29dbc25SmrgAmdAvailableOptions(int chipid, int busid) 349f29dbc25Smrg{ 350f29dbc25Smrg switch (chipid) { 351f29dbc25Smrg#ifdef HAVE_LX 352f29dbc25Smrg case PCI_CHIP_GEODELX: 35304007ebaSmrg return LX_GeodeOptions; 354f29dbc25Smrg#endif 355f29dbc25Smrg#ifdef HAVE_GX 356f29dbc25Smrg case PCI_CHIP_GEODEGX: 35704007ebaSmrg return GX_GeodeOptions; 358f29dbc25Smrg#endif 359f29dbc25Smrg } 360f29dbc25Smrg return no_GeodeOptions; 361f29dbc25Smrg} 362f29dbc25Smrg 363f29dbc25Smrg#ifdef XSERVER_LIBPCIACCESS 364f29dbc25Smrg 365f29dbc25Smrgstatic Bool 366f29dbc25SmrgAmdPciProbe(DriverPtr driver, 36704007ebaSmrg int entity_num, struct pci_device *device, intptr_t match_data) 368f29dbc25Smrg{ 369f29dbc25Smrg ScrnInfoPtr scrn = NULL; 370f29dbc25Smrg 371f29dbc25Smrg ErrorF("AmdPciProbe: Probing for supported devices!\n"); 372f29dbc25Smrg 373f29dbc25Smrg scrn = xf86ConfigPciEntity(scrn, 0, entity_num, GeodePCIchipsets, 37404007ebaSmrg NULL, NULL, NULL, NULL, NULL); 375f29dbc25Smrg 376f29dbc25Smrg if (scrn != NULL) { 37704007ebaSmrg scrn->driverName = GEODE_DRIVER_NAME; 37804007ebaSmrg scrn->driverVersion = GEODE_VERSION; 37904007ebaSmrg scrn->name = GEODE_NAME; 38004007ebaSmrg scrn->Probe = NULL; 381f29dbc25Smrg 38204007ebaSmrg switch (device->device_id) { 383f29dbc25Smrg#ifdef HAVE_LX 38404007ebaSmrg case PCI_CHIP_GEODELX: 38504007ebaSmrg LXSetupChipsetFPtr(scrn); 38604007ebaSmrg break; 387f29dbc25Smrg#endif 388f29dbc25Smrg#ifdef HAVE_GX 38904007ebaSmrg case PCI_CHIP_GEODEGX: 39004007ebaSmrg GXSetupChipsetFPtr(scrn); 39104007ebaSmrg break; 392f29dbc25Smrg#endif 39304007ebaSmrg default: 39404007ebaSmrg ErrorF("AmdPciProbe: unknown device ID\n"); 39504007ebaSmrg return FALSE; 39604007ebaSmrg } 397f29dbc25Smrg } 398f29dbc25Smrg return scrn != NULL; 399f29dbc25Smrg} 400f29dbc25Smrg 40104007ebaSmrg#else /* XSERVER_LIBPCIACCESS */ 402f29dbc25Smrg 403f29dbc25Smrg/*---------------------------------------------------------------------------- 404f29dbc25Smrg * AmdProbe. 405f29dbc25Smrg * 406f29dbc25Smrg * Description :This is to find that hardware is claimed by another 407f29dbc25Smrg * driver if not claim the slot & allocate ScreenInfoRec. 408f29dbc25Smrg * 409f29dbc25Smrg * Parameters. 410f29dbc25Smrg * drv :a pointer to the geode driver 411f29dbc25Smrg * flags :flags may passed to check the config and probe detect 412f29dbc25Smrg * 413f29dbc25Smrg * Returns :TRUE on success and FALSE on failure. 414f29dbc25Smrg * 415f29dbc25Smrg * Comments :This should be minimal probe and it should under no 416f29dbc25Smrg * circumstances change the state of the hardware.Don't do 417f29dbc25Smrg * any intiallizations other than the required 418f29dbc25Smrg * ScreenInforec. 419f29dbc25Smrg*---------------------------------------------------------------------------- 420f29dbc25Smrg*/ 421f29dbc25Smrg 422f29dbc25Smrgstatic Bool 423f29dbc25SmrgAmdProbe(DriverPtr drv, int flags) 424f29dbc25Smrg{ 425f29dbc25Smrg Bool foundScreen = FALSE; 426f29dbc25Smrg int numDevSections, numUsed; 427f29dbc25Smrg GDevPtr *devSections = NULL; 428f29dbc25Smrg int *usedChips = NULL; 429f29dbc25Smrg int i; 430f29dbc25Smrg void (*drvr_setup) (ScrnInfoPtr pScrni) = NULL; 431f29dbc25Smrg int CPUDetected; 432f29dbc25Smrg 433f29dbc25Smrg DEBUGMSG(1, (0, X_INFO, "AmdProbe: Probing for supported devices!\n")); 434f29dbc25Smrg /* 435f29dbc25Smrg * * Find the config file Device sections that match this 436f29dbc25Smrg * * driver, and return if there are none. 437f29dbc25Smrg */ 438f29dbc25Smrg if ((numDevSections = xf86MatchDevice(GEODE_NAME, &devSections)) <= 0) { 43904007ebaSmrg DEBUGMSG(1, (0, X_INFO, "AmdProbe: failed 1!\n")); 44004007ebaSmrg return FALSE; 441f29dbc25Smrg } 442f29dbc25Smrg DEBUGMSG(1, (0, X_INFO, "AmdProbe: Before MatchPciInstances!\n")); 443f29dbc25Smrg /* PCI BUS */ 444f29dbc25Smrg if (xf86GetPciVideoInfo()) { 44504007ebaSmrg numUsed = xf86MatchPciInstances(GEODE_NAME, PCI_VENDOR_ID_NS, 44604007ebaSmrg GeodeChipsets, GeodePCIchipsets, 44704007ebaSmrg devSections, numDevSections, drv, 44804007ebaSmrg &usedChips); 44904007ebaSmrg 45004007ebaSmrg if (numUsed <= 0) 45104007ebaSmrg numUsed = xf86MatchPciInstances(GEODE_NAME, PCI_VENDOR_ID_AMD, 45204007ebaSmrg GeodeChipsets, GeodePCIchipsets, 45304007ebaSmrg devSections, numDevSections, drv, 45404007ebaSmrg &usedChips); 45504007ebaSmrg 45604007ebaSmrg DEBUGMSG(1, (0, X_INFO, "AmdProbe: MatchPCI (%d)!\n", numUsed)); 45704007ebaSmrg 45804007ebaSmrg if (numUsed > 0) { 45904007ebaSmrg if (flags & PROBE_DETECT) 46004007ebaSmrg foundScreen = TRUE; 46104007ebaSmrg else { 46204007ebaSmrg /* Durango only supports one instance, */ 46304007ebaSmrg /* so take the first one */ 46404007ebaSmrg for (i = 0; i < numUsed; i++) { 46504007ebaSmrg /* Allocate a ScrnInfoRec */ 46604007ebaSmrg ScrnInfoPtr pScrni = NULL; 46704007ebaSmrg EntityInfoPtr pEnt = xf86GetEntityInfo(usedChips[i]); 46804007ebaSmrg PciChipsets *p_id; 46904007ebaSmrg 47004007ebaSmrg pScrni = xf86ConfigPciEntity(pScrni, 0, usedChips[i], 47104007ebaSmrg GeodePCIchipsets, NULL, NULL, 47204007ebaSmrg NULL, NULL, NULL); 47304007ebaSmrg for (p_id = GeodePCIchipsets; p_id->numChipset != -1; 47404007ebaSmrg p_id++) { 47504007ebaSmrg if (pEnt->chipset == p_id->numChipset) { 47604007ebaSmrg switch (pEnt->chipset) { 477f29dbc25Smrg#ifdef HAVE_LX 47804007ebaSmrg case PCI_CHIP_GEODELX: 47904007ebaSmrg CPUDetected = LX; 48004007ebaSmrg drvr_setup = &LXSetupChipsetFPtr; 48104007ebaSmrg break; 482f29dbc25Smrg#endif 483f29dbc25Smrg#ifdef HAVE_GX 48404007ebaSmrg case PCI_CHIP_GEODEGX: 48504007ebaSmrg CPUDetected = GX; 48604007ebaSmrg drvr_setup = &GXSetupChipsetFPtr; 48704007ebaSmrg break; 488f29dbc25Smrg#endif 48904007ebaSmrg default: 49004007ebaSmrg break; 49104007ebaSmrg } 49204007ebaSmrg break; 49304007ebaSmrg } 49404007ebaSmrg } 49504007ebaSmrg free(pEnt); 49604007ebaSmrg if (drvr_setup == NULL) 49704007ebaSmrg return FALSE; 49804007ebaSmrg 49904007ebaSmrg DEBUGMSG(1, (0, X_INFO, "AmdProbe: CPUDetected %d!\n", 50004007ebaSmrg CPUDetected)); 50104007ebaSmrg 50204007ebaSmrg pScrni->driverName = GEODE_DRIVER_NAME; 50304007ebaSmrg pScrni->driverVersion = GEODE_VERSION; 50404007ebaSmrg pScrni->name = GEODE_NAME; 50504007ebaSmrg pScrni->Probe = AmdProbe; 50604007ebaSmrg drvr_setup(pScrni); 50704007ebaSmrg 50804007ebaSmrg foundScreen = TRUE; 50904007ebaSmrg 51004007ebaSmrg } 51104007ebaSmrg } 51204007ebaSmrg } 513f29dbc25Smrg } 514f29dbc25Smrg 515f29dbc25Smrg if (usedChips) 51604007ebaSmrg free(usedChips); 517f29dbc25Smrg if (devSections) 51804007ebaSmrg free(devSections); 519f29dbc25Smrg DEBUGMSG(1, (0, X_INFO, "AmdProbe: result (%d)!\n", foundScreen)); 520f29dbc25Smrg return foundScreen; 521f29dbc25Smrg} 522f29dbc25Smrg 52304007ebaSmrg#endif /* else XSERVER_LIBPCIACCESS */ 524