Blame view

include/linux/nubus.h 11.9 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
9
10
11
12
13
  /*
    nubus.h: various definitions and prototypes for NuBus drivers to use.
  
    Originally written by Alan Cox.
  
    Hacked to death by C. Scott Ananian and David Huggins-Daines.
    
    Some of the constants in here are from the corresponding
    NetBSD/OpenBSD header file, by Allen Briggs.  We figured out the
    rest of them on our own. */
  
  #ifndef LINUX_NUBUS_H
  #define LINUX_NUBUS_H
d5c72d784   Jaswinder Singh Rajput   headers_check fix...
14
  #include <linux/types.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
  #ifdef __KERNEL__
  #include <asm/nubus.h>
  #endif
  
  enum nubus_category {
  	NUBUS_CAT_BOARD          = 0x0001,
  	NUBUS_CAT_DISPLAY        = 0x0003,
  	NUBUS_CAT_NETWORK        = 0x0004,
  	NUBUS_CAT_COMMUNICATIONS = 0x0006,
  	NUBUS_CAT_FONT           = 0x0009,
  	NUBUS_CAT_CPU            = 0x000A,
  	/* For lack of a better name */
  	NUBUS_CAT_DUODOCK        = 0x0020
  };
  
  enum nubus_type_network {
f87795887   Finn Thain   NuBus header update
31
32
  	NUBUS_TYPE_ETHERNET      = 0x0001,
  	NUBUS_TYPE_RS232         = 0x0002
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
33
34
35
  };
  
  enum nubus_type_display {
f87795887   Finn Thain   NuBus header update
36
  	NUBUS_TYPE_VIDEO         = 0x0001
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
37
38
39
  };
  
  enum nubus_type_cpu {
f87795887   Finn Thain   NuBus header update
40
41
42
  	NUBUS_TYPE_68020         = 0x0003,
  	NUBUS_TYPE_68030         = 0x0004,
  	NUBUS_TYPE_68040         = 0x0005
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
  };
  
  /* Known <Cat,Type,SW,HW> tuples: (according to TattleTech and Slots)
   *  68030 motherboards: <10,4,0,24>
   *  68040 motherboards: <10,5,0,24>
   *  DuoDock Plus: <32,1,1,2>
   *
   *  Toby Frame Buffer card: <3,1,1,1>
   *  RBV built-in video (IIci): <3,1,1,24>
   *  Valkyrie built-in video (Q630): <3,1,1,46>
   *  Macintosh Display Card: <3,1,1,25>
   *  Sonora built-in video (P460): <3,1,1,34>
   *  Jet framebuffer (DuoDock Plus): <3,1,1,41>
   *
   *  SONIC comm-slot/on-board and DuoDock Ethernet: <4,1,1,272>
   *  SONIC LC-PDS Ethernet (Dayna, but like Apple 16-bit, sort of): <4,1,1,271>
f87795887   Finn Thain   NuBus header update
59
   *  Apple SONIC LC-PDS Ethernet ("Apple Ethernet LC Twisted-Pair Card"): <4,1,0,281>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
   *  Sonic Systems Ethernet A-Series Card: <4,1,268,256>
   *  Asante MacCon NuBus-A: <4,1,260,256> (alpha-1.0,1.1 revision)
   *   ROM on the above card: <2,1,0,0>
   *  Cabletron ethernet card: <4,1,1,265>
   *  Farallon ethernet card: <4,1,268,256> (identical to Sonic Systems card)
   *  Kinetics EtherPort IIN: <4,1,259,262>
   *  API Engineering EtherRun_LCa PDS enet card: <4,1,282,256>
   *
   *  Add your devices to the list!  You can obtain the "Slots" utility
   *  from Apple's FTP site at:
   *  ftp://dev.apple.com/devworld/Tool_Chest/Devices_-_Hardware/NuBus_Slot_Manager/
   *
   *  Alternately, TattleTech can be found at any Info-Mac mirror site.  
   *  or from its distribution site: ftp://ftp.decismkr.com/dms
   */
  
  /* DrSW: Uniquely identifies the software interface to a board.  This
     is usually the one you want to look at when writing a driver.  It's
     not as useful as you think, though, because as we should know by
     now (duh), "Apple Compatible" can mean a lot of things... */
  
  /* Add known DrSW values here */
  enum nubus_drsw {
  	/* NUBUS_CAT_DISPLAY */
f87795887   Finn Thain   NuBus header update
84
85
  	NUBUS_DRSW_APPLE        = 0x0001,
  	NUBUS_DRSW_APPLE_HIRES  = 0x0013, /* MacII HiRes card driver */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
86
87
  	
  	/* NUBUS_CAT_NETWORK */
f87795887   Finn Thain   NuBus header update
88
89
90
91
92
93
94
95
96
97
  	NUBUS_DRSW_3COM         = 0x0000,
  	NUBUS_DRSW_CABLETRON    = 0x0001,
  	NUBUS_DRSW_SONIC_LC     = 0x0001,
  	NUBUS_DRSW_KINETICS     = 0x0103,
  	NUBUS_DRSW_ASANTE       = 0x0104,
  	NUBUS_DRSW_TECHWORKS    = 0x0109,
  	NUBUS_DRSW_DAYNA        = 0x010b,
  	NUBUS_DRSW_FARALLON     = 0x010c,
  	NUBUS_DRSW_APPLE_SN     = 0x010f,
  	NUBUS_DRSW_DAYNA2       = 0x0115,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
98
99
  	NUBUS_DRSW_FOCUS        = 0x011a,
  	NUBUS_DRSW_ASANTE_CS    = 0x011d, /* use asante SMC9194 driver */
f87795887   Finn Thain   NuBus header update
100
  	NUBUS_DRSW_DAYNA_LC     = 0x011e,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
101
102
  
  	/* NUBUS_CAT_CPU */
f87795887   Finn Thain   NuBus header update
103
  	NUBUS_DRSW_NONE         = 0x0000,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
104
105
106
107
108
109
110
111
112
  };
  
  /* DrHW: Uniquely identifies the hardware interface to a board (or at
     least, it should...  some video cards are known to incorrectly
     identify themselves as Toby cards) */
  
  /* Add known DrHW values here */
  enum nubus_drhw {
  	/* NUBUS_CAT_DISPLAY */
f87795887   Finn Thain   NuBus header update
113
114
115
116
117
118
119
120
121
122
  	NUBUS_DRHW_APPLE_TFB      = 0x0001, /* Toby frame buffer card */
  	NUBUS_DRHW_APPLE_WVC      = 0x0006, /* Apple Workstation Video Card */
  	NUBUS_DRHW_SIGMA_CLRMAX   = 0x0007, /* Sigma Design ColorMax */
  	NUBUS_DRHW_APPLE_SE30     = 0x0009, /* Apple SE/30 video */
  	NUBUS_DRHW_APPLE_HRVC     = 0x0013, /* Mac II High-Res Video Card */
  	NUBUS_DRHW_APPLE_PVC      = 0x0017, /* Mac II Portrait Video Card */
  	NUBUS_DRHW_APPLE_RBV1     = 0x0018, /* IIci RBV video */
  	NUBUS_DRHW_APPLE_MDC      = 0x0019, /* Macintosh Display Card */
  	NUBUS_DRHW_APPLE_SONORA   = 0x0022, /* Sonora built-in video */
  	NUBUS_DRHW_APPLE_24AC     = 0x002b, /* Mac 24AC Video Card */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
123
  	NUBUS_DRHW_APPLE_VALKYRIE = 0x002e,
f87795887   Finn Thain   NuBus header update
124
125
126
127
128
129
130
131
132
133
134
  	NUBUS_DRHW_APPLE_JET      = 0x0029, /* Jet framebuffer (DuoDock) */
  	NUBUS_DRHW_SMAC_GFX       = 0x0105, /* SuperMac GFX */
  	NUBUS_DRHW_RASTER_CB264   = 0x013B, /* RasterOps ColorBoard 264 */
  	NUBUS_DRHW_MICRON_XCEED   = 0x0146, /* Micron Exceed color */
  	NUBUS_DRHW_RDIUS_GSC      = 0x0153, /* Radius GS/C */
  	NUBUS_DRHW_SMAC_SPEC8     = 0x017B, /* SuperMac Spectrum/8 */
  	NUBUS_DRHW_SMAC_SPEC24    = 0x017C, /* SuperMac Spectrum/24 */
  	NUBUS_DRHW_RASTER_CB364   = 0x026F, /* RasterOps ColorBoard 364 */
  	NUBUS_DRHW_RDIUS_DCGX     = 0x027C, /* Radius DirectColor/GX */
  	NUBUS_DRHW_RDIUS_PC8      = 0x0291, /* Radius PrecisionColor 8 */
  	NUBUS_DRHW_LAPIS_PCS8     = 0x0292, /* Lapis ProColorServer 8 */
57dfee7c3   Finn Thain   mac68k: add nubus...
135
  	NUBUS_DRHW_RASTER_24XLI   = 0x02A0, /* RasterOps 8/24 XLi */
f87795887   Finn Thain   NuBus header update
136
137
  	NUBUS_DRHW_RASTER_PBPGT   = 0x02A5, /* RasterOps PaintBoard Prism GT */
  	NUBUS_DRHW_EMACH_FSX      = 0x02AE, /* E-Machines Futura SX */
57dfee7c3   Finn Thain   mac68k: add nubus...
138
  	NUBUS_DRHW_RASTER_24XLTV  = 0x02B7, /* RasterOps 24XLTV */
f87795887   Finn Thain   NuBus header update
139
  	NUBUS_DRHW_SMAC_THUND24   = 0x02CB, /* SuperMac Thunder/24 */
57dfee7c3   Finn Thain   mac68k: add nubus...
140
  	NUBUS_DRHW_SMAC_THUNDLGHT = 0x03D9, /* SuperMac ThunderLight */
f87795887   Finn Thain   NuBus header update
141
142
143
  	NUBUS_DRHW_RDIUS_PC24XP   = 0x0406, /* Radius PrecisionColor 24Xp */
  	NUBUS_DRHW_RDIUS_PC24X    = 0x040A, /* Radius PrecisionColor 24X */
  	NUBUS_DRHW_RDIUS_PC8XJ    = 0x040B, /* Radius PrecisionColor 8XJ */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
144
145
  	
  	/* NUBUS_CAT_NETWORK */
f87795887   Finn Thain   NuBus header update
146
147
148
149
150
151
152
153
154
155
156
  	NUBUS_DRHW_INTERLAN       = 0x0100,
  	NUBUS_DRHW_SMC9194        = 0x0101,
  	NUBUS_DRHW_KINETICS       = 0x0106,
  	NUBUS_DRHW_CABLETRON      = 0x0109,
  	NUBUS_DRHW_ASANTE_LC      = 0x010f,
  	NUBUS_DRHW_SONIC          = 0x0110,
  	NUBUS_DRHW_TECHWORKS      = 0x0112,
  	NUBUS_DRHW_APPLE_SONIC_NB = 0x0118,
  	NUBUS_DRHW_APPLE_SONIC_LC = 0x0119,
  	NUBUS_DRHW_FOCUS          = 0x011c,
  	NUBUS_DRHW_SONNET         = 0x011d,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
  };
  
  /* Resource IDs: These are the identifiers for the various weird and
     wonderful tidbits of information that may or may not reside in the
     NuBus ROM directory. */
  enum nubus_res_id {
  	NUBUS_RESID_TYPE         = 0x0001,
  	NUBUS_RESID_NAME         = 0x0002,
  	NUBUS_RESID_ICON         = 0x0003,
  	NUBUS_RESID_DRVRDIR      = 0x0004,
  	NUBUS_RESID_LOADREC      = 0x0005,
  	NUBUS_RESID_BOOTREC      = 0x0006,
  	NUBUS_RESID_FLAGS        = 0x0007,
  	NUBUS_RESID_HWDEVID      = 0x0008,
  	NUBUS_RESID_MINOR_BASEOS = 0x000a,
  	NUBUS_RESID_MINOR_LENGTH = 0x000b,
  	NUBUS_RESID_MAJOR_BASEOS = 0x000c,
  	NUBUS_RESID_MAJOR_LENGTH = 0x000d,
  	NUBUS_RESID_CICN         = 0x000f,
  	NUBUS_RESID_ICL8         = 0x0010,
  	NUBUS_RESID_ICL4         = 0x0011,
  };
  
  /* Category-specific resources. */
  enum nubus_board_res_id {
f87795887   Finn Thain   NuBus header update
182
  	NUBUS_RESID_BOARDID      = 0x0020,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
183
  	NUBUS_RESID_PRAMINITDATA = 0x0021,
f87795887   Finn Thain   NuBus header update
184
  	NUBUS_RESID_PRIMARYINIT  = 0x0022,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
185
  	NUBUS_RESID_TIMEOUTCONST = 0x0023,
f87795887   Finn Thain   NuBus header update
186
187
188
  	NUBUS_RESID_VENDORINFO   = 0x0024,
  	NUBUS_RESID_BOARDFLAGS   = 0x0025,
  	NUBUS_RESID_SECONDINIT   = 0x0026,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
189
190
  
  	/* Not sure why Apple put these next two in here */
f87795887   Finn Thain   NuBus header update
191
192
  	NUBUS_RESID_VIDNAMES     = 0x0041,
  	NUBUS_RESID_VIDMODES     = 0x007e
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
  };
  
  /* Fields within the vendor info directory */
  enum nubus_vendor_res_id {
  	NUBUS_RESID_VEND_ID     = 0x0001,
  	NUBUS_RESID_VEND_SERIAL = 0x0002,
  	NUBUS_RESID_VEND_REV    = 0x0003,
  	NUBUS_RESID_VEND_PART   = 0x0004,
  	NUBUS_RESID_VEND_DATE   = 0x0005
  };
  
  enum nubus_net_res_id {
  	NUBUS_RESID_MAC_ADDRESS  = 0x0080
  };
  
  enum nubus_cpu_res_id {
  	NUBUS_RESID_MEMINFO      = 0x0081,
  	NUBUS_RESID_ROMINFO      = 0x0082
  };
  
  enum nubus_display_res_id {
f87795887   Finn Thain   NuBus header update
214
215
216
217
218
219
220
  	NUBUS_RESID_GAMMADIR    = 0x0040,
  	NUBUS_RESID_FIRSTMODE   = 0x0080,
  	NUBUS_RESID_SECONDMODE  = 0x0081,
  	NUBUS_RESID_THIRDMODE   = 0x0082,
  	NUBUS_RESID_FOURTHMODE  = 0x0083,
  	NUBUS_RESID_FIFTHMODE   = 0x0084,
  	NUBUS_RESID_SIXTHMODE   = 0x0085
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
  };
  
  struct nubus_dir
  {
  	unsigned char *base;
  	unsigned char *ptr;
  	int done;
  	int mask;
  };
  
  struct nubus_dirent
  {
  	unsigned char *base;
  	unsigned char type;
  	__u32 data;	/* Actually 24bits used */
  	int mask;
  };
5007b1fc4   Jaswinder Singh Rajput   headers_check fix...
238
  #ifdef __KERNEL__
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
239
240
241
242
  struct nubus_board {
  	struct nubus_board* next;
  	struct nubus_dev* first_dev;
  	
f87795887   Finn Thain   NuBus header update
243
  	/* Only 9-E actually exist, though 0-8 are also theoretically
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
  	   possible, and 0 is a special case which represents the
  	   motherboard and onboard peripherals (Ethernet, video) */
  	int slot;
  	/* For slot 0, this is bogus. */
  	char name[64];
  
  	/* Format block */
  	unsigned char* fblock;
  	/* Root directory (does *not* always equal fblock + doffset!) */
  	unsigned char* directory;
  	
  	unsigned long slot_addr;
  	/* Offset to root directory (sometimes) */
  	unsigned long doffset;
  	/* Length over which to compute the crc */
  	unsigned long rom_length;
  	/* Completely useless most of the time */
  	unsigned long crc;
  	unsigned char rev;
  	unsigned char format;
  	unsigned char lanes;
  };
  
  struct nubus_dev {
  	/* Next link in device list */
  	struct nubus_dev* next;
  	/* Directory entry in /proc/bus/nubus */
  	struct proc_dir_entry* procdir;
  
  	/* The functional resource ID of this device */
  	unsigned char resid;
  	/* These are mostly here for convenience; we could always read
  	   them from the ROMs if we wanted to */
  	unsigned short category;
  	unsigned short type;
  	unsigned short dr_sw;
  	unsigned short dr_hw;
  	/* This is the device's name rather than the board's.
  	   Sometimes they are different.  Usually the board name is
  	   more correct. */
  	char name[64];
  	/* MacOS driver (I kid you not) */
  	unsigned char* driver;
  	/* Actually this is an offset */
  	unsigned long iobase;
  	unsigned long iosize;
  	unsigned char flags, hwdevid;
  	
  	/* Functional directory */
  	unsigned char* directory;
  	/* Much of our info comes from here */
  	struct nubus_board* board;
  };
  
  /* This is all NuBus devices (used to find devices later on) */
  extern struct nubus_dev* nubus_devices;
  /* This is all NuBus cards */
  extern struct nubus_board* nubus_boards;
  
  /* Generic NuBus interface functions, modelled after the PCI interface */
  void nubus_scan_bus(void);
  extern void nubus_proc_init(void);
  int get_nubus_list(char *buf);
  int nubus_proc_attach_device(struct nubus_dev *dev);
  int nubus_proc_detach_device(struct nubus_dev *dev);
  /* If we need more precision we can add some more of these */
  struct nubus_dev* nubus_find_device(unsigned short category,
  				    unsigned short type,
  				    unsigned short dr_hw,
  				    unsigned short dr_sw,
  				    const struct nubus_dev* from);
  struct nubus_dev* nubus_find_type(unsigned short category,
  				  unsigned short type,
  				  const struct nubus_dev* from);
  /* Might have more than one device in a slot, you know... */
  struct nubus_dev* nubus_find_slot(unsigned int slot,
  				  const struct nubus_dev* from);
  
  /* These are somewhat more NuBus-specific.  They all return 0 for
     success and -1 for failure, as you'd expect. */
  
  /* The root directory which contains the board and functional
     directories */
  int nubus_get_root_dir(const struct nubus_board* board,
  		       struct nubus_dir* dir);
  /* The board directory */
  int nubus_get_board_dir(const struct nubus_board* board,
  			struct nubus_dir* dir);
  /* The functional directory */
  int nubus_get_func_dir(const struct nubus_dev* dev,
  		       struct nubus_dir* dir);
  
  /* These work on any directory gotten via the above */
  int nubus_readdir(struct nubus_dir* dir,
  		  struct nubus_dirent* ent);
  int nubus_find_rsrc(struct nubus_dir* dir,
  		    unsigned char rsrc_type,
  		    struct nubus_dirent* ent);
  int nubus_rewinddir(struct nubus_dir* dir);
  
  /* Things to do with directory entries */
  int nubus_get_subdir(const struct nubus_dirent* ent,
  		     struct nubus_dir* dir);
  void nubus_get_rsrc_mem(void* dest,
  			const struct nubus_dirent *dirent,
  			int len);
  void nubus_get_rsrc_str(void* dest,
  			const struct nubus_dirent *dirent,
  			int maxlen);
9fe03bc31   Jaswinder Singh Rajput   headers_check fix...
353
  #endif /* __KERNEL__ */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
354
355
356
357
358
359
360
361
  
  /* We'd like to get rid of this eventually.  Only daynaport.c uses it now. */
  static inline void *nubus_slot_addr(int slot)
  {
  	return (void *)(0xF0000000|(slot<<24));
  }
  
  #endif /* LINUX_NUBUS_H */