Loading drivers/cpufreq/qcom-cpufreq-hw.c +20 −5 Original line number Diff line number Diff line Loading @@ -108,13 +108,25 @@ static ssize_t dcvsh_freq_limit_show(struct device *dev, return scnprintf(buf, PAGE_SIZE, "%lu\n", c->dcvsh_freq_limit); } static unsigned long limits_mitigation_notify(struct cpufreq_qcom *c) static unsigned long limits_mitigation_notify(struct cpufreq_qcom *c, bool limit) { struct cpufreq_policy *policy; u32 cpu; unsigned long freq; if (limit) { freq = readl_relaxed(c->base + offsets[REG_DOMAIN_STATE]) & GENMASK(7, 0); freq = DIV_ROUND_CLOSEST_ULL(freq * xo_rate, 1000); } else { cpu = cpumask_first(&c->related_cpus); policy = cpufreq_cpu_get_raw(cpu); if (!policy) freq = U32_MAX; else freq = policy->cpuinfo.max_freq; } sched_update_cpu_freq_min_max(&c->related_cpus, 0, freq); trace_dcvsh_freq(cpumask_first(&c->related_cpus), freq); Loading @@ -134,7 +146,7 @@ static void limits_dcvsh_poll(struct work_struct *work) cpu = cpumask_first(&c->related_cpus); freq_limit = limits_mitigation_notify(c); freq_limit = limits_mitigation_notify(c, true); dcvsh_freq = qcom_cpufreq_hw_get(cpu); Loading @@ -142,6 +154,9 @@ static void limits_dcvsh_poll(struct work_struct *work) mod_delayed_work(system_highpri_wq, &c->freq_poll_work, msecs_to_jiffies(LIMITS_POLLING_DELAY_MS)); } else { /* Update scheduler for throttle removal */ limits_mitigation_notify(c, false); regval = readl_relaxed(c->base + offsets[REG_INTR_CLR]); regval |= GT_IRQ_STATUS; writel_relaxed(regval, c->base + offsets[REG_INTR_CLR]); Loading @@ -167,7 +182,7 @@ static irqreturn_t dcvsh_handle_isr(int irq, void *data) if (c->is_irq_enabled) { c->is_irq_enabled = false; disable_irq_nosync(c->dcvsh_irq); limits_mitigation_notify(c); limits_mitigation_notify(c, true); mod_delayed_work(system_highpri_wq, &c->freq_poll_work, msecs_to_jiffies(LIMITS_POLLING_DELAY_MS)); Loading Loading
drivers/cpufreq/qcom-cpufreq-hw.c +20 −5 Original line number Diff line number Diff line Loading @@ -108,13 +108,25 @@ static ssize_t dcvsh_freq_limit_show(struct device *dev, return scnprintf(buf, PAGE_SIZE, "%lu\n", c->dcvsh_freq_limit); } static unsigned long limits_mitigation_notify(struct cpufreq_qcom *c) static unsigned long limits_mitigation_notify(struct cpufreq_qcom *c, bool limit) { struct cpufreq_policy *policy; u32 cpu; unsigned long freq; if (limit) { freq = readl_relaxed(c->base + offsets[REG_DOMAIN_STATE]) & GENMASK(7, 0); freq = DIV_ROUND_CLOSEST_ULL(freq * xo_rate, 1000); } else { cpu = cpumask_first(&c->related_cpus); policy = cpufreq_cpu_get_raw(cpu); if (!policy) freq = U32_MAX; else freq = policy->cpuinfo.max_freq; } sched_update_cpu_freq_min_max(&c->related_cpus, 0, freq); trace_dcvsh_freq(cpumask_first(&c->related_cpus), freq); Loading @@ -134,7 +146,7 @@ static void limits_dcvsh_poll(struct work_struct *work) cpu = cpumask_first(&c->related_cpus); freq_limit = limits_mitigation_notify(c); freq_limit = limits_mitigation_notify(c, true); dcvsh_freq = qcom_cpufreq_hw_get(cpu); Loading @@ -142,6 +154,9 @@ static void limits_dcvsh_poll(struct work_struct *work) mod_delayed_work(system_highpri_wq, &c->freq_poll_work, msecs_to_jiffies(LIMITS_POLLING_DELAY_MS)); } else { /* Update scheduler for throttle removal */ limits_mitigation_notify(c, false); regval = readl_relaxed(c->base + offsets[REG_INTR_CLR]); regval |= GT_IRQ_STATUS; writel_relaxed(regval, c->base + offsets[REG_INTR_CLR]); Loading @@ -167,7 +182,7 @@ static irqreturn_t dcvsh_handle_isr(int irq, void *data) if (c->is_irq_enabled) { c->is_irq_enabled = false; disable_irq_nosync(c->dcvsh_irq); limits_mitigation_notify(c); limits_mitigation_notify(c, true); mod_delayed_work(system_highpri_wq, &c->freq_poll_work, msecs_to_jiffies(LIMITS_POLLING_DELAY_MS)); Loading