Quoting Maulik Shah (2020-04-05 23:32:19)Okay i will remove 'do' from this line.
Add changes to invoke rpmh flush() from CPU PM notification.Controllers that have 'HW solver' mode don't need to register? The 'do
This is done when the last the cpu is entering power collapse and
controller is not busy.
Controllers that do have 'HW solver' mode do not need to register
have' is throwing me off.
for CPU PM notification. They may be in autonomous mode executing[...]
low power mode and do not require rpmh_flush() to happen from CPU
PM notification.
Signed-off-by: Maulik Shah <mkshah@xxxxxxxxxxxxxx>
Reviewed-by: Douglas Anderson <dianders@xxxxxxxxxxxx>
---
drivers/soc/qcom/rpmh-internal.h | 25 +++++---
drivers/soc/qcom/rpmh-rsc.c | 123 +++++++++++++++++++++++++++++++++++----
drivers/soc/qcom/rpmh.c | 26 +++------
3 files changed, 137 insertions(+), 37 deletions(-)
diff --git a/drivers/soc/qcom/rpmh-rsc.c b/drivers/soc/qcom/rpmh-rsc.c
index b718221..fbe1f3e 100644
--- a/drivers/soc/qcom/rpmh-rsc.c
+++ b/drivers/soc/qcom/rpmh-rsc.c
@@ -6,6 +6,7 @@
+I thought CPU_PM notifiers weren't supposed to be used anymore? Or at
+static int rpmh_rsc_cpu_pm_callback(struct notifier_block *nfb,
+ unsigned long action, void *v)
+{
+ struct rsc_drv *drv = container_of(nfb, struct rsc_drv, rsc_pm);
+ int ret = NOTIFY_OK;
+
+ spin_lock(&drv->pm_lock);
+
+ switch (action) {
+ case CPU_PM_ENTER:
least, the genpd work that has gone on for cpuidle could be used here in
place of CPU_PM notifiers?
And so this isn't actually any differentYes, seems it will work as well. I will change to use smp_processor_id().
than what was proposed originally to use genpd for this?
+ cpumask_set_cpu(raw_smp_processor_id(),Why do we need to use raw_smp_processor_id()? smp_processor_id() should
work just as well?
Thanks,
+ &drv->cpus_entered_pm);
+
+ if (!cpumask_equal(&drv->cpus_entered_pm, cpu_online_mask))
+ goto exit;
+ break;
+ case CPU_PM_ENTER_FAILED:
+ case CPU_PM_EXIT:
+ cpumask_clear_cpu(raw_smp_processor_id(),
+ &drv->cpus_entered_pm);
+ goto exit;
+ }
+
+ ret = rpmh_rsc_ctrlr_is_busy(drv);
+ if (ret) {
+ ret = NOTIFY_BAD;
+ goto exit;
+ }
+
+ ret = rpmh_flush(&drv->client);
+ if (ret)
+ ret = NOTIFY_BAD;
+ else
+ ret = NOTIFY_OK;
+
+exit:
+ spin_unlock(&drv->pm_lock);
+ return ret;
+}
+