at v3.9 4.2 kB view raw
1/* 2 nubus.h: various definitions and prototypes for NuBus drivers to use. 3 4 Originally written by Alan Cox. 5 6 Hacked to death by C. Scott Ananian and David Huggins-Daines. 7 8 Some of the constants in here are from the corresponding 9 NetBSD/OpenBSD header file, by Allen Briggs. We figured out the 10 rest of them on our own. */ 11#ifndef LINUX_NUBUS_H 12#define LINUX_NUBUS_H 13 14#include <asm/nubus.h> 15#include <uapi/linux/nubus.h> 16 17struct nubus_board { 18 struct nubus_board* next; 19 struct nubus_dev* first_dev; 20 21 /* Only 9-E actually exist, though 0-8 are also theoretically 22 possible, and 0 is a special case which represents the 23 motherboard and onboard peripherals (Ethernet, video) */ 24 int slot; 25 /* For slot 0, this is bogus. */ 26 char name[64]; 27 28 /* Format block */ 29 unsigned char* fblock; 30 /* Root directory (does *not* always equal fblock + doffset!) */ 31 unsigned char* directory; 32 33 unsigned long slot_addr; 34 /* Offset to root directory (sometimes) */ 35 unsigned long doffset; 36 /* Length over which to compute the crc */ 37 unsigned long rom_length; 38 /* Completely useless most of the time */ 39 unsigned long crc; 40 unsigned char rev; 41 unsigned char format; 42 unsigned char lanes; 43}; 44 45struct nubus_dev { 46 /* Next link in device list */ 47 struct nubus_dev* next; 48 /* Directory entry in /proc/bus/nubus */ 49 struct proc_dir_entry* procdir; 50 51 /* The functional resource ID of this device */ 52 unsigned char resid; 53 /* These are mostly here for convenience; we could always read 54 them from the ROMs if we wanted to */ 55 unsigned short category; 56 unsigned short type; 57 unsigned short dr_sw; 58 unsigned short dr_hw; 59 /* This is the device's name rather than the board's. 60 Sometimes they are different. Usually the board name is 61 more correct. */ 62 char name[64]; 63 /* MacOS driver (I kid you not) */ 64 unsigned char* driver; 65 /* Actually this is an offset */ 66 unsigned long iobase; 67 unsigned long iosize; 68 unsigned char flags, hwdevid; 69 70 /* Functional directory */ 71 unsigned char* directory; 72 /* Much of our info comes from here */ 73 struct nubus_board* board; 74}; 75 76/* This is all NuBus devices (used to find devices later on) */ 77extern struct nubus_dev* nubus_devices; 78/* This is all NuBus cards */ 79extern struct nubus_board* nubus_boards; 80 81/* Generic NuBus interface functions, modelled after the PCI interface */ 82void nubus_scan_bus(void); 83extern void nubus_proc_init(void); 84int get_nubus_list(char *buf); 85int nubus_proc_attach_device(struct nubus_dev *dev); 86int nubus_proc_detach_device(struct nubus_dev *dev); 87/* If we need more precision we can add some more of these */ 88struct nubus_dev* nubus_find_device(unsigned short category, 89 unsigned short type, 90 unsigned short dr_hw, 91 unsigned short dr_sw, 92 const struct nubus_dev* from); 93struct nubus_dev* nubus_find_type(unsigned short category, 94 unsigned short type, 95 const struct nubus_dev* from); 96/* Might have more than one device in a slot, you know... */ 97struct nubus_dev* nubus_find_slot(unsigned int slot, 98 const struct nubus_dev* from); 99 100/* These are somewhat more NuBus-specific. They all return 0 for 101 success and -1 for failure, as you'd expect. */ 102 103/* The root directory which contains the board and functional 104 directories */ 105int nubus_get_root_dir(const struct nubus_board* board, 106 struct nubus_dir* dir); 107/* The board directory */ 108int nubus_get_board_dir(const struct nubus_board* board, 109 struct nubus_dir* dir); 110/* The functional directory */ 111int nubus_get_func_dir(const struct nubus_dev* dev, 112 struct nubus_dir* dir); 113 114/* These work on any directory gotten via the above */ 115int nubus_readdir(struct nubus_dir* dir, 116 struct nubus_dirent* ent); 117int nubus_find_rsrc(struct nubus_dir* dir, 118 unsigned char rsrc_type, 119 struct nubus_dirent* ent); 120int nubus_rewinddir(struct nubus_dir* dir); 121 122/* Things to do with directory entries */ 123int nubus_get_subdir(const struct nubus_dirent* ent, 124 struct nubus_dir* dir); 125void nubus_get_rsrc_mem(void* dest, 126 const struct nubus_dirent *dirent, 127 int len); 128void nubus_get_rsrc_str(void* dest, 129 const struct nubus_dirent *dirent, 130 int maxlen); 131#endif /* LINUX_NUBUS_H */