[Skiboot] [RFC PATCH 04/23] core/pci: Convert set_power_state

Frederic Barrat fbarrat at linux.ibm.com
Thu Aug 1 05:31:18 AEST 2019



Le 03/04/2019 à 11:09, Oliver O'Halloran a écrit :
> Signed-off-by: Oliver O'Halloran <oohall at gmail.com>
> ---
>   core/pci.c | 55 ++++++++++++++++--------------------------------------
>   1 file changed, 16 insertions(+), 39 deletions(-)
> 
> diff --git a/core/pci.c b/core/pci.c
> index a20268b18e1e..c1959197d06d 100644
> --- a/core/pci.c
> +++ b/core/pci.c
> @@ -365,7 +365,6 @@ static void pci_slot_set_power_state(struct phb *phb,
>   				     uint8_t state)
>   {
>   	struct pci_slot *slot;
> -	uint8_t cur_state;
>   	int32_t wait = 100;
>   	int64_t rc;
>   
> @@ -378,58 +377,36 @@ static void pci_slot_set_power_state(struct phb *phb,
>   	    !slot->ops.set_power_state)
>   		return;
>   
> -	if (state == PCI_SLOT_POWER_OFF) {
> -		/* Bail if there're something connected */
> -		if (!list_empty(&pd->children)) {
> -			PCIERR(phb, pd->bdfn, "Attempted to power off slot with attached devices!\n");
> -			return;
> -		}
> -
> -		pci_slot_add_flags(slot, PCI_SLOT_FLAG_BOOTUP);
> -		rc = slot->ops.get_power_state(slot, &cur_state);
> -		if (rc != OPAL_SUCCESS) {
> -			PCINOTICE(phb, pd->bdfn, "Error %lld getting slot power state\n", rc);
> -			cur_state = PCI_SLOT_POWER_OFF;
> -		}
> -
> -		pci_slot_remove_flags(slot, PCI_SLOT_FLAG_BOOTUP);
> -		if (cur_state == PCI_SLOT_POWER_OFF)
> -			return;
> +	if (state == PCI_SLOT_POWER_OFF && !list_empty(&pd->children)) {
> +		PCIERR(phb, pd->bdfn, "Attempted to power off slot with attached devices!\n");
> +		return;
>   	}
>   
>   	pci_slot_add_flags(slot,
>   		(PCI_SLOT_FLAG_BOOTUP | PCI_SLOT_FLAG_ENFORCE));
> -	rc = slot->ops.set_power_state(slot, state);
> -	if (rc == OPAL_SUCCESS)
> -		goto success;
> -	if (rc != OPAL_ASYNC_COMPLETION) {
> -		PCINOTICE(phb, pd->bdfn, "Error %lld powering %s slot\n",
> -			  rc, state == PCI_SLOT_POWER_ON ? "on" : "off");
> -		goto error;
> -	}
>   
>   	/* Wait until the operation is completed */
>   	do {
> -		if (slot->state == PCI_SLOT_STATE_SPOWER_DONE)
> +		rc = slot->ops.set_power_state(slot, state);
> +		if (rc <= 0)
>   			break;
> -
> +		time_wait(rc > 10 ? 10 : rc);


I think the intent is to use time_wait_ms()

   Fred


>   		check_timers(false);
> -		time_wait_ms(10);
> -	} while (--wait >= 0);
> +	} while (--wait);
>   
> -	if (wait < 0) {
> -		PCINOTICE(phb, pd->bdfn, "Timeout powering %s slot\n",
> -			  state == PCI_SLOT_POWER_ON ? "on" : "off");
> -		goto error;
> +	if (!wait && rc >= 0)
> +		rc = OPAL_TIMEOUT;
> +
> +	if (rc < 0) {
> +		PCIERR(phb, pd->bdfn, "Error %lld powering %s slot\n",
> +		       rc, state == PCI_SLOT_POWER_ON ? "on" : "off");
> +	} else {
> +		PCIDBG(phb, pd->bdfn, "Powered %s hotpluggable slot\n",
> +		       state == PCI_SLOT_POWER_ON ? "on" : "off");
>   	}
>   
> -success:
> -	PCIDBG(phb, pd->bdfn, "Powering %s hotpluggable slot\n",
> -	       state == PCI_SLOT_POWER_ON ? "on" : "off");
> -error:
>   	pci_slot_remove_flags(slot,
>   		(PCI_SLOT_FLAG_BOOTUP | PCI_SLOT_FLAG_ENFORCE));
> -	pci_slot_set_state(slot, PCI_SLOT_STATE_NORMAL);
>   }
>   
>   static int64_t pci_slot_get_link_width(struct pci_slot *slot)
> 



More information about the Skiboot mailing list