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