summaryrefslogtreecommitdiffstats
path: root/src/include
diff options
context:
space:
mode:
authorMichael Brown2005-04-14 12:10:54 +0200
committerMichael Brown2005-04-14 12:10:54 +0200
commit75d864432cc41c45d46df9ea7d3afd7cccbc0148 (patch)
tree8b98bce9c01b2f99f16d5da9f93a4e147dfe1865 /src/include
parentStripped references to variables in C code. (diff)
downloadipxe-75d864432cc41c45d46df9ea7d3afd7cccbc0148.tar.gz
ipxe-75d864432cc41c45d46df9ea7d3afd7cccbc0148.tar.xz
ipxe-75d864432cc41c45d46df9ea7d3afd7cccbc0148.zip
Use the magic of common symbols to allow struct dev to effectively grow at
link time to accommodate whatever bus objects are included.
Diffstat (limited to 'src/include')
-rw-r--r--src/include/dev.h27
-rw-r--r--src/include/eisa.h1
-rw-r--r--src/include/mca.h1
-rw-r--r--src/include/pci.h2
4 files changed, 17 insertions, 14 deletions
diff --git a/src/include/dev.h b/src/include/dev.h
index a9e2916b1..b5a2edda5 100644
--- a/src/include/dev.h
+++ b/src/include/dev.h
@@ -3,11 +3,6 @@
#include "stdint.h"
-/* Bus types */
-#include "pci.h"
-#include "eisa.h"
-#include "mca.h"
-
/* Device types */
#include "nic.h"
@@ -18,8 +13,7 @@ struct dev_id {
uint8_t bus_type;
#define PCI_BUS_TYPE 1
#define ISA_BUS_TYPE 2
-#define EISA_BUS_TYPE 3
-#define MCA_BUS_TYPE 4
+#define MCA_BUS_TYPE 3
} __attribute__ ((packed));
/* Dont use sizeof, that will include the padding */
@@ -29,18 +23,25 @@ struct dev {
struct dev_operations *dev_op;
const char *name;
struct dev_id devid; /* device ID string (sent to DHCP server) */
- /* All possible bus types */
- union {
- struct pci_device pci;
- struct eisa_device eisa;
- struct mca_device mca;
- };
+ /* Pointer to bus information for device. Whatever sets up
+ * the struct dev must make sure that this points to a buffer
+ * large enough for the required struct <bus>_device.
+ */
+ void *bus;
/* All possible device types */
union {
struct nic nic;
};
};
+/*
+ * Macro to help create a common symbol with enough space for any
+ * struct <bus>_device.
+ *
+ * Use as e.g. DEV_BUS(struct pci_device);
+ */
+#define DEV_BUS(datatype,symbol) datatype symbol __asm__ ( "_dev_bus" );
+
struct dev_operations {
void ( *disable ) ( struct dev * );
void ( *print_info ) ( struct dev * );
diff --git a/src/include/eisa.h b/src/include/eisa.h
index 4fe14fc69..ed0ccef35 100644
--- a/src/include/eisa.h
+++ b/src/include/eisa.h
@@ -27,6 +27,7 @@
*/
struct dev;
struct eisa_device {
+ char *magic; /* must be first */
struct dev *dev;
unsigned int slot;
uint16_t ioaddr;
diff --git a/src/include/mca.h b/src/include/mca.h
index e69b65601..c12b1cabe 100644
--- a/src/include/mca.h
+++ b/src/include/mca.h
@@ -28,6 +28,7 @@
*/
struct dev;
struct mca_device {
+ char *magic; /* must be first */
struct dev *dev;
unsigned int slot;
unsigned char pos[8];
diff --git a/src/include/pci.h b/src/include/pci.h
index 36edc0f58..988259a32 100644
--- a/src/include/pci.h
+++ b/src/include/pci.h
@@ -232,13 +232,13 @@
#define PCI_MSI_ADDRESS_HI 8 /* Upper 32 bits (if PCI_MSI_FLAGS_64BIT set) */
#define PCI_MSI_DATA_32 8 /* 16 bits of data for 32-bit devices */
#define PCI_MSI_DATA_64 12 /* 16 bits of data for 64-bit devices */
-
/*
* A physical PCI device
*
*/
struct dev;
struct pci_device {
+ char * magic; /* must be first */
struct dev * dev;
uint32_t membase; /* BAR 1 */
uint32_t ioaddr; /* first IO BAR */