* pci/aer: PCI/AER: Reformat AER register definitions PCI/portdrv: Move error handler methods to struct pcie_port_service_driver
Unified · Split
| @@ -32,16 +32,9 @@ · 31 unmodified lines | |||
| 32 | 32 | ||
| 33 | static int aer_probe(struct pcie_device *dev); | 33 | static int aer_probe(struct pcie_device *dev); |
| 34 | static void aer_remove(struct pcie_device *dev); | 34 | static void aer_remove(struct pcie_device *dev); |
| 35 | static pci_ers_result_t aer_error_detected(struct pci_dev *dev, | ||
| 36 | enum pci_channel_state error); | ||
| 37 | static void aer_error_resume(struct pci_dev *dev); | 35 | static void aer_error_resume(struct pci_dev *dev); |
| 38 | static pci_ers_result_t aer_root_reset(struct pci_dev *dev); | 36 | static pci_ers_result_t aer_root_reset(struct pci_dev *dev); |
| 39 | 37 | ||
| 40 | static const struct pci_error_handlers aer_error_handlers = { | ||
| 41 | .error_detected = aer_error_detected, | ||
| 42 | .resume = aer_error_resume, | ||
| 43 | }; | ||
| 44 | |||
| 45 | static struct pcie_port_service_driver aerdriver = { | 38 | static 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 | */ | ||
| 359 | static 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 bits | 344 | * aer_error_resume - clean up corresponding error status bits |
| 368 | * @dev: pointer to Root Port's pci_dev data structure | 345 | * @dev: pointer to Root Port's pci_dev data structure |
| @@ -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. */ |
| 27 | bool pcie_ports_disabled; | 26 | bool 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 | ||
| 180 | static 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 | |||
| 209 | static pci_ers_result_t pcie_portdrv_error_detected(struct pci_dev *dev, | 179 | static 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 | |||
| 219 | static 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 | ||
| 244 | static pci_ers_result_t pcie_portdrv_mmio_enabled(struct pci_dev *dev) | 186 | static 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 | |||
| 253 | static 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 | ||
| 278 | static pci_ers_result_t pcie_portdrv_slot_reset(struct pci_dev *dev) | 191 | static 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 | ||
| 295 | static int resume_iter(struct device *device, void *data) | 204 | static 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 | ||
| @@ -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); |
| @@ -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 0x00000001 | 737 | #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 48 | 739 | #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 0x00000002 | 742 | #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 0x00000004 | 744 | #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 0x00000008 | 746 | #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 */ |