1433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer/* 2433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas. 3433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer * All Rights Reserved. 4433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer * 5433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer * Permission is hereby granted, free of charge, to any person obtaining a 6433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer * copy of this software and associated documentation files (the 7433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer * "Software"), to deal in the Software without restriction, including 8433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer * without limitation the rights to use, copy, modify, merge, publish, 9433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer * distribute, sub license, and/or sell copies of the Software, and to 10433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer * permit persons to whom the Software is furnished to do so, subject to 11433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer * the following conditions: 12433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer * 13433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer * The above copyright notice and this permission notice (including the 14433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer * next paragraph) shall be included in all copies or substantial portions 15433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer * of the Software. 16433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer * 17433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 19433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 20433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 21433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 22433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 23433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer * 25433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer * 26433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer * Author: Alan Hourihane <alanh@tungstengraphics.com> 27433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer * Author: Jakob Bornecrantz <wallbraker@gmail.com> 28433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer * Author: Corbin Simpson <MostAwesomedude@gmail.com> 29433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer * 30433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer */ 31433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer 32433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer#include "../../state_trackers/xorg/xorg_winsys.h" 33433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer 34433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzerstatic void r600_xorg_identify(int flags); 35433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzerstatic Bool r600_xorg_pci_probe(DriverPtr driver, 36433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer int entity_num, 37433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer struct pci_device *device, 38433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer intptr_t match_data); 39433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer 40433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzerstatic const struct pci_id_match r600_xorg_device_match[] = { 41433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer {0x1002, PCI_MATCH_ANY, PCI_MATCH_ANY, PCI_MATCH_ANY, 0, 0, 0}, 42433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer {0, 0, 0}, 43433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer}; 44433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer 45433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzerstatic SymTabRec r600_xorg_chipsets[] = { 46433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer {PCI_MATCH_ANY, "AMD R6xx Graphics Chipset"}, 47433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer {-1, NULL} 48433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer}; 49433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer 50433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzerstatic PciChipsets r600_xorg_pci_devices[] = { 51433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer {PCI_MATCH_ANY, PCI_MATCH_ANY, NULL}, 52433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer {-1, -1, NULL} 53433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer}; 54433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer 55433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzerstatic XF86ModuleVersionInfo r600_xorg_version = { 56433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer "r600g", 57433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer MODULEVENDORSTRING, 58433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer MODINFOSTRING1, 59433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer MODINFOSTRING2, 60433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer XORG_VERSION_CURRENT, 61433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer 0, 1, 0, /* major, minor, patch */ 62433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer ABI_CLASS_VIDEODRV, 63433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer ABI_VIDEODRV_VERSION, 64433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer MOD_CLASS_VIDEODRV, 65433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer {0, 0, 0, 0} 66433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer}; 67433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer 68433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer/* 69433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer * Xorg driver exported structures 70433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer */ 71433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer 72433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer_X_EXPORT DriverRec r600_driver = { 73433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer 1, 74433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer "r600g", 75433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer r600_xorg_identify, 76433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer NULL, 77433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer xorg_tracker_available_options, 78433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer NULL, 79433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer 0, 80433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer NULL, 81433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer r600_xorg_device_match, 82433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer r600_xorg_pci_probe 83433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer}; 84433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer 85433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzerstatic MODULESETUPPROTO(r600_xorg_setup); 86433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer 87433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer_X_EXPORT XF86ModuleData r600gModuleData = { 88433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer &r600_xorg_version, 89433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer r600_xorg_setup, 90433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer NULL 91433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer}; 92433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer 93433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer/* 94433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer * Xorg driver functions 95433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer */ 96433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer 97433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzerstatic pointer 98433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzerr600_xorg_setup(pointer module, pointer opts, int *errmaj, int *errmin) 99433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer{ 100433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer static Bool setupDone = 0; 101433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer 102433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer /* This module should be loaded only once, but check to be sure. 103433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer */ 104433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer if (!setupDone) { 105433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer setupDone = 1; 106433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer xf86AddDriver(&r600_driver, module, HaveDriverFuncs); 107433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer 108433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer /* 109433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer * The return value must be non-NULL on success even though there 110433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer * is no TearDownProc. 111433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer */ 112433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer return (pointer) 1; 113433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer } else { 114433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer if (errmaj) 115433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer *errmaj = LDR_ONCEONLY; 116433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer return NULL; 117433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer } 118433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer} 119433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer 120433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzerstatic void 121433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzerr600_xorg_identify(int flags) 122433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer{ 123433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer xf86PrintChipsets("r600", "Driver for R6xx Gallium with KMS", 124433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer r600_xorg_chipsets); 125433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer} 126433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer 127433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzerstatic Bool 128433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzerr600_xorg_pci_probe(DriverPtr driver, 129433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer int entity_num, struct pci_device *device, intptr_t match_data) 130433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer{ 131433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer ScrnInfoPtr scrn = NULL; 132433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer EntityInfoPtr entity; 133433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer 134433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer scrn = xf86ConfigPciEntity(scrn, 0, entity_num, r600_xorg_pci_devices, 135433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer NULL, NULL, NULL, NULL, NULL); 136433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer if (scrn != NULL) { 137433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer scrn->driverVersion = 1; 138433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer scrn->driverName = "r600"; 139433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer scrn->name = "R600G"; 140433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer scrn->Probe = NULL; 141433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer 142433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer entity = xf86GetEntityInfo(entity_num); 143433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer 144433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer /* Use all the functions from the xorg tracker */ 145433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer xorg_tracker_set_functions(scrn); 146433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer } 147433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer return scrn != NULL; 148433c740c1a2c173445c0bb161522bf7a76fa49c6Michel Dänzer} 149