[Skiboot] [PATCH 1/2] occ: Add support to read V2 format of OCC-OPAL shared memory region
Joel Stanley
joel at jms.id.au
Mon Feb 1 11:32:17 AEDT 2016
On Wed, Nov 4, 2015 at 4:40 PM, Shilpasri G Bhat
<shilpa.bhat at linux.vnet.ibm.com> wrote:
> Add support to read OCC-OPAL shared memory region version2 to parse
> ultra-turbo pstates and core-to-max-frequency-allowed array and append
> it to device tree. Each element of core-to-max-frequency-allowed indicates
> the maximum frequency sustained with 'n' online cores.
>
> Signed-off-by: Shilpasri G Bhat <shilpa.bhat at linux.vnet.ibm.com>
> ---
> hw/occ.c | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++---------
> 1 file changed, 51 insertions(+), 9 deletions(-)
>
> diff --git a/hw/occ.c b/hw/occ.c
> index 79140cc..783add9 100644
> --- a/hw/occ.c
> +++ b/hw/occ.c
> @@ -33,6 +33,7 @@
> #define P8_HOMER_SAPPHIRE_DATA_OFFSET 0x1F8000
>
> #define MAX_PSTATES 256
> +#define MAX_CORES 16
Where does this number come from?
>
> #define chip_occ_data(chip) \
> ((struct occ_pstate_table *)(chip->homer_base + \
> @@ -55,11 +56,12 @@ struct occ_pstate_table {
> u8 throttle;
> s8 pstate_min;
> s8 pstate_nom;
> - s8 pstate_max;
> - u8 spare1;
> - u8 spare2;
> + s8 pstate_turbo;
> + s8 pstate_ultra_turbo;
> + u8 spare;
> u64 reserved;
> struct occ_pstate_entry pstates[MAX_PSTATES];
> + s8 core_max[MAX_CORES];
I doubt the common case is 16 cores. Is it worth making this dynamic
based on the number of cores?
> };
>
> DEFINE_LOG_ENTRY(OPAL_RC_OCC_LOAD, OPAL_PLATFORM_ERR_EVT, OPAL_OCC,
> @@ -137,8 +139,9 @@ static bool add_cpu_pstate_properties(s8 *pstate_nom)
> struct dt_node *power_mgt;
> u8 nr_pstates;
> /* Arrays for device tree */
> - u32 *dt_id, *dt_freq;
> - u8 *dt_vdd, *dt_vcs;
> + u32 *dt_id, *dt_freq, *dt_core_max = NULL;
> + u8 *dt_vdd, *dt_vcs, ultra_turbo_en = 0;
Can you explain why you are initialising these to zero?
> + s8 pmax;
> bool rc;
> int i;
>
> @@ -164,10 +167,25 @@ static bool add_cpu_pstate_properties(s8 *pstate_nom)
> return false;
> }
>
> - nr_pstates = occ_data->pstate_max - occ_data->pstate_min + 1;
> + if (occ_data->version == 1) {
> + pmax = occ_data->pstate_turbo;
> + goto next;
> + }
> +
> + if (occ_data->pstate_ultra_turbo > occ_data->pstate_turbo) {
> + ultra_turbo_en = 1;
> + pmax = occ_data->pstate_ultra_turbo;
> +
> + } else {
> + ultra_turbo_en = 0;
> + pmax = occ_data->pstate_turbo;
> +
> + }
> +
> +next: nr_pstates = pmax - occ_data->pstate_min + 1;
Put the code on the next line after the label.
> prlog(PR_DEBUG, "OCC: Min %d Nom %d Max %d Nr States %d\n",
> occ_data->pstate_min, occ_data->pstate_nom,
> - occ_data->pstate_max, nr_pstates);
> + pmax, nr_pstates);
>
> if (nr_pstates <= 1 || nr_pstates > 128) {
> prerror("OCC: OCC range is not valid\n");
> @@ -208,6 +226,19 @@ static bool add_cpu_pstate_properties(s8 *pstate_nom)
> goto out_free_vdd;
> }
>
> + if (!ultra_turbo_en)
> + goto populate;
I think you can put the next 5 lines inside the if() instead of using a goto.
> +
> + dt_core_max = (u32 *) malloc(16 * sizeof(u32));
16?
> + if (!dt_core_max) {
> + printf("OCC: dt_core_max alloc failure\n");
> + goto out_free_vcs;
> + }
> +
> + for (i = 0; i < 16; i++)
16?
> + dt_core_max[i] = occ_data->core_max[i];
> +
> +populate:
> for( i=0; i < nr_pstates; i++) {
> dt_id[i] = occ_data->pstates[i].id;
> dt_freq[i] = occ_data->pstates[i].freq_khz/1000;
> @@ -222,12 +253,23 @@ static bool add_cpu_pstate_properties(s8 *pstate_nom)
> dt_add_property(power_mgt, "ibm,pstate-vcss", dt_vcs, nr_pstates);
> dt_add_property_cells(power_mgt, "ibm,pstate-min", occ_data->pstate_min);
> dt_add_property_cells(power_mgt, "ibm,pstate-nominal", occ_data->pstate_nom);
> - dt_add_property_cells(power_mgt, "ibm,pstate-max", occ_data->pstate_max);
> -
> + dt_add_property_cells(power_mgt, "ibm,pstate-max", pmax);
> + dt_add_property_cells(power_mgt, "ibm,ultra-turbo-en", ultra_turbo_en);
> +
> + if (ultra_turbo_en) {
> + dt_add_property_cells(power_mgt, "ibm,pstate-turbo",
> + occ_data->pstate_turbo);
> + dt_add_property_cells(power_mgt, "ibm,pstate-ultra-turbo",
> + occ_data->pstate_ultra_turbo);
> + dt_add_property(power_mgt, "ibm,pstate-core-max", dt_core_max,
> + MAX_CORES * 4);
What's the 4 here?
> + free(dt_core_max);
> + }
> /* Return pstate to set for each core */
> *pstate_nom = occ_data->pstate_nom;
> rc = true;
>
> +out_free_vcs:
> free(dt_vcs);
> out_free_vdd:
> free(dt_vdd);
> --
> 1.9.3
>
> _______________________________________________
> Skiboot mailing list
> Skiboot at lists.ozlabs.org
> https://lists.ozlabs.org/listinfo/skiboot
More information about the Skiboot
mailing list