summaryrefslogtreecommitdiffstats
path: root/include/asm-arm/ecard.h
blob: afc4acc14de02e4c3483bd078826de01fa7384b0 (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
/*
 * linux/include/asm-arm/ecard.h
 *
 * definitions for expansion cards
 *
 * This is a new system as from Linux 1.2.3
 *
 * Changelog:
 *  11-12-1996	RMK	Further minor improvements
 *  12-09-1997	RMK	Added interrupt enable/disable for card level
 *
 * Reference: Acorns Risc OS 3 Programmers Reference Manuals.
 */

#ifndef __ASM_ECARD_H
#define __ASM_ECARD_H

/*
 * Currently understood cards (but not necessarily
 * supported):
 *                        Manufacturer  Product ID
 */
#define MANU_ACORN		0x0000
#define PROD_ACORN_SCSI			0x0002
#define PROD_ACORN_ETHER1		0x0003
#define PROD_ACORN_MFM			0x000b

#define MANU_ANT2		0x0011
#define PROD_ANT_ETHER3			0x00a4

#define MANU_ATOMWIDE		0x0017
#define PROD_ATOMWIDE_3PSERIAL		0x0090

#define MANU_OAK		0x0021
#define PROD_OAK_SCSI			0x0058

#define MANU_MORLEY		0x002b
#define PROD_MORLEY_SCSI_UNCACHED	0x0067

#define MANU_CUMANA		0x003a
#define PROD_CUMANA_SCSI_1		0x00a0
#define PROD_CUMANA_SCSI_2		0x003a

#define MANU_ICS		0x003c
#define PROD_ICS_IDE			0x00ae

#define MANU_SERPORT		0x003f
#define PROD_SERPORT_DSPORT		0x00b9

#define MANU_I3			0x0046
#define PROD_I3_ETHERLAN500		0x00d4
#define PROD_I3_ETHERLAN600		0x00ec
#define PROD_I3_ETHERLAN600A		0x011e

#define MANU_ANT		0x0053
#define PROD_ANT_ETHERB			0x00e4

#define MANU_ALSYSTEMS		0x005b
#define PROD_ALSYS_SCSIATAPI		0x0107

#define MANU_MCS		0x0063
#define PROD_MCS_CONNECT32		0x0125

#define MANU_EESOX		0x0064
#define PROD_EESOX_SCSI2		0x008c

#define MANU_YELLOWSTONE	0x0096
#define PROD_YELLOWSTONE_RAPIDE32	0x0120

#ifdef ECARD_C
#define CONST
#else
#define CONST const
#endif

#define MAX_ECARDS	8

/* Type of card's address space */
typedef enum {
	ECARD_IOC,
	ECARD_MEMC,
	ECARD_DEBI
} card_type_t;

/* Speed of card for ECARD_IOC address space */
typedef enum {
	ECARD_SLOW	 = 0,
	ECARD_MEDIUM	 = 1,
	ECARD_FAST	 = 2,
	ECARD_SYNC	 = 3
} card_speed_t;

/* Card ID structure */
typedef struct  {
	unsigned short manufacturer;
	unsigned short product;
} card_ids;

/* External view of card ID information */
struct in_ecld {
	unsigned short	product;
	unsigned short	manufacturer;
	unsigned char	ecld;
	unsigned char	country;
	unsigned char	fiqmask;
	unsigned char	irqmask;
	unsigned long	fiqaddr;
	unsigned long	irqaddr;
};

typedef struct expansion_card ecard_t;

/* Card handler routines */
typedef struct {
	void (*irqenable)(ecard_t *ec, int irqnr);
	void (*irqdisable)(ecard_t *ec, int irqnr);
	void (*fiqenable)(ecard_t *ec, int fiqnr);
	void (*fiqdisable)(ecard_t *ec, int fiqnr);
} expansioncard_ops_t;

typedef unsigned long *loader_t;

/*
 * This contains all the info needed on an expansion card
 */
struct expansion_card {
	/* Public data */
	volatile unsigned char *irqaddr;	/* address of IRQ register	*/
	volatile unsigned char *fiqaddr;	/* address of FIQ register	*/
	unsigned char		irqmask;	/* IRQ mask			*/
	unsigned char		fiqmask;	/* FIQ mask			*/
	unsigned char  		claimed;	/* Card claimed?		*/

	CONST unsigned char	slot_no;	/* Slot number			*/
	CONST unsigned char	dma;		/* DMA number (for request_dma)	*/
	CONST unsigned char	irq;		/* IRQ number (for request_irq)	*/
	CONST unsigned char	fiq;		/* FIQ number (for request_irq)	*/

	CONST struct in_ecld	cld;		/* Card Identification		*/
	void			*irq_data;	/* Data for use for IRQ by card	*/
	void			*fiq_data;	/* Data for use for FIQ by card	*/
	expansioncard_ops_t	*ops;		/* Enable/Disable Ops for card	*/

	/* Private internal data */
	CONST unsigned int	podaddr;	/* Base Linux address for card	*/
	CONST loader_t		loader;		/* loader program */
};

struct in_chunk_dir {
	unsigned int start_offset;
	union {
		unsigned char string[256];
		unsigned char data[1];
	} d;
};

/*
 * ecard_claim: claim an expansion card entry
 */
#define ecard_claim(ec) ((ec)->claimed = 1)

/*
 * ecard_release: release an expansion card entry
 */
#define ecard_release(ec) ((ec)->claimed = 0)

/*
 * Start finding cards from the top of the list
 */
extern void ecard_startfind (void);

/*
 * Find an expansion card with the correct cld, product and manufacturer code
 */
extern struct expansion_card *ecard_find (int cld, const card_ids *ids);
 
/*
 * Read a chunk from an expansion card
 * cd : where to put read data
 * ec : expansion card info struct
 * id : id number to find
 * num: (n+1)'th id to find.
 */
extern int ecard_readchunk (struct in_chunk_dir *cd, struct expansion_card *ec, int id, int num);

/*
 * Obtain the address of a card
 */
extern unsigned int ecard_address (struct expansion_card *ec, card_type_t card_type, card_speed_t speed);

#ifdef ECARD_C
/* Definitions internal to ecard.c - for it's use only!!
 *
 * External expansion card header as read from the card
 */
struct ex_ecld {
	unsigned char  r_ecld;
	unsigned char  r_reserved[2];
	unsigned char  r_product[2];
	unsigned char  r_manufacturer[2];
	unsigned char  r_country;
	         long  r_fiqs;
	         long  r_irqs;
#define e_ecld(x)	((x)->r_ecld)
#define e_cd(x)		((x)->r_reserved[0] & 1)
#define e_is(x)		((x)->r_reserved[0] & 2)
#define e_w(x)		(((x)->r_reserved[0] & 12)>>2)
#define e_prod(x)	((x)->r_product[0]|((x)->r_product[1]<<8))
#define e_manu(x)	((x)->r_manufacturer[0]|((x)->r_manufacturer[1]<<8))
#define e_country(x)	((x)->r_country)
#define e_fiqmask(x)	((x)->r_fiqs & 0xff)
#define e_fiqaddr(x)	((x)->r_fiqs >> 8)
#define e_irqmask(x)	((x)->r_irqs & 0xff)
#define e_irqaddr(x)	((x)->r_irqs >> 8)
};

/*
 * Chunk directory entry as read from the card
 */
struct ex_chunk_dir {
	unsigned char r_id;
	unsigned char r_len[3];
	unsigned long r_start;
	union {
		char string[256];
		char data[1];
	} d;
#define c_id(x)		((x)->r_id)
#define c_len(x)	((x)->r_len[0]|((x)->r_len[1]<<8)|((x)->r_len[2]<<16))
#define c_start(x)	((x)->r_start)
};

#endif

#endif