]>
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> |
a827ea30 | 39 | #include <linux/workqueue.h> |
1da177e4 LT |
40 | |
41 | #define MY_NAME "pciehp" | |
42 | ||
90ab5ee9 | 43 | extern bool pciehp_poll_mode; |
1da177e4 | 44 | extern int pciehp_poll_time; |
90ab5ee9 | 45 | extern bool pciehp_debug; |
1da177e4 | 46 | |
15232ece | 47 | #define dbg(format, arg...) \ |
1c35b8e5 FS |
48 | do { \ |
49 | if (pciehp_debug) \ | |
50 | printk(KERN_DEBUG "%s: " format, MY_NAME , ## arg); \ | |
51 | } while (0) | |
15232ece KK |
52 | #define err(format, arg...) \ |
53 | printk(KERN_ERR "%s: " format, MY_NAME , ## arg) | |
54 | #define info(format, arg...) \ | |
55 | printk(KERN_INFO "%s: " format, MY_NAME , ## arg) | |
56 | #define warn(format, arg...) \ | |
57 | printk(KERN_WARNING "%s: " format, MY_NAME , ## arg) | |
1da177e4 | 58 | |
7f2feec1 TI |
59 | #define ctrl_dbg(ctrl, format, arg...) \ |
60 | do { \ | |
61 | if (pciehp_debug) \ | |
1c35b8e5 | 62 | dev_printk(KERN_DEBUG, &ctrl->pcie->device, \ |
7f2feec1 TI |
63 | format, ## arg); \ |
64 | } while (0) | |
65 | #define ctrl_err(ctrl, format, arg...) \ | |
66 | dev_err(&ctrl->pcie->device, format, ## arg) | |
67 | #define ctrl_info(ctrl, format, arg...) \ | |
68 | dev_info(&ctrl->pcie->device, format, ## arg) | |
69 | #define ctrl_warn(ctrl, format, arg...) \ | |
70 | dev_warn(&ctrl->pcie->device, format, ## arg) | |
71 | ||
a0b17257 | 72 | #define SLOT_NAME_SIZE 10 |
1da177e4 | 73 | struct slot { |
1da177e4 | 74 | u8 state; |
1da177e4 | 75 | struct controller *ctrl; |
1da177e4 | 76 | struct hotplug_slot *hotplug_slot; |
5d386e1a KK |
77 | struct delayed_work work; /* work for button event */ |
78 | struct mutex lock; | |
50b52fde | 79 | struct mutex hotplug_lock; |
c2be6f93 | 80 | struct workqueue_struct *wq; |
1da177e4 LT |
81 | }; |
82 | ||
1da177e4 LT |
83 | struct event_info { |
84 | u32 event_type; | |
5d386e1a KK |
85 | struct slot *p_slot; |
86 | struct work_struct work; | |
1da177e4 LT |
87 | }; |
88 | ||
89 | struct controller { | |
dd5619cb | 90 | struct mutex ctrl_lock; /* controller lock */ |
f7a10e32 | 91 | struct pcie_device *pcie; /* PCI Express port service */ |
8720d27d | 92 | struct slot *slot; |
1da177e4 | 93 | wait_queue_head_t queue; /* sleep & wake process */ |
ae416e6b | 94 | u32 slot_cap; |
48fe3915 | 95 | struct timer_list poll_timer; |
6a82e218 | 96 | unsigned int cmd_busy:1; |
5808639b | 97 | unsigned int no_cmd_complete:1; |
f18e9625 | 98 | unsigned int link_active_reporting:1; |
dbc7e1e5 | 99 | unsigned int notification_enabled:1; |
99f0169c | 100 | unsigned int power_fault_detected; |
1da177e4 LT |
101 | }; |
102 | ||
1da177e4 LT |
103 | #define INT_BUTTON_IGNORE 0 |
104 | #define INT_PRESENCE_ON 1 | |
105 | #define INT_PRESENCE_OFF 2 | |
106 | #define INT_SWITCH_CLOSE 3 | |
107 | #define INT_SWITCH_OPEN 4 | |
108 | #define INT_POWER_FAULT 5 | |
109 | #define INT_POWER_FAULT_CLEAR 6 | |
110 | #define INT_BUTTON_PRESS 7 | |
111 | #define INT_BUTTON_RELEASE 8 | |
112 | #define INT_BUTTON_CANCEL 9 | |
e48f1b67 RJ |
113 | #define INT_LINK_UP 10 |
114 | #define INT_LINK_DOWN 11 | |
1da177e4 LT |
115 | |
116 | #define STATIC_STATE 0 | |
117 | #define BLINKINGON_STATE 1 | |
118 | #define BLINKINGOFF_STATE 2 | |
119 | #define POWERON_STATE 3 | |
120 | #define POWEROFF_STATE 4 | |
121 | ||
656927b1 KK |
122 | #define ATTN_BUTTN(ctrl) ((ctrl)->slot_cap & PCI_EXP_SLTCAP_ABP) |
123 | #define POWER_CTRL(ctrl) ((ctrl)->slot_cap & PCI_EXP_SLTCAP_PCP) | |
124 | #define MRL_SENS(ctrl) ((ctrl)->slot_cap & PCI_EXP_SLTCAP_MRLSP) | |
125 | #define ATTN_LED(ctrl) ((ctrl)->slot_cap & PCI_EXP_SLTCAP_AIP) | |
126 | #define PWR_LED(ctrl) ((ctrl)->slot_cap & PCI_EXP_SLTCAP_PIP) | |
127 | #define HP_SUPR_RM(ctrl) ((ctrl)->slot_cap & PCI_EXP_SLTCAP_HPS) | |
128 | #define EMI(ctrl) ((ctrl)->slot_cap & PCI_EXP_SLTCAP_EIP) | |
129 | #define NO_CMD_CMPL(ctrl) ((ctrl)->slot_cap & PCI_EXP_SLTCAP_NCCS) | |
17f830bb | 130 | #define PSN(ctrl) (((ctrl)->slot_cap & PCI_EXP_SLTCAP_PSN) >> 19) |
1da177e4 | 131 | |
f39d5b72 BH |
132 | int pciehp_sysfs_enable_slot(struct slot *slot); |
133 | int pciehp_sysfs_disable_slot(struct slot *slot); | |
134 | u8 pciehp_handle_attention_button(struct slot *p_slot); | |
135 | u8 pciehp_handle_switch_change(struct slot *p_slot); | |
136 | u8 pciehp_handle_presence_change(struct slot *p_slot); | |
137 | u8 pciehp_handle_power_fault(struct slot *p_slot); | |
e48f1b67 | 138 | void pciehp_handle_linkstate_change(struct slot *p_slot); |
f39d5b72 BH |
139 | int pciehp_configure_device(struct slot *p_slot); |
140 | int pciehp_unconfigure_device(struct slot *p_slot); | |
141 | void pciehp_queue_pushbutton_work(struct work_struct *work); | |
c4635eb0 | 142 | struct controller *pcie_init(struct pcie_device *dev); |
dbc7e1e5 | 143 | int pcie_init_notification(struct controller *ctrl); |
0a3c33d7 | 144 | int pciehp_enable_slot(struct slot *p_slot); |
cd2fe83a | 145 | int pciehp_disable_slot(struct slot *p_slot); |
6dae6202 | 146 | void pcie_enable_notification(struct controller *ctrl); |
82a9e79e | 147 | int pciehp_power_on_slot(struct slot *slot); |
6dae6202 BH |
148 | void pciehp_power_off_slot(struct slot *slot); |
149 | void pciehp_get_power_status(struct slot *slot, u8 *status); | |
150 | void pciehp_get_attention_status(struct slot *slot, u8 *status); | |
82a9e79e | 151 | |
6dae6202 BH |
152 | void pciehp_set_attention_status(struct slot *slot, u8 status); |
153 | void pciehp_get_latch_status(struct slot *slot, u8 *status); | |
154 | void pciehp_get_adapter_status(struct slot *slot, u8 *status); | |
82a9e79e KK |
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); | |
4703389f | 160 | bool pciehp_check_link_active(struct controller *ctrl); |
82a9e79e | 161 | void pciehp_release_ctrl(struct controller *ctrl); |
2e35afae | 162 | int pciehp_reset_slot(struct slot *slot, int probe); |
1da177e4 | 163 | |
e1acb24f AC |
164 | static inline const char *slot_name(struct slot *slot) |
165 | { | |
166 | return hotplug_slot_name(slot->hotplug_slot); | |
167 | } | |
168 | ||
783c49fc | 169 | #ifdef CONFIG_ACPI |
e50d1088 KCA |
170 | #include <linux/pci-acpi.h> |
171 | ||
f39d5b72 BH |
172 | void __init pciehp_acpi_slot_detection_init(void); |
173 | int pciehp_acpi_slot_detection_check(struct pci_dev *dev); | |
c9ffa5a5 KK |
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) |
6e63e80d RW |
181 | static inline int pciehp_acpi_slot_detection_check(struct pci_dev *dev) |
182 | { | |
183 | return 0; | |
184 | } | |
f7625980 | 185 | #endif /* CONFIG_ACPI */ |
1da177e4 | 186 | #endif /* _PCIEHP_H */ |