[Skiboot] [RFC PATCH v2 7/8] occ: Disable OCC on UV systems

Oliver O'Halloran oohall at gmail.com
Mon Nov 18 10:58:48 AEDT 2019


On Sat, Sep 21, 2019 at 12:04 AM Ryan Grimm <grimm at linux.ibm.com> wrote:
>
> On Ultravisor enabled system, temporarily disable OCC irq paths for
> shared memory updates when OCC is up, so as to boot the system.
>
> We also disable the OPAL-OCC command response interface which is
> required for Sensors. This will be enabled at a later point when we
> can read the OCC Common area residing in secure memory region.
>
> Disable stop levels if they are enabled in the SPIRA.
>
> Skip pstates_init and occ_sensor_init as well.
>
> Signed-off-by: Shilpasri G Bhat <shilpa.bhat at linux.vnet.ibm.com>
> Signed-off-by: Gautham R. Shenoy <ego at linux.vnet.ibm.com>
> Signed-off-by: Ryan Grimm <grimm at linux.ibm.com>

Is there any OCC functions that are still enabled? If not, I'd be
happier if we just had a way to disable the OCC entirely rather than
doing S bits checks and playing wack-a-mole.

> ---
>  hdata/spira.c   |  4 ++++
>  hw/occ-sensor.c |  6 ++++++
>  hw/occ.c        | 25 ++++++++++++++++++++++++-
>  3 files changed, 34 insertions(+), 1 deletion(-)
>
> diff --git a/hdata/spira.c b/hdata/spira.c
> index f6003ea0..5c65b139 100644
> --- a/hdata/spira.c
> +++ b/hdata/spira.c
> @@ -1281,6 +1281,10 @@ static void add_stop_levels(void)
>         if (proc_gen < proc_gen_p9)
>                 return;
>
> +       if (is_msr_bit_set(MSR_S)) {
> +               prlog(PR_INFO, "SPIRA: Skipping stop levels because S BIT set\n");
> +       }
> +
>         /*
>          * OPAL only exports a single set of flags to indicate the supported
>          * STOP modes while the HDAT descibes the support top levels *per chip*
> diff --git a/hw/occ-sensor.c b/hw/occ-sensor.c
> index d06ca725..a0f47610 100644
> --- a/hw/occ-sensor.c
> +++ b/hw/occ-sensor.c
> @@ -12,6 +12,7 @@
>  #include <device.h>
>  #include <cpu.h>
>  #include <occ.h>
> +#include <ultravisor.h>
>
>  enum sensor_attr {
>         SENSOR_SAMPLE,
> @@ -492,6 +493,11 @@ bool occ_sensors_init(void)
>         int occ_num = 0, i;
>         bool has_gpu = false;
>
> +       if (is_uv_present()) {
> +               prlog(PR_DEBUG, "UV HACK: Skipping %s because MSR_S set\n", __func__);
> +               return false;
> +       }
> +
>         /* OCC inband sensors is only supported in P9 */
>         if (proc_gen != proc_gen_p9)
>                 return false;
> diff --git a/hw/occ.c b/hw/occ.c
> index db2744ff..35582c89 100644
> --- a/hw/occ.c
> +++ b/hw/occ.c
> @@ -872,6 +872,11 @@ static void occ_throttle_poll(void *data __unused)
>         struct opal_occ_msg occ_msg;
>         int rc;
>
> +       if (is_uv_present()) {
> +               prlog(PR_DEBUG, "OCC: %s currently unsupported on ultravisor\n", __func__);
> +               return;
> +       }
> +
>         if (!try_lock(&occ_lock))
>                 return;
>         if (occ_reset) {
> @@ -1185,6 +1190,11 @@ static void handle_occ_rsp(uint32_t chip_id)
>         struct opal_command_buffer *cmd;
>         struct occ_response_buffer *rsp;
>
> +       if (is_uv_present()) {
> +               prlog(PR_DEBUG, "OCC: %s currently unsupported on ultravisor\n", __func__);
> +               return;
> +       }
> +
>         chip = get_chip_cmd_interface(chip_id);
>         if (!chip)
>                 return;
> @@ -1719,6 +1729,11 @@ void occ_pstates_init(void)
>         u8 domain_runs_at;
>         static bool occ_pstates_initialized;
>
> +       if (is_msr_bit_set(MSR_S)) {
> +               prlog(PR_DEBUG, "UV HACK: Skipping %s because UV is present\n", __func__);
> +               return;
> +       }
> +
>         /* OCC is supported in P8 and P9 */
>         if (proc_gen < proc_gen_p8)
>                 return;
> @@ -1810,9 +1825,17 @@ void occ_pstates_init(void)
>         /* Add opal_poller to poll OCC throttle status of each chip */
>         for_each_chip(chip)
>                 chip->throttle = 0;
> -       opal_add_poller(occ_throttle_poll, NULL);
>         occ_pstates_initialized = true;
>
> +       /*
> +        * On Ultravisor systems, we don't yet support
> +        * OCC Poller and OPAL-OCC command-response interface.
> +        */
> +       if (is_uv_present()) {
> +               prlog(PR_DEBUG, "OCC: Skipping throttle-poll,CMD-RSP interface on UV\n");
> +               return;
> +       }
> +       opal_add_poller(occ_throttle_poll, NULL);
>         /* Init OPAL-OCC command-response interface */
>         occ_cmd_interface_init();
>
> --
> 2.21.0
>
> _______________________________________________
> Skiboot mailing list
> Skiboot at lists.ozlabs.org
> https://lists.ozlabs.org/listinfo/skiboot


More information about the Skiboot mailing list