Use the magic of common symbols to allow struct dev to effectively grow at
[people/xl0/gpxe.git] / src / include / mca.h
1 /*
2  * MCA bus driver code
3  *
4  * Abstracted from 3c509.c.
5  *
6  */
7
8 #ifndef MCA_H
9 #define MCA_H
10
11 /*
12  * MCA constants
13  *
14  */
15
16 #define MCA_MOTHERBOARD_SETUP_REG       0x94
17 #define MCA_ADAPTER_SETUP_REG           0x96
18 #define MCA_MAX_SLOT_NR                 8
19 #define MCA_POS_REG(n)                  (0x100+(n))
20
21 /* Is there a standard that would define this? */
22 #include "isa_ids.h"
23 #define GENERIC_MCA_VENDOR ISA_VENDOR ( 'M', 'C', 'A' )
24
25 /*
26  * A physical MCA device
27  *
28  */
29 struct dev;
30 struct mca_device {
31         char *magic; /* must be first */
32         struct dev *dev;
33         unsigned int slot;
34         unsigned char pos[8];
35         int already_tried;
36 };
37 #define MCA_ID(mca) ( ( (mca)->pos[1] << 8 ) + (mca)->pos[0] )
38
39 /*
40  * An individual MCA device identified by ID
41  *
42  */
43 struct mca_id {
44         const char *name;
45         int id;
46 };
47
48 /*
49  * An MCA driver, with a device ID (struct mca_id) table.
50  *
51  */
52 struct mca_driver {
53         const char *name;
54         struct mca_id *ids;
55         unsigned int id_count;
56 };
57
58 /*
59  * Define an MCA driver
60  *
61  */
62 #define MCA_DRIVER( driver_name, mca_ids ) {                    \
63         .name = driver_name,                                    \
64         .ids = mca_ids,                                         \
65         .id_count = sizeof ( mca_ids ) / sizeof ( mca_ids[0] ), \
66 }
67
68 /*
69  * Functions in mca.c
70  *
71  */
72 extern struct mca_device * mca_device ( struct dev *dev );
73 extern int find_mca_device ( struct mca_device *mca,
74                              struct mca_driver *driver );
75
76 #endif