435
427
EXPORT_SYMBOL(acpi_processor_notify_smm);
437
#ifdef CONFIG_X86_ACPI_CPUFREQ_PROC_INTF
438
/* /proc/acpi/processor/../performance interface (DEPRECATED) */
440
static int acpi_processor_perf_open_fs(struct inode *inode, struct file *file);
441
static struct file_operations acpi_processor_perf_fops = {
442
.owner = THIS_MODULE,
443
.open = acpi_processor_perf_open_fs,
446
.release = single_release,
449
static int acpi_processor_perf_seq_show(struct seq_file *seq, void *offset)
451
struct acpi_processor *pr = seq->private;
458
if (!pr->performance) {
459
seq_puts(seq, "<not supported>\n");
463
seq_printf(seq, "state count: %d\n"
464
"active state: P%d\n",
465
pr->performance->state_count, pr->performance->state);
467
seq_puts(seq, "states:\n");
468
for (i = 0; i < pr->performance->state_count; i++)
470
" %cP%d: %d MHz, %d mW, %d uS\n",
471
(i == pr->performance->state ? '*' : ' '), i,
472
(u32) pr->performance->states[i].core_frequency,
473
(u32) pr->performance->states[i].power,
474
(u32) pr->performance->states[i].transition_latency);
480
static int acpi_processor_perf_open_fs(struct inode *inode, struct file *file)
482
return single_open(file, acpi_processor_perf_seq_show,
486
static void acpi_cpufreq_add_file(struct acpi_processor *pr)
488
struct acpi_device *device = NULL;
491
if (acpi_bus_get_device(pr->handle, &device))
494
/* add file 'performance' [R/W] */
495
proc_create_data(ACPI_PROCESSOR_FILE_PERFORMANCE, S_IFREG | S_IRUGO,
496
acpi_device_dir(device),
497
&acpi_processor_perf_fops, acpi_driver_data(device));
501
static void acpi_cpufreq_remove_file(struct acpi_processor *pr)
503
struct acpi_device *device = NULL;
506
if (acpi_bus_get_device(pr->handle, &device))
509
/* remove file 'performance' */
510
remove_proc_entry(ACPI_PROCESSOR_FILE_PERFORMANCE,
511
acpi_device_dir(device));
517
static void acpi_cpufreq_add_file(struct acpi_processor *pr)
521
static void acpi_cpufreq_remove_file(struct acpi_processor *pr)
525
#endif /* CONFIG_X86_ACPI_CPUFREQ_PROC_INTF */
527
429
static int acpi_processor_get_psd(struct acpi_processor *pr)
588
497
int count, count_target;
590
499
unsigned int i, j;
591
cpumask_t covered_cpus;
500
cpumask_var_t covered_cpus;
592
501
struct acpi_processor *pr;
593
502
struct acpi_psd_package *pdomain;
594
503
struct acpi_processor *match_pr;
595
504
struct acpi_psd_package *match_pdomain;
506
if (!alloc_cpumask_var(&covered_cpus, GFP_KERNEL))
597
509
mutex_lock(&performance_mutex);
601
/* Call _PSD for all CPUs */
512
* Check if another driver has already registered, and abort before
513
* changing pr->performance if it has. Check input data as well.
602
515
for_each_possible_cpu(i) {
603
516
pr = per_cpu(processors, i);
609
522
if (pr->performance) {
614
if (!performance || !percpu_ptr(performance, i)) {
527
if (!performance || !per_cpu_ptr(performance, i)) {
615
528
retval = -EINVAL;
533
/* Call _PSD for all CPUs */
534
for_each_possible_cpu(i) {
535
pr = per_cpu(processors, i);
619
pr->performance = percpu_ptr(performance, i);
620
cpu_set(i, pr->performance->shared_cpu_map);
539
pr->performance = per_cpu_ptr(performance, i);
540
cpumask_set_cpu(i, pr->performance->shared_cpu_map);
621
541
if (acpi_processor_get_psd(pr)) {
622
542
retval = -EINVAL;
630
550
* Now that we have _PSD data from all CPUs, lets setup P-state
633
for_each_possible_cpu(i) {
634
pr = per_cpu(processors, i);
638
/* Basic validity check for domain info */
639
pdomain = &(pr->performance->domain_info);
640
if ((pdomain->revision != ACPI_PSD_REV0_REVISION) ||
641
(pdomain->num_entries != ACPI_PSD_REV0_ENTRIES)) {
645
if (pdomain->coord_type != DOMAIN_COORD_TYPE_SW_ALL &&
646
pdomain->coord_type != DOMAIN_COORD_TYPE_SW_ANY &&
647
pdomain->coord_type != DOMAIN_COORD_TYPE_HW_ALL) {
653
cpus_clear(covered_cpus);
654
for_each_possible_cpu(i) {
655
pr = per_cpu(processors, i);
659
if (cpu_isset(i, covered_cpus))
662
pdomain = &(pr->performance->domain_info);
663
cpu_set(i, pr->performance->shared_cpu_map);
664
cpu_set(i, covered_cpus);
553
cpumask_clear(covered_cpus);
554
for_each_possible_cpu(i) {
555
pr = per_cpu(processors, i);
559
if (cpumask_test_cpu(i, covered_cpus))
562
pdomain = &(pr->performance->domain_info);
563
cpumask_set_cpu(i, pr->performance->shared_cpu_map);
564
cpumask_set_cpu(i, covered_cpus);
665
565
if (pdomain->num_processors <= 1)
719
619
match_pr->performance->shared_type =
720
620
pr->performance->shared_type;
721
match_pr->performance->shared_cpu_map =
722
pr->performance->shared_cpu_map;
621
cpumask_copy(match_pr->performance->shared_cpu_map,
622
pr->performance->shared_cpu_map);
732
632
/* Assume no coordination on any error parsing domain info */
734
cpus_clear(pr->performance->shared_cpu_map);
735
cpu_set(i, pr->performance->shared_cpu_map);
634
cpumask_clear(pr->performance->shared_cpu_map);
635
cpumask_set_cpu(i, pr->performance->shared_cpu_map);
736
636
pr->performance->shared_type = CPUFREQ_SHARED_TYPE_ALL;
738
638
pr->performance = NULL; /* Will be set for real in register */
741
642
mutex_unlock(&performance_mutex);
643
free_cpumask_var(covered_cpus);
744
646
EXPORT_SYMBOL(acpi_processor_preregister_performance);
748
649
acpi_processor_register_performance(struct acpi_processor_performance
749
650
*performance, unsigned int cpu)
751
652
struct acpi_processor *pr;
754
654
if (!(acpi_processor_ppc_status & PPC_REGISTERED))