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
Kirill Smelkov
linux
Commits
220ec706
Commit
220ec706
authored
Dec 01, 2005
by
Len Brown
Browse files
Options
Browse Files
Download
Plain Diff
Pull 3410 into release branch
parents
16071a07
1cbf4c56
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
108 additions
and
93 deletions
+108
-93
drivers/acpi/processor_thermal.c
drivers/acpi/processor_thermal.c
+23
-15
drivers/acpi/thermal.c
drivers/acpi/thermal.c
+85
-78
No files found.
drivers/acpi/processor_thermal.c
View file @
220ec706
...
@@ -101,9 +101,7 @@ static unsigned int acpi_thermal_cpufreq_is_init = 0;
...
@@ -101,9 +101,7 @@ static unsigned int acpi_thermal_cpufreq_is_init = 0;
static
int
cpu_has_cpufreq
(
unsigned
int
cpu
)
static
int
cpu_has_cpufreq
(
unsigned
int
cpu
)
{
{
struct
cpufreq_policy
policy
;
struct
cpufreq_policy
policy
;
if
(
!
acpi_thermal_cpufreq_is_init
)
if
(
!
acpi_thermal_cpufreq_is_init
||
cpufreq_get_policy
(
&
policy
,
cpu
))
return
-
ENODEV
;
if
(
!
cpufreq_get_policy
(
&
policy
,
cpu
))
return
-
ENODEV
;
return
-
ENODEV
;
return
0
;
return
0
;
}
}
...
@@ -127,13 +125,13 @@ static int acpi_thermal_cpufreq_decrease(unsigned int cpu)
...
@@ -127,13 +125,13 @@ static int acpi_thermal_cpufreq_decrease(unsigned int cpu)
if
(
!
cpu_has_cpufreq
(
cpu
))
if
(
!
cpu_has_cpufreq
(
cpu
))
return
-
ENODEV
;
return
-
ENODEV
;
if
(
cpufreq_thermal_reduction_pctg
[
cpu
]
>
=
20
)
{
if
(
cpufreq_thermal_reduction_pctg
[
cpu
]
>
20
)
cpufreq_thermal_reduction_pctg
[
cpu
]
-=
20
;
cpufreq_thermal_reduction_pctg
[
cpu
]
-=
20
;
cpufreq_update_policy
(
cpu
);
else
return
0
;
cpufreq_thermal_reduction_pctg
[
cpu
]
=
0
;
}
cpufreq_update_policy
(
cpu
);
/* We reached max freq again and can leave passive mode */
return
-
ERANGE
;
return
!
cpufreq_thermal_reduction_pctg
[
cpu
]
;
}
}
static
int
acpi_thermal_cpufreq_notifier
(
struct
notifier_block
*
nb
,
static
int
acpi_thermal_cpufreq_notifier
(
struct
notifier_block
*
nb
,
...
@@ -200,7 +198,7 @@ int acpi_processor_set_thermal_limit(acpi_handle handle, int type)
...
@@ -200,7 +198,7 @@ int acpi_processor_set_thermal_limit(acpi_handle handle, int type)
int
result
=
0
;
int
result
=
0
;
struct
acpi_processor
*
pr
=
NULL
;
struct
acpi_processor
*
pr
=
NULL
;
struct
acpi_device
*
device
=
NULL
;
struct
acpi_device
*
device
=
NULL
;
int
tx
=
0
;
int
tx
=
0
,
max_tx_px
=
0
;
ACPI_FUNCTION_TRACE
(
"acpi_processor_set_thermal_limit"
);
ACPI_FUNCTION_TRACE
(
"acpi_processor_set_thermal_limit"
);
...
@@ -259,19 +257,27 @@ int acpi_processor_set_thermal_limit(acpi_handle handle, int type)
...
@@ -259,19 +257,27 @@ int acpi_processor_set_thermal_limit(acpi_handle handle, int type)
/* if going down: T-states first, P-states later */
/* if going down: T-states first, P-states later */
if
(
pr
->
flags
.
throttling
)
{
if
(
pr
->
flags
.
throttling
)
{
if
(
tx
==
0
)
if
(
tx
==
0
)
{
max_tx_px
=
1
;
ACPI_DEBUG_PRINT
((
ACPI_DB_INFO
,
ACPI_DEBUG_PRINT
((
ACPI_DB_INFO
,
"At minimum throttling state
\n
"
));
"At minimum throttling state
\n
"
));
else
{
}
else
{
tx
--
;
tx
--
;
goto
end
;
goto
end
;
}
}
}
}
result
=
acpi_thermal_cpufreq_decrease
(
pr
->
id
);
result
=
acpi_thermal_cpufreq_decrease
(
pr
->
id
);
if
(
result
==
-
ERANGE
)
if
(
result
)
{
/*
* We only could get -ERANGE, 1 or 0.
* In the first two cases we reached max freq again.
*/
ACPI_DEBUG_PRINT
((
ACPI_DB_INFO
,
ACPI_DEBUG_PRINT
((
ACPI_DB_INFO
,
"At minimum performance state
\n
"
));
"At minimum performance state
\n
"
));
max_tx_px
=
1
;
}
else
max_tx_px
=
0
;
break
;
break
;
}
}
...
@@ -290,8 +296,10 @@ int acpi_processor_set_thermal_limit(acpi_handle handle, int type)
...
@@ -290,8 +296,10 @@ int acpi_processor_set_thermal_limit(acpi_handle handle, int type)
pr
->
limit
.
thermal
.
px
,
pr
->
limit
.
thermal
.
tx
));
pr
->
limit
.
thermal
.
px
,
pr
->
limit
.
thermal
.
tx
));
}
else
}
else
result
=
0
;
result
=
0
;
if
(
max_tx_px
)
return_VALUE
(
result
);
return_VALUE
(
1
);
else
return_VALUE
(
result
);
}
}
int
acpi_processor_get_limit_info
(
struct
acpi_processor
*
pr
)
int
acpi_processor_get_limit_info
(
struct
acpi_processor
*
pr
)
...
...
drivers/acpi/thermal.c
View file @
220ec706
...
@@ -72,7 +72,7 @@
...
@@ -72,7 +72,7 @@
#define _COMPONENT ACPI_THERMAL_COMPONENT
#define _COMPONENT ACPI_THERMAL_COMPONENT
ACPI_MODULE_NAME
(
"acpi_thermal"
)
ACPI_MODULE_NAME
(
"acpi_thermal"
)
MODULE_AUTHOR
(
"Paul Diefenbaugh"
);
MODULE_AUTHOR
(
"Paul Diefenbaugh"
);
MODULE_DESCRIPTION
(
ACPI_THERMAL_DRIVER_NAME
);
MODULE_DESCRIPTION
(
ACPI_THERMAL_DRIVER_NAME
);
MODULE_LICENSE
(
"GPL"
);
MODULE_LICENSE
(
"GPL"
);
...
@@ -517,9 +517,9 @@ static int acpi_thermal_hot(struct acpi_thermal *tz)
...
@@ -517,9 +517,9 @@ static int acpi_thermal_hot(struct acpi_thermal *tz)
return_VALUE
(
0
);
return_VALUE
(
0
);
}
}
static
int
acpi_thermal_passive
(
struct
acpi_thermal
*
tz
)
static
void
acpi_thermal_passive
(
struct
acpi_thermal
*
tz
)
{
{
int
result
=
0
;
int
result
=
1
;
struct
acpi_thermal_passive
*
passive
=
NULL
;
struct
acpi_thermal_passive
*
passive
=
NULL
;
int
trend
=
0
;
int
trend
=
0
;
int
i
=
0
;
int
i
=
0
;
...
@@ -527,7 +527,7 @@ static int acpi_thermal_passive(struct acpi_thermal *tz)
...
@@ -527,7 +527,7 @@ static int acpi_thermal_passive(struct acpi_thermal *tz)
ACPI_FUNCTION_TRACE
(
"acpi_thermal_passive"
);
ACPI_FUNCTION_TRACE
(
"acpi_thermal_passive"
);
if
(
!
tz
||
!
tz
->
trips
.
passive
.
flags
.
valid
)
if
(
!
tz
||
!
tz
->
trips
.
passive
.
flags
.
valid
)
return
_VALUE
(
-
EINVAL
)
;
return
;
passive
=
&
(
tz
->
trips
.
passive
);
passive
=
&
(
tz
->
trips
.
passive
);
...
@@ -547,7 +547,7 @@ static int acpi_thermal_passive(struct acpi_thermal *tz)
...
@@ -547,7 +547,7 @@ static int acpi_thermal_passive(struct acpi_thermal *tz)
trend
,
passive
->
tc1
,
tz
->
temperature
,
trend
,
passive
->
tc1
,
tz
->
temperature
,
tz
->
last_temperature
,
passive
->
tc2
,
tz
->
last_temperature
,
passive
->
tc2
,
tz
->
temperature
,
passive
->
temperature
));
tz
->
temperature
,
passive
->
temperature
));
tz
->
trips
.
passive
.
flags
.
enabled
=
1
;
passive
->
flags
.
enabled
=
1
;
/* Heating up? */
/* Heating up? */
if
(
trend
>
0
)
if
(
trend
>
0
)
for
(
i
=
0
;
i
<
passive
->
devices
.
count
;
i
++
)
for
(
i
=
0
;
i
<
passive
->
devices
.
count
;
i
++
)
...
@@ -556,12 +556,32 @@ static int acpi_thermal_passive(struct acpi_thermal *tz)
...
@@ -556,12 +556,32 @@ static int acpi_thermal_passive(struct acpi_thermal *tz)
handles
[
i
],
handles
[
i
],
ACPI_PROCESSOR_LIMIT_INCREMENT
);
ACPI_PROCESSOR_LIMIT_INCREMENT
);
/* Cooling off? */
/* Cooling off? */
else
if
(
trend
<
0
)
else
if
(
trend
<
0
)
{
for
(
i
=
0
;
i
<
passive
->
devices
.
count
;
i
++
)
for
(
i
=
0
;
i
<
passive
->
devices
.
count
;
i
++
)
acpi_processor_set_thermal_limit
(
passive
->
/*
devices
.
* assume that we are on highest
handles
[
i
],
* freq/lowest thrott and can leave
ACPI_PROCESSOR_LIMIT_DECREMENT
);
* passive mode, even in error case
*/
if
(
!
acpi_processor_set_thermal_limit
(
passive
->
devices
.
handles
[
i
],
ACPI_PROCESSOR_LIMIT_DECREMENT
))
result
=
0
;
/*
* Leave cooling mode, even if the temp might
* higher than trip point This is because some
* machines might have long thermal polling
* frequencies (tsp) defined. We will fall back
* into passive mode in next cycle (probably quicker)
*/
if
(
result
)
{
passive
->
flags
.
enabled
=
0
;
ACPI_DEBUG_PRINT
((
ACPI_DB_INFO
,
"Disabling passive cooling, still above threshold,"
" but we are cooling down
\n
"
));
}
}
return
;
}
}
/*
/*
...
@@ -571,23 +591,21 @@ static int acpi_thermal_passive(struct acpi_thermal *tz)
...
@@ -571,23 +591,21 @@ static int acpi_thermal_passive(struct acpi_thermal *tz)
* and avoid thrashing around the passive trip point. Note that we
* and avoid thrashing around the passive trip point. Note that we
* assume symmetry.
* assume symmetry.
*/
*/
else
if
(
tz
->
trips
.
passive
.
flags
.
enabled
)
{
if
(
!
passive
->
flags
.
enabled
)
for
(
i
=
0
;
i
<
passive
->
devices
.
count
;
i
++
)
return
;
result
=
for
(
i
=
0
;
i
<
passive
->
devices
.
count
;
i
++
)
acpi_processor_set_thermal_limit
(
passive
->
devices
.
if
(
!
acpi_processor_set_thermal_limit
handles
[
i
],
(
passive
->
devices
.
handles
[
i
],
ACPI_PROCESSOR_LIMIT_DECREMENT
);
ACPI_PROCESSOR_LIMIT_DECREMENT
))
if
(
result
==
1
)
{
result
=
0
;
tz
->
trips
.
passive
.
flags
.
enabled
=
0
;
if
(
result
)
{
ACPI_DEBUG_PRINT
((
ACPI_DB_INFO
,
passive
->
flags
.
enabled
=
0
;
"Disabling passive cooling (zone is cool)
\n
"
));
ACPI_DEBUG_PRINT
((
ACPI_DB_INFO
,
}
"Disabling passive cooling (zone is cool)
\n
"
));
}
}
return_VALUE
(
0
);
}
}
static
int
acpi_thermal_active
(
struct
acpi_thermal
*
tz
)
static
void
acpi_thermal_active
(
struct
acpi_thermal
*
tz
)
{
{
int
result
=
0
;
int
result
=
0
;
struct
acpi_thermal_active
*
active
=
NULL
;
struct
acpi_thermal_active
*
active
=
NULL
;
...
@@ -598,74 +616,66 @@ static int acpi_thermal_active(struct acpi_thermal *tz)
...
@@ -598,74 +616,66 @@ static int acpi_thermal_active(struct acpi_thermal *tz)
ACPI_FUNCTION_TRACE
(
"acpi_thermal_active"
);
ACPI_FUNCTION_TRACE
(
"acpi_thermal_active"
);
if
(
!
tz
)
if
(
!
tz
)
return
_VALUE
(
-
EINVAL
)
;
return
;
for
(
i
=
0
;
i
<
ACPI_THERMAL_MAX_ACTIVE
;
i
++
)
{
for
(
i
=
0
;
i
<
ACPI_THERMAL_MAX_ACTIVE
;
i
++
)
{
active
=
&
(
tz
->
trips
.
active
[
i
]);
active
=
&
(
tz
->
trips
.
active
[
i
]);
if
(
!
active
||
!
active
->
flags
.
valid
)
if
(
!
active
||
!
active
->
flags
.
valid
)
break
;
break
;
/*
* Above Threshold?
* ----------------
* If not already enabled, turn ON all cooling devices
* associated with this active threshold.
*/
if
(
tz
->
temperature
>=
active
->
temperature
)
{
if
(
tz
->
temperature
>=
active
->
temperature
)
{
/*
* Above Threshold?
* ----------------
* If not already enabled, turn ON all cooling devices
* associated with this active threshold.
*/
if
(
active
->
temperature
>
maxtemp
)
if
(
active
->
temperature
>
maxtemp
)
tz
->
state
.
active_index
=
i
,
maxtemp
=
tz
->
state
.
active_index
=
i
;
active
->
temperature
;
maxtemp
=
active
->
temperature
;
if
(
!
active
->
flags
.
enabled
)
{
if
(
active
->
flags
.
enabled
)
for
(
j
=
0
;
j
<
active
->
devices
.
count
;
j
++
)
{
continue
;
result
=
acpi_bus_set_power
(
active
->
devices
.
handles
[
j
],
ACPI_STATE_D0
);
if
(
result
)
{
ACPI_DEBUG_PRINT
((
ACPI_DB_WARN
,
"Unable to turn cooling device [%p] 'on'
\n
"
,
active
->
devices
.
handles
[
j
]));
continue
;
}
active
->
flags
.
enabled
=
1
;
ACPI_DEBUG_PRINT
((
ACPI_DB_INFO
,
"Cooling device [%p] now 'on'
\n
"
,
active
->
devices
.
handles
[
j
]));
}
}
}
/*
* Below Threshold?
* ----------------
* Turn OFF all cooling devices associated with this
* threshold.
*/
else
if
(
active
->
flags
.
enabled
)
{
for
(
j
=
0
;
j
<
active
->
devices
.
count
;
j
++
)
{
for
(
j
=
0
;
j
<
active
->
devices
.
count
;
j
++
)
{
result
=
result
=
acpi_bus_set_power
(
active
->
devices
.
acpi_bus_set_power
(
active
->
devices
.
handles
[
j
],
handles
[
j
],
ACPI_STATE_D
3
);
ACPI_STATE_D
0
);
if
(
result
)
{
if
(
result
)
{
ACPI_DEBUG_PRINT
((
ACPI_DB_WARN
,
ACPI_DEBUG_PRINT
((
ACPI_DB_WARN
,
"Unable to turn cooling device [%p] 'o
ff
'
\n
"
,
"Unable to turn cooling device [%p] 'o
n
'
\n
"
,
active
->
devices
.
active
->
devices
.
handles
[
j
]));
handles
[
j
]));
continue
;
continue
;
}
}
active
->
flags
.
enabled
=
0
;
active
->
flags
.
enabled
=
1
;
ACPI_DEBUG_PRINT
((
ACPI_DB_INFO
,
ACPI_DEBUG_PRINT
((
ACPI_DB_INFO
,
"Cooling device [%p] now 'o
ff
'
\n
"
,
"Cooling device [%p] now 'o
n
'
\n
"
,
active
->
devices
.
handles
[
j
]));
active
->
devices
.
handles
[
j
]));
}
}
continue
;
}
if
(
!
active
->
flags
.
enabled
)
continue
;
/*
* Below Threshold?
* ----------------
* Turn OFF all cooling devices associated with this
* threshold.
*/
for
(
j
=
0
;
j
<
active
->
devices
.
count
;
j
++
)
{
result
=
acpi_bus_set_power
(
active
->
devices
.
handles
[
j
],
ACPI_STATE_D3
);
if
(
result
)
{
ACPI_DEBUG_PRINT
((
ACPI_DB_WARN
,
"Unable to turn cooling device [%p] 'off'
\n
"
,
active
->
devices
.
handles
[
j
]));
continue
;
}
active
->
flags
.
enabled
=
0
;
ACPI_DEBUG_PRINT
((
ACPI_DB_INFO
,
"Cooling device [%p] now 'off'
\n
"
,
active
->
devices
.
handles
[
j
]));
}
}
}
}
return_VALUE
(
0
);
}
}
static
void
acpi_thermal_check
(
void
*
context
);
static
void
acpi_thermal_check
(
void
*
context
);
...
@@ -744,15 +754,12 @@ static void acpi_thermal_check(void *data)
...
@@ -744,15 +754,12 @@ static void acpi_thermal_check(void *data)
* Again, separated from the above two to allow independent policy
* Again, separated from the above two to allow independent policy
* decisions.
* decisions.
*/
*/
if
(
tz
->
trips
.
critical
.
flags
.
enabled
)
tz
->
state
.
critical
=
tz
->
trips
.
critical
.
flags
.
enabled
;
tz
->
state
.
critical
=
1
;
tz
->
state
.
hot
=
tz
->
trips
.
hot
.
flags
.
enabled
;
if
(
tz
->
trips
.
hot
.
flags
.
enabled
)
tz
->
state
.
passive
=
tz
->
trips
.
passive
.
flags
.
enabled
;
tz
->
state
.
hot
=
1
;
tz
->
state
.
active
=
0
;
if
(
tz
->
trips
.
passive
.
flags
.
enabled
)
tz
->
state
.
passive
=
1
;
for
(
i
=
0
;
i
<
ACPI_THERMAL_MAX_ACTIVE
;
i
++
)
for
(
i
=
0
;
i
<
ACPI_THERMAL_MAX_ACTIVE
;
i
++
)
if
(
tz
->
trips
.
active
[
i
].
flags
.
enabled
)
tz
->
state
.
active
|=
tz
->
trips
.
active
[
i
].
flags
.
enabled
;
tz
->
state
.
active
=
1
;
/*
/*
* Calculate Sleep Time
* Calculate Sleep Time
...
...
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