From: Shawn Guo <shawn.guo-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> To: "Shilimkar, Santosh" <santosh.shilimkar-l0cyMroinI0@public.gmane.org> Cc: Kevin Hilman <khilman-l0cyMroinI0@public.gmane.org>, Nishanth Menon <nm-l0cyMroinI0@public.gmane.org>, Mike Turquette <mturquette-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>, linux-pm-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org, cpufreq-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, "Rafael J. Wysocki" <rjw-KKrjLPT3xs0@public.gmane.org>, Richard Zhao <richard.zhao-KZfg59tc24xl57MIdRCFDg@public.gmane.org>, Russell King - ARM Linux <linux-lFZ/pmaqli7XmaaqVzeoHQ@public.gmane.org>, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org Subject: Re: [PATCH 3/3] cpufreq: Add a generic cpufreq-cpu0 driver Date: Fri, 20 Jul 2012 20:33:19 +0800 [thread overview] Message-ID: <20120720123317.GA32263@S2101-09.ap.freescale.net> (raw) In-Reply-To: <CAMQu2gw32LogXJJa+K5ZjmCZzBNK3FY2wYwZXU8fsftsVzEO2Q-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org> Thanks for the reviewing, Santosh. On Fri, Jul 20, 2012 at 12:22:14PM +0530, Shilimkar, Santosh wrote: > > +config GENERIC_CPUFREQ_CPU0 > > + bool "Generic cpufreq driver for CPU0" > > + depends on HAVE_CLK && REGULATOR && PM_OPP && OF > > + select CPU_FREQ_TABLE > > + help > > + This adds a generic cpufreq driver for CPU0 frequency management. > > + It supports both uniprocessor (UP) and symmetric multiprocessor (SMP) > > + systems which share clock and voltage across all CPUs. > > + > > + If in doubt, say N. > > + > This *_CPU0 doesn't seems to be appropriate since this infrastructure will be > used on SMP systems where CPUs shares clock/voltage rails. May be you can > get rid of that unless there is a strong need. > All the resource handlers, clk, regulator, opp, DT node, are retrieved from CPU0 device even for SMP. I hope the naming of the driver could tell: - The driver supports UP - The driver supports SMP where CPUs shares clock/voltage rails by managing CPU0 (resource) - The driver does not support SMP where individual CPU can scale clock/voltage independently. I also thought about naming the driver cpufreq-coupled, but the name misses the implication of UP support somehow, so I chose cpufreq-cpu0. > > +static int cpu0_set_target(struct cpufreq_policy *policy, > > + unsigned int target_freq, unsigned int relation) > > +{ > > + struct cpufreq_freqs freqs; > > + struct opp *opp; > > + unsigned long freq_Hz, volt = 0, volt_old = 0, tol = 0; > > + unsigned int index, cpu; > > + int ret = 0; > > + > > + ret = cpufreq_frequency_table_target(policy, freq_table, target_freq, > > + relation, &index); > > + if (ret) { > > + pr_err("failed to match target freqency %d: %d\n", > > + target_freq, ret); > > + return ret; > > + } > > + > > + freq_Hz = clk_round_rate(cpu_clk, freq_table[index].frequency * 1000); > > + if (freq_Hz < 0) > > + freq_Hz = freq_table[index].frequency * 1000; > > + freqs.new = freq_Hz / 1000; > > + freqs.old = clk_get_rate(cpu_clk) / 1000; > > + > > + if (freqs.old == freqs.new) > > + return 0; > > + > > + for_each_cpu(cpu, policy->cpus) { > You need for_each_online_cpu() here o.w you will end up calling the > notifier on CPU which is are hot-plugged out or not online yet. > Yes, that's sensible. Since we have all the CPUs set in policy->cpus in this driver, we do not have to enumerate policy->cpus, and checking online CPUs should be better for the cases you mentioned. > > + freqs.cpu = cpu; > > + cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); > > + } > > + > > + if (cpu_reg) { > > + opp = opp_find_freq_ceil(cpu_dev, &freq_Hz); > > + if (IS_ERR(opp)) { > > + pr_err("failed to find OPP for %ld\n", freq_Hz); > > + return PTR_ERR(opp); > > + } > > + volt = opp_get_voltage(opp); > > + tol = volt * voltage_tolerance / 100; > > + volt_old = regulator_get_voltage(cpu_reg); > > + } > > + > > + pr_debug("%u MHz, %ld mV --> %u MHz, %ld mV\n", > > + freqs.old / 1000, volt_old ? volt_old / 1000 : -1, > > + freqs.new / 1000, volt ? volt / 1000 : -1); > > + > > + /* scaling up? scale voltage before frequency */ > > + if (cpu_reg && freqs.new > freqs.old) { > > + if (regulator_set_voltage(cpu_reg, volt - tol, volt + tol)) { > > + pr_warn("Unable to scale voltage up\n"); > > + freqs.new = freqs.old; > > + goto done; > Do you need a POST notifier in case of the failure ? > Honestly, I'm not quite sure about that. This is a piece of code reused from omap-cpufreq driver. Looking at cpufreq_notify_transition, it seems to me that the POST notifier is not really necessary for failure case. > > +static struct cpufreq_driver cpu0_cpufreq_driver = { > > + .flags = CPUFREQ_STICKY, > > + .verify = cpu0_verify_speed, > > + .target = cpu0_set_target, > > + .get = cpu0_get_speed, > > + .init = cpu0_cpufreq_init, > > + .exit = cpu0_cpufreq_exit, > > + .name = "generic_cpu0", > > + .attr = cpu0_cpufreq_attr, > > +}; > > + > > +static int __devinit cpu0_cpufreq_driver_init(void) > > +{ > > + return cpufreq_register_driver(&cpu0_cpufreq_driver); > > +} > > +late_initcall(cpu0_cpufreq_driver_init); > > Can you also add support to build this as loadable module ? > I'm just following the common pattern of ARM cpufreq drivers to have CPUFREQ_STICKY set in cpufreq_driver.flag and use "bool" for the driver Kconfig. I'm not sure about the necessity of building this as a module. -- Regards, Shawn
WARNING: multiple messages have this Message-ID (diff)
From: shawn.guo@linaro.org (Shawn Guo) To: linux-arm-kernel@lists.infradead.org Subject: [PATCH 3/3] cpufreq: Add a generic cpufreq-cpu0 driver Date: Fri, 20 Jul 2012 20:33:19 +0800 [thread overview] Message-ID: <20120720123317.GA32263@S2101-09.ap.freescale.net> (raw) In-Reply-To: <CAMQu2gw32LogXJJa+K5ZjmCZzBNK3FY2wYwZXU8fsftsVzEO2Q@mail.gmail.com> Thanks for the reviewing, Santosh. On Fri, Jul 20, 2012 at 12:22:14PM +0530, Shilimkar, Santosh wrote: > > +config GENERIC_CPUFREQ_CPU0 > > + bool "Generic cpufreq driver for CPU0" > > + depends on HAVE_CLK && REGULATOR && PM_OPP && OF > > + select CPU_FREQ_TABLE > > + help > > + This adds a generic cpufreq driver for CPU0 frequency management. > > + It supports both uniprocessor (UP) and symmetric multiprocessor (SMP) > > + systems which share clock and voltage across all CPUs. > > + > > + If in doubt, say N. > > + > This *_CPU0 doesn't seems to be appropriate since this infrastructure will be > used on SMP systems where CPUs shares clock/voltage rails. May be you can > get rid of that unless there is a strong need. > All the resource handlers, clk, regulator, opp, DT node, are retrieved from CPU0 device even for SMP. I hope the naming of the driver could tell: - The driver supports UP - The driver supports SMP where CPUs shares clock/voltage rails by managing CPU0 (resource) - The driver does not support SMP where individual CPU can scale clock/voltage independently. I also thought about naming the driver cpufreq-coupled, but the name misses the implication of UP support somehow, so I chose cpufreq-cpu0. > > +static int cpu0_set_target(struct cpufreq_policy *policy, > > + unsigned int target_freq, unsigned int relation) > > +{ > > + struct cpufreq_freqs freqs; > > + struct opp *opp; > > + unsigned long freq_Hz, volt = 0, volt_old = 0, tol = 0; > > + unsigned int index, cpu; > > + int ret = 0; > > + > > + ret = cpufreq_frequency_table_target(policy, freq_table, target_freq, > > + relation, &index); > > + if (ret) { > > + pr_err("failed to match target freqency %d: %d\n", > > + target_freq, ret); > > + return ret; > > + } > > + > > + freq_Hz = clk_round_rate(cpu_clk, freq_table[index].frequency * 1000); > > + if (freq_Hz < 0) > > + freq_Hz = freq_table[index].frequency * 1000; > > + freqs.new = freq_Hz / 1000; > > + freqs.old = clk_get_rate(cpu_clk) / 1000; > > + > > + if (freqs.old == freqs.new) > > + return 0; > > + > > + for_each_cpu(cpu, policy->cpus) { > You need for_each_online_cpu() here o.w you will end up calling the > notifier on CPU which is are hot-plugged out or not online yet. > Yes, that's sensible. Since we have all the CPUs set in policy->cpus in this driver, we do not have to enumerate policy->cpus, and checking online CPUs should be better for the cases you mentioned. > > + freqs.cpu = cpu; > > + cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); > > + } > > + > > + if (cpu_reg) { > > + opp = opp_find_freq_ceil(cpu_dev, &freq_Hz); > > + if (IS_ERR(opp)) { > > + pr_err("failed to find OPP for %ld\n", freq_Hz); > > + return PTR_ERR(opp); > > + } > > + volt = opp_get_voltage(opp); > > + tol = volt * voltage_tolerance / 100; > > + volt_old = regulator_get_voltage(cpu_reg); > > + } > > + > > + pr_debug("%u MHz, %ld mV --> %u MHz, %ld mV\n", > > + freqs.old / 1000, volt_old ? volt_old / 1000 : -1, > > + freqs.new / 1000, volt ? volt / 1000 : -1); > > + > > + /* scaling up? scale voltage before frequency */ > > + if (cpu_reg && freqs.new > freqs.old) { > > + if (regulator_set_voltage(cpu_reg, volt - tol, volt + tol)) { > > + pr_warn("Unable to scale voltage up\n"); > > + freqs.new = freqs.old; > > + goto done; > Do you need a POST notifier in case of the failure ? > Honestly, I'm not quite sure about that. This is a piece of code reused from omap-cpufreq driver. Looking at cpufreq_notify_transition, it seems to me that the POST notifier is not really necessary for failure case. > > +static struct cpufreq_driver cpu0_cpufreq_driver = { > > + .flags = CPUFREQ_STICKY, > > + .verify = cpu0_verify_speed, > > + .target = cpu0_set_target, > > + .get = cpu0_get_speed, > > + .init = cpu0_cpufreq_init, > > + .exit = cpu0_cpufreq_exit, > > + .name = "generic_cpu0", > > + .attr = cpu0_cpufreq_attr, > > +}; > > + > > +static int __devinit cpu0_cpufreq_driver_init(void) > > +{ > > + return cpufreq_register_driver(&cpu0_cpufreq_driver); > > +} > > +late_initcall(cpu0_cpufreq_driver_init); > > Can you also add support to build this as loadable module ? > I'm just following the common pattern of ARM cpufreq drivers to have CPUFREQ_STICKY set in cpufreq_driver.flag and use "bool" for the driver Kconfig. I'm not sure about the necessity of building this as a module. -- Regards, Shawn
next prev parent reply other threads:[~2012-07-20 12:33 UTC|newest] Thread overview: 68+ messages / expand[flat|nested] mbox.gz Atom feed top 2012-07-19 15:54 [PATCH 0/3] Add a generic cpufreq-cpu0 driver Shawn Guo 2012-07-19 15:54 ` Shawn Guo 2012-07-19 15:54 ` [PATCH 1/3] ARM: add cpufreq transiton notifier to adjust loops_per_jiffy for smp Shawn Guo 2012-07-19 15:54 ` Shawn Guo 2012-07-20 6:36 ` Shilimkar, Santosh 2012-07-20 6:36 ` Shilimkar, Santosh 2012-07-20 7:56 ` Shawn Guo 2012-07-20 7:56 ` Shawn Guo 2012-07-20 8:27 ` Shilimkar, Santosh 2012-07-20 8:27 ` Shilimkar, Santosh 2012-07-19 15:54 ` [PATCH 2/3] PM / OPP: Initialize OPP table from device tree Shawn Guo 2012-07-19 15:54 ` Shawn Guo 2012-07-20 6:00 ` Menon, Nishanth 2012-07-20 6:00 ` Menon, Nishanth 2012-07-20 8:46 ` Shawn Guo 2012-07-20 8:46 ` Shawn Guo 2012-07-20 9:04 ` Menon, Nishanth 2012-07-20 9:04 ` Menon, Nishanth 2012-07-19 15:54 ` [PATCH 3/3] cpufreq: Add a generic cpufreq-cpu0 driver Shawn Guo 2012-07-19 15:54 ` Shawn Guo 2012-07-20 6:52 ` Shilimkar, Santosh 2012-07-20 6:52 ` Shilimkar, Santosh [not found] ` <CAMQu2gw32LogXJJa+K5ZjmCZzBNK3FY2wYwZXU8fsftsVzEO2Q-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org> 2012-07-20 12:33 ` Shawn Guo [this message] 2012-07-20 12:33 ` Shawn Guo 2012-07-20 15:50 ` Turquette, Mike 2012-07-20 15:50 ` Turquette, Mike 2012-07-21 5:04 ` Shilimkar, Santosh 2012-07-21 5:04 ` Shilimkar, Santosh 2012-07-21 6:38 ` Shawn Guo 2012-07-21 6:38 ` Shawn Guo 2012-07-27 2:04 ` Richard Zhao 2012-07-27 2:04 ` Richard Zhao 2012-07-30 4:57 ` Shawn Guo 2012-07-30 4:57 ` Shawn Guo 2012-07-20 12:51 ` Richard Zhao 2012-07-20 12:51 ` Richard Zhao 2012-07-20 13:15 ` Shawn Guo 2012-07-20 13:15 ` Shawn Guo [not found] ` <1342713281-31114-4-git-send-email-shawn.guo-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> 2012-07-26 13:11 ` Mark Brown 2012-07-26 13:11 ` Mark Brown [not found] ` <20120726131121.GB7306-GFdadSzt00ze9xe1eoZjHA@public.gmane.org> 2012-07-27 2:13 ` Richard Zhao 2012-07-27 2:13 ` Richard Zhao 2012-07-27 10:08 ` Mark Brown 2012-07-27 10:08 ` Mark Brown 2012-07-30 6:52 ` Shawn Guo 2012-07-30 6:52 ` Shawn Guo 2012-07-30 8:20 ` Shawn Guo 2012-07-30 8:20 ` Shawn Guo 2012-07-30 18:55 ` Mark Brown 2012-07-30 18:55 ` Mark Brown 2012-07-30 18:53 ` Mark Brown 2012-07-30 18:53 ` Mark Brown 2012-07-31 4:20 ` Shawn Guo 2012-07-31 4:20 ` Shawn Guo 2012-07-31 13:40 ` Mark Brown 2012-07-31 13:40 ` Mark Brown 2012-07-27 6:33 ` Richard Zhao 2012-07-27 6:33 ` Richard Zhao 2012-07-30 8:17 ` Shawn Guo 2012-07-30 8:17 ` Shawn Guo 2012-07-30 8:50 ` Richard Zhao 2012-07-30 8:50 ` Richard Zhao 2012-07-30 9:24 ` Shawn Guo 2012-07-30 9:24 ` Shawn Guo 2012-07-19 18:39 ` [PATCH 0/3] " Rafael J. Wysocki 2012-07-19 18:39 ` Rafael J. Wysocki 2012-07-20 0:29 ` Shawn Guo 2012-07-20 0:29 ` Shawn Guo
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20120720123317.GA32263@S2101-09.ap.freescale.net \ --to=shawn.guo-qsej5fyqhm4dnm+yrofe0a@public.gmane.org \ --cc=cpufreq-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \ --cc=devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org \ --cc=khilman-l0cyMroinI0@public.gmane.org \ --cc=linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org \ --cc=linux-lFZ/pmaqli7XmaaqVzeoHQ@public.gmane.org \ --cc=linux-pm-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \ --cc=mturquette-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org \ --cc=nm-l0cyMroinI0@public.gmane.org \ --cc=richard.zhao-KZfg59tc24xl57MIdRCFDg@public.gmane.org \ --cc=rjw-KKrjLPT3xs0@public.gmane.org \ --cc=santosh.shilimkar-l0cyMroinI0@public.gmane.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.