cpufreq_ondemand.c (39fe5434cb9de5da40510028b17b96bc4eb312b3) cpufreq_ondemand.c (1c2562459faedc35927546cfa5273ec6c2884cce)
1/*
2 * drivers/cpufreq/cpufreq_ondemand.c
3 *
4 * Copyright (C) 2001 Russell King
5 * (C) 2003 Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>.
6 * Jun Nakajima <jun.nakajima@intel.com>
7 *
8 * This program is free software; you can redistribute it and/or modify

--- 33 unchanged lines hidden (view full) ---

42#define MIN_SAMPLING_RATE_RATIO (2)
43/* for correct statistics, we need at least 10 ticks between each measure */
44#define MIN_STAT_SAMPLING_RATE \
45 (MIN_SAMPLING_RATE_RATIO * jiffies_to_usecs(10))
46#define MIN_SAMPLING_RATE \
47 (def_sampling_rate / MIN_SAMPLING_RATE_RATIO)
48#define MAX_SAMPLING_RATE (500 * def_sampling_rate)
49#define DEF_SAMPLING_RATE_LATENCY_MULTIPLIER (1000)
1/*
2 * drivers/cpufreq/cpufreq_ondemand.c
3 *
4 * Copyright (C) 2001 Russell King
5 * (C) 2003 Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>.
6 * Jun Nakajima <jun.nakajima@intel.com>
7 *
8 * This program is free software; you can redistribute it and/or modify

--- 33 unchanged lines hidden (view full) ---

42#define MIN_SAMPLING_RATE_RATIO (2)
43/* for correct statistics, we need at least 10 ticks between each measure */
44#define MIN_STAT_SAMPLING_RATE \
45 (MIN_SAMPLING_RATE_RATIO * jiffies_to_usecs(10))
46#define MIN_SAMPLING_RATE \
47 (def_sampling_rate / MIN_SAMPLING_RATE_RATIO)
48#define MAX_SAMPLING_RATE (500 * def_sampling_rate)
49#define DEF_SAMPLING_RATE_LATENCY_MULTIPLIER (1000)
50#define TRANSITION_LATENCY_LIMIT (10 * 1000)
50#define TRANSITION_LATENCY_LIMIT (10 * 1000 * 1000)
51
52static void do_dbs_timer(struct work_struct *work);
53
54/* Sampling types */
55enum {DBS_NORMAL_SAMPLE, DBS_SUB_SAMPLE};
56
57struct cpu_dbs_info_s {
58 cputime64_t prev_cpu_idle;

--- 444 unchanged lines hidden (view full) ---

503
504 this_dbs_info = &per_cpu(cpu_dbs_info, cpu);
505
506 switch (event) {
507 case CPUFREQ_GOV_START:
508 if ((!cpu_online(cpu)) || (!policy->cur))
509 return -EINVAL;
510
51
52static void do_dbs_timer(struct work_struct *work);
53
54/* Sampling types */
55enum {DBS_NORMAL_SAMPLE, DBS_SUB_SAMPLE};
56
57struct cpu_dbs_info_s {
58 cputime64_t prev_cpu_idle;

--- 444 unchanged lines hidden (view full) ---

503
504 this_dbs_info = &per_cpu(cpu_dbs_info, cpu);
505
506 switch (event) {
507 case CPUFREQ_GOV_START:
508 if ((!cpu_online(cpu)) || (!policy->cur))
509 return -EINVAL;
510
511 if (policy->cpuinfo.transition_latency >
512 (TRANSITION_LATENCY_LIMIT * 1000)) {
513 printk(KERN_WARNING "ondemand governor failed to load "
514 "due to too long transition latency\n");
515 return -EINVAL;
516 }
517 if (this_dbs_info->enable) /* Already enabled */
518 break;
519
520 mutex_lock(&dbs_mutex);
521 dbs_enable++;
522
523 rc = sysfs_create_group(&policy->kobj, &dbs_attr_group);
524 if (rc) {

--- 55 unchanged lines hidden (view full) ---

580 policy->min,
581 CPUFREQ_RELATION_L);
582 mutex_unlock(&dbs_mutex);
583 break;
584 }
585 return 0;
586}
587
511 if (this_dbs_info->enable) /* Already enabled */
512 break;
513
514 mutex_lock(&dbs_mutex);
515 dbs_enable++;
516
517 rc = sysfs_create_group(&policy->kobj, &dbs_attr_group);
518 if (rc) {

--- 55 unchanged lines hidden (view full) ---

574 policy->min,
575 CPUFREQ_RELATION_L);
576 mutex_unlock(&dbs_mutex);
577 break;
578 }
579 return 0;
580}
581
588static struct cpufreq_governor cpufreq_gov_dbs = {
589 .name = "ondemand",
590 .governor = cpufreq_governor_dbs,
591 .owner = THIS_MODULE,
582struct cpufreq_governor cpufreq_gov_ondemand = {
583 .name = "ondemand",
584 .governor = cpufreq_governor_dbs,
585 .max_transition_latency = TRANSITION_LATENCY_LIMIT,
586 .owner = THIS_MODULE,
592};
587};
588EXPORT_SYMBOL(cpufreq_gov_ondemand);
593
594static int __init cpufreq_gov_dbs_init(void)
595{
596 kondemand_wq = create_workqueue("kondemand");
597 if (!kondemand_wq) {
598 printk(KERN_ERR "Creation of kondemand failed\n");
599 return -EFAULT;
600 }
589
590static int __init cpufreq_gov_dbs_init(void)
591{
592 kondemand_wq = create_workqueue("kondemand");
593 if (!kondemand_wq) {
594 printk(KERN_ERR "Creation of kondemand failed\n");
595 return -EFAULT;
596 }
601 return cpufreq_register_governor(&cpufreq_gov_dbs);
597 return cpufreq_register_governor(&cpufreq_gov_ondemand);
602}
603
604static void __exit cpufreq_gov_dbs_exit(void)
605{
598}
599
600static void __exit cpufreq_gov_dbs_exit(void)
601{
606 cpufreq_unregister_governor(&cpufreq_gov_dbs);
602 cpufreq_unregister_governor(&cpufreq_gov_ondemand);
607 destroy_workqueue(kondemand_wq);
608}
609
610
611MODULE_AUTHOR("Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>");
612MODULE_AUTHOR("Alexey Starikovskiy <alexey.y.starikovskiy@intel.com>");
613MODULE_DESCRIPTION("'cpufreq_ondemand' - A dynamic cpufreq governor for "
614 "Low Latency Frequency Transition capable processors");
615MODULE_LICENSE("GPL");
616
617module_init(cpufreq_gov_dbs_init);
618module_exit(cpufreq_gov_dbs_exit);
619
603 destroy_workqueue(kondemand_wq);
604}
605
606
607MODULE_AUTHOR("Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>");
608MODULE_AUTHOR("Alexey Starikovskiy <alexey.y.starikovskiy@intel.com>");
609MODULE_DESCRIPTION("'cpufreq_ondemand' - A dynamic cpufreq governor for "
610 "Low Latency Frequency Transition capable processors");
611MODULE_LICENSE("GPL");
612
613module_init(cpufreq_gov_dbs_init);
614module_exit(cpufreq_gov_dbs_exit);
615