Re: [PATCH v5 19/20] cpufreq: add support for CPU DVFS based on SCMI message protocol

2018-02-22 Thread Sudeep Holla


On 22/02/18 09:04, Quentin Perret wrote:
> Hi Sudeep,
> 
> On Monday 12 Feb 2018 at 18:45:23 (+), Sudeep Holla wrote:
> [...]
>> +/*
>> + * perf_ops->freq_set is not a synchronous, the actual OPP change will
>> + * happen asynchronously and can get notified if the events are
>> + * subscribed for by the SCMI firmware
>> + */
>> +static int
>> +scmi_cpufreq_set_target(struct cpufreq_policy *policy, unsigned int index)
>> +{
>> +struct scmi_data *priv = policy->driver_data;
>> +struct scmi_perf_ops *perf_ops = handle->perf_ops;
>> +u64 freq = policy->freq_table[index].frequency * 1000;
>> +
>> +return perf_ops->freq_set(handle, priv->domain_id, freq, false);
>> +}
> 
> Is arch_set_freq_scale() needed in this function ?
> 

Yes indeed, already added locally[1] after Dietmar started the discussion.

-- 
Regards,
Sudeep

[1] https://git.kernel.org/sudeep.holla/linux/h/for-list/new_arm_scmi



Re: [PATCH v5 19/20] cpufreq: add support for CPU DVFS based on SCMI message protocol

2018-02-22 Thread Sudeep Holla


On 22/02/18 09:04, Quentin Perret wrote:
> Hi Sudeep,
> 
> On Monday 12 Feb 2018 at 18:45:23 (+), Sudeep Holla wrote:
> [...]
>> +/*
>> + * perf_ops->freq_set is not a synchronous, the actual OPP change will
>> + * happen asynchronously and can get notified if the events are
>> + * subscribed for by the SCMI firmware
>> + */
>> +static int
>> +scmi_cpufreq_set_target(struct cpufreq_policy *policy, unsigned int index)
>> +{
>> +struct scmi_data *priv = policy->driver_data;
>> +struct scmi_perf_ops *perf_ops = handle->perf_ops;
>> +u64 freq = policy->freq_table[index].frequency * 1000;
>> +
>> +return perf_ops->freq_set(handle, priv->domain_id, freq, false);
>> +}
> 
> Is arch_set_freq_scale() needed in this function ?
> 

Yes indeed, already added locally[1] after Dietmar started the discussion.

-- 
Regards,
Sudeep

[1] https://git.kernel.org/sudeep.holla/linux/h/for-list/new_arm_scmi



Re: [PATCH v5 19/20] cpufreq: add support for CPU DVFS based on SCMI message protocol

2018-02-22 Thread Quentin Perret
Hi Sudeep,

On Monday 12 Feb 2018 at 18:45:23 (+), Sudeep Holla wrote:
[...]
> +/*
> + * perf_ops->freq_set is not a synchronous, the actual OPP change will
> + * happen asynchronously and can get notified if the events are
> + * subscribed for by the SCMI firmware
> + */
> +static int
> +scmi_cpufreq_set_target(struct cpufreq_policy *policy, unsigned int index)
> +{
> + struct scmi_data *priv = policy->driver_data;
> + struct scmi_perf_ops *perf_ops = handle->perf_ops;
> + u64 freq = policy->freq_table[index].frequency * 1000;
> +
> + return perf_ops->freq_set(handle, priv->domain_id, freq, false);
> +}

Is arch_set_freq_scale() needed in this function ?

Thanks,
Quentin


Re: [PATCH v5 19/20] cpufreq: add support for CPU DVFS based on SCMI message protocol

2018-02-22 Thread Quentin Perret
Hi Sudeep,

On Monday 12 Feb 2018 at 18:45:23 (+), Sudeep Holla wrote:
[...]
> +/*
> + * perf_ops->freq_set is not a synchronous, the actual OPP change will
> + * happen asynchronously and can get notified if the events are
> + * subscribed for by the SCMI firmware
> + */
> +static int
> +scmi_cpufreq_set_target(struct cpufreq_policy *policy, unsigned int index)
> +{
> + struct scmi_data *priv = policy->driver_data;
> + struct scmi_perf_ops *perf_ops = handle->perf_ops;
> + u64 freq = policy->freq_table[index].frequency * 1000;
> +
> + return perf_ops->freq_set(handle, priv->domain_id, freq, false);
> +}

Is arch_set_freq_scale() needed in this function ?

Thanks,
Quentin


[PATCH v5 19/20] cpufreq: add support for CPU DVFS based on SCMI message protocol

2018-02-12 Thread Sudeep Holla
On some ARM based systems, a separate Cortex-M based System Control
Processor(SCP) provides the overall power, clock, reset and system
control including CPU DVFS. SCMI Message Protocol is used to
communicate with the SCP.

This patch adds a cpufreq driver for such systems using SCMI interface
to drive CPU DVFS.

Cc: linux...@vger.kernel.org
Acked-by: Rafael J. Wysocki 
Acked-by: Viresh Kumar 
Signed-off-by: Sudeep Holla 
---
 MAINTAINERS|   2 +-
 drivers/cpufreq/Kconfig.arm|  21 
 drivers/cpufreq/Makefile   |   1 +
 drivers/cpufreq/scmi-cpufreq.c | 249 +
 4 files changed, 272 insertions(+), 1 deletion(-)
 create mode 100644 drivers/cpufreq/scmi-cpufreq.c

diff --git a/MAINTAINERS b/MAINTAINERS
index d6e9e3eae5ac..ef766eb17f8d 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -13385,7 +13385,7 @@ L:  linux-arm-ker...@lists.infradead.org
 S: Maintained
 F: Documentation/devicetree/bindings/arm/arm,sc[mp]i.txt
 F: drivers/clk/clk-sc[mp]i.c
-F: drivers/cpufreq/scpi-cpufreq.c
+F: drivers/cpufreq/sc[mp]i-cpufreq.c
 F: drivers/firmware/arm_scpi.c
 F: drivers/firmware/arm_scmi/
 F: include/linux/sc[mp]i_protocol.h
diff --git a/drivers/cpufreq/Kconfig.arm b/drivers/cpufreq/Kconfig.arm
index 3a88e33b0cfe..4e1104b99f8b 100644
--- a/drivers/cpufreq/Kconfig.arm
+++ b/drivers/cpufreq/Kconfig.arm
@@ -238,6 +238,27 @@ config ARM_SA1100_CPUFREQ
 config ARM_SA1110_CPUFREQ
bool
 
+config ARM_SCMI_CPUFREQ
+   tristate "SCMI based CPUfreq driver"
+   depends on ARM_SCMI_PROTOCOL || COMPILE_TEST
+   select PM_OPP
+   help
+ This adds the CPUfreq driver support for ARM platforms using SCMI
+ protocol for CPU power management.
+
+ This driver uses SCMI Message Protocol driver to interact with the
+ firmware providing the CPU DVFS functionality.
+
+config ARM_SCPI_CPUFREQ
+tristate "SCPI based CPUfreq driver"
+   depends on ARM_BIG_LITTLE_CPUFREQ && ARM_SCPI_PROTOCOL && 
COMMON_CLK_SCPI
+help
+ This adds the CPUfreq driver support for ARM big.LITTLE platforms
+ using SCPI protocol for CPU power management.
+
+ This driver uses SCPI Message Protocol driver to interact with the
+ firmware providing the CPU DVFS functionality.
+
 config ARM_SPEAR_CPUFREQ
bool "SPEAr CPUFreq support"
depends on PLAT_SPEAR
diff --git a/drivers/cpufreq/Makefile b/drivers/cpufreq/Makefile
index c60c1e141d9d..4987227b67df 100644
--- a/drivers/cpufreq/Makefile
+++ b/drivers/cpufreq/Makefile
@@ -75,6 +75,7 @@ obj-$(CONFIG_ARM_S3C24XX_CPUFREQ_DEBUGFS) += 
s3c24xx-cpufreq-debugfs.o
 obj-$(CONFIG_ARM_S5PV210_CPUFREQ)  += s5pv210-cpufreq.o
 obj-$(CONFIG_ARM_SA1100_CPUFREQ)   += sa1100-cpufreq.o
 obj-$(CONFIG_ARM_SA1110_CPUFREQ)   += sa1110-cpufreq.o
+obj-$(CONFIG_ARM_SCMI_CPUFREQ) += scmi-cpufreq.o
 obj-$(CONFIG_ARM_SCPI_CPUFREQ) += scpi-cpufreq.o
 obj-$(CONFIG_ARM_SPEAR_CPUFREQ)+= spear-cpufreq.o
 obj-$(CONFIG_ARM_STI_CPUFREQ)  += sti-cpufreq.o
diff --git a/drivers/cpufreq/scmi-cpufreq.c b/drivers/cpufreq/scmi-cpufreq.c
new file mode 100644
index ..d6d35f7692b3
--- /dev/null
+++ b/drivers/cpufreq/scmi-cpufreq.c
@@ -0,0 +1,249 @@
+/*
+ * System Control and Power Interface (SCMI) based CPUFreq Interface driver
+ *
+ * Copyright (C) 2017 ARM Ltd.
+ * Sudeep Holla 
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed "as is" WITHOUT ANY WARRANTY of any
+ * kind, whether express or implied; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+struct scmi_data {
+   int domain_id;
+   struct device *cpu_dev;
+   struct thermal_cooling_device *cdev;
+};
+
+static const struct scmi_handle *handle;
+
+static unsigned int scmi_cpufreq_get_rate(unsigned int cpu)
+{
+   struct cpufreq_policy *policy = cpufreq_cpu_get_raw(cpu);
+   struct scmi_perf_ops *perf_ops = handle->perf_ops;
+   struct scmi_data *priv = policy->driver_data;
+   unsigned long rate;
+   int ret;
+
+   ret = perf_ops->freq_get(handle, priv->domain_id, , false);
+   if (ret)
+   return 0;
+   return rate / 1000;
+}
+
+/*
+ * perf_ops->freq_set is not a synchronous, the actual OPP change will
+ * happen asynchronously and can get notified if the events are
+ * subscribed for by the SCMI firmware
+ */
+static int

[PATCH v5 19/20] cpufreq: add support for CPU DVFS based on SCMI message protocol

2018-02-12 Thread Sudeep Holla
On some ARM based systems, a separate Cortex-M based System Control
Processor(SCP) provides the overall power, clock, reset and system
control including CPU DVFS. SCMI Message Protocol is used to
communicate with the SCP.

This patch adds a cpufreq driver for such systems using SCMI interface
to drive CPU DVFS.

Cc: linux...@vger.kernel.org
Acked-by: Rafael J. Wysocki 
Acked-by: Viresh Kumar 
Signed-off-by: Sudeep Holla 
---
 MAINTAINERS|   2 +-
 drivers/cpufreq/Kconfig.arm|  21 
 drivers/cpufreq/Makefile   |   1 +
 drivers/cpufreq/scmi-cpufreq.c | 249 +
 4 files changed, 272 insertions(+), 1 deletion(-)
 create mode 100644 drivers/cpufreq/scmi-cpufreq.c

diff --git a/MAINTAINERS b/MAINTAINERS
index d6e9e3eae5ac..ef766eb17f8d 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -13385,7 +13385,7 @@ L:  linux-arm-ker...@lists.infradead.org
 S: Maintained
 F: Documentation/devicetree/bindings/arm/arm,sc[mp]i.txt
 F: drivers/clk/clk-sc[mp]i.c
-F: drivers/cpufreq/scpi-cpufreq.c
+F: drivers/cpufreq/sc[mp]i-cpufreq.c
 F: drivers/firmware/arm_scpi.c
 F: drivers/firmware/arm_scmi/
 F: include/linux/sc[mp]i_protocol.h
diff --git a/drivers/cpufreq/Kconfig.arm b/drivers/cpufreq/Kconfig.arm
index 3a88e33b0cfe..4e1104b99f8b 100644
--- a/drivers/cpufreq/Kconfig.arm
+++ b/drivers/cpufreq/Kconfig.arm
@@ -238,6 +238,27 @@ config ARM_SA1100_CPUFREQ
 config ARM_SA1110_CPUFREQ
bool
 
+config ARM_SCMI_CPUFREQ
+   tristate "SCMI based CPUfreq driver"
+   depends on ARM_SCMI_PROTOCOL || COMPILE_TEST
+   select PM_OPP
+   help
+ This adds the CPUfreq driver support for ARM platforms using SCMI
+ protocol for CPU power management.
+
+ This driver uses SCMI Message Protocol driver to interact with the
+ firmware providing the CPU DVFS functionality.
+
+config ARM_SCPI_CPUFREQ
+tristate "SCPI based CPUfreq driver"
+   depends on ARM_BIG_LITTLE_CPUFREQ && ARM_SCPI_PROTOCOL && 
COMMON_CLK_SCPI
+help
+ This adds the CPUfreq driver support for ARM big.LITTLE platforms
+ using SCPI protocol for CPU power management.
+
+ This driver uses SCPI Message Protocol driver to interact with the
+ firmware providing the CPU DVFS functionality.
+
 config ARM_SPEAR_CPUFREQ
bool "SPEAr CPUFreq support"
depends on PLAT_SPEAR
diff --git a/drivers/cpufreq/Makefile b/drivers/cpufreq/Makefile
index c60c1e141d9d..4987227b67df 100644
--- a/drivers/cpufreq/Makefile
+++ b/drivers/cpufreq/Makefile
@@ -75,6 +75,7 @@ obj-$(CONFIG_ARM_S3C24XX_CPUFREQ_DEBUGFS) += 
s3c24xx-cpufreq-debugfs.o
 obj-$(CONFIG_ARM_S5PV210_CPUFREQ)  += s5pv210-cpufreq.o
 obj-$(CONFIG_ARM_SA1100_CPUFREQ)   += sa1100-cpufreq.o
 obj-$(CONFIG_ARM_SA1110_CPUFREQ)   += sa1110-cpufreq.o
+obj-$(CONFIG_ARM_SCMI_CPUFREQ) += scmi-cpufreq.o
 obj-$(CONFIG_ARM_SCPI_CPUFREQ) += scpi-cpufreq.o
 obj-$(CONFIG_ARM_SPEAR_CPUFREQ)+= spear-cpufreq.o
 obj-$(CONFIG_ARM_STI_CPUFREQ)  += sti-cpufreq.o
diff --git a/drivers/cpufreq/scmi-cpufreq.c b/drivers/cpufreq/scmi-cpufreq.c
new file mode 100644
index ..d6d35f7692b3
--- /dev/null
+++ b/drivers/cpufreq/scmi-cpufreq.c
@@ -0,0 +1,249 @@
+/*
+ * System Control and Power Interface (SCMI) based CPUFreq Interface driver
+ *
+ * Copyright (C) 2017 ARM Ltd.
+ * Sudeep Holla 
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed "as is" WITHOUT ANY WARRANTY of any
+ * kind, whether express or implied; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+struct scmi_data {
+   int domain_id;
+   struct device *cpu_dev;
+   struct thermal_cooling_device *cdev;
+};
+
+static const struct scmi_handle *handle;
+
+static unsigned int scmi_cpufreq_get_rate(unsigned int cpu)
+{
+   struct cpufreq_policy *policy = cpufreq_cpu_get_raw(cpu);
+   struct scmi_perf_ops *perf_ops = handle->perf_ops;
+   struct scmi_data *priv = policy->driver_data;
+   unsigned long rate;
+   int ret;
+
+   ret = perf_ops->freq_get(handle, priv->domain_id, , false);
+   if (ret)
+   return 0;
+   return rate / 1000;
+}
+
+/*
+ * perf_ops->freq_set is not a synchronous, the actual OPP change will
+ * happen asynchronously and can get notified if the events are
+ * subscribed for by the SCMI firmware
+ */
+static int
+scmi_cpufreq_set_target(struct cpufreq_policy *policy, unsigned int index)
+{
+   struct scmi_data *priv = 

[PATCH v5 19/20] cpufreq: add support for CPU DVFS based on SCMI message protocol

2018-01-02 Thread Sudeep Holla
On some ARM based systems, a separate Cortex-M based System Control
Processor(SCP) provides the overall power, clock, reset and system
control including CPU DVFS. SCMI Message Protocol is used to
communicate with the SCP.

This patch adds a cpufreq driver for such systems using SCMI interface
to drive CPU DVFS.

Cc: linux...@vger.kernel.org
Acked-by: Rafael J. Wysocki 
Acked-by: Viresh Kumar 
Signed-off-by: Sudeep Holla 
---
 MAINTAINERS|   2 +-
 drivers/cpufreq/Kconfig.arm|  11 ++
 drivers/cpufreq/Makefile   |   1 +
 drivers/cpufreq/scmi-cpufreq.c | 270 +
 4 files changed, 283 insertions(+), 1 deletion(-)
 create mode 100644 drivers/cpufreq/scmi-cpufreq.c

diff --git a/MAINTAINERS b/MAINTAINERS
index d961de6aa0fd..d885824346a0 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -13155,7 +13155,7 @@ L:  linux-arm-ker...@lists.infradead.org
 S: Maintained
 F: Documentation/devicetree/bindings/arm/arm,sc[mp]i.txt
 F: drivers/clk/clk-sc[mp]i.c
-F: drivers/cpufreq/scpi-cpufreq.c
+F: drivers/cpufreq/sc[mp]i-cpufreq.c
 F: drivers/firmware/arm_scpi.c
 F: drivers/firmware/arm_scmi/
 F: include/linux/sc[mp]i_protocol.h
diff --git a/drivers/cpufreq/Kconfig.arm b/drivers/cpufreq/Kconfig.arm
index bdce4488ded1..e21f84cbd9b4 100644
--- a/drivers/cpufreq/Kconfig.arm
+++ b/drivers/cpufreq/Kconfig.arm
@@ -205,6 +205,17 @@ config ARM_SA1100_CPUFREQ
 config ARM_SA1110_CPUFREQ
bool
 
+config ARM_SCMI_CPUFREQ
+   tristate "SCMI based CPUfreq driver"
+   depends on ARM_SCMI_PROTOCOL || COMPILE_TEST
+   select PM_OPP
+   help
+ This adds the CPUfreq driver support for ARM platforms using SCMI
+ protocol for CPU power management.
+
+ This driver uses SCMI Message Protocol driver to interact with the
+ firmware providing the CPU DVFS functionality.
+
 config ARM_SCPI_CPUFREQ
 tristate "SCPI based CPUfreq driver"
depends on ARM_BIG_LITTLE_CPUFREQ && ARM_SCPI_PROTOCOL && 
COMMON_CLK_SCPI
diff --git a/drivers/cpufreq/Makefile b/drivers/cpufreq/Makefile
index 812f9e0d01a3..21ed72b78c84 100644
--- a/drivers/cpufreq/Makefile
+++ b/drivers/cpufreq/Makefile
@@ -72,6 +72,7 @@ obj-$(CONFIG_ARM_S3C64XX_CPUFREQ) += s3c64xx-cpufreq.o
 obj-$(CONFIG_ARM_S5PV210_CPUFREQ)  += s5pv210-cpufreq.o
 obj-$(CONFIG_ARM_SA1100_CPUFREQ)   += sa1100-cpufreq.o
 obj-$(CONFIG_ARM_SA1110_CPUFREQ)   += sa1110-cpufreq.o
+obj-$(CONFIG_ARM_SCMI_CPUFREQ) += scmi-cpufreq.o
 obj-$(CONFIG_ARM_SCPI_CPUFREQ) += scpi-cpufreq.o
 obj-$(CONFIG_ARM_SPEAR_CPUFREQ)+= spear-cpufreq.o
 obj-$(CONFIG_ARM_STI_CPUFREQ)  += sti-cpufreq.o
diff --git a/drivers/cpufreq/scmi-cpufreq.c b/drivers/cpufreq/scmi-cpufreq.c
new file mode 100644
index ..0ee9335d0063
--- /dev/null
+++ b/drivers/cpufreq/scmi-cpufreq.c
@@ -0,0 +1,270 @@
+/*
+ * System Control and Power Interface (SCMI) based CPUFreq Interface driver
+ *
+ * Copyright (C) 2017 ARM Ltd.
+ * Sudeep Holla 
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed "as is" WITHOUT ANY WARRANTY of any
+ * kind, whether express or implied; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+struct scmi_data {
+   int domain_id;
+   struct device *cpu_dev;
+   struct thermal_cooling_device *cdev;
+};
+
+static const struct scmi_handle *handle;
+
+static unsigned int scmi_cpufreq_get_rate(unsigned int cpu)
+{
+   struct cpufreq_policy *policy = cpufreq_cpu_get_raw(cpu);
+   struct scmi_perf_ops *perf_ops = handle->perf_ops;
+   struct scmi_data *priv = policy->driver_data;
+   unsigned long rate;
+   int ret;
+
+   ret = perf_ops->freq_get(handle, priv->domain_id, , false);
+   if (ret)
+   return 0;
+   return rate / 1000;
+}
+
+/*
+ * perf_ops->freq_set is not a synchronous, the actual OPP change will
+ * happen asynchronously and can get notified if the events are
+ * subscribed for by the SCMI firmware
+ */
+static int
+scmi_cpufreq_set_target(struct cpufreq_policy *policy, unsigned int index)
+{
+   struct scmi_data *priv = policy->driver_data;
+   struct scmi_perf_ops *perf_ops = handle->perf_ops;
+   u64 freq = policy->freq_table[index].frequency * 1000;
+
+   return perf_ops->freq_set(handle, priv->domain_id, freq, false);
+}
+
+static int
+scmi_get_sharing_cpus(struct device *cpu_dev, struct cpumask 

[PATCH v5 19/20] cpufreq: add support for CPU DVFS based on SCMI message protocol

2018-01-02 Thread Sudeep Holla
On some ARM based systems, a separate Cortex-M based System Control
Processor(SCP) provides the overall power, clock, reset and system
control including CPU DVFS. SCMI Message Protocol is used to
communicate with the SCP.

This patch adds a cpufreq driver for such systems using SCMI interface
to drive CPU DVFS.

Cc: linux...@vger.kernel.org
Acked-by: Rafael J. Wysocki 
Acked-by: Viresh Kumar 
Signed-off-by: Sudeep Holla 
---
 MAINTAINERS|   2 +-
 drivers/cpufreq/Kconfig.arm|  11 ++
 drivers/cpufreq/Makefile   |   1 +
 drivers/cpufreq/scmi-cpufreq.c | 270 +
 4 files changed, 283 insertions(+), 1 deletion(-)
 create mode 100644 drivers/cpufreq/scmi-cpufreq.c

diff --git a/MAINTAINERS b/MAINTAINERS
index d961de6aa0fd..d885824346a0 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -13155,7 +13155,7 @@ L:  linux-arm-ker...@lists.infradead.org
 S: Maintained
 F: Documentation/devicetree/bindings/arm/arm,sc[mp]i.txt
 F: drivers/clk/clk-sc[mp]i.c
-F: drivers/cpufreq/scpi-cpufreq.c
+F: drivers/cpufreq/sc[mp]i-cpufreq.c
 F: drivers/firmware/arm_scpi.c
 F: drivers/firmware/arm_scmi/
 F: include/linux/sc[mp]i_protocol.h
diff --git a/drivers/cpufreq/Kconfig.arm b/drivers/cpufreq/Kconfig.arm
index bdce4488ded1..e21f84cbd9b4 100644
--- a/drivers/cpufreq/Kconfig.arm
+++ b/drivers/cpufreq/Kconfig.arm
@@ -205,6 +205,17 @@ config ARM_SA1100_CPUFREQ
 config ARM_SA1110_CPUFREQ
bool
 
+config ARM_SCMI_CPUFREQ
+   tristate "SCMI based CPUfreq driver"
+   depends on ARM_SCMI_PROTOCOL || COMPILE_TEST
+   select PM_OPP
+   help
+ This adds the CPUfreq driver support for ARM platforms using SCMI
+ protocol for CPU power management.
+
+ This driver uses SCMI Message Protocol driver to interact with the
+ firmware providing the CPU DVFS functionality.
+
 config ARM_SCPI_CPUFREQ
 tristate "SCPI based CPUfreq driver"
depends on ARM_BIG_LITTLE_CPUFREQ && ARM_SCPI_PROTOCOL && 
COMMON_CLK_SCPI
diff --git a/drivers/cpufreq/Makefile b/drivers/cpufreq/Makefile
index 812f9e0d01a3..21ed72b78c84 100644
--- a/drivers/cpufreq/Makefile
+++ b/drivers/cpufreq/Makefile
@@ -72,6 +72,7 @@ obj-$(CONFIG_ARM_S3C64XX_CPUFREQ) += s3c64xx-cpufreq.o
 obj-$(CONFIG_ARM_S5PV210_CPUFREQ)  += s5pv210-cpufreq.o
 obj-$(CONFIG_ARM_SA1100_CPUFREQ)   += sa1100-cpufreq.o
 obj-$(CONFIG_ARM_SA1110_CPUFREQ)   += sa1110-cpufreq.o
+obj-$(CONFIG_ARM_SCMI_CPUFREQ) += scmi-cpufreq.o
 obj-$(CONFIG_ARM_SCPI_CPUFREQ) += scpi-cpufreq.o
 obj-$(CONFIG_ARM_SPEAR_CPUFREQ)+= spear-cpufreq.o
 obj-$(CONFIG_ARM_STI_CPUFREQ)  += sti-cpufreq.o
diff --git a/drivers/cpufreq/scmi-cpufreq.c b/drivers/cpufreq/scmi-cpufreq.c
new file mode 100644
index ..0ee9335d0063
--- /dev/null
+++ b/drivers/cpufreq/scmi-cpufreq.c
@@ -0,0 +1,270 @@
+/*
+ * System Control and Power Interface (SCMI) based CPUFreq Interface driver
+ *
+ * Copyright (C) 2017 ARM Ltd.
+ * Sudeep Holla 
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed "as is" WITHOUT ANY WARRANTY of any
+ * kind, whether express or implied; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+struct scmi_data {
+   int domain_id;
+   struct device *cpu_dev;
+   struct thermal_cooling_device *cdev;
+};
+
+static const struct scmi_handle *handle;
+
+static unsigned int scmi_cpufreq_get_rate(unsigned int cpu)
+{
+   struct cpufreq_policy *policy = cpufreq_cpu_get_raw(cpu);
+   struct scmi_perf_ops *perf_ops = handle->perf_ops;
+   struct scmi_data *priv = policy->driver_data;
+   unsigned long rate;
+   int ret;
+
+   ret = perf_ops->freq_get(handle, priv->domain_id, , false);
+   if (ret)
+   return 0;
+   return rate / 1000;
+}
+
+/*
+ * perf_ops->freq_set is not a synchronous, the actual OPP change will
+ * happen asynchronously and can get notified if the events are
+ * subscribed for by the SCMI firmware
+ */
+static int
+scmi_cpufreq_set_target(struct cpufreq_policy *policy, unsigned int index)
+{
+   struct scmi_data *priv = policy->driver_data;
+   struct scmi_perf_ops *perf_ops = handle->perf_ops;
+   u64 freq = policy->freq_table[index].frequency * 1000;
+
+   return perf_ops->freq_set(handle, priv->domain_id, freq, false);
+}
+
+static int
+scmi_get_sharing_cpus(struct device *cpu_dev, struct cpumask *cpumask)
+{
+   int cpu, domain, tdomain;
+   struct device *tcpu_dev;
+
+   domain =