summaryrefslogtreecommitdiff
path: root/sys/arch/mvme88k/dev/bppvar.h
blob: ddbfe012598c7db6449ebc4574f524e26aac07fb (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
/*	$OpenBSD: bppvar.h,v 1.2 2009/02/14 17:41:42 miod Exp $	*/

/*
 * Copyright (c) 2008, 2009  Miodrag Vallat.
 *
 * Permission to use, copy, modify, and distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies. And
 * I won't mind if you keep the disclaimer below.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

/*
 * Register and structure definitions for MVME boards using the Motorola
 * Buffered Pipe Protocol.
 */

/*
 * Register layout (CSR space)
 */

#define	CSR_ADDR			0x00	/* 32 */
#define	CSR_ADDR_MOD			0x04	/* 8 */
#define	CSR_DATA_WIDTH			0x05	/* 8 */
/* IPC control register */
#define	CSR_CONTROL			0x06	/* 16 */
#define	CSR_STATUS			0x08	/* 8 */
#define	CSR_DIAG			0x09	/* 8 */
#define	CSR_TAS				0x0e	/* 16 */

/* CSR bits */
#define	CSR_BUSY			0x8000	/* firmware busy */
#define	CSR_RESET			0x4000	/* reset board */
#define	CSR_ATTENTION			0x2000	/* interrupt firmware */
#define	CSR_INHIBIT_SYSFAIL		0x1000

/* TAS bits */
#define	TAS_TAS				0x8000	/* test and set bit */
#define	TAS_VALID_COMMAND		0x4000
#define	TAS_VALID_STATUS		0x2000
#define	TAS_COMMAND_COMPLETE		0x1000
#define	TAS_COMMAND_MASK		0x0fff

/* TAS commands */
#define	COMMAND_CHANNEL_CREATE		0x001
#define	COMMAND_CHANNEL_DELETE		0x002
#define	COMMAND_DUMP_MEMORY		0x101

/* command status values */
#define	STATUS_OK			0x00
#define	STATUS_INVALID_COMMAND		0x01
#define	STATUS_READ_CHANNEL_HEADER	0x02
#define	STATUS_WRITE_CHANNEL_HEADER	0x03
#define	STATUS_DMA_READ			0x04
#define	STATUS_DMA_WRITE		0x05
#define	STATUS_NO_MORE_CHANNELS		0x06
#define	STATUS_NO_SUCH_CHANNEL		0x07
/* catastrophic errors start here... */
#define	STATUS_LOCAL_ADDRESS_ERROR	0xaa
#define	STATUS_ACFAIL			0xac
#define	STATUS_LOCAL_BUS_ERROR		0xbb
#define	STATUS_CONFIDENCE_FAILED	0xcc
#define	STATUS_UNEXPECTED_ERROR		0xee
#define	STATUS_ERRNO			0x100	/* not from status reg */

/*
 * BPP Channel header
 */

struct bpp_channel {
	uint32_t	ch_cmd_head;	/* command pipe head */
	uint32_t	ch_cmd_tail;	/* command pipe tail */
	uint32_t	ch_status_head;	/* status pipe head */
	uint32_t	ch_status_tail;	/* status pipe tail */
	uint8_t		ch_ipl;		/* channel interrupt level */
	uint8_t		ch_ivec;	/* channel interrupt vector */
	uint8_t		ch_priority;	/* channel priority */
#define	BPP_PRIORITY_HIGHEST	0x00
#define	BPP_PRIORITY_LOWEST	0xff
	uint8_t		ch_addrmod;	/* envelope memory address modifier */
	uint8_t		ch_num;		/* set by firmware */
	uint8_t		ch_valid;	/* set by firmware */
	uint8_t		ch_buswidth;	/* unused */
	uint8_t		reserved;
};

/*
 * BPP Envelope structure
 */

struct bpp_envelope {
	uint32_t	env_link;	/* next envelope */
	uint32_t	env_pkt;	/* command packet physical address */
	uint8_t		env_valid;
#define	ENVELOPE_INVALID	0x00
#define	ENVELOPE_VALID		0x01	/* any nonzero value will do */
	uint8_t		reserved[3];
	/*
	 * The following is not part of the envelope as defined by the
	 * firmware, but is used to page the envelope to a 68040/88200
	 * cache line boundary.
	 */
	uint32_t	pad;
	/* total size 0x10 bytes */
};

/*
 * Data bus width
 */

#define	MEMT_D16	1
#define	MEMT_D32	2

/*
 * The following defines ought to be in a MI vme header file...
 */

/*
 * VME addressing modes
 */

#define	ADRM_STD_S_P		0x3e	/* standard supervisory program */
#define	ADRM_STD_S_D		0x3d	/* standard supervisory data */
#define	ADRM_STD_N_P		0x3a	/* standard normal program */
#define	ADRM_STD_N_D		0x39	/* standard normal data */
#define	ADRM_SHT_S_IO		0x2d	/* short supervisory I/O */
#define	ADRM_SHT_N_IO		0x29	/* short normal I/O */
#define	ADRM_EXT_S_P		0x0e	/* extended supervisory program */
#define	ADRM_EXT_S_D		0x0d	/* extended supervisory data */
#define	ADRM_EXT_N_P		0x0a	/* extended normal program */
#define	ADRM_EXT_N_D		0x09	/* extended normal data */
#define	ADRM_EXT_S_BM		0x0f	/* extended supervisory block mode */
#define	ADRM_EXT_S_D64		0x0c	/* extended supervisory D64 mode */

/*
 * Per channel information
 */

struct bpp_chan {
	struct bpp_channel	*ch;		/* bpp communication channel */

	struct bpp_envelope	*envcmd;	/* command tail envelope */
	struct bpp_envelope	*envsts;	/* status head envelope */
};

/*
 * Device superset
 */

struct bpp_softc {
	struct device		 sc_dev;

	bus_space_tag_t		 sc_iot;	/* CSR registers access */
	bus_space_handle_t	 sc_ioh;

	struct bpp_envelope	*sc_env_free;	/* head of free envelope list */

	/* channel function pointers */
	paddr_t	(*bpp_chan_pa)(struct bpp_softc *, struct bpp_channel *);
	void	(*bpp_chan_sync)(struct bpp_softc *, struct bpp_channel *, int);

	/* envelope function pointers */
	paddr_t	(*bpp_env_pa)(struct bpp_softc *, struct bpp_envelope *);
	struct bpp_envelope *(*bpp_env_va)(struct bpp_softc *, paddr_t);
	void	(*bpp_env_sync)(struct bpp_softc *, struct bpp_envelope *, int);
};

void	bpp_attach(struct bpp_softc *, bus_space_tag_t, bus_space_handle_t);
void	bpp_attention(struct bpp_softc *);
int	bpp_create_channel(struct bpp_softc *, struct bpp_chan *,
	    int, int, int);
int	bpp_dequeue_envelope(struct bpp_softc *, struct bpp_chan *, paddr_t *);
struct bpp_envelope *
	bpp_get_envelope(struct bpp_softc *);
void	bpp_initialize_envelopes(struct bpp_softc *, struct bpp_envelope *,
	    uint);
void	bpp_put_envelope(struct bpp_softc *, struct bpp_envelope *);
void	bpp_queue_envelope(struct bpp_softc *, struct bpp_chan *,
	    struct bpp_envelope *, paddr_t);
int	bpp_reset(struct bpp_softc *);