LCOV - code coverage report
Current view: top level - drivers/pci - pci.h (source / functions) Hit Total Coverage
Test: combined.info Lines: 26 76 34.2 %
Date: 2022-04-01 14:35:51 Functions: 1 4 25.0 %
Branches: 22 112 19.6 %

           Branch data     Line data    Source code
       1                 :            : /* SPDX-License-Identifier: GPL-2.0 */
       2                 :            : #ifndef DRIVERS_PCI_H
       3                 :            : #define DRIVERS_PCI_H
       4                 :            : 
       5                 :            : #include <linux/pci.h>
       6                 :            : 
       7                 :            : /* Number of possible devfns: 0.0 to 1f.7 inclusive */
       8                 :            : #define MAX_NR_DEVFNS 256
       9                 :            : 
      10                 :            : #define PCI_FIND_CAP_TTL        48
      11                 :            : 
      12                 :            : #define PCI_VSEC_ID_INTEL_TBT   0x1234  /* Thunderbolt */
      13                 :            : 
      14                 :            : extern const unsigned char pcie_link_speed[];
      15                 :            : extern bool pci_early_dump;
      16                 :            : 
      17                 :            : bool pcie_cap_has_lnkctl(const struct pci_dev *dev);
      18                 :            : bool pcie_cap_has_rtctl(const struct pci_dev *dev);
      19                 :            : 
      20                 :            : /* Functions internal to the PCI core code */
      21                 :            : 
      22                 :            : int pci_create_sysfs_dev_files(struct pci_dev *pdev);
      23                 :            : void pci_remove_sysfs_dev_files(struct pci_dev *pdev);
      24                 :            : #if !defined(CONFIG_DMI) && !defined(CONFIG_ACPI)
      25                 :            : static inline void pci_create_firmware_label_files(struct pci_dev *pdev)
      26                 :            : { return; }
      27                 :            : static inline void pci_remove_firmware_label_files(struct pci_dev *pdev)
      28                 :            : { return; }
      29                 :            : #else
      30                 :            : void pci_create_firmware_label_files(struct pci_dev *pdev);
      31                 :            : void pci_remove_firmware_label_files(struct pci_dev *pdev);
      32                 :            : #endif
      33                 :            : void pci_cleanup_rom(struct pci_dev *dev);
      34                 :            : 
      35                 :            : enum pci_mmap_api {
      36                 :            :         PCI_MMAP_SYSFS, /* mmap on /sys/bus/pci/devices/<BDF>/resource<N> */
      37                 :            :         PCI_MMAP_PROCFS /* mmap on /proc/bus/pci/<BDF> */
      38                 :            : };
      39                 :            : int pci_mmap_fits(struct pci_dev *pdev, int resno, struct vm_area_struct *vmai,
      40                 :            :                   enum pci_mmap_api mmap_api);
      41                 :            : 
      42                 :            : int pci_probe_reset_function(struct pci_dev *dev);
      43                 :            : int pci_bridge_secondary_bus_reset(struct pci_dev *dev);
      44                 :            : int pci_bus_error_reset(struct pci_dev *dev);
      45                 :            : 
      46                 :            : #define PCI_PM_D2_DELAY         200
      47                 :            : #define PCI_PM_D3_WAIT          10
      48                 :            : #define PCI_PM_D3COLD_WAIT      100
      49                 :            : #define PCI_PM_BUS_WAIT         50
      50                 :            : 
      51                 :            : /**
      52                 :            :  * struct pci_platform_pm_ops - Firmware PM callbacks
      53                 :            :  *
      54                 :            :  * @bridge_d3: Does the bridge allow entering into D3
      55                 :            :  *
      56                 :            :  * @is_manageable: returns 'true' if given device is power manageable by the
      57                 :            :  *                 platform firmware
      58                 :            :  *
      59                 :            :  * @set_state: invokes the platform firmware to set the device's power state
      60                 :            :  *
      61                 :            :  * @get_state: queries the platform firmware for a device's current power state
      62                 :            :  *
      63                 :            :  * @refresh_state: asks the platform to refresh the device's power state data
      64                 :            :  *
      65                 :            :  * @choose_state: returns PCI power state of given device preferred by the
      66                 :            :  *                platform; to be used during system-wide transitions from a
      67                 :            :  *                sleeping state to the working state and vice versa
      68                 :            :  *
      69                 :            :  * @set_wakeup: enables/disables wakeup capability for the device
      70                 :            :  *
      71                 :            :  * @need_resume: returns 'true' if the given device (which is currently
      72                 :            :  *               suspended) needs to be resumed to be configured for system
      73                 :            :  *               wakeup.
      74                 :            :  *
      75                 :            :  * If given platform is generally capable of power managing PCI devices, all of
      76                 :            :  * these callbacks are mandatory.
      77                 :            :  */
      78                 :            : struct pci_platform_pm_ops {
      79                 :            :         bool (*bridge_d3)(struct pci_dev *dev);
      80                 :            :         bool (*is_manageable)(struct pci_dev *dev);
      81                 :            :         int (*set_state)(struct pci_dev *dev, pci_power_t state);
      82                 :            :         pci_power_t (*get_state)(struct pci_dev *dev);
      83                 :            :         void (*refresh_state)(struct pci_dev *dev);
      84                 :            :         pci_power_t (*choose_state)(struct pci_dev *dev);
      85                 :            :         int (*set_wakeup)(struct pci_dev *dev, bool enable);
      86                 :            :         bool (*need_resume)(struct pci_dev *dev);
      87                 :            : };
      88                 :            : 
      89                 :            : int pci_set_platform_pm(const struct pci_platform_pm_ops *ops);
      90                 :            : void pci_update_current_state(struct pci_dev *dev, pci_power_t state);
      91                 :            : void pci_refresh_power_state(struct pci_dev *dev);
      92                 :            : int pci_power_up(struct pci_dev *dev);
      93                 :            : void pci_disable_enabled_device(struct pci_dev *dev);
      94                 :            : int pci_finish_runtime_suspend(struct pci_dev *dev);
      95                 :            : void pcie_clear_root_pme_status(struct pci_dev *dev);
      96                 :            : bool pci_check_pme_status(struct pci_dev *dev);
      97                 :            : void pci_pme_wakeup_bus(struct pci_bus *bus);
      98                 :            : int __pci_pme_wakeup(struct pci_dev *dev, void *ign);
      99                 :            : void pci_pme_restore(struct pci_dev *dev);
     100                 :            : bool pci_dev_need_resume(struct pci_dev *dev);
     101                 :            : void pci_dev_adjust_pme(struct pci_dev *dev);
     102                 :            : void pci_dev_complete_resume(struct pci_dev *pci_dev);
     103                 :            : void pci_config_pm_runtime_get(struct pci_dev *dev);
     104                 :            : void pci_config_pm_runtime_put(struct pci_dev *dev);
     105                 :            : void pci_pm_init(struct pci_dev *dev);
     106                 :            : void pci_ea_init(struct pci_dev *dev);
     107                 :            : void pci_allocate_cap_save_buffers(struct pci_dev *dev);
     108                 :            : void pci_free_cap_save_buffers(struct pci_dev *dev);
     109                 :            : bool pci_bridge_d3_possible(struct pci_dev *dev);
     110                 :            : void pci_bridge_d3_update(struct pci_dev *dev);
     111                 :            : void pci_bridge_wait_for_secondary_bus(struct pci_dev *dev);
     112                 :            : 
     113                 :          0 : static inline void pci_wakeup_event(struct pci_dev *dev)
     114                 :            : {
     115                 :            :         /* Wait 100 ms before the system can be put into a sleep state. */
     116                 :          0 :         pm_wakeup_event(&dev->dev, 100);
     117                 :            : }
     118                 :            : 
     119                 :          0 : static inline bool pci_has_subordinate(struct pci_dev *pci_dev)
     120                 :            : {
     121   [ #  #  #  #  :          0 :         return !!(pci_dev->subordinate);
             #  #  #  # ]
     122                 :            : }
     123                 :            : 
     124                 :          0 : static inline bool pci_power_manageable(struct pci_dev *pci_dev)
     125                 :            : {
     126                 :            :         /*
     127                 :            :          * Currently we allow normal PCI devices and PCI bridges transition
     128                 :            :          * into D3 if their bridge_d3 is set.
     129                 :            :          */
     130   [ #  #  #  #  :          0 :         return !pci_has_subordinate(pci_dev) || pci_dev->bridge_d3;
          #  #  #  #  #  
                #  #  # ]
     131                 :            : }
     132                 :            : 
     133                 :          0 : static inline bool pcie_downstream_port(const struct pci_dev *dev)
     134                 :            : {
     135   [ #  #  #  #  :          0 :         int type = pci_pcie_type(dev);
                   #  # ]
     136                 :            : 
     137                 :          0 :         return type == PCI_EXP_TYPE_ROOT_PORT ||
     138   [ #  #  #  #  :          0 :                type == PCI_EXP_TYPE_DOWNSTREAM ||
          #  #  #  #  #  
          #  #  #  #  #  
             #  #  #  # ]
     139                 :            :                type == PCI_EXP_TYPE_PCIE_BRIDGE;
     140                 :            : }
     141                 :            : 
     142                 :            : int pci_vpd_init(struct pci_dev *dev);
     143                 :            : void pci_vpd_release(struct pci_dev *dev);
     144                 :            : void pcie_vpd_create_sysfs_dev_files(struct pci_dev *dev);
     145                 :            : void pcie_vpd_remove_sysfs_dev_files(struct pci_dev *dev);
     146                 :            : 
     147                 :            : /* PCI Virtual Channel */
     148                 :            : int pci_save_vc_state(struct pci_dev *dev);
     149                 :            : void pci_restore_vc_state(struct pci_dev *dev);
     150                 :            : void pci_allocate_vc_save_buffers(struct pci_dev *dev);
     151                 :            : 
     152                 :            : /* PCI /proc functions */
     153                 :            : #ifdef CONFIG_PROC_FS
     154                 :            : int pci_proc_attach_device(struct pci_dev *dev);
     155                 :            : int pci_proc_detach_device(struct pci_dev *dev);
     156                 :            : int pci_proc_detach_bus(struct pci_bus *bus);
     157                 :            : #else
     158                 :            : static inline int pci_proc_attach_device(struct pci_dev *dev) { return 0; }
     159                 :            : static inline int pci_proc_detach_device(struct pci_dev *dev) { return 0; }
     160                 :            : static inline int pci_proc_detach_bus(struct pci_bus *bus) { return 0; }
     161                 :            : #endif
     162                 :            : 
     163                 :            : /* Functions for PCI Hotplug drivers to use */
     164                 :            : int pci_hp_add_bridge(struct pci_dev *dev);
     165                 :            : 
     166                 :            : #ifdef HAVE_PCI_LEGACY
     167                 :            : void pci_create_legacy_files(struct pci_bus *bus);
     168                 :            : void pci_remove_legacy_files(struct pci_bus *bus);
     169                 :            : #else
     170         [ -  + ]:         21 : static inline void pci_create_legacy_files(struct pci_bus *bus) { return; }
     171         [ #  # ]:          0 : static inline void pci_remove_legacy_files(struct pci_bus *bus) { return; }
     172                 :            : #endif
     173                 :            : 
     174                 :            : /* Lock for read/write access to pci device and bus lists */
     175                 :            : extern struct rw_semaphore pci_bus_sem;
     176                 :            : extern struct mutex pci_slot_mutex;
     177                 :            : 
     178                 :            : extern raw_spinlock_t pci_lock;
     179                 :            : 
     180                 :            : extern unsigned int pci_pm_d3_delay;
     181                 :            : 
     182                 :            : #ifdef CONFIG_PCI_MSI
     183                 :            : void pci_no_msi(void);
     184                 :            : #else
     185                 :            : static inline void pci_no_msi(void) { }
     186                 :            : #endif
     187                 :            : 
     188                 :          0 : static inline void pci_msi_set_enable(struct pci_dev *dev, int enable)
     189                 :            : {
     190                 :          0 :         u16 control;
     191                 :            : 
     192                 :          0 :         pci_read_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, &control);
     193                 :          0 :         control &= ~PCI_MSI_FLAGS_ENABLE;
     194         [ #  # ]:          0 :         if (enable)
     195                 :          0 :                 control |= PCI_MSI_FLAGS_ENABLE;
     196                 :          0 :         pci_write_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, control);
     197                 :          0 : }
     198                 :            : 
     199                 :          0 : static inline void pci_msix_clear_and_set_ctrl(struct pci_dev *dev, u16 clear, u16 set)
     200                 :            : {
     201                 :          0 :         u16 ctrl;
     202                 :            : 
     203                 :          0 :         pci_read_config_word(dev, dev->msix_cap + PCI_MSIX_FLAGS, &ctrl);
     204                 :          0 :         ctrl &= ~clear;
     205                 :          0 :         ctrl |= set;
     206                 :          0 :         pci_write_config_word(dev, dev->msix_cap + PCI_MSIX_FLAGS, ctrl);
     207                 :          0 : }
     208                 :            : 
     209                 :            : void pci_realloc_get_opt(char *);
     210                 :            : 
     211                 :         21 : static inline int pci_no_d1d2(struct pci_dev *dev)
     212                 :            : {
     213                 :         21 :         unsigned int parent_dstates = 0;
     214                 :            : 
     215   [ -  +  -  -  :         21 :         if (dev->bus->self)
                   -  - ]
     216                 :          0 :                 parent_dstates = dev->bus->self->no_d1d2;
     217   [ +  -  -  -  :         21 :         return (dev->no_d1d2 || parent_dstates);
                   -  - ]
     218                 :            : 
     219                 :            : }
     220                 :            : extern const struct attribute_group *pci_dev_groups[];
     221                 :            : extern const struct attribute_group *pcibus_groups[];
     222                 :            : extern const struct device_type pci_dev_type;
     223                 :            : extern const struct attribute_group *pci_bus_groups[];
     224                 :            : 
     225                 :            : extern unsigned long pci_hotplug_io_size;
     226                 :            : extern unsigned long pci_hotplug_mmio_size;
     227                 :            : extern unsigned long pci_hotplug_mmio_pref_size;
     228                 :            : extern unsigned long pci_hotplug_bus_size;
     229                 :            : 
     230                 :            : /**
     231                 :            :  * pci_match_one_device - Tell if a PCI device structure has a matching
     232                 :            :  *                        PCI device id structure
     233                 :            :  * @id: single PCI device id structure to match
     234                 :            :  * @dev: the PCI device structure to match against
     235                 :            :  *
     236                 :            :  * Returns the matching pci_device_id structure or %NULL if there is no match.
     237                 :            :  */
     238                 :            : static inline const struct pci_device_id *
     239                 :     259497 : pci_match_one_device(const struct pci_device_id *id, const struct pci_dev *dev)
     240                 :            : {
     241   [ +  +  +  + ]:     259497 :         if ((id->vendor == PCI_ANY_ID || id->vendor == dev->vendor) &&
     242   [ +  +  +  + ]:      78456 :             (id->device == PCI_ANY_ID || id->device == dev->device) &&
     243   [ -  +  -  - ]:       3234 :             (id->subvendor == PCI_ANY_ID || id->subvendor == dev->subsystem_vendor) &&
     244   [ -  +  -  - ]:       3234 :             (id->subdevice == PCI_ANY_ID || id->subdevice == dev->subsystem_device) &&
     245         [ +  + ]:       3234 :             !((id->class ^ dev->class) & id->class_mask))
     246                 :       1428 :                 return id;
     247                 :            :         return NULL;
     248                 :            : }
     249                 :            : 
     250                 :            : /* PCI slot sysfs helper code */
     251                 :            : #define to_pci_slot(s) container_of(s, struct pci_slot, kobj)
     252                 :            : 
     253                 :            : extern struct kset *pci_slots_kset;
     254                 :            : 
     255                 :            : struct pci_slot_attribute {
     256                 :            :         struct attribute attr;
     257                 :            :         ssize_t (*show)(struct pci_slot *, char *);
     258                 :            :         ssize_t (*store)(struct pci_slot *, const char *, size_t);
     259                 :            : };
     260                 :            : #define to_pci_slot_attr(s) container_of(s, struct pci_slot_attribute, attr)
     261                 :            : 
     262                 :            : enum pci_bar_type {
     263                 :            :         pci_bar_unknown,        /* Standard PCI BAR probe */
     264                 :            :         pci_bar_io,             /* An I/O port BAR */
     265                 :            :         pci_bar_mem32,          /* A 32-bit memory BAR */
     266                 :            :         pci_bar_mem64,          /* A 64-bit memory BAR */
     267                 :            : };
     268                 :            : 
     269                 :            : struct device *pci_get_host_bridge_device(struct pci_dev *dev);
     270                 :            : void pci_put_host_bridge_device(struct device *dev);
     271                 :            : 
     272                 :            : int pci_configure_extended_tags(struct pci_dev *dev, void *ign);
     273                 :            : bool pci_bus_read_dev_vendor_id(struct pci_bus *bus, int devfn, u32 *pl,
     274                 :            :                                 int crs_timeout);
     275                 :            : bool pci_bus_generic_read_dev_vendor_id(struct pci_bus *bus, int devfn, u32 *pl,
     276                 :            :                                         int crs_timeout);
     277                 :            : int pci_idt_bus_quirk(struct pci_bus *bus, int devfn, u32 *pl, int crs_timeout);
     278                 :            : 
     279                 :            : int pci_setup_device(struct pci_dev *dev);
     280                 :            : int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type,
     281                 :            :                     struct resource *res, unsigned int reg);
     282                 :            : void pci_configure_ari(struct pci_dev *dev);
     283                 :            : void __pci_bus_size_bridges(struct pci_bus *bus,
     284                 :            :                         struct list_head *realloc_head);
     285                 :            : void __pci_bus_assign_resources(const struct pci_bus *bus,
     286                 :            :                                 struct list_head *realloc_head,
     287                 :            :                                 struct list_head *fail_head);
     288                 :            : bool pci_bus_clip_resource(struct pci_dev *dev, int idx);
     289                 :            : 
     290                 :            : void pci_reassigndev_resource_alignment(struct pci_dev *dev);
     291                 :            : void pci_disable_bridge_window(struct pci_dev *dev);
     292                 :            : struct pci_bus *pci_bus_get(struct pci_bus *bus);
     293                 :            : void pci_bus_put(struct pci_bus *bus);
     294                 :            : 
     295                 :            : /* PCIe link information */
     296                 :            : #define PCIE_SPEED2STR(speed) \
     297                 :            :         ((speed) == PCIE_SPEED_16_0GT ? "16 GT/s" : \
     298                 :            :          (speed) == PCIE_SPEED_8_0GT ? "8 GT/s" : \
     299                 :            :          (speed) == PCIE_SPEED_5_0GT ? "5 GT/s" : \
     300                 :            :          (speed) == PCIE_SPEED_2_5GT ? "2.5 GT/s" : \
     301                 :            :          "Unknown speed")
     302                 :            : 
     303                 :            : /* PCIe speed to Mb/s reduced by encoding overhead */
     304                 :            : #define PCIE_SPEED2MBS_ENC(speed) \
     305                 :            :         ((speed) == PCIE_SPEED_16_0GT ? 16000*128/130 : \
     306                 :            :          (speed) == PCIE_SPEED_8_0GT  ?  8000*128/130 : \
     307                 :            :          (speed) == PCIE_SPEED_5_0GT  ?  5000*8/10 : \
     308                 :            :          (speed) == PCIE_SPEED_2_5GT  ?  2500*8/10 : \
     309                 :            :          0)
     310                 :            : 
     311                 :            : enum pci_bus_speed pcie_get_speed_cap(struct pci_dev *dev);
     312                 :            : enum pcie_link_width pcie_get_width_cap(struct pci_dev *dev);
     313                 :            : u32 pcie_bandwidth_capable(struct pci_dev *dev, enum pci_bus_speed *speed,
     314                 :            :                            enum pcie_link_width *width);
     315                 :            : void __pcie_print_link_status(struct pci_dev *dev, bool verbose);
     316                 :            : void pcie_report_downtraining(struct pci_dev *dev);
     317                 :            : void pcie_update_link_speed(struct pci_bus *bus, u16 link_status);
     318                 :            : 
     319                 :            : /* Single Root I/O Virtualization */
     320                 :            : struct pci_sriov {
     321                 :            :         int             pos;            /* Capability position */
     322                 :            :         int             nres;           /* Number of resources */
     323                 :            :         u32             cap;            /* SR-IOV Capabilities */
     324                 :            :         u16             ctrl;           /* SR-IOV Control */
     325                 :            :         u16             total_VFs;      /* Total VFs associated with the PF */
     326                 :            :         u16             initial_VFs;    /* Initial VFs associated with the PF */
     327                 :            :         u16             num_VFs;        /* Number of VFs available */
     328                 :            :         u16             offset;         /* First VF Routing ID offset */
     329                 :            :         u16             stride;         /* Following VF stride */
     330                 :            :         u16             vf_device;      /* VF device ID */
     331                 :            :         u32             pgsz;           /* Page size for BAR alignment */
     332                 :            :         u8              link;           /* Function Dependency Link */
     333                 :            :         u8              max_VF_buses;   /* Max buses consumed by VFs */
     334                 :            :         u16             driver_max_VFs; /* Max num VFs driver supports */
     335                 :            :         struct pci_dev  *dev;           /* Lowest numbered PF */
     336                 :            :         struct pci_dev  *self;          /* This PF */
     337                 :            :         u32             class;          /* VF device */
     338                 :            :         u8              hdr_type;       /* VF header type */
     339                 :            :         u16             subsystem_vendor; /* VF subsystem vendor */
     340                 :            :         u16             subsystem_device; /* VF subsystem device */
     341                 :            :         resource_size_t barsz[PCI_SRIOV_NUM_BARS];      /* VF BAR size */
     342                 :            :         bool            drivers_autoprobe; /* Auto probing of VFs by driver */
     343                 :            : };
     344                 :            : 
     345                 :            : /**
     346                 :            :  * pci_dev_set_io_state - Set the new error state if possible.
     347                 :            :  *
     348                 :            :  * @dev - pci device to set new error_state
     349                 :            :  * @new - the state we want dev to be in
     350                 :            :  *
     351                 :            :  * Must be called with device_lock held.
     352                 :            :  *
     353                 :            :  * Returns true if state has been changed to the requested state.
     354                 :            :  */
     355                 :          0 : static inline bool pci_dev_set_io_state(struct pci_dev *dev,
     356                 :            :                                         pci_channel_state_t new)
     357                 :            : {
     358                 :          0 :         bool changed = false;
     359                 :            : 
     360         [ #  # ]:          0 :         device_lock_assert(&dev->dev);
     361                 :          0 :         switch (new) {
     362                 :            :         case pci_channel_io_perm_failure:
     363         [ #  # ]:          0 :                 switch (dev->error_state) {
     364                 :            :                 case pci_channel_io_frozen:
     365                 :            :                 case pci_channel_io_normal:
     366                 :            :                 case pci_channel_io_perm_failure:
     367                 :            :                         changed = true;
     368                 :            :                         break;
     369                 :            :                 }
     370                 :            :                 break;
     371                 :            :         case pci_channel_io_frozen:
     372                 :            :                 switch (dev->error_state) {
     373                 :            :                 case pci_channel_io_frozen:
     374                 :            :                 case pci_channel_io_normal:
     375                 :            :                         changed = true;
     376                 :            :                         break;
     377                 :            :                 }
     378                 :            :                 break;
     379                 :            :         case pci_channel_io_normal:
     380         [ #  # ]:          0 :                 switch (dev->error_state) {
     381                 :            :                 case pci_channel_io_frozen:
     382                 :            :                 case pci_channel_io_normal:
     383                 :            :                         changed = true;
     384                 :            :                         break;
     385                 :            :                 }
     386                 :            :                 break;
     387                 :            :         }
     388                 :            :         if (changed)
     389                 :          0 :                 dev->error_state = new;
     390         [ #  # ]:          0 :         return changed;
     391                 :            : }
     392                 :            : 
     393                 :          0 : static inline int pci_dev_set_disconnected(struct pci_dev *dev, void *unused)
     394                 :            : {
     395                 :          0 :         device_lock(&dev->dev);
     396         [ #  # ]:          0 :         pci_dev_set_io_state(dev, pci_channel_io_perm_failure);
     397                 :          0 :         device_unlock(&dev->dev);
     398                 :            : 
     399                 :          0 :         return 0;
     400                 :            : }
     401                 :            : 
     402                 :      10647 : static inline bool pci_dev_is_disconnected(const struct pci_dev *dev)
     403                 :            : {
     404   [ +  -  +  -  :      10647 :         return dev->error_state == pci_channel_io_perm_failure;
          +  -  -  +  -  
          +  -  +  -  -  
          -  -  -  -  -  
                      - ]
     405                 :            : }
     406                 :            : 
     407                 :            : /* pci_dev priv_flags */
     408                 :            : #define PCI_DEV_ADDED 0
     409                 :            : 
     410                 :        147 : static inline void pci_dev_assign_added(struct pci_dev *dev, bool added)
     411                 :            : {
     412                 :        147 :         assign_bit(PCI_DEV_ADDED, &dev->priv_flags, added);
     413                 :            : }
     414                 :            : 
     415                 :        441 : static inline bool pci_dev_is_added(const struct pci_dev *dev)
     416                 :            : {
     417                 :        441 :         return test_bit(PCI_DEV_ADDED, &dev->priv_flags);
     418                 :            : }
     419                 :            : 
     420                 :            : #ifdef CONFIG_PCIEAER
     421                 :            : #include <linux/aer.h>
     422                 :            : 
     423                 :            : #define AER_MAX_MULTI_ERR_DEVICES       5       /* Not likely to have more */
     424                 :            : 
     425                 :            : struct aer_err_info {
     426                 :            :         struct pci_dev *dev[AER_MAX_MULTI_ERR_DEVICES];
     427                 :            :         int error_dev_num;
     428                 :            : 
     429                 :            :         unsigned int id:16;
     430                 :            : 
     431                 :            :         unsigned int severity:2;        /* 0:NONFATAL | 1:FATAL | 2:COR */
     432                 :            :         unsigned int __pad1:5;
     433                 :            :         unsigned int multi_error_valid:1;
     434                 :            : 
     435                 :            :         unsigned int first_error:5;
     436                 :            :         unsigned int __pad2:2;
     437                 :            :         unsigned int tlp_header_valid:1;
     438                 :            : 
     439                 :            :         unsigned int status;            /* COR/UNCOR Error Status */
     440                 :            :         unsigned int mask;              /* COR/UNCOR Error Mask */
     441                 :            :         struct aer_header_log_regs tlp; /* TLP Header */
     442                 :            : };
     443                 :            : 
     444                 :            : int aer_get_device_error_info(struct pci_dev *dev, struct aer_err_info *info);
     445                 :            : void aer_print_error(struct pci_dev *dev, struct aer_err_info *info);
     446                 :            : #endif  /* CONFIG_PCIEAER */
     447                 :            : 
     448                 :            : #ifdef CONFIG_PCIE_DPC
     449                 :            : void pci_save_dpc_state(struct pci_dev *dev);
     450                 :            : void pci_restore_dpc_state(struct pci_dev *dev);
     451                 :            : #else
     452                 :         21 : static inline void pci_save_dpc_state(struct pci_dev *dev) {}
     453                 :          0 : static inline void pci_restore_dpc_state(struct pci_dev *dev) {}
     454                 :            : #endif
     455                 :            : 
     456                 :            : #ifdef CONFIG_PCI_ATS
     457                 :            : /* Address Translation Service */
     458                 :            : void pci_ats_init(struct pci_dev *dev);
     459                 :            : void pci_restore_ats_state(struct pci_dev *dev);
     460                 :            : #else
     461                 :            : static inline void pci_ats_init(struct pci_dev *d) { }
     462                 :            : static inline void pci_restore_ats_state(struct pci_dev *dev) { }
     463                 :            : #endif /* CONFIG_PCI_ATS */
     464                 :            : 
     465                 :            : #ifdef CONFIG_PCI_PRI
     466                 :            : void pci_pri_init(struct pci_dev *dev);
     467                 :            : void pci_restore_pri_state(struct pci_dev *pdev);
     468                 :            : #else
     469                 :            : static inline void pci_pri_init(struct pci_dev *dev) { }
     470                 :            : static inline void pci_restore_pri_state(struct pci_dev *pdev) { }
     471                 :            : #endif
     472                 :            : 
     473                 :            : #ifdef CONFIG_PCI_PASID
     474                 :            : void pci_pasid_init(struct pci_dev *dev);
     475                 :            : void pci_restore_pasid_state(struct pci_dev *pdev);
     476                 :            : #else
     477                 :            : static inline void pci_pasid_init(struct pci_dev *dev) { }
     478                 :            : static inline void pci_restore_pasid_state(struct pci_dev *pdev) { }
     479                 :            : #endif
     480                 :            : 
     481                 :            : #ifdef CONFIG_PCI_IOV
     482                 :            : int pci_iov_init(struct pci_dev *dev);
     483                 :            : void pci_iov_release(struct pci_dev *dev);
     484                 :            : void pci_iov_remove(struct pci_dev *dev);
     485                 :            : void pci_iov_update_resource(struct pci_dev *dev, int resno);
     486                 :            : resource_size_t pci_sriov_resource_alignment(struct pci_dev *dev, int resno);
     487                 :            : void pci_restore_iov_state(struct pci_dev *dev);
     488                 :            : int pci_iov_bus_range(struct pci_bus *bus);
     489                 :            : extern const struct attribute_group sriov_dev_attr_group;
     490                 :            : #else
     491                 :        147 : static inline int pci_iov_init(struct pci_dev *dev)
     492                 :            : {
     493                 :        147 :         return -ENODEV;
     494                 :            : }
     495                 :          0 : static inline void pci_iov_release(struct pci_dev *dev)
     496                 :            : 
     497                 :            : {
     498                 :          0 : }
     499                 :          0 : static inline void pci_iov_remove(struct pci_dev *dev)
     500                 :            : {
     501                 :            : }
     502                 :          0 : static inline void pci_restore_iov_state(struct pci_dev *dev)
     503                 :            : {
     504                 :          0 : }
     505                 :         21 : static inline int pci_iov_bus_range(struct pci_bus *bus)
     506                 :            : {
     507         [ +  - ]:         21 :         return 0;
     508                 :            : }
     509                 :            : 
     510                 :            : #endif /* CONFIG_PCI_IOV */
     511                 :            : 
     512                 :            : unsigned long pci_cardbus_resource_alignment(struct resource *);
     513                 :            : 
     514                 :            : static inline resource_size_t pci_resource_alignment(struct pci_dev *dev,
     515                 :            :                                                      struct resource *res)
     516                 :            : {
     517                 :            : #ifdef CONFIG_PCI_IOV
     518                 :            :         int resno = res - dev->resource;
     519                 :            : 
     520                 :            :         if (resno >= PCI_IOV_RESOURCES && resno <= PCI_IOV_RESOURCE_END)
     521                 :            :                 return pci_sriov_resource_alignment(dev, resno);
     522                 :            : #endif
     523                 :            :         if (dev->class >> 8 == PCI_CLASS_BRIDGE_CARDBUS)
     524                 :            :                 return pci_cardbus_resource_alignment(res);
     525                 :            :         return resource_alignment(res);
     526                 :            : }
     527                 :            : 
     528                 :            : void pci_enable_acs(struct pci_dev *dev);
     529                 :            : #ifdef CONFIG_PCI_QUIRKS
     530                 :            : int pci_dev_specific_acs_enabled(struct pci_dev *dev, u16 acs_flags);
     531                 :            : int pci_dev_specific_enable_acs(struct pci_dev *dev);
     532                 :            : int pci_dev_specific_disable_acs_redir(struct pci_dev *dev);
     533                 :            : #else
     534                 :            : static inline int pci_dev_specific_acs_enabled(struct pci_dev *dev,
     535                 :            :                                                u16 acs_flags)
     536                 :            : {
     537                 :            :         return -ENOTTY;
     538                 :            : }
     539                 :            : static inline int pci_dev_specific_enable_acs(struct pci_dev *dev)
     540                 :            : {
     541                 :            :         return -ENOTTY;
     542                 :            : }
     543                 :            : static inline int pci_dev_specific_disable_acs_redir(struct pci_dev *dev)
     544                 :            : {
     545                 :            :         return -ENOTTY;
     546                 :            : }
     547                 :            : #endif
     548                 :            : 
     549                 :            : /* PCI error reporting and recovery */
     550                 :            : void pcie_do_recovery(struct pci_dev *dev, enum pci_channel_state state,
     551                 :            :                       u32 service);
     552                 :            : 
     553                 :            : bool pcie_wait_for_link(struct pci_dev *pdev, bool active);
     554                 :            : #ifdef CONFIG_PCIEASPM
     555                 :            : void pcie_aspm_init_link_state(struct pci_dev *pdev);
     556                 :            : void pcie_aspm_exit_link_state(struct pci_dev *pdev);
     557                 :            : void pcie_aspm_pm_state_change(struct pci_dev *pdev);
     558                 :            : void pcie_aspm_powersave_config_link(struct pci_dev *pdev);
     559                 :            : #else
     560                 :            : static inline void pcie_aspm_init_link_state(struct pci_dev *pdev) { }
     561                 :            : static inline void pcie_aspm_exit_link_state(struct pci_dev *pdev) { }
     562                 :            : static inline void pcie_aspm_pm_state_change(struct pci_dev *pdev) { }
     563                 :            : static inline void pcie_aspm_powersave_config_link(struct pci_dev *pdev) { }
     564                 :            : #endif
     565                 :            : 
     566                 :            : #ifdef CONFIG_PCIE_ECRC
     567                 :            : void pcie_set_ecrc_checking(struct pci_dev *dev);
     568                 :            : void pcie_ecrc_get_policy(char *str);
     569                 :            : #else
     570                 :            : static inline void pcie_set_ecrc_checking(struct pci_dev *dev) { }
     571                 :            : static inline void pcie_ecrc_get_policy(char *str) { }
     572                 :            : #endif
     573                 :            : 
     574                 :            : #ifdef CONFIG_PCIE_PTM
     575                 :            : void pci_ptm_init(struct pci_dev *dev);
     576                 :            : int pci_enable_ptm(struct pci_dev *dev, u8 *granularity);
     577                 :            : #else
     578                 :        147 : static inline void pci_ptm_init(struct pci_dev *dev) { }
     579                 :            : static inline int pci_enable_ptm(struct pci_dev *dev, u8 *granularity)
     580                 :            : { return -EINVAL; }
     581                 :            : #endif
     582                 :            : 
     583                 :            : struct pci_dev_reset_methods {
     584                 :            :         u16 vendor;
     585                 :            :         u16 device;
     586                 :            :         int (*reset)(struct pci_dev *dev, int probe);
     587                 :            : };
     588                 :            : 
     589                 :            : #ifdef CONFIG_PCI_QUIRKS
     590                 :            : int pci_dev_specific_reset(struct pci_dev *dev, int probe);
     591                 :            : #else
     592                 :            : static inline int pci_dev_specific_reset(struct pci_dev *dev, int probe)
     593                 :            : {
     594                 :            :         return -ENOTTY;
     595                 :            : }
     596                 :            : #endif
     597                 :            : 
     598                 :            : #if defined(CONFIG_PCI_QUIRKS) && defined(CONFIG_ARM64)
     599                 :            : int acpi_get_rc_resources(struct device *dev, const char *hid, u16 segment,
     600                 :            :                           struct resource *res);
     601                 :            : #endif
     602                 :            : 
     603                 :            : u32 pci_rebar_get_possible_sizes(struct pci_dev *pdev, int bar);
     604                 :            : int pci_rebar_get_current_size(struct pci_dev *pdev, int bar);
     605                 :            : int pci_rebar_set_size(struct pci_dev *pdev, int bar, int size);
     606                 :          0 : static inline u64 pci_rebar_size_to_bytes(int size)
     607                 :            : {
     608                 :          0 :         return 1ULL << (size + 20);
     609                 :            : }
     610                 :            : 
     611                 :            : struct device_node;
     612                 :            : 
     613                 :            : #ifdef CONFIG_OF
     614                 :            : int of_pci_parse_bus_range(struct device_node *node, struct resource *res);
     615                 :            : int of_get_pci_domain_nr(struct device_node *node);
     616                 :            : int of_pci_get_max_link_speed(struct device_node *node);
     617                 :            : void pci_set_of_node(struct pci_dev *dev);
     618                 :            : void pci_release_of_node(struct pci_dev *dev);
     619                 :            : void pci_set_bus_of_node(struct pci_bus *bus);
     620                 :            : void pci_release_bus_of_node(struct pci_bus *bus);
     621                 :            : 
     622                 :            : #else
     623                 :            : static inline int
     624                 :            : of_pci_parse_bus_range(struct device_node *node, struct resource *res)
     625                 :            : {
     626                 :            :         return -EINVAL;
     627                 :            : }
     628                 :            : 
     629                 :            : static inline int
     630                 :            : of_get_pci_domain_nr(struct device_node *node)
     631                 :            : {
     632                 :            :         return -1;
     633                 :            : }
     634                 :            : 
     635                 :            : static inline int
     636                 :            : of_pci_get_max_link_speed(struct device_node *node)
     637                 :            : {
     638                 :            :         return -EINVAL;
     639                 :            : }
     640                 :            : 
     641                 :        147 : static inline void pci_set_of_node(struct pci_dev *dev) { }
     642                 :          0 : static inline void pci_release_of_node(struct pci_dev *dev) { }
     643                 :         21 : static inline void pci_set_bus_of_node(struct pci_bus *bus) { }
     644                 :          0 : static inline void pci_release_bus_of_node(struct pci_bus *bus) { }
     645                 :            : #endif /* CONFIG_OF */
     646                 :            : 
     647                 :            : #ifdef CONFIG_PCIEAER
     648                 :            : void pci_no_aer(void);
     649                 :            : void pci_aer_init(struct pci_dev *dev);
     650                 :            : void pci_aer_exit(struct pci_dev *dev);
     651                 :            : extern const struct attribute_group aer_stats_attr_group;
     652                 :            : void pci_aer_clear_fatal_status(struct pci_dev *dev);
     653                 :            : void pci_aer_clear_device_status(struct pci_dev *dev);
     654                 :            : #else
     655                 :            : static inline void pci_no_aer(void) { }
     656                 :            : static inline void pci_aer_init(struct pci_dev *d) { }
     657                 :            : static inline void pci_aer_exit(struct pci_dev *d) { }
     658                 :            : static inline void pci_aer_clear_fatal_status(struct pci_dev *dev) { }
     659                 :            : static inline void pci_aer_clear_device_status(struct pci_dev *dev) { }
     660                 :            : #endif
     661                 :            : 
     662                 :            : #ifdef CONFIG_ACPI
     663                 :            : int pci_acpi_program_hp_params(struct pci_dev *dev);
     664                 :            : #else
     665                 :            : static inline int pci_acpi_program_hp_params(struct pci_dev *dev)
     666                 :            : {
     667                 :            :         return -ENODEV;
     668                 :            : }
     669                 :            : #endif
     670                 :            : 
     671                 :            : #ifdef CONFIG_PCIEASPM
     672                 :            : extern const struct attribute_group aspm_ctrl_attr_group;
     673                 :            : #endif
     674                 :            : 
     675                 :            : #endif /* DRIVERS_PCI_H */

Generated by: LCOV version 1.14