Standardised debug mechanism in place now.
[people/xl0/gpxe.git] / src / drivers / bus / mca.c
1 /*
2  * MCA bus driver code
3  *
4  * Abstracted from 3c509.c.
5  *
6  */
7
8 #include "etherboot.h"
9 #include "dev.h"
10 #include "io.h"
11 #include "mca.h"
12
13 /*
14  * Ensure that there is sufficient space in the shared dev_bus
15  * structure for a struct pci_device.
16  *
17  */
18 DEV_BUS( struct mca_device, mca_dev );
19 static char mca_magic[0]; /* guaranteed unique symbol */
20
21 /*
22  * Fill in parameters for an MCA device based on slot number
23  *
24  */
25 static int fill_mca_device ( struct mca_device *mca ) {
26         unsigned int i;
27
28         /* Make sure motherboard setup is off */
29         outb_p ( 0xff, MCA_MOTHERBOARD_SETUP_REG );
30
31         /* Select the slot */
32         outb_p ( 0x8 | ( mca->slot & 0xf ), MCA_ADAPTER_SETUP_REG );
33
34         /* Read the POS registers */
35         for ( i = 0 ; i < ( sizeof ( mca->pos ) / sizeof ( mca->pos[0] ) ) ;
36               i++ ) {
37                 mca->pos[i] = inb_p ( MCA_POS_REG ( i ) );
38         }
39
40         /* Kill all setup modes */
41         outb_p ( 0, MCA_ADAPTER_SETUP_REG );
42
43         DBG ( "MCA slot %d id %hx (%hhx:%hhx:%hhx:%hhx:%hhx:%hhx:%hhx:%hhx)\n",
44               mca->slot, MCA_ID ( mca ),
45               mca->pos[0], mca->pos[1], mca->pos[2], mca->pos[3],
46               mca->pos[4], mca->pos[5], mca->pos[6], mca->pos[7] );
47
48         return 1;
49 }
50
51 /*
52  * Obtain a struct mca * from a struct dev *
53  *
54  * If dev has not previously been used for an MCA device scan, blank
55  * out struct mca
56  */
57 struct mca_device * mca_device ( struct dev *dev ) {
58         struct mca_device *mca = dev->bus;
59
60         if ( mca->magic != mca_magic ) {
61                 memset ( mca, 0, sizeof ( *mca ) );
62                 mca->magic = mca_magic;
63         }
64         mca->dev = dev;
65         return mca;
66 }
67
68 /*
69  * Find an MCA device matching the specified driver
70  *
71  */
72 int find_mca_device ( struct mca_device *mca, struct mca_driver *driver ) {
73         unsigned int i;
74
75         /* Iterate through all possible MCA slots, starting where we
76          * left off/
77          */
78         for ( ; mca->slot < MCA_MAX_SLOT_NR ; mca->slot++ ) {
79                 /* If we've already used this device, skip it */
80                 if ( mca->already_tried ) {
81                         mca->already_tried = 0;
82                         continue;
83                 }
84
85                 /* Fill in device parameters */
86                 if ( ! fill_mca_device ( mca ) ) {
87                         continue;
88                 }
89
90                 /* Compare against driver's ID list */
91                 for ( i = 0 ; i < driver->id_count ; i++ ) {
92                         struct mca_id *id = &driver->ids[i];
93
94                         if ( MCA_ID ( mca ) == id->id ) {
95                                 DBG ( "Device %s (driver %s) matches ID %hx\n",
96                                       id->name, driver->name, id->id );
97                                 if ( mca->dev ) {
98                                         mca->dev->name = driver->name;
99                                         mca->dev->devid.bus_type
100                                                 = MCA_BUS_TYPE;
101                                         mca->dev->devid.vendor_id
102                                                 = GENERIC_MCA_VENDOR;
103                                         mca->dev->devid.device_id = id->id;
104                                 }
105                                 mca->already_tried = 1;
106                                 return 1;
107                         }
108                 }
109         }
110
111         /* No device found */
112         mca->slot = 0;
113         return 0;
114 }