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); 83#ifdef CONFIG_PROC_FS 84extern void nubus_proc_init(void); 85#else 86static inline void nubus_proc_init(void) {} 87#endif 88int get_nubus_list(char *buf); 89int nubus_proc_attach_device(struct nubus_dev *dev); 90/* If we need more precision we can add some more of these */ 91struct nubus_dev* nubus_find_device(unsigned short category, 92 unsigned short type, 93 unsigned short dr_hw, 94 unsigned short dr_sw, 95 const struct nubus_dev* from); 96struct nubus_dev* nubus_find_type(unsigned short category, 97 unsigned short type, 98 const struct nubus_dev* from); 99/* Might have more than one device in a slot, you know... */ 100struct nubus_dev* nubus_find_slot(unsigned int slot, 101 const struct nubus_dev* from); 102 103/* These are somewhat more NuBus-specific. They all return 0 for 104 success and -1 for failure, as you'd expect. */ 105 106/* The root directory which contains the board and functional 107 directories */ 108int nubus_get_root_dir(const struct nubus_board* board, 109 struct nubus_dir* dir); 110/* The board directory */ 111int nubus_get_board_dir(const struct nubus_board* board, 112 struct nubus_dir* dir); 113/* The functional directory */ 114int nubus_get_func_dir(const struct nubus_dev* dev, 115 struct nubus_dir* dir); 116 117/* These work on any directory gotten via the above */ 118int nubus_readdir(struct nubus_dir* dir, 119 struct nubus_dirent* ent); 120int nubus_find_rsrc(struct nubus_dir* dir, 121 unsigned char rsrc_type, 122 struct nubus_dirent* ent); 123int nubus_rewinddir(struct nubus_dir* dir); 124 125/* Things to do with directory entries */ 126int nubus_get_subdir(const struct nubus_dirent* ent, 127 struct nubus_dir* dir); 128void nubus_get_rsrc_mem(void* dest, 129 const struct nubus_dirent *dirent, 130 int len); 131void nubus_get_rsrc_str(void* dest, 132 const struct nubus_dirent *dirent, 133 int maxlen); 134#endif /* LINUX_NUBUS_H */ 135