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