History

Merge branch 'pci/aer' into next

* pci/aer: PCI/AER: Reformat AER register definitions PCI/portdrv: Move error handler methods to struct pcie_port_service_driver

Bjorn Helgaas committed 9 years ago

Commit f1901322 parents 3a749ea 8fc614c4 files · +19 −141Browse files

Unified · Split

4 files
  1. drivers/pci/pcie/aer/aerdrv.c +1 −24
  2. drivers/pci/pcie/portdrv_pci.c +6 −99
  3. include/linux/pcieport_if.h +2 −2
  4. include/uapi/linux/pci_regs.h +10 −16
drivers/pci/pcie/aer/aerdrv.c+1−24
@@ -32,16 +32,9 @@ · 31 unmodified lines
32 32
33static int aer_probe(struct pcie_device *dev);33static int aer_probe(struct pcie_device *dev);
34static void aer_remove(struct pcie_device *dev);34static void aer_remove(struct pcie_device *dev);
35static pci_ers_result_t aer_error_detected(struct pci_dev *dev,
36 enum pci_channel_state error);
37static void aer_error_resume(struct pci_dev *dev);35static void aer_error_resume(struct pci_dev *dev);
38static pci_ers_result_t aer_root_reset(struct pci_dev *dev);36static pci_ers_result_t aer_root_reset(struct pci_dev *dev);
39 37
40static const struct pci_error_handlers aer_error_handlers = {
41 .error_detected = aer_error_detected,
42 .resume = aer_error_resume,
43};
44
45static struct pcie_port_service_driver aerdriver = {38static struct pcie_port_service_driver aerdriver = {
46 .name = "aer",39 .name = "aer",
47 .port_type = PCI_EXP_TYPE_ROOT_PORT,40 .port_type = PCI_EXP_TYPE_ROOT_PORT,
@@ -49,9 +42,7 @@ static struct pcie_port_service_driver aerdriver = { · 1 unmodified line
49 42
50 .probe = aer_probe,43 .probe = aer_probe,
51 .remove = aer_remove,44 .remove = aer_remove,
52 45 .error_resume = aer_error_resume,
53 .err_handler = &aer_error_handlers,
54
55 .reset_link = aer_root_reset,46 .reset_link = aer_root_reset,
56};47};
57 48
@@ -349,20 +340,6 @@ static pci_ers_result_t aer_root_reset(struct pci_dev *dev) · 291 unmodified lines
349 return PCI_ERS_RESULT_RECOVERED;340 return PCI_ERS_RESULT_RECOVERED;
350}341}
351 342
352/**
353 * aer_error_detected - update severity status
354 * @dev: pointer to Root Port's pci_dev data structure
355 * @error: error severity being notified by port bus
356 *
357 * Invoked by Port Bus driver during error recovery.
358 */
359static pci_ers_result_t aer_error_detected(struct pci_dev *dev,
360 enum pci_channel_state error)
361{
362 /* Root Port has no impact. Always recovers. */
363 return PCI_ERS_RESULT_CAN_RECOVER;
364}
365
366/**343/**
367 * aer_error_resume - clean up corresponding error status bits344 * aer_error_resume - clean up corresponding error status bits
368 * @dev: pointer to Root Port's pci_dev data structure345 * @dev: pointer to Root Port's pci_dev data structure
drivers/pci/pcie/portdrv_pci.c+6−99
@@ -21,7 +21,6 @@ · 20 unmodified lines
21 21
22#include "../pci.h"22#include "../pci.h"
23#include "portdrv.h"23#include "portdrv.h"
24#include "aer/aerdrv.h"
25 24
26/* If this switch is set, PCIe port native services should not be enabled. */25/* If this switch is set, PCIe port native services should not be enabled. */
27bool pcie_ports_disabled;26bool pcie_ports_disabled;
@@ -177,108 +176,20 @@ static void pcie_portdrv_remove(struct pci_dev *dev) · 149 unmodified lines
177 pcie_port_device_remove(dev);176 pcie_port_device_remove(dev);
178}177}
179 178
180static int error_detected_iter(struct device *device, void *data)
181{
182 struct pcie_device *pcie_device;
183 struct pcie_port_service_driver *driver;
184 struct aer_broadcast_data *result_data;
185 pci_ers_result_t status;
186
187 result_data = (struct aer_broadcast_data *) data;
188
189 if (device->bus == &pcie_port_bus_type && device->driver) {
190 driver = to_service_driver(device->driver);
191 if (!driver ||
192 !driver->err_handler ||
193 !driver->err_handler->error_detected)
194 return 0;
195
196 pcie_device = to_pcie_device(device);
197
198 /* Forward error detected message to service drivers */
199 status = driver->err_handler->error_detected(
200 pcie_device->port,
201 result_data->state);
202 result_data->result =
203 merge_result(result_data->result, status);
204 }
205
206 return 0;
207}
208
209static pci_ers_result_t pcie_portdrv_error_detected(struct pci_dev *dev,179static pci_ers_result_t pcie_portdrv_error_detected(struct pci_dev *dev,
210 enum pci_channel_state error)180 enum pci_channel_state error)
211{181{
212 struct aer_broadcast_data data = {error, PCI_ERS_RESULT_CAN_RECOVER};182 /* Root Port has no impact. Always recovers. */
213 183 return PCI_ERS_RESULT_CAN_RECOVER;
214 /* get true return value from &data */
215 device_for_each_child(&dev->dev, &data, error_detected_iter);
216 return data.result;
217}
218
219static int mmio_enabled_iter(struct device *device, void *data)
220{
221 struct pcie_device *pcie_device;
222 struct pcie_port_service_driver *driver;
223 pci_ers_result_t status, *result;
224
225 result = (pci_ers_result_t *) data;
226
227 if (device->bus == &pcie_port_bus_type && device->driver) {
228 driver = to_service_driver(device->driver);
229 if (driver &&
230 driver->err_handler &&
231 driver->err_handler->mmio_enabled) {
232 pcie_device = to_pcie_device(device);
233
234 /* Forward error message to service drivers */
235 status = driver->err_handler->mmio_enabled(
236 pcie_device->port);
237 *result = merge_result(*result, status);
238 }
239 }
240
241 return 0;
242}184}
243 185
244static pci_ers_result_t pcie_portdrv_mmio_enabled(struct pci_dev *dev)186static pci_ers_result_t pcie_portdrv_mmio_enabled(struct pci_dev *dev)
245{187{
246 pci_ers_result_t status = PCI_ERS_RESULT_RECOVERED;188 return PCI_ERS_RESULT_RECOVERED;
247
248 /* get true return value from &status */
249 device_for_each_child(&dev->dev, &status, mmio_enabled_iter);
250 return status;
251}
252
253static int slot_reset_iter(struct device *device, void *data)
254{
255 struct pcie_device *pcie_device;
256 struct pcie_port_service_driver *driver;
257 pci_ers_result_t status, *result;
258
259 result = (pci_ers_result_t *) data;
260
261 if (device->bus == &pcie_port_bus_type && device->driver) {
262 driver = to_service_driver(device->driver);
263 if (driver &&
264 driver->err_handler &&
265 driver->err_handler->slot_reset) {
266 pcie_device = to_pcie_device(device);
267
268 /* Forward error message to service drivers */
269 status = driver->err_handler->slot_reset(
270 pcie_device->port);
271 *result = merge_result(*result, status);
272 }
273 }
274
275 return 0;
276}189}
277 190
278static pci_ers_result_t pcie_portdrv_slot_reset(struct pci_dev *dev)191static pci_ers_result_t pcie_portdrv_slot_reset(struct pci_dev *dev)
279{192{
280 pci_ers_result_t status = PCI_ERS_RESULT_RECOVERED;
281
282 /* If fatal, restore cfg space for possible link reset at upstream */193 /* If fatal, restore cfg space for possible link reset at upstream */
283 if (dev->error_state == pci_channel_io_frozen) {194 if (dev->error_state == pci_channel_io_frozen) {
284 dev->state_saved = true;195 dev->state_saved = true;
@@ -287,9 +198,7 @@ static pci_ers_result_t pcie_portdrv_slot_reset(struct pci_dev *dev) · 2 unmodified lines
287 pci_enable_pcie_error_reporting(dev);198 pci_enable_pcie_error_reporting(dev);
288 }199 }
289 200
290 /* get true return value from &status */201 return PCI_ERS_RESULT_RECOVERED;
291 device_for_each_child(&dev->dev, &status, slot_reset_iter);
292 return status;
293}202}
294 203
295static int resume_iter(struct device *device, void *data)204static int resume_iter(struct device *device, void *data)
@@ -299,13 +208,11 @@ static int resume_iter(struct device *device, void *data) · 3 unmodified lines
299 208
300 if (device->bus == &pcie_port_bus_type && device->driver) {209 if (device->bus == &pcie_port_bus_type && device->driver) {
301 driver = to_service_driver(device->driver);210 driver = to_service_driver(device->driver);
302 if (driver &&211 if (driver && driver->error_resume) {
303 driver->err_handler &&
304 driver->err_handler->resume) {
305 pcie_device = to_pcie_device(device);212 pcie_device = to_pcie_device(device);
306 213
307 /* Forward error message to service drivers */214 /* Forward error message to service drivers */
308 driver->err_handler->resume(pcie_device->port);215 driver->error_resume(pcie_device->port);
309 }216 }
310 }217 }
311 218
include/linux/pcieport_if.h+2−2
@@ -50,8 +50,8 @@ struct pcie_port_service_driver { · 49 unmodified lines
50 int (*suspend) (struct pcie_device *dev);50 int (*suspend) (struct pcie_device *dev);
51 int (*resume) (struct pcie_device *dev);51 int (*resume) (struct pcie_device *dev);
52 52
53 /* Service Error Recovery Handler */53 /* Device driver may resume normal operations */
54 const struct pci_error_handlers *err_handler;54 void (*error_resume)(struct pci_dev *dev);
55 55
56 /* Link Reset Capability - AER service driver specific */56 /* Link Reset Capability - AER service driver specific */
57 pci_ers_result_t (*reset_link) (struct pci_dev *dev);57 pci_ers_result_t (*reset_link) (struct pci_dev *dev);
include/uapi/linux/pci_regs.h+10−16
@@ -733,23 +733,17 @@ · 732 unmodified lines
733#define PCI_ERR_CAP_ECRC_CHKE 0x00000100 /* ECRC Check Enable */733#define PCI_ERR_CAP_ECRC_CHKE 0x00000100 /* ECRC Check Enable */
734#define PCI_ERR_HEADER_LOG 28 /* Header Log Register (16 bytes) */734#define PCI_ERR_HEADER_LOG 28 /* Header Log Register (16 bytes) */
735#define PCI_ERR_ROOT_COMMAND 44 /* Root Error Command */735#define PCI_ERR_ROOT_COMMAND 44 /* Root Error Command */
736/* Correctable Err Reporting Enable */736#define PCI_ERR_ROOT_CMD_COR_EN 0x00000001 /* Correctable Err Reporting Enable */
737#define PCI_ERR_ROOT_CMD_COR_EN 0x00000001737#define PCI_ERR_ROOT_CMD_NONFATAL_EN 0x00000002 /* Non-Fatal Err Reporting Enable */
738/* Non-fatal Err Reporting Enable */738#define PCI_ERR_ROOT_CMD_FATAL_EN 0x00000004 /* Fatal Err Reporting Enable */
739#define PCI_ERR_ROOT_CMD_NONFATAL_EN 0x00000002
740/* Fatal Err Reporting Enable */
741#define PCI_ERR_ROOT_CMD_FATAL_EN 0x00000004
742#define PCI_ERR_ROOT_STATUS 48739#define PCI_ERR_ROOT_STATUS 48
743#define PCI_ERR_ROOT_COR_RCV 0x00000001 /* ERR_COR Received */740#define PCI_ERR_ROOT_COR_RCV 0x00000001 /* ERR_COR Received */
744/* Multi ERR_COR Received */741#define PCI_ERR_ROOT_MULTI_COR_RCV 0x00000002 /* Multiple ERR_COR */
745#define PCI_ERR_ROOT_MULTI_COR_RCV 0x00000002742#define PCI_ERR_ROOT_UNCOR_RCV 0x00000004 /* ERR_FATAL/NONFATAL */
746/* ERR_FATAL/NONFATAL Received */743#define PCI_ERR_ROOT_MULTI_UNCOR_RCV 0x00000008 /* Multiple FATAL/NONFATAL */
747#define PCI_ERR_ROOT_UNCOR_RCV 0x00000004744#define PCI_ERR_ROOT_FIRST_FATAL 0x00000010 /* First UNC is Fatal */
748/* Multi ERR_FATAL/NONFATAL Received */745#define PCI_ERR_ROOT_NONFATAL_RCV 0x00000020 /* Non-Fatal Received */
749#define PCI_ERR_ROOT_MULTI_UNCOR_RCV 0x00000008746#define PCI_ERR_ROOT_FATAL_RCV 0x00000040 /* Fatal Received */
750#define PCI_ERR_ROOT_FIRST_FATAL 0x00000010 /* First Fatal */
751#define PCI_ERR_ROOT_NONFATAL_RCV 0x00000020 /* Non-Fatal Received */
752#define PCI_ERR_ROOT_FATAL_RCV 0x00000040 /* Fatal Received */
753#define PCI_ERR_ROOT_ERR_SRC 52 /* Error Source Identification */747#define PCI_ERR_ROOT_ERR_SRC 52 /* Error Source Identification */
754 748
755/* Virtual Channel */749/* Virtual Channel */

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t