[Skiboot] [PATCH v5 4/8] skiboot: Add opal call to enable/disable Nest IMC microcode
Hemant Kumar
hemant at linux.vnet.ibm.com
Wed Feb 15 22:44:34 AEDT 2017
On 02/10/2017 12:42 PM, Oliver O'Halloran wrote:
> On Wed, 2017-02-08 at 02:41 +0530, Hemant Kumar wrote:
>> Add a new opal call to start/stop the Nest IMC microcode running in
>> the
>> OCC complex based on the "operation" parameter. Also, check the
>> status
>> from the control block structure before starting/stopping the IMC
>> microcode.
>>
>> Adds two operations for the Nest IMC microcode to opal-api :
>> OPAL_NEST_IMC_STOP : Stop the nest IMC PMU counters collection
>> OPAL_NEST_IMC_START : Start the nest IMC PMU counters
>>
>> Signed-off-by: Hemant Kumar <hemant at linux.vnet.ibm.com>
>> ---
>> Changelog:
>> v2 -> v3:
>> - Changed references from IMA to IMC.
>> - Removed some of the gotos since, they seemed redundant.
>> - Using get_ima_cb() helper function to get the IMC control block.
>> - Using enum for nest IMC operations, also, exported them to opal-
>> api.h.
>> v1 -> v2:
>> - Changed references from "pore_slw" to "IMA Microcode".
>> - Changed the macro usage from "SLW_IMA_*" to "NEST_IMA_"*.
>>
>> hw/imc.c | 55
>> ++++++++++++++++++++++++++++++++++++++++++++++++++++++
>> include/opal-api.h | 9 ++++++++-
>> 2 files changed, 63 insertions(+), 1 deletion(-)
>>
>> diff --git a/hw/imc.c b/hw/imc.c
>> index f0eca7b..5809d51 100644
>> --- a/hw/imc.c
>> +++ b/hw/imc.c
>> @@ -186,3 +186,58 @@ void imc_init(void)
>> err:
>> free(buf);
>> }
>> +
>> +/*
>> + * opal_nest_imc_counters_control : This call controls the nest IMC
>> microcode.
>> + *
>> + * mode : For now, this call supports only
>> NEST_IMC_PRODUCTION_MODE.
>> + * This mode can start/stop the Nest IMC Microcode for
>> nest
>> + * instrumentation from Host OS.
>> + * operation : Start(0x0) or Stop(0x1) the engine.
>> + *
>> + * This call can be extended to include more operations to use the
>> multiple
>> + * debug modes provided by the nest IMC microcode and the parameters
>> value_1
>> + * and value_2 for the same purpose.
>> + */
>> +static int64_t opal_nest_imc_counters_control(uint64_t mode,
>> + uint64_t operation,
>> + uint64_t value_1,
>> + uint64_t value_2)
>> +{
>> + u64 op, status;
>> + struct imc_chip_cb *cb;
>> +
>> + if ((mode != NEST_IMC_PRODUCTION_MODE) || value_1 ||
>> value_2)
>> + return OPAL_PARAMETER;
>> +
>> + /* Fetch the IMC control block structure */
>> + cb = get_imc_cb();
>> + status = be64_to_cpu(cb->imc_chip_run_status);
>> +
>> + switch (operation) {
>> + case OPAL_NEST_IMC_STOP:
>> + /* Check whether the engine is already stopped */
>> + if (status == NEST_IMC_PAUSE)
>> + return OPAL_SUCCESS;
>> +
>> + op = NEST_IMC_DISABLE;
>> + break;
>> + case OPAL_NEST_IMC_START:
>> + /* Check whether the engine is already running */
>> + if (status == NEST_IMC_RESUME)
>> + return OPAL_SUCCESS;
>> +
>> + op = NEST_IMC_ENABLE;
>> + break;
>> + default:
>> + prerror("IMC: unknown operation for nest imc\n");
>> + return OPAL_PARAMETER;
>> + }
>> +
>> + /* Write the command to the control block now */
>> + cb->imc_chip_command = op;
>> +
>> + return OPAL_SUCCESS;
>> +}
>> +
>> +opal_call(OPAL_NEST_IMC_COUNTERS_CONTROL,
>> opal_nest_imc_counters_control, 4);
>> diff --git a/include/opal-api.h b/include/opal-api.h
>> index 05ff51d..9668758 100644
>> --- a/include/opal-api.h
>> +++ b/include/opal-api.h
>> @@ -181,7 +181,8 @@
>> #define OPAL_INT_SET_MFRR 125
>> #define OPAL_PCI_TCE_KILL 126
>> #define OPAL_NMMU_SET_PTCR 127
>> -#define OPAL_LAST 127
>> +#define OPAL_NEST_IMC_COUNTERS_CONTROL 128
>> +#define OPAL_LAST 128
> As a general point, you should rebase your series on the latest master.
> before posting: Locally I've got:
>
>> #define OPAL_XIVE_RESERVED4 144
>> #define OPAL_LAST 144
> There might be other conflicts.
Yeah, will rebase this patchset.
[SNIP]
--
Thanks,
Hemant Kumar
More information about the Skiboot
mailing list