1 /* 2 * File: pcieport_if.h 3 * Purpose: PCI Express Port Bus Driver's IF Data Structure 4 * 5 * Copyright (C) 2004 Intel 6 * Copyright (C) Tom Long Nguyen (tom.l.nguyen@intel.com) 7 */ 8 9 #ifndef _PCIEPORT_IF_H_ 10 #define _PCIEPORT_IF_H_ 11 12 /* Port Type */ 13 #define PCIE_ANY_PORT (~0) 14 15 /* Service Type */ 16 #define PCIE_PORT_SERVICE_PME_SHIFT 0 /* Power Management Event */ 17 #define PCIE_PORT_SERVICE_PME (1 << PCIE_PORT_SERVICE_PME_SHIFT) 18 #define PCIE_PORT_SERVICE_AER_SHIFT 1 /* Advanced Error Reporting */ 19 #define PCIE_PORT_SERVICE_AER (1 << PCIE_PORT_SERVICE_AER_SHIFT) 20 #define PCIE_PORT_SERVICE_HP_SHIFT 2 /* Native Hotplug */ 21 #define PCIE_PORT_SERVICE_HP (1 << PCIE_PORT_SERVICE_HP_SHIFT) 22 #define PCIE_PORT_SERVICE_VC_SHIFT 3 /* Virtual Channel */ 23 #define PCIE_PORT_SERVICE_VC (1 << PCIE_PORT_SERVICE_VC_SHIFT) 24 25 struct pcie_device { 26 int irq; /* Service IRQ/MSI/MSI-X Vector */ 27 struct pci_dev *port; /* Root/Upstream/Downstream Port */ 28 u32 service; /* Port service this device represents */ 29 void *priv_data; /* Service Private Data */ 30 struct device device; /* Generic Device Interface */ 31 }; 32 #define to_pcie_device(d) container_of(d, struct pcie_device, device) 33 set_service_data(struct pcie_device * dev,void * data)34static inline void set_service_data(struct pcie_device *dev, void *data) 35 { 36 dev->priv_data = data; 37 } 38 get_service_data(struct pcie_device * dev)39static inline void* get_service_data(struct pcie_device *dev) 40 { 41 return dev->priv_data; 42 } 43 44 struct pcie_port_service_driver { 45 const char *name; 46 int (*probe) (struct pcie_device *dev); 47 void (*remove) (struct pcie_device *dev); 48 int (*suspend) (struct pcie_device *dev); 49 int (*resume) (struct pcie_device *dev); 50 51 /* Service Error Recovery Handler */ 52 struct pci_error_handlers *err_handler; 53 54 /* Link Reset Capability - AER service driver specific */ 55 pci_ers_result_t (*reset_link) (struct pci_dev *dev); 56 57 int port_type; /* Type of the port this driver can handle */ 58 u32 service; /* Port service this device represents */ 59 60 struct device_driver driver; 61 }; 62 #define to_service_driver(d) \ 63 container_of(d, struct pcie_port_service_driver, driver) 64 65 extern int pcie_port_service_register(struct pcie_port_service_driver *new); 66 extern void pcie_port_service_unregister(struct pcie_port_service_driver *new); 67 68 #endif /* _PCIEPORT_IF_H_ */ 69