linux/include/linux/mca.h
<<
>>
Prefs
   1/*
   2 * Header for Microchannel Architecture Bus
   3 * Written by Martin Kolinek, February 1996
   4 */
   5
   6#ifndef _LINUX_MCA_H
   7#define _LINUX_MCA_H
   8
   9#include <linux/device.h>
  10
  11#ifdef CONFIG_MCA
  12#include <asm/mca.h>
  13
  14extern int MCA_bus;
  15#else
  16#define MCA_bus 0
  17#endif
  18
  19/* This sets up an information callback for /proc/mca/slot?.  The
  20 * function is called with the buffer, slot, and device pointer (or
  21 * some equally informative context information, or nothing, if you
  22 * prefer), and is expected to put useful information into the
  23 * buffer.  The adapter name, id, and POS registers get printed
  24 * before this is called though, so don't do it again.
  25 *
  26 * This should be called with a NULL procfn when a module
  27 * unregisters, thus preventing kernel crashes and other such
  28 * nastiness.
  29 */
  30typedef int (*MCA_ProcFn)(char* buf, int slot, void* dev);
  31
  32/* Should only be called by the NMI interrupt handler, this will do some
  33 * fancy stuff to figure out what might have generated a NMI.
  34 */
  35extern void mca_handle_nmi(void);
  36
  37enum MCA_AdapterStatus {
  38        MCA_ADAPTER_NORMAL = 0,
  39        MCA_ADAPTER_NONE = 1,
  40        MCA_ADAPTER_DISABLED = 2,
  41        MCA_ADAPTER_ERROR = 3
  42};
  43
  44struct mca_device {
  45        u64                     dma_mask;
  46        int                     pos_id;
  47        int                     slot;
  48
  49        /* index into id_table, set by the bus match routine */
  50        int                     index;
  51
  52        /* is there a driver installed? 0 - No, 1 - Yes */
  53        int                     driver_loaded;
  54        /* POS registers */
  55        unsigned char           pos[8];
  56        /* if a pseudo adapter of the motherboard, this is the motherboard
  57         * register value to use for setup cycles */
  58        short                   pos_register;
  59        
  60        enum MCA_AdapterStatus  status;
  61#ifdef CONFIG_MCA_PROC_FS
  62        /* name of the proc/mca file */
  63        char                    procname[8];
  64        /* /proc info callback */
  65        MCA_ProcFn              procfn;
  66        /* device/context info for proc callback */
  67        void                    *proc_dev;
  68#endif
  69        struct device           dev;
  70        char                    name[32];
  71};
  72#define to_mca_device(mdev) container_of(mdev, struct mca_device, dev)
  73
  74struct mca_bus_accessor_functions {
  75        unsigned char   (*mca_read_pos)(struct mca_device *, int reg);
  76        void            (*mca_write_pos)(struct mca_device *, int reg,
  77                                         unsigned char byte);
  78        int             (*mca_transform_irq)(struct mca_device *, int irq);
  79        int             (*mca_transform_ioport)(struct mca_device *,
  80                                                  int region);
  81        void *          (*mca_transform_memory)(struct mca_device *,
  82                                                void *memory);
  83};
  84
  85struct mca_bus {
  86        u64                     default_dma_mask;
  87        int                     number;
  88        struct mca_bus_accessor_functions f;
  89        struct device           dev;
  90        char                    name[32];
  91};
  92#define to_mca_bus(mdev) container_of(mdev, struct mca_bus, dev)
  93
  94struct mca_driver {
  95        const short             *id_table;
  96        void                    *driver_data;
  97        int                     integrated_id;
  98        struct device_driver    driver;
  99};
 100#define to_mca_driver(mdriver) container_of(mdriver, struct mca_driver, driver)
 101
 102/* Ongoing supported API functions */
 103extern struct mca_device *mca_find_device_by_slot(int slot);
 104extern int mca_system_init(void);
 105extern struct mca_bus *mca_attach_bus(int);
 106
 107extern unsigned char mca_device_read_stored_pos(struct mca_device *mca_dev,
 108                                                int reg);
 109extern unsigned char mca_device_read_pos(struct mca_device *mca_dev, int reg);
 110extern void mca_device_write_pos(struct mca_device *mca_dev, int reg,
 111                                 unsigned char byte);
 112extern int mca_device_transform_irq(struct mca_device *mca_dev, int irq);
 113extern int mca_device_transform_ioport(struct mca_device *mca_dev, int port);
 114extern void *mca_device_transform_memory(struct mca_device *mca_dev,
 115                                         void *mem);
 116extern int mca_device_claimed(struct mca_device *mca_dev);
 117extern void mca_device_set_claim(struct mca_device *mca_dev, int val);
 118extern void mca_device_set_name(struct mca_device *mca_dev, const char *name);
 119static inline char *mca_device_get_name(struct mca_device *mca_dev)
 120{
 121        return mca_dev ? mca_dev->name : NULL;
 122}
 123
 124extern enum MCA_AdapterStatus mca_device_status(struct mca_device *mca_dev);
 125
 126extern struct bus_type mca_bus_type;
 127
 128extern int mca_register_driver(struct mca_driver *drv);
 129extern int mca_register_driver_integrated(struct mca_driver *, int);
 130extern void mca_unregister_driver(struct mca_driver *drv);
 131
 132/* WARNING: only called by the boot time device setup */
 133extern int mca_register_device(int bus, struct mca_device *mca_dev);
 134
 135#ifdef CONFIG_MCA_PROC_FS
 136extern void mca_do_proc_init(void);
 137extern void mca_set_adapter_procfn(int slot, MCA_ProcFn, void* dev);
 138#else
 139static inline void mca_do_proc_init(void)
 140{
 141}
 142
 143static inline void mca_set_adapter_procfn(int slot, MCA_ProcFn fn, void* dev)
 144{
 145}
 146#endif
 147
 148#endif /* _LINUX_MCA_H */
 149