diff mbox series

[v2,2/3] core/pci: Export pci_check_clear_freeze()

Message ID 20190801064424.22917-2-oohall@gmail.com
State Accepted
Headers show
Series [v2,1/3] core/pci-quirk: Re-order struct members | expand

Checks

Context Check Description
snowpatch_ozlabs/apply_patch success Successfully applied on branch master (2554cac82da530acfcb1a575c571e760de92dde4)
snowpatch_ozlabs/snowpatch_job_snowpatch-skiboot success Test snowpatch/job/snowpatch-skiboot on branch master
snowpatch_ozlabs/snowpatch_job_snowpatch-skiboot-dco success Signed-off-by present

Commit Message

Oliver O'Halloran Aug. 1, 2019, 6:44 a.m. UTC
We'd like to be able to check when we get a freeze in the quirk handling
code. Make pci_check_clear_freeze un-static so it can be used elsewhere.

Signed-off-by: Oliver O'Halloran <oohall@gmail.com>
---
v2: Split off from 3/3
---
 core/pci.c    | 15 ++++++++++-----
 include/pci.h |  2 ++
 2 files changed, 12 insertions(+), 5 deletions(-)

Comments

Alistair Popple Aug. 2, 2019, 2:01 a.m. UTC | #1
Looks good to me as it doesn't change the behavior of any existing code.

Reviewed-By: Alistair Popple <alistair@popple.id.au>

On Thursday, 1 August 2019 4:44:23 PM AEST Oliver O'Halloran wrote:
> We'd like to be able to check when we get a freeze in the quirk handling
> code. Make pci_check_clear_freeze un-static so it can be used elsewhere.
> 
> Signed-off-by: Oliver O'Halloran <oohall@gmail.com>
> ---
> v2: Split off from 3/3
> ---
>  core/pci.c    | 15 ++++++++++-----
>  include/pci.h |  2 ++
>  2 files changed, 12 insertions(+), 5 deletions(-)
> 
> diff --git a/core/pci.c b/core/pci.c
> index aceaa357877a..56f0b2a10525 100644
> --- a/core/pci.c
> +++ b/core/pci.c
> @@ -307,10 +307,12 @@ static struct pci_device *pci_scan_one(struct phb 
*phb, struct pci_device *paren
>   *                          everything (default state of our backend) so
>   *                          we just check and clear the state of PE#0
>   *
> + *                          returns true if a freeze was detected
> + *
>   * NOTE: We currently only handle simple PE freeze, not PHB fencing
>   *       (or rather our backend does)
>   */
> -static void pci_check_clear_freeze(struct phb *phb)
> +bool pci_check_clear_freeze(struct phb *phb)
>  {
>  	uint8_t freeze_state;
>  	uint16_t pci_error_type, sev;
> @@ -321,23 +323,26 @@ static void pci_check_clear_freeze(struct phb *phb)
>  	if (phb->ops->get_reserved_pe_number)
>  		pe_number = phb->ops->get_reserved_pe_number(phb);
>  	if (pe_number < 0)
> -		return;
> +		return false;
>  
>  	/* Retrieve the frozen state */
>  	rc = phb->ops->eeh_freeze_status(phb, pe_number, &freeze_state,
>  					 &pci_error_type, &sev);
>  	if (rc)
> -		return;
> +		return true; /* phb fence? */
> +
>  	if (freeze_state == OPAL_EEH_STOPPED_NOT_FROZEN)
> -		return;
> +		return false;
>  	/* We can't handle anything worse than an ER here */
>  	if (sev > OPAL_EEH_SEV_NO_ERROR &&
>  	    sev < OPAL_EEH_SEV_PE_ER) {
>  		PCIERR(phb, 0, "Fatal probe in %s error !\n", __func__);
> -		return;
> +		return true;
>  	}
> +
>  	phb->ops->eeh_freeze_clear(phb, pe_number,
>  				   OPAL_EEH_ACTION_CLEAR_FREEZE_ALL);
> +	return true;
>  }
>  
>  /*
> diff --git a/include/pci.h b/include/pci.h
> index b840409062b6..18deb2f3a97b 100644
> --- a/include/pci.h
> +++ b/include/pci.h
> @@ -392,6 +392,8 @@ static inline void phb_unlock(struct phb *phb)
>  	unlock(&phb->lock);
>  }
>  
> +bool pci_check_clear_freeze(struct phb *phb);
> +
>  /* Config space ops wrappers */
>  static inline int64_t pci_cfg_read8(struct phb *phb, uint32_t bdfn,
>  				    uint32_t offset, uint8_t *data)
>
diff mbox series

Patch

diff --git a/core/pci.c b/core/pci.c
index aceaa357877a..56f0b2a10525 100644
--- a/core/pci.c
+++ b/core/pci.c
@@ -307,10 +307,12 @@  static struct pci_device *pci_scan_one(struct phb *phb, struct pci_device *paren
  *                          everything (default state of our backend) so
  *                          we just check and clear the state of PE#0
  *
+ *                          returns true if a freeze was detected
+ *
  * NOTE: We currently only handle simple PE freeze, not PHB fencing
  *       (or rather our backend does)
  */
-static void pci_check_clear_freeze(struct phb *phb)
+bool pci_check_clear_freeze(struct phb *phb)
 {
 	uint8_t freeze_state;
 	uint16_t pci_error_type, sev;
@@ -321,23 +323,26 @@  static void pci_check_clear_freeze(struct phb *phb)
 	if (phb->ops->get_reserved_pe_number)
 		pe_number = phb->ops->get_reserved_pe_number(phb);
 	if (pe_number < 0)
-		return;
+		return false;
 
 	/* Retrieve the frozen state */
 	rc = phb->ops->eeh_freeze_status(phb, pe_number, &freeze_state,
 					 &pci_error_type, &sev);
 	if (rc)
-		return;
+		return true; /* phb fence? */
+
 	if (freeze_state == OPAL_EEH_STOPPED_NOT_FROZEN)
-		return;
+		return false;
 	/* We can't handle anything worse than an ER here */
 	if (sev > OPAL_EEH_SEV_NO_ERROR &&
 	    sev < OPAL_EEH_SEV_PE_ER) {
 		PCIERR(phb, 0, "Fatal probe in %s error !\n", __func__);
-		return;
+		return true;
 	}
+
 	phb->ops->eeh_freeze_clear(phb, pe_number,
 				   OPAL_EEH_ACTION_CLEAR_FREEZE_ALL);
+	return true;
 }
 
 /*
diff --git a/include/pci.h b/include/pci.h
index b840409062b6..18deb2f3a97b 100644
--- a/include/pci.h
+++ b/include/pci.h
@@ -392,6 +392,8 @@  static inline void phb_unlock(struct phb *phb)
 	unlock(&phb->lock);
 }
 
+bool pci_check_clear_freeze(struct phb *phb);
+
 /* Config space ops wrappers */
 static inline int64_t pci_cfg_read8(struct phb *phb, uint32_t bdfn,
 				    uint32_t offset, uint8_t *data)