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; |
d537a3ab | 95 | u16 slot_ctrl; |
48fe3915 | 96 | struct timer_list poll_timer; |
40b96083 | 97 | unsigned long cmd_started; /* jiffies */ |
6a82e218 | 98 | unsigned int cmd_busy:1; |
f18e9625 | 99 | unsigned int link_active_reporting:1; |
dbc7e1e5 | 100 | unsigned int notification_enabled:1; |
99f0169c | 101 | unsigned int power_fault_detected; |
1da177e4 LT |
102 | }; |
103 | ||
1da177e4 LT |
104 | #define INT_PRESENCE_ON 1 |
105 | #define INT_PRESENCE_OFF 2 | |
2db0f71f BH |
106 | #define INT_POWER_FAULT 3 |
107 | #define INT_BUTTON_PRESS 4 | |
108 | #define INT_LINK_UP 5 | |
109 | #define INT_LINK_DOWN 6 | |
1da177e4 LT |
110 | |
111 | #define STATIC_STATE 0 | |
112 | #define BLINKINGON_STATE 1 | |
113 | #define BLINKINGOFF_STATE 2 | |
114 | #define POWERON_STATE 3 | |
115 | #define POWEROFF_STATE 4 | |
116 | ||
656927b1 KK |
117 | #define ATTN_BUTTN(ctrl) ((ctrl)->slot_cap & PCI_EXP_SLTCAP_ABP) |
118 | #define POWER_CTRL(ctrl) ((ctrl)->slot_cap & PCI_EXP_SLTCAP_PCP) | |
119 | #define MRL_SENS(ctrl) ((ctrl)->slot_cap & PCI_EXP_SLTCAP_MRLSP) | |
120 | #define ATTN_LED(ctrl) ((ctrl)->slot_cap & PCI_EXP_SLTCAP_AIP) | |
121 | #define PWR_LED(ctrl) ((ctrl)->slot_cap & PCI_EXP_SLTCAP_PIP) | |
122 | #define HP_SUPR_RM(ctrl) ((ctrl)->slot_cap & PCI_EXP_SLTCAP_HPS) | |
123 | #define EMI(ctrl) ((ctrl)->slot_cap & PCI_EXP_SLTCAP_EIP) | |
124 | #define NO_CMD_CMPL(ctrl) ((ctrl)->slot_cap & PCI_EXP_SLTCAP_NCCS) | |
17f830bb | 125 | #define PSN(ctrl) (((ctrl)->slot_cap & PCI_EXP_SLTCAP_PSN) >> 19) |
1da177e4 | 126 | |
f39d5b72 BH |
127 | int pciehp_sysfs_enable_slot(struct slot *slot); |
128 | int pciehp_sysfs_disable_slot(struct slot *slot); | |
4f092fec | 129 | void pciehp_queue_interrupt_event(struct slot *slot, u32 event_type); |
f39d5b72 BH |
130 | int pciehp_configure_device(struct slot *p_slot); |
131 | int pciehp_unconfigure_device(struct slot *p_slot); | |
132 | void pciehp_queue_pushbutton_work(struct work_struct *work); | |
c4635eb0 | 133 | struct controller *pcie_init(struct pcie_device *dev); |
dbc7e1e5 | 134 | int pcie_init_notification(struct controller *ctrl); |
0a3c33d7 | 135 | int pciehp_enable_slot(struct slot *p_slot); |
cd2fe83a | 136 | int pciehp_disable_slot(struct slot *p_slot); |
6dae6202 | 137 | void pcie_enable_notification(struct controller *ctrl); |
82a9e79e | 138 | int pciehp_power_on_slot(struct slot *slot); |
6dae6202 BH |
139 | void pciehp_power_off_slot(struct slot *slot); |
140 | void pciehp_get_power_status(struct slot *slot, u8 *status); | |
141 | void pciehp_get_attention_status(struct slot *slot, u8 *status); | |
82a9e79e | 142 | |
6dae6202 BH |
143 | void pciehp_set_attention_status(struct slot *slot, u8 status); |
144 | void pciehp_get_latch_status(struct slot *slot, u8 *status); | |
145 | void pciehp_get_adapter_status(struct slot *slot, u8 *status); | |
82a9e79e KK |
146 | int pciehp_query_power_fault(struct slot *slot); |
147 | void pciehp_green_led_on(struct slot *slot); | |
148 | void pciehp_green_led_off(struct slot *slot); | |
149 | void pciehp_green_led_blink(struct slot *slot); | |
150 | int pciehp_check_link_status(struct controller *ctrl); | |
4703389f | 151 | bool pciehp_check_link_active(struct controller *ctrl); |
82a9e79e | 152 | void pciehp_release_ctrl(struct controller *ctrl); |
2e35afae | 153 | int pciehp_reset_slot(struct slot *slot, int probe); |
1da177e4 | 154 | |
e1acb24f AC |
155 | static inline const char *slot_name(struct slot *slot) |
156 | { | |
157 | return hotplug_slot_name(slot->hotplug_slot); | |
158 | } | |
159 | ||
1da177e4 | 160 | #endif /* _PCIEHP_H */ |