xref: /OK3568_Linux_fs/external/rkwifibt/drivers/bcmdhd/include/pcicfg.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * pcicfg.h: PCI configuration constants and structures.
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * Copyright (C) 2020, Broadcom.
5*4882a593Smuzhiyun  *
6*4882a593Smuzhiyun  *      Unless you and Broadcom execute a separate written software license
7*4882a593Smuzhiyun  * agreement governing use of this software, this software is licensed to you
8*4882a593Smuzhiyun  * under the terms of the GNU General Public License version 2 (the "GPL"),
9*4882a593Smuzhiyun  * available at http://www.broadcom.com/licenses/GPLv2.php, with the
10*4882a593Smuzhiyun  * following added to such license:
11*4882a593Smuzhiyun  *
12*4882a593Smuzhiyun  *      As a special exception, the copyright holders of this software give you
13*4882a593Smuzhiyun  * permission to link this software with independent modules, and to copy and
14*4882a593Smuzhiyun  * distribute the resulting executable under terms of your choice, provided that
15*4882a593Smuzhiyun  * you also meet, for each linked independent module, the terms and conditions of
16*4882a593Smuzhiyun  * the license of that module.  An independent module is a module which is not
17*4882a593Smuzhiyun  * derived from this software.  The special exception does not apply to any
18*4882a593Smuzhiyun  * modifications of the software.
19*4882a593Smuzhiyun  *
20*4882a593Smuzhiyun  *
21*4882a593Smuzhiyun  * <<Broadcom-WL-IPTag/Dual:>>
22*4882a593Smuzhiyun  */
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun #ifndef	_h_pcicfg_
25*4882a593Smuzhiyun #define	_h_pcicfg_
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun /* The following inside ifndef's so we don't collide with NTDDK.H */
28*4882a593Smuzhiyun #ifndef PCI_MAX_BUS
29*4882a593Smuzhiyun #define PCI_MAX_BUS		0x100
30*4882a593Smuzhiyun #endif
31*4882a593Smuzhiyun #ifndef PCI_MAX_DEVICES
32*4882a593Smuzhiyun #define PCI_MAX_DEVICES		0x20
33*4882a593Smuzhiyun #endif
34*4882a593Smuzhiyun #ifndef PCI_MAX_FUNCTION
35*4882a593Smuzhiyun #define PCI_MAX_FUNCTION	0x8
36*4882a593Smuzhiyun #endif
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun #ifndef PCI_INVALID_VENDORID
39*4882a593Smuzhiyun #define PCI_INVALID_VENDORID	0xffff
40*4882a593Smuzhiyun #endif
41*4882a593Smuzhiyun #ifndef PCI_INVALID_DEVICEID
42*4882a593Smuzhiyun #define PCI_INVALID_DEVICEID	0xffff
43*4882a593Smuzhiyun #endif
44*4882a593Smuzhiyun 
45*4882a593Smuzhiyun /* Convert between bus-slot-function-register and config addresses */
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun #define	PCICFG_BUS_SHIFT	16	/* Bus shift */
48*4882a593Smuzhiyun #define	PCICFG_SLOT_SHIFT	11	/* Slot shift */
49*4882a593Smuzhiyun #define	PCICFG_FUN_SHIFT	8	/* Function shift */
50*4882a593Smuzhiyun #define	PCICFG_OFF_SHIFT	0	/* Register shift */
51*4882a593Smuzhiyun 
52*4882a593Smuzhiyun #define	PCICFG_BUS_MASK		0xff	/* Bus mask */
53*4882a593Smuzhiyun #define	PCICFG_SLOT_MASK	0x1f	/* Slot mask */
54*4882a593Smuzhiyun #define	PCICFG_FUN_MASK		7	/* Function mask */
55*4882a593Smuzhiyun #define	PCICFG_OFF_MASK		0xff	/* Bus mask */
56*4882a593Smuzhiyun 
57*4882a593Smuzhiyun #define	PCI_CONFIG_ADDR(b, s, f, o)					\
58*4882a593Smuzhiyun 		((((b) & PCICFG_BUS_MASK) << PCICFG_BUS_SHIFT)		\
59*4882a593Smuzhiyun 		 | (((s) & PCICFG_SLOT_MASK) << PCICFG_SLOT_SHIFT)	\
60*4882a593Smuzhiyun 		 | (((f) & PCICFG_FUN_MASK) << PCICFG_FUN_SHIFT)	\
61*4882a593Smuzhiyun 		 | (((o) & PCICFG_OFF_MASK) << PCICFG_OFF_SHIFT))
62*4882a593Smuzhiyun 
63*4882a593Smuzhiyun #define	PCI_CONFIG_BUS(a)	(((a) >> PCICFG_BUS_SHIFT) & PCICFG_BUS_MASK)
64*4882a593Smuzhiyun #define	PCI_CONFIG_SLOT(a)	(((a) >> PCICFG_SLOT_SHIFT) & PCICFG_SLOT_MASK)
65*4882a593Smuzhiyun #define	PCI_CONFIG_FUN(a)	(((a) >> PCICFG_FUN_SHIFT) & PCICFG_FUN_MASK)
66*4882a593Smuzhiyun #define	PCI_CONFIG_OFF(a)	(((a) >> PCICFG_OFF_SHIFT) & PCICFG_OFF_MASK)
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun /* PCIE Config space accessing MACROS */
69*4882a593Smuzhiyun 
70*4882a593Smuzhiyun #define	PCIECFG_BUS_SHIFT	24	/* Bus shift */
71*4882a593Smuzhiyun #define	PCIECFG_SLOT_SHIFT	19	/* Slot/Device shift */
72*4882a593Smuzhiyun #define	PCIECFG_FUN_SHIFT	16	/* Function shift */
73*4882a593Smuzhiyun #define	PCIECFG_OFF_SHIFT	0	/* Register shift */
74*4882a593Smuzhiyun 
75*4882a593Smuzhiyun #define	PCIECFG_BUS_MASK	0xff	/* Bus mask */
76*4882a593Smuzhiyun #define	PCIECFG_SLOT_MASK	0x1f	/* Slot/Device mask */
77*4882a593Smuzhiyun #define	PCIECFG_FUN_MASK	7	/* Function mask */
78*4882a593Smuzhiyun #define	PCIECFG_OFF_MASK	0xfff	/* Register mask */
79*4882a593Smuzhiyun 
80*4882a593Smuzhiyun #define	PCIE_CONFIG_ADDR(b, s, f, o)					\
81*4882a593Smuzhiyun 		((((b) & PCIECFG_BUS_MASK) << PCIECFG_BUS_SHIFT)		\
82*4882a593Smuzhiyun 		 | (((s) & PCIECFG_SLOT_MASK) << PCIECFG_SLOT_SHIFT)	\
83*4882a593Smuzhiyun 		 | (((f) & PCIECFG_FUN_MASK) << PCIECFG_FUN_SHIFT)	\
84*4882a593Smuzhiyun 		 | (((o) & PCIECFG_OFF_MASK) << PCIECFG_OFF_SHIFT))
85*4882a593Smuzhiyun 
86*4882a593Smuzhiyun #define	PCIE_CONFIG_BUS(a)	(((a) >> PCIECFG_BUS_SHIFT) & PCIECFG_BUS_MASK)
87*4882a593Smuzhiyun #define	PCIE_CONFIG_SLOT(a)	(((a) >> PCIECFG_SLOT_SHIFT) & PCIECFG_SLOT_MASK)
88*4882a593Smuzhiyun #define	PCIE_CONFIG_FUN(a)	(((a) >> PCIECFG_FUN_SHIFT) & PCIECFG_FUN_MASK)
89*4882a593Smuzhiyun #define	PCIE_CONFIG_OFF(a)	(((a) >> PCIECFG_OFF_SHIFT) & PCIECFG_OFF_MASK)
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun /* The actual config space */
92*4882a593Smuzhiyun 
93*4882a593Smuzhiyun #define	PCI_BAR_MAX		6
94*4882a593Smuzhiyun 
95*4882a593Smuzhiyun #define	PCI_ROM_BAR		8
96*4882a593Smuzhiyun 
97*4882a593Smuzhiyun #define	PCR_RSVDA_MAX		2
98*4882a593Smuzhiyun 
99*4882a593Smuzhiyun /* Bits in PCI bars' flags */
100*4882a593Smuzhiyun 
101*4882a593Smuzhiyun #define	PCIBAR_FLAGS		0xf
102*4882a593Smuzhiyun #define	PCIBAR_IO		0x1
103*4882a593Smuzhiyun #define	PCIBAR_MEM1M		0x2
104*4882a593Smuzhiyun #define	PCIBAR_MEM64		0x4
105*4882a593Smuzhiyun #define	PCIBAR_PREFETCH		0x8
106*4882a593Smuzhiyun #define	PCIBAR_MEM32_MASK	0xFFFFFF80
107*4882a593Smuzhiyun 
108*4882a593Smuzhiyun typedef struct _pci_config_regs {
109*4882a593Smuzhiyun 	uint16	vendor;
110*4882a593Smuzhiyun 	uint16	device;
111*4882a593Smuzhiyun 	uint16	command;
112*4882a593Smuzhiyun 	uint16	status;
113*4882a593Smuzhiyun 	uint8	rev_id;
114*4882a593Smuzhiyun 	uint8	prog_if;
115*4882a593Smuzhiyun 	uint8	sub_class;
116*4882a593Smuzhiyun 	uint8	base_class;
117*4882a593Smuzhiyun 	uint8	cache_line_size;
118*4882a593Smuzhiyun 	uint8	latency_timer;
119*4882a593Smuzhiyun 	uint8	header_type;
120*4882a593Smuzhiyun 	uint8	bist;
121*4882a593Smuzhiyun 	uint32	base[PCI_BAR_MAX];
122*4882a593Smuzhiyun 	uint32	cardbus_cis;
123*4882a593Smuzhiyun 	uint16	subsys_vendor;
124*4882a593Smuzhiyun 	uint16	subsys_id;
125*4882a593Smuzhiyun 	uint32	baserom;
126*4882a593Smuzhiyun 	uint32	rsvd_a[PCR_RSVDA_MAX];
127*4882a593Smuzhiyun 	uint8	int_line;
128*4882a593Smuzhiyun 	uint8	int_pin;
129*4882a593Smuzhiyun 	uint8	min_gnt;
130*4882a593Smuzhiyun 	uint8	max_lat;
131*4882a593Smuzhiyun 	uint8	dev_dep[192];
132*4882a593Smuzhiyun } pci_config_regs;
133*4882a593Smuzhiyun 
134*4882a593Smuzhiyun #define	SZPCR		(sizeof (pci_config_regs))
135*4882a593Smuzhiyun #define	MINSZPCR	64		/* offsetof (dev_dep[0] */
136*4882a593Smuzhiyun 
137*4882a593Smuzhiyun /* pci config status reg has a bit to indicate that capability ptr is present */
138*4882a593Smuzhiyun 
139*4882a593Smuzhiyun #define PCI_CAPPTR_PRESENT	0x0010
140*4882a593Smuzhiyun 
141*4882a593Smuzhiyun /* A structure for the config registers is nice, but in most
142*4882a593Smuzhiyun  * systems the config space is not memory mapped, so we need
143*4882a593Smuzhiyun  * field offsetts. :-(
144*4882a593Smuzhiyun  */
145*4882a593Smuzhiyun #define	PCI_CFG_VID		0
146*4882a593Smuzhiyun #define	PCI_CFG_DID		2
147*4882a593Smuzhiyun #define	PCI_CFG_CMD		4
148*4882a593Smuzhiyun #define	PCI_CFG_STAT		6
149*4882a593Smuzhiyun #define	PCI_CFG_REV		8
150*4882a593Smuzhiyun #define	PCI_CFG_PROGIF		9
151*4882a593Smuzhiyun #define	PCI_CFG_SUBCL		0xa
152*4882a593Smuzhiyun #define	PCI_CFG_BASECL		0xb
153*4882a593Smuzhiyun #define	PCI_CFG_CLSZ		0xc
154*4882a593Smuzhiyun #define	PCI_CFG_LATTIM		0xd
155*4882a593Smuzhiyun #define	PCI_CFG_HDR		0xe
156*4882a593Smuzhiyun #define	PCI_CFG_BIST		0xf
157*4882a593Smuzhiyun #define	PCI_CFG_BAR0		0x10
158*4882a593Smuzhiyun #define	PCI_CFG_BAR1		0x18
159*4882a593Smuzhiyun #define	PCI_CFG_BAR2		0x20
160*4882a593Smuzhiyun #define	PCI_CFG_CIS		0x28
161*4882a593Smuzhiyun #define	PCI_CFG_SVID		0x2c
162*4882a593Smuzhiyun #define	PCI_CFG_SSID		0x2e
163*4882a593Smuzhiyun #define	PCI_CFG_ROMBAR		0x30
164*4882a593Smuzhiyun #define PCI_CFG_CAPPTR		0x34
165*4882a593Smuzhiyun #define	PCI_CFG_INT		0x3c
166*4882a593Smuzhiyun #define	PCI_CFG_PIN		0x3d
167*4882a593Smuzhiyun #define	PCI_CFG_MINGNT		0x3e
168*4882a593Smuzhiyun #define	PCI_CFG_MAXLAT		0x3f
169*4882a593Smuzhiyun #define	PCI_CFG_DEVCTRL		0xd8
170*4882a593Smuzhiyun #define PCI_CFG_TLCNTRL_5	0x814
171*4882a593Smuzhiyun #define PCI_CFG_ERRATTN_MASK_FN0	0x8a0
172*4882a593Smuzhiyun #define PCI_CFG_ERRATTN_STATUS_FN0	0x8a4
173*4882a593Smuzhiyun #define PCI_CFG_ERRATTN_MASK_FN1	0x8a8
174*4882a593Smuzhiyun #define PCI_CFG_ERRATTN_STATUS_FN1	0x8ac
175*4882a593Smuzhiyun #define PCI_CFG_ERRATTN_MASK_CMN	0x8b0
176*4882a593Smuzhiyun #define PCI_CFG_ERRATTN_STATUS_CMN	0x8b4
177*4882a593Smuzhiyun 
178*4882a593Smuzhiyun #ifdef EFI
179*4882a593Smuzhiyun #undef PCI_CLASS_BRIDGE
180*4882a593Smuzhiyun #undef PCI_CLASS_OLD
181*4882a593Smuzhiyun #undef PCI_CLASS_DISPLAY
182*4882a593Smuzhiyun #undef PCI_CLASS_SERIAL
183*4882a593Smuzhiyun #undef PCI_CLASS_SATELLITE
184*4882a593Smuzhiyun #endif /* EFI */
185*4882a593Smuzhiyun 
186*4882a593Smuzhiyun /* Classes and subclasses */
187*4882a593Smuzhiyun 
188*4882a593Smuzhiyun typedef enum {
189*4882a593Smuzhiyun 	PCI_CLASS_OLD = 0,
190*4882a593Smuzhiyun 	PCI_CLASS_DASDI,
191*4882a593Smuzhiyun 	PCI_CLASS_NET,
192*4882a593Smuzhiyun 	PCI_CLASS_DISPLAY,
193*4882a593Smuzhiyun 	PCI_CLASS_MMEDIA,
194*4882a593Smuzhiyun 	PCI_CLASS_MEMORY,
195*4882a593Smuzhiyun 	PCI_CLASS_BRIDGE,
196*4882a593Smuzhiyun 	PCI_CLASS_COMM,
197*4882a593Smuzhiyun 	PCI_CLASS_BASE,
198*4882a593Smuzhiyun 	PCI_CLASS_INPUT,
199*4882a593Smuzhiyun 	PCI_CLASS_DOCK,
200*4882a593Smuzhiyun 	PCI_CLASS_CPU,
201*4882a593Smuzhiyun 	PCI_CLASS_SERIAL,
202*4882a593Smuzhiyun 	PCI_CLASS_INTELLIGENT = 0xe,
203*4882a593Smuzhiyun 	PCI_CLASS_SATELLITE,
204*4882a593Smuzhiyun 	PCI_CLASS_CRYPT,
205*4882a593Smuzhiyun 	PCI_CLASS_DSP,
206*4882a593Smuzhiyun 	PCI_CLASS_XOR = 0xfe
207*4882a593Smuzhiyun } pci_classes;
208*4882a593Smuzhiyun 
209*4882a593Smuzhiyun typedef enum {
210*4882a593Smuzhiyun 	PCI_DASDI_SCSI,
211*4882a593Smuzhiyun 	PCI_DASDI_IDE,
212*4882a593Smuzhiyun 	PCI_DASDI_FLOPPY,
213*4882a593Smuzhiyun 	PCI_DASDI_IPI,
214*4882a593Smuzhiyun 	PCI_DASDI_RAID,
215*4882a593Smuzhiyun 	PCI_DASDI_OTHER = 0x80
216*4882a593Smuzhiyun } pci_dasdi_subclasses;
217*4882a593Smuzhiyun 
218*4882a593Smuzhiyun typedef enum {
219*4882a593Smuzhiyun 	PCI_NET_ETHER,
220*4882a593Smuzhiyun 	PCI_NET_TOKEN,
221*4882a593Smuzhiyun 	PCI_NET_FDDI,
222*4882a593Smuzhiyun 	PCI_NET_ATM,
223*4882a593Smuzhiyun 	PCI_NET_OTHER = 0x80
224*4882a593Smuzhiyun } pci_net_subclasses;
225*4882a593Smuzhiyun 
226*4882a593Smuzhiyun typedef enum {
227*4882a593Smuzhiyun 	PCI_DISPLAY_VGA,
228*4882a593Smuzhiyun 	PCI_DISPLAY_XGA,
229*4882a593Smuzhiyun 	PCI_DISPLAY_3D,
230*4882a593Smuzhiyun 	PCI_DISPLAY_OTHER = 0x80
231*4882a593Smuzhiyun } pci_display_subclasses;
232*4882a593Smuzhiyun 
233*4882a593Smuzhiyun typedef enum {
234*4882a593Smuzhiyun 	PCI_MMEDIA_VIDEO,
235*4882a593Smuzhiyun 	PCI_MMEDIA_AUDIO,
236*4882a593Smuzhiyun 	PCI_MMEDIA_PHONE,
237*4882a593Smuzhiyun 	PCI_MEDIA_OTHER = 0x80
238*4882a593Smuzhiyun } pci_mmedia_subclasses;
239*4882a593Smuzhiyun 
240*4882a593Smuzhiyun typedef enum {
241*4882a593Smuzhiyun 	PCI_MEMORY_RAM,
242*4882a593Smuzhiyun 	PCI_MEMORY_FLASH,
243*4882a593Smuzhiyun 	PCI_MEMORY_OTHER = 0x80
244*4882a593Smuzhiyun } pci_memory_subclasses;
245*4882a593Smuzhiyun 
246*4882a593Smuzhiyun typedef enum {
247*4882a593Smuzhiyun 	PCI_BRIDGE_HOST,
248*4882a593Smuzhiyun 	PCI_BRIDGE_ISA,
249*4882a593Smuzhiyun 	PCI_BRIDGE_EISA,
250*4882a593Smuzhiyun 	PCI_BRIDGE_MC,
251*4882a593Smuzhiyun 	PCI_BRIDGE_PCI,
252*4882a593Smuzhiyun 	PCI_BRIDGE_PCMCIA,
253*4882a593Smuzhiyun 	PCI_BRIDGE_NUBUS,
254*4882a593Smuzhiyun 	PCI_BRIDGE_CARDBUS,
255*4882a593Smuzhiyun 	PCI_BRIDGE_RACEWAY,
256*4882a593Smuzhiyun 	PCI_BRIDGE_OTHER = 0x80
257*4882a593Smuzhiyun } pci_bridge_subclasses;
258*4882a593Smuzhiyun 
259*4882a593Smuzhiyun typedef enum {
260*4882a593Smuzhiyun 	PCI_COMM_UART,
261*4882a593Smuzhiyun 	PCI_COMM_PARALLEL,
262*4882a593Smuzhiyun 	PCI_COMM_MULTIUART,
263*4882a593Smuzhiyun 	PCI_COMM_MODEM,
264*4882a593Smuzhiyun 	PCI_COMM_OTHER = 0x80
265*4882a593Smuzhiyun } pci_comm_subclasses;
266*4882a593Smuzhiyun 
267*4882a593Smuzhiyun typedef enum {
268*4882a593Smuzhiyun 	PCI_BASE_PIC,
269*4882a593Smuzhiyun 	PCI_BASE_DMA,
270*4882a593Smuzhiyun 	PCI_BASE_TIMER,
271*4882a593Smuzhiyun 	PCI_BASE_RTC,
272*4882a593Smuzhiyun 	PCI_BASE_PCI_HOTPLUG,
273*4882a593Smuzhiyun 	PCI_BASE_OTHER = 0x80
274*4882a593Smuzhiyun } pci_base_subclasses;
275*4882a593Smuzhiyun 
276*4882a593Smuzhiyun typedef enum {
277*4882a593Smuzhiyun 	PCI_INPUT_KBD,
278*4882a593Smuzhiyun 	PCI_INPUT_PEN,
279*4882a593Smuzhiyun 	PCI_INPUT_MOUSE,
280*4882a593Smuzhiyun 	PCI_INPUT_SCANNER,
281*4882a593Smuzhiyun 	PCI_INPUT_GAMEPORT,
282*4882a593Smuzhiyun 	PCI_INPUT_OTHER = 0x80
283*4882a593Smuzhiyun } pci_input_subclasses;
284*4882a593Smuzhiyun 
285*4882a593Smuzhiyun typedef enum {
286*4882a593Smuzhiyun 	PCI_DOCK_GENERIC,
287*4882a593Smuzhiyun 	PCI_DOCK_OTHER = 0x80
288*4882a593Smuzhiyun } pci_dock_subclasses;
289*4882a593Smuzhiyun 
290*4882a593Smuzhiyun typedef enum {
291*4882a593Smuzhiyun 	PCI_CPU_386,
292*4882a593Smuzhiyun 	PCI_CPU_486,
293*4882a593Smuzhiyun 	PCI_CPU_PENTIUM,
294*4882a593Smuzhiyun 	PCI_CPU_ALPHA = 0x10,
295*4882a593Smuzhiyun 	PCI_CPU_POWERPC = 0x20,
296*4882a593Smuzhiyun 	PCI_CPU_MIPS = 0x30,
297*4882a593Smuzhiyun 	PCI_CPU_COPROC = 0x40,
298*4882a593Smuzhiyun 	PCI_CPU_OTHER = 0x80
299*4882a593Smuzhiyun } pci_cpu_subclasses;
300*4882a593Smuzhiyun 
301*4882a593Smuzhiyun typedef enum {
302*4882a593Smuzhiyun 	PCI_SERIAL_IEEE1394,
303*4882a593Smuzhiyun 	PCI_SERIAL_ACCESS,
304*4882a593Smuzhiyun 	PCI_SERIAL_SSA,
305*4882a593Smuzhiyun 	PCI_SERIAL_USB,
306*4882a593Smuzhiyun 	PCI_SERIAL_FIBER,
307*4882a593Smuzhiyun 	PCI_SERIAL_SMBUS,
308*4882a593Smuzhiyun 	PCI_SERIAL_OTHER = 0x80
309*4882a593Smuzhiyun } pci_serial_subclasses;
310*4882a593Smuzhiyun 
311*4882a593Smuzhiyun typedef enum {
312*4882a593Smuzhiyun 	PCI_INTELLIGENT_I2O
313*4882a593Smuzhiyun } pci_intelligent_subclasses;
314*4882a593Smuzhiyun 
315*4882a593Smuzhiyun typedef enum {
316*4882a593Smuzhiyun 	PCI_SATELLITE_TV,
317*4882a593Smuzhiyun 	PCI_SATELLITE_AUDIO,
318*4882a593Smuzhiyun 	PCI_SATELLITE_VOICE,
319*4882a593Smuzhiyun 	PCI_SATELLITE_DATA,
320*4882a593Smuzhiyun 	PCI_SATELLITE_OTHER = 0x80
321*4882a593Smuzhiyun } pci_satellite_subclasses;
322*4882a593Smuzhiyun 
323*4882a593Smuzhiyun typedef enum {
324*4882a593Smuzhiyun 	PCI_CRYPT_NETWORK,
325*4882a593Smuzhiyun 	PCI_CRYPT_ENTERTAINMENT,
326*4882a593Smuzhiyun 	PCI_CRYPT_OTHER = 0x80
327*4882a593Smuzhiyun } pci_crypt_subclasses;
328*4882a593Smuzhiyun 
329*4882a593Smuzhiyun typedef enum {
330*4882a593Smuzhiyun 	PCI_DSP_DPIO,
331*4882a593Smuzhiyun 	PCI_DSP_OTHER = 0x80
332*4882a593Smuzhiyun } pci_dsp_subclasses;
333*4882a593Smuzhiyun 
334*4882a593Smuzhiyun typedef enum {
335*4882a593Smuzhiyun 	PCI_XOR_QDMA,
336*4882a593Smuzhiyun 	PCI_XOR_OTHER = 0x80
337*4882a593Smuzhiyun } pci_xor_subclasses;
338*4882a593Smuzhiyun 
339*4882a593Smuzhiyun /* Overlay for a PCI-to-PCI bridge */
340*4882a593Smuzhiyun 
341*4882a593Smuzhiyun #define	PPB_RSVDA_MAX		2
342*4882a593Smuzhiyun #define	PPB_RSVDD_MAX		8
343*4882a593Smuzhiyun 
344*4882a593Smuzhiyun typedef struct _ppb_config_regs {
345*4882a593Smuzhiyun 	uint16	vendor;
346*4882a593Smuzhiyun 	uint16	device;
347*4882a593Smuzhiyun 	uint16	command;
348*4882a593Smuzhiyun 	uint16	status;
349*4882a593Smuzhiyun 	uint8	rev_id;
350*4882a593Smuzhiyun 	uint8	prog_if;
351*4882a593Smuzhiyun 	uint8	sub_class;
352*4882a593Smuzhiyun 	uint8	base_class;
353*4882a593Smuzhiyun 	uint8	cache_line_size;
354*4882a593Smuzhiyun 	uint8	latency_timer;
355*4882a593Smuzhiyun 	uint8	header_type;
356*4882a593Smuzhiyun 	uint8	bist;
357*4882a593Smuzhiyun 	uint32	rsvd_a[PPB_RSVDA_MAX];
358*4882a593Smuzhiyun 	uint8	prim_bus;
359*4882a593Smuzhiyun 	uint8	sec_bus;
360*4882a593Smuzhiyun 	uint8	sub_bus;
361*4882a593Smuzhiyun 	uint8	sec_lat;
362*4882a593Smuzhiyun 	uint8	io_base;
363*4882a593Smuzhiyun 	uint8	io_lim;
364*4882a593Smuzhiyun 	uint16	sec_status;
365*4882a593Smuzhiyun 	uint16	mem_base;
366*4882a593Smuzhiyun 	uint16	mem_lim;
367*4882a593Smuzhiyun 	uint16	pf_mem_base;
368*4882a593Smuzhiyun 	uint16	pf_mem_lim;
369*4882a593Smuzhiyun 	uint32	pf_mem_base_hi;
370*4882a593Smuzhiyun 	uint32	pf_mem_lim_hi;
371*4882a593Smuzhiyun 	uint16	io_base_hi;
372*4882a593Smuzhiyun 	uint16	io_lim_hi;
373*4882a593Smuzhiyun 	uint16	subsys_vendor;
374*4882a593Smuzhiyun 	uint16	subsys_id;
375*4882a593Smuzhiyun 	uint32	rsvd_b;
376*4882a593Smuzhiyun 	uint8	rsvd_c;
377*4882a593Smuzhiyun 	uint8	int_pin;
378*4882a593Smuzhiyun 	uint16	bridge_ctrl;
379*4882a593Smuzhiyun 	uint8	chip_ctrl;
380*4882a593Smuzhiyun 	uint8	diag_ctrl;
381*4882a593Smuzhiyun 	uint16	arb_ctrl;
382*4882a593Smuzhiyun 	uint32	rsvd_d[PPB_RSVDD_MAX];
383*4882a593Smuzhiyun 	uint8	dev_dep[192];
384*4882a593Smuzhiyun } ppb_config_regs;
385*4882a593Smuzhiyun 
386*4882a593Smuzhiyun /* Everything below is BRCM HND proprietary */
387*4882a593Smuzhiyun 
388*4882a593Smuzhiyun /* Brcm PCI configuration registers */
389*4882a593Smuzhiyun #define cap_list	rsvd_a[0]
390*4882a593Smuzhiyun #define bar0_window	dev_dep[0x80 - 0x40]
391*4882a593Smuzhiyun #define bar1_window	dev_dep[0x84 - 0x40]
392*4882a593Smuzhiyun #define sprom_control	dev_dep[0x88 - 0x40]
393*4882a593Smuzhiyun 
394*4882a593Smuzhiyun /* PCI CAPABILITY DEFINES */
395*4882a593Smuzhiyun #define PCI_CAP_POWERMGMTCAP_ID		0x01
396*4882a593Smuzhiyun #define PCI_CAP_MSICAP_ID		0x05
397*4882a593Smuzhiyun #define PCI_CAP_VENDSPEC_ID		0x09
398*4882a593Smuzhiyun #define PCI_CAP_PCIECAP_ID		0x10
399*4882a593Smuzhiyun #define PCI_CAP_MSIXCAP_ID		0x11
400*4882a593Smuzhiyun 
401*4882a593Smuzhiyun /* Data structure to define the Message Signalled Interrupt facility
402*4882a593Smuzhiyun  * Valid for PCI and PCIE configurations
403*4882a593Smuzhiyun  */
404*4882a593Smuzhiyun typedef struct _pciconfig_cap_msi {
405*4882a593Smuzhiyun 	uint8	capID;
406*4882a593Smuzhiyun 	uint8	nextptr;
407*4882a593Smuzhiyun 	uint16	msgctrl;
408*4882a593Smuzhiyun 	uint32	msgaddr;
409*4882a593Smuzhiyun } pciconfig_cap_msi;
410*4882a593Smuzhiyun #define MSI_ENABLE	0x1		/* bit 0 of msgctrl */
411*4882a593Smuzhiyun 
412*4882a593Smuzhiyun /* Data structure to define the Power managment facility
413*4882a593Smuzhiyun  * Valid for PCI and PCIE configurations
414*4882a593Smuzhiyun  */
415*4882a593Smuzhiyun typedef struct _pciconfig_cap_pwrmgmt {
416*4882a593Smuzhiyun 	uint8	capID;
417*4882a593Smuzhiyun 	uint8	nextptr;
418*4882a593Smuzhiyun 	uint16	pme_cap;
419*4882a593Smuzhiyun 	uint16	pme_sts_ctrl;
420*4882a593Smuzhiyun 	uint8	pme_bridge_ext;
421*4882a593Smuzhiyun 	uint8	data;
422*4882a593Smuzhiyun } pciconfig_cap_pwrmgmt;
423*4882a593Smuzhiyun 
424*4882a593Smuzhiyun #define PME_CAP_PM_STATES (0x1f << 27)	/* Bits 31:27 states that can generate PME */
425*4882a593Smuzhiyun #define PME_CSR_OFFSET	    0x4		/* 4-bytes offset */
426*4882a593Smuzhiyun #define PME_CSR_PME_EN	  (1 << 8)	/* Bit 8 Enable generating of PME */
427*4882a593Smuzhiyun #define PME_CSR_PME_STAT  (1 << 15)	/* Bit 15 PME got asserted */
428*4882a593Smuzhiyun 
429*4882a593Smuzhiyun /* Data structure to define the PCIE capability */
430*4882a593Smuzhiyun typedef struct _pciconfig_cap_pcie {
431*4882a593Smuzhiyun 	uint8	capID;
432*4882a593Smuzhiyun 	uint8	nextptr;
433*4882a593Smuzhiyun 	uint16	pcie_cap;
434*4882a593Smuzhiyun 	uint32	dev_cap;
435*4882a593Smuzhiyun 	uint16	dev_ctrl;
436*4882a593Smuzhiyun 	uint16	dev_status;
437*4882a593Smuzhiyun 	uint32	link_cap;
438*4882a593Smuzhiyun 	uint16	link_ctrl;
439*4882a593Smuzhiyun 	uint16	link_status;
440*4882a593Smuzhiyun 	uint32	slot_cap;
441*4882a593Smuzhiyun 	uint16	slot_ctrl;
442*4882a593Smuzhiyun 	uint16	slot_status;
443*4882a593Smuzhiyun 	uint16	root_ctrl;
444*4882a593Smuzhiyun 	uint16	root_cap;
445*4882a593Smuzhiyun 	uint32	root_status;
446*4882a593Smuzhiyun } pciconfig_cap_pcie;
447*4882a593Smuzhiyun 
448*4882a593Smuzhiyun /* PCIE Enhanced CAPABILITY DEFINES */
449*4882a593Smuzhiyun #define PCIE_EXTCFG_OFFSET	0x100
450*4882a593Smuzhiyun #define PCIE_ADVERRREP_CAPID	0x0001
451*4882a593Smuzhiyun #define PCIE_VC_CAPID		0x0002
452*4882a593Smuzhiyun #define PCIE_DEVSNUM_CAPID	0x0003
453*4882a593Smuzhiyun #define PCIE_PWRBUDGET_CAPID	0x0004
454*4882a593Smuzhiyun 
455*4882a593Smuzhiyun /* PCIE Extended configuration */
456*4882a593Smuzhiyun #define PCIE_ADV_CORR_ERR_MASK	0x114
457*4882a593Smuzhiyun #define PCIE_ADV_CORR_ERR_MASK_OFFSET	0x14
458*4882a593Smuzhiyun #define CORR_ERR_RE	(1 << 0) /* Receiver  */
459*4882a593Smuzhiyun #define CORR_ERR_BT	(1 << 6) /* Bad TLP  */
460*4882a593Smuzhiyun #define CORR_ERR_BD	(1 << 7) /* Bad DLLP */
461*4882a593Smuzhiyun #define CORR_ERR_RR	(1 << 8) /* REPLAY_NUM rollover */
462*4882a593Smuzhiyun #define CORR_ERR_RT	(1 << 12) /* Reply timer timeout */
463*4882a593Smuzhiyun #define CORR_ERR_AE	(1 << 13) /* Adviosry Non-Fital Error Mask */
464*4882a593Smuzhiyun #define ALL_CORR_ERRORS (CORR_ERR_RE | CORR_ERR_BT | CORR_ERR_BD | \
465*4882a593Smuzhiyun 			 CORR_ERR_RR | CORR_ERR_RT)
466*4882a593Smuzhiyun 
467*4882a593Smuzhiyun /* PCIE Root Control Register bits (Host mode only) */
468*4882a593Smuzhiyun #define	PCIE_RC_CORR_SERR_EN		0x0001
469*4882a593Smuzhiyun #define	PCIE_RC_NONFATAL_SERR_EN	0x0002
470*4882a593Smuzhiyun #define	PCIE_RC_FATAL_SERR_EN		0x0004
471*4882a593Smuzhiyun #define	PCIE_RC_PME_INT_EN		0x0008
472*4882a593Smuzhiyun #define	PCIE_RC_CRS_EN			0x0010
473*4882a593Smuzhiyun 
474*4882a593Smuzhiyun /* PCIE Root Capability Register bits (Host mode only) */
475*4882a593Smuzhiyun #define	PCIE_RC_CRS_VISIBILITY		0x0001
476*4882a593Smuzhiyun 
477*4882a593Smuzhiyun /* PCIe PMCSR Register bits */
478*4882a593Smuzhiyun #define PCIE_PMCSR_PMESTAT		0x8000
479*4882a593Smuzhiyun 
480*4882a593Smuzhiyun /* Header to define the PCIE specific capabilities in the extended config space */
481*4882a593Smuzhiyun typedef struct _pcie_enhanced_caphdr {
482*4882a593Smuzhiyun 	uint16	capID;
483*4882a593Smuzhiyun 	uint16	cap_ver : 4;
484*4882a593Smuzhiyun 	uint16	next_ptr : 12;
485*4882a593Smuzhiyun } pcie_enhanced_caphdr;
486*4882a593Smuzhiyun 
487*4882a593Smuzhiyun #define	PCIE_CFG_PMCSR		0x4C
488*4882a593Smuzhiyun #define	PCI_BAR0_WIN		0x80	/* backplane addres space accessed by BAR0 */
489*4882a593Smuzhiyun #define	PCI_BAR1_WIN		0x84	/* backplane addres space accessed by BAR1 */
490*4882a593Smuzhiyun #define	PCI_SPROM_CONTROL	0x88	/* sprom property control */
491*4882a593Smuzhiyun #define	PCIE_CFG_SUBSYSTEM_CONTROL	0x88	/* used as subsystem control in PCIE devices */
492*4882a593Smuzhiyun #define	PCI_BAR1_CONTROL	0x8c	/* BAR1 region burst control */
493*4882a593Smuzhiyun #define	PCI_INT_STATUS		0x90	/* PCI and other cores interrupts */
494*4882a593Smuzhiyun #define	PCI_INT_MASK		0x94	/* mask of PCI and other cores interrupts */
495*4882a593Smuzhiyun #define PCI_TO_SB_MB		0x98	/* signal backplane interrupts */
496*4882a593Smuzhiyun #define PCI_BACKPLANE_ADDR	0xa0	/* address an arbitrary location on the system backplane */
497*4882a593Smuzhiyun #define PCI_BACKPLANE_DATA	0xa4	/* data at the location specified by above address */
498*4882a593Smuzhiyun #define	PCI_CLK_CTL_ST		0xa8	/* pci config space clock control/status (>=rev14) */
499*4882a593Smuzhiyun #define	PCI_BAR0_WIN2		0xac	/* backplane addres space accessed by second 4KB of BAR0 */
500*4882a593Smuzhiyun #define	PCI_GPIO_IN		0xb0	/* pci config space gpio input (>=rev3) */
501*4882a593Smuzhiyun #define	PCIE_CFG_DEVICE_CAPABILITY	0xb0	/* used as device capability in PCIE devices */
502*4882a593Smuzhiyun #define	PCI_GPIO_OUT		0xb4	/* pci config space gpio output (>=rev3) */
503*4882a593Smuzhiyun #define PCIE_CFG_DEVICE_CONTROL 0xb4    /* 0xb4 is used as device control in PCIE devices */
504*4882a593Smuzhiyun #define PCIE_DC_AER_CORR_EN		(1u << 0u)
505*4882a593Smuzhiyun #define PCIE_DC_AER_NON_FATAL_EN	(1u << 1u)
506*4882a593Smuzhiyun #define PCIE_DC_AER_FATAL_EN		(1u << 2u)
507*4882a593Smuzhiyun #define PCIE_DC_AER_UNSUP_EN		(1u << 3u)
508*4882a593Smuzhiyun 
509*4882a593Smuzhiyun #define PCI_BAR0_WIN2_OFFSET		0x1000u
510*4882a593Smuzhiyun #define PCIE2_BAR0_CORE2_WIN2_OFFSET	0x5000u
511*4882a593Smuzhiyun 
512*4882a593Smuzhiyun #define	PCI_GPIO_OUTEN		0xb8	/* pci config space gpio output enable (>=rev3) */
513*4882a593Smuzhiyun #define	PCI_L1SS_CTRL2		0x24c	/* The L1 PM Substates Control register */
514*4882a593Smuzhiyun 
515*4882a593Smuzhiyun /* Private Registers */
516*4882a593Smuzhiyun #define	PCI_STAT_CTRL		0xa80
517*4882a593Smuzhiyun #define	PCI_L0_EVENTCNT		0xa84
518*4882a593Smuzhiyun #define	PCI_L0_STATETMR		0xa88
519*4882a593Smuzhiyun #define	PCI_L1_EVENTCNT		0xa8c
520*4882a593Smuzhiyun #define	PCI_L1_STATETMR		0xa90
521*4882a593Smuzhiyun #define	PCI_L1_1_EVENTCNT	0xa94
522*4882a593Smuzhiyun #define	PCI_L1_1_STATETMR	0xa98
523*4882a593Smuzhiyun #define	PCI_L1_2_EVENTCNT	0xa9c
524*4882a593Smuzhiyun #define	PCI_L1_2_STATETMR	0xaa0
525*4882a593Smuzhiyun #define	PCI_L2_EVENTCNT		0xaa4
526*4882a593Smuzhiyun #define	PCI_L2_STATETMR		0xaa8
527*4882a593Smuzhiyun 
528*4882a593Smuzhiyun #define	PCI_LINK_STATUS		0x4dc
529*4882a593Smuzhiyun #define	PCI_LINK_SPEED_MASK	(15u << 0u)
530*4882a593Smuzhiyun #define	PCI_LINK_SPEED_SHIFT	(0)
531*4882a593Smuzhiyun #define PCIE_LNK_SPEED_GEN1		0x1
532*4882a593Smuzhiyun #define PCIE_LNK_SPEED_GEN2		0x2
533*4882a593Smuzhiyun #define PCIE_LNK_SPEED_GEN3		0x3
534*4882a593Smuzhiyun 
535*4882a593Smuzhiyun #define	PCI_PL_SPARE	0x1808	/* Config to Increase external clkreq deasserted minimum time */
536*4882a593Smuzhiyun #define	PCI_CONFIG_EXT_CLK_MIN_TIME_MASK	(1u << 31u)
537*4882a593Smuzhiyun #define	PCI_CONFIG_EXT_CLK_MIN_TIME_SHIFT	(31)
538*4882a593Smuzhiyun 
539*4882a593Smuzhiyun #define PCI_ADV_ERR_CAP			0x100
540*4882a593Smuzhiyun #define	PCI_UC_ERR_STATUS		0x104
541*4882a593Smuzhiyun #define	PCI_UNCORR_ERR_MASK		0x108
542*4882a593Smuzhiyun #define PCI_UCORR_ERR_SEVR		0x10c
543*4882a593Smuzhiyun #define	PCI_CORR_ERR_STATUS		0x110
544*4882a593Smuzhiyun #define	PCI_CORR_ERR_MASK		0x114
545*4882a593Smuzhiyun #define	PCI_ERR_CAP_CTRL		0x118
546*4882a593Smuzhiyun #define	PCI_TLP_HDR_LOG1		0x11c
547*4882a593Smuzhiyun #define	PCI_TLP_HDR_LOG2		0x120
548*4882a593Smuzhiyun #define	PCI_TLP_HDR_LOG3		0x124
549*4882a593Smuzhiyun #define	PCI_TLP_HDR_LOG4		0x128
550*4882a593Smuzhiyun #define	PCI_TL_CTRL_5			0x814
551*4882a593Smuzhiyun #define	PCI_TL_HDR_FC_ST		0x980
552*4882a593Smuzhiyun #define	PCI_TL_TGT_CRDT_ST		0x990
553*4882a593Smuzhiyun #define	PCI_TL_SMLOGIC_ST		0x998
554*4882a593Smuzhiyun #define	PCI_DL_ATTN_VEC			0x1040
555*4882a593Smuzhiyun #define	PCI_DL_STATUS			0x1048
556*4882a593Smuzhiyun 
557*4882a593Smuzhiyun #define	PCI_PHY_CTL_0			0x1800
558*4882a593Smuzhiyun #define	PCI_SLOW_PMCLK_EXT_RLOCK	(1 << 7)
559*4882a593Smuzhiyun #define PCI_REG_TX_DEEMPH_3_5_DB	(1 << 21)
560*4882a593Smuzhiyun 
561*4882a593Smuzhiyun #define	PCI_LINK_STATE_DEBUG	0x1c24
562*4882a593Smuzhiyun #define PCI_RECOVERY_HIST		0x1ce4
563*4882a593Smuzhiyun #define PCI_PHY_LTSSM_HIST_0	0x1cec
564*4882a593Smuzhiyun #define PCI_PHY_LTSSM_HIST_1	0x1cf0
565*4882a593Smuzhiyun #define PCI_PHY_LTSSM_HIST_2	0x1cf4
566*4882a593Smuzhiyun #define PCI_PHY_LTSSM_HIST_3	0x1cf8
567*4882a593Smuzhiyun #define PCI_PHY_DBG_CLKREG_0	0x1e10
568*4882a593Smuzhiyun #define PCI_PHY_DBG_CLKREG_1	0x1e14
569*4882a593Smuzhiyun #define PCI_PHY_DBG_CLKREG_2	0x1e18
570*4882a593Smuzhiyun #define PCI_PHY_DBG_CLKREG_3	0x1e1c
571*4882a593Smuzhiyun 
572*4882a593Smuzhiyun #define PCI_TL_CTRL_0                   0x800u
573*4882a593Smuzhiyun #define PCI_BEACON_DIS                  (1u << 20u)       /* Disable Beacon Generation */
574*4882a593Smuzhiyun 
575*4882a593Smuzhiyun /* Bit settings for PCIE_CFG_SUBSYSTEM_CONTROL register */
576*4882a593Smuzhiyun #define PCIE_BAR1COHERENTACCEN_BIT	8
577*4882a593Smuzhiyun #define PCIE_BAR2COHERENTACCEN_BIT	9
578*4882a593Smuzhiyun #define PCIE_SSRESET_STATUS_BIT		13
579*4882a593Smuzhiyun #define PCIE_SSRESET_DISABLE_BIT	14
580*4882a593Smuzhiyun #define PCIE_SSRESET_DIS_ENUM_RST_BIT		15
581*4882a593Smuzhiyun 
582*4882a593Smuzhiyun #define PCIE_BARCOHERENTACCEN_MASK	0x300
583*4882a593Smuzhiyun 
584*4882a593Smuzhiyun /* Bit settings for PCI_UC_ERR_STATUS register */
585*4882a593Smuzhiyun #define PCI_UC_ERR_URES			(1 << 20)	/* Unsupported Request Error Status */
586*4882a593Smuzhiyun #define PCI_UC_ERR_ECRCS		(1 << 19)	/* ECRC Error Status */
587*4882a593Smuzhiyun #define PCI_UC_ERR_MTLPS		(1 << 18)	/* Malformed TLP Status */
588*4882a593Smuzhiyun #define PCI_UC_ERR_ROS			(1 << 17)	/* Receiver Overflow Status */
589*4882a593Smuzhiyun #define PCI_UC_ERR_UCS			(1 << 16)	/* Unexpected Completion Status */
590*4882a593Smuzhiyun #define PCI_UC_ERR_CAS			(1 << 15)	/* Completer Abort Status */
591*4882a593Smuzhiyun #define PCI_UC_ERR_CTS			(1 << 14)	/* Completer Timeout Status */
592*4882a593Smuzhiyun #define PCI_UC_ERR_FCPES		(1 << 13)	/* Flow Control Protocol Error Status */
593*4882a593Smuzhiyun #define PCI_UC_ERR_PTLPS		(1 << 12)	/* Poisoned TLP Status */
594*4882a593Smuzhiyun #define PCI_UC_ERR_DLPES		(1 << 4)	/* Data Link Protocol Error Status */
595*4882a593Smuzhiyun 
596*4882a593Smuzhiyun #define PCI_DL_STATUS_PHY_LINKUP    (1 << 13) /* Status of LINK */
597*4882a593Smuzhiyun 
598*4882a593Smuzhiyun #define	PCI_PMCR_REFUP		0x1814	/* Trefup time */
599*4882a593Smuzhiyun #define PCI_PMCR_TREFUP_LO_MASK		0x3f
600*4882a593Smuzhiyun #define PCI_PMCR_TREFUP_LO_SHIFT	24
601*4882a593Smuzhiyun #define PCI_PMCR_TREFUP_LO_BITS		6
602*4882a593Smuzhiyun #define PCI_PMCR_TREFUP_HI_MASK		0xf
603*4882a593Smuzhiyun #define PCI_PMCR_TREFUP_HI_SHIFT	5
604*4882a593Smuzhiyun #define PCI_PMCR_TREFUP_HI_BITS		4
605*4882a593Smuzhiyun #define PCI_PMCR_TREFUP_MAX			0x400
606*4882a593Smuzhiyun #define PCI_PMCR_TREFUP_MAX_SCALE	0x2000
607*4882a593Smuzhiyun 
608*4882a593Smuzhiyun #define	PCI_PMCR_REFUP_EXT	0x1818	/* Trefup extend Max */
609*4882a593Smuzhiyun #define PCI_PMCR_TREFUP_EXT_SHIFT	22
610*4882a593Smuzhiyun #define PCI_PMCR_TREFUP_EXT_SCALE	3
611*4882a593Smuzhiyun #define PCI_PMCR_TREFUP_EXT_ON		1
612*4882a593Smuzhiyun #define PCI_PMCR_TREFUP_EXT_OFF		0
613*4882a593Smuzhiyun 
614*4882a593Smuzhiyun #define PCI_TPOWER_SCALE_MASK 0x3
615*4882a593Smuzhiyun #define PCI_TPOWER_SCALE_SHIFT 3 /* 0:1 is scale and 2 is rsvd */
616*4882a593Smuzhiyun 
617*4882a593Smuzhiyun #define	PCI_BAR0_SHADOW_OFFSET	(2 * 1024)	/* bar0 + 2K accesses sprom shadow (in pci core) */
618*4882a593Smuzhiyun #define	PCI_BAR0_SPROM_OFFSET	(4 * 1024)	/* bar0 + 4K accesses external sprom */
619*4882a593Smuzhiyun #define	PCI_BAR0_PCIREGS_OFFSET	(6 * 1024)	/* bar0 + 6K accesses pci core registers */
620*4882a593Smuzhiyun #define	PCI_BAR0_PCISBR_OFFSET	(4 * 1024)	/* pci core SB registers are at the end of the
621*4882a593Smuzhiyun 						 * 8KB window, so their address is the "regular"
622*4882a593Smuzhiyun 						 * address plus 4K
623*4882a593Smuzhiyun 						 */
624*4882a593Smuzhiyun /*
625*4882a593Smuzhiyun  * PCIE GEN2 changed some of the above locations for
626*4882a593Smuzhiyun  * Bar0WrapperBase, SecondaryBAR0Window and SecondaryBAR0WrapperBase
627*4882a593Smuzhiyun  * BAR0 maps 32K of register space
628*4882a593Smuzhiyun */
629*4882a593Smuzhiyun #define PCIE2_BAR0_WIN2		0x70 /* config register to map 2nd 4KB of BAR0 */
630*4882a593Smuzhiyun #define PCIE2_BAR0_CORE2_WIN	0x74 /* config register to map 5th 4KB of BAR0 */
631*4882a593Smuzhiyun #define PCIE2_BAR0_CORE2_WIN2	0x78 /* config register to map 6th 4KB of BAR0 */
632*4882a593Smuzhiyun 
633*4882a593Smuzhiyun /* PCIE GEN2 BAR0 window size */
634*4882a593Smuzhiyun #define PCIE2_BAR0_WINSZ	0x8000
635*4882a593Smuzhiyun 
636*4882a593Smuzhiyun #define PCI_BAR0_WIN2_OFFSET		0x1000u
637*4882a593Smuzhiyun #define PCI_CORE_ENUM_OFFSET		0x2000u
638*4882a593Smuzhiyun #define PCI_CC_CORE_ENUM_OFFSET		0x3000u
639*4882a593Smuzhiyun #define PCI_SEC_BAR0_WIN_OFFSET		0x4000u
640*4882a593Smuzhiyun #define PCI_SEC_BAR0_WRAP_OFFSET	0x5000u
641*4882a593Smuzhiyun #define PCI_CORE_ENUM2_OFFSET		0x6000u
642*4882a593Smuzhiyun #define PCI_CC_CORE_ENUM2_OFFSET	0x7000u
643*4882a593Smuzhiyun #define PCI_TER_BAR0_WIN_OFFSET		0x9000u
644*4882a593Smuzhiyun #define PCI_TER_BAR0_WRAP_OFFSET	0xa000u
645*4882a593Smuzhiyun 
646*4882a593Smuzhiyun #define PCI_BAR0_WINSZ		(16 * 1024)	/* bar0 window size Match with corerev 13 */
647*4882a593Smuzhiyun /* On pci corerev >= 13 and all pcie, the bar0 is now 16KB and it maps: */
648*4882a593Smuzhiyun #define	PCI_16KB0_PCIREGS_OFFSET (8 * 1024)	/* bar0 + 8K accesses pci/pcie core registers */
649*4882a593Smuzhiyun #define	PCI_16KB0_CCREGS_OFFSET	(12 * 1024)	/* bar0 + 12K accesses chipc core registers */
650*4882a593Smuzhiyun #define PCI_16KBB0_WINSZ	(16 * 1024)	/* bar0 window size */
651*4882a593Smuzhiyun #define PCI_SECOND_BAR0_OFFSET	(16 * 1024)	/* secondary  bar 0 window */
652*4882a593Smuzhiyun 
653*4882a593Smuzhiyun /* On AI chips we have a second window to map DMP regs are mapped: */
654*4882a593Smuzhiyun #define	PCI_16KB0_WIN2_OFFSET	(4 * 1024)	/* bar0 + 4K is "Window 2" */
655*4882a593Smuzhiyun 
656*4882a593Smuzhiyun /* PCI_INT_STATUS */
657*4882a593Smuzhiyun #define	PCI_SBIM_STATUS_SERR	0x4	/* backplane SBErr interrupt status */
658*4882a593Smuzhiyun 
659*4882a593Smuzhiyun /* PCI_INT_MASK */
660*4882a593Smuzhiyun #define	PCI_SBIM_SHIFT		8	/* backplane core interrupt mask bits offset */
661*4882a593Smuzhiyun #define	PCI_SBIM_MASK		0xff00	/* backplane core interrupt mask */
662*4882a593Smuzhiyun #define	PCI_SBIM_MASK_SERR	0x4	/* backplane SBErr interrupt mask */
663*4882a593Smuzhiyun #define	PCI_CTO_INT_SHIFT	16	/* backplane SBErr interrupt mask */
664*4882a593Smuzhiyun #define	PCI_CTO_INT_MASK	(1 << PCI_CTO_INT_SHIFT)	/* backplane SBErr interrupt mask */
665*4882a593Smuzhiyun 
666*4882a593Smuzhiyun /* PCI_SPROM_CONTROL */
667*4882a593Smuzhiyun #define SPROM_SZ_MSK		0x02	/* SPROM Size Mask */
668*4882a593Smuzhiyun #define SPROM_LOCKED		0x08	/* SPROM Locked */
669*4882a593Smuzhiyun #define	SPROM_BLANK		0x04	/* indicating a blank SPROM */
670*4882a593Smuzhiyun #define SPROM_WRITEEN		0x10	/* SPROM write enable */
671*4882a593Smuzhiyun #define SPROM_BOOTROM_WE	0x20	/* external bootrom write enable */
672*4882a593Smuzhiyun #define SPROM_BACKPLANE_EN	0x40	/* Enable indirect backplane access */
673*4882a593Smuzhiyun #define SPROM_OTPIN_USE		0x80	/* device OTP In use */
674*4882a593Smuzhiyun #define SPROM_BAR1_COHERENT_ACC_EN	0x100	/* PCIe acceeses through BAR1 are coherent */
675*4882a593Smuzhiyun #define SPROM_BAR2_COHERENT_ACC_EN	0x200	/* PCIe acceeses through BAR2 are coherent */
676*4882a593Smuzhiyun #define SPROM_CFG_TO_SB_RST	0x400	/* backplane reset */
677*4882a593Smuzhiyun 
678*4882a593Smuzhiyun /* Bits in PCI command and status regs */
679*4882a593Smuzhiyun #define PCI_CMD_IO		0x00000001	/* I/O enable */
680*4882a593Smuzhiyun #define PCI_CMD_MEMORY		0x00000002	/* Memory enable */
681*4882a593Smuzhiyun #define PCI_CMD_MASTER		0x00000004	/* Master enable */
682*4882a593Smuzhiyun #define PCI_CMD_SPECIAL		0x00000008	/* Special cycles enable */
683*4882a593Smuzhiyun #define PCI_CMD_INVALIDATE	0x00000010	/* Invalidate? */
684*4882a593Smuzhiyun #define PCI_CMD_VGA_PAL		0x00000040	/* VGA Palate */
685*4882a593Smuzhiyun #define PCI_STAT_TA		0x08000000	/* target abort status */
686*4882a593Smuzhiyun 
687*4882a593Smuzhiyun /* Header types */
688*4882a593Smuzhiyun #define	PCI_HEADER_MULTI	0x80
689*4882a593Smuzhiyun #define	PCI_HEADER_MASK		0x7f
690*4882a593Smuzhiyun typedef enum {
691*4882a593Smuzhiyun 	PCI_HEADER_NORMAL,
692*4882a593Smuzhiyun 	PCI_HEADER_BRIDGE,
693*4882a593Smuzhiyun 	PCI_HEADER_CARDBUS
694*4882a593Smuzhiyun } pci_header_types;
695*4882a593Smuzhiyun 
696*4882a593Smuzhiyun #define PCI_CONFIG_SPACE_SIZE	256
697*4882a593Smuzhiyun 
698*4882a593Smuzhiyun #define DWORD_ALIGN(x)  ((x) & ~(0x03))
699*4882a593Smuzhiyun #define BYTE_POS(x) ((x) & 0x3)
700*4882a593Smuzhiyun #define WORD_POS(x) ((x) & 0x1)
701*4882a593Smuzhiyun 
702*4882a593Smuzhiyun #define BYTE_SHIFT(x)  (8 * BYTE_POS(x))
703*4882a593Smuzhiyun #define WORD_SHIFT(x)  (16 * WORD_POS(x))
704*4882a593Smuzhiyun 
705*4882a593Smuzhiyun #define BYTE_VAL(a, x) ((a >> BYTE_SHIFT(x)) & 0xFF)
706*4882a593Smuzhiyun #define WORD_VAL(a, x) ((a >> WORD_SHIFT(x)) & 0xFFFF)
707*4882a593Smuzhiyun 
708*4882a593Smuzhiyun #define read_pci_cfg_byte(a) \
709*4882a593Smuzhiyun 	BYTE_VAL(OSL_PCI_READ_CONFIG(osh, DWORD_ALIGN(a), 4), a)
710*4882a593Smuzhiyun 
711*4882a593Smuzhiyun #define read_pci_cfg_word(a) \
712*4882a593Smuzhiyun 	WORD_VAL(OSL_PCI_READ_CONFIG(osh, DWORD_ALIGN(a), 4), a)
713*4882a593Smuzhiyun 
714*4882a593Smuzhiyun #define write_pci_cfg_byte(a, val) do {				\
715*4882a593Smuzhiyun 	uint32 tmpval;						\
716*4882a593Smuzhiyun 	tmpval = OSL_PCI_READ_CONFIG(osh, DWORD_ALIGN(a), 4);	\
717*4882a593Smuzhiyun 	tmpval &= ~(0xFF << BYTE_SHIFT(a));			\
718*4882a593Smuzhiyun 	tmpval |= ((uint8)(val)) << BYTE_SHIFT(a);		\
719*4882a593Smuzhiyun 	OSL_PCI_WRITE_CONFIG(osh, DWORD_ALIGN(a), 4, tmpval);	\
720*4882a593Smuzhiyun 	} while (0)
721*4882a593Smuzhiyun 
722*4882a593Smuzhiyun #define write_pci_cfg_word(a, val) do { \
723*4882a593Smuzhiyun 	uint32 tmpval; \
724*4882a593Smuzhiyun 	tmpval = OSL_PCI_READ_CONFIG(osh, DWORD_ALIGN(a), 4);	\
725*4882a593Smuzhiyun 	tmpval &= ~(0xFFFF << WORD_SHIFT(a)));			\
726*4882a593Smuzhiyun 	tmpval |= ((uint16)(val)) << WORD_SHIFT(a);		\
727*4882a593Smuzhiyun 	OSL_PCI_WRITE_CONFIG(osh, DWORD_ALIGN(a), 4, tmpval); \
728*4882a593Smuzhiyun 	} while (0)
729*4882a593Smuzhiyun 
730*4882a593Smuzhiyun #endif	/* _h_pcicfg_ */
731