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
|
/* $Id$
*
* This file is subject to the terms and conditions of the GNU General Public
* License. See the file "COPYING" in the main directory of this archive
* for more details.
*
* Copyright (C) 1992 - 1997, 2000 Silicon Graphics, Inc.
* Copyright (C) 2000 by Colin Ngam
*/
#ifndef _ASM_SN_PCI_PCI_DEFS_H
#define _ASM_SN_PCI_PCI_DEFS_H
#include <linux/config.h>
/* defines for the PCI bus architecture */
/* Bit layout of address fields for Type-1
* Configuration Space cycles.
*/
#define PCI_TYPE0_SLOT_MASK 0xFFFFF800
#define PCI_TYPE0_FUNC_MASK 0x00000700
#define PCI_TYPE0_REG_MASK 0x000000FF
#define PCI_TYPE0_SLOT_SHFT 11
#define PCI_TYPE0_FUNC_SHFT 8
#define PCI_TYPE0_REG_SHFT 0
#define PCI_TYPE0_FUNC(a) (((a) & PCI_TYPE0_FUNC_MASK) >> PCI_TYPE0_FUNC_SHFT)
#define PCI_TYPE0_REG(a) (((a) & PCI_TYPE0_REG_MASK) >> PCI_TYPE0_REG_SHFT)
#define PCI_TYPE0(s,f,r) ((((1<<(s)) << PCI_TYPE0_SLOT_SHFT) & PCI_TYPE0_SLOT_MASK) |\
(((f) << PCI_TYPE0_FUNC_SHFT) & PCI_TYPE0_FUNC_MASK) |\
(((r) << PCI_TYPE0_REG_SHFT) & PCI_TYPE0_REG_MASK))
/* Bit layout of address fields for Type-1
* Configuration Space cycles.
* NOTE: I'm including the byte offset within
* the 32-bit word as part of the register
* number as an extension of the layout in
* the PCI spec.
*/
#define PCI_TYPE1_BUS_MASK 0x00FF0000
#define PCI_TYPE1_SLOT_MASK 0x0000F100
#define PCI_TYPE1_FUNC_MASK 0x00000700
#define PCI_TYPE1_REG_MASK 0x000000FF
#define PCI_TYPE1_BUS_SHFT 16
#define PCI_TYPE1_SLOT_SHFT 11
#define PCI_TYPE1_FUNC_SHFT 8
#define PCI_TYPE1_REG_SHFT 0
#define PCI_TYPE1_BUS(a) (((a) & PCI_TYPE1_BUS_MASK) >> PCI_TYPE1_BUS_SHFT)
#define PCI_TYPE1_SLOT(a) (((a) & PCI_TYPE1_SLOT_MASK) >> PCI_TYPE1_SLOT_SHFT)
#define PCI_TYPE1_FUNC(a) (((a) & PCI_TYPE1_FUNC_MASK) >> PCI_TYPE1_FUNC_SHFT)
#define PCI_TYPE1_REG(a) (((a) & PCI_TYPE1_REG_MASK) >> PCI_TYPE1_REG_SHFT)
#define PCI_TYPE1(b,s,f,r) ((((b) << PCI_TYPE1_BUS_SHFT) & PCI_TYPE1_BUS_MASK) |\
(((s) << PCI_TYPE1_SLOT_SHFT) & PCI_TYPE1_SLOT_MASK) |\
(((f) << PCI_TYPE1_FUNC_SHFT) & PCI_TYPE1_FUNC_MASK) |\
(((r) << PCI_TYPE1_REG_SHFT) & PCI_TYPE1_REG_MASK))
/* Byte offsets of registers in CFG space
*/
#define PCI_CFG_VENDOR_ID 0x00 /* Vendor ID (2 bytes) */
#define PCI_CFG_DEVICE_ID 0x02 /* Device ID (2 bytes) */
#define PCI_CFG_COMMAND 0x04 /* Command (2 bytes) */
#define PCI_CFG_STATUS 0x06 /* Status (2 bytes) */
/* NOTE: if you are using a C "switch" statement to
* differentiate between the Config space registers, be
* aware that PCI_CFG_CLASS_CODE and PCI_CFG_BASE_CLASS
* are the same offset.
*/
#define PCI_CFG_REV_ID 0x08 /* Revision Id (1 byte) */
#define PCI_CFG_CLASS_CODE 0x09 /* Class Code (3 bytes) */
#define PCI_CFG_BASE_CLASS 0x09 /* Base Class (1 byte) */
#define PCI_CFG_SUB_CLASS 0x0A /* Sub Class (1 byte) */
#define PCI_CFG_PROG_IF 0x0B /* Prog Interface (1 byte) */
#define PCI_CFG_CACHE_LINE 0x0C /* Cache line size (1 byte) */
#define PCI_CFG_LATENCY_TIMER 0x0D /* Latency Timer (1 byte) */
#define PCI_CFG_HEADER_TYPE 0x0E /* Header Type (1 byte) */
#define PCI_CFG_BIST 0x0F /* Built In Self Test */
#define PCI_CFG_BASE_ADDR_0 0x10 /* Base Address (4 bytes) */
#define PCI_CFG_BASE_ADDR_1 0x14 /* Base Address (4 bytes) */
#define PCI_CFG_BASE_ADDR_2 0x18 /* Base Address (4 bytes) */
#define PCI_CFG_BASE_ADDR_3 0x1C /* Base Address (4 bytes) */
#define PCI_CFG_BASE_ADDR_4 0x20 /* Base Address (4 bytes) */
#define PCI_CFG_BASE_ADDR_5 0x24 /* Base Address (4 bytes) */
#define PCI_CFG_BASE_ADDR_OFF 0x04 /* Base Address Offset (1..5)*/
#define PCI_CFG_BASE_ADDR(n) (PCI_CFG_BASE_ADDR_0 + (n)*PCI_CFG_BASE_ADDR_OFF)
#define PCI_CFG_BASE_ADDRS 6 /* up to this many BASE regs */
#define PCI_CFG_CARDBUS_CIS 0x28 /* Cardbus CIS Pointer (4B) */
#define PCI_CFG_SUBSYS_VEND_ID 0x2C /* Subsystem Vendor ID (2B) */
#define PCI_CFG_SUBSYS_ID 0x2E /* Subsystem ID */
#define PCI_EXPANSION_ROM 0x30 /* Expansion Rom Base (4B) */
#define PCI_INTR_LINE 0x3C /* Interrupt Line (1B) */
#define PCI_INTR_PIN 0x3D /* Interrupt Pin (1B) */
#define PCI_MIN_GNT 0x3E /* Minimum Grant (1B) */
#define PCI_MAX_LAT 0x3F /* Maximum Latency (1B) */
#define PCI_CFG_VEND_SPECIFIC 0x40 /* first vendor specific reg */
/* layout for Type 0x01 headers */
#define PCI_CFG_PPB_BUS_PRI 0x18 /* immediate upstream bus # */
#define PCI_CFG_PPB_BUS_SEC 0x19 /* immediate downstream bus # */
#define PCI_CFG_PPB_BUS_SUB 0x1A /* last downstream bus # */
#define PCI_CFG_PPB_SEC_LAT 0x1B /* latency timer for SEC bus */
#define PCI_CFG_PPB_IOBASE 0x1C /* IO Base Addr bits 12..15 */
#define PCI_CFG_PPB_IOLIM 0x1D /* IO Limit Addr bits 12..15 */
#define PCI_CFG_PPB_SEC_STAT 0x1E /* Secondary Status */
#define PCI_CFG_PPB_MEMBASE 0x20 /* MEM Base Addr bits 16..31 */
#define PCI_CFG_PPB_MEMLIM 0x22 /* MEM Limit Addr bits 16..31 */
#define PCI_CFG_PPB_MEMPFBASE 0x24 /* PfMEM Base Addr bits 16..31 */
#define PCI_CFG_PPB_MEMPFLIM 0x26 /* PfMEM Limit Addr bits 16..31 */
#define PCI_CFG_PPB_MEMPFBASEHI 0x28 /* PfMEM Base Addr bits 32..63 */
#define PCI_CFG_PPB_MEMPFLIMHI 0x2C /* PfMEM Limit Addr bits 32..63 */
#define PCI_CFG_PPB_IOBASEHI 0x30 /* IO Base Addr bits 16..31 */
#define PCI_CFG_PPB_IOLIMHI 0x32 /* IO Limit Addr bits 16..31 */
#define PCI_CFG_PPB_SUB_VENDOR 0x34 /* Subsystem Vendor ID */
#define PCI_CFG_PPB_SUB_DEVICE 0x36 /* Subsystem Device ID */
#define PCI_CFG_PPB_INT_PIN 0x3D /* Interrupt Pin */
#define PCI_CFG_PPB_BRIDGE_CTRL 0x3E /* Bridge Control */
/* XXX- these might be DEC 21152 specific */
#define PCI_CFG_PPB_CHIP_CTRL 0x40
#define PCI_CFG_PPB_DIAG_CTRL 0x41
#define PCI_CFG_PPB_ARB_CTRL 0x42
#define PCI_CFG_PPB_SERR_DISABLE 0x64
#define PCI_CFG_PPB_CLK2_CTRL 0x68
#define PCI_CFG_PPB_SERR_STATUS 0x6A
/* Command Register layout (0x04) */
#define PCI_CMD_IO_SPACE 0x001 /* I/O Space device */
#define PCI_CMD_MEM_SPACE 0x002 /* Memory Space */
#define PCI_CMD_BUS_MASTER 0x004 /* Bus Master */
#define PCI_CMD_SPEC_CYCLES 0x008 /* Special Cycles */
#define PCI_CMD_MEMW_INV_ENAB 0x010 /* Memory Write Inv Enable */
#define PCI_CMD_VGA_PALETTE_SNP 0x020 /* VGA Palette Snoop */
#define PCI_CMD_PAR_ERR_RESP 0x040 /* Parity Error Response */
#define PCI_CMD_WAIT_CYCLE_CTL 0x080 /* Wait Cycle Control */
#define PCI_CMD_SERR_ENABLE 0x100 /* SERR# Enable */
#define PCI_CMD_F_BK_BK_ENABLE 0x200 /* Fast Back-to-Back Enable */
/* Status Register Layout (0x06) */
#define PCI_STAT_PAR_ERR_DET 0x8000 /* Detected Parity Error */
#define PCI_STAT_SYS_ERR 0x4000 /* Signaled System Error */
#define PCI_STAT_RCVD_MSTR_ABT 0x2000 /* Received Master Abort */
#define PCI_STAT_RCVD_TGT_ABT 0x1000 /* Received Target Abort */
#define PCI_STAT_SGNL_TGT_ABT 0x0800 /* Signaled Target Abort */
#define PCI_STAT_DEVSEL_TIMING 0x0600 /* DEVSEL Timing Mask */
#define DEVSEL_TIMING(_x) (((_x) >> 9) & 3) /* devsel tim macro */
#define DEVSEL_FAST 0 /* Fast timing */
#define DEVSEL_MEDIUM 1 /* Medium timing */
#define DEVSEL_SLOW 2 /* Slow timing */
#define PCI_STAT_DATA_PAR_ERR 0x0100 /* Data Parity Err Detected */
#define PCI_STAT_F_BK_BK_CAP 0x0080 /* Fast Back-to-Back Capable */
#define PCI_STAT_UDF_SUPP 0x0040 /* UDF Supported */
#define PCI_STAT_66MHZ_CAP 0x0020 /* 66 MHz Capable */
/* BIST Register Layout (0x0F) */
#define PCI_BIST_BIST_CAP 0x80 /* BIST Capable */
#define PCI_BIST_START_BIST 0x40 /* Start BIST */
#define PCI_BIST_CMPLTION_MASK 0x0F /* COMPLETION MASK */
#define PCI_BIST_CMPL_OK 0x00 /* 0 value is completion OK */
/* Base Address Register 0x10 */
#define PCI_BA_IO_SPACE 0x1 /* I/O Space Marker */
#define PCI_BA_MEM_LOCATION 0x6 /* 2 bits for location avail */
#define PCI_BA_MEM_32BIT 0x0 /* Anywhere in 32bit space */
#define PCI_BA_MEM_1MEG 0x2 /* Locate below 1 Meg */
#define PCI_BA_MEM_64BIT 0x4 /* Anywhere in 64bit space */
#define PCI_BA_PREFETCH 0x8 /* Prefetchable, no side effect */
/* PIO interface macros */
#ifndef IOC3_EMULATION
#define PCI_INB(x) (*((volatile char*)x))
#define PCI_INH(x) (*((volatile short*)x))
#define PCI_INW(x) (*((volatile int*)x))
#define PCI_OUTB(x,y) (*((volatile char*)x) = y)
#define PCI_OUTH(x,y) (*((volatile short*)x) = y)
#define PCI_OUTW(x,y) (*((volatile int*)x) = y)
#else
extern uint pci_read(void * address, int type);
extern void pci_write(void * address, int data, int type);
#define BYTE 1
#define HALF 2
#define WORD 4
#define PCI_INB(x) pci_read((void *)(x),BYTE)
#define PCI_INH(x) pci_read((void *)(x),HALF)
#define PCI_INW(x) pci_read((void *)(x),WORD)
#define PCI_OUTB(x,y) pci_write((void *)(x),(y),BYTE)
#define PCI_OUTH(x,y) pci_write((void *)(x),(y),HALF)
#define PCI_OUTW(x,y) pci_write((void *)(x),(y),WORD)
#endif /* !IOC3_EMULATION */
/* effects on reads, merges */
#ifdef CONFIG_SGI_IP22
#define BYTECOUNT_W_GIO 0xbf400000
#endif
/*
* Definition of address layouts for PCI Config mechanism #1
* XXX- These largely duplicate PCI_TYPE1 constants at the top
* of the file; the two groups should probably be combined.
*/
#define CFG1_ADDR_REGISTER_MASK 0x000000fc
#define CFG1_ADDR_FUNCTION_MASK 0x00000700
#define CFG1_ADDR_DEVICE_MASK 0x0000f800
#define CFG1_ADDR_BUS_MASK 0x00ff0000
#define CFG1_REGISTER_SHIFT 2
#define CFG1_FUNCTION_SHIFT 8
#define CFG1_DEVICE_SHIFT 11
#define CFG1_BUS_SHIFT 16
#ifdef CONFIG_SGI_IP32
/* Definitions related to IP32 PCI Bridge policy
* XXX- should probaly be moved to a mace-specific header
*/
#define PCI_CONFIG_BITS 0xfe0085ff
#define PCI_CONTROL_MRMRA_ENABLE 0x00000800
#define PCI_FIRST_IO_ADDR 0x1000
#define PCI_IO_MAP_INCR 0x1000
#endif /* CONFIG_SGI_IP32 */
#endif /* _ASM_SN_PCI_PCI_DEFS_H */
|