pci-v5.15-changes
-----BEGIN PGP SIGNATURE-----
iQJIBAABCgAyFiEEgMe7l+5h9hnxdsnuWYigwDrT+vwFAmE3jjYUHGJoZWxnYWFz
QGdvb2dsZS5jb20ACgkQWYigwDrT+vwrIA/8DYHYRQ6tR3lY0ZxVeBdnd/ryp/ag
z35N8RFLPaFlifLWSldwDV/8dylXnRjS57WS9sppp5gKsLl6xYySvTeMpt5QHdXd
gJw27sBqiBmecUGFHWVp9B3yF2LvgrtItjd9RadYaHhWEfWyB5AFK7qwxx02fzvo
hoGA2XbpI/Hb1BvSOi1avmPYgly1BRu8RFvKMwB2cxQNv3TZOnekT/iFK5WVR1o2
Z5BA+0nj9PrDO/axS0Vh+TqXhU+hOGox7bkOMcNmbDV7Yo8hgot5SsxddbZqJX+O
BNNrRv72pbHGIwT/vOP7OQ49sRXledHYeyEGIixjLylBcROk9t8M1z1sfgJ6obVy
1eM3TIx/+7OS5dxC+gTNMVgUiL1NQIdA1LVIBb0BrXm6yNqNxBlj3o/gQ+VGEiNI
0lATmpe4P/N0/cOSI7tK9O2zsX3qzbLnJxsseGrwtK1L+GRYMUPhP4ciblhB0CIf
BmK9j0ROmCBGN0Pz/5wIaQgkTro74dqO1BPX8n84M8KWByNZwTrJo/rCBdD4DGaJ
eJvyt3hoYxhSxRQ1rp3zqZ9ytm4dJBGcZBKeO1IvKvJHEzfZBIqqq3M/hlNIaSDP
v+8I9HaS1kI4SDB1Ia0LFRqKqvpN+WVLB+EoGkeDQozPO42tYSb43lYe83sEnZ+T
KY0a/5feu975eLs=
=g1WT
-----END PGP SIGNATURE-----
Merge tag 'pci-v5.15-changes' of git://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci
Pull PCI updates from Bjorn Helgaas:
"Enumeration:
- Convert controller drivers to generic_handle_domain_irq() (Marc
Zyngier)
- Simplify VPD (Vital Product Data) access and search (Heiner
Kallweit)
- Update bnx2, bnx2x, bnxt, cxgb4, cxlflash, sfc, tg3 drivers to use
simplified VPD interfaces (Heiner Kallweit)
- Run Max Payload Size quirks before configuring MPS; work around
ASMedia ASM1062 SATA MPS issue (Marek Behún)
Resource management:
- Refactor pci_ioremap_bar() and pci_ioremap_wc_bar() (Krzysztof
Wilczyński)
- Optimize pci_resource_len() to reduce kernel size (Zhen Lei)
PCI device hotplug:
- Fix a double unmap in ibmphp (Vishal Aslot)
PCIe port driver:
- Enable Bandwidth Notification only if port supports it (Stuart
Hayes)
Sysfs/proc/syscalls:
- Add schedule point in proc_bus_pci_read() (Krzysztof Wilczyński)
- Return ~0 data on pciconfig_read() CAP_SYS_ADMIN failure (Krzysztof
Wilczyński)
- Return "int" from pciconfig_read() syscall (Krzysztof Wilczyński)
Virtualization:
- Extend "pci=noats" to also turn on Translation Blocking to protect
against some DMA attacks (Alex Williamson)
- Add sysfs mechanism to control the type of reset used between
device assignments to VMs (Amey Narkhede)
- Add support for ACPI _RST reset method (Shanker Donthineni)
- Add ACS quirks for Cavium multi-function devices (George Cherian)
- Add ACS quirks for NXP LX2xx0 and LX2xx2 platforms (Wasim Khan)
- Allow HiSilicon AMBA devices that appear as fake PCI devices to use
PASID and SVA (Zhangfei Gao)
Endpoint framework:
- Add support for SR-IOV Endpoint devices (Kishon Vijay Abraham I)
- Zero-initialize endpoint test tool parameters so we don't use
random parameters (Shunyong Yang)
APM X-Gene PCIe controller driver:
- Remove redundant dev_err() call in xgene_msi_probe() (ErKun Yang)
Broadcom iProc PCIe controller driver:
- Don't fail devm_pci_alloc_host_bridge() on missing 'ranges' because
it's optional on BCMA devices (Rob Herring)
- Fix BCMA probe resource handling (Rob Herring)
Cadence PCIe driver:
- Work around J7200 Link training electrical issue by increasing
delays in LTSSM (Nadeem Athani)
Intel IXP4xx PCI controller driver:
- Depend on ARCH_IXP4XX to avoid useless config questions (Geert
Uytterhoeven)
Intel Keembay PCIe controller driver:
- Add Intel Keem Bay PCIe controller (Srikanth Thokala)
Marvell Aardvark PCIe controller driver:
- Work around config space completion handling issues (Evan Wang)
- Increase timeout for config access completions (Pali Rohár)
- Emulate CRS Software Visibility bit (Pali Rohár)
- Configure resources from DT 'ranges' property to fix I/O space
access (Pali Rohár)
- Serialize INTx mask/unmask (Pali Rohár)
MediaTek PCIe controller driver:
- Add MT7629 support in DT (Chuanjia Liu)
- Fix an MSI issue (Chuanjia Liu)
- Get syscon regmap ("mediatek,generic-pciecfg"), IRQ number
("pci_irq"), PCI domain ("linux,pci-domain") from DT properties if
present (Chuanjia Liu)
Microsoft Hyper-V host bridge driver:
- Add ARM64 support (Boqun Feng)
- Support "Create Interrupt v3" message (Sunil Muthuswamy)
NVIDIA Tegra PCIe controller driver:
- Use seq_puts(), move err_msg from stack to static, fix OF node leak
(Christophe JAILLET)
NVIDIA Tegra194 PCIe driver:
- Disable suspend when in Endpoint mode (Om Prakash Singh)
- Fix MSI-X address programming error (Om Prakash Singh)
- Disable interrupts during suspend to avoid spurious AER link down
(Om Prakash Singh)
Renesas R-Car PCIe controller driver:
- Work around hardware issue that prevents Link L1->L0 transition
(Marek Vasut)
- Fix runtime PM refcount leak (Dinghao Liu)
Rockchip DesignWare PCIe controller driver:
- Add Rockchip RK356X host controller driver (Simon Xue)
TI J721E PCIe driver:
- Add support for J7200 and AM64 (Kishon Vijay Abraham I)
Toshiba Visconti PCIe controller driver:
- Add Toshiba Visconti PCIe host controller driver (Nobuhiro
Iwamatsu)
Xilinx NWL PCIe controller driver:
- Enable PCIe reference clock via CCF (Hyun Kwon)
Miscellaneous:
- Convert sta2x11 from 'pci_' to 'dma_' API (Christophe JAILLET)
- Fix pci_dev_str_match_path() alloc while atomic bug (used for
kernel parameters that specify devices) (Dan Carpenter)
- Remove pointless Precision Time Management warning when PTM is
present but not enabled (Jakub Kicinski)
- Remove surplus "break" statements (Krzysztof Wilczyński)"
* tag 'pci-v5.15-changes' of git://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci: (132 commits)
PCI: ibmphp: Fix double unmap of io_mem
x86/PCI: sta2x11: switch from 'pci_' to 'dma_' API
PCI/VPD: Use unaligned access helpers
PCI/VPD: Clean up public VPD defines and inline functions
cxgb4: Use pci_vpd_find_id_string() to find VPD ID string
PCI/VPD: Add pci_vpd_find_id_string()
PCI/VPD: Include post-processing in pci_vpd_find_tag()
PCI/VPD: Stop exporting pci_vpd_find_info_keyword()
PCI/VPD: Stop exporting pci_vpd_find_tag()
PCI: Set dma-can-stall for HiSilicon chips
PCI: rockchip-dwc: Add Rockchip RK356X host controller driver
PCI: dwc: Remove surplus break statement after return
PCI: artpec6: Remove local code block from switch statement
PCI: artpec6: Remove surplus break statement after return
MAINTAINERS: Add entries for Toshiba Visconti PCIe controller
PCI: visconti: Add Toshiba Visconti PCIe host controller driver
PCI/portdrv: Enable Bandwidth Notification only if port supports it
PCI: Allow PASID on fake PCIe devices without TLP prefixes
PCI: mediatek: Use PCI domain to handle ports detection
PCI: mediatek: Add new method to get irq number
...
This commit is contained in:
commit
ac08b1c68d
100 changed files with 3882 additions and 1577 deletions
|
|
@ -62,31 +62,32 @@ pci_epc_interface_string(enum pci_epc_interface_type type)
|
|||
* @owner: the module owner containing the ops
|
||||
*/
|
||||
struct pci_epc_ops {
|
||||
int (*write_header)(struct pci_epc *epc, u8 func_no,
|
||||
int (*write_header)(struct pci_epc *epc, u8 func_no, u8 vfunc_no,
|
||||
struct pci_epf_header *hdr);
|
||||
int (*set_bar)(struct pci_epc *epc, u8 func_no,
|
||||
int (*set_bar)(struct pci_epc *epc, u8 func_no, u8 vfunc_no,
|
||||
struct pci_epf_bar *epf_bar);
|
||||
void (*clear_bar)(struct pci_epc *epc, u8 func_no,
|
||||
void (*clear_bar)(struct pci_epc *epc, u8 func_no, u8 vfunc_no,
|
||||
struct pci_epf_bar *epf_bar);
|
||||
int (*map_addr)(struct pci_epc *epc, u8 func_no,
|
||||
int (*map_addr)(struct pci_epc *epc, u8 func_no, u8 vfunc_no,
|
||||
phys_addr_t addr, u64 pci_addr, size_t size);
|
||||
void (*unmap_addr)(struct pci_epc *epc, u8 func_no,
|
||||
void (*unmap_addr)(struct pci_epc *epc, u8 func_no, u8 vfunc_no,
|
||||
phys_addr_t addr);
|
||||
int (*set_msi)(struct pci_epc *epc, u8 func_no, u8 interrupts);
|
||||
int (*get_msi)(struct pci_epc *epc, u8 func_no);
|
||||
int (*set_msix)(struct pci_epc *epc, u8 func_no, u16 interrupts,
|
||||
enum pci_barno, u32 offset);
|
||||
int (*get_msix)(struct pci_epc *epc, u8 func_no);
|
||||
int (*raise_irq)(struct pci_epc *epc, u8 func_no,
|
||||
int (*set_msi)(struct pci_epc *epc, u8 func_no, u8 vfunc_no,
|
||||
u8 interrupts);
|
||||
int (*get_msi)(struct pci_epc *epc, u8 func_no, u8 vfunc_no);
|
||||
int (*set_msix)(struct pci_epc *epc, u8 func_no, u8 vfunc_no,
|
||||
u16 interrupts, enum pci_barno, u32 offset);
|
||||
int (*get_msix)(struct pci_epc *epc, u8 func_no, u8 vfunc_no);
|
||||
int (*raise_irq)(struct pci_epc *epc, u8 func_no, u8 vfunc_no,
|
||||
enum pci_epc_irq_type type, u16 interrupt_num);
|
||||
int (*map_msi_irq)(struct pci_epc *epc, u8 func_no,
|
||||
int (*map_msi_irq)(struct pci_epc *epc, u8 func_no, u8 vfunc_no,
|
||||
phys_addr_t phys_addr, u8 interrupt_num,
|
||||
u32 entry_size, u32 *msi_data,
|
||||
u32 *msi_addr_offset);
|
||||
int (*start)(struct pci_epc *epc);
|
||||
void (*stop)(struct pci_epc *epc);
|
||||
const struct pci_epc_features* (*get_features)(struct pci_epc *epc,
|
||||
u8 func_no);
|
||||
u8 func_no, u8 vfunc_no);
|
||||
struct module *owner;
|
||||
};
|
||||
|
||||
|
|
@ -128,6 +129,8 @@ struct pci_epc_mem {
|
|||
* single window.
|
||||
* @num_windows: number of windows supported by device
|
||||
* @max_functions: max number of functions that can be configured in this EPC
|
||||
* @max_vfs: Array indicating the maximum number of virtual functions that can
|
||||
* be associated with each physical function
|
||||
* @group: configfs group representing the PCI EPC device
|
||||
* @lock: mutex to protect pci_epc ops
|
||||
* @function_num_map: bitmap to manage physical function number
|
||||
|
|
@ -141,6 +144,7 @@ struct pci_epc {
|
|||
struct pci_epc_mem *mem;
|
||||
unsigned int num_windows;
|
||||
u8 max_functions;
|
||||
u8 *max_vfs;
|
||||
struct config_group *group;
|
||||
/* mutex to protect against concurrent access of EP controller */
|
||||
struct mutex lock;
|
||||
|
|
@ -208,31 +212,32 @@ void pci_epc_linkup(struct pci_epc *epc);
|
|||
void pci_epc_init_notify(struct pci_epc *epc);
|
||||
void pci_epc_remove_epf(struct pci_epc *epc, struct pci_epf *epf,
|
||||
enum pci_epc_interface_type type);
|
||||
int pci_epc_write_header(struct pci_epc *epc, u8 func_no,
|
||||
int pci_epc_write_header(struct pci_epc *epc, u8 func_no, u8 vfunc_no,
|
||||
struct pci_epf_header *hdr);
|
||||
int pci_epc_set_bar(struct pci_epc *epc, u8 func_no,
|
||||
int pci_epc_set_bar(struct pci_epc *epc, u8 func_no, u8 vfunc_no,
|
||||
struct pci_epf_bar *epf_bar);
|
||||
void pci_epc_clear_bar(struct pci_epc *epc, u8 func_no,
|
||||
void pci_epc_clear_bar(struct pci_epc *epc, u8 func_no, u8 vfunc_no,
|
||||
struct pci_epf_bar *epf_bar);
|
||||
int pci_epc_map_addr(struct pci_epc *epc, u8 func_no,
|
||||
int pci_epc_map_addr(struct pci_epc *epc, u8 func_no, u8 vfunc_no,
|
||||
phys_addr_t phys_addr,
|
||||
u64 pci_addr, size_t size);
|
||||
void pci_epc_unmap_addr(struct pci_epc *epc, u8 func_no,
|
||||
void pci_epc_unmap_addr(struct pci_epc *epc, u8 func_no, u8 vfunc_no,
|
||||
phys_addr_t phys_addr);
|
||||
int pci_epc_set_msi(struct pci_epc *epc, u8 func_no, u8 interrupts);
|
||||
int pci_epc_get_msi(struct pci_epc *epc, u8 func_no);
|
||||
int pci_epc_set_msix(struct pci_epc *epc, u8 func_no, u16 interrupts,
|
||||
enum pci_barno, u32 offset);
|
||||
int pci_epc_get_msix(struct pci_epc *epc, u8 func_no);
|
||||
int pci_epc_map_msi_irq(struct pci_epc *epc, u8 func_no,
|
||||
int pci_epc_set_msi(struct pci_epc *epc, u8 func_no, u8 vfunc_no,
|
||||
u8 interrupts);
|
||||
int pci_epc_get_msi(struct pci_epc *epc, u8 func_no, u8 vfunc_no);
|
||||
int pci_epc_set_msix(struct pci_epc *epc, u8 func_no, u8 vfunc_no,
|
||||
u16 interrupts, enum pci_barno, u32 offset);
|
||||
int pci_epc_get_msix(struct pci_epc *epc, u8 func_no, u8 vfunc_no);
|
||||
int pci_epc_map_msi_irq(struct pci_epc *epc, u8 func_no, u8 vfunc_no,
|
||||
phys_addr_t phys_addr, u8 interrupt_num,
|
||||
u32 entry_size, u32 *msi_data, u32 *msi_addr_offset);
|
||||
int pci_epc_raise_irq(struct pci_epc *epc, u8 func_no,
|
||||
int pci_epc_raise_irq(struct pci_epc *epc, u8 func_no, u8 vfunc_no,
|
||||
enum pci_epc_irq_type type, u16 interrupt_num);
|
||||
int pci_epc_start(struct pci_epc *epc);
|
||||
void pci_epc_stop(struct pci_epc *epc);
|
||||
const struct pci_epc_features *pci_epc_get_features(struct pci_epc *epc,
|
||||
u8 func_no);
|
||||
u8 func_no, u8 vfunc_no);
|
||||
enum pci_barno
|
||||
pci_epc_get_first_free_bar(const struct pci_epc_features *epc_features);
|
||||
enum pci_barno pci_epc_get_next_free_bar(const struct pci_epc_features
|
||||
|
|
|
|||
|
|
@ -121,8 +121,10 @@ struct pci_epf_bar {
|
|||
* @bar: represents the BAR of EPF device
|
||||
* @msi_interrupts: number of MSI interrupts required by this function
|
||||
* @msix_interrupts: number of MSI-X interrupts required by this function
|
||||
* @func_no: unique function number within this endpoint device
|
||||
* @func_no: unique (physical) function number within this endpoint device
|
||||
* @vfunc_no: unique virtual function number within a physical function
|
||||
* @epc: the EPC device to which this EPF device is bound
|
||||
* @epf_pf: the physical EPF device to which this virtual EPF device is bound
|
||||
* @driver: the EPF driver to which this EPF device is bound
|
||||
* @list: to add pci_epf as a list of PCI endpoint functions to pci_epc
|
||||
* @nb: notifier block to notify EPF of any EPC events (like linkup)
|
||||
|
|
@ -133,6 +135,10 @@ struct pci_epf_bar {
|
|||
* @sec_epc_bar: represents the BAR of EPF device associated with secondary EPC
|
||||
* @sec_epc_func_no: unique (physical) function number within the secondary EPC
|
||||
* @group: configfs group associated with the EPF device
|
||||
* @is_bound: indicates if bind notification to function driver has been invoked
|
||||
* @is_vf: true - virtual function, false - physical function
|
||||
* @vfunction_num_map: bitmap to manage virtual function number
|
||||
* @pci_vepf: list of virtual endpoint functions associated with this function
|
||||
*/
|
||||
struct pci_epf {
|
||||
struct device dev;
|
||||
|
|
@ -142,8 +148,10 @@ struct pci_epf {
|
|||
u8 msi_interrupts;
|
||||
u16 msix_interrupts;
|
||||
u8 func_no;
|
||||
u8 vfunc_no;
|
||||
|
||||
struct pci_epc *epc;
|
||||
struct pci_epf *epf_pf;
|
||||
struct pci_epf_driver *driver;
|
||||
struct list_head list;
|
||||
struct notifier_block nb;
|
||||
|
|
@ -156,6 +164,10 @@ struct pci_epf {
|
|||
struct pci_epf_bar sec_epc_bar[6];
|
||||
u8 sec_epc_func_no;
|
||||
struct config_group *group;
|
||||
unsigned int is_bound;
|
||||
unsigned int is_vf;
|
||||
unsigned long vfunction_num_map;
|
||||
struct list_head pci_vepf;
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
@ -199,4 +211,6 @@ int pci_epf_bind(struct pci_epf *epf);
|
|||
void pci_epf_unbind(struct pci_epf *epf);
|
||||
struct config_group *pci_epf_type_add_cfs(struct pci_epf *epf,
|
||||
struct config_group *group);
|
||||
int pci_epf_add_vepf(struct pci_epf *epf_pf, struct pci_epf *epf_vf);
|
||||
void pci_epf_remove_vepf(struct pci_epf *epf_pf, struct pci_epf *epf_vf);
|
||||
#endif /* __LINUX_PCI_EPF_H */
|
||||
|
|
|
|||
|
|
@ -49,6 +49,12 @@
|
|||
PCI_STATUS_SIG_TARGET_ABORT | \
|
||||
PCI_STATUS_PARITY)
|
||||
|
||||
/* Number of reset methods used in pci_reset_fn_methods array in pci.c */
|
||||
#define PCI_NUM_RESET_METHODS 7
|
||||
|
||||
#define PCI_RESET_PROBE true
|
||||
#define PCI_RESET_DO_RESET false
|
||||
|
||||
/*
|
||||
* The PCI interface treats multi-function devices as independent
|
||||
* devices. The slot/function address of each device is encoded
|
||||
|
|
@ -288,21 +294,14 @@ enum pci_bus_speed {
|
|||
enum pci_bus_speed pcie_get_speed_cap(struct pci_dev *dev);
|
||||
enum pcie_link_width pcie_get_width_cap(struct pci_dev *dev);
|
||||
|
||||
struct pci_cap_saved_data {
|
||||
u16 cap_nr;
|
||||
bool cap_extended;
|
||||
unsigned int size;
|
||||
u32 data[];
|
||||
};
|
||||
|
||||
struct pci_cap_saved_state {
|
||||
struct hlist_node next;
|
||||
struct pci_cap_saved_data cap;
|
||||
struct pci_vpd {
|
||||
struct mutex lock;
|
||||
unsigned int len;
|
||||
u8 cap;
|
||||
};
|
||||
|
||||
struct irq_affinity;
|
||||
struct pcie_link_state;
|
||||
struct pci_vpd;
|
||||
struct pci_sriov;
|
||||
struct pci_p2pdma;
|
||||
struct rcec_ea;
|
||||
|
|
@ -333,6 +332,7 @@ struct pci_dev {
|
|||
struct rcec_ea *rcec_ea; /* RCEC cached endpoint association */
|
||||
struct pci_dev *rcec; /* Associated RCEC device */
|
||||
#endif
|
||||
u32 devcap; /* PCIe Device Capabilities */
|
||||
u8 pcie_cap; /* PCIe capability offset */
|
||||
u8 msi_cap; /* MSI capability offset */
|
||||
u8 msix_cap; /* MSI-X capability offset */
|
||||
|
|
@ -388,6 +388,7 @@ struct pci_dev {
|
|||
supported from root to here */
|
||||
u16 l1ss; /* L1SS Capability pointer */
|
||||
#endif
|
||||
unsigned int pasid_no_tlp:1; /* PASID works without TLP Prefix */
|
||||
unsigned int eetlp_prefix_path:1; /* End-to-End TLP Prefix */
|
||||
|
||||
pci_channel_state_t error_state; /* Current connectivity state */
|
||||
|
|
@ -427,7 +428,6 @@ struct pci_dev {
|
|||
unsigned int state_saved:1;
|
||||
unsigned int is_physfn:1;
|
||||
unsigned int is_virtfn:1;
|
||||
unsigned int reset_fn:1;
|
||||
unsigned int is_hotplug_bridge:1;
|
||||
unsigned int shpc_managed:1; /* SHPC owned by shpchp */
|
||||
unsigned int is_thunderbolt:1; /* Thunderbolt controller */
|
||||
|
|
@ -473,7 +473,7 @@ struct pci_dev {
|
|||
#ifdef CONFIG_PCI_MSI
|
||||
const struct attribute_group **msi_irq_groups;
|
||||
#endif
|
||||
struct pci_vpd *vpd;
|
||||
struct pci_vpd vpd;
|
||||
#ifdef CONFIG_PCIE_DPC
|
||||
u16 dpc_cap;
|
||||
unsigned int dpc_rp_extensions:1;
|
||||
|
|
@ -505,6 +505,9 @@ struct pci_dev {
|
|||
char *driver_override; /* Driver name to force a match */
|
||||
|
||||
unsigned long priv_flags; /* Private flags for the PCI driver */
|
||||
|
||||
/* These methods index pci_reset_fn_methods[] */
|
||||
u8 reset_methods[PCI_NUM_RESET_METHODS]; /* In priority order */
|
||||
};
|
||||
|
||||
static inline struct pci_dev *pci_physfn(struct pci_dev *dev)
|
||||
|
|
@ -526,6 +529,16 @@ static inline int pci_channel_offline(struct pci_dev *pdev)
|
|||
return (pdev->error_state != pci_channel_io_normal);
|
||||
}
|
||||
|
||||
/*
|
||||
* Currently in ACPI spec, for each PCI host bridge, PCI Segment
|
||||
* Group number is limited to a 16-bit value, therefore (int)-1 is
|
||||
* not a valid PCI domain number, and can be used as a sentinel
|
||||
* value indicating ->domain_nr is not set by the driver (and
|
||||
* CONFIG_PCI_DOMAINS_GENERIC=y archs will set it with
|
||||
* pci_bus_find_domain_nr()).
|
||||
*/
|
||||
#define PCI_DOMAIN_NR_NOT_SET (-1)
|
||||
|
||||
struct pci_host_bridge {
|
||||
struct device dev;
|
||||
struct pci_bus *bus; /* Root bus */
|
||||
|
|
@ -533,6 +546,7 @@ struct pci_host_bridge {
|
|||
struct pci_ops *child_ops;
|
||||
void *sysdata;
|
||||
int busnr;
|
||||
int domain_nr;
|
||||
struct list_head windows; /* resource_entry */
|
||||
struct list_head dma_ranges; /* dma ranges resource list */
|
||||
u8 (*swizzle_irq)(struct pci_dev *, u8 *); /* Platform IRQ swizzler */
|
||||
|
|
@ -1257,7 +1271,7 @@ u32 pcie_bandwidth_available(struct pci_dev *dev, struct pci_dev **limiting_dev,
|
|||
enum pci_bus_speed *speed,
|
||||
enum pcie_link_width *width);
|
||||
void pcie_print_link_status(struct pci_dev *dev);
|
||||
bool pcie_has_flr(struct pci_dev *dev);
|
||||
int pcie_reset_flr(struct pci_dev *dev, bool probe);
|
||||
int pcie_flr(struct pci_dev *dev);
|
||||
int __pci_reset_function_locked(struct pci_dev *dev);
|
||||
int pci_reset_function(struct pci_dev *dev);
|
||||
|
|
@ -1307,12 +1321,6 @@ int pci_load_saved_state(struct pci_dev *dev,
|
|||
struct pci_saved_state *state);
|
||||
int pci_load_and_free_saved_state(struct pci_dev *dev,
|
||||
struct pci_saved_state **state);
|
||||
struct pci_cap_saved_state *pci_find_saved_cap(struct pci_dev *dev, char cap);
|
||||
struct pci_cap_saved_state *pci_find_saved_ext_cap(struct pci_dev *dev,
|
||||
u16 cap);
|
||||
int pci_add_cap_save_buffer(struct pci_dev *dev, char cap, unsigned int size);
|
||||
int pci_add_ext_cap_save_buffer(struct pci_dev *dev,
|
||||
u16 cap, unsigned int size);
|
||||
int pci_platform_power_transition(struct pci_dev *dev, pci_power_t state);
|
||||
int pci_set_power_state(struct pci_dev *dev, pci_power_t state);
|
||||
pci_power_t pci_choose_state(struct pci_dev *dev, pm_message_t state);
|
||||
|
|
@ -1779,8 +1787,9 @@ static inline void pci_disable_device(struct pci_dev *dev) { }
|
|||
static inline int pcim_enable_device(struct pci_dev *pdev) { return -EIO; }
|
||||
static inline int pci_assign_resource(struct pci_dev *dev, int i)
|
||||
{ return -EBUSY; }
|
||||
static inline int __pci_register_driver(struct pci_driver *drv,
|
||||
struct module *owner)
|
||||
static inline int __must_check __pci_register_driver(struct pci_driver *drv,
|
||||
struct module *owner,
|
||||
const char *mod_name)
|
||||
{ return 0; }
|
||||
static inline int pci_register_driver(struct pci_driver *drv)
|
||||
{ return 0; }
|
||||
|
|
@ -1920,9 +1929,7 @@ int pci_iobar_pfn(struct pci_dev *pdev, int bar, struct vm_area_struct *vma);
|
|||
#define pci_resource_end(dev, bar) ((dev)->resource[(bar)].end)
|
||||
#define pci_resource_flags(dev, bar) ((dev)->resource[(bar)].flags)
|
||||
#define pci_resource_len(dev,bar) \
|
||||
((pci_resource_start((dev), (bar)) == 0 && \
|
||||
pci_resource_end((dev), (bar)) == \
|
||||
pci_resource_start((dev), (bar))) ? 0 : \
|
||||
((pci_resource_end((dev), (bar)) == 0) ? 0 : \
|
||||
\
|
||||
(pci_resource_end((dev), (bar)) - \
|
||||
pci_resource_start((dev), (bar)) + 1))
|
||||
|
|
@ -2289,20 +2296,6 @@ int pci_enable_atomic_ops_to_root(struct pci_dev *dev, u32 cap_mask);
|
|||
#define PCI_VPD_LRDT_RO_DATA PCI_VPD_LRDT_ID(PCI_VPD_LTIN_RO_DATA)
|
||||
#define PCI_VPD_LRDT_RW_DATA PCI_VPD_LRDT_ID(PCI_VPD_LTIN_RW_DATA)
|
||||
|
||||
/* Small Resource Data Type Tag Item Names */
|
||||
#define PCI_VPD_STIN_END 0x0f /* End */
|
||||
|
||||
#define PCI_VPD_SRDT_END (PCI_VPD_STIN_END << 3)
|
||||
|
||||
#define PCI_VPD_SRDT_TIN_MASK 0x78
|
||||
#define PCI_VPD_SRDT_LEN_MASK 0x07
|
||||
#define PCI_VPD_LRDT_TIN_MASK 0x7f
|
||||
|
||||
#define PCI_VPD_LRDT_TAG_SIZE 3
|
||||
#define PCI_VPD_SRDT_TAG_SIZE 1
|
||||
|
||||
#define PCI_VPD_INFO_FLD_HDR_SIZE 3
|
||||
|
||||
#define PCI_VPD_RO_KEYWORD_PARTNO "PN"
|
||||
#define PCI_VPD_RO_KEYWORD_SERIALNO "SN"
|
||||
#define PCI_VPD_RO_KEYWORD_MFR_ID "MN"
|
||||
|
|
@ -2310,83 +2303,45 @@ int pci_enable_atomic_ops_to_root(struct pci_dev *dev, u32 cap_mask);
|
|||
#define PCI_VPD_RO_KEYWORD_CHKSUM "RV"
|
||||
|
||||
/**
|
||||
* pci_vpd_lrdt_size - Extracts the Large Resource Data Type length
|
||||
* @lrdt: Pointer to the beginning of the Large Resource Data Type tag
|
||||
* pci_vpd_alloc - Allocate buffer and read VPD into it
|
||||
* @dev: PCI device
|
||||
* @size: pointer to field where VPD length is returned
|
||||
*
|
||||
* Returns the extracted Large Resource Data Type length.
|
||||
* Returns pointer to allocated buffer or an ERR_PTR in case of failure
|
||||
*/
|
||||
static inline u16 pci_vpd_lrdt_size(const u8 *lrdt)
|
||||
{
|
||||
return (u16)lrdt[1] + ((u16)lrdt[2] << 8);
|
||||
}
|
||||
void *pci_vpd_alloc(struct pci_dev *dev, unsigned int *size);
|
||||
|
||||
/**
|
||||
* pci_vpd_lrdt_tag - Extracts the Large Resource Data Type Tag Item
|
||||
* @lrdt: Pointer to the beginning of the Large Resource Data Type tag
|
||||
* pci_vpd_find_id_string - Locate id string in VPD
|
||||
* @buf: Pointer to buffered VPD data
|
||||
* @len: The length of the buffer area in which to search
|
||||
* @size: Pointer to field where length of id string is returned
|
||||
*
|
||||
* Returns the extracted Large Resource Data Type Tag item.
|
||||
* Returns the index of the id string or -ENOENT if not found.
|
||||
*/
|
||||
static inline u16 pci_vpd_lrdt_tag(const u8 *lrdt)
|
||||
{
|
||||
return (u16)(lrdt[0] & PCI_VPD_LRDT_TIN_MASK);
|
||||
}
|
||||
int pci_vpd_find_id_string(const u8 *buf, unsigned int len, unsigned int *size);
|
||||
|
||||
/**
|
||||
* pci_vpd_srdt_size - Extracts the Small Resource Data Type length
|
||||
* @srdt: Pointer to the beginning of the Small Resource Data Type tag
|
||||
*
|
||||
* Returns the extracted Small Resource Data Type length.
|
||||
*/
|
||||
static inline u8 pci_vpd_srdt_size(const u8 *srdt)
|
||||
{
|
||||
return (*srdt) & PCI_VPD_SRDT_LEN_MASK;
|
||||
}
|
||||
|
||||
/**
|
||||
* pci_vpd_srdt_tag - Extracts the Small Resource Data Type Tag Item
|
||||
* @srdt: Pointer to the beginning of the Small Resource Data Type tag
|
||||
*
|
||||
* Returns the extracted Small Resource Data Type Tag Item.
|
||||
*/
|
||||
static inline u8 pci_vpd_srdt_tag(const u8 *srdt)
|
||||
{
|
||||
return ((*srdt) & PCI_VPD_SRDT_TIN_MASK) >> 3;
|
||||
}
|
||||
|
||||
/**
|
||||
* pci_vpd_info_field_size - Extracts the information field length
|
||||
* @info_field: Pointer to the beginning of an information field header
|
||||
*
|
||||
* Returns the extracted information field length.
|
||||
*/
|
||||
static inline u8 pci_vpd_info_field_size(const u8 *info_field)
|
||||
{
|
||||
return info_field[2];
|
||||
}
|
||||
|
||||
/**
|
||||
* pci_vpd_find_tag - Locates the Resource Data Type tag provided
|
||||
* @buf: Pointer to buffered vpd data
|
||||
* @len: The length of the vpd buffer
|
||||
* @rdt: The Resource Data Type to search for
|
||||
*
|
||||
* Returns the index where the Resource Data Type was found or
|
||||
* -ENOENT otherwise.
|
||||
*/
|
||||
int pci_vpd_find_tag(const u8 *buf, unsigned int len, u8 rdt);
|
||||
|
||||
/**
|
||||
* pci_vpd_find_info_keyword - Locates an information field keyword in the VPD
|
||||
* @buf: Pointer to buffered vpd data
|
||||
* @off: The offset into the buffer at which to begin the search
|
||||
* @len: The length of the buffer area, relative to off, in which to search
|
||||
* pci_vpd_find_ro_info_keyword - Locate info field keyword in VPD RO section
|
||||
* @buf: Pointer to buffered VPD data
|
||||
* @len: The length of the buffer area in which to search
|
||||
* @kw: The keyword to search for
|
||||
* @size: Pointer to field where length of found keyword data is returned
|
||||
*
|
||||
* Returns the index where the information field keyword was found or
|
||||
* -ENOENT otherwise.
|
||||
* Returns the index of the information field keyword data or -ENOENT if
|
||||
* not found.
|
||||
*/
|
||||
int pci_vpd_find_info_keyword(const u8 *buf, unsigned int off,
|
||||
unsigned int len, const char *kw);
|
||||
int pci_vpd_find_ro_info_keyword(const void *buf, unsigned int len,
|
||||
const char *kw, unsigned int *size);
|
||||
|
||||
/**
|
||||
* pci_vpd_check_csum - Check VPD checksum
|
||||
* @buf: Pointer to buffered VPD data
|
||||
* @len: VPD size
|
||||
*
|
||||
* Returns 1 if VPD has no checksum, otherwise 0 or an errno
|
||||
*/
|
||||
int pci_vpd_check_csum(const void *buf, unsigned int len);
|
||||
|
||||
/* PCI <-> OF binding helpers */
|
||||
#ifdef CONFIG_OF
|
||||
|
|
|
|||
|
|
@ -44,7 +44,7 @@ struct hotplug_slot_ops {
|
|||
int (*get_attention_status) (struct hotplug_slot *slot, u8 *value);
|
||||
int (*get_latch_status) (struct hotplug_slot *slot, u8 *value);
|
||||
int (*get_adapter_status) (struct hotplug_slot *slot, u8 *value);
|
||||
int (*reset_slot) (struct hotplug_slot *slot, int probe);
|
||||
int (*reset_slot) (struct hotplug_slot *slot, bool probe);
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -2453,7 +2453,8 @@
|
|||
#define PCI_VENDOR_ID_TDI 0x192E
|
||||
#define PCI_DEVICE_ID_TDI_EHCI 0x0101
|
||||
|
||||
#define PCI_VENDOR_ID_FREESCALE 0x1957
|
||||
#define PCI_VENDOR_ID_FREESCALE 0x1957 /* duplicate: NXP */
|
||||
#define PCI_VENDOR_ID_NXP 0x1957 /* duplicate: FREESCALE */
|
||||
#define PCI_DEVICE_ID_MPC8308 0xc006
|
||||
#define PCI_DEVICE_ID_MPC8315E 0x00b4
|
||||
#define PCI_DEVICE_ID_MPC8315 0x00b5
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue