]>
Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | /* |
2 | * PCI Express Hot Plug Controller Driver | |
3 | * | |
4 | * Copyright (C) 1995,2001 Compaq Computer Corporation | |
5 | * Copyright (C) 2001 Greg Kroah-Hartman (greg@kroah.com) | |
6 | * Copyright (C) 2001 IBM Corp. | |
7 | * Copyright (C) 2003-2004 Intel Corporation | |
8 | * | |
9 | * All rights reserved. | |
10 | * | |
11 | * This program is free software; you can redistribute it and/or modify | |
12 | * it under the terms of the GNU General Public License as published by | |
13 | * the Free Software Foundation; either version 2 of the License, or (at | |
14 | * your option) any later version. | |
15 | * | |
16 | * This program is distributed in the hope that it will be useful, but | |
17 | * WITHOUT ANY WARRANTY; without even the implied warranty of | |
18 | * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or | |
19 | * NON INFRINGEMENT. See the GNU General Public License for more | |
20 | * details. | |
21 | * | |
22 | * You should have received a copy of the GNU General Public License | |
23 | * along with this program; if not, write to the Free Software | |
24 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |
25 | * | |
8cf4c195 | 26 | * Send feedback to <greg@kroah.com>, <kristen.c.accardi@intel.com> |
1da177e4 LT |
27 | * |
28 | */ | |
29 | #ifndef _PCIEHP_H | |
30 | #define _PCIEHP_H | |
31 | ||
32 | #include <linux/types.h> | |
33 | #include <linux/pci.h> | |
7a54f25c | 34 | #include <linux/pci_hotplug.h> |
1da177e4 | 35 | #include <linux/delay.h> |
de25968c | 36 | #include <linux/sched.h> /* signal_pending() */ |
1da177e4 | 37 | #include <linux/pcieport_if.h> |
6aa4cdd0 | 38 | #include <linux/mutex.h> |
1da177e4 LT |
39 | |
40 | #define MY_NAME "pciehp" | |
41 | ||
42 | extern int pciehp_poll_mode; | |
43 | extern int pciehp_poll_time; | |
44 | extern int pciehp_debug; | |
a3a45ec8 | 45 | extern int pciehp_force; |
5d386e1a | 46 | extern struct workqueue_struct *pciehp_wq; |
1da177e4 | 47 | |
15232ece | 48 | #define dbg(format, arg...) \ |
1c35b8e5 FS |
49 | do { \ |
50 | if (pciehp_debug) \ | |
51 | printk(KERN_DEBUG "%s: " format, MY_NAME , ## arg); \ | |
52 | } while (0) | |
15232ece KK |
53 | #define err(format, arg...) \ |
54 | printk(KERN_ERR "%s: " format, MY_NAME , ## arg) | |
55 | #define info(format, arg...) \ | |
56 | printk(KERN_INFO "%s: " format, MY_NAME , ## arg) | |
57 | #define warn(format, arg...) \ | |
58 | printk(KERN_WARNING "%s: " format, MY_NAME , ## arg) | |
1da177e4 | 59 | |
7f2feec1 TI |
60 | #define ctrl_dbg(ctrl, format, arg...) \ |
61 | do { \ | |
62 | if (pciehp_debug) \ | |
1c35b8e5 | 63 | dev_printk(KERN_DEBUG, &ctrl->pcie->device, \ |
7f2feec1 TI |
64 | format, ## arg); \ |
65 | } while (0) | |
66 | #define ctrl_err(ctrl, format, arg...) \ | |
67 | dev_err(&ctrl->pcie->device, format, ## arg) | |
68 | #define ctrl_info(ctrl, format, arg...) \ | |
69 | dev_info(&ctrl->pcie->device, format, ## arg) | |
70 | #define ctrl_warn(ctrl, format, arg...) \ | |
71 | dev_warn(&ctrl->pcie->device, format, ## arg) | |
72 | ||
a0b17257 | 73 | #define SLOT_NAME_SIZE 10 |
1da177e4 | 74 | struct slot { |
1da177e4 | 75 | u8 state; |
1da177e4 | 76 | struct controller *ctrl; |
1da177e4 | 77 | struct hotplug_slot *hotplug_slot; |
5d386e1a KK |
78 | struct delayed_work work; /* work for button event */ |
79 | struct mutex lock; | |
1da177e4 LT |
80 | }; |
81 | ||
1da177e4 LT |
82 | struct event_info { |
83 | u32 event_type; | |
5d386e1a KK |
84 | struct slot *p_slot; |
85 | struct work_struct work; | |
1da177e4 LT |
86 | }; |
87 | ||
88 | struct controller { | |
dd5619cb | 89 | struct mutex ctrl_lock; /* controller lock */ |
f7a10e32 | 90 | struct pcie_device *pcie; /* PCI Express port service */ |
8720d27d | 91 | struct slot *slot; |
1da177e4 | 92 | wait_queue_head_t queue; /* sleep & wake process */ |
ae416e6b | 93 | u32 slot_cap; |
48fe3915 | 94 | struct timer_list poll_timer; |
6a82e218 | 95 | unsigned int cmd_busy:1; |
5808639b | 96 | unsigned int no_cmd_complete:1; |
f18e9625 | 97 | unsigned int link_active_reporting:1; |
dbc7e1e5 | 98 | unsigned int notification_enabled:1; |
99f0169c | 99 | unsigned int power_fault_detected; |
1da177e4 LT |
100 | }; |
101 | ||
1da177e4 LT |
102 | #define INT_BUTTON_IGNORE 0 |
103 | #define INT_PRESENCE_ON 1 | |
104 | #define INT_PRESENCE_OFF 2 | |
105 | #define INT_SWITCH_CLOSE 3 | |
106 | #define INT_SWITCH_OPEN 4 | |
107 | #define INT_POWER_FAULT 5 | |
108 | #define INT_POWER_FAULT_CLEAR 6 | |
109 | #define INT_BUTTON_PRESS 7 | |
110 | #define INT_BUTTON_RELEASE 8 | |
111 | #define INT_BUTTON_CANCEL 9 | |
112 | ||
113 | #define STATIC_STATE 0 | |
114 | #define BLINKINGON_STATE 1 | |
115 | #define BLINKINGOFF_STATE 2 | |
116 | #define POWERON_STATE 3 | |
117 | #define POWEROFF_STATE 4 | |
118 | ||
656927b1 KK |
119 | #define ATTN_BUTTN(ctrl) ((ctrl)->slot_cap & PCI_EXP_SLTCAP_ABP) |
120 | #define POWER_CTRL(ctrl) ((ctrl)->slot_cap & PCI_EXP_SLTCAP_PCP) | |
121 | #define MRL_SENS(ctrl) ((ctrl)->slot_cap & PCI_EXP_SLTCAP_MRLSP) | |
122 | #define ATTN_LED(ctrl) ((ctrl)->slot_cap & PCI_EXP_SLTCAP_AIP) | |
123 | #define PWR_LED(ctrl) ((ctrl)->slot_cap & PCI_EXP_SLTCAP_PIP) | |
124 | #define HP_SUPR_RM(ctrl) ((ctrl)->slot_cap & PCI_EXP_SLTCAP_HPS) | |
125 | #define EMI(ctrl) ((ctrl)->slot_cap & PCI_EXP_SLTCAP_EIP) | |
126 | #define NO_CMD_CMPL(ctrl) ((ctrl)->slot_cap & PCI_EXP_SLTCAP_NCCS) | |
d54798f0 | 127 | #define PSN(ctrl) ((ctrl)->slot_cap >> 19) |
1da177e4 | 128 | |
5d386e1a KK |
129 | extern int pciehp_sysfs_enable_slot(struct slot *slot); |
130 | extern int pciehp_sysfs_disable_slot(struct slot *slot); | |
dbd79aed | 131 | extern u8 pciehp_handle_attention_button(struct slot *p_slot); |
82a9e79e | 132 | extern u8 pciehp_handle_switch_change(struct slot *p_slot); |
dbd79aed KK |
133 | extern u8 pciehp_handle_presence_change(struct slot *p_slot); |
134 | extern u8 pciehp_handle_power_fault(struct slot *p_slot); | |
15232ece KK |
135 | extern int pciehp_configure_device(struct slot *p_slot); |
136 | extern int pciehp_unconfigure_device(struct slot *p_slot); | |
e325e1f0 | 137 | extern void pciehp_queue_pushbutton_work(struct work_struct *work); |
c4635eb0 | 138 | struct controller *pcie_init(struct pcie_device *dev); |
dbc7e1e5 | 139 | int pcie_init_notification(struct controller *ctrl); |
0a3c33d7 | 140 | int pciehp_enable_slot(struct slot *p_slot); |
cd2fe83a | 141 | int pciehp_disable_slot(struct slot *p_slot); |
c4635eb0 | 142 | int pcie_enable_notification(struct controller *ctrl); |
82a9e79e KK |
143 | int pciehp_power_on_slot(struct slot *slot); |
144 | int pciehp_power_off_slot(struct slot *slot); | |
145 | int pciehp_get_power_status(struct slot *slot, u8 *status); | |
146 | int pciehp_get_attention_status(struct slot *slot, u8 *status); | |
147 | ||
148 | int pciehp_set_attention_status(struct slot *slot, u8 status); | |
149 | int pciehp_get_latch_status(struct slot *slot, u8 *status); | |
150 | int pciehp_get_adapter_status(struct slot *slot, u8 *status); | |
151 | int pciehp_get_max_link_speed(struct slot *slot, enum pci_bus_speed *speed); | |
152 | int pciehp_get_max_link_width(struct slot *slot, enum pcie_link_width *val); | |
153 | int pciehp_get_cur_link_speed(struct slot *slot, enum pci_bus_speed *speed); | |
154 | int pciehp_get_cur_link_width(struct slot *slot, enum pcie_link_width *val); | |
155 | int pciehp_query_power_fault(struct slot *slot); | |
156 | void pciehp_green_led_on(struct slot *slot); | |
157 | void pciehp_green_led_off(struct slot *slot); | |
158 | void pciehp_green_led_blink(struct slot *slot); | |
159 | int pciehp_check_link_status(struct controller *ctrl); | |
160 | void pciehp_release_ctrl(struct controller *ctrl); | |
1da177e4 | 161 | |
e1acb24f AC |
162 | static inline const char *slot_name(struct slot *slot) |
163 | { | |
164 | return hotplug_slot_name(slot->hotplug_slot); | |
165 | } | |
166 | ||
783c49fc | 167 | #ifdef CONFIG_ACPI |
e50d1088 KCA |
168 | #include <acpi/acpi.h> |
169 | #include <acpi/acpi_bus.h> | |
e50d1088 KCA |
170 | #include <linux/pci-acpi.h> |
171 | ||
c9ffa5a5 KK |
172 | extern void __init pciehp_acpi_slot_detection_init(void); |
173 | extern int pciehp_acpi_slot_detection_check(struct pci_dev *dev); | |
174 | ||
175 | static inline void pciehp_firmware_init(void) | |
176 | { | |
177 | pciehp_acpi_slot_detection_init(); | |
178 | } | |
783c49fc | 179 | #else |
c9ffa5a5 | 180 | #define pciehp_firmware_init() do {} while (0) |
783c49fc | 181 | #endif /* CONFIG_ACPI */ |
1da177e4 | 182 | #endif /* _PCIEHP_H */ |