[Skiboot] [PATCH] SCOM restore for DARN and XIVE
Oliver
oohall at gmail.com
Mon Nov 13 17:06:27 AEDT 2017
On Mon, Nov 13, 2017 at 5:04 PM, Stewart Smith
<stewart at linux.vnet.ibm.com> wrote:
> Akshay Adiga <akshay.adiga at linux.vnet.ibm.com> writes:
>> While waking up from stop11, we want NCU_DARN_BAR to have enable bit set.
>> Without this stop_api call, the value restored is without enable bit set.
>> We loose NCU_SPEC_BAR when the quad goes into stop11, stop_api will
>> restore while waking up from stop11.
>>
>> Signed-off-by: Akshay Adiga <akshay.adiga at linux.vnet.ibm.com>
>> ---
>> hw/nx.c | 12 +++++++++++-
>> hw/xive.c | 8 ++++++++
>> 2 files changed, 19 insertions(+), 1 deletion(-)
>>
>> diff --git a/hw/nx.c b/hw/nx.c
>> index 64ac793..8431c3c 100644
>> --- a/hw/nx.c
>> +++ b/hw/nx.c
>> @@ -24,6 +24,7 @@
>> #include <chip.h>
>> #include <xscom-p9-regs.h>
>> #include <phys-map.h>
>> +#include <p9_stop_api.H>
>>
>> extern void nx_p9_rng_init(void);
>>
>> @@ -31,7 +32,7 @@ void nx_p9_rng_init(void)
>> {
>> struct proc_chip *chip;
>> struct cpu_thread *c;
>> - uint64_t bar, tmp;
>> + uint64_t bar, tmp, rc;
>>
>> if (proc_gen != proc_gen_p9)
>> return;
>> @@ -65,6 +66,15 @@ void nx_p9_rng_init(void)
>> P9X_EX_NCU_DARN_BAR);
>> xscom_write(chip->id, addr,
>> bar | P9X_EX_NCU_DARN_BAR_EN);
>> + rc = p9_stop_save_scom(( void *)chip->homer_base,
>> + addr, bar | P9X_EX_NCU_DARN_BAR_EN,
>> + P9_STOP_SCOM_REPLACE,
>> + P9_STOP_SECTION_CORE_SCOM);
>> + if (rc) {
>> + prlog(PR_ERR,
>> + " stopapi for DARN_BAR failed %lld",
>> + rc);
>> + }
>
> Don't need {} for single line ifs
Is it really a single line if when it's spread across three?
>
> Also, this (and below) I think should just say p9_stop_api rather than
> 'stopapi' here and 'STOP_API' below.
>
> I also think the error handling here is incorrect.
>
> IF we can't get stop to save and restore the DARN_BAR then we either
> need to disable deep stop states or DARN.
>> @@ -3111,6 +3112,7 @@ static void xive_configure_ex_special_bar(struct xive *x, struct cpu_thread *c)
>> {
>> uint64_t xa, val;
>> int64_t rc;
>> + struct proc_chip *chip = get_chip(c->chip_id);
>>
>> xive_cpu_dbg(c, "Setting up special BAR\n");
>> xa = XSCOM_ADDR_P9_EX(pir_to_core_id(c->pir), P9X_EX_NCU_SPEC_BAR);
>> @@ -3123,6 +3125,12 @@ static void xive_configure_ex_special_bar(struct xive *x, struct cpu_thread *c)
>> xive_cpu_err(c, "Failed to setup NCU_SPEC_BAR\n");
>> /* XXXX what do do now ? */
>> }
>> + rc = p9_stop_save_scom(( void *)chip->homer_base, xa, val,
>> + P9_STOP_SCOM_REPLACE, P9_STOP_SECTION_EQ_SCOM);
>> + if (rc) {
>> + xive_cpu_err(c, "STOP_API failed for NCU_SPEC_BAR rc=%lld\n",rc);
>> +
>> + }
>> }
>
> I think we need to handle the error case here too, although I'm not sure
> what options we have in this case...
>
> --
> Stewart Smith
> OPAL Architect, IBM.
>
> _______________________________________________
> Skiboot mailing list
> Skiboot at lists.ozlabs.org
> https://lists.ozlabs.org/listinfo/skiboot
More information about the Skiboot
mailing list