Home | History | Annotate | Download | only in xorg-r600
      1 /*
      2  * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
      3  * All Rights Reserved.
      4  *
      5  * Permission is hereby granted, free of charge, to any person obtaining a
      6  * copy of this software and associated documentation files (the
      7  * "Software"), to deal in the Software without restriction, including
      8  * without limitation the rights to use, copy, modify, merge, publish,
      9  * distribute, sub license, and/or sell copies of the Software, and to
     10  * permit persons to whom the Software is furnished to do so, subject to
     11  * the following conditions:
     12  *
     13  * The above copyright notice and this permission notice (including the
     14  * next paragraph) shall be included in all copies or substantial portions
     15  * of the Software.
     16  *
     17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
     18  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
     19  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
     20  * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
     21  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
     22  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
     23  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
     24  *
     25  *
     26  * Author: Alan Hourihane <alanh (at) tungstengraphics.com>
     27  * Author: Jakob Bornecrantz <wallbraker (at) gmail.com>
     28  * Author: Corbin Simpson <MostAwesomedude (at) gmail.com>
     29  *
     30  */
     31 
     32 #include "../../state_trackers/xorg/xorg_winsys.h"
     33 
     34 static void r600_xorg_identify(int flags);
     35 static Bool r600_xorg_pci_probe(DriverPtr driver,
     36 				 int entity_num,
     37 				 struct pci_device *device,
     38 				 intptr_t match_data);
     39 
     40 static const struct pci_id_match r600_xorg_device_match[] = {
     41     {0x1002, PCI_MATCH_ANY, PCI_MATCH_ANY, PCI_MATCH_ANY, 0, 0, 0},
     42     {0, 0, 0},
     43 };
     44 
     45 static SymTabRec r600_xorg_chipsets[] = {
     46     {PCI_MATCH_ANY, "AMD R6xx Graphics Chipset"},
     47     {-1, NULL}
     48 };
     49 
     50 static PciChipsets r600_xorg_pci_devices[] = {
     51     {PCI_MATCH_ANY, PCI_MATCH_ANY, NULL},
     52     {-1, -1, NULL}
     53 };
     54 
     55 static XF86ModuleVersionInfo r600_xorg_version = {
     56     "r600g",
     57     MODULEVENDORSTRING,
     58     MODINFOSTRING1,
     59     MODINFOSTRING2,
     60     XORG_VERSION_CURRENT,
     61     0, 1, 0, /* major, minor, patch */
     62     ABI_CLASS_VIDEODRV,
     63     ABI_VIDEODRV_VERSION,
     64     MOD_CLASS_VIDEODRV,
     65     {0, 0, 0, 0}
     66 };
     67 
     68 /*
     69  * Xorg driver exported structures
     70  */
     71 
     72 _X_EXPORT DriverRec r600_driver = {
     73     1,
     74     "r600g",
     75     r600_xorg_identify,
     76     NULL,
     77     xorg_tracker_available_options,
     78     NULL,
     79     0,
     80     NULL,
     81     r600_xorg_device_match,
     82     r600_xorg_pci_probe
     83 };
     84 
     85 static MODULESETUPPROTO(r600_xorg_setup);
     86 
     87 _X_EXPORT XF86ModuleData r600gModuleData = {
     88     &r600_xorg_version,
     89     r600_xorg_setup,
     90     NULL
     91 };
     92 
     93 /*
     94  * Xorg driver functions
     95  */
     96 
     97 static pointer
     98 r600_xorg_setup(pointer module, pointer opts, int *errmaj, int *errmin)
     99 {
    100     static Bool setupDone = 0;
    101 
    102     /* This module should be loaded only once, but check to be sure.
    103      */
    104     if (!setupDone) {
    105 	setupDone = 1;
    106 	xf86AddDriver(&r600_driver, module, HaveDriverFuncs);
    107 
    108 	/*
    109 	 * The return value must be non-NULL on success even though there
    110 	 * is no TearDownProc.
    111 	 */
    112 	return (pointer) 1;
    113     } else {
    114 	if (errmaj)
    115 	    *errmaj = LDR_ONCEONLY;
    116 	return NULL;
    117     }
    118 }
    119 
    120 static void
    121 r600_xorg_identify(int flags)
    122 {
    123     xf86PrintChipsets("r600", "Driver for R6xx Gallium with KMS",
    124 		      r600_xorg_chipsets);
    125 }
    126 
    127 static Bool
    128 r600_xorg_pci_probe(DriverPtr driver,
    129 	  int entity_num, struct pci_device *device, intptr_t match_data)
    130 {
    131     ScrnInfoPtr scrn = NULL;
    132     EntityInfoPtr entity;
    133 
    134     scrn = xf86ConfigPciEntity(scrn, 0, entity_num, r600_xorg_pci_devices,
    135 			       NULL, NULL, NULL, NULL, NULL);
    136     if (scrn != NULL) {
    137 	scrn->driverVersion = 1;
    138 	scrn->driverName = "r600";
    139 	scrn->name = "R600G";
    140 	scrn->Probe = NULL;
    141 
    142 	entity = xf86GetEntityInfo(entity_num);
    143 
    144 	/* Use all the functions from the xorg tracker */
    145 	xorg_tracker_set_functions(scrn);
    146     }
    147     return scrn != NULL;
    148 }
    149