File: cpufreq-acpi_pdump.c

package info (click to toggle)
cpufrequtils 002-2
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 264 kB
  • ctags: 288
  • sloc: ansic: 2,328; makefile: 253; sh: 94
file content (114 lines) | stat: -rw-r--r-- 3,119 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
/*
 * test module to dump contents of the ACPI tables relevant for
 * CPU frequency scaling support. Kernel 2.6.3 or later required.
 *
 * Partly based on a patch for ACPI-PentiumM-cpufreq interaction by David
 * Moore, sent to the cpufreq list in June 2003, and on various stuff to
 * be found in drivers/acpi/processor.c and include/acpi/processor.h,
 * (C) 2001, 2002 Andy Grover <andrew.grover@intel.com> and 
 * (C) 2001, 2002 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com>
 *
 * (C) 2003 - 2004	Dominik Brodowski
 *
 * To use:
 * 1.) ACPI_PROCESSOR must (at least) be built as a module, and
 * CONFIG_CPU_FREQ must be defined in the kernel sources. Do not load
 * any cpufreq driver, though.
 *
 * 2.) load this module
 *
 * 3.) if applicable: load this module with the "pdc=" parameters
 *     to tell the BIOS of the cpufreq capabilities of the Operating
 *     System.
 *
 * 4.) run dmesg to find the output
 * 
 */

#include <linux/config.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/init.h>
#include <linux/cpufreq.h>
#include <linux/proc_fs.h>
#include <linux/seq_file.h>
#include <asm/io.h>
#include <asm/delay.h>
#include <asm/uaccess.h>

#include <linux/acpi.h>
#include <acpi/processor.h>

struct acpi_processor_performance p;

#define ACPI_PDC_REVISION_ID                   0x1

static int pdc = 0;

static int __init
acpi_pdump_init (void)
{
	unsigned int i;
	struct acpi_pct_register *r;
	union acpi_object               arg0 = {ACPI_TYPE_BUFFER};
	u32                             arg0_buf[3];
	struct acpi_object_list         arg_list = {1, &arg0};

	if (pdc) {
		arg0.buffer.length = 12;
		arg0.buffer.pointer = (u8 *) arg0_buf;
		arg0_buf[0] = ACPI_PDC_REVISION_ID;
		arg0_buf[1] = 1;	/* One capability bit */
		arg0_buf[2] = pdc;
	}

	if (pdc)
		p.pdc = &arg_list;

	if (acpi_processor_register_performance(&p, 0))
		return -EIO;

	printk("number of states: %d\n", p.state_count);
	for (i=0; i< p.state_count; i++)
		printk(KERN_INFO "acpi_pdump: P%d: %d MHz, %d mW, %d uS s:0x%x c:0x%x\n",
		       i,
		       (u32) p.states[i].core_frequency,
		       (u32) p.states[i].power,
		       (u32) p.states[i].transition_latency,
		       (u32) p.states[i].status,
		       (u32) p.states[i].control);

	printk("control_register:\n");
	r = &p.control_register;
	printk("%d %d %d %d %d %d %lld\n", r->descriptor, r->length, r->space_id,
	       r->bit_width, r->bit_offset, r->reserved, r->address);

	printk("status_register:\n");
	r = &p.status_register;
	printk("%d %d %d %d %d %d %lld\n", r->descriptor, r->length, r->space_id,
	       r->bit_width, r->bit_offset, r->reserved, r->address);

	acpi_processor_unregister_performance(&p, 0);

	return -ENODEV;
}


static void __exit
acpi_pdump_exit (void)
{
	return;
}


module_init(acpi_pdump_init);
module_exit(acpi_pdump_exit);

module_param(pdc, uint, 0444);
MODULE_PARM_DESC(pdc, "_PDC capability bits for _PDC revision 1 to be passed to BIOS.");

MODULE_AUTHOR("Dominik Brodowski");
MODULE_DESCRIPTION("Dump content of cpufreq-relevant parts of ACPI tables");
MODULE_LICENSE ("GPL");