Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
5be1676c
Commit
5be1676c
authored
Sep 09, 2003
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge
bk://linux-dj.bkbits.net/cpufreq
into home.osdl.org:/home/torvalds/v2.5/linux
parents
2e926a15
5f27f461
Changes
11
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
510 additions
and
38 deletions
+510
-38
arch/i386/boot/setup.S
arch/i386/boot/setup.S
+11
-0
arch/i386/kernel/cpu/cpufreq/Kconfig
arch/i386/kernel/cpu/cpufreq/Kconfig
+26
-14
arch/i386/kernel/cpu/cpufreq/Makefile
arch/i386/kernel/cpu/cpufreq/Makefile
+1
-0
arch/i386/kernel/cpu/cpufreq/speedstep-smi.c
arch/i386/kernel/cpu/cpufreq/speedstep-smi.c
+353
-0
arch/i386/kernel/i386_ksyms.c
arch/i386/kernel/i386_ksyms.c
+5
-0
arch/i386/kernel/setup.c
arch/i386/kernel/setup.c
+3
-0
drivers/cpufreq/cpufreq.c
drivers/cpufreq/cpufreq.c
+67
-21
drivers/cpufreq/cpufreq_userspace.c
drivers/cpufreq/cpufreq_userspace.c
+1
-3
include/asm-i386/ist.h
include/asm-i386/ist.h
+32
-0
include/asm-i386/setup.h
include/asm-i386/setup.h
+1
-0
include/linux/cpufreq.h
include/linux/cpufreq.h
+10
-0
No files found.
arch/i386/boot/setup.S
View file @
5be1676c
...
@@ -506,6 +506,17 @@ no_voyager:
...
@@ -506,6 +506,17 @@ no_voyager:
movw
$
0xAA
,
(
0x1ff
)
#
device
present
movw
$
0xAA
,
(
0x1ff
)
#
device
present
no_psmouse
:
no_psmouse
:
#if defined(CONFIG_X86_SPEEDSTEP_SMI) || defined(CONFIG_X86_SPEEDSTEP_SMI_MODULE)
movl
$
0x0000E980
,
%
eax
#
IST
Support
movl
$
0x47534943
,
%
edx
#
Request
value
int
$
0x15
movl
%
eax
,
(
96
)
movl
%
ebx
,
(
100
)
movl
%
ecx
,
(
104
)
movl
%
edx
,
(
108
)
#endif
#if defined(CONFIG_APM) || defined(CONFIG_APM_MODULE)
#if defined(CONFIG_APM) || defined(CONFIG_APM_MODULE)
#
Then
check
for
an
APM
BIOS
...
#
Then
check
for
an
APM
BIOS
...
#
%
ds
points
to
the
bootsector
#
%
ds
points
to
the
bootsector
...
...
arch/i386/kernel/cpu/cpufreq/Kconfig
View file @
5be1676c
...
@@ -99,34 +99,46 @@ config X86_GX_SUSPMOD
...
@@ -99,34 +99,46 @@ config X86_GX_SUSPMOD
If in doubt, say N.
If in doubt, say N.
config X86_SPEEDSTEP_CENTRINO
tristate "Intel Enhanced SpeedStep"
depends on CPU_FREQ_TABLE
help
This adds the CPUFreq driver for Enhanced SpeedStep enabled
mobile CPUs. This means Intel Pentium M (Centrino) CPUs.
For details, take a look at linux/Documentation/cpu-freq.
If in doubt, say N.
config X86_SPEEDSTEP_ICH
config X86_SPEEDSTEP_ICH
tristate "Intel Speedstep"
tristate "Intel Speedstep
on ICH-M chipsets (ioport interface)
"
depends on CPU_FREQ_TABLE
depends on CPU_FREQ_TABLE
help
help
This adds the CPUFreq driver for certain mobile Intel Pentium III
This adds the CPUFreq driver for certain mobile Intel Pentium III
(Coppermine), all mobile Intel Pentium III-M (Tualatin) and all
(Coppermine), all mobile Intel Pentium III-M (Tualatin) and all
mobile Intel Pentium 4 P4-M
s, with an Intel ICH2, ICH3,
mobile Intel Pentium 4 P4-M
on systems which have an Intel ICH2,
or ICH4 southbridge.
ICH3
or ICH4 southbridge.
For details, take a look at linux/Documentation/cpu-freq.
For details, take a look at linux/Documentation/cpu-freq.
If in doubt, say N.
If in doubt, say N.
config X86_SPEEDSTEP_
CENTRINO
config X86_SPEEDSTEP_
SMI
tristate "Intel
Enhanced SpeedStep
"
tristate "Intel
SpeedStep on 440BX/ZX/MX chipsets (SMI interface)
"
depends on CPU_FREQ_TABLE
depends on CPU_FREQ_TABLE
&& EXPERIMENTAL
help
help
This adds the CPUFreq driver for Enhanced SpeedStep enabled
This adds the CPUFreq driver for certain mobile Intel Pentium III
mobile CPUs. This means Intel Pentium M (Centrino) CPUs.
(Coppermine), all mobile Intel Pentium III-M (Tualatin)
on systems which have an Intel 440BX/ZX/MX southbridge.
For details, take a look at linux/Documentation/cpu-freq.
For details, take a look at linux/Documentation/cpu-freq.
If in doubt, say N.
If in doubt, say N.
config X86_SPEEDSTEP_LIB
config X86_SPEEDSTEP_LIB
tristate
tristate
depends on X86_SPEEDSTEP_ICH
depends on (X86_SPEEDSTEP_ICH || X86_SPEEDSTEP_SMI)
default X86_SPEEDSTEP_ICH
default (X86_SPEEDSTEP_ICH || X86_SPEEDSTEP_SMI)
config X86_P4_CLOCKMOD
config X86_P4_CLOCKMOD
tristate "Intel Pentium 4 clock modulation"
tristate "Intel Pentium 4 clock modulation"
...
...
arch/i386/kernel/cpu/cpufreq/Makefile
View file @
5be1676c
...
@@ -9,6 +9,7 @@ obj-$(CONFIG_X86_ACPI_CPUFREQ) += acpi.o
...
@@ -9,6 +9,7 @@ obj-$(CONFIG_X86_ACPI_CPUFREQ) += acpi.o
obj-$(CONFIG_X86_SPEEDSTEP_ICH)
+=
speedstep-ich.o
obj-$(CONFIG_X86_SPEEDSTEP_ICH)
+=
speedstep-ich.o
obj-$(CONFIG_X86_SPEEDSTEP_CENTRINO)
+=
speedstep-centrino.o
obj-$(CONFIG_X86_SPEEDSTEP_CENTRINO)
+=
speedstep-centrino.o
obj-$(CONFIG_X86_SPEEDSTEP_LIB)
+=
speedstep-lib.o
obj-$(CONFIG_X86_SPEEDSTEP_LIB)
+=
speedstep-lib.o
obj-$(CONFIG_X86_SPEEDSTEP_SMI)
+=
speedstep-smi.o
ifdef
CONFIG_X86_ACPI_CPUFREQ
ifdef
CONFIG_X86_ACPI_CPUFREQ
ifdef
CONFIG_ACPI_DEBUG
ifdef
CONFIG_ACPI_DEBUG
...
...
arch/i386/kernel/cpu/cpufreq/speedstep-smi.c
0 → 100644
View file @
5be1676c
/*
* Intel SpeedStep SMI driver.
*
* (C) 2003 Hiroshi Miura <miura@da-cha.org>
*
* Licensed under the terms of the GNU GPL License version 2.
*
*/
/*********************************************************************
* SPEEDSTEP - DEFINITIONS *
*********************************************************************/
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/init.h>
#include <linux/cpufreq.h>
#include <linux/pci.h>
#include <linux/slab.h>
#include <asm/ist.h>
#include "speedstep-lib.h"
/* speedstep system management interface port/command.
*
* These parameters are got from IST-SMI BIOS call.
* If user gives it, these are used.
*
*/
static
int
smi_port
=
0
;
static
int
smi_cmd
=
0
;
static
unsigned
int
smi_sig
=
0
;
/*
* There are only two frequency states for each processor. Values
* are in kHz for the time being.
*/
static
struct
cpufreq_frequency_table
speedstep_freqs
[]
=
{
{
SPEEDSTEP_HIGH
,
0
},
{
SPEEDSTEP_LOW
,
0
},
{
0
,
CPUFREQ_TABLE_END
},
};
#define GET_SPEEDSTEP_OWNER 0
#define GET_SPEEDSTEP_STATE 1
#define SET_SPEEDSTEP_STATE 2
#define GET_SPEEDSTEP_FREQS 4
/* DEBUG
* Define it if you want verbose debug output, e.g. for bug reporting
*/
#define SPEEDSTEP_DEBUG
#ifdef SPEEDSTEP_DEBUG
#define dprintk(msg...) printk(msg)
#else
#define dprintk(msg...) do { } while(0)
#endif
/**
* speedstep_smi_ownership
*/
static
int
speedstep_smi_ownership
(
void
)
{
u32
command
,
result
,
magic
;
u32
function
=
GET_SPEEDSTEP_OWNER
;
unsigned
char
magic_data
[]
=
"Copyright (c) 1999 Intel Corporation"
;
command
=
(
smi_sig
&
0xffffff00
)
|
(
smi_cmd
&
0xff
);
magic
=
virt_to_phys
(
magic_data
);
__asm__
__volatile__
(
"out %%al, (%%dx)
\n
"
:
"=D"
(
result
)
:
"a"
(
command
),
"b"
(
function
),
"c"
(
0
),
"d"
(
smi_port
),
"D"
(
0
),
"S"
(
magic
)
);
return
result
;
}
/**
* speedstep_smi_get_freqs - get SpeedStep preferred & current freq.
*
*/
static
int
speedstep_smi_get_freqs
(
unsigned
int
*
low
,
unsigned
int
*
high
)
{
u32
command
,
result
,
edi
,
high_mhz
,
low_mhz
;
u32
state
=
0
;
u32
function
=
GET_SPEEDSTEP_FREQS
;
command
=
(
smi_sig
&
0xffffff00
)
|
(
smi_cmd
&
0xff
);
__asm__
__volatile__
(
"movl $0, %%edi
\n
"
"out %%al, (%%dx)
\n
"
:
"=a"
(
result
),
"=b"
(
high_mhz
),
"=c"
(
low_mhz
),
"=d"
(
state
),
"=D"
(
edi
)
:
"a"
(
command
),
"b"
(
function
),
"c"
(
state
),
"d"
(
smi_port
),
"S"
(
0
)
);
*
high
=
high_mhz
*
1000
;
*
low
=
low_mhz
*
1000
;
return
result
;
}
/**
* speedstep_get_state - set the SpeedStep state
* @state: processor frequency state (SPEEDSTEP_LOW or SPEEDSTEP_HIGH)
*
*/
static
int
speedstep_get_state
(
void
)
{
u32
function
=
GET_SPEEDSTEP_STATE
;
u32
result
,
state
,
edi
,
command
;
command
=
(
smi_sig
&
0xffffff00
)
|
(
smi_cmd
&
0xff
);
__asm__
__volatile__
(
"movl $0, %%edi
\n
"
"out %%al, (%%dx)
\n
"
:
"=a"
(
result
),
"=b"
(
state
),
"=D"
(
edi
)
:
"a"
(
command
),
"b"
(
function
),
"c"
(
0
),
"d"
(
smi_port
),
"S"
(
0
)
);
return
state
;
}
/**
* speedstep_set_state - set the SpeedStep state
* @state: new processor frequency state (SPEEDSTEP_LOW or SPEEDSTEP_HIGH)
*
*/
static
void
speedstep_set_state
(
unsigned
int
state
,
unsigned
int
notify
)
{
unsigned
int
old_state
,
result
,
command
,
new_state
;
unsigned
long
flags
;
struct
cpufreq_freqs
freqs
;
unsigned
int
function
=
SET_SPEEDSTEP_STATE
;
if
(
state
>
0x1
)
return
;
old_state
=
speedstep_get_state
();
freqs
.
old
=
speedstep_freqs
[
old_state
].
frequency
;
freqs
.
new
=
speedstep_freqs
[
state
].
frequency
;
freqs
.
cpu
=
0
;
/* speedstep.c is UP only driver */
if
(
old_state
==
state
)
return
;
if
(
notify
)
cpufreq_notify_transition
(
&
freqs
,
CPUFREQ_PRECHANGE
);
/* Disable IRQs */
local_irq_save
(
flags
);
command
=
(
smi_sig
&
0xffffff00
)
|
(
smi_cmd
&
0xff
);
__asm__
__volatile__
(
"movl $0, %%edi
\n
"
"out %%al, (%%dx)
\n
"
:
"=b"
(
new_state
),
"=D"
(
result
)
:
"a"
(
command
),
"b"
(
function
),
"c"
(
state
),
"d"
(
smi_port
),
"S"
(
0
)
);
/* enable IRQs */
local_irq_restore
(
flags
);
if
(
new_state
==
state
)
{
dprintk
(
KERN_INFO
"cpufreq: change to %u MHz succeded
\n
"
,
(
freqs
.
new
/
1000
));
}
else
{
printk
(
KERN_ERR
"cpufreq: change failed
\n
"
);
}
if
(
notify
)
cpufreq_notify_transition
(
&
freqs
,
CPUFREQ_POSTCHANGE
);
return
;
}
/**
* speedstep_target - set a new CPUFreq policy
* @policy: new policy
* @target_freq: new freq
* @relation:
*
* Sets a new CPUFreq policy/freq.
*/
static
int
speedstep_target
(
struct
cpufreq_policy
*
policy
,
unsigned
int
target_freq
,
unsigned
int
relation
)
{
unsigned
int
newstate
=
0
;
if
(
cpufreq_frequency_table_target
(
policy
,
&
speedstep_freqs
[
0
],
target_freq
,
relation
,
&
newstate
))
return
-
EINVAL
;
speedstep_set_state
(
newstate
,
1
);
return
0
;
}
/**
* speedstep_verify - verifies a new CPUFreq policy
* @freq: new policy
*
* Limit must be within speedstep_low_freq and speedstep_high_freq, with
* at least one border included.
*/
static
int
speedstep_verify
(
struct
cpufreq_policy
*
policy
)
{
return
cpufreq_frequency_table_verify
(
policy
,
&
speedstep_freqs
[
0
]);
}
static
int
speedstep_cpu_init
(
struct
cpufreq_policy
*
policy
)
{
int
result
;
unsigned
int
speed
,
state
;
/* capability check */
if
(
policy
->
cpu
!=
0
)
return
-
ENODEV
;
result
=
speedstep_smi_ownership
();
if
(
result
)
dprintk
(
KERN_INFO
"cpufreq: fails an aquiring ownership of a SMI interface.
\n
"
);
/* detect low and high frequency */
result
=
speedstep_smi_get_freqs
(
&
speedstep_freqs
[
SPEEDSTEP_LOW
].
frequency
,
&
speedstep_freqs
[
SPEEDSTEP_HIGH
].
frequency
);
if
(
result
)
{
/* fall back to speedstep_lib.c dection mechanism: try both states out */
unsigned
int
speedstep_processor
=
speedstep_detect_processor
();
dprintk
(
KERN_INFO
"speedstep-smi: could not detect low and high frequencies by SMI call.
\n
"
);
if
(
!
speedstep_processor
)
return
-
ENODEV
;
result
=
speedstep_get_freqs
(
speedstep_processor
,
&
speedstep_freqs
[
SPEEDSTEP_LOW
].
frequency
,
&
speedstep_freqs
[
SPEEDSTEP_HIGH
].
frequency
,
&
speedstep_set_state
);
if
(
result
)
{
dprintk
(
KERN_INFO
"speedstep-smi: could not detect two different speeds -- aborting.
\n
"
);
return
result
;
}
else
dprintk
(
KERN_INFO
"speedstep-smi: workaround worked.
\n
"
);
}
/* get current speed setting */
state
=
speedstep_get_state
();
speed
=
speedstep_freqs
[
state
].
frequency
;
dprintk
(
KERN_INFO
"cpufreq: currently at %s speed setting - %i MHz
\n
"
,
(
speed
==
speedstep_freqs
[
SPEEDSTEP_LOW
].
frequency
)
?
"low"
:
"high"
,
(
speed
/
1000
));
/* cpuinfo and default policy values */
policy
->
governor
=
CPUFREQ_DEFAULT_GOVERNOR
;
policy
->
cpuinfo
.
transition_latency
=
CPUFREQ_ETERNAL
;
policy
->
cur
=
speed
;
return
cpufreq_frequency_table_cpuinfo
(
policy
,
&
speedstep_freqs
[
0
]);
}
static
int
speedstep_resume
(
struct
cpufreq_policy
*
policy
)
{
int
result
=
speedstep_smi_ownership
();
if
(
result
)
dprintk
(
KERN_INFO
"cpufreq: fails an aquiring ownership of a SMI interface.
\n
"
);
return
result
;
}
static
struct
cpufreq_driver
speedstep_driver
=
{
.
name
=
"speedstep-smi"
,
.
verify
=
speedstep_verify
,
.
target
=
speedstep_target
,
.
init
=
speedstep_cpu_init
,
.
resume
=
speedstep_resume
,
};
/**
* speedstep_init - initializes the SpeedStep CPUFreq driver
*
* Initializes the SpeedStep support. Returns -ENODEV on unsupported
* BIOS, -EINVAL on problems during initiatization, and zero on
* success.
*/
static
int
__init
speedstep_init
(
void
)
{
dprintk
(
"speedstep-smi: signature:0%.8lx, command:0lx%.8lx, event:0x%.8lx, perf_level:0x%.8lx.
\n
"
,
ist_info
.
signature
,
ist_info
.
command
,
ist_info
.
event
,
ist_info
.
perf_level
);
/* Error if no IST-SMI BIOS or no PARM
sig= 'ISGE' aka 'Intel Speedstep Gate E' */
if
((
ist_info
.
signature
!=
0x47534943
)
&&
(
(
smi_port
==
0
)
||
(
smi_cmd
==
0
)))
return
-
ENODEV
;
if
(
smi_sig
==
1
)
smi_sig
=
0x47534943
;
else
smi_sig
=
ist_info
.
signature
;
/* setup smi_port from MODLULE_PARM or BIOS */
if
((
smi_port
>
0xff
)
||
(
smi_port
<
0
))
{
return
-
EINVAL
;
}
else
if
(
smi_port
==
0
)
{
smi_port
=
ist_info
.
command
&
0xff
;
}
if
((
smi_cmd
>
0xff
)
||
(
smi_cmd
<
0
))
{
return
-
EINVAL
;
}
else
if
(
smi_cmd
==
0
)
{
smi_cmd
=
(
ist_info
.
command
>>
16
)
&
0xff
;
}
return
cpufreq_register_driver
(
&
speedstep_driver
);
}
/**
* speedstep_exit - unregisters SpeedStep support
*
* Unregisters SpeedStep support.
*/
static
void
__exit
speedstep_exit
(
void
)
{
cpufreq_unregister_driver
(
&
speedstep_driver
);
}
module_param
(
smi_port
,
int
,
0444
);
module_param
(
smi_cmd
,
int
,
0444
);
module_param
(
smi_sig
,
uint
,
0444
);
MODULE_PARM_DESC
(
smi_port
,
"Override the BIOS-given IST port with this value -- Intel's default setting is 0xb2"
);
MODULE_PARM_DESC
(
smi_cmd
,
"Override the BIOS-given IST command with this value -- Intel's default setting is 0x82"
);
MODULE_PARM_DESC
(
smi_sig
,
"Set to 1 to fake the IST signature when using the SMI interface."
);
MODULE_AUTHOR
(
"Hiroshi Miura"
);
MODULE_DESCRIPTION
(
"Speedstep driver for IST applet SMI interface."
);
MODULE_LICENSE
(
"GPL"
);
module_init
(
speedstep_init
);
module_exit
(
speedstep_exit
);
arch/i386/kernel/i386_ksyms.c
View file @
5be1676c
...
@@ -33,6 +33,7 @@
...
@@ -33,6 +33,7 @@
#include <asm/tlbflush.h>
#include <asm/tlbflush.h>
#include <asm/nmi.h>
#include <asm/nmi.h>
#include <asm/edd.h>
#include <asm/edd.h>
#include <asm/ist.h>
extern
void
dump_thread
(
struct
pt_regs
*
,
struct
user
*
);
extern
void
dump_thread
(
struct
pt_regs
*
,
struct
user
*
);
extern
spinlock_t
rtc_lock
;
extern
spinlock_t
rtc_lock
;
...
@@ -209,3 +210,7 @@ EXPORT_SYMBOL(kmap_atomic_to_page);
...
@@ -209,3 +210,7 @@ EXPORT_SYMBOL(kmap_atomic_to_page);
EXPORT_SYMBOL
(
edd
);
EXPORT_SYMBOL
(
edd
);
EXPORT_SYMBOL
(
eddnr
);
EXPORT_SYMBOL
(
eddnr
);
#endif
#endif
#if defined(CONFIG_X86_SPEEDSTEP_SMI) || defined(CONFIG_X86_SPEEDSTEP_SMI_MODULE)
EXPORT_SYMBOL
(
ist_info
);
#endif
arch/i386/kernel/setup.c
View file @
5be1676c
...
@@ -44,6 +44,7 @@
...
@@ -44,6 +44,7 @@
#include <asm/arch_hooks.h>
#include <asm/arch_hooks.h>
#include <asm/sections.h>
#include <asm/sections.h>
#include <asm/io_apic.h>
#include <asm/io_apic.h>
#include <asm/ist.h>
#include "setup_arch_pre.h"
#include "setup_arch_pre.h"
#include "mach_resources.h"
#include "mach_resources.h"
...
@@ -102,6 +103,7 @@ struct sys_desc_table_struct {
...
@@ -102,6 +103,7 @@ struct sys_desc_table_struct {
unsigned
char
table
[
0
];
unsigned
char
table
[
0
];
};
};
struct
edid_info
edid_info
;
struct
edid_info
edid_info
;
struct
ist_info
ist_info
;
struct
e820map
e820
;
struct
e820map
e820
;
unsigned
char
aux_device_present
;
unsigned
char
aux_device_present
;
...
@@ -960,6 +962,7 @@ void __init setup_arch(char **cmdline_p)
...
@@ -960,6 +962,7 @@ void __init setup_arch(char **cmdline_p)
screen_info
=
SCREEN_INFO
;
screen_info
=
SCREEN_INFO
;
edid_info
=
EDID_INFO
;
edid_info
=
EDID_INFO
;
apm_info
.
bios
=
APM_BIOS_INFO
;
apm_info
.
bios
=
APM_BIOS_INFO
;
ist_info
=
IST_INFO
;
saved_videomode
=
VIDEO_MODE
;
saved_videomode
=
VIDEO_MODE
;
printk
(
"Video mode to be used for restore is %lx
\n
"
,
saved_videomode
);
printk
(
"Video mode to be used for restore is %lx
\n
"
,
saved_videomode
);
if
(
SYS_DESC_TABLE
.
length
!=
0
)
{
if
(
SYS_DESC_TABLE
.
length
!=
0
)
{
...
...
drivers/cpufreq/cpufreq.c
View file @
5be1676c
/*
/*
* linux/
kernel
/cpufreq.c
* linux/
drivers/cpufreq
/cpufreq.c
*
*
* Copyright (C) 2001 Russell King
* Copyright (C) 2001 Russell King
* (C) 2002 - 2003 Dominik Brodowski <linux@brodo.de>
* (C) 2002 - 2003 Dominik Brodowski <linux@brodo.de>
*
*
* $Id: cpufreq.c,v 1.59 2003/01/20 17:31:48 db Exp $
*
* This program is free software; you can redistribute it and/or modify
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
* published by the Free Software Foundation.
...
@@ -743,26 +741,9 @@ int cpufreq_get_policy(struct cpufreq_policy *policy, unsigned int cpu)
...
@@ -743,26 +741,9 @@ int cpufreq_get_policy(struct cpufreq_policy *policy, unsigned int cpu)
EXPORT_SYMBOL
(
cpufreq_get_policy
);
EXPORT_SYMBOL
(
cpufreq_get_policy
);
/**
static
int
__cpufreq_set_policy
(
struct
cpufreq_policy
*
data
,
struct
cpufreq_policy
*
policy
)
* cpufreq_set_policy - set a new CPUFreq policy
* @policy: policy to be set.
*
* Sets a new CPU frequency and voltage scaling policy.
*/
int
cpufreq_set_policy
(
struct
cpufreq_policy
*
policy
)
{
{
int
ret
=
0
;
int
ret
=
0
;
struct
cpufreq_policy
*
data
;
if
(
!
policy
)
return
-
EINVAL
;
data
=
cpufreq_cpu_get
(
policy
->
cpu
);
if
(
!
data
)
return
-
EINVAL
;
/* lock this CPU */
down
(
&
data
->
lock
);
memcpy
(
&
policy
->
cpuinfo
,
memcpy
(
&
policy
->
cpuinfo
,
&
data
->
cpuinfo
,
&
data
->
cpuinfo
,
...
@@ -829,6 +810,36 @@ int cpufreq_set_policy(struct cpufreq_policy *policy)
...
@@ -829,6 +810,36 @@ int cpufreq_set_policy(struct cpufreq_policy *policy)
}
}
error_out:
error_out:
return
ret
;
}
/**
* cpufreq_set_policy - set a new CPUFreq policy
* @policy: policy to be set.
*
* Sets a new CPU frequency and voltage scaling policy.
*/
int
cpufreq_set_policy
(
struct
cpufreq_policy
*
policy
)
{
int
ret
=
0
;
struct
cpufreq_policy
*
data
;
if
(
!
policy
)
return
-
EINVAL
;
data
=
cpufreq_cpu_get
(
policy
->
cpu
);
if
(
!
data
)
return
-
EINVAL
;
/* lock this CPU */
down
(
&
data
->
lock
);
ret
=
__cpufreq_set_policy
(
data
,
policy
);
data
->
user_policy
.
min
=
data
->
min
;
data
->
user_policy
.
max
=
data
->
max
;
data
->
user_policy
.
policy
=
data
->
policy
;
data
->
user_policy
.
governor
=
data
->
governor
;
up
(
&
data
->
lock
);
up
(
&
data
->
lock
);
cpufreq_cpu_put
(
data
);
cpufreq_cpu_put
(
data
);
...
@@ -837,6 +848,41 @@ int cpufreq_set_policy(struct cpufreq_policy *policy)
...
@@ -837,6 +848,41 @@ int cpufreq_set_policy(struct cpufreq_policy *policy)
EXPORT_SYMBOL
(
cpufreq_set_policy
);
EXPORT_SYMBOL
(
cpufreq_set_policy
);
/**
* cpufreq_update_policy - re-evaluate an existing cpufreq policy
* @cpu: CPU which shall be re-evaluated
*
* Usefull for policy notifiers which have different necessities
* at different times.
*/
int
cpufreq_update_policy
(
unsigned
int
cpu
)
{
struct
cpufreq_policy
*
data
=
cpufreq_cpu_get
(
cpu
);
struct
cpufreq_policy
policy
;
int
ret
=
0
;
if
(
!
data
)
return
-
ENODEV
;
down
(
&
data
->
lock
);
memcpy
(
&
policy
,
&
data
,
sizeof
(
struct
cpufreq_policy
));
policy
.
min
=
data
->
user_policy
.
min
;
policy
.
max
=
data
->
user_policy
.
max
;
policy
.
policy
=
data
->
user_policy
.
policy
;
policy
.
governor
=
data
->
user_policy
.
governor
;
ret
=
__cpufreq_set_policy
(
data
,
&
policy
);
up
(
&
data
->
lock
);
cpufreq_cpu_put
(
data
);
return
ret
;
}
EXPORT_SYMBOL
(
cpufreq_update_policy
);
/*********************************************************************
/*********************************************************************
* EXTERNALLY AFFECTING FREQUENCY CHANGES *
* EXTERNALLY AFFECTING FREQUENCY CHANGES *
...
...
drivers/cpufreq/cpufreq_userspace.c
View file @
5be1676c
/*
/*
*
drivers/cpufreq/
userspace.c
*
linux/drivers/cpufreq/cpufreq_
userspace.c
*
*
* Copyright (C) 2001 Russell King
* Copyright (C) 2001 Russell King
* (C) 2002 - 2003 Dominik Brodowski <linux@brodo.de>
* (C) 2002 - 2003 Dominik Brodowski <linux@brodo.de>
*
*
* $Id:$
*
* This program is free software; you can redistribute it and/or modify
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
* published by the Free Software Foundation.
...
...
include/asm-i386/ist.h
0 → 100644
View file @
5be1676c
#ifndef _ASM_IST_H
#define _ASM_IST_H
/*
* Include file for the interface to IST BIOS
* Copyright 2002 Andy Grover <andrew.grover@intel.com>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2, or (at your option) any
* later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*/
#ifdef __KERNEL__
struct
ist_info
{
unsigned
long
signature
;
unsigned
long
command
;
unsigned
long
event
;
unsigned
long
perf_level
;
};
extern
struct
ist_info
ist_info
;
#endif
/* __KERNEL__ */
#endif
/* _ASM_IST_H */
include/asm-i386/setup.h
View file @
5be1676c
...
@@ -26,6 +26,7 @@
...
@@ -26,6 +26,7 @@
#define E820_MAP_NR (*(char*) (PARAM+E820NR))
#define E820_MAP_NR (*(char*) (PARAM+E820NR))
#define E820_MAP ((struct e820entry *) (PARAM+E820MAP))
#define E820_MAP ((struct e820entry *) (PARAM+E820MAP))
#define APM_BIOS_INFO (*(struct apm_bios_info *) (PARAM+0x40))
#define APM_BIOS_INFO (*(struct apm_bios_info *) (PARAM+0x40))
#define IST_INFO (*(struct ist_info *) (PARAM+0x60))
#define DRIVE_INFO (*(struct drive_info_struct *) (PARAM+0x80))
#define DRIVE_INFO (*(struct drive_info_struct *) (PARAM+0x80))
#define SYS_DESC_TABLE (*(struct sys_desc_table_struct*)(PARAM+0xa0))
#define SYS_DESC_TABLE (*(struct sys_desc_table_struct*)(PARAM+0xa0))
#define MOUNT_ROOT_RDONLY (*(unsigned short *) (PARAM+0x1F2))
#define MOUNT_ROOT_RDONLY (*(unsigned short *) (PARAM+0x1F2))
...
...
include/linux/cpufreq.h
View file @
5be1676c
...
@@ -60,6 +60,13 @@ struct cpufreq_cpuinfo {
...
@@ -60,6 +60,13 @@ struct cpufreq_cpuinfo {
unsigned
int
transition_latency
;
/* in 10^(-9) s */
unsigned
int
transition_latency
;
/* in 10^(-9) s */
};
};
struct
cpufreq_real_policy
{
unsigned
int
min
;
/* in kHz */
unsigned
int
max
;
/* in kHz */
unsigned
int
policy
;
/* see above */
struct
cpufreq_governor
*
governor
;
/* see below */
};
struct
cpufreq_policy
{
struct
cpufreq_policy
{
unsigned
int
cpu
;
/* cpu nr */
unsigned
int
cpu
;
/* cpu nr */
struct
cpufreq_cpuinfo
cpuinfo
;
/* see above */
struct
cpufreq_cpuinfo
cpuinfo
;
/* see above */
...
@@ -74,6 +81,8 @@ struct cpufreq_policy {
...
@@ -74,6 +81,8 @@ struct cpufreq_policy {
struct
semaphore
lock
;
/* CPU ->setpolicy or ->target may
struct
semaphore
lock
;
/* CPU ->setpolicy or ->target may
only be called once a time */
only be called once a time */
struct
cpufreq_real_policy
user_policy
;
struct
kobject
kobj
;
struct
kobject
kobj
;
struct
completion
kobj_unregister
;
struct
completion
kobj_unregister
;
};
};
...
@@ -217,6 +226,7 @@ struct freq_attr {
...
@@ -217,6 +226,7 @@ struct freq_attr {
*********************************************************************/
*********************************************************************/
int
cpufreq_set_policy
(
struct
cpufreq_policy
*
policy
);
int
cpufreq_set_policy
(
struct
cpufreq_policy
*
policy
);
int
cpufreq_get_policy
(
struct
cpufreq_policy
*
policy
,
unsigned
int
cpu
);
int
cpufreq_get_policy
(
struct
cpufreq_policy
*
policy
,
unsigned
int
cpu
);
int
cpufreq_update_policy
(
unsigned
int
cpu
);
/* the proc_intf.c needs this */
/* the proc_intf.c needs this */
int
cpufreq_parse_governor
(
char
*
str_governor
,
unsigned
int
*
policy
,
struct
cpufreq_governor
**
governor
);
int
cpufreq_parse_governor
(
char
*
str_governor
,
unsigned
int
*
policy
,
struct
cpufreq_governor
**
governor
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment