Use the magic of common symbols to allow struct dev to effectively grow at
[people/xl0/gpxe.git] / src / include / eisa.h
1 #ifndef EISA_H
2 #define EISA_H
3
4 #include "isa_ids.h"
5
6 /*
7  * EISA constants
8  *
9  */
10
11 #define EISA_MIN_SLOT (0x1)
12 #define EISA_MAX_SLOT (0xf)
13 #define EISA_SLOT_BASE( n ) ( 0x1000 * (n) )
14
15 #define EISA_MFG_ID_HI ( 0xc80 )
16 #define EISA_MFG_ID_LO ( 0xc81 )
17 #define EISA_PROD_ID_HI ( 0xc82 )
18 #define EISA_PROD_ID_LO ( 0xc83 )
19 #define EISA_GLOBAL_CONFIG ( 0xc84 )
20
21 #define EISA_CMD_RESET ( 1 << 2 )
22 #define EISA_CMD_ENABLE ( 1 << 0 )
23
24 /*
25  * A physical EISA device
26  *
27  */
28 struct dev;
29 struct eisa_device {
30         char *magic; /* must be first */
31         struct dev *dev;
32         unsigned int slot;
33         uint16_t ioaddr;
34         uint16_t mfg_id;
35         uint16_t prod_id;
36         int already_tried;
37 };
38
39 /*
40  * An individual EISA device identified by ID
41  *
42  */
43 struct eisa_id {
44         const char *name;
45         uint16_t mfg_id, prod_id;
46 };
47
48 /*
49  * An EISA driver, with a device ID (struct eisa_id) table.
50  *
51  */
52 struct eisa_driver {
53         const char *name;
54         struct eisa_id *ids;
55         unsigned int id_count;
56 };
57
58 /*
59  * Define an EISA driver
60  *
61  */
62 #define EISA_DRIVER( driver_name, eisa_ids ) {                          \
63         .name = driver_name,                                            \
64         .ids = eisa_ids,                                                \
65         .id_count = sizeof ( eisa_ids ) / sizeof ( eisa_ids[0] ),       \
66 }
67
68 /*
69  * Functions in eisa.c
70  *
71  */
72 extern struct eisa_device * eisa_device ( struct dev *dev );
73 extern int find_eisa_device ( struct eisa_device *eisa,
74                               struct eisa_driver *driver );
75 extern void enable_eisa_device ( struct eisa_device *eisa );
76
77 #endif /* EISA_H */