1
2
3
4
5
6
7
8
9
10
11
12
13
14
15#ifndef _PCIEHP_H
16#define _PCIEHP_H
17
18#include <linux/types.h>
19#include <linux/pci.h>
20#include <linux/pci_hotplug.h>
21#include <linux/delay.h>
22#include <linux/mutex.h>
23#include <linux/rwsem.h>
24#include <linux/workqueue.h>
25
26#include "../pcie/portdrv.h"
27
28#define MY_NAME "pciehp"
29
30extern bool pciehp_poll_mode;
31extern int pciehp_poll_time;
32extern bool pciehp_debug;
33
34#define dbg(format, arg...) \
35do { \
36 if (pciehp_debug) \
37 printk(KERN_DEBUG "%s: " format, MY_NAME, ## arg); \
38} while (0)
39#define err(format, arg...) \
40 printk(KERN_ERR "%s: " format, MY_NAME, ## arg)
41#define info(format, arg...) \
42 printk(KERN_INFO "%s: " format, MY_NAME, ## arg)
43#define warn(format, arg...) \
44 printk(KERN_WARNING "%s: " format, MY_NAME, ## arg)
45
46#define ctrl_dbg(ctrl, format, arg...) \
47 do { \
48 if (pciehp_debug) \
49 dev_printk(KERN_DEBUG, &ctrl->pcie->device, \
50 format, ## arg); \
51 } while (0)
52#define ctrl_err(ctrl, format, arg...) \
53 dev_err(&ctrl->pcie->device, format, ## arg)
54#define ctrl_info(ctrl, format, arg...) \
55 dev_info(&ctrl->pcie->device, format, ## arg)
56#define ctrl_warn(ctrl, format, arg...) \
57 dev_warn(&ctrl->pcie->device, format, ## arg)
58
59#define SLOT_NAME_SIZE 10
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97struct controller {
98 struct pcie_device *pcie;
99
100 u32 slot_cap;
101
102 u16 slot_ctrl;
103 struct mutex ctrl_lock;
104 unsigned long cmd_started;
105 unsigned int cmd_busy:1;
106 wait_queue_head_t queue;
107
108 atomic_t pending_events;
109 unsigned int notification_enabled:1;
110 unsigned int power_fault_detected;
111 struct task_struct *poll_thread;
112
113 u8 state;
114 struct mutex state_lock;
115 struct delayed_work button_work;
116
117 struct hotplug_slot hotplug_slot;
118 struct rw_semaphore reset_lock;
119 int request_result;
120 wait_queue_head_t requester;
121};
122
123
124
125
126
127
128
129
130
131
132
133
134
135#define OFF_STATE 0
136#define BLINKINGON_STATE 1
137#define BLINKINGOFF_STATE 2
138#define POWERON_STATE 3
139#define POWEROFF_STATE 4
140#define ON_STATE 5
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155#define DISABLE_SLOT (1 << 16)
156#define RERUN_ISR (1 << 17)
157
158#define ATTN_BUTTN(ctrl) ((ctrl)->slot_cap & PCI_EXP_SLTCAP_ABP)
159#define POWER_CTRL(ctrl) ((ctrl)->slot_cap & PCI_EXP_SLTCAP_PCP)
160#define MRL_SENS(ctrl) ((ctrl)->slot_cap & PCI_EXP_SLTCAP_MRLSP)
161#define ATTN_LED(ctrl) ((ctrl)->slot_cap & PCI_EXP_SLTCAP_AIP)
162#define PWR_LED(ctrl) ((ctrl)->slot_cap & PCI_EXP_SLTCAP_PIP)
163#define HP_SUPR_RM(ctrl) ((ctrl)->slot_cap & PCI_EXP_SLTCAP_HPS)
164#define EMI(ctrl) ((ctrl)->slot_cap & PCI_EXP_SLTCAP_EIP)
165#define NO_CMD_CMPL(ctrl) ((ctrl)->slot_cap & PCI_EXP_SLTCAP_NCCS)
166#define PSN(ctrl) (((ctrl)->slot_cap & PCI_EXP_SLTCAP_PSN) >> 19)
167
168void pciehp_request(struct controller *ctrl, int action);
169void pciehp_handle_button_press(struct controller *ctrl);
170void pciehp_handle_disable_request(struct controller *ctrl);
171void pciehp_handle_presence_or_link_change(struct controller *ctrl, u32 events);
172int pciehp_configure_device(struct controller *ctrl);
173void pciehp_unconfigure_device(struct controller *ctrl, bool presence);
174void pciehp_queue_pushbutton_work(struct work_struct *work);
175struct controller *pcie_init(struct pcie_device *dev);
176int pcie_init_notification(struct controller *ctrl);
177void pcie_shutdown_notification(struct controller *ctrl);
178void pcie_clear_hotplug_events(struct controller *ctrl);
179int pciehp_power_on_slot(struct controller *ctrl);
180void pciehp_power_off_slot(struct controller *ctrl);
181void pciehp_get_power_status(struct controller *ctrl, u8 *status);
182
183void pciehp_set_attention_status(struct controller *ctrl, u8 status);
184void pciehp_get_latch_status(struct controller *ctrl, u8 *status);
185int pciehp_query_power_fault(struct controller *ctrl);
186void pciehp_green_led_on(struct controller *ctrl);
187void pciehp_green_led_off(struct controller *ctrl);
188void pciehp_green_led_blink(struct controller *ctrl);
189bool pciehp_card_present(struct controller *ctrl);
190bool pciehp_card_present_or_link_active(struct controller *ctrl);
191int pciehp_check_link_status(struct controller *ctrl);
192bool pciehp_check_link_active(struct controller *ctrl);
193void pciehp_release_ctrl(struct controller *ctrl);
194
195int pciehp_sysfs_enable_slot(struct hotplug_slot *hotplug_slot);
196int pciehp_sysfs_disable_slot(struct hotplug_slot *hotplug_slot);
197int pciehp_reset_slot(struct hotplug_slot *hotplug_slot, int probe);
198int pciehp_get_attention_status(struct hotplug_slot *hotplug_slot, u8 *status);
199int pciehp_set_raw_indicator_status(struct hotplug_slot *h_slot, u8 status);
200int pciehp_get_raw_indicator_status(struct hotplug_slot *h_slot, u8 *status);
201
202static inline const char *slot_name(struct controller *ctrl)
203{
204 return hotplug_slot_name(&ctrl->hotplug_slot);
205}
206
207static inline struct controller *to_ctrl(struct hotplug_slot *hotplug_slot)
208{
209 return container_of(hotplug_slot, struct controller, hotplug_slot);
210}
211
212#endif
213