linux/drivers/pci/pcie/portdrv.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2/*
   3 * Purpose:     PCI Express Port Bus Driver's Internal Data Structures
   4 *
   5 * Copyright (C) 2004 Intel
   6 * Copyright (C) Tom Long Nguyen (tom.l.nguyen@intel.com)
   7 */
   8
   9#ifndef _PORTDRV_H_
  10#define _PORTDRV_H_
  11
  12#include <linux/compiler.h>
  13
  14extern bool pcie_ports_native;
  15
  16/* Service Type */
  17#define PCIE_PORT_SERVICE_PME_SHIFT     0       /* Power Management Event */
  18#define PCIE_PORT_SERVICE_PME           (1 << PCIE_PORT_SERVICE_PME_SHIFT)
  19#define PCIE_PORT_SERVICE_AER_SHIFT     1       /* Advanced Error Reporting */
  20#define PCIE_PORT_SERVICE_AER           (1 << PCIE_PORT_SERVICE_AER_SHIFT)
  21#define PCIE_PORT_SERVICE_HP_SHIFT      2       /* Native Hotplug */
  22#define PCIE_PORT_SERVICE_HP            (1 << PCIE_PORT_SERVICE_HP_SHIFT)
  23#define PCIE_PORT_SERVICE_DPC_SHIFT     3       /* Downstream Port Containment */
  24#define PCIE_PORT_SERVICE_DPC           (1 << PCIE_PORT_SERVICE_DPC_SHIFT)
  25
  26#define PCIE_PORT_DEVICE_MAXSERVICES   4
  27
  28/* Port Type */
  29#define PCIE_ANY_PORT                   (~0)
  30
  31struct pcie_device {
  32        int             irq;        /* Service IRQ/MSI/MSI-X Vector */
  33        struct pci_dev *port;       /* Root/Upstream/Downstream Port */
  34        u32             service;    /* Port service this device represents */
  35        void            *priv_data; /* Service Private Data */
  36        struct device   device;     /* Generic Device Interface */
  37};
  38#define to_pcie_device(d) container_of(d, struct pcie_device, device)
  39
  40static inline void set_service_data(struct pcie_device *dev, void *data)
  41{
  42        dev->priv_data = data;
  43}
  44
  45static inline void *get_service_data(struct pcie_device *dev)
  46{
  47        return dev->priv_data;
  48}
  49
  50struct pcie_port_service_driver {
  51        const char *name;
  52        int (*probe) (struct pcie_device *dev);
  53        void (*remove) (struct pcie_device *dev);
  54        int (*suspend) (struct pcie_device *dev);
  55        int (*resume) (struct pcie_device *dev);
  56
  57        /* Device driver may resume normal operations */
  58        void (*error_resume)(struct pci_dev *dev);
  59
  60        /* Link Reset Capability - AER service driver specific */
  61        pci_ers_result_t (*reset_link) (struct pci_dev *dev);
  62
  63        int port_type;  /* Type of the port this driver can handle */
  64        u32 service;    /* Port service this device represents */
  65
  66        struct device_driver driver;
  67};
  68#define to_service_driver(d) \
  69        container_of(d, struct pcie_port_service_driver, driver)
  70
  71int pcie_port_service_register(struct pcie_port_service_driver *new);
  72void pcie_port_service_unregister(struct pcie_port_service_driver *new);
  73
  74/*
  75 * The PCIe Capability Interrupt Message Number (PCIe r3.1, sec 7.8.2) must
  76 * be one of the first 32 MSI-X entries.  Per PCI r3.0, sec 6.8.3.1, MSI
  77 * supports a maximum of 32 vectors per function.
  78 */
  79#define PCIE_PORT_MAX_MSI_ENTRIES       32
  80
  81#define get_descriptor_id(type, service) (((type - 4) << 8) | service)
  82
  83extern struct bus_type pcie_port_bus_type;
  84int pcie_port_device_register(struct pci_dev *dev);
  85#ifdef CONFIG_PM
  86int pcie_port_device_suspend(struct device *dev);
  87int pcie_port_device_resume(struct device *dev);
  88#endif
  89void pcie_port_device_remove(struct pci_dev *dev);
  90int __must_check pcie_port_bus_register(void);
  91void pcie_port_bus_unregister(void);
  92
  93struct pci_dev;
  94
  95#ifdef CONFIG_PCIE_PME
  96extern bool pcie_pme_msi_disabled;
  97
  98static inline void pcie_pme_disable_msi(void)
  99{
 100        pcie_pme_msi_disabled = true;
 101}
 102
 103static inline bool pcie_pme_no_msi(void)
 104{
 105        return pcie_pme_msi_disabled;
 106}
 107
 108void pcie_pme_interrupt_enable(struct pci_dev *dev, bool enable);
 109#else /* !CONFIG_PCIE_PME */
 110static inline void pcie_pme_disable_msi(void) {}
 111static inline bool pcie_pme_no_msi(void) { return false; }
 112static inline void pcie_pme_interrupt_enable(struct pci_dev *dev, bool en) {}
 113#endif /* !CONFIG_PCIE_PME */
 114
 115#endif /* _PORTDRV_H_ */
 116