summaryrefslogtreecommitdiff
path: root/sys/arch/sparc/include/eeprom.h
blob: 42a0fc772ac502d1614161157831a71549b1275c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
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
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
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
353
354
355
356
357
358
359
360
/*	$OpenBSD: eeprom.h,v 1.12 2010/06/07 19:43:49 miod Exp $	*/

/*
 * Copyright (c) 1995 Theo de Raadt
 * All rights reserved.
 * Portions Copyright (c) 1997, Jason Downs.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

/*
 * This structure defines the contents of the EEPROM for all Sun
 * Workstations with the SunMon monitor.
 *
 * The EEPROM is divided into a diagnostic section, a reserved section,
 * a ROM section, and a software section (defined in detail elsewhere).
 */

/*
 * Note that most places where the PROM stores a "true/false" flag,
 * the true value is 0x12 and false is the usual zero.  Such flags
 * all take the values EE_TRUE or EE_FALSE so this file does not
 * need to define so many value macros.
 */
#define EE_TRUE		0x12
#define EE_FALSE	0x00

struct ee_keymap {
	u_char	keymap[128];	/* PROM/EEPROM are 7 bit */
};

#define PW_SIZE	8			/* max size of a password entry */

struct password_inf {
	u_short	bad_counter;		/* illegal password count */
	char	pw_mode;		/* mode */
	char	pw_bytes[PW_SIZE];	/* password */
};
#define NON_SECURE_MODE		0x00	/* non-secure */
#define COMMAND_SECURE_MODE	0x01	/* command secure */
#define FULLY_SECURE_MODE	0x5e	/* fully secure */
					/* 0, 2-0x5d, 0x5f-0xff: non secure*/


#define MAX_SLOTS	12
#define CONFIG_SIZE	16	/* bytes of config data for each slot */

struct eeprom {
	struct ee_diag {
		u_int	eed_test;	/* 0x000: diagnostic test write area */
		u_short	eed_wrcnt[3];	/* 0x004: diag area write count (3 copies) */
		short	eed_nu1;

		u_char	eed_chksum[3];	/* 0x00c: diag area checksum (3 copies) */
		char	eed_nu2;
		time_t	eed_hwupdate;	/* 0x010: date of last hardware update */

		char	eed_memsize;	/* 0x014: MB's of memory in system */
		char	eed_memtest;	/* 0x015: MB's of memory to test */

		char	eed_scrsize;	/* 0x016: screen size */
#define	EED_SCR_1152X900	0x00
#define	EED_SCR_1024X1024	0x12
#define EED_SCR_1600X1280	0x13
#define EED_SCR_1440X1440	0x14
#define EED_SCR_640X480		0x15
#define EED_SCR_1280X1024	0x16

		char	eed_dogaction;	/* 0x017: watchdog reset action */
#define	EED_DOG_MONITOR		0x00	/* return to monitor command level */
#define	EED_DOG_REBOOT		0x12	/* perform power on reset and reboot */

		char	eed_defboot;	/* 0x018: default boot? */
#define	EED_DEFBOOT		0x00	/* do default boot */
#define	EED_NODEFBOOT		0x12	/* don't do default boot */

		char	eed_bootdev[2];	/* 0x019: boot device name (e.g. xy, ie) */

		u_char	eed_bootctrl;	/* 0x01b: controller number */
		u_char	eed_bootunit;	/* 0x01c: unit number */
		u_char	eed_bootpart;	/* 0x01d: partition number */

		char	eed_kbdtype;	/* 0x01e: non-Sun keyboard type - for OEM's */
#define	EED_KBD_SUN	0		/* one of the Sun keyboards */

		char	eed_console;	/* 0x01f: console device */
#define	EED_CONS_BW	0x00		/* use b&w monitor */
#define	EED_CONS_TTYA	0x10		/* use tty A port */
#define	EED_CONS_TTYB	0x11		/* use tty B port */
#define	EED_CONS_COLOR	0x12		/* use color monitor */
#define EED_CONS_P4	0x20		/* use the P4 monitor */

		char	eed_showlogo;	/* 0x020: display Sun logo? */
#define	EED_LOGO	0x00
#define	EED_NOLOGO	0x12

		char	eed_keyclick;	/* 0x021: keyboard click? */
#define	EED_NOKEYCLICK	0x00
#define	EED_KEYCLICK	0x12

		char	eed_diagdev[2];	/* 0x022: boot device name (e.g. xy, ie) */
		u_char	eed_diagctrl;	/* 0x024: controller number */
		u_char	eed_diagunit;	/* 0x025: unit number */
		u_char	eed_diagpart;	/* 0x026: partition number */
#define	EED_WOB	0x12			/* bring system up white on black */

		u_char	eed_videobg;
		char	eed_diagpath[40]; /* 0x028: boot path of diagnostic */
#define EED_TERM_34x80	00
#define EED_TERM_48x120	0x12		/* for large scrn size 1600x1280 */
		u_char	eed_colsize;	/* 0x050: number of columns */
		u_char	eed_rowsize;	/* 0x051: number of rows */

		char	eed_nu5[6];

		struct eed_tty_def {	/* 0x058: tty port defaults */
			char	eet_sel_baud;	/* user specifies baud rate */
#define	EET_DEFBAUD	0x00
#define	EET_SELBAUD	0x12
			u_char	eet_hi_baud;	/* upper byte of baud rate */
			u_char	eet_lo_baud;	/* lower byte of baud rate */
			u_char	eet_rtsdtr;	/* flag for dtr and rts */
#define NO_RTSDTR	0x12
			char	eet_unused[4];
		} eed_ttya_def, eed_ttyb_def;

		char	eed_banner[80];	/* 0x068: replacement banner */
		/* last two chars must be \r\n (XXX - why not \0?) */

		u_short	eed_pattern;	/* 0x0b8: test pattern - must contain 0xAA55 */
		short	eed_nu6;
		struct eed_conf {	/* 0x0bc: system configuration, by slot */
			union {
				struct eec_gen {
					u_char	eec_type;	/* board type code */
					char	eec_size[CONFIG_SIZE - 1];
				} eec_gen;

				char	conf_byte[CONFIG_SIZE];
				u_char	eec_type;	/* type of this board */
#define	EEC_TYPE_NONE	0	/* no board this slot */
#define	EEC_TYPE_CPU	0x01	/* cpu */
				struct eec_cpu {
					u_char	eec_type;		/* board type */
					u_char	eec_cpu_memsize;	/* MB's on cpu */
					int	eec_cpu_unused:6;
					int	eec_cpu_dcp:1;		/* dcp? */
					int	eec_cpu_68881:1;	/* 68881? */
					u_char	eec_cpu_cachesize;	/* KB's cache */
				} eec_cpu;
				struct eec_cpu_alt {
					u_char	eec_type;	/* board type */
					u_char	memsize;	/* MB's on cpu */
					u_char	option;	/* option flags */
#define CPU_HAS_DCP	0x02
#define CPU_HAS_68881	0x01
					u_char	cachesize;	/* KB's in cache */
				} eec_cpu_alt;

#define	EEC_TYPE_MEM	0x02	/* memory board */
				struct eec_mem {
					u_char	eec_type;	/* board type */
					u_char	eec_mem_size;	/* MB's on card */
				} eec_mem;

#define	EEC_TYPE_COLOR	0x03	/* color frame buffer */
				struct eec_color {
					u_char	eec_type;	/* board type */
					char	eec_color_type;
#define	EEC_COLOR_TYPE_CG2	2	/* cg2 color board */
#define	EEC_COLOR_TYPE_CG3	3	/* cg3 color board */
#define	EEC_COLOR_TYPE_CG5	5	/* cg5 color board */
				} eec_color;

#define	EEC_TYPE_BW	0x04	/* b&w frame buffer */

#define	EEC_TYPE_FPA	0x05	/* floating point accelerator */

#define	EEC_TYPE_DISK	0x06	/* SMD disk controller */
				struct eec_disk {
					u_char	eec_type;	/* board type */
					char	eec_disk_type;	/* controller type */
#define EEC_DISK_TYPE_X450	1
#define EEC_DISK_TYPE_X451	2
					char	eec_disk_ctlr;	/* controller number */
					char	eec_disk_disks;	/* number of disks */
					char	eec_disk_cap[4];	/* capacity */
#define EEC_DISK_NONE	0
#define EEC_DISK_130	1
#define EEC_DISK_280	2
#define EEC_DISK_380	3
#define EEC_DISK_575	4
#define EEC_DISK_900	5
				} eec_disk;

#define	EEC_TYPE_TAPE	0x07	/* 1/2" tape controller */
				struct eec_tape {
					u_char	eec_type;	/* board type */
					char	eec_tape_type;	/* controller type */
#define	EEC_TAPE_TYPE_XT	1	/* Xylogics 472 */
#define	EEC_TAPE_TYPE_MT	2	/* TapeMaster */
					char	eec_tape_ctlr;	/* controller number */
					char	eec_tape_drives;	/* number of drives */
				} eec_tape;

#define	EEC_TYPE_ETHER	0x08	/* Ethernet controller */

#define	EEC_TYPE_TTY	0x09	/* terminal multiplexer */
				struct eec_tty {
					u_char	eec_type;	/* board type */
					char	eec_tty_lines;	/* number of lines */
#define MAX_TTY_LINES	16
					char	manufacturer;	/* code for maker */
#define EEC_TTY_UNKNOWN	0
#define EEC_TTY_SYSTECH	1
#define EEC_TTY_SUN	2
				} eec_tty;

#define	EEC_TYPE_GP	0x0a	/* graphics processor/buffer */
				struct eec_gp {
					u_char	eec_type;	/* board type */
					char	eec_gp_type;
#define EEC_GP_TYPE_GPPLUS	1	/* GP+ graphic processor board */
#define EEC_GP_TYPE_GP2		2	/* GP2 graphic processor board */
				} eec_gp;

#define	EEC_TYPE_DCP	0x0b	/* DCP ??? XXX */

#define	EEC_TYPE_SCSI	0x0c	/* SCSI controller */
				struct eec_scsi {
					u_char	eec_type;	/* board type */
					char	eec_scsi_type;	/* host adaptor type */
#define EEC_SCSI_SUN2	2
#define EEC_SCSI_SUN3	3
					char	eec_scsi_tapes;	/* number of tapes */
					char	eec_scsi_disks;	/* number of disks */
					char	eec_scsi_tape_type;
#define EEC_SCSI_SYSG	1
#define EEC_SCSI_MT02	2
					char	eec_scsi_disk_type;
#define EEC_SCSI_MD21	1
#define EEC_SCSI_ADAPT	2
					char	eec_scsi_driv_code[2];
#define EEC_SCSI_D71	1
#define EEC_SCSI_D141	2
#define EEC_SCSI_D327	3
				} eec_scsi;
#define EEC_TYPE_IPC	0x0d

#define EEC_TYPE_GB	0x0e

#define EEC_TYPE_SCSI375	0x0f

#define EEC_TYPE_MAPKIT	0x10
				struct eec_mapkit {
					u_char	eec_type;	/* board type */
					char	eec_mapkit_hw;	/* whether INI */
#define EEC_TYPE_MAPKIT_INI	1
				} eec_mapkit;

#define EEC_TYPE_CHANNEL	0x11
#define EEC_TYPE_ALM2		0x12


				struct eec_generic_net {
#define EEC_TYPE_GENERIC_NET  0x13
					u_char	eec_devtype;	/* board type */
					u_char	eec_mem_type;	/* Memory type */
					u_char	gn_nu1;
					u_char	gn_nu2;
#define ID_VME		0x0	/* Data buffers are in VME space(Shared) */
#define ID_DVMA		0x1	/* or DVMA buffer memory type */
					char	*dev_reg_ptr;
				} eec_generic_net;


#define	EEC_TYPE_END	0xff	/* end of card cage */
			} eec_un;
		} eed_conf[MAX_SLOTS + 1];
#define EEPROM_TABLE  0x58	/* 1 indicates alternate key table. */
		u_char	which_kbt;	/* 0x18C: which keytable? */

		/*
		 * Note. The following contains the full keyboard id
		 * returned by the type4 transmit layout command. It is not
		 * necessarily anything to do with locale of operation.
		 */
		u_char	ee_kb_type;
		u_char	ee_kb_id;	/* 0x18E: keyboard id in case of EEPROM table */
#define EEPROM_LOGO 0x12
		u_char	otherlogo;	/* 0x18F: True if eeprom logo  needed */
		struct ee_keymap ee_keytab_lc[1];	/* 0x190: */
		struct ee_keymap ee_keytab_uc[1];	/* 0x210: */
		u_char	ee_logo[64][8];	/* 0x290: A 64X64 bit space for custom/OEM designed logo icon */
		struct password_inf ee_password_inf;	/* 0x490: reserved */
		char	eed_resv[0x500 - 0x49c];	/* 0x49c: reserved */
	} ee_diag;

	struct ee_resv {	/* reserved area of EEPROM */
		u_short	eev_wrcnt[3];	/* 0x500: write count (3 copies) */
		short	eev_nu1;
		u_char	eev_chksum[3];	/* 0x508: reserved area checksum (3 copies) */
		char	eev_nu2;
		char	eev_resv[0x600 - 0x50c];	/* 0x50c: */
	} ee_resv;

	struct ee_rom {		/* ROM area of EEPROM */
		u_short	eer_wrcnt[3];	/* 0x600: write count (3 copies) */
		short	eer_nu1;
		u_char	eer_chksum[3];	/* 0x608: ROM area checksum (3 copies) */
		char	eer_nu2;
		char	eer_resv[0x700 - 0x60c];	/* 0x60c: */
	} ee_rom;

	/*
	 * The following area is reserved for software (i.e. UNIX).
	 * The actual contents of this area are defined elsewhere.
	 */
	struct ee_softresv {	/* software area of EEPROM */
		u_short	ees_wrcnt[3];	/* 0x700: write count (3 copies) */
		short	ees_nu1;
		u_char	ees_chksum[3];	/* 0x708: software area checksum (3 copies) */
		char	ees_nu2;
		char	ees_resv[0x800 - 0x70c];	/* 0x70c: */
	} ee_soft;
};

#define EEPROM_BASE     0xffd04000

/*
 * The size of the eeprom on machines with the old clock is 2k.  However,
 * on machines with the new clock (and the `eeprom' in the nvram area)
 * there are only 2040 bytes available. (???).  Since we really only
 * care about the `diagnostic' area, we'll use its size when dealing
 * with the eeprom in general.
 */
#define EEPROM_SIZE             0x500

#ifdef _KERNEL
extern	char *eeprom_va;
int	eeprom_uio(struct uio *);
#endif /* _KERNEL */