[PATCH 1/3] pci: New PCI-E reset API
Brian King
brking at linux.vnet.ibm.com
Fri Mar 9 07:44:26 EST 2007
Greg,
I saw you pulled this into your gregkh-2.6 tree. Does that mean
it is queued for 2.6.22?
Thanks,
Brian
Brian King wrote:
> Adds a new API which can be used to issue various types
> of PCI-E reset, including PCI-E warm reset and PCI-E hot reset.
> This is needed for an ipr PCI-E adapter which does not properly
> implement BIST. Running BIST on this adapter results in PCI-E
> errors. The only reliable reset mechanism that exists on this
> hardware is PCI Fundamental reset (warm reset). Since driving
> this type of reset is architecture unique, this provides the
> necessary hooks for architectures to add this support.
>
> Signed-off-by: Brian King <brking at linux.vnet.ibm.com>
> ---
>
> linux-2.6-bjking1/drivers/pci/pci.c | 29 +++++++++++++++++++++++++++++
> linux-2.6-bjking1/include/linux/pci.h | 14 ++++++++++++++
> 2 files changed, 43 insertions(+)
>
> diff -puN drivers/pci/pci.c~pci_pci_reset_api drivers/pci/pci.c
> --- linux-2.6/drivers/pci/pci.c~pci_pci_reset_api 2007-02-16 10:10:30.000000000 -0600
> +++ linux-2.6-bjking1/drivers/pci/pci.c 2007-02-16 10:10:30.000000000 -0600
> @@ -893,6 +893,34 @@ pci_disable_device(struct pci_dev *dev)
> }
>
> /**
> + * pcibios_set_pcie_reset_state - set reset state for device dev
> + * @dev: the PCI-E device reset
> + * @state: Reset state to enter into
> + *
> + *
> + * Sets the PCI-E reset state for the device. This is the default
> + * implementation. Architecture implementations can override this.
> + */
> +int __attribute__ ((weak)) pcibios_set_pcie_reset_state(struct pci_dev *dev,
> + enum pcie_reset_state state)
> +{
> + return -EINVAL;
> +}
> +
> +/**
> + * pci_set_pcie_reset_state - set reset state for device dev
> + * @dev: the PCI-E device reset
> + * @state: Reset state to enter into
> + *
> + *
> + * Sets the PCI reset state for the device.
> + */
> +int pci_set_pcie_reset_state(struct pci_dev *dev, enum pcie_reset_state state)
> +{
> + return pcibios_set_pcie_reset_state(dev, state);
> +}
> +
> +/**
> * pci_enable_wake - enable device to generate PME# when suspended
> * @dev: - PCI device to operate on
> * @state: - Current state of device.
> @@ -1374,4 +1402,5 @@ EXPORT_SYMBOL(pci_set_power_state);
> EXPORT_SYMBOL(pci_save_state);
> EXPORT_SYMBOL(pci_restore_state);
> EXPORT_SYMBOL(pci_enable_wake);
> +EXPORT_SYMBOL_GPL(pci_set_pcie_reset_state);
>
> diff -puN include/linux/pci.h~pci_pci_reset_api include/linux/pci.h
> --- linux-2.6/include/linux/pci.h~pci_pci_reset_api 2007-02-16 10:10:30.000000000 -0600
> +++ linux-2.6-bjking1/include/linux/pci.h 2007-02-16 10:10:30.000000000 -0600
> @@ -96,6 +96,19 @@ enum pci_channel_state {
> pci_channel_io_perm_failure = (__force pci_channel_state_t) 3,
> };
>
> +typedef unsigned int __bitwise pcie_reset_state_t;
> +
> +enum pcie_reset_state {
> + /* Reset is NOT asserted (Use to deassert reset) */
> + pci_reset_normal = (__force pcie_reset_state_t) 1,
> +
> + /* Use #PERST to reset PCI-E device */
> + pci_reset_pcie_warm_reset = (__force pcie_reset_state_t) 2,
> +
> + /* Use PCI-E Hot Reset to reset device */
> + pci_reset_pcie_hot_reset = (__force pcie_reset_state_t) 3
> +};
> +
> typedef unsigned short __bitwise pci_bus_flags_t;
> enum pci_bus_flags {
> PCI_BUS_FLAGS_NO_MSI = (__force pci_bus_flags_t) 1,
> @@ -539,6 +552,7 @@ static inline int pci_is_managed(struct
>
> void pci_disable_device(struct pci_dev *dev);
> void pci_set_master(struct pci_dev *dev);
> +int pci_set_pcie_reset_state(struct pci_dev *dev, enum pcie_reset_state state);
> #define HAVE_PCI_SET_MWI
> int __must_check pci_set_mwi(struct pci_dev *dev);
> void pci_clear_mwi(struct pci_dev *dev);
> _
--
Brian King
eServer Storage I/O
IBM Linux Technology Center
More information about the Linuxppc-dev
mailing list