cpufreq之sysfs接口

先看下makefile。  
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 }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值