| /* | |
| * MCA bus driver code | |
| * | |
| * Abstracted from 3c509.c. | |
| * | |
| */ | |
| FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); | |
| #ifndef MCA_H | |
| #define MCA_H | |
| #include <ipxe/isa_ids.h> | |
| #include <ipxe/device.h> | |
| #include <ipxe/tables.h> | |
| /* | |
| * MCA constants | |
| * | |
| */ | |
| #define MCA_MOTHERBOARD_SETUP_REG 0x94 | |
| #define MCA_ADAPTER_SETUP_REG 0x96 | |
| #define MCA_MAX_SLOT_NR 0x07 /* Must be 2^n - 1 */ | |
| #define MCA_POS_REG(n) (0x100+(n)) | |
| /* Is there a standard that would define this? */ | |
| #define GENERIC_MCA_VENDOR ISA_VENDOR ( 'M', 'C', 'A' ) | |
| /** An MCA device ID list entry */ | |
| struct mca_device_id { | |
| /** Name */ | |
| const char *name; | |
| /** Device ID */ | |
| uint16_t id; | |
| }; | |
| /** An MCA device */ | |
| struct mca_device { | |
| /** Generic device */ | |
| struct device dev; | |
| /** Slot number */ | |
| unsigned int slot; | |
| /** POS register values */ | |
| unsigned char pos[8]; | |
| /** Driver for this device */ | |
| struct mca_driver *driver; | |
| /** Driver-private data | |
| * | |
| * Use mca_set_drvdata() and mca_get_drvdata() to access | |
| * this field. | |
| */ | |
| void *priv; | |
| }; | |
| #define MCA_ID(mca) ( ( (mca)->pos[1] << 8 ) + (mca)->pos[0] ) | |
| /** An MCA driver */ | |
| struct mca_driver { | |
| /** MCA ID table */ | |
| struct mca_device_id *ids; | |
| /** Number of entries in MCA ID table */ | |
| unsigned int id_count; | |
| /** | |
| * Probe device | |
| * | |
| * @v mca MCA device | |
| * @v id Matching entry in ID table | |
| * @ret rc Return status code | |
| */ | |
| int ( * probe ) ( struct mca_device *mca, | |
| const struct mca_device_id *id ); | |
| /** | |
| * Remove device | |
| * | |
| * @v mca MCA device | |
| */ | |
| void ( * remove ) ( struct mca_device *mca ); | |
| }; | |
| /** MCA driver table */ | |
| #define MCA_DRIVERS __table ( struct mca_driver, "mca_drivers" ) | |
| /** Declare an MCA driver */ | |
| #define __mca_driver __table_entry ( MCA_DRIVERS, 01 ) | |
| /** | |
| * Set MCA driver-private data | |
| * | |
| * @v mca MCA device | |
| * @v priv Private data | |
| */ | |
| static inline void mca_set_drvdata ( struct mca_device *mca, void *priv ) { | |
| mca->priv = priv; | |
| } | |
| /** | |
| * Get MCA driver-private data | |
| * | |
| * @v mca MCA device | |
| * @ret priv Private data | |
| */ | |
| static inline void * mca_get_drvdata ( struct mca_device *mca ) { | |
| return mca->priv; | |
| } | |
| #endif |