[Skiboot] [PATCH v2 4/8] phb4/capp: Update and re-factor phb4_set_capi_mode()

Andrew Donnellan andrew.donnellan at au1.ibm.com
Mon Dec 10 16:05:39 AEDT 2018


On 10/12/18 1:17 am, Vaibhav Jain wrote:
> Presently phb4_set_capi_mode() performs certain CAPP checks
> like, checking of CAPP ucode loaded or checks if CAPP is still in
> recovery, even when the requested mode is to switch to PCI mode.
> 
> Hence this patch updates and re-factors phb4_set_capi_mode() to make
> sure CAPP related checks are only performed when request to enable
> CAPP is made by mode==OPAL_PHB_CAPI_MODE_CAPI/DMA_TVT1. We also update
> other possible modes requests to return a more appropriate status code
> based on if CAPP is activated or not.
> 
> Signed-off-by: Vaibhav Jain <vaibhav at linux.ibm.com>

Thanks for addressing the issues I raised.

Reviewed-by: Andrew Donnellan <andrew.donnellan at au1.ibm.com>

Spelling nitpick below if you happen to respin a v3.

> ---
> Change-log:
> 
> v2: Using 'struct capp* instead of global 'capi_lock' to indicate that
>      CAPP is now attached to a PHB [Andrew]
>      Code formatting that removed the use of a confusing tertiary
>      operator. [Andrew]
> ---
>   hw/phb4.c | 93 ++++++++++++++++++++++++++++++++++---------------------
>   1 file changed, 57 insertions(+), 36 deletions(-)
> 
> diff --git a/hw/phb4.c b/hw/phb4.c
> index 5819ad0b..df483e27 100644
> --- a/hw/phb4.c
> +++ b/hw/phb4.c
> @@ -4436,54 +4436,75 @@ static int64_t phb4_set_capi_mode(struct phb *phb, uint64_t mode,
>   	struct proc_chip *chip = get_chip(p->chip_id);
>   	struct capp *capp = phb->capp;
>   	uint64_t reg, ret;
> -	uint32_t offset;
>   
>   	if (capp == NULL)
>   		return OPAL_UNSUPPORTED;
>   
> -	if (!capp_ucode_loaded(chip, p->index)) {
> -		PHBERR(p, "CAPP: ucode not loaded\n");
> -		return OPAL_RESOURCE;
> -	}
> -
> -	/* mark the capp attached to the phb */
> -	capp->phb = phb;
> -	capp->attached_pe = pe_number;
> +	switch (mode) {
>   
> -	offset = PHB4_CAPP_REG_OFFSET(p);
> -	xscom_read(p->chip_id, CAPP_ERR_STATUS_CTRL + offset, &reg);
> -	if ((reg & PPC_BIT(5))) {
> -		PHBERR(p, "CAPP: recovery failed (%016llx)\n", reg);
> -		return OPAL_HARDWARE;
> -	} else if ((reg & PPC_BIT(0)) && (!(reg & PPC_BIT(1)))) {
> -		PHBDBG(p, "CAPP: recovery in progress\n");
> -		return OPAL_BUSY;
> -	}
> +	case OPAL_PHB_CAPI_MODE_DMA: /* Enabled by default on p9 */
> +	case OPAL_PHB_CAPI_MODE_SNOOP_ON:
> +		/* nothing to do on P9 if CAPP is alreay enabled */

already :)

> +		ret = phb->capp->phb ? OPAL_SUCCESS : OPAL_UNSUPPORTED;
> +		break;
>   
> -	switch (mode) {
> -	case OPAL_PHB_CAPI_MODE_CAPI:
> -		ret = enable_capi_mode(p, pe_number,
> -					CAPP_MAX_STQ_ENGINES |
> -					CAPP_MIN_DMA_READ_ENGINES);
> -		disable_fast_reboot("CAPP being enabled");
> +	case OPAL_PHB_CAPI_MODE_SNOOP_OFF:
> +	case OPAL_PHB_CAPI_MODE_PCIE: /* Not supported at the moment */
> +		ret = phb->capp->phb ? OPAL_UNSUPPORTED : OPAL_SUCCESS;
>   		break;
> +
> +	case OPAL_PHB_CAPI_MODE_CAPI: /* Fall Through */
>   	case OPAL_PHB_CAPI_MODE_DMA_TVT1:
> -		ret = enable_capi_mode(p, pe_number,
> -					CAPP_MIN_STQ_ENGINES |
> -					CAPP_MAX_DMA_READ_ENGINES);
> -		disable_fast_reboot("CAPP being enabled");
> -		break;
> -	case OPAL_PHB_CAPI_MODE_SNOOP_ON:
> -		/* nothing to do P9 if CAPP is alreay enabled */
> -		ret = OPAL_SUCCESS;
> +		/* Check if ucode is available */
> +		if (!capp_ucode_loaded(chip, p->index)) {
> +			PHBERR(p, "CAPP: ucode not loaded\n");
> +			ret = OPAL_RESOURCE;
> +			break;
> +		}
> +
> +		xscom_read(p->chip_id, CAPP_ERR_STATUS_CTRL + offset, &reg);
> +		if ((reg & PPC_BIT(5))) {
> +			PHBERR(p, "CAPP: recovery failed (%016llx)\n", reg);
> +			ret = OPAL_HARDWARE;
> +			break;
> +		} else if ((reg & PPC_BIT(0)) && (!(reg & PPC_BIT(1)))) {
> +			PHBDBG(p, "CAPP: recovery in progress\n");
> +			ret = OPAL_BUSY;
> +			break;
> +		}
> +
> +		/*
> +		 * Mark the CAPP attached to the PHB right away so that
> +		 * if a MCE happens during CAPP init we can handle it.
> +		 * In case of an error in CAPP init we remove the PHB
> +		 * from the attached_mask later.
> +		 */
> +		capp->phb = phb;
> +		capp->attached_pe = pe_number;
> +
> +		if (mode == OPAL_PHB_CAPI_MODE_DMA_TVT1)
> +			ret = enable_capi_mode(p, pe_number,
> +					       CAPP_MIN_STQ_ENGINES |
> +					       CAPP_MAX_DMA_READ_ENGINES);
> +
> +		else
> +			ret = enable_capi_mode(p, pe_number,
> +					       CAPP_MAX_STQ_ENGINES |
> +					       CAPP_MIN_DMA_READ_ENGINES);
> +		if (ret == OPAL_SUCCESS) {
> +			/* Disable fast reboot for CAPP */
> +			disable_fast_reboot("CAPP being enabled");
> +		} else {
> +			/* In case of an error mark the PHB detached */
> +			capp->phb = NULL;
> +			capp->attached_pe = phb4_get_reserved_pe_number(phb);
> +		}
>   		break;
>   
> -	case OPAL_PHB_CAPI_MODE_PCIE: /* shouldn't be called on p9*/
> -	case OPAL_PHB_CAPI_MODE_DMA: /* Enabled by default on p9 */
> -	case OPAL_PHB_CAPI_MODE_SNOOP_OFF: /* shouldn't be called on p9*/
>   	default:
>   		ret = OPAL_UNSUPPORTED;
> -	}
> +		break;
> +	};
>   
>   	return ret;
>   }
> 

-- 
Andrew Donnellan              OzLabs, ADL Canberra
andrew.donnellan at au1.ibm.com  IBM Australia Limited



More information about the Skiboot mailing list