summaryrefslogtreecommitdiff
path: root/sys/arch/sgi/xbow/xbow.h
blob: 1a5bed14da6c64d6ae32ad29e1e4f3c7a464668f (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
/*	$OpenBSD: xbow.h,v 1.1 2008/04/07 22:47:40 miod Exp $	*/

/*
 * Copyright (c) 2008 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.
 *
 * 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.
 */

#ifndef	_XBOW_H_
#define	_XBOW_H_

/*
 * Devices connected to the XBow are called ``widgets'' and are
 * identified by a common widget memory area at the beginning of their
 * memory space.
 *
 * Each widget has its own memory space, upon which windows of different
 * sizes can be defined. OpenBSD only cares about the shortest window
 * (which fits in 32 bits of address space), and the longest window (which
 * provides access to the complete widget space).
 *
 * Apart from the crossbow itself being widget #0, the widgets are divided
 * in two groups: widgets #8 to #b are the ``upper'' widgets, while widgets
 * #c to #f are the ``lower'' widgets.
 *
 * Widgets are uniquely identified with their widget number on the XBow
 * bus. However, the way they are mapped and accessed will depend on the
 * processor (well, the processor board node) requesting access. Hence the
 * two parameters needed to map a widget.
 */

extern	paddr_t (*xbow_widget_short)(int16_t, u_int);
extern	paddr_t (*xbow_widget_long)(int16_t, u_int);
extern	unsigned int xbow_long_shift;

extern	int	(*xbow_widget_id)(int16_t, u_int, uint32_t *);
extern	int	xbow_intr_widget;
extern	unsigned int xbow_intr_widget_register;

extern	int	(*xbow_intr_widget_intr_register)(int, int, int *);
extern	int	(*xbow_intr_widget_intr_establish)(int (*)(void *), void *,
		    int, int, const char *);
extern	void	(*xbow_intr_widget_intr_disestablish)(int);

/*
 * Common Widget Registers.  Every widget provides them.
 */

/* all registers are 32 bits within big-endian 64 bit blocks */
#define	WIDGET_ID			0x0004
#define	WIDGET_ID_REV_MASK			0xf0000000
#define	WIDGET_ID_REV_SHIFT			28
#define	WIDGET_ID_PRODUCT_MASK			0x0ffff000
#define	WIDGET_ID_PRODUCT_SHIFT			12
#define	WIDGET_ID_VENDOR_MASK			0x00000ffe
#define	WIDGET_ID_VENDOR_SHIFT			1
#define	WIDGET_STATUS			0x000c
#define	WIDGET_ERR_ADDR_UPPER		0x0014
#define	WIDGET_ERR_ADDR_LOWER		0x001c
#define	WIDGET_CONTROL			0x0024
#define	WIDGET_REQ_TIMEOUT		0x002c
#define	WIDGET_INTDEST_ADDR_UPPER	0x0034
#define	WIDGET_INTDEST_ADDR_LOWER	0x003c
#define	WIDGET_ERR_CMD_WORD		0x0044
#define	WIDGET_LLP_CFG			0x004c
#define	WIDGET_TFLUSH			0x0054

/*
 * Crossbow Specific Registers.
 */

#define	XBOW_WID_ARB_RELOAD		0x005c
#define	XBOW_PERFCNTR_A			0x0064
#define	XBOW_PERFCNTR_B			0x006c
#define	XBOW_NIC			0x0074
#define	XBOW_WIDGET_LINK(w)		(0x0100 + ((w) & 7) * 0x0040)

/*
 * Per-widget ``Link'' Register Set.
 */
#define	WIDGET_LINK_IBF			0x0004
#define	WIDGET_LINK_CONTROL		0x000c
#define	WIDGET_CONTROL_ALIVE			0x80000000
#define	WIDGET_LINK_STATUS		0x0014
#define	WIDGET_STATUS_ALIVE			0x80000000
#define	WIDGET_LINK_ARB_UPPER		0x001c
#define	WIDGET_LINK_ARB_LOWER		0x0024
#define	WIDGET_LINK_STATUS_CLEAR	0x002c
#define	WIDGET_LINK_RESET		0x0034
#define	WIDGET_LINK_AUX_STATUS		0x003c


struct xbow_attach_args {
	int		xaa_widget;

	uint32_t	xaa_vendor;
	uint32_t	xaa_product;
	uint32_t	xaa_revision;

	bus_space_tag_t xaa_short_tag;
	bus_space_tag_t xaa_long_tag;
};

void	xbow_build_bus_space(struct mips_bus_space *, int, int, int);
int	xbow_intr_register(int, int, int *);
int	xbow_intr_establish(int (*)(void *), void *, int, int, const char *);
void	xbow_intr_disestablish(int);

uint8_t xbow_read_1(bus_space_tag_t, bus_space_handle_t, bus_size_t);
uint16_t xbow_read_2(bus_space_tag_t, bus_space_handle_t, bus_size_t);
void	xbow_write_1(bus_space_tag_t, bus_space_handle_t, bus_size_t, uint8_t);
void	xbow_write_2(bus_space_tag_t, bus_space_handle_t, bus_size_t,
	    uint16_t);

#endif	/* _XBOW_H_ */