1de2362d3Smrg/*
2de2362d3Smrg * Copyright 1997 through 2004 by Marc Aurele La France (TSI @ UQV), tsi@xfree86.org
3de2362d3Smrg *
4de2362d3Smrg * Permission to use, copy, modify, distribute, and sell this software and its
5de2362d3Smrg * documentation for any purpose is hereby granted without fee, provided that
6de2362d3Smrg * the above copyright notice appear in all copies and that both that copyright
7de2362d3Smrg * notice and this permission notice appear in supporting documentation, and
8de2362d3Smrg * that the name of Marc Aurele La France not be used in advertising or
9de2362d3Smrg * publicity pertaining to distribution of the software without specific,
10de2362d3Smrg * written prior permission.  Marc Aurele La France makes no representations
11de2362d3Smrg * about the suitability of this software for any purpose.  It is provided
12de2362d3Smrg * "as-is" without express or implied warranty.
13de2362d3Smrg *
14de2362d3Smrg * MARC AURELE LA FRANCE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
15de2362d3Smrg * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.  IN NO
16de2362d3Smrg * EVENT SHALL MARC AURELE LA FRANCE BE LIABLE FOR ANY SPECIAL, INDIRECT OR
17de2362d3Smrg * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
18de2362d3Smrg * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
19de2362d3Smrg * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
20de2362d3Smrg * PERFORMANCE OF THIS SOFTWARE.
21de2362d3Smrg */
22de2362d3Smrg
23de2362d3Smrg/*************************************************************************/
24de2362d3Smrg
25de2362d3Smrg/*
26de2362d3Smrg * Author:  Marc Aurele La France (TSI @ UQV), tsi@xfree86.org
27de2362d3Smrg *
28de2362d3Smrg * This is the ATI driver for XFree86.
29de2362d3Smrg *
30de2362d3Smrg * John Donne once said "No man is an island", and I am most certainly not an
31de2362d3Smrg * exception.  Contributions, intentional or not, to this and previous versions
32de2362d3Smrg * of this driver by the following are hereby acknowledged:
33de2362d3Smrg *
34de2362d3Smrg * Thomas Roell, Per Lindqvist, Doug Evans, Rik Faith, Arthur Tateishi,
35de2362d3Smrg * Alain Hebert, Ton van Rosmalen, David Chambers, William Shubert,
36de2362d3Smrg * ATI Technologies Incorporated, Robert Wolff, David Dawes, Mark Weaver,
37de2362d3Smrg * Hans Nasten, Kevin Martin, Frederic Rienthaler, Marc Bolduc, Reuben Sumner,
38de2362d3Smrg * Benjamin T. Yang, James Fast Kane, Randall Hopper, W. Marcus Miller,
39de2362d3Smrg * Henrik Harmsen, Christian Lupien, Precision Insight Incorporated,
40de2362d3Smrg * Mark Vojkovich, Huw D M Davies, Andrew C Aitchison, Ani Joshi,
41de2362d3Smrg * Kostas Gewrgiou, Jakub Jelinek, David S. Miller, A E Lawrence,
42de2362d3Smrg * Linus Torvalds, William Blew, Ignacio Garcia Etxebarria, Patrick Chase,
43de2362d3Smrg * Vladimir Dergachev, Egbert Eich, Mike A. Harris
44de2362d3Smrg *
45de2362d3Smrg * ... and, many, many others from around the world.
46de2362d3Smrg *
47de2362d3Smrg * In addition, this work would not have been possible without the active
48de2362d3Smrg * support, both moral and otherwise, of the staff and management of Computing
49de2362d3Smrg * and Network Services at the University of Alberta, in Edmonton, Alberta,
50de2362d3Smrg * Canada.
51de2362d3Smrg *
52de2362d3Smrg * The driver is intended to support all ATI adapters since their VGA Wonder
53de2362d3Smrg * V3, including OEM counterparts.
54de2362d3Smrg */
55de2362d3Smrg
56de2362d3Smrg#ifdef HAVE_CONFIG_H
57de2362d3Smrg#include "config.h"
58de2362d3Smrg#endif
59de2362d3Smrg
60de2362d3Smrg#include <pciaccess.h>
613ed65abbSmrg#include <xf86drm.h>
62de2362d3Smrg#include "atipcirename.h"
63de2362d3Smrg
64de2362d3Smrg#include "ati.h"
65de2362d3Smrg#include "atipciids.h"
66de2362d3Smrg#include "ativersion.h"
67de2362d3Smrg
68de2362d3Smrg/* names duplicated from version headers */
69de2362d3Smrg#define MACH64_DRIVER_NAME  "mach64"
70de2362d3Smrg#define R128_DRIVER_NAME    "r128"
71de2362d3Smrg#define RADEON_DRIVER_NAME  "radeon"
723ed65abbSmrg#define AMDGPU_DRIVER_NAME  "amdgpu"
73de2362d3Smrg
74de2362d3Smrgenum
75de2362d3Smrg{
76de2362d3Smrg    ATI_CHIP_FAMILY_NONE = 0,
77de2362d3Smrg    ATI_CHIP_FAMILY_Mach64,
78de2362d3Smrg    ATI_CHIP_FAMILY_Rage128,
79de2362d3Smrg    ATI_CHIP_FAMILY_Radeon
80de2362d3Smrg};
81de2362d3Smrg
82de2362d3Smrgstatic int ATIChipID(const uint16_t);
83de2362d3Smrg
84de2362d3Smrg/* domain defines (stolen from xserver) */
85de2362d3Smrg#if (defined(__alpha__) || defined(__ia64__)) && defined (linux)
86de2362d3Smrg# define PCI_DOM_MASK 0x01fful
87de2362d3Smrg#else
88de2362d3Smrg# define PCI_DOM_MASK 0x0ffu
89de2362d3Smrg#endif
90de2362d3Smrg
91de2362d3Smrg#define PCI_DOM_FROM_BUS(bus)  (((bus) >> 8) & (PCI_DOM_MASK))
92de2362d3Smrg#define PCI_BUS_NO_DOMAIN(bus) ((bus) & 0xffu)
93de2362d3Smrg
94de2362d3Smrgstatic struct pci_device*
95de2362d3Smrgati_device_get_from_busid(int bus, int dev, int func)
96de2362d3Smrg{
97de2362d3Smrg    return pci_device_find_by_slot(PCI_DOM_FROM_BUS(bus),
98de2362d3Smrg                                   PCI_BUS_NO_DOMAIN(bus),
99de2362d3Smrg                                   dev,
100de2362d3Smrg                                   func);
101de2362d3Smrg}
102de2362d3Smrg
10318781e08Smrg#ifndef XSERVER_PLATFORM_BUS
104de2362d3Smrgstatic struct pci_device*
105de2362d3Smrgati_device_get_primary(void)
106de2362d3Smrg{
107de2362d3Smrg    struct pci_device *device = NULL;
108de2362d3Smrg    struct pci_device_iterator *device_iter;
109de2362d3Smrg
110de2362d3Smrg    device_iter = pci_slot_match_iterator_create(NULL);
111de2362d3Smrg
11239413783Smrg    while ((device = pci_device_next(device_iter))) {
113de2362d3Smrg        if (xf86IsPrimaryPci(device))
114de2362d3Smrg            break;
115de2362d3Smrg    }
116de2362d3Smrg
117de2362d3Smrg    pci_iterator_destroy(device_iter);
118de2362d3Smrg
119de2362d3Smrg    return device;
120de2362d3Smrg}
12118781e08Smrg#else
12218781e08Smrgstatic struct pci_device *
12318781e08Smrgati_device_get_indexed(int index)
1247821949aSmrg{
12518781e08Smrg    struct pci_device *device = NULL;
12618781e08Smrg    struct pci_device_iterator *device_iter;
12718781e08Smrg    int count = 0;
1287821949aSmrg
12918781e08Smrg    device_iter = pci_slot_match_iterator_create(NULL);
1307821949aSmrg
13139413783Smrg    while ((device = pci_device_next(device_iter))) {
13218781e08Smrg        if (device->vendor_id == PCI_VENDOR_ATI) {
13318781e08Smrg            if (count == index)
13418781e08Smrg                return device;
13518781e08Smrg            count++;
13618781e08Smrg        }
1377821949aSmrg    }
13818781e08Smrg    return NULL;
1397821949aSmrg}
14018781e08Smrg#endif
141de2362d3Smrg
142de2362d3Smrgvoid
143de2362d3Smrgati_gdev_subdriver(pointer options)
144de2362d3Smrg{
1453ed65abbSmrg    int      nATIGDev, nMach64GDev, nR128GDev, nRadeonGDev, nAmdgpuGDev;
146de2362d3Smrg    GDevPtr *ATIGDevs;
1473ed65abbSmrg    Bool     load_mach64 = FALSE, load_r128 = FALSE, load_radeon = FALSE, load_amdgpu = FALSE;
148de2362d3Smrg    int      i;
149de2362d3Smrg
150de2362d3Smrg    /* let the subdrivers configure for themselves */
151de2362d3Smrg    if (xf86ServerIsOnlyDetecting())
152de2362d3Smrg        return;
153de2362d3Smrg
154de2362d3Smrg    /* get Device sections with Driver "ati" */
155de2362d3Smrg    nATIGDev = xf86MatchDevice(ATI_DRIVER_NAME, &ATIGDevs);
156de2362d3Smrg    nMach64GDev = xf86MatchDevice(MACH64_DRIVER_NAME, NULL);
157de2362d3Smrg    nR128GDev = xf86MatchDevice(R128_DRIVER_NAME, NULL);
158de2362d3Smrg    nRadeonGDev = xf86MatchDevice(RADEON_DRIVER_NAME, NULL);
1593ed65abbSmrg    nAmdgpuGDev = xf86MatchDevice(AMDGPU_DRIVER_NAME, NULL);
160de2362d3Smrg
161de2362d3Smrg    for (i = 0; i < nATIGDev; i++) {
162de2362d3Smrg        GDevPtr     ati_gdev = ATIGDevs[i];
163de2362d3Smrg        pciVideoPtr device = NULL;
164de2362d3Smrg        int         chip_family;
165de2362d3Smrg
166de2362d3Smrg        /* get pci device for the Device section */
167de2362d3Smrg        if (ati_gdev->busID) {
168de2362d3Smrg            int bus, dev, func;
169de2362d3Smrg
170de2362d3Smrg            if (!xf86ParsePciBusString(ati_gdev->busID, &bus, &dev, &func))
171de2362d3Smrg                continue;
172de2362d3Smrg
173de2362d3Smrg            device = ati_device_get_from_busid(bus, dev, func);
174de2362d3Smrg        }
17518781e08Smrg#ifdef XSERVER_PLATFORM_BUS
17618781e08Smrg        else
17718781e08Smrg            device = ati_device_get_indexed(i);
17818781e08Smrg#else
179de2362d3Smrg        else {
180de2362d3Smrg            device = ati_device_get_primary();
181de2362d3Smrg        }
18218781e08Smrg#endif
183de2362d3Smrg
184de2362d3Smrg        if (!device)
185de2362d3Smrg            continue;
186de2362d3Smrg
187de2362d3Smrg        /* check for non-ati devices and prehistoric mach32 */
188de2362d3Smrg        if ((PCI_DEV_VENDOR_ID(device) != PCI_VENDOR_ATI) ||
189de2362d3Smrg            (PCI_DEV_DEVICE_ID(device) == PCI_CHIP_MACH32))
190de2362d3Smrg            continue;
191de2362d3Smrg
192de2362d3Smrg        /* replace Driver line in the Device section */
193de2362d3Smrg        chip_family = ATIChipID(PCI_DEV_DEVICE_ID(device));
194de2362d3Smrg
195de2362d3Smrg        if (chip_family == ATI_CHIP_FAMILY_Mach64) {
196de2362d3Smrg            ati_gdev->driver = MACH64_DRIVER_NAME;
197de2362d3Smrg            load_mach64 = TRUE;
198de2362d3Smrg        }
199de2362d3Smrg
200de2362d3Smrg        if (chip_family == ATI_CHIP_FAMILY_Rage128) {
201de2362d3Smrg            ati_gdev->driver = R128_DRIVER_NAME;
202de2362d3Smrg            load_r128 = TRUE;
203de2362d3Smrg        }
204de2362d3Smrg
205de2362d3Smrg        if (chip_family == ATI_CHIP_FAMILY_Radeon) {
2063ed65abbSmrg            char *busid;
2073ed65abbSmrg
2083ed65abbSmrg            XNFasprintf(&busid, "pci:%04x:%02x:%02x.%d",
2093ed65abbSmrg                        device->domain, device->bus, device->dev,
2103ed65abbSmrg                        device->func);
2113ed65abbSmrg
2123ed65abbSmrg            if (busid) {
2133ed65abbSmrg                int fd = drmOpen(NULL, busid);
2143ed65abbSmrg
2153ed65abbSmrg                if (fd >= 0) {
2163ed65abbSmrg                    drmVersionPtr version = drmGetVersion(fd);
2173ed65abbSmrg
2183ed65abbSmrg                    if (version->version_major == 3) {
2193ed65abbSmrg                        ati_gdev->driver = AMDGPU_DRIVER_NAME;
2203ed65abbSmrg                        load_amdgpu = TRUE;
2213ed65abbSmrg                    }
2223ed65abbSmrg
2233ed65abbSmrg                    free(version);
2243ed65abbSmrg                    drmClose(fd);
2253ed65abbSmrg                }
2263ed65abbSmrg
2273ed65abbSmrg                free(busid);
2283ed65abbSmrg            }
2293ed65abbSmrg
2303ed65abbSmrg            if (strcmp(ati_gdev->driver, AMDGPU_DRIVER_NAME) != 0) {
2313ed65abbSmrg                ati_gdev->driver = RADEON_DRIVER_NAME;
2323ed65abbSmrg                load_radeon = TRUE;
2333ed65abbSmrg            }
234de2362d3Smrg        }
235de2362d3Smrg    }
236de2362d3Smrg
237de2362d3Smrg    free(ATIGDevs);
238de2362d3Smrg
239de2362d3Smrg    /* load subdrivers as primary modules and only if they do not get loaded
240de2362d3Smrg     * from other device sections
241de2362d3Smrg     */
242de2362d3Smrg
243de2362d3Smrg    if (load_mach64 && (nMach64GDev == 0))
244de2362d3Smrg         xf86LoadOneModule(MACH64_DRIVER_NAME, options);
245de2362d3Smrg
246de2362d3Smrg    if (load_r128 && (nR128GDev == 0))
247de2362d3Smrg         xf86LoadOneModule(R128_DRIVER_NAME, options);
248de2362d3Smrg
249de2362d3Smrg    if (load_radeon && (nRadeonGDev == 0))
250de2362d3Smrg         xf86LoadOneModule(RADEON_DRIVER_NAME, options);
2513ed65abbSmrg
2523ed65abbSmrg    if (load_amdgpu && (nAmdgpuGDev == 0))
2533ed65abbSmrg         xf86LoadOneModule(AMDGPU_DRIVER_NAME, options);
254de2362d3Smrg}
255de2362d3Smrg
256de2362d3Smrg/*
257de2362d3Smrg * ATIChipID --
258de2362d3Smrg *
259de2362d3Smrg * This returns the ATI_CHIP_FAMILY_* value associated with a particular ChipID.
260de2362d3Smrg */
261de2362d3Smrgstatic int
262de2362d3SmrgATIChipID(const uint16_t ChipID)
263de2362d3Smrg{
264de2362d3Smrg    switch (ChipID)
265de2362d3Smrg    {
266de2362d3Smrg        case PCI_CHIP_MACH64GX:
267de2362d3Smrg        case PCI_CHIP_MACH64CX:
268de2362d3Smrg        case PCI_CHIP_MACH64CT:
269de2362d3Smrg        case PCI_CHIP_MACH64ET:
270de2362d3Smrg        case PCI_CHIP_MACH64VT:
271de2362d3Smrg        case PCI_CHIP_MACH64GT:
272de2362d3Smrg        case PCI_CHIP_MACH64VU:
273de2362d3Smrg        case PCI_CHIP_MACH64GU:
274de2362d3Smrg        case PCI_CHIP_MACH64LG:
275de2362d3Smrg        case PCI_CHIP_MACH64VV:
276de2362d3Smrg        case PCI_CHIP_MACH64GV:
277de2362d3Smrg        case PCI_CHIP_MACH64GW:
278de2362d3Smrg        case PCI_CHIP_MACH64GY:
279de2362d3Smrg        case PCI_CHIP_MACH64GZ:
280de2362d3Smrg        case PCI_CHIP_MACH64GB:
281de2362d3Smrg        case PCI_CHIP_MACH64GD:
282de2362d3Smrg        case PCI_CHIP_MACH64GI:
283de2362d3Smrg        case PCI_CHIP_MACH64GP:
284de2362d3Smrg        case PCI_CHIP_MACH64GQ:
285de2362d3Smrg        case PCI_CHIP_MACH64LB:
286de2362d3Smrg        case PCI_CHIP_MACH64LD:
287de2362d3Smrg        case PCI_CHIP_MACH64LI:
288de2362d3Smrg        case PCI_CHIP_MACH64LP:
289de2362d3Smrg        case PCI_CHIP_MACH64LQ:
290de2362d3Smrg        case PCI_CHIP_MACH64GL:
291de2362d3Smrg        case PCI_CHIP_MACH64GM:
292de2362d3Smrg        case PCI_CHIP_MACH64GN:
293de2362d3Smrg        case PCI_CHIP_MACH64GO:
294de2362d3Smrg        case PCI_CHIP_MACH64GR:
295de2362d3Smrg        case PCI_CHIP_MACH64GS:
296de2362d3Smrg        case PCI_CHIP_MACH64LM:
297de2362d3Smrg        case PCI_CHIP_MACH64LN:
298de2362d3Smrg        case PCI_CHIP_MACH64LR:
299de2362d3Smrg        case PCI_CHIP_MACH64LS:
300de2362d3Smrg            return ATI_CHIP_FAMILY_Mach64;
301de2362d3Smrg
302de2362d3Smrg        case PCI_CHIP_RAGE128RE:
303de2362d3Smrg        case PCI_CHIP_RAGE128RF:
304de2362d3Smrg        case PCI_CHIP_RAGE128RG:
305de2362d3Smrg        case PCI_CHIP_RAGE128SK:
306de2362d3Smrg        case PCI_CHIP_RAGE128SL:
307de2362d3Smrg        case PCI_CHIP_RAGE128SM:
308de2362d3Smrg        case PCI_CHIP_RAGE128SN:
309de2362d3Smrg        case PCI_CHIP_RAGE128RK:
310de2362d3Smrg        case PCI_CHIP_RAGE128RL:
311de2362d3Smrg        case PCI_CHIP_RAGE128SE:
312de2362d3Smrg        case PCI_CHIP_RAGE128SF:
313de2362d3Smrg        case PCI_CHIP_RAGE128SG:
314de2362d3Smrg        case PCI_CHIP_RAGE128SH:
315de2362d3Smrg        case PCI_CHIP_RAGE128PA:
316de2362d3Smrg        case PCI_CHIP_RAGE128PB:
317de2362d3Smrg        case PCI_CHIP_RAGE128PC:
318de2362d3Smrg        case PCI_CHIP_RAGE128PD:
319de2362d3Smrg        case PCI_CHIP_RAGE128PE:
320de2362d3Smrg        case PCI_CHIP_RAGE128PF:
321de2362d3Smrg        case PCI_CHIP_RAGE128PG:
322de2362d3Smrg        case PCI_CHIP_RAGE128PH:
323de2362d3Smrg        case PCI_CHIP_RAGE128PI:
324de2362d3Smrg        case PCI_CHIP_RAGE128PJ:
325de2362d3Smrg        case PCI_CHIP_RAGE128PK:
326de2362d3Smrg        case PCI_CHIP_RAGE128PL:
327de2362d3Smrg        case PCI_CHIP_RAGE128PM:
328de2362d3Smrg        case PCI_CHIP_RAGE128PN:
329de2362d3Smrg        case PCI_CHIP_RAGE128PO:
330de2362d3Smrg        case PCI_CHIP_RAGE128PP:
331de2362d3Smrg        case PCI_CHIP_RAGE128PQ:
332de2362d3Smrg        case PCI_CHIP_RAGE128PR:
333de2362d3Smrg        case PCI_CHIP_RAGE128PS:
334de2362d3Smrg        case PCI_CHIP_RAGE128PT:
335de2362d3Smrg        case PCI_CHIP_RAGE128PU:
336de2362d3Smrg        case PCI_CHIP_RAGE128PV:
337de2362d3Smrg        case PCI_CHIP_RAGE128PW:
338de2362d3Smrg        case PCI_CHIP_RAGE128PX:
339de2362d3Smrg        case PCI_CHIP_RAGE128TF:
340de2362d3Smrg        case PCI_CHIP_RAGE128TL:
341de2362d3Smrg        case PCI_CHIP_RAGE128TR:
342de2362d3Smrg        case PCI_CHIP_RAGE128TS:
343de2362d3Smrg        case PCI_CHIP_RAGE128TT:
344de2362d3Smrg        case PCI_CHIP_RAGE128TU:
345de2362d3Smrg        case PCI_CHIP_RAGE128LE:
346de2362d3Smrg        case PCI_CHIP_RAGE128LF:
347de2362d3Smrg#if 0
348de2362d3Smrg        case PCI_CHIP_RAGE128LK:
349de2362d3Smrg        case PCI_CHIP_RAGE128LL:
350de2362d3Smrg#endif
351de2362d3Smrg        case PCI_CHIP_RAGE128MF:
352de2362d3Smrg        case PCI_CHIP_RAGE128ML:
353de2362d3Smrg            return ATI_CHIP_FAMILY_Rage128;
354de2362d3Smrg
355de2362d3Smrg        default:
356de2362d3Smrg            return ATI_CHIP_FAMILY_Radeon;
357de2362d3Smrg    }
358de2362d3Smrg}
359