cpu frequency scaling autoloading

Andy Whitcroft apw at canonical.com
Wed Jul 25 10:37:07 UTC 2012


TLDR: It was recently commented that we have a policy to building cpufreq
drivers because they are not autoloadable, but that there had been some
fixes made to fix this.  As part of that we took an action to investigate.
This upstream work is not yet complete but it does appear we can pull
out a fair number of these drivers to modules and let them autoload.

In v3.4-rc1 the commit below added support for loading cpufreq drivers
via either CPU features or PCI ids:

  commit fa8031aefec0cf7ea6c2387c93610d99d9659aa2
  Author: Andi Kleen <ak at linux.intel.com>
  Date:   Thu Jan 26 00:09:12 2012 +0100

    cpufreq: Add support for x86 cpuinfo auto loading v4

And the following commit added autoloading for acpi-cpufreq:

  commit 9061e0e16700ef228837e96987ff51794c956197
  Author: Andi Kleen <ak at linux.intel.com>
  Date:   Thu Jan 26 00:09:08 2012 +0100

    ACPI: Load acpi-cpufreq from processor driver automatically

On the face of it this would let us pull all of these drivers to modules.
However, looking at these commits they do not as yet allow autoloading
of the three speedstep-drivers.  The comments in the Makefile also infer
that there are a couple of further constraints to be considered:

  # Link order matters. K8 is preferred to ACPI because of firmware bugs
    in early
  # K8 systems. ACPI is preferred to all other hardware-specific drivers.
  # speedstep-* is preferred over p4-clockmod.

>From this I believe we would need to continue to build in powernow-k8 in
order to ensure it loads before acpi-cpufreq.  Plus we have to build in the
speedstep-* drivers due to the lack of enabled autoload there.  Finally
we we should build in acpi-cpufreq to maintain the described orderings.
The remainder may return to modules.  Later should the speedstep-* drivers
be sorted out we could pull everything but the powernow-k8 drivers out.

In short currently we can move the following =m:
  CONFIG_X86_POWERNOW_K6
  CONFIG_X86_POWERNOW_K7
  CONFIG_X86_LONGHAUL
  CONFIG_X86_LONGRUN
  CONFIG_X86_GX_SUSPMOD
  CONFIG_X86_CPUFREQ_NFORCE2

I have pushed patches to move the above to modules to quantal.  It would
be good to get some testing on these especially if you have any of the
specific hardware.

Full background data below.

-apw

obj-$(CONFIG_X86_POWERNOW_K8)           += powernow-k8.o mperf.o
  drivers/cpufreq/powernow-k8.c:MODULE_DEVICE_TABLE(x86cpu, powernow_k8_ids);
  debian.master/config/config.common.ubuntu:CONFIG_X86_POWERNOW_K8=y

obj-$(CONFIG_X86_ACPI_CPUFREQ)          += acpi-cpufreq.o mperf.o
 autoloads on acpi table identifying specific control element
 debian.master/config/config.common.ubuntu:CONFIG_X86_ACPI_CPUFREQ=y

obj-$(CONFIG_X86_PCC_CPUFREQ)           += pcc-cpufreq.o
 XXX NOT AUTOLOADABLE 
 debian.master/config/config.common.ubuntu:CONFIG_X86_PCC_CPUFREQ=m

obj-$(CONFIG_X86_POWERNOW_K6)           += powernow-k6.o
  drivers/cpufreq/powernow-k6.c:MODULE_DEVICE_TABLE(x86cpu, powernow_k6_ids);
  debian.master/config/config.common.ubuntu:CONFIG_X86_POWERNOW_K6=y

obj-$(CONFIG_X86_POWERNOW_K7)           += powernow-k7.o
  drivers/cpufreq/powernow-k7.c:MODULE_DEVICE_TABLE(x86cpu, powernow_k7_cpuids);
  debian.master/config/config.common.ubuntu:CONFIG_X86_POWERNOW_K7=y

obj-$(CONFIG_X86_LONGHAUL)              += longhaul.o
  drivers/cpufreq/longhaul.c:MODULE_DEVICE_TABLE(x86cpu, longhaul_id);
  debian.master/config/config.common.ubuntu:CONFIG_X86_LONGHAUL=y

obj-$(CONFIG_X86_E_POWERSAVER)          += e_powersaver.o
  drivers/cpufreq/e_powersaver.c:MODULE_DEVICE_TABLE(x86cpu, eps_cpu_id);
  debian.master/config/config.common.ubuntu:# CONFIG_X86_E_POWERSAVER is not set

obj-$(CONFIG_ELAN_CPUFREQ)              += elanfreq.o
  drivers/cpufreq/elanfreq.c:MODULE_DEVICE_TABLE(x86cpu, elan_id);
  NO CONFIG MENTION -- not enableable

obj-$(CONFIG_SC520_CPUFREQ)             += sc520_freq.o
  drivers/cpufreq/sc520_freq.c:MODULE_DEVICE_TABLE(x86cpu, sc520_ids);
  NO CONFIG MENTION -- not enableable

obj-$(CONFIG_X86_LONGRUN)               += longrun.o
  drivers/cpufreq/longrun.c:MODULE_DEVICE_TABLE(x86cpu, longrun_ids);
  debian.master/config/config.common.ubuntu:CONFIG_X86_LONGRUN=y

obj-$(CONFIG_X86_GX_SUSPMOD)            += gx-suspmod.o
  drivers/cpufreq/gx-suspmod.c:MODULE_DEVICE_TABLE(pci, gx_chipset_tbl);
  debian.master/config/config.common.ubuntu:CONFIG_X86_GX_SUSPMOD=y

obj-$(CONFIG_X86_SPEEDSTEP_ICH)         += speedstep-ich.o
  drivers/cpufreq/speedstep-ich.c:MODULE_DEVICE_TABLE(x86cpu, ss_smi_ids); /* XXX DISABLED */
  debian.master/config/config.common.ubuntu:CONFIG_X86_SPEEDSTEP_ICH=y

obj-$(CONFIG_X86_SPEEDSTEP_SMI)         += speedstep-smi.o
  drivers/cpufreq/speedstep-smi.c:MODULE_DEVICE_TABLE(x86cpu, ss_smi_ids); /* XXX DISABLED */
  debian.master/config/config.common.ubuntu:CONFIG_X86_SPEEDSTEP_SMI=y

obj-$(CONFIG_X86_SPEEDSTEP_CENTRINO)    += speedstep-centrino.o
  drivers/cpufreq/speedstep-centrino.c:MODULE_DEVICE_TABLE(x86cpu, centrino_ids); /* XXX DISABLED */
  debian.master/config/config.common.ubuntu:CONFIG_X86_SPEEDSTEP_CENTRINO=y

obj-$(CONFIG_X86_P4_CLOCKMOD)           += p4-clockmod.o
  drivers/cpufreq/p4-clockmod.c: * Intentionally no MODULE_DEVICE_TABLE here: this driver should not
  debian.master/config/config.common.ubuntu:CONFIG_X86_P4_CLOCKMOD=m

obj-$(CONFIG_X86_CPUFREQ_NFORCE2)       += cpufreq-nforce2.o
  drivers/cpufreq/cpufreq-nforce2.c:MODULE_DEVICE_TABLE(pci, nforce2_ids);
  debian.master/config/config.common.ubuntu:CONFIG_X86_CPUFREQ_NFORCE2=y





More information about the kernel-team mailing list