diff mbox

[v5,4/8] skiboot: Add opal call to enable/disable Nest IMC microcode

Message ID 1486501913-31041-5-git-send-email-hemant@linux.vnet.ibm.com
State Superseded
Headers show

Commit Message

Hemant Kumar Feb. 7, 2017, 9:11 p.m. UTC
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@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(-)

Comments

Oliver O'Halloran Feb. 10, 2017, 7:12 a.m. UTC | #1
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@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.
 
>  /* Device tree flags */
>  
> @@ -1056,6 +1057,12 @@ enum {
>  	OPAL_PCI_TCE_KILL_ALL,
>  };
>  
> +/* Operation argument to Nest IMC Microcode */
> +enum {
> +	OPAL_NEST_IMC_STOP,
> +	OPAL_NEST_IMC_START,
> +};
> +
>  #endif /* __ASSEMBLY__ */
>  
>  #endif /* __OPAL_API_H */
Hemant Kumar Feb. 15, 2017, 11:44 a.m. UTC | #2
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@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
diff mbox

Patch

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
 
 /* Device tree flags */
 
@@ -1056,6 +1057,12 @@  enum {
 	OPAL_PCI_TCE_KILL_ALL,
 };
 
+/* Operation argument to Nest IMC Microcode */
+enum {
+	OPAL_NEST_IMC_STOP,
+	OPAL_NEST_IMC_START,
+};
+
 #endif /* __ASSEMBLY__ */
 
 #endif /* __OPAL_API_H */