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_RC_PORT 4 /* Root port of RC */ 14#define PCIE_SW_UPSTREAM_PORT 5 /* Upstream port of Switch */ 15#define PCIE_SW_DOWNSTREAM_PORT 6 /* Downstream port of Switch */ 16#define PCIE_ANY_PORT 7 17 18/* Service Type */ 19#define PCIE_PORT_SERVICE_PME_SHIFT 0 /* Power Management Event */ 20#define PCIE_PORT_SERVICE_PME (1 << PCIE_PORT_SERVICE_PME_SHIFT) 21#define PCIE_PORT_SERVICE_AER_SHIFT 1 /* Advanced Error Reporting */ 22#define PCIE_PORT_SERVICE_AER (1 << PCIE_PORT_SERVICE_AER_SHIFT) 23#define PCIE_PORT_SERVICE_HP_SHIFT 2 /* Native Hotplug */ 24#define PCIE_PORT_SERVICE_HP (1 << PCIE_PORT_SERVICE_HP_SHIFT) 25#define PCIE_PORT_SERVICE_VC_SHIFT 3 /* Virtual Channel */ 26#define PCIE_PORT_SERVICE_VC (1 << PCIE_PORT_SERVICE_VC_SHIFT) 27 28/* Root/Upstream/Downstream Port's Interrupt Mode */ 29#define PCIE_PORT_NO_IRQ (-1) 30#define PCIE_PORT_INTx_MODE 0 31#define PCIE_PORT_MSI_MODE 1 32#define PCIE_PORT_MSIX_MODE 2 33 34struct pcie_port_data { 35 int port_type; /* Type of the port */ 36 int port_irq_mode; /* [0:INTx | 1:MSI | 2:MSI-X] */ 37}; 38 39struct pcie_device { 40 int irq; /* Service IRQ/MSI/MSI-X Vector */ 41 struct pci_dev *port; /* Root/Upstream/Downstream Port */ 42 u32 service; /* Port service this device represents */ 43 void *priv_data; /* Service Private Data */ 44 struct device device; /* Generic Device Interface */ 45}; 46#define to_pcie_device(d) container_of(d, struct pcie_device, device) 47 48static inline void set_service_data(struct pcie_device *dev, void *data) 49{ 50 dev->priv_data = data; 51} 52 53static inline void* get_service_data(struct pcie_device *dev) 54{ 55 return dev->priv_data; 56} 57 58struct pcie_port_service_driver { 59 const char *name; 60 int (*probe) (struct pcie_device *dev); 61 void (*remove) (struct pcie_device *dev); 62 int (*suspend) (struct pcie_device *dev); 63 int (*resume) (struct pcie_device *dev); 64 65 /* Service Error Recovery Handler */ 66 struct pci_error_handlers *err_handler; 67 68 /* Link Reset Capability - AER service driver specific */ 69 pci_ers_result_t (*reset_link) (struct pci_dev *dev); 70 71 int port_type; /* Type of the port this driver can handle */ 72 u32 service; /* Port service this device represents */ 73 74 struct device_driver driver; 75}; 76#define to_service_driver(d) \ 77 container_of(d, struct pcie_port_service_driver, driver) 78 79extern int pcie_port_service_register(struct pcie_port_service_driver *new); 80extern void pcie_port_service_unregister(struct pcie_port_service_driver *new); 81 82#endif /* _PCIEPORT_IF_H_ */ 83