先看下makefile。admin管理员组文章数量:1658761
source/drivers/cpufreq/Makefile
1 # CPUfreq core
具体实现
2 obj-$(CONFIG_CPU_FREQ) += cpufreq.o freq_table.o
3
4 # CPUfreq stats
状态
5 obj-$(CONFIG_CPU_FREQ_STAT) += cpufreq_stats.o
6
7 # CPUfreq governors
5个调节器(conservative ondemand userspace powersave performance )及其具体实现
8 obj-$(CONFIG_CPU_FREQ_GOV_PERFORMANCE) += cpufreq_performance.o
9 obj-$(CONFIG_CPU_FREQ_GOV_POWERSAVE) += cpufreq_powersave.o
10 obj-$(CONFIG_CPU_FREQ_GOV_USERSPACE) += cpufreq_userspace.o
11 obj-$(CONFIG_CPU_FREQ_GOV_ONDEMAND) += cpufreq_ondemand.o
12 obj-$(CONFIG_CPU_FREQ_GOV_CONSERVATIVE) += cpufreq_conservative.o
13 obj-$(CONFIG_CPU_FREQ_GOV_COMMON) += cpufreq_governor.o
14 obj-$(CONFIG_CPU_FREQ_GOV_ATTR_SET) += cpufreq_governor_attr_set.o
通过device tree 传递参数.
16 obj-$(CONFIG_CPUFREQ_DT) += cpufreq-dt.o
17 obj-$(CONFIG_CPUFREQ_DT_PLATDEV) += cpufreq-dt-platdev.o
我们先来看看cpufreq 中导出给sysfs的接口.
818 cpufreq_freq_attr_ro_perm(cpuinfo_cur_freq, 0400);
819 cpufreq_freq_attr_ro(cpuinfo_min_freq);
820 cpufreq_freq_attr_ro(cpuinfo_max_freq);
821 cpufreq_freq_attr_ro(cpuinfo_transition_latency);
822 cpufreq_freq_attr_ro(scaling_available_governors);
823 cpufreq_freq_attr_ro(scaling_driver);
824 cpufreq_freq_attr_ro(scaling_cur_freq);
825 cpufreq_freq_attr_ro(bios_limit);
826 cpufreq_freq_attr_ro(related_cpus);
827 cpufreq_freq_attr_ro(affected_cpus);
828 cpufreq_freq_attr_rw(scaling_min_freq);
829 cpufreq_freq_attr_rw(scaling_max_freq);
830 cpufreq_freq_attr_rw(scaling_governor);
831 cpufreq_freq_attr_rw(scaling_setspeed);
通过cd /sys/devices/system/cpu/cpu0 后ls 就可以看到上面接口.这些接口
affected_cpus related_cpus scaling_max_freq
bios_limit scaling_available_frequencies scaling_min_freq
cpuinfo_cur_freq scaling_available_governors scaling_setspeed
cpuinfo_max_freq scaling_cur_freq stats
cpuinfo_min_freq scaling_driver
cpuinfo_transition_latency scaling_governor
这些接口是何时加到sysfs文件系统中的呢?
cpufreq_register_driver->subsys_interface_register(cpufreq_interface)->cpufreq_add_dev->cpu_online
->cpufreq_add_dev_interface
static int cpufreq_add_dev_interface(struct cpufreq_policy *policy)
957 {
958 struct freq_attr **drv_attr;
959 int ret = 0;
960
961 /* set up files for this cpu device */
962 drv_attr = cpufreq_driver->attr;
963 while (drv_attr && *drv_attr) {
964 ret = sysfs_create_file(&policy->kobj, &((*drv_attr)->attr));
965 if (ret)
966 return ret;
967 drv_attr++;
968 }
969 if (cpufreq_driver->get) {
970 ret = sysfs_create_file(&policy->kobj, &cpuinfo_cur_freq.attr);
971 if (ret)
972 return ret;
973 }
974
975 ret = sysfs_create_file(&policy->kobj, &scaling_cur_freq.attr);
976 if (ret)
977 return ret;
978
979 if (cpufreq_driver->bios_limit) {
980 ret = sysfs_create_file(&policy->kobj, &bios_limit.attr);
981 if (ret)
982 return ret;
983 }
984
985 return cpufreq_add_dev_symlink(policy);
986 }
在964行会添加default_attrs.
833 static struct attribute *default_attrs[] = {
834 &cpuinfo_min_freq.attr,
835 &cpuinfo_max_freq.attr,
836 &cpuinfo_transition_latency.attr,
837 &scaling_min_freq.attr,
838 &scaling_max_freq.attr,
839 &affected_cpus.attr,
840 &related_cpus.attr,
841 &scaling_governor.attr,
842 &scaling_driver.attr,
843 &scaling_available_governors.attr,
844 &scaling_setspeed.attr,
845 NULL
846 };
在970 行添加cpuinfo_cur_freq
在975行添加scaling_cur_freq
在980行添加bios_limit
在这些atr中
828 cpufreq_freq_attr_rw(scaling_min_freq);
829 cpufreq_freq_attr_rw(scaling_max_freq);
830 cpufreq_freq_attr_rw(scaling_governor);
831 cpufreq_freq_attr_rw(scaling_setspeed);
这四个是可以通过sysfs接口改变的。
那谁会去call cpufreq_register_driver呢?
答案就是要实现cpufreq driver的module都要调用cpufreq_register_driver
static int __init longhaul_init(void)
918 {
919 struct cpuinfo_x86 *c = &cpu_data(0);
920
921 if (!x86_match_cpu(longhaul_id))
922 return -ENODEV;
923
924 if (!enable) {
925 pr_err("Option \"enable\" not set - Aborting\n");
926 return -ENODEV;
927 }
928 #ifdef CONFIG_SMP
929 if (num_online_cpus() > 1) {
930 pr_err("More than 1 CPU detected, longhaul disabled\n");
931 return -ENODEV;
932 }
933 #endif
934 #ifdef CONFIG_X86_IO_APIC
935 if (boot_cpu_has(X86_FEATURE_APIC)) {
936 pr_err("APIC detected. Longhaul is currently broken in this configuration.\n");
937 return -ENODEV;
938 }
939 #endif
940 switch (c->x86_model) {
941 case 6 ... 9:
942 return cpufreq_register_driver(&longhaul_driver);
943 case 10:
944 pr_err("Use acpi-cpufreq driver for VIA C7\n");
945 default:
946 ;
947 }
948
949 return -ENODEV;
950 }
版权声明:本文标题:cpufreq之sysfs接口 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dongtai/1729813704a1213644.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论