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