diff mbox

[v3,5/8] PCI hotplug: pciehp: use generic pci_configure_slot()

Message ID 20090902225025.12417.16090.stgit@bob.kio (mailing list archive)
State Superseded, archived
Headers show

Commit Message

Bjorn Helgaas Sept. 2, 2009, 10:50 p.m. UTC
Use the generic pci_configure_slot() rather than the PCIe-specific
program_fw_provided_values().

Unlike the previous pciehp-specific code, we now walk through subordinate
devices even if there are no settings for the parent.  This should be
harmless because we won't change anything unless we discover firmware
settings farther down.

Signed-off-by: Bjorn Helgaas <bjorn.helgaas@hp.com>
---
 drivers/pci/hotplug/pciehp.h     |    7 --
 drivers/pci/hotplug/pciehp_pci.c |  132 --------------------------------------
 2 files changed, 1 insertions(+), 138 deletions(-)


--
To unsubscribe from this list: send the line "unsubscribe linux-pci" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Comments

Kenji Kaneshige Sept. 3, 2009, 12:56 a.m. UTC | #1
Reviewed-by: Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com>
Acked-by: Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com>


Bjorn Helgaas wrote:
> Use the generic pci_configure_slot() rather than the PCIe-specific
> program_fw_provided_values().
> 
> Unlike the previous pciehp-specific code, we now walk through subordinate
> devices even if there are no settings for the parent.  This should be
> harmless because we won't change anything unless we discover firmware
> settings farther down.
> 
> Signed-off-by: Bjorn Helgaas <bjorn.helgaas@hp.com>
> ---
>  drivers/pci/hotplug/pciehp.h     |    7 --
>  drivers/pci/hotplug/pciehp_pci.c |  132 --------------------------------------
>  2 files changed, 1 insertions(+), 138 deletions(-)
> 
> diff --git a/drivers/pci/hotplug/pciehp.h b/drivers/pci/hotplug/pciehp.h
> index 86cdfd7..36faa9a 100644
> --- a/drivers/pci/hotplug/pciehp.h
> +++ b/drivers/pci/hotplug/pciehp.h
> @@ -237,15 +237,8 @@ static inline int pciehp_get_hp_hw_control_from_firmware(struct pci_dev *dev)
>  		return retval;
>  	return pciehp_acpi_slot_detection_check(dev);
>  }
> -
> -static inline int pciehp_get_hp_params_from_firmware(struct pci_dev *dev,
> -			struct hotplug_params *hpp)
> -{
> -	return acpi_get_hp_params_from_firmware(dev, hpp);
> -}
>  #else
>  #define pciehp_firmware_init()				do {} while (0)
>  #define pciehp_get_hp_hw_control_from_firmware(dev) 	0
> -#define pciehp_get_hp_params_from_firmware(dev, hpp)    (-ENODEV)
>  #endif 				/* CONFIG_ACPI */
>  #endif				/* _PCIEHP_H */
> diff --git a/drivers/pci/hotplug/pciehp_pci.c b/drivers/pci/hotplug/pciehp_pci.c
> index 10f9566..23c5aeb 100644
> --- a/drivers/pci/hotplug/pciehp_pci.c
> +++ b/drivers/pci/hotplug/pciehp_pci.c
> @@ -34,136 +34,6 @@
>  #include "../pci.h"
>  #include "pciehp.h"
>  
> -static void program_hpp_type0(struct pci_dev *dev, struct hpp_type0 *hpp)
> -{
> -	u16 pci_cmd, pci_bctl;
> -
> -	if (hpp->revision > 1) {
> -		warn("Rev.%d type0 record not supported\n", hpp->revision);
> -		return;
> -	}
> -
> -	pci_write_config_byte(dev, PCI_CACHE_LINE_SIZE, hpp->cache_line_size);
> -	pci_write_config_byte(dev, PCI_LATENCY_TIMER, hpp->latency_timer);
> -	pci_read_config_word(dev, PCI_COMMAND, &pci_cmd);
> -	if (hpp->enable_serr)
> -		pci_cmd |= PCI_COMMAND_SERR;
> -	else
> -		pci_cmd &= ~PCI_COMMAND_SERR;
> -	if (hpp->enable_perr)
> -		pci_cmd |= PCI_COMMAND_PARITY;
> -	else
> -		pci_cmd &= ~PCI_COMMAND_PARITY;
> -	pci_write_config_word(dev, PCI_COMMAND, pci_cmd);
> -
> -	/* Program bridge control value */
> -	if ((dev->class >> 8) == PCI_CLASS_BRIDGE_PCI) {
> -		pci_write_config_byte(dev, PCI_SEC_LATENCY_TIMER,
> -				      hpp->latency_timer);
> -		pci_read_config_word(dev, PCI_BRIDGE_CONTROL, &pci_bctl);
> -		if (hpp->enable_serr)
> -			pci_bctl |= PCI_BRIDGE_CTL_SERR;
> -		else
> -			pci_bctl &= ~PCI_BRIDGE_CTL_SERR;
> -		if (hpp->enable_perr)
> -			pci_bctl |= PCI_BRIDGE_CTL_PARITY;
> -		else
> -			pci_bctl &= ~PCI_BRIDGE_CTL_PARITY;
> -		pci_write_config_word(dev, PCI_BRIDGE_CONTROL, pci_bctl);
> -	}
> -}
> -
> -static void program_hpp_type2(struct pci_dev *dev, struct hpp_type2 *hpp)
> -{
> -	int pos;
> -	u16 reg16;
> -	u32 reg32;
> -
> -	if (hpp->revision > 1) {
> -		warn("Rev.%d type2 record not supported\n", hpp->revision);
> -		return;
> -	}
> -
> -	/* Find PCI Express capability */
> -	pos = pci_find_capability(dev, PCI_CAP_ID_EXP);
> -	if (!pos)
> -		return;
> -
> -	/* Initialize Device Control Register */
> -	pci_read_config_word(dev, pos + PCI_EXP_DEVCTL, &reg16);
> -	reg16 = (reg16 & hpp->pci_exp_devctl_and) | hpp->pci_exp_devctl_or;
> -	pci_write_config_word(dev, pos + PCI_EXP_DEVCTL, reg16);
> -
> -	/* Initialize Link Control Register */
> -	if (dev->subordinate) {
> -		pci_read_config_word(dev, pos + PCI_EXP_LNKCTL, &reg16);
> -		reg16 = (reg16 & hpp->pci_exp_lnkctl_and)
> -			| hpp->pci_exp_lnkctl_or;
> -		pci_write_config_word(dev, pos + PCI_EXP_LNKCTL, reg16);
> -	}
> -
> -	/* Find Advanced Error Reporting Enhanced Capability */
> -	pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ERR);
> -	if (!pos)
> -		return;
> -
> -	/* Initialize Uncorrectable Error Mask Register */
> -	pci_read_config_dword(dev, pos + PCI_ERR_UNCOR_MASK, &reg32);
> -	reg32 = (reg32 & hpp->unc_err_mask_and) | hpp->unc_err_mask_or;
> -	pci_write_config_dword(dev, pos + PCI_ERR_UNCOR_MASK, reg32);
> -
> -	/* Initialize Uncorrectable Error Severity Register */
> -	pci_read_config_dword(dev, pos + PCI_ERR_UNCOR_SEVER, &reg32);
> -	reg32 = (reg32 & hpp->unc_err_sever_and) | hpp->unc_err_sever_or;
> -	pci_write_config_dword(dev, pos + PCI_ERR_UNCOR_SEVER, reg32);
> -
> -	/* Initialize Correctable Error Mask Register */
> -	pci_read_config_dword(dev, pos + PCI_ERR_COR_MASK, &reg32);
> -	reg32 = (reg32 & hpp->cor_err_mask_and) | hpp->cor_err_mask_or;
> -	pci_write_config_dword(dev, pos + PCI_ERR_COR_MASK, reg32);
> -
> -	/* Initialize Advanced Error Capabilities and Control Register */
> -	pci_read_config_dword(dev, pos + PCI_ERR_CAP, &reg32);
> -	reg32 = (reg32 & hpp->adv_err_cap_and) | hpp->adv_err_cap_or;
> -	pci_write_config_dword(dev, pos + PCI_ERR_CAP, reg32);
> -
> -	/*
> -	 * FIXME: The following two registers are not supported yet.
> -	 *
> -	 *   o Secondary Uncorrectable Error Severity Register
> -	 *   o Secondary Uncorrectable Error Mask Register
> -	 */
> -}
> -
> -static void program_fw_provided_values(struct pci_dev *dev)
> -{
> -	struct pci_dev *cdev;
> -	struct hotplug_params hpp;
> -
> -	/* Program hpp values for this device */
> -	if (!(dev->hdr_type == PCI_HEADER_TYPE_NORMAL ||
> -			(dev->hdr_type == PCI_HEADER_TYPE_BRIDGE &&
> -			(dev->class >> 8) == PCI_CLASS_BRIDGE_PCI)))
> -		return;
> -
> -	if (pciehp_get_hp_params_from_firmware(dev, &hpp)) {
> -		warn("Could not get hotplug parameters\n");
> -		return;
> -	}
> -
> -	if (hpp.t2)
> -		program_hpp_type2(dev, hpp.t2);
> -	if (hpp.t0)
> -		program_hpp_type0(dev, hpp.t0);
> -
> -	/* Program child devices */
> -	if (dev->subordinate) {
> -		list_for_each_entry(cdev, &dev->subordinate->devices,
> -				    bus_list)
> -			program_fw_provided_values(cdev);
> -	}
> -}
> -
>  static int __ref pciehp_add_bridge(struct pci_dev *dev)
>  {
>  	struct pci_bus *parent = dev->bus;
> @@ -226,7 +96,7 @@ int pciehp_configure_device(struct slot *p_slot)
>  				(dev->hdr_type == PCI_HEADER_TYPE_CARDBUS)) {
>  			pciehp_add_bridge(dev);
>  		}
> -		program_fw_provided_values(dev);
> +		pci_configure_slot(dev);
>  		pci_dev_put(dev);
>  	}
>  
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-pci" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 
> 


--
To unsubscribe from this list: send the line "unsubscribe linux-pci" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/drivers/pci/hotplug/pciehp.h b/drivers/pci/hotplug/pciehp.h
index 86cdfd7..36faa9a 100644
--- a/drivers/pci/hotplug/pciehp.h
+++ b/drivers/pci/hotplug/pciehp.h
@@ -237,15 +237,8 @@  static inline int pciehp_get_hp_hw_control_from_firmware(struct pci_dev *dev)
 		return retval;
 	return pciehp_acpi_slot_detection_check(dev);
 }
-
-static inline int pciehp_get_hp_params_from_firmware(struct pci_dev *dev,
-			struct hotplug_params *hpp)
-{
-	return acpi_get_hp_params_from_firmware(dev, hpp);
-}
 #else
 #define pciehp_firmware_init()				do {} while (0)
 #define pciehp_get_hp_hw_control_from_firmware(dev) 	0
-#define pciehp_get_hp_params_from_firmware(dev, hpp)    (-ENODEV)
 #endif 				/* CONFIG_ACPI */
 #endif				/* _PCIEHP_H */
diff --git a/drivers/pci/hotplug/pciehp_pci.c b/drivers/pci/hotplug/pciehp_pci.c
index 10f9566..23c5aeb 100644
--- a/drivers/pci/hotplug/pciehp_pci.c
+++ b/drivers/pci/hotplug/pciehp_pci.c
@@ -34,136 +34,6 @@ 
 #include "../pci.h"
 #include "pciehp.h"
 
-static void program_hpp_type0(struct pci_dev *dev, struct hpp_type0 *hpp)
-{
-	u16 pci_cmd, pci_bctl;
-
-	if (hpp->revision > 1) {
-		warn("Rev.%d type0 record not supported\n", hpp->revision);
-		return;
-	}
-
-	pci_write_config_byte(dev, PCI_CACHE_LINE_SIZE, hpp->cache_line_size);
-	pci_write_config_byte(dev, PCI_LATENCY_TIMER, hpp->latency_timer);
-	pci_read_config_word(dev, PCI_COMMAND, &pci_cmd);
-	if (hpp->enable_serr)
-		pci_cmd |= PCI_COMMAND_SERR;
-	else
-		pci_cmd &= ~PCI_COMMAND_SERR;
-	if (hpp->enable_perr)
-		pci_cmd |= PCI_COMMAND_PARITY;
-	else
-		pci_cmd &= ~PCI_COMMAND_PARITY;
-	pci_write_config_word(dev, PCI_COMMAND, pci_cmd);
-
-	/* Program bridge control value */
-	if ((dev->class >> 8) == PCI_CLASS_BRIDGE_PCI) {
-		pci_write_config_byte(dev, PCI_SEC_LATENCY_TIMER,
-				      hpp->latency_timer);
-		pci_read_config_word(dev, PCI_BRIDGE_CONTROL, &pci_bctl);
-		if (hpp->enable_serr)
-			pci_bctl |= PCI_BRIDGE_CTL_SERR;
-		else
-			pci_bctl &= ~PCI_BRIDGE_CTL_SERR;
-		if (hpp->enable_perr)
-			pci_bctl |= PCI_BRIDGE_CTL_PARITY;
-		else
-			pci_bctl &= ~PCI_BRIDGE_CTL_PARITY;
-		pci_write_config_word(dev, PCI_BRIDGE_CONTROL, pci_bctl);
-	}
-}
-
-static void program_hpp_type2(struct pci_dev *dev, struct hpp_type2 *hpp)
-{
-	int pos;
-	u16 reg16;
-	u32 reg32;
-
-	if (hpp->revision > 1) {
-		warn("Rev.%d type2 record not supported\n", hpp->revision);
-		return;
-	}
-
-	/* Find PCI Express capability */
-	pos = pci_find_capability(dev, PCI_CAP_ID_EXP);
-	if (!pos)
-		return;
-
-	/* Initialize Device Control Register */
-	pci_read_config_word(dev, pos + PCI_EXP_DEVCTL, &reg16);
-	reg16 = (reg16 & hpp->pci_exp_devctl_and) | hpp->pci_exp_devctl_or;
-	pci_write_config_word(dev, pos + PCI_EXP_DEVCTL, reg16);
-
-	/* Initialize Link Control Register */
-	if (dev->subordinate) {
-		pci_read_config_word(dev, pos + PCI_EXP_LNKCTL, &reg16);
-		reg16 = (reg16 & hpp->pci_exp_lnkctl_and)
-			| hpp->pci_exp_lnkctl_or;
-		pci_write_config_word(dev, pos + PCI_EXP_LNKCTL, reg16);
-	}
-
-	/* Find Advanced Error Reporting Enhanced Capability */
-	pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ERR);
-	if (!pos)
-		return;
-
-	/* Initialize Uncorrectable Error Mask Register */
-	pci_read_config_dword(dev, pos + PCI_ERR_UNCOR_MASK, &reg32);
-	reg32 = (reg32 & hpp->unc_err_mask_and) | hpp->unc_err_mask_or;
-	pci_write_config_dword(dev, pos + PCI_ERR_UNCOR_MASK, reg32);
-
-	/* Initialize Uncorrectable Error Severity Register */
-	pci_read_config_dword(dev, pos + PCI_ERR_UNCOR_SEVER, &reg32);
-	reg32 = (reg32 & hpp->unc_err_sever_and) | hpp->unc_err_sever_or;
-	pci_write_config_dword(dev, pos + PCI_ERR_UNCOR_SEVER, reg32);
-
-	/* Initialize Correctable Error Mask Register */
-	pci_read_config_dword(dev, pos + PCI_ERR_COR_MASK, &reg32);
-	reg32 = (reg32 & hpp->cor_err_mask_and) | hpp->cor_err_mask_or;
-	pci_write_config_dword(dev, pos + PCI_ERR_COR_MASK, reg32);
-
-	/* Initialize Advanced Error Capabilities and Control Register */
-	pci_read_config_dword(dev, pos + PCI_ERR_CAP, &reg32);
-	reg32 = (reg32 & hpp->adv_err_cap_and) | hpp->adv_err_cap_or;
-	pci_write_config_dword(dev, pos + PCI_ERR_CAP, reg32);
-
-	/*
-	 * FIXME: The following two registers are not supported yet.
-	 *
-	 *   o Secondary Uncorrectable Error Severity Register
-	 *   o Secondary Uncorrectable Error Mask Register
-	 */
-}
-
-static void program_fw_provided_values(struct pci_dev *dev)
-{
-	struct pci_dev *cdev;
-	struct hotplug_params hpp;
-
-	/* Program hpp values for this device */
-	if (!(dev->hdr_type == PCI_HEADER_TYPE_NORMAL ||
-			(dev->hdr_type == PCI_HEADER_TYPE_BRIDGE &&
-			(dev->class >> 8) == PCI_CLASS_BRIDGE_PCI)))
-		return;
-
-	if (pciehp_get_hp_params_from_firmware(dev, &hpp)) {
-		warn("Could not get hotplug parameters\n");
-		return;
-	}
-
-	if (hpp.t2)
-		program_hpp_type2(dev, hpp.t2);
-	if (hpp.t0)
-		program_hpp_type0(dev, hpp.t0);
-
-	/* Program child devices */
-	if (dev->subordinate) {
-		list_for_each_entry(cdev, &dev->subordinate->devices,
-				    bus_list)
-			program_fw_provided_values(cdev);
-	}
-}
-
 static int __ref pciehp_add_bridge(struct pci_dev *dev)
 {
 	struct pci_bus *parent = dev->bus;
@@ -226,7 +96,7 @@  int pciehp_configure_device(struct slot *p_slot)
 				(dev->hdr_type == PCI_HEADER_TYPE_CARDBUS)) {
 			pciehp_add_bridge(dev);
 		}
-		program_fw_provided_values(dev);
+		pci_configure_slot(dev);
 		pci_dev_put(dev);
 	}