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
4c8aded7
Commit
4c8aded7
authored
Oct 21, 2004
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge
bk://kernel.bkbits.net/jgarzik/libata-2.6
into ppc970.osdl.org:/home/torvalds/v2.6/linux
parents
f5b8a851
892e9689
Changes
22
Hide whitespace changes
Inline
Side-by-side
Showing
22 changed files
with
598 additions
and
177 deletions
+598
-177
arch/i386/Kconfig
arch/i386/Kconfig
+4
-0
arch/ppc/kernel/irq.c
arch/ppc/kernel/irq.c
+5
-0
arch/ppc64/boot/main.c
arch/ppc64/boot/main.c
+1
-1
arch/ppc64/kernel/prom_init.c
arch/ppc64/kernel/prom_init.c
+1
-1
arch/ppc64/mm/init.c
arch/ppc64/mm/init.c
+1
-1
arch/x86_64/Kconfig
arch/x86_64/Kconfig
+4
-0
drivers/macintosh/therm_pm72.c
drivers/macintosh/therm_pm72.c
+475
-105
drivers/macintosh/therm_pm72.h
drivers/macintosh/therm_pm72.h
+39
-11
drivers/scsi/aic7xxx_old.c
drivers/scsi/aic7xxx_old.c
+6
-11
drivers/scsi/initio.c
drivers/scsi/initio.c
+5
-5
drivers/scsi/qlogicisp.c
drivers/scsi/qlogicisp.c
+8
-9
drivers/video/aty/aty128fb.c
drivers/video/aty/aty128fb.c
+12
-12
drivers/video/aty/atyfb.h
drivers/video/aty/atyfb.h
+3
-3
drivers/video/aty/atyfb_base.c
drivers/video/aty/atyfb_base.c
+6
-8
drivers/video/aty/mach64_cursor.c
drivers/video/aty/mach64_cursor.c
+5
-4
include/asm-i386/thread_info.h
include/asm-i386/thread_info.h
+1
-1
include/asm-ppc/thread_info.h
include/asm-ppc/thread_info.h
+1
-1
include/asm-ppc64/thread_info.h
include/asm-ppc64/thread_info.h
+1
-1
include/asm-x86_64/thread_info.h
include/asm-x86_64/thread_info.h
+1
-1
include/linux/hardirq.h
include/linux/hardirq.h
+1
-1
include/linux/interrupt.h
include/linux/interrupt.h
+16
-0
kernel/irq/Makefile
kernel/irq/Makefile
+2
-1
No files found.
arch/i386/Kconfig
View file @
4c8aded7
...
...
@@ -1207,6 +1207,10 @@ config GENERIC_HARDIRQS
bool
default y
config GENERIC_IRQ_PROBE
bool
default y
config X86_SMP
bool
depends on SMP && !X86_VOYAGER
...
...
arch/ppc/kernel/irq.c
View file @
4c8aded7
...
...
@@ -71,6 +71,11 @@ unsigned long ppc_cached_irq_mask[NR_MASK_WORDS];
unsigned
long
ppc_lost_interrupts
[
NR_MASK_WORDS
];
atomic_t
ppc_n_lost_interrupts
;
#ifdef CONFIG_TAU_INT
extern
int
tau_initialized
;
extern
int
tau_interrupts
(
int
);
#endif
int
show_interrupts
(
struct
seq_file
*
p
,
void
*
v
)
{
int
i
=
*
(
loff_t
*
)
v
,
j
;
...
...
arch/ppc64/boot/main.c
View file @
4c8aded7
...
...
@@ -166,7 +166,7 @@ void start(unsigned long a1, unsigned long a2, void *promptr)
gunzip
((
void
*
)
vmlinux
.
addr
,
vmlinux
.
size
,
(
unsigned
char
*
)
vmlinuz
.
addr
,
&
len
);
printf
(
"done 0x%lx bytes
\n\r
"
,
len
);
printf
(
"0x%x bytes of heap consumed, max in use 0x%
\n\r
"
,
printf
(
"0x%x bytes of heap consumed, max in use 0x%
x
\n\r
"
,
(
unsigned
)(
avail_high
-
begin_avail
),
heap_max
);
}
else
{
memmove
((
void
*
)
vmlinux
.
addr
,(
void
*
)
vmlinuz
.
addr
,
vmlinuz
.
size
);
...
...
arch/ppc64/kernel/prom_init.c
View file @
4c8aded7
...
...
@@ -675,7 +675,7 @@ static void __init prom_init_mem(void)
if
(
RELOC
(
of_platform
)
==
PLATFORM_PSERIES_LPAR
)
RELOC
(
alloc_top
)
=
RELOC
(
rmo_top
);
else
RELOC
(
alloc_top
)
=
min
(
0x40000000ul
,
RELOC
(
ram_top
));
RELOC
(
alloc_top
)
=
RELOC
(
rmo_top
)
=
min
(
0x40000000ul
,
RELOC
(
ram_top
));
RELOC
(
alloc_bottom
)
=
PAGE_ALIGN
(
RELOC
(
klimit
)
-
offset
+
0x4000
);
RELOC
(
alloc_top_high
)
=
RELOC
(
ram_top
);
...
...
arch/ppc64/mm/init.c
View file @
4c8aded7
...
...
@@ -265,7 +265,7 @@ int __ioremap_explicit(unsigned long pa, unsigned long ea,
}
else
{
area
=
im_get_area
(
ea
,
size
,
IM_REGION_UNUSED
|
IM_REGION_SUBSET
);
if
(
area
==
NULL
)
{
printk
(
KERN_ERR
"could not obtain imalloc area for ea 0x%lx
\n
"
,
ea
);
/* Expected when PHB-dlpar is in play */
return
1
;
}
if
(
ea
!=
(
unsigned
long
)
area
->
addr
)
{
...
...
arch/x86_64/Kconfig
View file @
4c8aded7
...
...
@@ -346,6 +346,10 @@ config GENERIC_HARDIRQS
bool
default y
config GENERIC_IRQ_PROBE
bool
default y
menu "Power management options"
source kernel/power/Kconfig
...
...
drivers/macintosh/therm_pm72.c
View file @
4c8aded7
...
...
@@ -46,6 +46,9 @@
* overtemp conditions so userland can take some policy
* decisions, like slewing down CPUs
* - Deal with fan and i2c failures in a better way
* - Maybe do a generic PID based on params used for
* U3 and Drives ?
* - Add RackMac3,1 support (XServe g5)
*
* History:
*
...
...
@@ -73,6 +76,15 @@
* values in the configuration register
* - Switch back to use of target fan speed for PID, thus lowering
* pressure on i2c
*
* Oct. 20, 2004 : 1.1
* - Add device-tree lookup for fan IDs, should detect liquid cooling
* pumps when present
* - Enable driver for PowerMac7,3 machines
* - Split the U3/Backside cooling on U3 & U3H versions as Darwin does
* - Add new CPU cooling algorithm for machines with liquid cooling
* - Workaround for some PowerMac7,3 with empty "fan" node in the devtree
* - Fix a signed/unsigned compare issue in some PID loops
*/
#include <linux/config.h>
...
...
@@ -88,7 +100,6 @@
#include <linux/spinlock.h>
#include <linux/smp_lock.h>
#include <linux/wait.h>
#include <linux/suspend.h>
#include <linux/reboot.h>
#include <linux/kmod.h>
#include <linux/i2c.h>
...
...
@@ -102,7 +113,7 @@
#include "therm_pm72.h"
#define VERSION "
0.9
"
#define VERSION "
1.1
"
#undef DEBUG
...
...
@@ -122,15 +133,99 @@ static struct i2c_adapter * u3_0;
static
struct
i2c_adapter
*
u3_1
;
static
struct
i2c_client
*
fcu
;
static
struct
cpu_pid_state
cpu_state
[
2
];
static
struct
basckside_pid_params
backside_params
;
static
struct
backside_pid_state
backside_state
;
static
struct
drives_pid_state
drives_state
;
static
int
state
;
static
int
cpu_count
;
static
int
cpu_pid_type
;
static
pid_t
ctrl_task
;
static
struct
completion
ctrl_complete
;
static
int
critical_state
;
static
DECLARE_MUTEX
(
driver_lock
);
/*
* We have 2 types of CPU PID control. One is "split" old style control
* for intake & exhaust fans, the other is "combined" control for both
* CPUs that also deals with the pumps when present. To be "compatible"
* with OS X at this point, we only use "COMBINED" on the machines that
* are identified as having the pumps (though that identification is at
* least dodgy). Ultimately, we could probably switch completely to this
* algorithm provided we hack it to deal with the UP case
*/
#define CPU_PID_TYPE_SPLIT 0
#define CPU_PID_TYPE_COMBINED 1
/*
* This table describes all fans in the FCU. The "id" and "type" values
* are defaults valid for all earlier machines. Newer machines will
* eventually override the table content based on the device-tree
*/
struct
fcu_fan_table
{
char
*
loc
;
/* location code */
int
type
;
/* 0 = rpm, 1 = pwm, 2 = pump */
int
id
;
/* id or -1 */
};
#define FCU_FAN_RPM 0
#define FCU_FAN_PWM 1
#define FCU_FAN_ABSENT_ID -1
#define FCU_FAN_COUNT ARRAY_SIZE(fcu_fans)
struct
fcu_fan_table
fcu_fans
[]
=
{
[
BACKSIDE_FAN_PWM_INDEX
]
=
{
.
loc
=
"BACKSIDE"
,
.
type
=
FCU_FAN_PWM
,
.
id
=
BACKSIDE_FAN_PWM_DEFAULT_ID
,
},
[
DRIVES_FAN_RPM_INDEX
]
=
{
.
loc
=
"DRIVE BAY"
,
.
type
=
FCU_FAN_RPM
,
.
id
=
DRIVES_FAN_RPM_DEFAULT_ID
,
},
[
SLOTS_FAN_PWM_INDEX
]
=
{
.
loc
=
"SLOT"
,
.
type
=
FCU_FAN_PWM
,
.
id
=
SLOTS_FAN_PWM_DEFAULT_ID
,
},
[
CPUA_INTAKE_FAN_RPM_INDEX
]
=
{
.
loc
=
"CPU A INTAKE"
,
.
type
=
FCU_FAN_RPM
,
.
id
=
CPUA_INTAKE_FAN_RPM_DEFAULT_ID
,
},
[
CPUA_EXHAUST_FAN_RPM_INDEX
]
=
{
.
loc
=
"CPU A EXHAUST"
,
.
type
=
FCU_FAN_RPM
,
.
id
=
CPUA_EXHAUST_FAN_RPM_DEFAULT_ID
,
},
[
CPUB_INTAKE_FAN_RPM_INDEX
]
=
{
.
loc
=
"CPU B INTAKE"
,
.
type
=
FCU_FAN_RPM
,
.
id
=
CPUB_INTAKE_FAN_RPM_DEFAULT_ID
,
},
[
CPUB_EXHAUST_FAN_RPM_INDEX
]
=
{
.
loc
=
"CPU B EXHAUST"
,
.
type
=
FCU_FAN_RPM
,
.
id
=
CPUB_EXHAUST_FAN_RPM_DEFAULT_ID
,
},
/* pumps aren't present by default, have to be looked up in the
* device-tree
*/
[
CPUA_PUMP_RPM_INDEX
]
=
{
.
loc
=
"CPU A PUMP"
,
.
type
=
FCU_FAN_RPM
,
.
id
=
FCU_FAN_ABSENT_ID
,
},
[
CPUB_PUMP_RPM_INDEX
]
=
{
.
loc
=
"CPU B PUMP"
,
.
type
=
FCU_FAN_RPM
,
.
id
=
FCU_FAN_ABSENT_ID
,
},
};
/*
* i2c_driver structure to attach to the host i2c controller
*/
...
...
@@ -332,10 +427,16 @@ static int start_fcu(void)
return
0
;
}
static
int
set_rpm_fan
(
int
fan
,
int
rpm
)
static
int
set_rpm_fan
(
int
fan
_index
,
int
rpm
)
{
unsigned
char
buf
[
2
];
int
rc
;
int
rc
,
id
;
if
(
fcu_fans
[
fan_index
].
type
!=
FCU_FAN_RPM
)
return
-
EINVAL
;
id
=
fcu_fans
[
fan_index
].
id
;
if
(
id
==
FCU_FAN_ABSENT_ID
)
return
-
EINVAL
;
if
(
rpm
<
300
)
rpm
=
300
;
...
...
@@ -343,43 +444,55 @@ static int set_rpm_fan(int fan, int rpm)
rpm
=
8191
;
buf
[
0
]
=
rpm
>>
5
;
buf
[
1
]
=
rpm
<<
3
;
rc
=
fan_write_reg
(
0x10
+
(
fan
*
2
),
buf
,
2
);
rc
=
fan_write_reg
(
0x10
+
(
id
*
2
),
buf
,
2
);
if
(
rc
<
0
)
return
-
EIO
;
return
0
;
}
static
int
get_rpm_fan
(
int
fan
,
int
programmed
)
static
int
get_rpm_fan
(
int
fan
_index
,
int
programmed
)
{
unsigned
char
failure
;
unsigned
char
active
;
unsigned
char
buf
[
2
];
int
rc
,
reg_base
;
int
rc
,
id
,
reg_base
;
if
(
fcu_fans
[
fan_index
].
type
!=
FCU_FAN_RPM
)
return
-
EINVAL
;
id
=
fcu_fans
[
fan_index
].
id
;
if
(
id
==
FCU_FAN_ABSENT_ID
)
return
-
EINVAL
;
rc
=
fan_read_reg
(
0xb
,
&
failure
,
1
);
if
(
rc
!=
1
)
return
-
EIO
;
if
((
failure
&
(
1
<<
fan
))
!=
0
)
if
((
failure
&
(
1
<<
id
))
!=
0
)
return
-
EFAULT
;
rc
=
fan_read_reg
(
0xd
,
&
active
,
1
);
if
(
rc
!=
1
)
return
-
EIO
;
if
((
active
&
(
1
<<
fan
))
==
0
)
if
((
active
&
(
1
<<
id
))
==
0
)
return
-
ENXIO
;
/* Programmed value or real current speed */
reg_base
=
programmed
?
0x10
:
0x11
;
rc
=
fan_read_reg
(
reg_base
+
(
fan
*
2
),
buf
,
2
);
rc
=
fan_read_reg
(
reg_base
+
(
id
*
2
),
buf
,
2
);
if
(
rc
!=
2
)
return
-
EIO
;
return
(
buf
[
0
]
<<
5
)
|
buf
[
1
]
>>
3
;
}
static
int
set_pwm_fan
(
int
fan
,
int
pwm
)
static
int
set_pwm_fan
(
int
fan
_index
,
int
pwm
)
{
unsigned
char
buf
[
2
];
int
rc
;
int
rc
,
id
;
if
(
fcu_fans
[
fan_index
].
type
!=
FCU_FAN_PWM
)
return
-
EINVAL
;
id
=
fcu_fans
[
fan_index
].
id
;
if
(
id
==
FCU_FAN_ABSENT_ID
)
return
-
EINVAL
;
if
(
pwm
<
10
)
pwm
=
10
;
...
...
@@ -387,32 +500,38 @@ static int set_pwm_fan(int fan, int pwm)
pwm
=
100
;
pwm
=
(
pwm
*
2559
)
/
1000
;
buf
[
0
]
=
pwm
;
rc
=
fan_write_reg
(
0x30
+
(
fan
*
2
),
buf
,
1
);
rc
=
fan_write_reg
(
0x30
+
(
id
*
2
),
buf
,
1
);
if
(
rc
<
0
)
return
rc
;
return
0
;
}
static
int
get_pwm_fan
(
int
fan
)
static
int
get_pwm_fan
(
int
fan
_index
)
{
unsigned
char
failure
;
unsigned
char
active
;
unsigned
char
buf
[
2
];
int
rc
;
int
rc
,
id
;
if
(
fcu_fans
[
fan_index
].
type
!=
FCU_FAN_PWM
)
return
-
EINVAL
;
id
=
fcu_fans
[
fan_index
].
id
;
if
(
id
==
FCU_FAN_ABSENT_ID
)
return
-
EINVAL
;
rc
=
fan_read_reg
(
0x2b
,
&
failure
,
1
);
if
(
rc
!=
1
)
return
-
EIO
;
if
((
failure
&
(
1
<<
fan
))
!=
0
)
if
((
failure
&
(
1
<<
id
))
!=
0
)
return
-
EFAULT
;
rc
=
fan_read_reg
(
0x2d
,
&
active
,
1
);
if
(
rc
!=
1
)
return
-
EIO
;
if
((
active
&
(
1
<<
fan
))
==
0
)
if
((
active
&
(
1
<<
id
))
==
0
)
return
-
ENXIO
;
/* Programmed value or real current speed */
rc
=
fan_read_reg
(
0x30
+
(
fan
*
2
),
buf
,
1
);
rc
=
fan_read_reg
(
0x30
+
(
id
*
2
),
buf
,
1
);
if
(
rc
!=
1
)
return
-
EIO
;
...
...
@@ -514,80 +633,84 @@ static DEVICE_ATTR(drives_fan_rpm,S_IRUGO,show_drives_fan_rpm,NULL);
/*
* CPUs fans control loop
*/
static
void
do_monitor_cpu
(
struct
cpu_pid_state
*
state
)
static
int
do_read_one_cpu_values
(
struct
cpu_pid_state
*
state
,
s32
*
temp
,
s32
*
power
)
{
s32
temp
,
voltage
,
current_a
,
power
,
power_target
;
s32
integral
,
derivative
,
proportional
,
adj_in_target
,
sval
;
s64
integ_p
,
deriv_p
,
prop_p
,
sum
;
int
i
,
intake
,
rc
;
s32
ltemp
,
volts
,
amps
;
int
rc
=
0
;
DBG
(
"cpu %d:
\n
"
,
state
->
index
);
/* Default (in case of error) */
*
temp
=
state
->
cur_temp
;
*
power
=
state
->
cur_power
;
/* Read current fan status */
if
(
state
->
index
==
0
)
rc
=
get_rpm_fan
(
CPUA_EXHAUST_FAN_RPM_I
D
,
!
RPM_PID_USE_ACTUAL_SPEED
);
rc
=
get_rpm_fan
(
CPUA_EXHAUST_FAN_RPM_I
NDEX
,
!
RPM_PID_USE_ACTUAL_SPEED
);
else
rc
=
get_rpm_fan
(
CPUB_EXHAUST_FAN_RPM_I
D
,
!
RPM_PID_USE_ACTUAL_SPEED
);
rc
=
get_rpm_fan
(
CPUB_EXHAUST_FAN_RPM_I
NDEX
,
!
RPM_PID_USE_ACTUAL_SPEED
);
if
(
rc
<
0
)
{
printk
(
KERN_WARNING
"Error %d reading CPU %d exhaust fan !
\n
"
,
rc
,
state
->
index
);
/* XXX What do we do now ? */
}
else
/* XXX What do we do now ? Nothing for now, keep old value, but
* return error upstream
*/
DBG
(
" cpu %d, fan reading error !
\n
"
,
state
->
index
);
}
else
{
state
->
rpm
=
rc
;
DBG
(
" current rpm: %d
\n
"
,
state
->
rpm
);
DBG
(
" cpu %d, exhaust RPM: %d
\n
"
,
state
->
index
,
state
->
rpm
);
}
/* Get some sensor readings and scale it */
temp
=
read_smon_adc
(
state
,
1
);
if
(
temp
==
-
1
)
{
ltemp
=
read_smon_adc
(
state
,
1
);
if
(
ltemp
==
-
1
)
{
/* XXX What do we do now ? */
state
->
overtemp
++
;
return
;
if
(
rc
==
0
)
rc
=
-
EIO
;
DBG
(
" cpu %d, temp reading error !
\n
"
,
state
->
index
);
}
else
{
/* Fixup temperature according to diode calibration
*/
DBG
(
" cpu %d, temp raw: %04x, m_diode: %04x, b_diode: %04x
\n
"
,
state
->
index
,
ltemp
,
state
->
mpu
.
mdiode
,
state
->
mpu
.
bdiode
);
*
temp
=
((
s32
)
ltemp
*
(
s32
)
state
->
mpu
.
mdiode
+
((
s32
)
state
->
mpu
.
bdiode
<<
12
))
>>
2
;
state
->
last_temp
=
*
temp
;
DBG
(
" temp: %d.%03d
\n
"
,
FIX32TOPRINT
((
*
temp
)));
}
voltage
=
read_smon_adc
(
state
,
3
);
current_a
=
read_smon_adc
(
state
,
4
);
/* Fixup temperature according to diode calibration
/*
* Read voltage & current and calculate power
*/
DBG
(
" temp raw: %04x, m_diode: %04x, b_diode: %04x
\n
"
,
temp
,
state
->
mpu
.
mdiode
,
state
->
mpu
.
bdiode
);
temp
=
((
s32
)
temp
*
(
s32
)
state
->
mpu
.
mdiode
+
((
s32
)
state
->
mpu
.
bdiode
<<
12
))
>>
2
;
state
->
last_temp
=
temp
;
DBG
(
" temp: %d.%03d
\n
"
,
FIX32TOPRINT
(
temp
));
volts
=
read_smon_adc
(
state
,
3
);
amps
=
read_smon_adc
(
state
,
4
);
/* Check tmax, increment overtemp if we are there. At tmax+8, we go
* full blown immediately and try to trigger a shutdown
*/
if
(
temp
>=
((
state
->
mpu
.
tmax
+
8
)
<<
16
))
{
printk
(
KERN_WARNING
"Warning ! CPU %d temperature way above maximum"
" (%d) !
\n
"
,
state
->
index
,
temp
>>
16
);
state
->
overtemp
=
CPU_MAX_OVERTEMP
;
}
else
if
(
temp
>
(
state
->
mpu
.
tmax
<<
16
))
state
->
overtemp
++
;
else
state
->
overtemp
=
0
;
if
(
state
->
overtemp
>=
CPU_MAX_OVERTEMP
)
critical_state
=
1
;
if
(
state
->
overtemp
>
0
)
{
state
->
rpm
=
state
->
mpu
.
rmaxn_exhaust_fan
;
state
->
intake_rpm
=
intake
=
state
->
mpu
.
rmaxn_intake_fan
;
goto
do_set_fans
;
}
/* Scale other sensor values according to fixed scales
/* Scale voltage and current raw sensor values according to fixed scales
* obtained in Darwin and calculate power from I and V
*/
state
->
voltage
=
voltage
*=
ADC_CPU_VOLTAGE_SCALE
;
state
->
current_a
=
current_a
*=
ADC_CPU_CURRENT_SCALE
;
power
=
(((
u64
)
current_a
)
*
((
u64
)
voltage
))
>>
16
;
volts
*=
ADC_CPU_VOLTAGE_SCALE
;
amps
*=
ADC_CPU_CURRENT_SCALE
;
*
power
=
(((
u64
)
volts
)
*
((
u64
)
amps
))
>>
16
;
state
->
voltage
=
volts
;
state
->
current_a
=
amps
;
state
->
last_power
=
*
power
;
DBG
(
" cpu %d, current: %d.%03d, voltage: %d.%03d, power: %d.%03d W
\n
"
,
state
->
index
,
FIX32TOPRINT
(
state
->
current_a
),
FIX32TOPRINT
(
state
->
voltage
),
FIX32TOPRINT
(
*
power
));
return
0
;
}
static
void
do_cpu_pid
(
struct
cpu_pid_state
*
state
,
s32
temp
,
s32
power
)
{
s32
power_target
,
integral
,
derivative
,
proportional
,
adj_in_target
,
sval
;
s64
integ_p
,
deriv_p
,
prop_p
,
sum
;
int
i
;
/* Calculate power target value (could be done once for all)
* and convert to a 16.16 fp number
*/
power_target
=
((
u32
)(
state
->
mpu
.
pmaxh
-
state
->
mpu
.
padjmax
))
<<
16
;
DBG
(
" current: %d.%03d, voltage: %d.%03d
\n
"
,
FIX32TOPRINT
(
current_a
),
FIX32TOPRINT
(
voltage
));
DBG
(
" power: %d.%03d W, target: %d.%03d, error: %d.%03d
\n
"
,
FIX32TOPRINT
(
power
),
DBG
(
" power target: %d.%03d, error: %d.%03d
\n
"
,
FIX32TOPRINT
(
power_target
),
FIX32TOPRINT
(
power_target
-
power
));
/* Store temperature and power in history array */
...
...
@@ -627,7 +750,7 @@ static void do_monitor_cpu(struct cpu_pid_state *state)
* input target is mpu.ttarget, input max is mpu.tmax
*/
integ_p
=
((
s64
)
state
->
mpu
.
pid_gr
)
*
(
s64
)
integral
;
DBG
(
" integ_p: %d
\n
"
,
(
int
)(
deriv
_p
>>
36
));
DBG
(
" integ_p: %d
\n
"
,
(
int
)(
integ
_p
>>
36
));
sval
=
(
state
->
mpu
.
tmax
<<
16
)
-
((
integ_p
>>
20
)
&
0xffffffff
);
adj_in_target
=
(
state
->
mpu
.
ttarget
<<
16
);
if
(
adj_in_target
>
sval
)
...
...
@@ -656,15 +779,136 @@ static void do_monitor_cpu(struct cpu_pid_state *state)
DBG
(
" sum: %d
\n
"
,
(
int
)
sum
);
state
->
rpm
+=
(
s32
)
sum
;
if
(
state
->
rpm
<
state
->
mpu
.
rminn_exhaust_fan
)
if
(
state
->
rpm
<
(
int
)
state
->
mpu
.
rminn_exhaust_fan
)
state
->
rpm
=
state
->
mpu
.
rminn_exhaust_fan
;
if
(
state
->
rpm
>
state
->
mpu
.
rmaxn_exhaust_fan
)
if
(
state
->
rpm
>
(
int
)
state
->
mpu
.
rmaxn_exhaust_fan
)
state
->
rpm
=
state
->
mpu
.
rmaxn_exhaust_fan
;
}
static
void
do_monitor_cpu_combined
(
void
)
{
struct
cpu_pid_state
*
state0
=
&
cpu_state
[
0
];
struct
cpu_pid_state
*
state1
=
&
cpu_state
[
1
];
s32
temp0
,
power0
,
temp1
,
power1
;
s32
temp_combi
,
power_combi
;
int
rc
,
intake
,
pump
;
rc
=
do_read_one_cpu_values
(
state0
,
&
temp0
,
&
power0
);
if
(
rc
<
0
)
{
/* XXX What do we do now ? */
}
state1
->
overtemp
=
0
;
rc
=
do_read_one_cpu_values
(
state1
,
&
temp1
,
&
power1
);
if
(
rc
<
0
)
{
/* XXX What do we do now ? */
}
if
(
state1
->
overtemp
)
state0
->
overtemp
++
;
temp_combi
=
max
(
temp0
,
temp1
);
power_combi
=
max
(
power0
,
power1
);
/* Check tmax, increment overtemp if we are there. At tmax+8, we go
* full blown immediately and try to trigger a shutdown
*/
if
(
temp_combi
>=
((
state0
->
mpu
.
tmax
+
8
)
<<
16
))
{
printk
(
KERN_WARNING
"Warning ! Temperature way above maximum (%d) !
\n
"
,
temp_combi
>>
16
);
state0
->
overtemp
=
CPU_MAX_OVERTEMP
;
}
else
if
(
temp_combi
>
(
state0
->
mpu
.
tmax
<<
16
))
state0
->
overtemp
++
;
else
state0
->
overtemp
=
0
;
if
(
state0
->
overtemp
>=
CPU_MAX_OVERTEMP
)
critical_state
=
1
;
if
(
state0
->
overtemp
>
0
)
{
state0
->
rpm
=
state0
->
mpu
.
rmaxn_exhaust_fan
;
state0
->
intake_rpm
=
intake
=
state0
->
mpu
.
rmaxn_intake_fan
;
pump
=
CPU_PUMP_OUTPUT_MAX
;
goto
do_set_fans
;
}
/* Do the PID */
do_cpu_pid
(
state0
,
temp_combi
,
power_combi
);
/* Calculate intake fan speed */
intake
=
(
state0
->
rpm
*
CPU_INTAKE_SCALE
)
>>
16
;
if
(
intake
<
(
int
)
state0
->
mpu
.
rminn_intake_fan
)
intake
=
state0
->
mpu
.
rminn_intake_fan
;
if
(
intake
>
(
int
)
state0
->
mpu
.
rmaxn_intake_fan
)
intake
=
state0
->
mpu
.
rmaxn_intake_fan
;
state0
->
intake_rpm
=
intake
;
/* Calculate pump speed */
pump
=
(
state0
->
rpm
*
CPU_PUMP_OUTPUT_MAX
)
/
state0
->
mpu
.
rmaxn_exhaust_fan
;
if
(
pump
>
CPU_PUMP_OUTPUT_MAX
)
pump
=
CPU_PUMP_OUTPUT_MAX
;
if
(
pump
<
CPU_PUMP_OUTPUT_MIN
)
pump
=
CPU_PUMP_OUTPUT_MIN
;
do_set_fans:
/* We copy values from state 0 to state 1 for /sysfs */
state1
->
rpm
=
state0
->
rpm
;
state1
->
intake_rpm
=
state0
->
intake_rpm
;
DBG
(
"** CPU %d RPM: %d Ex, %d, Pump: %d, In, overtemp: %d
\n
"
,
state1
->
index
,
(
int
)
state1
->
rpm
,
intake
,
pump
,
state1
->
overtemp
);
/* We should check for errors, shouldn't we ? But then, what
* do we do once the error occurs ? For FCU notified fan
* failures (-EFAULT) we probably want to notify userland
* some way...
*/
set_rpm_fan
(
CPUA_INTAKE_FAN_RPM_INDEX
,
intake
);
set_rpm_fan
(
CPUA_EXHAUST_FAN_RPM_INDEX
,
state0
->
rpm
);
set_rpm_fan
(
CPUB_INTAKE_FAN_RPM_INDEX
,
intake
);
set_rpm_fan
(
CPUB_EXHAUST_FAN_RPM_INDEX
,
state0
->
rpm
);
if
(
fcu_fans
[
CPUA_PUMP_RPM_INDEX
].
id
!=
FCU_FAN_ABSENT_ID
)
set_rpm_fan
(
CPUA_PUMP_RPM_INDEX
,
pump
);
if
(
fcu_fans
[
CPUB_PUMP_RPM_INDEX
].
id
!=
FCU_FAN_ABSENT_ID
)
set_rpm_fan
(
CPUB_PUMP_RPM_INDEX
,
pump
);
}
static
void
do_monitor_cpu_split
(
struct
cpu_pid_state
*
state
)
{
s32
temp
,
power
;
int
rc
,
intake
;
/* Read current fan status */
rc
=
do_read_one_cpu_values
(
state
,
&
temp
,
&
power
);
if
(
rc
<
0
)
{
/* XXX What do we do now ? */
}
/* Check tmax, increment overtemp if we are there. At tmax+8, we go
* full blown immediately and try to trigger a shutdown
*/
if
(
temp
>=
((
state
->
mpu
.
tmax
+
8
)
<<
16
))
{
printk
(
KERN_WARNING
"Warning ! CPU %d temperature way above maximum"
" (%d) !
\n
"
,
state
->
index
,
temp
>>
16
);
state
->
overtemp
=
CPU_MAX_OVERTEMP
;
}
else
if
(
temp
>
(
state
->
mpu
.
tmax
<<
16
))
state
->
overtemp
++
;
else
state
->
overtemp
=
0
;
if
(
state
->
overtemp
>=
CPU_MAX_OVERTEMP
)
critical_state
=
1
;
if
(
state
->
overtemp
>
0
)
{
state
->
rpm
=
state
->
mpu
.
rmaxn_exhaust_fan
;
state
->
intake_rpm
=
intake
=
state
->
mpu
.
rmaxn_intake_fan
;
goto
do_set_fans
;
}
/* Do the PID */
do_cpu_pid
(
state
,
temp
,
power
);
intake
=
(
state
->
rpm
*
CPU_INTAKE_SCALE
)
>>
16
;
if
(
intake
<
state
->
mpu
.
rminn_intake_fan
)
if
(
intake
<
(
int
)
state
->
mpu
.
rminn_intake_fan
)
intake
=
state
->
mpu
.
rminn_intake_fan
;
if
(
intake
>
state
->
mpu
.
rmaxn_intake_fan
)
if
(
intake
>
(
int
)
state
->
mpu
.
rmaxn_intake_fan
)
intake
=
state
->
mpu
.
rmaxn_intake_fan
;
state
->
intake_rpm
=
intake
;
...
...
@@ -678,11 +922,11 @@ static void do_monitor_cpu(struct cpu_pid_state *state)
* some way...
*/
if
(
state
->
index
==
0
)
{
set_rpm_fan
(
CPUA_INTAKE_FAN_RPM_I
D
,
intake
);
set_rpm_fan
(
CPUA_EXHAUST_FAN_RPM_I
D
,
state
->
rpm
);
set_rpm_fan
(
CPUA_INTAKE_FAN_RPM_I
NDEX
,
intake
);
set_rpm_fan
(
CPUA_EXHAUST_FAN_RPM_I
NDEX
,
state
->
rpm
);
}
else
{
set_rpm_fan
(
CPUB_INTAKE_FAN_RPM_I
D
,
intake
);
set_rpm_fan
(
CPUB_EXHAUST_FAN_RPM_I
D
,
state
->
rpm
);
set_rpm_fan
(
CPUB_INTAKE_FAN_RPM_I
NDEX
,
intake
);
set_rpm_fan
(
CPUB_EXHAUST_FAN_RPM_I
NDEX
,
state
->
rpm
);
}
}
...
...
@@ -697,6 +941,7 @@ static int init_cpu_state(struct cpu_pid_state *state, int index)
state
->
overtemp
=
0
;
state
->
adc_config
=
0x00
;
if
(
index
==
0
)
state
->
monitor
=
attach_i2c_chip
(
SUPPLY_MONITOR_ID
,
"CPU0_monitor"
);
else
if
(
index
==
1
)
...
...
@@ -779,7 +1024,7 @@ static void do_monitor_backside(struct backside_pid_state *state)
DBG
(
"backside:
\n
"
);
/* Check fan status */
rc
=
get_pwm_fan
(
BACKSIDE_FAN_PWM_I
D
);
rc
=
get_pwm_fan
(
BACKSIDE_FAN_PWM_I
NDEX
);
if
(
rc
<
0
)
{
printk
(
KERN_WARNING
"Error %d reading backside fan !
\n
"
,
rc
);
/* XXX What do we do now ? */
...
...
@@ -791,12 +1036,12 @@ static void do_monitor_backside(struct backside_pid_state *state)
temp
=
i2c_smbus_read_byte_data
(
state
->
monitor
,
MAX6690_EXT_TEMP
)
<<
16
;
state
->
last_temp
=
temp
;
DBG
(
" temp: %d.%03d, target: %d.%03d
\n
"
,
FIX32TOPRINT
(
temp
),
FIX32TOPRINT
(
BACKSIDE_PID_INPUT_TARGET
));
FIX32TOPRINT
(
backside_params
.
input_target
));
/* Store temperature and error in history array */
state
->
cur_sample
=
(
state
->
cur_sample
+
1
)
%
BACKSIDE_PID_HISTORY_SIZE
;
state
->
sample_history
[
state
->
cur_sample
]
=
temp
;
state
->
error_history
[
state
->
cur_sample
]
=
temp
-
BACKSIDE_PID_INPUT_TARGET
;
state
->
error_history
[
state
->
cur_sample
]
=
temp
-
backside_params
.
input_target
;
/* If first loop, fill the history table */
if
(
state
->
first
)
{
...
...
@@ -805,7 +1050,7 @@ static void do_monitor_backside(struct backside_pid_state *state)
BACKSIDE_PID_HISTORY_SIZE
;
state
->
sample_history
[
state
->
cur_sample
]
=
temp
;
state
->
error_history
[
state
->
cur_sample
]
=
temp
-
BACKSIDE_PID_INPUT_TARGET
;
temp
-
backside_params
.
input_target
;
}
state
->
first
=
0
;
}
...
...
@@ -817,7 +1062,7 @@ static void do_monitor_backside(struct backside_pid_state *state)
integral
+=
state
->
error_history
[
i
];
integral
*=
BACKSIDE_PID_INTERVAL
;
DBG
(
" integral: %08x
\n
"
,
integral
);
integ_p
=
((
s64
)
BACKSIDE_PID_
G_r
)
*
(
s64
)
integral
;
integ_p
=
((
s64
)
backside_params
.
G_r
)
*
(
s64
)
integral
;
DBG
(
" integ_p: %d
\n
"
,
(
int
)(
integ_p
>>
36
));
sum
+=
integ_p
;
...
...
@@ -826,12 +1071,12 @@ static void do_monitor_backside(struct backside_pid_state *state)
state
->
error_history
[(
state
->
cur_sample
+
BACKSIDE_PID_HISTORY_SIZE
-
1
)
%
BACKSIDE_PID_HISTORY_SIZE
];
derivative
/=
BACKSIDE_PID_INTERVAL
;
deriv_p
=
((
s64
)
BACKSIDE_PID_
G_d
)
*
(
s64
)
derivative
;
deriv_p
=
((
s64
)
backside_params
.
G_d
)
*
(
s64
)
derivative
;
DBG
(
" deriv_p: %d
\n
"
,
(
int
)(
deriv_p
>>
36
));
sum
+=
deriv_p
;
/* Calculate the proportional term */
prop_p
=
((
s64
)
BACKSIDE_PID_
G_p
)
*
(
s64
)(
state
->
error_history
[
state
->
cur_sample
]);
prop_p
=
((
s64
)
backside_params
.
G_p
)
*
(
s64
)(
state
->
error_history
[
state
->
cur_sample
]);
DBG
(
" prop_p: %d
\n
"
,
(
int
)(
prop_p
>>
36
));
sum
+=
prop_p
;
...
...
@@ -840,13 +1085,13 @@ static void do_monitor_backside(struct backside_pid_state *state)
DBG
(
" sum: %d
\n
"
,
(
int
)
sum
);
state
->
pwm
+=
(
s32
)
sum
;
if
(
state
->
pwm
<
BACKSIDE_PID_OUTPUT_MIN
)
state
->
pwm
=
BACKSIDE_PID_OUTPUT_MIN
;
if
(
state
->
pwm
>
BACKSIDE_PID_OUTPUT_MAX
)
state
->
pwm
=
BACKSIDE_PID_OUTPUT_MAX
;
if
(
state
->
pwm
<
backside_params
.
output_min
)
state
->
pwm
=
backside_params
.
output_min
;
if
(
state
->
pwm
>
backside_params
.
output_max
)
state
->
pwm
=
backside_params
.
output_max
;
DBG
(
"** BACKSIDE PWM: %d
\n
"
,
(
int
)
state
->
pwm
);
set_pwm_fan
(
BACKSIDE_FAN_PWM_I
D
,
state
->
pwm
);
set_pwm_fan
(
BACKSIDE_FAN_PWM_I
NDEX
,
state
->
pwm
);
}
/*
...
...
@@ -854,6 +1099,35 @@ static void do_monitor_backside(struct backside_pid_state *state)
*/
static
int
init_backside_state
(
struct
backside_pid_state
*
state
)
{
struct
device_node
*
u3
;
int
u3h
=
1
;
/* conservative by default */
/*
* There are different PID params for machines with U3 and machines
* with U3H, pick the right ones now
*/
u3
=
of_find_node_by_path
(
"/u3@0,f8000000"
);
if
(
u3
!=
NULL
)
{
u32
*
vers
=
(
u32
*
)
get_property
(
u3
,
"device-rev"
,
NULL
);
if
(
vers
)
if
(((
*
vers
)
&
0x3f
)
<
0x34
)
u3h
=
0
;
of_node_put
(
u3
);
}
backside_params
.
G_p
=
BACKSIDE_PID_G_p
;
backside_params
.
G_r
=
BACKSIDE_PID_G_r
;
backside_params
.
output_max
=
BACKSIDE_PID_OUTPUT_MAX
;
if
(
u3h
)
{
backside_params
.
G_d
=
BACKSIDE_PID_U3H_G_d
;
backside_params
.
input_target
=
BACKSIDE_PID_U3H_INPUT_TARGET
;
backside_params
.
output_min
=
BACKSIDE_PID_U3H_OUTPUT_MIN
;
}
else
{
backside_params
.
G_d
=
BACKSIDE_PID_U3_G_d
;
backside_params
.
input_target
=
BACKSIDE_PID_U3_INPUT_TARGET
;
backside_params
.
output_min
=
BACKSIDE_PID_U3_OUTPUT_MIN
;
}
state
->
ticks
=
1
;
state
->
first
=
1
;
state
->
pwm
=
50
;
...
...
@@ -899,7 +1173,7 @@ static void do_monitor_drives(struct drives_pid_state *state)
DBG
(
"drives:
\n
"
);
/* Check fan status */
rc
=
get_rpm_fan
(
DRIVES_FAN_RPM_I
D
,
!
RPM_PID_USE_ACTUAL_SPEED
);
rc
=
get_rpm_fan
(
DRIVES_FAN_RPM_I
NDEX
,
!
RPM_PID_USE_ACTUAL_SPEED
);
if
(
rc
<
0
)
{
printk
(
KERN_WARNING
"Error %d reading drives fan !
\n
"
,
rc
);
/* XXX What do we do now ? */
...
...
@@ -966,7 +1240,7 @@ static void do_monitor_drives(struct drives_pid_state *state)
state
->
rpm
=
DRIVES_PID_OUTPUT_MAX
;
DBG
(
"** DRIVES RPM: %d
\n
"
,
(
int
)
state
->
rpm
);
set_rpm_fan
(
DRIVES_FAN_RPM_I
D
,
state
->
rpm
);
set_rpm_fan
(
DRIVES_FAN_RPM_I
NDEX
,
state
->
rpm
);
}
/*
...
...
@@ -1033,7 +1307,7 @@ static int main_control_loop(void *x)
}
/* Set the PCI fan once for now */
set_pwm_fan
(
SLOTS_FAN_PWM_I
D
,
SLOTS_FAN_DEFAULT_PWM
);
set_pwm_fan
(
SLOTS_FAN_PWM_I
NDEX
,
SLOTS_FAN_DEFAULT_PWM
);
/* Initialize ADCs */
initialize_adc
(
&
cpu_state
[
0
]);
...
...
@@ -1045,17 +1319,16 @@ static int main_control_loop(void *x)
while
(
state
==
state_attached
)
{
unsigned
long
elapsed
,
start
;
if
(
current
->
flags
&
PF_FREEZE
)
{
printk
(
KERN_INFO
"therm_pm72: freezing thermostat
\n
"
);
refrigerator
(
PF_FREEZE
);
}
start
=
jiffies
;
down
(
&
driver_lock
);
do_monitor_cpu
(
&
cpu_state
[
0
]);
if
(
cpu_state
[
1
].
monitor
!=
NULL
)
do_monitor_cpu
(
&
cpu_state
[
1
]);
if
(
cpu_pid_type
==
CPU_PID_TYPE_COMBINED
)
do_monitor_cpu_combined
();
else
{
do_monitor_cpu_split
(
&
cpu_state
[
0
]);
if
(
cpu_state
[
1
].
monitor
!=
NULL
)
do_monitor_cpu_split
(
&
cpu_state
[
1
]);
}
do_monitor_backside
(
&
backside_state
);
do_monitor_drives
(
&
drives_state
);
up
(
&
driver_lock
);
...
...
@@ -1119,6 +1392,19 @@ static int create_control_loops(void)
DBG
(
"counted %d CPUs in the device-tree
\n
"
,
cpu_count
);
/* Decide the type of PID algorithm to use based on the presence of
* the pumps, though that may not be the best way, that is good enough
* for now
*/
if
(
machine_is_compatible
(
"PowerMac7,3"
)
&&
(
cpu_count
>
1
)
&&
fcu_fans
[
CPUA_PUMP_RPM_INDEX
].
id
!=
FCU_FAN_ABSENT_ID
&&
fcu_fans
[
CPUB_PUMP_RPM_INDEX
].
id
!=
FCU_FAN_ABSENT_ID
)
{
printk
(
KERN_INFO
"Liquid cooling pumps detected, using new algorithm !
\n
"
);
cpu_pid_type
=
CPU_PID_TYPE_COMBINED
;
}
else
cpu_pid_type
=
CPU_PID_TYPE_SPLIT
;
/* Create control loops for everything. If any fail, everything
* fails
*/
...
...
@@ -1263,12 +1549,91 @@ static int therm_pm72_detach(struct i2c_adapter *adapter)
return
0
;
}
static
void
fcu_lookup_fans
(
struct
device_node
*
fcu_node
)
{
struct
device_node
*
np
=
NULL
;
int
i
;
/* The table is filled by default with values that are suitable
* for the old machines without device-tree informations. We scan
* the device-tree and override those values with whatever is
* there
*/
DBG
(
"Looking up FCU controls in device-tree...
\n
"
);
while
((
np
=
of_get_next_child
(
fcu_node
,
np
))
!=
NULL
)
{
int
type
=
-
1
;
char
*
loc
;
u32
*
reg
;
DBG
(
" control: %s, type: %s
\n
"
,
np
->
name
,
np
->
type
);
/* Detect control type */
if
(
!
strcmp
(
np
->
type
,
"fan-rpm-control"
)
||
!
strcmp
(
np
->
type
,
"fan-rpm"
))
type
=
FCU_FAN_RPM
;
if
(
!
strcmp
(
np
->
type
,
"fan-pwm-control"
)
||
!
strcmp
(
np
->
type
,
"fan-pwm"
))
type
=
FCU_FAN_PWM
;
/* Only care about fans for now */
if
(
type
==
-
1
)
continue
;
/* Lookup for a matching location */
loc
=
(
char
*
)
get_property
(
np
,
"location"
,
NULL
);
reg
=
(
u32
*
)
get_property
(
np
,
"reg"
,
NULL
);
if
(
loc
==
NULL
||
reg
==
NULL
)
continue
;
DBG
(
" matching location: %s, reg: 0x%08x
\n
"
,
loc
,
*
reg
);
for
(
i
=
0
;
i
<
FCU_FAN_COUNT
;
i
++
)
{
int
fan_id
;
if
(
strcmp
(
loc
,
fcu_fans
[
i
].
loc
))
continue
;
DBG
(
" location match, index: %d
\n
"
,
i
);
fcu_fans
[
i
].
id
=
FCU_FAN_ABSENT_ID
;
if
(
type
!=
fcu_fans
[
i
].
type
)
{
printk
(
KERN_WARNING
"therm_pm72: Fan type mismatch "
"in device-tree for %s
\n
"
,
np
->
full_name
);
break
;
}
if
(
type
==
FCU_FAN_RPM
)
fan_id
=
((
*
reg
)
-
0x10
)
/
2
;
else
fan_id
=
((
*
reg
)
-
0x30
)
/
2
;
if
(
fan_id
>
7
)
{
printk
(
KERN_WARNING
"therm_pm72: Can't parse "
"fan ID in device-tree for %s
\n
"
,
np
->
full_name
);
break
;
}
DBG
(
" fan id -> %d, type -> %d
\n
"
,
fan_id
,
type
);
fcu_fans
[
i
].
id
=
fan_id
;
}
}
/* Now dump the array */
printk
(
KERN_INFO
"Detected fan controls:
\n
"
);
for
(
i
=
0
;
i
<
FCU_FAN_COUNT
;
i
++
)
{
if
(
fcu_fans
[
i
].
id
==
FCU_FAN_ABSENT_ID
)
continue
;
printk
(
KERN_INFO
" %d: %s fan, id %d, location: %s
\n
"
,
i
,
fcu_fans
[
i
].
type
==
FCU_FAN_RPM
?
"RPM"
:
"PWM"
,
fcu_fans
[
i
].
id
,
fcu_fans
[
i
].
loc
);
}
}
static
int
fcu_of_probe
(
struct
of_device
*
dev
,
const
struct
of_match
*
match
)
{
int
rc
;
state
=
state_detached
;
/* Lookup the fans in the device tree */
fcu_lookup_fans
(
dev
->
node
);
/* Add the driver */
rc
=
i2c_add_driver
(
&
therm_pm72_driver
);
if
(
rc
<
0
)
return
rc
;
...
...
@@ -1307,15 +1672,20 @@ static int __init therm_pm72_init(void)
{
struct
device_node
*
np
;
if
(
!
machine_is_compatible
(
"PowerMac7,2"
))
if
(
!
machine_is_compatible
(
"PowerMac7,2"
)
&&
!
machine_is_compatible
(
"PowerMac7,3"
))
return
-
ENODEV
;
printk
(
KERN_INFO
"PowerMac G5 Thermal control driver %s
\n
"
,
VERSION
);
np
=
of_find_node_by_type
(
NULL
,
"fcu"
);
if
(
np
==
NULL
)
{
printk
(
KERN_ERR
"Can't find FCU in device-tree !
\n
"
);
return
-
ENODEV
;
/* Some machines have strangely broken device-tree */
np
=
of_find_node_by_path
(
"/u3@0,f8000000/i2c@f8001000/fan@15e"
);
if
(
np
==
NULL
)
{
printk
(
KERN_ERR
"Can't find FCU in device-tree !
\n
"
);
return
-
ENODEV
;
}
}
of_dev
=
of_platform_device_create
(
np
,
"temperature"
);
if
(
of_dev
==
NULL
)
{
...
...
drivers/macintosh/therm_pm72.h
View file @
4c8aded7
...
...
@@ -119,18 +119,33 @@ static char * critical_overtemp_path = "/sbin/critical_overtemp";
#define ADC_CPU_CURRENT_SCALE 0x1f40
/* _AD4 */
/*
* PID factors for the U3/Backside fan control loop
* PID factors for the U3/Backside fan control loop. We have 2 sets
* of values here, one set for U3 and one set for U3H
*/
#define BACKSIDE_FAN_PWM_ID 1
#define BACKSIDE_PID_G_d 0x02800000
#define BACKSIDE_FAN_PWM_DEFAULT_ID 1
#define BACKSIDE_FAN_PWM_INDEX 0
#define BACKSIDE_PID_U3_G_d 0x02800000
#define BACKSIDE_PID_U3H_G_d 0x01400000
#define BACKSIDE_PID_G_p 0x00500000
#define BACKSIDE_PID_G_r 0x00000000
#define BACKSIDE_PID_INPUT_TARGET 0x00410000
#define BACKSIDE_PID_U3_INPUT_TARGET 0x00410000
#define BACKSIDE_PID_U3H_INPUT_TARGET 0x004b0000
#define BACKSIDE_PID_INTERVAL 5
#define BACKSIDE_PID_OUTPUT_MAX 100
#define BACKSIDE_PID_OUTPUT_MIN 20
#define BACKSIDE_PID_U3_OUTPUT_MIN 20
#define BACKSIDE_PID_U3H_OUTPUT_MIN 30
#define BACKSIDE_PID_HISTORY_SIZE 2
struct
basckside_pid_params
{
s32
G_d
;
s32
G_p
;
s32
G_r
;
s32
input_target
;
s32
output_min
;
s32
output_max
;
};
struct
backside_pid_state
{
int
ticks
;
...
...
@@ -146,7 +161,8 @@ struct backside_pid_state
/*
* PID factors for the Drive Bay fan control loop
*/
#define DRIVES_FAN_RPM_ID 2
#define DRIVES_FAN_RPM_DEFAULT_ID 2
#define DRIVES_FAN_RPM_INDEX 1
#define DRIVES_PID_G_d 0x01e00000
#define DRIVES_PID_G_p 0x00500000
#define DRIVES_PID_G_r 0x00000000
...
...
@@ -168,7 +184,8 @@ struct drives_pid_state
int
first
;
};
#define SLOTS_FAN_PWM_ID 2
#define SLOTS_FAN_PWM_DEFAULT_ID 2
#define SLOTS_FAN_PWM_INDEX 2
#define SLOTS_FAN_DEFAULT_PWM 50
/* Do better here ! */
/*
...
...
@@ -191,10 +208,15 @@ struct drives_pid_state
* CPU B FAKE POWER 49 (I_V_inputs: 18, 19)
*/
#define CPUA_INTAKE_FAN_RPM_ID 3
#define CPUA_EXHAUST_FAN_RPM_ID 4
#define CPUB_INTAKE_FAN_RPM_ID 5
#define CPUB_EXHAUST_FAN_RPM_ID 6
#define CPUA_INTAKE_FAN_RPM_DEFAULT_ID 3
#define CPUA_EXHAUST_FAN_RPM_DEFAULT_ID 4
#define CPUB_INTAKE_FAN_RPM_DEFAULT_ID 5
#define CPUB_EXHAUST_FAN_RPM_DEFAULT_ID 6
#define CPUA_INTAKE_FAN_RPM_INDEX 3
#define CPUA_EXHAUST_FAN_RPM_INDEX 4
#define CPUB_INTAKE_FAN_RPM_INDEX 5
#define CPUB_EXHAUST_FAN_RPM_INDEX 6
#define CPU_INTAKE_SCALE 0x0000f852
#define CPU_TEMP_HISTORY_SIZE 2
...
...
@@ -202,6 +224,11 @@ struct drives_pid_state
#define CPU_PID_INTERVAL 1
#define CPU_MAX_OVERTEMP 30
#define CPUA_PUMP_RPM_INDEX 7
#define CPUB_PUMP_RPM_INDEX 8
#define CPU_PUMP_OUTPUT_MAX 3700
#define CPU_PUMP_OUTPUT_MIN 1000
struct
cpu_pid_state
{
int
index
;
...
...
@@ -219,6 +246,7 @@ struct cpu_pid_state
s32
voltage
;
s32
current_a
;
s32
last_temp
;
s32
last_power
;
int
first
;
u8
adc_config
;
};
...
...
drivers/scsi/aic7xxx_old.c
View file @
4c8aded7
...
...
@@ -924,7 +924,7 @@ struct aic7xxx_host {
volatile
long
flags
;
ahc_feature
features
;
/* chip features */
unsigned
long
base
;
/* card base address */
volatile
unsigned
char
*
maddr
;
/* memory mapped address */
volatile
unsigned
char
__iomem
*
maddr
;
/* memory mapped address */
unsigned
long
isr_count
;
/* Interrupt count */
unsigned
long
spurious_int
;
scb_data_type
*
scb_data
;
...
...
@@ -7967,8 +7967,8 @@ aic7xxx_register(Scsi_Host_Template *template, struct aic7xxx_host *p,
printk
(
KERN_INFO
"(scsi%d) BIOS %sabled, IO Port 0x%lx, IRQ %d
\n
"
,
p
->
host_no
,
(
p
->
flags
&
AHC_BIOS_ENABLED
)
?
"en"
:
"dis"
,
p
->
base
,
p
->
irq
);
printk
(
KERN_INFO
"(scsi%d) IO Memory at 0x%lx, MMAP Memory at
0x%lx
\n
"
,
p
->
host_no
,
p
->
mbase
,
(
unsigned
long
)
p
->
maddr
);
printk
(
KERN_INFO
"(scsi%d) IO Memory at 0x%lx, MMAP Memory at
%p
\n
"
,
p
->
host_no
,
p
->
mbase
,
p
->
maddr
);
}
#ifdef CONFIG_PCI
...
...
@@ -9311,14 +9311,9 @@ aic7xxx_detect(Scsi_Host_Template *template)
((
temp_p
->
chip
!=
(
AHC_AIC7870
|
AHC_PCI
))
&&
(
temp_p
->
chip
!=
(
AHC_AIC7880
|
AHC_PCI
)))
)
{
unsigned
long
page_offset
,
base
;
base
=
temp_p
->
mbase
&
PAGE_MASK
;
page_offset
=
temp_p
->
mbase
-
base
;
temp_p
->
maddr
=
ioremap_nocache
(
base
,
page_offset
+
256
);
temp_p
->
maddr
=
ioremap_nocache
(
temp_p
->
mbase
,
256
);
if
(
temp_p
->
maddr
)
{
temp_p
->
maddr
+=
page_offset
;
/*
* We need to check the I/O with the MMAPed address. Some machines
* simply fail to work with MMAPed I/O and certain controllers.
...
...
@@ -9335,7 +9330,7 @@ aic7xxx_detect(Scsi_Host_Template *template)
PCI_FUNC
(
temp_p
->
pci_device_fn
));
printk
(
KERN_INFO
"aic7xxx: MMAPed I/O failed, reverting to "
"Programmed I/O.
\n
"
);
iounmap
(
(
void
*
)
(((
unsigned
long
)
temp_p
->
maddr
)
&
PAGE_MASK
)
);
iounmap
(
temp_p
->
maddr
);
temp_p
->
maddr
=
NULL
;
if
(
temp_p
->
base
==
0
)
{
...
...
@@ -10965,7 +10960,7 @@ aic7xxx_release(struct Scsi_Host *host)
#ifdef MMAPIO
if
(
p
->
maddr
)
{
iounmap
(
(
void
*
)
(((
unsigned
long
)
p
->
maddr
)
&
PAGE_MASK
)
);
iounmap
(
p
->
maddr
);
}
#endif
/* MMAPIO */
if
(
!
p
->
pdev
)
...
...
drivers/scsi/initio.c
View file @
4c8aded7
...
...
@@ -316,7 +316,7 @@ static void tul_do_pause(unsigned amount)
/*******************************************************************
Use memeory refresh time ~ 15us * 2
********************************************************************/
void
tul_se2_wait
()
void
tul_se2_wait
(
void
)
{
#if 1
udelay
(
30
);
...
...
@@ -815,7 +815,7 @@ void tul_release_scb(HCS * hcsp, SCB * scbp)
printk
(
"Release SCB %lx; "
,
(
ULONG
)
scbp
);
#endif
spin_lock_irqsave
(
&
(
hcsp
->
HCS_AvailLock
),
flags
);
scbp
->
SCB_Srb
=
0
;
scbp
->
SCB_Srb
=
NULL
;
scbp
->
SCB_Status
=
0
;
scbp
->
SCB_NxtScb
=
NULL
;
if
(
hcsp
->
HCS_LastAvail
!=
NULL
)
{
...
...
@@ -1231,7 +1231,7 @@ int tul_device_reset(HCS * pCurHcb, struct scsi_cmnd *pSrb,
pScb
->
SCB_Target
=
target
;
pScb
->
SCB_Mode
=
0
;
pScb
->
SCB_Srb
=
0
;
pScb
->
SCB_Srb
=
NULL
;
if
(
ResetFlags
&
SCSI_RESET_SYNCHRONOUS
)
{
pScb
->
SCB_Srb
=
pSrb
;
}
...
...
@@ -2535,8 +2535,8 @@ int tul_post_scsi_rst(HCS * pCurHcb)
TCS
*
pCurTcb
;
int
i
;
pCurHcb
->
HCS_ActScb
=
0
;
pCurHcb
->
HCS_ActTcs
=
0
;
pCurHcb
->
HCS_ActScb
=
NULL
;
pCurHcb
->
HCS_ActTcs
=
NULL
;
pCurHcb
->
HCS_Flags
=
0
;
while
((
pCurScb
=
tul_pop_busy_scb
(
pCurHcb
))
!=
NULL
)
{
...
...
drivers/scsi/qlogicisp.c
View file @
4c8aded7
...
...
@@ -564,7 +564,7 @@ struct isp_queue_entry {
};
struct
isp1020_hostdata
{
u_long
memaddr
;
void
__iomem
*
memaddr
;
u_char
revision
;
struct
host_param
host_param
;
struct
dev_param
dev_param
[
MAX_TARGETS
];
...
...
@@ -714,7 +714,7 @@ int isp1020_detect(Scsi_Host_Template *tmpt)
continue
;
fail_uninit:
iounmap
(
(
void
*
)
hostdata
->
memaddr
);
iounmap
(
hostdata
->
memaddr
);
release_region
(
host
->
io_port
,
0xff
);
fail_and_unregister:
if
(
hostdata
->
res_cpu
)
...
...
@@ -747,7 +747,7 @@ int isp1020_release(struct Scsi_Host *host)
isp_outw
(
0x0
,
host
,
PCI_INTF_CTL
);
free_irq
(
host
->
irq
,
host
);
iounmap
(
(
void
*
)
hostdata
->
memaddr
);
iounmap
(
hostdata
->
memaddr
);
release_region
(
host
->
io_port
,
0xff
);
...
...
@@ -769,7 +769,7 @@ const char *isp1020_info(struct Scsi_Host *host)
"QLogic ISP1020 SCSI on PCI bus %02x device %02x irq %d %s base 0x%lx"
,
hostdata
->
pci_dev
->
bus
->
number
,
hostdata
->
pci_dev
->
devfn
,
host
->
irq
,
(
hostdata
->
memaddr
?
"MEM"
:
"I/O"
),
(
hostdata
->
memaddr
?
hostdata
->
memaddr
:
host
->
io_port
));
(
hostdata
->
memaddr
?
(
unsigned
long
)
hostdata
->
memaddr
:
host
->
io_port
));
LEAVE
(
"isp1020_info"
);
...
...
@@ -1410,18 +1410,17 @@ static int isp1020_init(struct Scsi_Host *sh)
if
((
command
&
PCI_COMMAND_MEMORY
)
&&
((
mem_flags
&
1
)
==
0
))
{
mem_base
=
(
u_long
)
ioremap
(
mem_base
,
PAGE_SIZE
);
if
(
!
mem_base
)
{
hostdata
->
memaddr
=
ioremap
(
mem_base
,
PAGE_SIZE
);
if
(
!
hostdata
->
memaddr
)
{
printk
(
"qlogicisp : i/o remapping failed.
\n
"
);
goto
out_release
;
}
hostdata
->
memaddr
=
mem_base
;
}
else
{
if
(
command
&
PCI_COMMAND_IO
&&
(
io_flags
&
3
)
!=
1
)
{
printk
(
"qlogicisp : i/o mapping is disabled
\n
"
);
goto
out_release
;
}
hostdata
->
memaddr
=
0
;
/* zero to signify no i/o mapping */
hostdata
->
memaddr
=
NULL
;
/* zero to signify no i/o mapping */
mem_base
=
0
;
}
...
...
@@ -1470,7 +1469,7 @@ static int isp1020_init(struct Scsi_Host *sh)
return
0
;
out_unmap:
iounmap
(
(
void
*
)
hostdata
->
memaddr
);
iounmap
(
hostdata
->
memaddr
);
out_release:
release_region
(
sh
->
io_port
,
0xff
);
return
1
;
...
...
drivers/video/aty/aty128fb.c
View file @
4c8aded7
...
...
@@ -397,7 +397,7 @@ struct aty128fb_par {
struct
aty128_ddafifo
fifo_reg
;
u32
accel_flags
;
struct
aty128_constants
constants
;
/* PLL and others */
void
*
regbase
;
/* remapped mmio */
void
__iomem
*
regbase
;
/* remapped mmio */
u32
vram_size
;
/* onboard video ram */
int
chip_gen
;
const
struct
aty128_meminfo
*
mem
;
/* onboard mem info */
...
...
@@ -450,9 +450,9 @@ static int aty128_decode_var(struct fb_var_screeninfo *var,
struct
aty128fb_par
*
par
);
#if 0
static void __init aty128_get_pllinfo(struct aty128fb_par *par,
void *bios);
static void __init *aty128_map_ROM(struct pci_dev *pdev, const struct aty128fb_par *par);
static void __init aty128_unmap_ROM(struct pci_dev *dev, void * rom);
void
__iomem
*bios);
static void __init
__iomem
*aty128_map_ROM(struct pci_dev *pdev, const struct aty128fb_par *par);
static void __init aty128_unmap_ROM(struct pci_dev *dev, void
__iomem
* rom);
#endif
static
void
aty128_timings
(
struct
aty128fb_par
*
par
);
static
void
aty128_init_engine
(
struct
aty128fb_par
*
par
);
...
...
@@ -788,7 +788,7 @@ static u32 depth_to_dst(u32 depth)
#ifndef __sparc__
static
void
__init
aty128_unmap_ROM
(
struct
pci_dev
*
dev
,
void
*
rom
)
static
void
__init
aty128_unmap_ROM
(
struct
pci_dev
*
dev
,
void
__iomem
*
rom
)
{
struct
resource
*
r
=
&
dev
->
resource
[
PCI_ROM_RESOURCE
];
...
...
@@ -806,12 +806,12 @@ static void __init aty128_unmap_ROM(struct pci_dev *dev, void * rom)
}
static
void
*
__init
aty128_map_ROM
(
const
struct
aty128fb_par
*
par
,
struct
pci_dev
*
dev
)
static
void
__iomem
*
__init
aty128_map_ROM
(
const
struct
aty128fb_par
*
par
,
struct
pci_dev
*
dev
)
{
struct
resource
*
r
;
u16
dptr
;
u8
rom_type
;
void
*
bios
;
void
__iomem
*
bios
;
/* Fix from ATI for problem with Rage128 hardware not leaving ROM enabled */
unsigned
int
temp
;
...
...
@@ -903,7 +903,7 @@ static void * __init aty128_map_ROM(const struct aty128fb_par *par, struct pci_d
return
NULL
;
}
static
void
__init
aty128_get_pllinfo
(
struct
aty128fb_par
*
par
,
unsigned
char
*
bios
)
static
void
__init
aty128_get_pllinfo
(
struct
aty128fb_par
*
par
,
unsigned
char
__iomem
*
bios
)
{
unsigned
int
bios_hdr
;
unsigned
int
bios_pll
;
...
...
@@ -925,7 +925,7 @@ static void __init aty128_get_pllinfo(struct aty128fb_par *par, unsigned char *b
}
#ifdef CONFIG_X86
static
void
*
__devinit
aty128_find_mem_vbios
(
struct
aty128fb_par
*
par
)
static
void
__iomem
*
__devinit
aty128_find_mem_vbios
(
struct
aty128fb_par
*
par
)
{
/* I simplified this code as we used to miss the signatures in
* a lot of case. It's now closer to XFree, we just don't check
...
...
@@ -933,10 +933,10 @@ static void * __devinit aty128_find_mem_vbios(struct aty128fb_par *par)
* if we end up having conflicts
*/
u32
segstart
;
unsigned
char
*
rom_base
=
NULL
;
unsigned
char
__iomem
*
rom_base
=
NULL
;
for
(
segstart
=
0x000c0000
;
segstart
<
0x000f0000
;
segstart
+=
0x00001000
)
{
rom_base
=
(
char
*
)
ioremap
(
segstart
,
0x10000
);
rom_base
=
ioremap
(
segstart
,
0x10000
);
if
(
rom_base
==
NULL
)
return
NULL
;
if
((
*
rom_base
==
0x55
)
&&
(((
*
(
rom_base
+
1
))
&
0xff
)
==
0xaa
))
...
...
@@ -1885,7 +1885,7 @@ static int __init aty128_probe(struct pci_dev *pdev, const struct pci_device_id
struct
fb_info
*
info
;
int
err
;
#ifndef __sparc__
void
*
bios
=
NULL
;
void
__iomem
*
bios
=
NULL
;
#endif
/* Enable device in PCI config */
...
...
drivers/video/aty/atyfb.h
View file @
4c8aded7
...
...
@@ -59,15 +59,15 @@ union aty_pll {
struct
aty_cursor
{
u8
bits
[
8
][
64
];
u8
mask
[
8
][
64
];
u8
*
ram
;
u8
__iomem
*
ram
;
};
struct
atyfb_par
{
struct
aty_cmap_regs
*
aty_cmap_regs
;
struct
aty_cmap_regs
__iomem
*
aty_cmap_regs
;
const
struct
aty_dac_ops
*
dac_ops
;
const
struct
aty_pll_ops
*
pll_ops
;
struct
aty_cursor
*
cursor
;
unsigned
long
ati_regbase
;
void
__iomem
*
ati_regbase
;
unsigned
long
clk_wr_offset
;
struct
crtc
crtc
;
union
aty_pll
pll
;
...
...
drivers/video/aty/atyfb_base.c
View file @
4c8aded7
...
...
@@ -1514,7 +1514,7 @@ static int __init aty_init(struct fb_info *info, const char *name)
u8
pll_ref_div
;
par
->
aty_cmap_regs
=
(
struct
aty_cmap_regs
*
)
(
par
->
ati_regbase
+
0xc0
);
(
struct
aty_cmap_regs
__iomem
*
)
(
par
->
ati_regbase
+
0xc0
);
chip_id
=
aty_ld_le32
(
CONFIG_CHIP_ID
,
par
);
type
=
chip_id
&
CFG_CHIP_TYPE
;
rev
=
(
chip_id
&
CFG_CHIP_REV
)
>>
24
;
...
...
@@ -1782,8 +1782,7 @@ static int __init aty_init(struct fb_info *info, const char *name)
info
->
fix
.
smem_len
-=
GUI_RESERVE
;
/* Clear the video memory */
fb_memset
((
void
*
)
info
->
screen_base
,
0
,
info
->
fix
.
smem_len
);
fb_memset
(
info
->
screen_base
,
0
,
info
->
fix
.
smem_len
);
info
->
fbops
=
&
atyfb_ops
;
info
->
pseudo_palette
=
pseudo_palette
;
...
...
@@ -2216,7 +2215,7 @@ int __init atyfb_do_init(void)
#else
/* __sparc__ */
info
->
fix
.
mmio_start
=
0x7ff000
+
addr
;
default_par
->
ati_regbase
=
(
unsigned
long
)
default_par
->
ati_regbase
=
ioremap
(
info
->
fix
.
mmio_start
,
0x1000
);
if
(
!
default_par
->
ati_regbase
)
{
...
...
@@ -2249,8 +2248,7 @@ int __init atyfb_do_init(void)
/* Map in frame buffer */
info
->
fix
.
smem_start
=
addr
;
info
->
screen_base
=
(
char
*
)
ioremap
(
addr
,
0x800000
);
info
->
screen_base
=
ioremap
(
addr
,
0x800000
);
if
(
!
info
->
screen_base
)
{
#ifdef __sparc__
...
...
@@ -2616,9 +2614,9 @@ void cleanup_module(void)
#ifndef __sparc__
if
(
par
->
ati_regbase
)
iounmap
(
(
void
*
)
par
->
ati_regbase
);
iounmap
(
par
->
ati_regbase
);
if
(
info
->
screen_base
)
iounmap
(
(
void
*
)
info
->
screen_base
);
iounmap
(
info
->
screen_base
);
#ifdef __BIG_ENDIAN
if
(
par
->
cursor
&&
par
->
cursor
->
ram
)
iounmap
(
par
->
cursor
->
ram
);
...
...
drivers/video/aty/mach64_cursor.c
View file @
4c8aded7
...
...
@@ -73,7 +73,8 @@ void aty_set_cursor_shape(struct fb_info *info)
struct
atyfb_par
*
par
=
(
struct
atyfb_par
*
)
info
->
par
;
struct
fb_cursor
*
cursor
=
&
info
->
cursor
;
struct
aty_cursor
*
c
=
par
->
cursor
;
u8
*
ram
,
m
,
b
;
u8
m
,
b
;
u8
__iomem
*
ram
;
int
x
,
y
;
if
(
!
c
)
...
...
@@ -178,7 +179,7 @@ int atyfb_cursor(struct fb_info *info, struct fb_cursor *cursor)
struct
aty_cursor
*
__init
aty_init_cursor
(
struct
fb_info
*
info
)
{
struct
aty_cursor
*
cursor
;
unsigned
long
addr
;
void
__iomem
*
addr
;
cursor
=
kmalloc
(
sizeof
(
struct
aty_cursor
),
GFP_ATOMIC
);
if
(
!
cursor
)
...
...
@@ -195,8 +196,8 @@ struct aty_cursor *__init aty_init_cursor(struct fb_info *info)
addr
=
info
->
fix
.
smem_start
-
0x800000
+
info
->
fix
.
smem_len
;
cursor
->
ram
=
(
u8
*
)
ioremap
(
addr
,
1024
);
#else
addr
=
(
unsigned
long
)
info
->
screen_base
+
info
->
fix
.
smem_len
;
cursor
->
ram
=
(
u8
*
)
addr
;
addr
=
info
->
screen_base
+
info
->
fix
.
smem_len
;
cursor
->
ram
=
addr
;
#endif
#endif
if
(
!
cursor
->
ram
)
{
...
...
include/asm-i386/thread_info.h
View file @
4c8aded7
...
...
@@ -51,7 +51,7 @@ struct thread_info {
#endif
#define PREEMPT_ACTIVE 0x
4
000000
#define PREEMPT_ACTIVE 0x
10
000000
#ifdef CONFIG_4KSTACKS
#define THREAD_SIZE (4096)
#else
...
...
include/asm-ppc/thread_info.h
View file @
4c8aded7
...
...
@@ -65,7 +65,7 @@ static inline struct thread_info *current_thread_info(void)
*/
#define THREAD_SIZE 8192
/* 2 pages */
#define PREEMPT_ACTIVE 0x
4
000000
#define PREEMPT_ACTIVE 0x
10
000000
/*
* thread information flag bit numbers
...
...
include/asm-ppc64/thread_info.h
View file @
4c8aded7
...
...
@@ -82,7 +82,7 @@ static inline struct thread_info *current_thread_info(void)
#endif
/* __ASSEMBLY__ */
#define PREEMPT_ACTIVE 0x
4
000000
#define PREEMPT_ACTIVE 0x
10
000000
/*
* thread information flag bit numbers
...
...
include/asm-x86_64/thread_info.h
View file @
4c8aded7
...
...
@@ -125,7 +125,7 @@ static inline struct thread_info *stack_thread_info(void)
/* work to do on any return to user space */
#define _TIF_ALLWORK_MASK 0x0000FFFF
#define PREEMPT_ACTIVE 0x
4
000000
#define PREEMPT_ACTIVE 0x
10
000000
/*
* Thread-synchronous status.
...
...
include/linux/hardirq.h
View file @
4c8aded7
...
...
@@ -14,7 +14,7 @@
* - bits 8-15 are the softirq count (max # of softirqs: 256)
* - bits 16-27 are the hardirq count (max # of hardirqs: 4096)
*
* - ( bit 2
6
is the PREEMPT_ACTIVE flag. )
* - ( bit 2
8
is the PREEMPT_ACTIVE flag. )
*
* PREEMPT_MASK: 0x000000ff
* SOFTIRQ_MASK: 0x0000ff00
...
...
include/linux/interrupt.h
View file @
4c8aded7
...
...
@@ -252,8 +252,24 @@ extern void tasklet_init(struct tasklet_struct *t,
* or zero if none occurred, or a negative irq number
* if more than one irq occurred.
*/
#if defined(CONFIG_GENERIC_HARDIRQS) && !defined(CONFIG_GENERIC_IRQ_PROBE)
static
inline
unsigned
long
probe_irq_on
(
void
)
{
return
0
;
}
static
inline
int
probe_irq_off
(
unsigned
long
val
)
{
return
0
;
}
static
inline
unsigned
int
probe_irq_mask
(
unsigned
long
val
)
{
return
0
;
}
#else
extern
unsigned
long
probe_irq_on
(
void
);
/* returns 0 on failure */
extern
int
probe_irq_off
(
unsigned
long
);
/* returns 0 or negative on failure */
extern
unsigned
int
probe_irq_mask
(
unsigned
long
);
/* returns mask of ISA interrupts */
#endif
#endif
kernel/irq/Makefile
View file @
4c8aded7
obj-y
:=
autoprobe.o handle.o manage.o spurious.o
obj-y
:=
handle.o manage.o spurious.o
obj-$(CONFIG_GENERIC_IRQ_PROBE)
+=
autoprobe.o
obj-$(CONFIG_PROC_FS)
+=
proc.o
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