From 85a1de35cbe47618e9d4104880f182121806af4d Mon Sep 17 00:00:00 2001 From: Shilpasri G Bhat Date: Fri, 2 Feb 2018 12:32:32 +0530 Subject: [PATCH] fast-boot: occ: Re-parse the pstate table during fast-boot OCC shares the frequency list to host by copying the pstate table to main memory in HOMER. This table is parsed during boot to create device-tree properties for frequency and pstate IDs. OCC can update the pstate table to present a new set of frequencies to the host. But host will remain oblivious to these changes unless it is re-inited with the updated device-tree CPU frequency properties. So this patch allows to re-parse the pstate table and update the device-tree properties during fast-reboot. OCC updates the pstate table when asked to do so using pstate-table bias command. And this is mainly used by WOF team for characterization purposes. Signed-off-by: Shilpasri G Bhat Tested-by: Vaidyanathan Srinivasan Signed-off-by: Stewart Smith --- core/init.c | 3 ++- hw/occ.c | 23 +++++++++++++++++++++-- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/core/init.c b/core/init.c index 6eb4d8303a54..36cf28de3c39 100644 --- a/core/init.c +++ b/core/init.c @@ -486,6 +486,8 @@ void __noreturn load_and_boot_kernel(bool is_reboot) ipmi_set_fw_progress_sensor(IPMI_FW_OS_BOOT); + occ_pstates_init(); + if (!is_reboot) { /* We wait for the nvram read to complete here so we can * grab stuff from there such as the kernel arguments @@ -499,7 +501,6 @@ void __noreturn load_and_boot_kernel(bool is_reboot) * OCC takes few secs to boot. Call this as late as * as possible to avoid delay. */ - occ_pstates_init(); occ_sensors_init(); } else { diff --git a/hw/occ.c b/hw/occ.c index f3f12312765d..fb7e6836ab7b 100644 --- a/hw/occ.c +++ b/hw/occ.c @@ -1556,8 +1556,24 @@ void occ_pstates_init(void) if (proc_gen < proc_gen_p8) return; /* Handle fast reboots */ - if (occ_pstates_initialized) - return; + if (occ_pstates_initialized) { + struct dt_node *power_mgt; + int i; + const char *props[] = { + "ibm,pstate-core-max", + "ibm,pstate-frequencies-mhz", + "ibm,pstate-ids", + "ibm,pstate-max", + "ibm,pstate-min", + "ibm,pstate-nominal", + "ibm,pstate-turbo", + "ibm,pstate-ultra-turbo", + }; + + power_mgt = dt_find_by_path(dt_root, "/ibm,opal/power-mgt"); + for (i = 0; i < ARRAY_SIZE(props); i++) + dt_check_del_prop(power_mgt, props[i]); + } switch (proc_gen) { case proc_gen_p8: @@ -1605,6 +1621,9 @@ void occ_pstates_init(void) cpu_pstates_prepare_core(chip, c, pstate_nom); } + if (occ_pstates_initialized) + return; + /* Add opal_poller to poll OCC throttle status of each chip */ for_each_chip(chip) chip->throttle = 0;