Re: [PATCH v2 29/36] platform/x86: intel_telemetry: Convert to use new SCU IPC API

From: Andy Shevchenko
Date: Wed Jan 08 2020 - 11:54:55 EST


On Wed, Jan 08, 2020 at 02:41:54PM +0300, Mika Westerberg wrote:
> Convert the Intel Apollo Lake telemetry driver to use the new SCU IPC
> API. This allows us to get rid of the duplicate PMC IPC implementation
> which is now covered in SCU IPC driver.
>
> Also move telemetry specific IPC message constant to the telementry
> driver where it belongs.
>

Reviewed-by: Andy Shevchenko <andriy.shevchenko@xxxxxxxxxxxxxxx>

> Signed-off-by: Mika Westerberg <mika.westerberg@xxxxxxxxxxxxxxx>
> ---
> arch/x86/include/asm/intel_pmc_ipc.h | 1 -
> arch/x86/include/asm/intel_telemetry.h | 3 +
> drivers/platform/x86/intel_telemetry_pltdrv.c | 101 +++++++++---------
> 3 files changed, 55 insertions(+), 50 deletions(-)
>
> diff --git a/arch/x86/include/asm/intel_pmc_ipc.h b/arch/x86/include/asm/intel_pmc_ipc.h
> index b438a488f613..ddc964b9c78c 100644
> --- a/arch/x86/include/asm/intel_pmc_ipc.h
> +++ b/arch/x86/include/asm/intel_pmc_ipc.h
> @@ -8,7 +8,6 @@
> #define PMC_IPC_PHY_CONFIG 0xEE
> #define PMC_IPC_NORTHPEAK_CTRL 0xED
> #define PMC_IPC_PM_DEBUG 0xEC
> -#define PMC_IPC_PMC_TELEMTRY 0xEB
> #define PMC_IPC_PMC_FW_MSG_CTRL 0xEA
>
> /* IPC return code */
> diff --git a/arch/x86/include/asm/intel_telemetry.h b/arch/x86/include/asm/intel_telemetry.h
> index 214394860632..e19deb776003 100644
> --- a/arch/x86/include/asm/intel_telemetry.h
> +++ b/arch/x86/include/asm/intel_telemetry.h
> @@ -10,6 +10,8 @@
> #define TELEM_MAX_EVENTS_SRAM 28
> #define TELEM_MAX_OS_ALLOCATED_EVENTS 20
>
> +#include <asm/intel_scu_ipc.h>
> +
> enum telemetry_unit {
> TELEM_PSS = 0,
> TELEM_IOSS,
> @@ -54,6 +56,7 @@ struct telemetry_plt_config {
> struct telemetry_unit_config ioss_config;
> struct mutex telem_trace_lock;
> struct mutex telem_lock;
> + struct intel_scu_ipc_dev *scu;
> bool telem_in_use;
> };
>
> diff --git a/drivers/platform/x86/intel_telemetry_pltdrv.c b/drivers/platform/x86/intel_telemetry_pltdrv.c
> index df8565bad595..d39dde634866 100644
> --- a/drivers/platform/x86/intel_telemetry_pltdrv.c
> +++ b/drivers/platform/x86/intel_telemetry_pltdrv.c
> @@ -15,7 +15,6 @@
>
> #include <asm/cpu_device_id.h>
> #include <asm/intel-family.h>
> -#include <asm/intel_pmc_ipc.h>
> #include <asm/intel_punit_ipc.h>
> #include <asm/intel_telemetry.h>
>
> @@ -35,6 +34,7 @@
> #define TELEM_SSRAM_STARTTIME_OFFSET 8
> #define TELEM_SSRAM_EVTLOG_OFFSET 16
>
> +#define IOSS_TELEM 0xeb
> #define IOSS_TELEM_EVENT_READ 0x0
> #define IOSS_TELEM_EVENT_WRITE 0x1
> #define IOSS_TELEM_INFO_READ 0x2
> @@ -42,9 +42,6 @@
> #define IOSS_TELEM_TRACE_CTL_WRITE 0x6
> #define IOSS_TELEM_EVENT_CTL_READ 0x7
> #define IOSS_TELEM_EVENT_CTL_WRITE 0x8
> -#define IOSS_TELEM_EVT_CTRL_WRITE_SIZE 0x4
> -#define IOSS_TELEM_READ_WORD 0x1
> -#define IOSS_TELEM_WRITE_FOURBYTES 0x4
> #define IOSS_TELEM_EVT_WRITE_SIZE 0x3
>
> #define TELEM_INFO_SRAMEVTS_MASK 0xFF00
> @@ -253,17 +250,14 @@ static int telemetry_check_evtid(enum telemetry_unit telem_unit,
> static inline int telemetry_plt_config_ioss_event(u32 evt_id, int index)
> {
> u32 write_buf;
> - int ret;
>
> write_buf = evt_id | TELEM_EVENT_ENABLE;
> write_buf <<= BITS_PER_BYTE;
> write_buf |= index;
>
> - ret = intel_pmc_ipc_command(PMC_IPC_PMC_TELEMTRY,
> - IOSS_TELEM_EVENT_WRITE, (u8 *)&write_buf,
> - IOSS_TELEM_EVT_WRITE_SIZE, NULL, 0);
> -
> - return ret;
> + return intel_scu_ipc_dev_command(telm_conf->scu, IOSS_TELEM,
> + IOSS_TELEM_EVENT_WRITE, &write_buf,
> + IOSS_TELEM_EVT_WRITE_SIZE, NULL, 0);
> }
>
> static inline int telemetry_plt_config_pss_event(u32 evt_id, int index)
> @@ -281,6 +275,7 @@ static inline int telemetry_plt_config_pss_event(u32 evt_id, int index)
> static int telemetry_setup_iossevtconfig(struct telemetry_evtconfig evtconfig,
> enum telemetry_action action)
> {
> + struct intel_scu_ipc_dev *scu = telm_conf->scu;
> u8 num_ioss_evts, ioss_period;
> int ret, index, idx;
> u32 *ioss_evtmap;
> @@ -291,9 +286,9 @@ static int telemetry_setup_iossevtconfig(struct telemetry_evtconfig evtconfig,
> ioss_evtmap = evtconfig.evtmap;
>
> /* Get telemetry EVENT CTL */
> - ret = intel_pmc_ipc_command(PMC_IPC_PMC_TELEMTRY,
> + ret = intel_scu_ipc_dev_command(scu, IOSS_TELEM,
> IOSS_TELEM_EVENT_CTL_READ, NULL, 0,
> - &telem_ctrl, IOSS_TELEM_READ_WORD);
> + &telem_ctrl, sizeof(telem_ctrl));
> if (ret) {
> pr_err("IOSS TELEM_CTRL Read Failed\n");
> return ret;
> @@ -302,11 +297,9 @@ static int telemetry_setup_iossevtconfig(struct telemetry_evtconfig evtconfig,
> /* Disable Telemetry */
> TELEM_DISABLE(telem_ctrl);
>
> - ret = intel_pmc_ipc_command(PMC_IPC_PMC_TELEMTRY,
> - IOSS_TELEM_EVENT_CTL_WRITE,
> - (u8 *)&telem_ctrl,
> - IOSS_TELEM_EVT_CTRL_WRITE_SIZE,
> - NULL, 0);
> + ret = intel_scu_ipc_dev_command(scu, IOSS_TELEM,
> + IOSS_TELEM_EVENT_CTL_WRITE, &telem_ctrl,
> + sizeof(telem_ctrl), NULL, 0);
> if (ret) {
> pr_err("IOSS TELEM_CTRL Event Disable Write Failed\n");
> return ret;
> @@ -318,10 +311,9 @@ static int telemetry_setup_iossevtconfig(struct telemetry_evtconfig evtconfig,
> /* Clear All Events */
> TELEM_CLEAR_EVENTS(telem_ctrl);
>
> - ret = intel_pmc_ipc_command(PMC_IPC_PMC_TELEMTRY,
> + ret = intel_scu_ipc_dev_command(scu, IOSS_TELEM,
> IOSS_TELEM_EVENT_CTL_WRITE,
> - (u8 *)&telem_ctrl,
> - IOSS_TELEM_EVT_CTRL_WRITE_SIZE,
> + &telem_ctrl, sizeof(telem_ctrl),
> NULL, 0);
> if (ret) {
> pr_err("IOSS TELEM_CTRL Event Disable Write Failed\n");
> @@ -347,10 +339,9 @@ static int telemetry_setup_iossevtconfig(struct telemetry_evtconfig evtconfig,
> /* Clear All Events */
> TELEM_CLEAR_EVENTS(telem_ctrl);
>
> - ret = intel_pmc_ipc_command(PMC_IPC_PMC_TELEMTRY,
> + ret = intel_scu_ipc_dev_command(scu, IOSS_TELEM,
> IOSS_TELEM_EVENT_CTL_WRITE,
> - (u8 *)&telem_ctrl,
> - IOSS_TELEM_EVT_CTRL_WRITE_SIZE,
> + &telem_ctrl, sizeof(telem_ctrl),
> NULL, 0);
> if (ret) {
> pr_err("IOSS TELEM_CTRL Event Disable Write Failed\n");
> @@ -399,10 +390,9 @@ static int telemetry_setup_iossevtconfig(struct telemetry_evtconfig evtconfig,
> TELEM_ENABLE_PERIODIC(telem_ctrl);
> telem_ctrl |= ioss_period;
>
> - ret = intel_pmc_ipc_command(PMC_IPC_PMC_TELEMTRY,
> + ret = intel_scu_ipc_dev_command(scu, IOSS_TELEM,
> IOSS_TELEM_EVENT_CTL_WRITE,
> - (u8 *)&telem_ctrl,
> - IOSS_TELEM_EVT_CTRL_WRITE_SIZE, NULL, 0);
> + &telem_ctrl, sizeof(telem_ctrl), NULL, 0);
> if (ret) {
> pr_err("IOSS TELEM_CTRL Event Enable Write Failed\n");
> return ret;
> @@ -589,8 +579,9 @@ static int telemetry_setup(struct platform_device *pdev)
> u32 read_buf, events, event_regs;
> int ret;
>
> - ret = intel_pmc_ipc_command(PMC_IPC_PMC_TELEMTRY, IOSS_TELEM_INFO_READ,
> - NULL, 0, &read_buf, IOSS_TELEM_READ_WORD);
> + ret = intel_scu_ipc_dev_command(telm_conf->scu, IOSS_TELEM,
> + IOSS_TELEM_INFO_READ, NULL, 0,
> + &read_buf, sizeof(read_buf));
> if (ret) {
> dev_err(&pdev->dev, "IOSS TELEM_INFO Read Failed\n");
> return ret;
> @@ -684,6 +675,8 @@ static int telemetry_plt_set_sampling_period(u8 pss_period, u8 ioss_period)
>
> mutex_lock(&(telm_conf->telem_lock));
> if (ioss_period) {
> + struct intel_scu_ipc_dev *scu = telm_conf->scu;
> +
> if (TELEM_SAMPLE_PERIOD_INVALID(ioss_period)) {
> pr_err("IOSS Sampling Period Out of Range\n");
> ret = -EINVAL;
> @@ -691,9 +684,9 @@ static int telemetry_plt_set_sampling_period(u8 pss_period, u8 ioss_period)
> }
>
> /* Get telemetry EVENT CTL */
> - ret = intel_pmc_ipc_command(PMC_IPC_PMC_TELEMTRY,
> + ret = intel_scu_ipc_dev_command(scu, IOSS_TELEM,
> IOSS_TELEM_EVENT_CTL_READ, NULL, 0,
> - &telem_ctrl, IOSS_TELEM_READ_WORD);
> + &telem_ctrl, sizeof(telem_ctrl));
> if (ret) {
> pr_err("IOSS TELEM_CTRL Read Failed\n");
> goto out;
> @@ -702,11 +695,10 @@ static int telemetry_plt_set_sampling_period(u8 pss_period, u8 ioss_period)
> /* Disable Telemetry */
> TELEM_DISABLE(telem_ctrl);
>
> - ret = intel_pmc_ipc_command(PMC_IPC_PMC_TELEMTRY,
> - IOSS_TELEM_EVENT_CTL_WRITE,
> - (u8 *)&telem_ctrl,
> - IOSS_TELEM_EVT_CTRL_WRITE_SIZE,
> - NULL, 0);
> + ret = intel_scu_ipc_dev_command(scu, IOSS_TELEM,
> + IOSS_TELEM_EVENT_CTL_WRITE,
> + &telem_ctrl, sizeof(telem_ctrl),
> + NULL, 0);
> if (ret) {
> pr_err("IOSS TELEM_CTRL Event Disable Write Failed\n");
> goto out;
> @@ -718,11 +710,10 @@ static int telemetry_plt_set_sampling_period(u8 pss_period, u8 ioss_period)
> TELEM_ENABLE_PERIODIC(telem_ctrl);
> telem_ctrl |= ioss_period;
>
> - ret = intel_pmc_ipc_command(PMC_IPC_PMC_TELEMTRY,
> - IOSS_TELEM_EVENT_CTL_WRITE,
> - (u8 *)&telem_ctrl,
> - IOSS_TELEM_EVT_CTRL_WRITE_SIZE,
> - NULL, 0);
> + ret = intel_scu_ipc_dev_command(scu, IOSS_TELEM,
> + IOSS_TELEM_EVENT_CTL_WRITE,
> + &telem_ctrl, sizeof(telem_ctrl),
> + NULL, 0);
> if (ret) {
> pr_err("IOSS TELEM_CTRL Event Enable Write Failed\n");
> goto out;
> @@ -1017,9 +1008,9 @@ static int telemetry_plt_get_trace_verbosity(enum telemetry_unit telem_unit,
> break;
>
> case TELEM_IOSS:
> - ret = intel_pmc_ipc_command(PMC_IPC_PMC_TELEMTRY,
> - IOSS_TELEM_TRACE_CTL_READ, NULL, 0, &temp,
> - IOSS_TELEM_READ_WORD);
> + ret = intel_scu_ipc_dev_command(telm_conf->scu,
> + IOSS_TELEM, IOSS_TELEM_TRACE_CTL_READ,
> + NULL, 0, &temp, sizeof(temp));
> if (ret) {
> pr_err("IOSS TRACE_CTL Read Failed\n");
> goto out;
> @@ -1071,9 +1062,9 @@ static int telemetry_plt_set_trace_verbosity(enum telemetry_unit telem_unit,
> break;
>
> case TELEM_IOSS:
> - ret = intel_pmc_ipc_command(PMC_IPC_PMC_TELEMTRY,
> - IOSS_TELEM_TRACE_CTL_READ, NULL, 0, &temp,
> - IOSS_TELEM_READ_WORD);
> + ret = intel_scu_ipc_dev_command(telm_conf->scu, IOSS_TELEM,
> + IOSS_TELEM_TRACE_CTL_READ,
> + NULL, 0, &temp, sizeof(temp));
> if (ret) {
> pr_err("IOSS TRACE_CTL Read Failed\n");
> goto out;
> @@ -1082,9 +1073,9 @@ static int telemetry_plt_set_trace_verbosity(enum telemetry_unit telem_unit,
> TELEM_CLEAR_VERBOSITY_BITS(temp);
> TELEM_SET_VERBOSITY_BITS(temp, verbosity);
>
> - ret = intel_pmc_ipc_command(PMC_IPC_PMC_TELEMTRY,
> - IOSS_TELEM_TRACE_CTL_WRITE, (u8 *)&temp,
> - IOSS_TELEM_WRITE_FOURBYTES, NULL, 0);
> + ret = intel_scu_ipc_dev_command(telm_conf->scu, IOSS_TELEM,
> + IOSS_TELEM_TRACE_CTL_WRITE,
> + &temp, sizeof(temp), NULL, 0);
> if (ret) {
> pr_err("IOSS TRACE_CTL Verbosity Set Failed\n");
> goto out;
> @@ -1172,6 +1163,12 @@ static int telemetry_pltdrv_probe(struct platform_device *pdev)
> goto out;
> }
>
> + telm_conf->scu = intel_scu_ipc_dev_get();
> + if (!telm_conf->scu) {
> + ret = -ENOMEM;
> + goto out;
> + }
> +
> mutex_init(&telm_conf->telem_lock);
> mutex_init(&telm_conf->telem_trace_lock);
>
> @@ -1196,6 +1193,10 @@ static int telemetry_pltdrv_probe(struct platform_device *pdev)
> iounmap(telm_conf->pss_config.regmap);
> if (telm_conf->ioss_config.regmap)
> iounmap(telm_conf->ioss_config.regmap);
> + if (telm_conf->scu) {
> + intel_scu_ipc_dev_put(telm_conf->scu);
> + telm_conf->scu = NULL;
> + }
> dev_err(&pdev->dev, "TELEMETRY Setup Failed.\n");
>
> return ret;
> @@ -1204,6 +1205,8 @@ static int telemetry_pltdrv_probe(struct platform_device *pdev)
> static int telemetry_pltdrv_remove(struct platform_device *pdev)
> {
> telemetry_clear_pltdata();
> + intel_scu_ipc_dev_put(telm_conf->scu);
> + telm_conf->scu = NULL;
> iounmap(telm_conf->pss_config.regmap);
> iounmap(telm_conf->ioss_config.regmap);
>
> --
> 2.24.1
>

--
With Best Regards,
Andy Shevchenko