1 // SPDX-License-Identifier: GPL-2.0+
3 * PCI Express Hot Plug Controller Driver
5 * Copyright (C) 1995,2001 Compaq Computer Corporation
6 * Copyright (C) 2001 Greg Kroah-Hartman (greg@kroah.com)
7 * Copyright (C) 2001 IBM Corp.
8 * Copyright (C) 2003-2004 Intel Corporation
10 * All rights reserved.
12 * Send feedback to <greg@kroah.com>, <kristen.c.accardi@intel.com>
15 * Dan Zink <dan.zink@compaq.com>
16 * Greg Kroah-Hartman <greg@kroah.com>
17 * Dely Sy <dely.l.sy@intel.com>"
20 #include <linux/moduleparam.h>
21 #include <linux/kernel.h>
22 #include <linux/slab.h>
23 #include <linux/types.h>
24 #include <linux/pci.h>
26 #include <linux/interrupt.h>
27 #include <linux/time.h>
29 /* Global variables */
31 bool pciehp_poll_mode
;
33 static bool pciehp_force
;
36 * not really modular, but the easiest way to keep compat with existing
37 * bootargs behaviour is to continue using module_param here.
39 module_param(pciehp_debug
, bool, 0644);
40 module_param(pciehp_poll_mode
, bool, 0644);
41 module_param(pciehp_poll_time
, int, 0644);
42 module_param(pciehp_force
, bool, 0644);
43 MODULE_PARM_DESC(pciehp_debug
, "Debugging mode enabled or not");
44 MODULE_PARM_DESC(pciehp_poll_mode
, "Using polling mechanism for hot-plug events or not");
45 MODULE_PARM_DESC(pciehp_poll_time
, "Polling mechanism frequency, in seconds");
46 MODULE_PARM_DESC(pciehp_force
, "Force pciehp, even if OSHP is missing");
48 #define PCIE_MODULE_NAME "pciehp"
50 static int set_attention_status(struct hotplug_slot
*slot
, u8 value
);
51 static int enable_slot(struct hotplug_slot
*slot
);
52 static int disable_slot(struct hotplug_slot
*slot
);
53 static int get_power_status(struct hotplug_slot
*slot
, u8
*value
);
54 static int get_attention_status(struct hotplug_slot
*slot
, u8
*value
);
55 static int get_latch_status(struct hotplug_slot
*slot
, u8
*value
);
56 static int get_adapter_status(struct hotplug_slot
*slot
, u8
*value
);
57 static int reset_slot(struct hotplug_slot
*slot
, int probe
);
60 * release_slot - free up the memory used by a slot
61 * @hotplug_slot: slot to free
63 static void release_slot(struct hotplug_slot
*hotplug_slot
)
65 kfree(hotplug_slot
->ops
);
66 kfree(hotplug_slot
->info
);
70 static int init_slot(struct controller
*ctrl
)
72 struct slot
*slot
= ctrl
->slot
;
73 struct hotplug_slot
*hotplug
= NULL
;
74 struct hotplug_slot_info
*info
= NULL
;
75 struct hotplug_slot_ops
*ops
= NULL
;
76 char name
[SLOT_NAME_SIZE
];
79 hotplug
= kzalloc(sizeof(*hotplug
), GFP_KERNEL
);
83 info
= kzalloc(sizeof(*info
), GFP_KERNEL
);
87 /* Setup hotplug slot ops */
88 ops
= kzalloc(sizeof(*ops
), GFP_KERNEL
);
92 ops
->enable_slot
= enable_slot
;
93 ops
->disable_slot
= disable_slot
;
94 ops
->get_power_status
= get_power_status
;
95 ops
->get_adapter_status
= get_adapter_status
;
96 ops
->reset_slot
= reset_slot
;
98 ops
->get_latch_status
= get_latch_status
;
100 ops
->get_attention_status
= get_attention_status
;
101 ops
->set_attention_status
= set_attention_status
;
102 } else if (ctrl
->pcie
->port
->hotplug_user_indicators
) {
103 ops
->get_attention_status
= pciehp_get_raw_indicator_status
;
104 ops
->set_attention_status
= pciehp_set_raw_indicator_status
;
107 /* register this slot with the hotplug pci core */
108 hotplug
->info
= info
;
109 hotplug
->private = slot
;
110 hotplug
->release
= &release_slot
;
112 slot
->hotplug_slot
= hotplug
;
113 snprintf(name
, SLOT_NAME_SIZE
, "%u", PSN(ctrl
));
115 retval
= pci_hp_register(hotplug
,
116 ctrl
->pcie
->port
->subordinate
, 0, name
);
118 ctrl_err(ctrl
, "pci_hp_register failed: error %d\n", retval
);
128 static void cleanup_slot(struct controller
*ctrl
)
130 pci_hp_deregister(ctrl
->slot
->hotplug_slot
);
134 * set_attention_status - Turns the Amber LED for a slot on, off or blink
136 static int set_attention_status(struct hotplug_slot
*hotplug_slot
, u8 status
)
138 struct slot
*slot
= hotplug_slot
->private;
140 pciehp_set_attention_status(slot
, status
);
145 static int enable_slot(struct hotplug_slot
*hotplug_slot
)
147 struct slot
*slot
= hotplug_slot
->private;
149 return pciehp_sysfs_enable_slot(slot
);
153 static int disable_slot(struct hotplug_slot
*hotplug_slot
)
155 struct slot
*slot
= hotplug_slot
->private;
157 return pciehp_sysfs_disable_slot(slot
);
160 static int get_power_status(struct hotplug_slot
*hotplug_slot
, u8
*value
)
162 struct slot
*slot
= hotplug_slot
->private;
164 pciehp_get_power_status(slot
, value
);
168 static int get_attention_status(struct hotplug_slot
*hotplug_slot
, u8
*value
)
170 struct slot
*slot
= hotplug_slot
->private;
172 pciehp_get_attention_status(slot
, value
);
176 static int get_latch_status(struct hotplug_slot
*hotplug_slot
, u8
*value
)
178 struct slot
*slot
= hotplug_slot
->private;
180 pciehp_get_latch_status(slot
, value
);
184 static int get_adapter_status(struct hotplug_slot
*hotplug_slot
, u8
*value
)
186 struct slot
*slot
= hotplug_slot
->private;
188 pciehp_get_adapter_status(slot
, value
);
192 static int reset_slot(struct hotplug_slot
*hotplug_slot
, int probe
)
194 struct slot
*slot
= hotplug_slot
->private;
196 return pciehp_reset_slot(slot
, probe
);
199 static int pciehp_probe(struct pcie_device
*dev
)
202 struct controller
*ctrl
;
204 u8 occupied
, poweron
;
206 /* If this is not a "hotplug" service, we have no business here. */
207 if (dev
->service
!= PCIE_PORT_SERVICE_HP
)
210 if (!dev
->port
->subordinate
) {
211 /* Can happen if we run out of bus numbers during probe */
212 dev_err(&dev
->device
,
213 "Hotplug bridge without secondary bus, ignoring\n");
217 ctrl
= pcie_init(dev
);
219 dev_err(&dev
->device
, "Controller initialization failed\n");
222 set_service_data(dev
, ctrl
);
224 /* Setup the slot information structures */
225 rc
= init_slot(ctrl
);
228 ctrl_warn(ctrl
, "Slot already registered by another hotplug driver\n");
230 ctrl_err(ctrl
, "Slot initialization failed (%d)\n", rc
);
231 goto err_out_release_ctlr
;
234 /* Enable events after we have setup the data structures */
235 rc
= pcie_init_notification(ctrl
);
237 ctrl_err(ctrl
, "Notification initialization failed (%d)\n", rc
);
238 goto err_out_free_ctrl_slot
;
241 /* Check if slot is occupied */
243 pciehp_get_adapter_status(slot
, &occupied
);
244 pciehp_get_power_status(slot
, &poweron
);
245 if (occupied
&& pciehp_force
) {
246 mutex_lock(&slot
->hotplug_lock
);
247 pciehp_enable_slot(slot
);
248 mutex_unlock(&slot
->hotplug_lock
);
250 /* If empty slot's power status is on, turn power off */
251 if (!occupied
&& poweron
&& POWER_CTRL(ctrl
))
252 pciehp_power_off_slot(slot
);
256 err_out_free_ctrl_slot
:
258 err_out_release_ctlr
:
259 pciehp_release_ctrl(ctrl
);
263 static void pciehp_remove(struct pcie_device
*dev
)
265 struct controller
*ctrl
= get_service_data(dev
);
268 pciehp_release_ctrl(ctrl
);
272 static int pciehp_suspend(struct pcie_device
*dev
)
277 static int pciehp_resume(struct pcie_device
*dev
)
279 struct controller
*ctrl
;
283 ctrl
= get_service_data(dev
);
285 /* reinitialize the chipset's event detection logic */
286 pcie_enable_notification(ctrl
);
290 /* Check if slot is occupied */
291 pciehp_get_adapter_status(slot
, &status
);
292 mutex_lock(&slot
->hotplug_lock
);
294 pciehp_enable_slot(slot
);
296 pciehp_disable_slot(slot
);
297 mutex_unlock(&slot
->hotplug_lock
);
302 static struct pcie_port_service_driver hpdriver_portdrv
= {
303 .name
= PCIE_MODULE_NAME
,
304 .port_type
= PCIE_ANY_PORT
,
305 .service
= PCIE_PORT_SERVICE_HP
,
307 .probe
= pciehp_probe
,
308 .remove
= pciehp_remove
,
311 .suspend
= pciehp_suspend
,
312 .resume
= pciehp_resume
,
316 static int __init
pcied_init(void)
320 retval
= pcie_port_service_register(&hpdriver_portdrv
);
321 dbg("pcie_port_service_register = %d\n", retval
);
323 dbg("Failure to register service\n");
327 device_initcall(pcied_init
);