xref: /OK3568_Linux_fs/kernel/drivers/pci/hotplug/ibmphp.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0+ */
2*4882a593Smuzhiyun #ifndef __IBMPHP_H
3*4882a593Smuzhiyun #define __IBMPHP_H
4*4882a593Smuzhiyun 
5*4882a593Smuzhiyun /*
6*4882a593Smuzhiyun  * IBM Hot Plug Controller Driver
7*4882a593Smuzhiyun  *
8*4882a593Smuzhiyun  * Written By: Jyoti Shah, Tong Yu, Irene Zubarev, IBM Corporation
9*4882a593Smuzhiyun  *
10*4882a593Smuzhiyun  * Copyright (C) 2001 Greg Kroah-Hartman (greg@kroah.com)
11*4882a593Smuzhiyun  * Copyright (C) 2001-2003 IBM Corp.
12*4882a593Smuzhiyun  *
13*4882a593Smuzhiyun  * All rights reserved.
14*4882a593Smuzhiyun  *
15*4882a593Smuzhiyun  * Send feedback to <gregkh@us.ibm.com>
16*4882a593Smuzhiyun  *
17*4882a593Smuzhiyun  */
18*4882a593Smuzhiyun 
19*4882a593Smuzhiyun #include <linux/pci_hotplug.h>
20*4882a593Smuzhiyun 
21*4882a593Smuzhiyun extern int ibmphp_debug;
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun #if !defined(MODULE)
24*4882a593Smuzhiyun 	#define MY_NAME "ibmphpd"
25*4882a593Smuzhiyun #else
26*4882a593Smuzhiyun 	#define MY_NAME THIS_MODULE->name
27*4882a593Smuzhiyun #endif
28*4882a593Smuzhiyun #define debug(fmt, arg...) do { if (ibmphp_debug == 1) printk(KERN_DEBUG "%s: " fmt, MY_NAME, ## arg); } while (0)
29*4882a593Smuzhiyun #define debug_pci(fmt, arg...) do { if (ibmphp_debug) printk(KERN_DEBUG "%s: " fmt, MY_NAME, ## arg); } while (0)
30*4882a593Smuzhiyun #define err(format, arg...) printk(KERN_ERR "%s: " format, MY_NAME, ## arg)
31*4882a593Smuzhiyun #define info(format, arg...) printk(KERN_INFO "%s: " format, MY_NAME, ## arg)
32*4882a593Smuzhiyun #define warn(format, arg...) printk(KERN_WARNING "%s: " format, MY_NAME, ## arg)
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun 
35*4882a593Smuzhiyun /* EBDA stuff */
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun /***********************************************************
38*4882a593Smuzhiyun * SLOT CAPABILITY                                          *
39*4882a593Smuzhiyun ***********************************************************/
40*4882a593Smuzhiyun 
41*4882a593Smuzhiyun #define EBDA_SLOT_133_MAX		0x20
42*4882a593Smuzhiyun #define EBDA_SLOT_100_MAX		0x10
43*4882a593Smuzhiyun #define EBDA_SLOT_66_MAX		0x02
44*4882a593Smuzhiyun #define EBDA_SLOT_PCIX_CAP		0x08
45*4882a593Smuzhiyun 
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun /************************************************************
48*4882a593Smuzhiyun *  RESOURCE TYPE                                             *
49*4882a593Smuzhiyun ************************************************************/
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun #define EBDA_RSRC_TYPE_MASK		0x03
52*4882a593Smuzhiyun #define EBDA_IO_RSRC_TYPE		0x00
53*4882a593Smuzhiyun #define EBDA_MEM_RSRC_TYPE		0x01
54*4882a593Smuzhiyun #define EBDA_PFM_RSRC_TYPE		0x03
55*4882a593Smuzhiyun #define EBDA_RES_RSRC_TYPE		0x02
56*4882a593Smuzhiyun 
57*4882a593Smuzhiyun 
58*4882a593Smuzhiyun /*************************************************************
59*4882a593Smuzhiyun *  IO RESTRICTION TYPE                                       *
60*4882a593Smuzhiyun *************************************************************/
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun #define EBDA_IO_RESTRI_MASK		0x0c
63*4882a593Smuzhiyun #define EBDA_NO_RESTRI			0x00
64*4882a593Smuzhiyun #define EBDA_AVO_VGA_ADDR		0x04
65*4882a593Smuzhiyun #define EBDA_AVO_VGA_ADDR_AND_ALIA	0x08
66*4882a593Smuzhiyun #define EBDA_AVO_ISA_ADDR		0x0c
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun 
69*4882a593Smuzhiyun /**************************************************************
70*4882a593Smuzhiyun *  DEVICE TYPE DEF                                            *
71*4882a593Smuzhiyun **************************************************************/
72*4882a593Smuzhiyun 
73*4882a593Smuzhiyun #define EBDA_DEV_TYPE_MASK		0x10
74*4882a593Smuzhiyun #define EBDA_PCI_DEV			0x10
75*4882a593Smuzhiyun #define EBDA_NON_PCI_DEV		0x00
76*4882a593Smuzhiyun 
77*4882a593Smuzhiyun 
78*4882a593Smuzhiyun /***************************************************************
79*4882a593Smuzhiyun *  PRIMARY DEF DEFINITION                                      *
80*4882a593Smuzhiyun ***************************************************************/
81*4882a593Smuzhiyun 
82*4882a593Smuzhiyun #define EBDA_PRI_DEF_MASK		0x20
83*4882a593Smuzhiyun #define EBDA_PRI_PCI_BUS_INFO		0x20
84*4882a593Smuzhiyun #define EBDA_NORM_DEV_RSRC_INFO		0x00
85*4882a593Smuzhiyun 
86*4882a593Smuzhiyun 
87*4882a593Smuzhiyun //--------------------------------------------------------------
88*4882a593Smuzhiyun // RIO TABLE DATA STRUCTURE
89*4882a593Smuzhiyun //--------------------------------------------------------------
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun struct rio_table_hdr {
92*4882a593Smuzhiyun 	u8 ver_num;
93*4882a593Smuzhiyun 	u8 scal_count;
94*4882a593Smuzhiyun 	u8 riodev_count;
95*4882a593Smuzhiyun 	u16 offset;
96*4882a593Smuzhiyun };
97*4882a593Smuzhiyun 
98*4882a593Smuzhiyun //-------------------------------------------------------------
99*4882a593Smuzhiyun // SCALABILITY DETAIL
100*4882a593Smuzhiyun //-------------------------------------------------------------
101*4882a593Smuzhiyun 
102*4882a593Smuzhiyun struct scal_detail {
103*4882a593Smuzhiyun 	u8 node_id;
104*4882a593Smuzhiyun 	u32 cbar;
105*4882a593Smuzhiyun 	u8 port0_node_connect;
106*4882a593Smuzhiyun 	u8 port0_port_connect;
107*4882a593Smuzhiyun 	u8 port1_node_connect;
108*4882a593Smuzhiyun 	u8 port1_port_connect;
109*4882a593Smuzhiyun 	u8 port2_node_connect;
110*4882a593Smuzhiyun 	u8 port2_port_connect;
111*4882a593Smuzhiyun 	u8 chassis_num;
112*4882a593Smuzhiyun //	struct list_head scal_detail_list;
113*4882a593Smuzhiyun };
114*4882a593Smuzhiyun 
115*4882a593Smuzhiyun //--------------------------------------------------------------
116*4882a593Smuzhiyun // RIO DETAIL
117*4882a593Smuzhiyun //--------------------------------------------------------------
118*4882a593Smuzhiyun 
119*4882a593Smuzhiyun struct rio_detail {
120*4882a593Smuzhiyun 	u8 rio_node_id;
121*4882a593Smuzhiyun 	u32 bbar;
122*4882a593Smuzhiyun 	u8 rio_type;
123*4882a593Smuzhiyun 	u8 owner_id;
124*4882a593Smuzhiyun 	u8 port0_node_connect;
125*4882a593Smuzhiyun 	u8 port0_port_connect;
126*4882a593Smuzhiyun 	u8 port1_node_connect;
127*4882a593Smuzhiyun 	u8 port1_port_connect;
128*4882a593Smuzhiyun 	u8 first_slot_num;
129*4882a593Smuzhiyun 	u8 status;
130*4882a593Smuzhiyun 	u8 wpindex;
131*4882a593Smuzhiyun 	u8 chassis_num;
132*4882a593Smuzhiyun 	struct list_head rio_detail_list;
133*4882a593Smuzhiyun };
134*4882a593Smuzhiyun 
135*4882a593Smuzhiyun struct opt_rio {
136*4882a593Smuzhiyun 	u8 rio_type;
137*4882a593Smuzhiyun 	u8 chassis_num;
138*4882a593Smuzhiyun 	u8 first_slot_num;
139*4882a593Smuzhiyun 	u8 middle_num;
140*4882a593Smuzhiyun 	struct list_head opt_rio_list;
141*4882a593Smuzhiyun };
142*4882a593Smuzhiyun 
143*4882a593Smuzhiyun struct opt_rio_lo {
144*4882a593Smuzhiyun 	u8 rio_type;
145*4882a593Smuzhiyun 	u8 chassis_num;
146*4882a593Smuzhiyun 	u8 first_slot_num;
147*4882a593Smuzhiyun 	u8 middle_num;
148*4882a593Smuzhiyun 	u8 pack_count;
149*4882a593Smuzhiyun 	struct list_head opt_rio_lo_list;
150*4882a593Smuzhiyun };
151*4882a593Smuzhiyun 
152*4882a593Smuzhiyun /****************************************************************
153*4882a593Smuzhiyun *  HPC DESCRIPTOR NODE                                          *
154*4882a593Smuzhiyun ****************************************************************/
155*4882a593Smuzhiyun 
156*4882a593Smuzhiyun struct ebda_hpc_list {
157*4882a593Smuzhiyun 	u8 format;
158*4882a593Smuzhiyun 	u16 num_ctlrs;
159*4882a593Smuzhiyun 	short phys_addr;
160*4882a593Smuzhiyun //      struct list_head ebda_hpc_list;
161*4882a593Smuzhiyun };
162*4882a593Smuzhiyun /*****************************************************************
163*4882a593Smuzhiyun *   IN HPC DATA STRUCTURE, THE ASSOCIATED SLOT AND BUS           *
164*4882a593Smuzhiyun *   STRUCTURE                                                    *
165*4882a593Smuzhiyun *****************************************************************/
166*4882a593Smuzhiyun 
167*4882a593Smuzhiyun struct ebda_hpc_slot {
168*4882a593Smuzhiyun 	u8 slot_num;
169*4882a593Smuzhiyun 	u32 slot_bus_num;
170*4882a593Smuzhiyun 	u8 ctl_index;
171*4882a593Smuzhiyun 	u8 slot_cap;
172*4882a593Smuzhiyun };
173*4882a593Smuzhiyun 
174*4882a593Smuzhiyun struct ebda_hpc_bus {
175*4882a593Smuzhiyun 	u32 bus_num;
176*4882a593Smuzhiyun 	u8 slots_at_33_conv;
177*4882a593Smuzhiyun 	u8 slots_at_66_conv;
178*4882a593Smuzhiyun 	u8 slots_at_66_pcix;
179*4882a593Smuzhiyun 	u8 slots_at_100_pcix;
180*4882a593Smuzhiyun 	u8 slots_at_133_pcix;
181*4882a593Smuzhiyun };
182*4882a593Smuzhiyun 
183*4882a593Smuzhiyun 
184*4882a593Smuzhiyun /********************************************************************
185*4882a593Smuzhiyun *   THREE TYPE OF HOT PLUG CONTROLLER                                *
186*4882a593Smuzhiyun ********************************************************************/
187*4882a593Smuzhiyun 
188*4882a593Smuzhiyun struct isa_ctlr_access {
189*4882a593Smuzhiyun 	u16 io_start;
190*4882a593Smuzhiyun 	u16 io_end;
191*4882a593Smuzhiyun };
192*4882a593Smuzhiyun 
193*4882a593Smuzhiyun struct pci_ctlr_access {
194*4882a593Smuzhiyun 	u8 bus;
195*4882a593Smuzhiyun 	u8 dev_fun;
196*4882a593Smuzhiyun };
197*4882a593Smuzhiyun 
198*4882a593Smuzhiyun struct wpeg_i2c_ctlr_access {
199*4882a593Smuzhiyun 	ulong wpegbbar;
200*4882a593Smuzhiyun 	u8 i2c_addr;
201*4882a593Smuzhiyun };
202*4882a593Smuzhiyun 
203*4882a593Smuzhiyun #define HPC_DEVICE_ID		0x0246
204*4882a593Smuzhiyun #define HPC_SUBSYSTEM_ID	0x0247
205*4882a593Smuzhiyun #define HPC_PCI_OFFSET		0x40
206*4882a593Smuzhiyun /*************************************************************************
207*4882a593Smuzhiyun *   RSTC DESCRIPTOR NODE                                                 *
208*4882a593Smuzhiyun *************************************************************************/
209*4882a593Smuzhiyun 
210*4882a593Smuzhiyun struct ebda_rsrc_list {
211*4882a593Smuzhiyun 	u8 format;
212*4882a593Smuzhiyun 	u16 num_entries;
213*4882a593Smuzhiyun 	u16 phys_addr;
214*4882a593Smuzhiyun 	struct ebda_rsrc_list *next;
215*4882a593Smuzhiyun };
216*4882a593Smuzhiyun 
217*4882a593Smuzhiyun 
218*4882a593Smuzhiyun /***************************************************************************
219*4882a593Smuzhiyun *   PCI RSRC NODE                                                          *
220*4882a593Smuzhiyun ***************************************************************************/
221*4882a593Smuzhiyun 
222*4882a593Smuzhiyun struct ebda_pci_rsrc {
223*4882a593Smuzhiyun 	u8 rsrc_type;
224*4882a593Smuzhiyun 	u8 bus_num;
225*4882a593Smuzhiyun 	u8 dev_fun;
226*4882a593Smuzhiyun 	u32 start_addr;
227*4882a593Smuzhiyun 	u32 end_addr;
228*4882a593Smuzhiyun 	u8 marked;	/* for NVRAM */
229*4882a593Smuzhiyun 	struct list_head ebda_pci_rsrc_list;
230*4882a593Smuzhiyun };
231*4882a593Smuzhiyun 
232*4882a593Smuzhiyun 
233*4882a593Smuzhiyun /***********************************************************
234*4882a593Smuzhiyun * BUS_INFO DATE STRUCTURE                                  *
235*4882a593Smuzhiyun ***********************************************************/
236*4882a593Smuzhiyun 
237*4882a593Smuzhiyun struct bus_info {
238*4882a593Smuzhiyun 	u8 slot_min;
239*4882a593Smuzhiyun 	u8 slot_max;
240*4882a593Smuzhiyun 	u8 slot_count;
241*4882a593Smuzhiyun 	u8 busno;
242*4882a593Smuzhiyun 	u8 controller_id;
243*4882a593Smuzhiyun 	u8 current_speed;
244*4882a593Smuzhiyun 	u8 current_bus_mode;
245*4882a593Smuzhiyun 	u8 index;
246*4882a593Smuzhiyun 	u8 slots_at_33_conv;
247*4882a593Smuzhiyun 	u8 slots_at_66_conv;
248*4882a593Smuzhiyun 	u8 slots_at_66_pcix;
249*4882a593Smuzhiyun 	u8 slots_at_100_pcix;
250*4882a593Smuzhiyun 	u8 slots_at_133_pcix;
251*4882a593Smuzhiyun 	struct list_head bus_info_list;
252*4882a593Smuzhiyun };
253*4882a593Smuzhiyun 
254*4882a593Smuzhiyun 
255*4882a593Smuzhiyun /***********************************************************
256*4882a593Smuzhiyun * GLOBAL VARIABLES                                         *
257*4882a593Smuzhiyun ***********************************************************/
258*4882a593Smuzhiyun extern struct list_head ibmphp_ebda_pci_rsrc_head;
259*4882a593Smuzhiyun extern struct list_head ibmphp_slot_head;
260*4882a593Smuzhiyun /***********************************************************
261*4882a593Smuzhiyun * FUNCTION PROTOTYPES                                      *
262*4882a593Smuzhiyun ***********************************************************/
263*4882a593Smuzhiyun 
264*4882a593Smuzhiyun void ibmphp_free_ebda_hpc_queue(void);
265*4882a593Smuzhiyun int ibmphp_access_ebda(void);
266*4882a593Smuzhiyun struct slot *ibmphp_get_slot_from_physical_num(u8);
267*4882a593Smuzhiyun int ibmphp_get_total_hp_slots(void);
268*4882a593Smuzhiyun void ibmphp_free_ibm_slot(struct slot *);
269*4882a593Smuzhiyun void ibmphp_free_bus_info_queue(void);
270*4882a593Smuzhiyun void ibmphp_free_ebda_pci_rsrc_queue(void);
271*4882a593Smuzhiyun struct bus_info *ibmphp_find_same_bus_num(u32);
272*4882a593Smuzhiyun int ibmphp_get_bus_index(u8);
273*4882a593Smuzhiyun u16 ibmphp_get_total_controllers(void);
274*4882a593Smuzhiyun int ibmphp_register_pci(void);
275*4882a593Smuzhiyun 
276*4882a593Smuzhiyun /* passed parameters */
277*4882a593Smuzhiyun #define MEM		0
278*4882a593Smuzhiyun #define IO		1
279*4882a593Smuzhiyun #define PFMEM		2
280*4882a593Smuzhiyun 
281*4882a593Smuzhiyun /* bit masks */
282*4882a593Smuzhiyun #define RESTYPE		0x03
283*4882a593Smuzhiyun #define IOMASK		0x00	/* will need to take its complement */
284*4882a593Smuzhiyun #define MMASK		0x01
285*4882a593Smuzhiyun #define PFMASK		0x03
286*4882a593Smuzhiyun #define PCIDEVMASK	0x10	/* we should always have PCI devices */
287*4882a593Smuzhiyun #define PRIMARYBUSMASK	0x20
288*4882a593Smuzhiyun 
289*4882a593Smuzhiyun /* pci specific defines */
290*4882a593Smuzhiyun #define PCI_VENDOR_ID_NOTVALID		0xFFFF
291*4882a593Smuzhiyun #define PCI_HEADER_TYPE_MULTIDEVICE	0x80
292*4882a593Smuzhiyun #define PCI_HEADER_TYPE_MULTIBRIDGE	0x81
293*4882a593Smuzhiyun 
294*4882a593Smuzhiyun #define LATENCY		0x64
295*4882a593Smuzhiyun #define CACHE		64
296*4882a593Smuzhiyun #define DEVICEENABLE	0x015F		/* CPQ has 0x0157 */
297*4882a593Smuzhiyun 
298*4882a593Smuzhiyun #define IOBRIDGE	0x1000		/* 4k */
299*4882a593Smuzhiyun #define MEMBRIDGE	0x100000	/* 1M */
300*4882a593Smuzhiyun 
301*4882a593Smuzhiyun /* irqs */
302*4882a593Smuzhiyun #define SCSI_IRQ	0x09
303*4882a593Smuzhiyun #define LAN_IRQ		0x0A
304*4882a593Smuzhiyun #define OTHER_IRQ	0x0B
305*4882a593Smuzhiyun 
306*4882a593Smuzhiyun /* Data Structures */
307*4882a593Smuzhiyun 
308*4882a593Smuzhiyun /* type is of the form x x xx xx
309*4882a593Smuzhiyun  *                     | |  |  |_ 00 - I/O, 01 - Memory, 11 - PFMemory
310*4882a593Smuzhiyun  *                     | |  - 00 - No Restrictions, 01 - Avoid VGA, 10 - Avoid
311*4882a593Smuzhiyun  *                     | |    VGA and their aliases, 11 - Avoid ISA
312*4882a593Smuzhiyun  *                     | - 1 - PCI device, 0 - non pci device
313*4882a593Smuzhiyun  *                     - 1 - Primary PCI Bus Information (0 if Normal device)
314*4882a593Smuzhiyun  * the IO restrictions [2:3] are only for primary buses
315*4882a593Smuzhiyun  */
316*4882a593Smuzhiyun 
317*4882a593Smuzhiyun 
318*4882a593Smuzhiyun /* we need this struct because there could be several resource blocks
319*4882a593Smuzhiyun  * allocated per primary bus in the EBDA
320*4882a593Smuzhiyun  */
321*4882a593Smuzhiyun struct range_node {
322*4882a593Smuzhiyun 	int rangeno;
323*4882a593Smuzhiyun 	u32 start;
324*4882a593Smuzhiyun 	u32 end;
325*4882a593Smuzhiyun 	struct range_node *next;
326*4882a593Smuzhiyun };
327*4882a593Smuzhiyun 
328*4882a593Smuzhiyun struct bus_node {
329*4882a593Smuzhiyun 	u8 busno;
330*4882a593Smuzhiyun 	int noIORanges;
331*4882a593Smuzhiyun 	struct range_node *rangeIO;
332*4882a593Smuzhiyun 	int noMemRanges;
333*4882a593Smuzhiyun 	struct range_node *rangeMem;
334*4882a593Smuzhiyun 	int noPFMemRanges;
335*4882a593Smuzhiyun 	struct range_node *rangePFMem;
336*4882a593Smuzhiyun 	int needIOUpdate;
337*4882a593Smuzhiyun 	int needMemUpdate;
338*4882a593Smuzhiyun 	int needPFMemUpdate;
339*4882a593Smuzhiyun 	struct resource_node *firstIO;	/* first IO resource on the Bus */
340*4882a593Smuzhiyun 	struct resource_node *firstMem;	/* first memory resource on the Bus */
341*4882a593Smuzhiyun 	struct resource_node *firstPFMem;	/* first prefetchable memory resource on the Bus */
342*4882a593Smuzhiyun 	struct resource_node *firstPFMemFromMem;	/* when run out of pfmem available, taking from Mem */
343*4882a593Smuzhiyun 	struct list_head bus_list;
344*4882a593Smuzhiyun };
345*4882a593Smuzhiyun 
346*4882a593Smuzhiyun struct resource_node {
347*4882a593Smuzhiyun 	int rangeno;
348*4882a593Smuzhiyun 	u8 busno;
349*4882a593Smuzhiyun 	u8 devfunc;
350*4882a593Smuzhiyun 	u32 start;
351*4882a593Smuzhiyun 	u32 end;
352*4882a593Smuzhiyun 	u32 len;
353*4882a593Smuzhiyun 	int type;		/* MEM, IO, PFMEM */
354*4882a593Smuzhiyun 	u8 fromMem;		/* this is to indicate that the range is from
355*4882a593Smuzhiyun 				 * from the Memory bucket rather than from PFMem */
356*4882a593Smuzhiyun 	struct resource_node *next;
357*4882a593Smuzhiyun 	struct resource_node *nextRange;	/* for the other mem range on bus */
358*4882a593Smuzhiyun };
359*4882a593Smuzhiyun 
360*4882a593Smuzhiyun struct res_needed {
361*4882a593Smuzhiyun 	u32 mem;
362*4882a593Smuzhiyun 	u32 pfmem;
363*4882a593Smuzhiyun 	u32 io;
364*4882a593Smuzhiyun 	u8 not_correct;		/* needed for return */
365*4882a593Smuzhiyun 	int devices[32];	/* for device numbers behind this bridge */
366*4882a593Smuzhiyun };
367*4882a593Smuzhiyun 
368*4882a593Smuzhiyun /* functions */
369*4882a593Smuzhiyun 
370*4882a593Smuzhiyun int ibmphp_rsrc_init(void);
371*4882a593Smuzhiyun int ibmphp_add_resource(struct resource_node *);
372*4882a593Smuzhiyun int ibmphp_remove_resource(struct resource_node *);
373*4882a593Smuzhiyun int ibmphp_find_resource(struct bus_node *, u32, struct resource_node **, int);
374*4882a593Smuzhiyun int ibmphp_check_resource(struct resource_node *, u8);
375*4882a593Smuzhiyun int ibmphp_remove_bus(struct bus_node *, u8);
376*4882a593Smuzhiyun void ibmphp_free_resources(void);
377*4882a593Smuzhiyun int ibmphp_add_pfmem_from_mem(struct resource_node *);
378*4882a593Smuzhiyun struct bus_node *ibmphp_find_res_bus(u8);
379*4882a593Smuzhiyun void ibmphp_print_test(void);	/* for debugging purposes */
380*4882a593Smuzhiyun 
381*4882a593Smuzhiyun int ibmphp_hpc_readslot(struct slot *, u8, u8 *);
382*4882a593Smuzhiyun int ibmphp_hpc_writeslot(struct slot *, u8);
383*4882a593Smuzhiyun void ibmphp_lock_operations(void);
384*4882a593Smuzhiyun void ibmphp_unlock_operations(void);
385*4882a593Smuzhiyun int ibmphp_hpc_start_poll_thread(void);
386*4882a593Smuzhiyun void ibmphp_hpc_stop_poll_thread(void);
387*4882a593Smuzhiyun 
388*4882a593Smuzhiyun //----------------------------------------------------------------------------
389*4882a593Smuzhiyun 
390*4882a593Smuzhiyun 
391*4882a593Smuzhiyun //----------------------------------------------------------------------------
392*4882a593Smuzhiyun // HPC return codes
393*4882a593Smuzhiyun //----------------------------------------------------------------------------
394*4882a593Smuzhiyun #define HPC_ERROR			0xFF
395*4882a593Smuzhiyun 
396*4882a593Smuzhiyun //-----------------------------------------------------------------------------
397*4882a593Smuzhiyun // BUS INFO
398*4882a593Smuzhiyun //-----------------------------------------------------------------------------
399*4882a593Smuzhiyun #define BUS_SPEED			0x30
400*4882a593Smuzhiyun #define BUS_MODE			0x40
401*4882a593Smuzhiyun #define BUS_MODE_PCIX			0x01
402*4882a593Smuzhiyun #define BUS_MODE_PCI			0x00
403*4882a593Smuzhiyun #define BUS_SPEED_2			0x20
404*4882a593Smuzhiyun #define BUS_SPEED_1			0x10
405*4882a593Smuzhiyun #define BUS_SPEED_33			0x00
406*4882a593Smuzhiyun #define BUS_SPEED_66			0x01
407*4882a593Smuzhiyun #define BUS_SPEED_100			0x02
408*4882a593Smuzhiyun #define BUS_SPEED_133			0x03
409*4882a593Smuzhiyun #define BUS_SPEED_66PCIX		0x04
410*4882a593Smuzhiyun #define BUS_SPEED_66UNKNOWN		0x05
411*4882a593Smuzhiyun #define BUS_STATUS_AVAILABLE		0x01
412*4882a593Smuzhiyun #define BUS_CONTROL_AVAILABLE		0x02
413*4882a593Smuzhiyun #define SLOT_LATCH_REGS_SUPPORTED	0x10
414*4882a593Smuzhiyun 
415*4882a593Smuzhiyun #define PRGM_MODEL_REV_LEVEL		0xF0
416*4882a593Smuzhiyun #define MAX_ADAPTER_NONE		0x09
417*4882a593Smuzhiyun 
418*4882a593Smuzhiyun //----------------------------------------------------------------------------
419*4882a593Smuzhiyun // HPC 'write' operations/commands
420*4882a593Smuzhiyun //----------------------------------------------------------------------------
421*4882a593Smuzhiyun //	Command			Code	State	Write to reg
422*4882a593Smuzhiyun //					Machine	at index
423*4882a593Smuzhiyun //-------------------------	----	-------	------------
424*4882a593Smuzhiyun #define HPC_CTLR_ENABLEIRQ	0x00	// N	15
425*4882a593Smuzhiyun #define HPC_CTLR_DISABLEIRQ	0x01	// N	15
426*4882a593Smuzhiyun #define HPC_SLOT_OFF		0x02	// Y	0-14
427*4882a593Smuzhiyun #define HPC_SLOT_ON		0x03	// Y	0-14
428*4882a593Smuzhiyun #define HPC_SLOT_ATTNOFF	0x04	// N	0-14
429*4882a593Smuzhiyun #define HPC_SLOT_ATTNON		0x05	// N	0-14
430*4882a593Smuzhiyun #define HPC_CTLR_CLEARIRQ	0x06	// N	15
431*4882a593Smuzhiyun #define HPC_CTLR_RESET		0x07	// Y	15
432*4882a593Smuzhiyun #define HPC_CTLR_IRQSTEER	0x08	// N	15
433*4882a593Smuzhiyun #define HPC_BUS_33CONVMODE	0x09	// Y	31-34
434*4882a593Smuzhiyun #define HPC_BUS_66CONVMODE	0x0A	// Y	31-34
435*4882a593Smuzhiyun #define HPC_BUS_66PCIXMODE	0x0B	// Y	31-34
436*4882a593Smuzhiyun #define HPC_BUS_100PCIXMODE	0x0C	// Y	31-34
437*4882a593Smuzhiyun #define HPC_BUS_133PCIXMODE	0x0D	// Y	31-34
438*4882a593Smuzhiyun #define HPC_ALLSLOT_OFF		0x11	// Y	15
439*4882a593Smuzhiyun #define HPC_ALLSLOT_ON		0x12	// Y	15
440*4882a593Smuzhiyun #define HPC_SLOT_BLINKLED	0x13	// N	0-14
441*4882a593Smuzhiyun 
442*4882a593Smuzhiyun //----------------------------------------------------------------------------
443*4882a593Smuzhiyun // read commands
444*4882a593Smuzhiyun //----------------------------------------------------------------------------
445*4882a593Smuzhiyun #define READ_SLOTSTATUS		0x01
446*4882a593Smuzhiyun #define READ_EXTSLOTSTATUS	0x02
447*4882a593Smuzhiyun #define READ_BUSSTATUS		0x03
448*4882a593Smuzhiyun #define READ_CTLRSTATUS		0x04
449*4882a593Smuzhiyun #define READ_ALLSTAT		0x05
450*4882a593Smuzhiyun #define READ_ALLSLOT		0x06
451*4882a593Smuzhiyun #define READ_SLOTLATCHLOWREG	0x07
452*4882a593Smuzhiyun #define READ_REVLEVEL		0x08
453*4882a593Smuzhiyun #define READ_HPCOPTIONS		0x09
454*4882a593Smuzhiyun //----------------------------------------------------------------------------
455*4882a593Smuzhiyun // slot status
456*4882a593Smuzhiyun //----------------------------------------------------------------------------
457*4882a593Smuzhiyun #define HPC_SLOT_POWER		0x01
458*4882a593Smuzhiyun #define HPC_SLOT_CONNECT	0x02
459*4882a593Smuzhiyun #define HPC_SLOT_ATTN		0x04
460*4882a593Smuzhiyun #define HPC_SLOT_PRSNT2		0x08
461*4882a593Smuzhiyun #define HPC_SLOT_PRSNT1		0x10
462*4882a593Smuzhiyun #define HPC_SLOT_PWRGD		0x20
463*4882a593Smuzhiyun #define HPC_SLOT_BUS_SPEED	0x40
464*4882a593Smuzhiyun #define HPC_SLOT_LATCH		0x80
465*4882a593Smuzhiyun 
466*4882a593Smuzhiyun //----------------------------------------------------------------------------
467*4882a593Smuzhiyun // HPC_SLOT_POWER status return codes
468*4882a593Smuzhiyun //----------------------------------------------------------------------------
469*4882a593Smuzhiyun #define HPC_SLOT_POWER_OFF	0x00
470*4882a593Smuzhiyun #define HPC_SLOT_POWER_ON	0x01
471*4882a593Smuzhiyun 
472*4882a593Smuzhiyun //----------------------------------------------------------------------------
473*4882a593Smuzhiyun // HPC_SLOT_CONNECT status return codes
474*4882a593Smuzhiyun //----------------------------------------------------------------------------
475*4882a593Smuzhiyun #define HPC_SLOT_CONNECTED	0x00
476*4882a593Smuzhiyun #define HPC_SLOT_DISCONNECTED	0x01
477*4882a593Smuzhiyun 
478*4882a593Smuzhiyun //----------------------------------------------------------------------------
479*4882a593Smuzhiyun // HPC_SLOT_ATTN status return codes
480*4882a593Smuzhiyun //----------------------------------------------------------------------------
481*4882a593Smuzhiyun #define HPC_SLOT_ATTN_OFF	0x00
482*4882a593Smuzhiyun #define HPC_SLOT_ATTN_ON	0x01
483*4882a593Smuzhiyun #define HPC_SLOT_ATTN_BLINK	0x02
484*4882a593Smuzhiyun 
485*4882a593Smuzhiyun //----------------------------------------------------------------------------
486*4882a593Smuzhiyun // HPC_SLOT_PRSNT status return codes
487*4882a593Smuzhiyun //----------------------------------------------------------------------------
488*4882a593Smuzhiyun #define HPC_SLOT_EMPTY		0x00
489*4882a593Smuzhiyun #define HPC_SLOT_PRSNT_7	0x01
490*4882a593Smuzhiyun #define HPC_SLOT_PRSNT_15	0x02
491*4882a593Smuzhiyun #define HPC_SLOT_PRSNT_25	0x03
492*4882a593Smuzhiyun 
493*4882a593Smuzhiyun //----------------------------------------------------------------------------
494*4882a593Smuzhiyun // HPC_SLOT_PWRGD status return codes
495*4882a593Smuzhiyun //----------------------------------------------------------------------------
496*4882a593Smuzhiyun #define HPC_SLOT_PWRGD_FAULT_NONE	0x00
497*4882a593Smuzhiyun #define HPC_SLOT_PWRGD_GOOD		0x01
498*4882a593Smuzhiyun 
499*4882a593Smuzhiyun //----------------------------------------------------------------------------
500*4882a593Smuzhiyun // HPC_SLOT_BUS_SPEED status return codes
501*4882a593Smuzhiyun //----------------------------------------------------------------------------
502*4882a593Smuzhiyun #define HPC_SLOT_BUS_SPEED_OK	0x00
503*4882a593Smuzhiyun #define HPC_SLOT_BUS_SPEED_MISM	0x01
504*4882a593Smuzhiyun 
505*4882a593Smuzhiyun //----------------------------------------------------------------------------
506*4882a593Smuzhiyun // HPC_SLOT_LATCH status return codes
507*4882a593Smuzhiyun //----------------------------------------------------------------------------
508*4882a593Smuzhiyun #define HPC_SLOT_LATCH_OPEN	0x01	// NOTE : in PCI spec bit off = open
509*4882a593Smuzhiyun #define HPC_SLOT_LATCH_CLOSED	0x00	// NOTE : in PCI spec bit on  = closed
510*4882a593Smuzhiyun 
511*4882a593Smuzhiyun 
512*4882a593Smuzhiyun //----------------------------------------------------------------------------
513*4882a593Smuzhiyun // extended slot status
514*4882a593Smuzhiyun //----------------------------------------------------------------------------
515*4882a593Smuzhiyun #define HPC_SLOT_PCIX		0x01
516*4882a593Smuzhiyun #define HPC_SLOT_SPEED1		0x02
517*4882a593Smuzhiyun #define HPC_SLOT_SPEED2		0x04
518*4882a593Smuzhiyun #define HPC_SLOT_BLINK_ATTN	0x08
519*4882a593Smuzhiyun #define HPC_SLOT_RSRVD1		0x10
520*4882a593Smuzhiyun #define HPC_SLOT_RSRVD2		0x20
521*4882a593Smuzhiyun #define HPC_SLOT_BUS_MODE	0x40
522*4882a593Smuzhiyun #define HPC_SLOT_RSRVD3		0x80
523*4882a593Smuzhiyun 
524*4882a593Smuzhiyun //----------------------------------------------------------------------------
525*4882a593Smuzhiyun // HPC_XSLOT_PCIX_CAP status return codes
526*4882a593Smuzhiyun //----------------------------------------------------------------------------
527*4882a593Smuzhiyun #define HPC_SLOT_PCIX_NO	0x00
528*4882a593Smuzhiyun #define HPC_SLOT_PCIX_YES	0x01
529*4882a593Smuzhiyun 
530*4882a593Smuzhiyun //----------------------------------------------------------------------------
531*4882a593Smuzhiyun // HPC_XSLOT_SPEED status return codes
532*4882a593Smuzhiyun //----------------------------------------------------------------------------
533*4882a593Smuzhiyun #define HPC_SLOT_SPEED_33	0x00
534*4882a593Smuzhiyun #define HPC_SLOT_SPEED_66	0x01
535*4882a593Smuzhiyun #define HPC_SLOT_SPEED_133	0x02
536*4882a593Smuzhiyun 
537*4882a593Smuzhiyun //----------------------------------------------------------------------------
538*4882a593Smuzhiyun // HPC_XSLOT_ATTN_BLINK status return codes
539*4882a593Smuzhiyun //----------------------------------------------------------------------------
540*4882a593Smuzhiyun #define HPC_SLOT_ATTN_BLINK_OFF	0x00
541*4882a593Smuzhiyun #define HPC_SLOT_ATTN_BLINK_ON	0x01
542*4882a593Smuzhiyun 
543*4882a593Smuzhiyun //----------------------------------------------------------------------------
544*4882a593Smuzhiyun // HPC_XSLOT_BUS_MODE status return codes
545*4882a593Smuzhiyun //----------------------------------------------------------------------------
546*4882a593Smuzhiyun #define HPC_SLOT_BUS_MODE_OK	0x00
547*4882a593Smuzhiyun #define HPC_SLOT_BUS_MODE_MISM	0x01
548*4882a593Smuzhiyun 
549*4882a593Smuzhiyun //----------------------------------------------------------------------------
550*4882a593Smuzhiyun // Controller status
551*4882a593Smuzhiyun //----------------------------------------------------------------------------
552*4882a593Smuzhiyun #define HPC_CTLR_WORKING	0x01
553*4882a593Smuzhiyun #define HPC_CTLR_FINISHED	0x02
554*4882a593Smuzhiyun #define HPC_CTLR_RESULT0	0x04
555*4882a593Smuzhiyun #define HPC_CTLR_RESULT1	0x08
556*4882a593Smuzhiyun #define HPC_CTLR_RESULE2	0x10
557*4882a593Smuzhiyun #define HPC_CTLR_RESULT3	0x20
558*4882a593Smuzhiyun #define HPC_CTLR_IRQ_ROUTG	0x40
559*4882a593Smuzhiyun #define HPC_CTLR_IRQ_PENDG	0x80
560*4882a593Smuzhiyun 
561*4882a593Smuzhiyun //----------------------------------------------------------------------------
562*4882a593Smuzhiyun // HPC_CTLR_WORKING status return codes
563*4882a593Smuzhiyun //----------------------------------------------------------------------------
564*4882a593Smuzhiyun #define HPC_CTLR_WORKING_NO	0x00
565*4882a593Smuzhiyun #define HPC_CTLR_WORKING_YES	0x01
566*4882a593Smuzhiyun 
567*4882a593Smuzhiyun //----------------------------------------------------------------------------
568*4882a593Smuzhiyun // HPC_CTLR_FINISHED status return codes
569*4882a593Smuzhiyun //----------------------------------------------------------------------------
570*4882a593Smuzhiyun #define HPC_CTLR_FINISHED_NO	0x00
571*4882a593Smuzhiyun #define HPC_CTLR_FINISHED_YES	0x01
572*4882a593Smuzhiyun 
573*4882a593Smuzhiyun //----------------------------------------------------------------------------
574*4882a593Smuzhiyun // HPC_CTLR_RESULT status return codes
575*4882a593Smuzhiyun //----------------------------------------------------------------------------
576*4882a593Smuzhiyun #define HPC_CTLR_RESULT_SUCCESS	0x00
577*4882a593Smuzhiyun #define HPC_CTLR_RESULT_FAILED	0x01
578*4882a593Smuzhiyun #define HPC_CTLR_RESULT_RSVD	0x02
579*4882a593Smuzhiyun #define HPC_CTLR_RESULT_NORESP	0x03
580*4882a593Smuzhiyun 
581*4882a593Smuzhiyun 
582*4882a593Smuzhiyun //----------------------------------------------------------------------------
583*4882a593Smuzhiyun // macro for slot info
584*4882a593Smuzhiyun //----------------------------------------------------------------------------
585*4882a593Smuzhiyun #define SLOT_POWER(s)	((u8) ((s & HPC_SLOT_POWER) \
586*4882a593Smuzhiyun 	? HPC_SLOT_POWER_ON : HPC_SLOT_POWER_OFF))
587*4882a593Smuzhiyun 
588*4882a593Smuzhiyun #define SLOT_CONNECT(s)	((u8) ((s & HPC_SLOT_CONNECT) \
589*4882a593Smuzhiyun 	? HPC_SLOT_DISCONNECTED : HPC_SLOT_CONNECTED))
590*4882a593Smuzhiyun 
591*4882a593Smuzhiyun #define SLOT_ATTN(s, es)	((u8) ((es & HPC_SLOT_BLINK_ATTN) \
592*4882a593Smuzhiyun 	? HPC_SLOT_ATTN_BLINK \
593*4882a593Smuzhiyun 	: ((s & HPC_SLOT_ATTN) ? HPC_SLOT_ATTN_ON : HPC_SLOT_ATTN_OFF)))
594*4882a593Smuzhiyun 
595*4882a593Smuzhiyun #define SLOT_PRESENT(s)	((u8) ((s & HPC_SLOT_PRSNT1) \
596*4882a593Smuzhiyun 	? ((s & HPC_SLOT_PRSNT2) ? HPC_SLOT_EMPTY : HPC_SLOT_PRSNT_15) \
597*4882a593Smuzhiyun 	: ((s & HPC_SLOT_PRSNT2) ? HPC_SLOT_PRSNT_25 : HPC_SLOT_PRSNT_7)))
598*4882a593Smuzhiyun 
599*4882a593Smuzhiyun #define SLOT_PWRGD(s)	((u8) ((s & HPC_SLOT_PWRGD) \
600*4882a593Smuzhiyun 	? HPC_SLOT_PWRGD_GOOD : HPC_SLOT_PWRGD_FAULT_NONE))
601*4882a593Smuzhiyun 
602*4882a593Smuzhiyun #define SLOT_BUS_SPEED(s)	((u8) ((s & HPC_SLOT_BUS_SPEED) \
603*4882a593Smuzhiyun 	? HPC_SLOT_BUS_SPEED_MISM : HPC_SLOT_BUS_SPEED_OK))
604*4882a593Smuzhiyun 
605*4882a593Smuzhiyun #define SLOT_LATCH(s)	((u8) ((s & HPC_SLOT_LATCH) \
606*4882a593Smuzhiyun 	? HPC_SLOT_LATCH_CLOSED : HPC_SLOT_LATCH_OPEN))
607*4882a593Smuzhiyun 
608*4882a593Smuzhiyun #define SLOT_PCIX(es)	((u8) ((es & HPC_SLOT_PCIX) \
609*4882a593Smuzhiyun 	? HPC_SLOT_PCIX_YES : HPC_SLOT_PCIX_NO))
610*4882a593Smuzhiyun 
611*4882a593Smuzhiyun #define SLOT_SPEED(es)	((u8) ((es & HPC_SLOT_SPEED2) \
612*4882a593Smuzhiyun 	? ((es & HPC_SLOT_SPEED1) ? HPC_SLOT_SPEED_133   \
613*4882a593Smuzhiyun 				: HPC_SLOT_SPEED_66)   \
614*4882a593Smuzhiyun 	: HPC_SLOT_SPEED_33))
615*4882a593Smuzhiyun 
616*4882a593Smuzhiyun #define SLOT_BUS_MODE(es)	((u8) ((es & HPC_SLOT_BUS_MODE) \
617*4882a593Smuzhiyun 	? HPC_SLOT_BUS_MODE_MISM : HPC_SLOT_BUS_MODE_OK))
618*4882a593Smuzhiyun 
619*4882a593Smuzhiyun //--------------------------------------------------------------------------
620*4882a593Smuzhiyun // macro for bus info
621*4882a593Smuzhiyun //---------------------------------------------------------------------------
622*4882a593Smuzhiyun #define CURRENT_BUS_SPEED(s)	((u8) (s & BUS_SPEED_2) \
623*4882a593Smuzhiyun 	? ((s & BUS_SPEED_1) ? BUS_SPEED_133 : BUS_SPEED_100) \
624*4882a593Smuzhiyun 	: ((s & BUS_SPEED_1) ? BUS_SPEED_66 : BUS_SPEED_33))
625*4882a593Smuzhiyun 
626*4882a593Smuzhiyun #define CURRENT_BUS_MODE(s)	((u8) (s & BUS_MODE) ? BUS_MODE_PCIX : BUS_MODE_PCI)
627*4882a593Smuzhiyun 
628*4882a593Smuzhiyun #define READ_BUS_STATUS(s)	((u8) (s->options & BUS_STATUS_AVAILABLE))
629*4882a593Smuzhiyun 
630*4882a593Smuzhiyun #define READ_BUS_MODE(s)	((s->revision & PRGM_MODEL_REV_LEVEL) >= 0x20)
631*4882a593Smuzhiyun 
632*4882a593Smuzhiyun #define SET_BUS_STATUS(s)	((u8) (s->options & BUS_CONTROL_AVAILABLE))
633*4882a593Smuzhiyun 
634*4882a593Smuzhiyun #define READ_SLOT_LATCH(s)	((u8) (s->options & SLOT_LATCH_REGS_SUPPORTED))
635*4882a593Smuzhiyun 
636*4882a593Smuzhiyun //----------------------------------------------------------------------------
637*4882a593Smuzhiyun // macro for controller info
638*4882a593Smuzhiyun //----------------------------------------------------------------------------
639*4882a593Smuzhiyun #define CTLR_WORKING(c) ((u8) ((c & HPC_CTLR_WORKING) \
640*4882a593Smuzhiyun 	? HPC_CTLR_WORKING_YES : HPC_CTLR_WORKING_NO))
641*4882a593Smuzhiyun #define CTLR_FINISHED(c) ((u8) ((c & HPC_CTLR_FINISHED) \
642*4882a593Smuzhiyun 	? HPC_CTLR_FINISHED_YES : HPC_CTLR_FINISHED_NO))
643*4882a593Smuzhiyun #define CTLR_RESULT(c) ((u8) ((c & HPC_CTLR_RESULT1)  \
644*4882a593Smuzhiyun 	? ((c & HPC_CTLR_RESULT0) ? HPC_CTLR_RESULT_NORESP \
645*4882a593Smuzhiyun 				: HPC_CTLR_RESULT_RSVD)  \
646*4882a593Smuzhiyun 	: ((c & HPC_CTLR_RESULT0) ? HPC_CTLR_RESULT_FAILED \
647*4882a593Smuzhiyun 				: HPC_CTLR_RESULT_SUCCESS)))
648*4882a593Smuzhiyun 
649*4882a593Smuzhiyun // command that affect the state machine of HPC
650*4882a593Smuzhiyun #define NEEDTOCHECK_CMDSTATUS(c) ((c == HPC_SLOT_OFF)        || \
651*4882a593Smuzhiyun 				  (c == HPC_SLOT_ON)         || \
652*4882a593Smuzhiyun 				  (c == HPC_CTLR_RESET)      || \
653*4882a593Smuzhiyun 				  (c == HPC_BUS_33CONVMODE)  || \
654*4882a593Smuzhiyun 				  (c == HPC_BUS_66CONVMODE)  || \
655*4882a593Smuzhiyun 				  (c == HPC_BUS_66PCIXMODE)  || \
656*4882a593Smuzhiyun 				  (c == HPC_BUS_100PCIXMODE) || \
657*4882a593Smuzhiyun 				  (c == HPC_BUS_133PCIXMODE) || \
658*4882a593Smuzhiyun 				  (c == HPC_ALLSLOT_OFF)     || \
659*4882a593Smuzhiyun 				  (c == HPC_ALLSLOT_ON))
660*4882a593Smuzhiyun 
661*4882a593Smuzhiyun 
662*4882a593Smuzhiyun /* Core part of the driver */
663*4882a593Smuzhiyun 
664*4882a593Smuzhiyun #define ENABLE		1
665*4882a593Smuzhiyun #define DISABLE		0
666*4882a593Smuzhiyun 
667*4882a593Smuzhiyun #define CARD_INFO	0x07
668*4882a593Smuzhiyun #define PCIX133		0x07
669*4882a593Smuzhiyun #define PCIX66		0x05
670*4882a593Smuzhiyun #define PCI66		0x04
671*4882a593Smuzhiyun 
672*4882a593Smuzhiyun extern struct pci_bus *ibmphp_pci_bus;
673*4882a593Smuzhiyun 
674*4882a593Smuzhiyun /* Variables */
675*4882a593Smuzhiyun 
676*4882a593Smuzhiyun struct pci_func {
677*4882a593Smuzhiyun 	struct pci_dev *dev;	/* from the OS */
678*4882a593Smuzhiyun 	u8 busno;
679*4882a593Smuzhiyun 	u8 device;
680*4882a593Smuzhiyun 	u8 function;
681*4882a593Smuzhiyun 	struct resource_node *io[6];
682*4882a593Smuzhiyun 	struct resource_node *mem[6];
683*4882a593Smuzhiyun 	struct resource_node *pfmem[6];
684*4882a593Smuzhiyun 	struct pci_func *next;
685*4882a593Smuzhiyun 	int devices[32];	/* for bridge config */
686*4882a593Smuzhiyun 	u8 irq[4];		/* for interrupt config */
687*4882a593Smuzhiyun 	u8 bus;			/* flag for unconfiguring, to say if PPB */
688*4882a593Smuzhiyun };
689*4882a593Smuzhiyun 
690*4882a593Smuzhiyun struct slot {
691*4882a593Smuzhiyun 	u8 bus;
692*4882a593Smuzhiyun 	u8 device;
693*4882a593Smuzhiyun 	u8 number;
694*4882a593Smuzhiyun 	u8 real_physical_slot_num;
695*4882a593Smuzhiyun 	u32 capabilities;
696*4882a593Smuzhiyun 	u8 supported_speed;
697*4882a593Smuzhiyun 	u8 supported_bus_mode;
698*4882a593Smuzhiyun 	u8 flag;		/* this is for disable slot and polling */
699*4882a593Smuzhiyun 	u8 ctlr_index;
700*4882a593Smuzhiyun 	struct hotplug_slot hotplug_slot;
701*4882a593Smuzhiyun 	struct controller *ctrl;
702*4882a593Smuzhiyun 	struct pci_func *func;
703*4882a593Smuzhiyun 	u8 irq[4];
704*4882a593Smuzhiyun 	int bit_mode;		/* 0 = 32, 1 = 64 */
705*4882a593Smuzhiyun 	struct bus_info *bus_on;
706*4882a593Smuzhiyun 	struct list_head ibm_slot_list;
707*4882a593Smuzhiyun 	u8 status;
708*4882a593Smuzhiyun 	u8 ext_status;
709*4882a593Smuzhiyun 	u8 busstatus;
710*4882a593Smuzhiyun };
711*4882a593Smuzhiyun 
712*4882a593Smuzhiyun struct controller {
713*4882a593Smuzhiyun 	struct ebda_hpc_slot *slots;
714*4882a593Smuzhiyun 	struct ebda_hpc_bus *buses;
715*4882a593Smuzhiyun 	struct pci_dev *ctrl_dev; /* in case where controller is PCI */
716*4882a593Smuzhiyun 	u8 starting_slot_num;	/* starting and ending slot #'s this ctrl controls*/
717*4882a593Smuzhiyun 	u8 ending_slot_num;
718*4882a593Smuzhiyun 	u8 revision;
719*4882a593Smuzhiyun 	u8 options;		/* which options HPC supports */
720*4882a593Smuzhiyun 	u8 status;
721*4882a593Smuzhiyun 	u8 ctlr_id;
722*4882a593Smuzhiyun 	u8 slot_count;
723*4882a593Smuzhiyun 	u8 bus_count;
724*4882a593Smuzhiyun 	u8 ctlr_relative_id;
725*4882a593Smuzhiyun 	u32 irq;
726*4882a593Smuzhiyun 	union {
727*4882a593Smuzhiyun 		struct isa_ctlr_access isa_ctlr;
728*4882a593Smuzhiyun 		struct pci_ctlr_access pci_ctlr;
729*4882a593Smuzhiyun 		struct wpeg_i2c_ctlr_access wpeg_ctlr;
730*4882a593Smuzhiyun 	} u;
731*4882a593Smuzhiyun 	u8 ctlr_type;
732*4882a593Smuzhiyun 	struct list_head ebda_hpc_list;
733*4882a593Smuzhiyun };
734*4882a593Smuzhiyun 
735*4882a593Smuzhiyun /* Functions */
736*4882a593Smuzhiyun 
737*4882a593Smuzhiyun int ibmphp_init_devno(struct slot **);	/* This function is called from EBDA, so we need it not be static */
738*4882a593Smuzhiyun int ibmphp_do_disable_slot(struct slot *slot_cur);
739*4882a593Smuzhiyun int ibmphp_update_slot_info(struct slot *);	/* This function is called from HPC, so we need it to not be be static */
740*4882a593Smuzhiyun int ibmphp_configure_card(struct pci_func *, u8);
741*4882a593Smuzhiyun int ibmphp_unconfigure_card(struct slot **, int);
742*4882a593Smuzhiyun extern const struct hotplug_slot_ops ibmphp_hotplug_slot_ops;
743*4882a593Smuzhiyun 
to_slot(struct hotplug_slot * hotplug_slot)744*4882a593Smuzhiyun static inline struct slot *to_slot(struct hotplug_slot *hotplug_slot)
745*4882a593Smuzhiyun {
746*4882a593Smuzhiyun 	return container_of(hotplug_slot, struct slot, hotplug_slot);
747*4882a593Smuzhiyun }
748*4882a593Smuzhiyun 
749*4882a593Smuzhiyun #endif				//__IBMPHP_H
750*4882a593Smuzhiyun 
751