Message ID | 20190113053715.23941-5-vaibhav@linux.ibm.com |
---|---|
State | Accepted |
Headers | show |
Series | Enable fast-reboot support for CAPI-2 | expand |
Context | Check | Description |
---|---|---|
snowpatch_ozlabs/apply_patch | success | master/apply_patch Successfully applied |
snowpatch_ozlabs/snowpatch_job_snowpatch-skiboot | success | Test snowpatch/job/snowpatch-skiboot on branch master |
Le 13/01/2019 à 06:37, Vaibhav Jain a écrit : > 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. > > Reviewed-by: Andrew Donnellan <andrew.donnellan@au1.ibm.com> > Reviewed-by: Christophe Lombard <clombard@linux.vnet.ibm.com> > Signed-off-by: Vaibhav Jain <vaibhav@linux.ibm.com> > --- Reviewed-by: Frederic Barrat <fbarrat@linux.ibm.com> > Change-log > > v4: > * None. Respinning the patchset. > > v3: > * Updated the code to use capp_xscom_read() instead of xscom_read(). > > * Moved the check for CAPP recovery in progress from MODE_CAPI/DMA to > all CAPP mode switch requests. This preserves existing behaviour > expected by CX5 driver. [ Christophe ] > > * Fixed a minor spelling. [ Andrew ] > > 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 | 88 +++++++++++++++++++++++++++++++++---------------------- > 1 file changed, 53 insertions(+), 35 deletions(-) > > diff --git a/hw/phb4.c b/hw/phb4.c > index a0431d4f..e712b230 100644 > --- a/hw/phb4.c > +++ b/hw/phb4.c > @@ -4441,54 +4441,72 @@ 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 = p->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; > + /* cant do a mode switch when capp is in recovery mode */ > + ret = capp_xscom_read(capp, CAPP_ERR_STATUS_CTRL, ®); > + if (ret != OPAL_SUCCESS) > + return ret; > > - offset = PHB4_CAPP_REG_OFFSET(p); > - xscom_read(p->chip_id, CAPP_ERR_STATUS_CTRL + offset, ®); > - 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)))) { > + if ((reg & PPC_BIT(0)) && (!(reg & PPC_BIT(1)))) { > PHBDBG(p, "CAPP: recovery in progress\n"); > return OPAL_BUSY; > } > > + > 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_DMA: /* Enabled by default on p9 */ > + case OPAL_PHB_CAPI_MODE_SNOOP_ON: > + /* nothing to do on P9 if CAPP is already enabled */ > + ret = p->capp->phb ? OPAL_SUCCESS : OPAL_UNSUPPORTED; > break; > - 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"); > + > + case OPAL_PHB_CAPI_MODE_SNOOP_OFF: > + case OPAL_PHB_CAPI_MODE_PCIE: /* Not supported at the moment */ > + ret = p->capp->phb ? OPAL_UNSUPPORTED : OPAL_SUCCESS; > break; > - case OPAL_PHB_CAPI_MODE_SNOOP_ON: > - /* nothing to do P9 if CAPP is alreay enabled */ > - ret = OPAL_SUCCESS; > + > + case OPAL_PHB_CAPI_MODE_CAPI: /* Fall Through */ > + case OPAL_PHB_CAPI_MODE_DMA_TVT1: > + /* Check if ucode is available */ > + if (!capp_ucode_loaded(chip, p->index)) { > + PHBERR(p, "CAPP: ucode not loaded\n"); > + ret = OPAL_RESOURCE; > + 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; > } >
diff --git a/hw/phb4.c b/hw/phb4.c index a0431d4f..e712b230 100644 --- a/hw/phb4.c +++ b/hw/phb4.c @@ -4441,54 +4441,72 @@ 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 = p->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; + /* cant do a mode switch when capp is in recovery mode */ + ret = capp_xscom_read(capp, CAPP_ERR_STATUS_CTRL, ®); + if (ret != OPAL_SUCCESS) + return ret; - offset = PHB4_CAPP_REG_OFFSET(p); - xscom_read(p->chip_id, CAPP_ERR_STATUS_CTRL + offset, ®); - 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)))) { + if ((reg & PPC_BIT(0)) && (!(reg & PPC_BIT(1)))) { PHBDBG(p, "CAPP: recovery in progress\n"); return OPAL_BUSY; } + 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_DMA: /* Enabled by default on p9 */ + case OPAL_PHB_CAPI_MODE_SNOOP_ON: + /* nothing to do on P9 if CAPP is already enabled */ + ret = p->capp->phb ? OPAL_SUCCESS : OPAL_UNSUPPORTED; break; - 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"); + + case OPAL_PHB_CAPI_MODE_SNOOP_OFF: + case OPAL_PHB_CAPI_MODE_PCIE: /* Not supported at the moment */ + ret = p->capp->phb ? OPAL_UNSUPPORTED : OPAL_SUCCESS; break; - case OPAL_PHB_CAPI_MODE_SNOOP_ON: - /* nothing to do P9 if CAPP is alreay enabled */ - ret = OPAL_SUCCESS; + + case OPAL_PHB_CAPI_MODE_CAPI: /* Fall Through */ + case OPAL_PHB_CAPI_MODE_DMA_TVT1: + /* Check if ucode is available */ + if (!capp_ucode_loaded(chip, p->index)) { + PHBERR(p, "CAPP: ucode not loaded\n"); + ret = OPAL_RESOURCE; + 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; }