[tables] Redefine methods for accessing linker tables
[people/lynusvaz/gpxe.git] / src / include / gpxe / 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 #include <gpxe/isa_ids.h>
12 #include <gpxe/device.h>
13 #include <gpxe/tables.h>
14
15 /*
16  * MCA constants
17  *
18  */
19 #define MCA_MOTHERBOARD_SETUP_REG       0x94
20 #define MCA_ADAPTER_SETUP_REG           0x96
21 #define MCA_MAX_SLOT_NR                 0x07    /* Must be 2^n - 1 */
22 #define MCA_POS_REG(n)                  (0x100+(n))
23
24 /* Is there a standard that would define this? */
25 #define GENERIC_MCA_VENDOR ISA_VENDOR ( 'M', 'C', 'A' )
26
27 /** An MCA device ID list entry */
28 struct mca_device_id {
29         /** Name */
30         const char *name;
31         /** Device ID */
32         uint16_t id;
33 };
34
35 /** An MCA device */
36 struct mca_device {
37         /** Generic device */
38         struct device dev;
39         /** Slot number */
40         unsigned int slot;
41         /** POS register values */
42         unsigned char pos[8];
43         /** Driver for this device */
44         struct mca_driver *driver;
45         /** Driver-private data
46          *
47          * Use mca_set_drvdata() and mca_get_drvdata() to access
48          * this field.
49          */
50         void *priv;
51         /** Driver name */
52         const char *driver_name;
53 };
54
55 #define MCA_ID(mca) ( ( (mca)->pos[1] << 8 ) + (mca)->pos[0] )
56
57 /** An MCA driver */
58 struct mca_driver {
59         /** MCA ID table */
60         struct mca_device_id *ids;
61         /** Number of entries in MCA ID table */
62         unsigned int id_count;
63         /**
64          * Probe device
65          *
66          * @v mca       MCA device
67          * @v id        Matching entry in ID table
68          * @ret rc      Return status code
69          */
70         int ( * probe ) ( struct mca_device *mca,
71                           const struct mca_device_id *id );
72         /**
73          * Remove device
74          *
75          * @v mca       MCA device
76          */
77         void ( * remove ) ( struct mca_device *mca );
78 };
79
80 /** MCA driver table */
81 #define MCA_DRIVERS "mca_drivers"
82
83 /** Declare an MCA driver */
84 #define __mca_driver __table ( struct mca_driver, MCA_DRIVERS, 01 )
85
86 /**
87  * Set MCA driver-private data
88  *
89  * @v mca               MCA device
90  * @v priv              Private data
91  */
92 static inline void mca_set_drvdata ( struct mca_device *mca, void *priv ) {
93         mca->priv = priv;
94 }
95
96 /**
97  * Get MCA driver-private data
98  *
99  * @v mca               MCA device
100  * @ret priv            Private data
101  */
102 static inline void * mca_get_drvdata ( struct mca_device *mca ) {
103         return mca->priv;
104 }
105
106 #endif