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