Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
raspberrypi-kernel
提交
e1342f1d
R
raspberrypi-kernel
项目概览
openeuler
/
raspberrypi-kernel
通知
13
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
raspberrypi-kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
e1342f1d
编写于
5月 17, 2009
作者:
R
Russell King
提交者:
Russell King
5月 17, 2009
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'smp-fix'
上级
776abac8
ee348d5a
变更
23
隐藏空白更改
内联
并排
Showing
23 changed file
with
228 addition
and
136 deletion
+228
-136
arch/arm/common/gic.c
arch/arm/common/gic.c
+2
-2
arch/arm/include/asm/hardware/gic.h
arch/arm/include/asm/hardware/gic.h
+1
-1
arch/arm/include/asm/smp.h
arch/arm/include/asm/smp.h
+4
-8
arch/arm/kernel/smp.c
arch/arm/kernel/smp.c
+16
-30
arch/arm/mach-realview/core.c
arch/arm/mach-realview/core.c
+0
-8
arch/arm/mach-realview/include/mach/smp.h
arch/arm/mach-realview/include/mach/smp.h
+2
-9
arch/arm/mach-realview/localtimer.c
arch/arm/mach-realview/localtimer.c
+4
-2
arch/arm/mach-realview/platsmp.c
arch/arm/mach-realview/platsmp.c
+3
-12
drivers/acpi/acpica/Makefile
drivers/acpi/acpica/Makefile
+15
-12
drivers/acpi/acpica/aclocal.h
drivers/acpi/acpica/aclocal.h
+6
-1
drivers/acpi/bus.c
drivers/acpi/bus.c
+1
-1
drivers/acpi/processor_idle.c
drivers/acpi/processor_idle.c
+33
-9
drivers/acpi/processor_throttling.c
drivers/acpi/processor_throttling.c
+25
-0
drivers/acpi/video.c
drivers/acpi/video.c
+38
-0
drivers/gpu/drm/Kconfig
drivers/gpu/drm/Kconfig
+6
-0
drivers/ide/icside.c
drivers/ide/icside.c
+1
-1
drivers/ide/ide-tape.c
drivers/ide/ide-tape.c
+0
-6
drivers/ide/piix.c
drivers/ide/piix.c
+1
-0
drivers/platform/x86/asus-laptop.c
drivers/platform/x86/asus-laptop.c
+3
-3
drivers/platform/x86/eeepc-laptop.c
drivers/platform/x86/eeepc-laptop.c
+40
-7
drivers/pnp/pnpacpi/core.c
drivers/pnp/pnpacpi/core.c
+3
-5
drivers/thermal/thermal_sys.c
drivers/thermal/thermal_sys.c
+4
-4
kernel/panic.c
kernel/panic.c
+20
-15
未找到文件。
arch/arm/common/gic.c
浏览文件 @
e1342f1d
...
...
@@ -253,9 +253,9 @@ void __cpuinit gic_cpu_init(unsigned int gic_nr, void __iomem *base)
}
#ifdef CONFIG_SMP
void
gic_raise_softirq
(
c
pumask_t
cpu
mask
,
unsigned
int
irq
)
void
gic_raise_softirq
(
c
onst
struct
cpumask
*
mask
,
unsigned
int
irq
)
{
unsigned
long
map
=
*
cpus_addr
(
cpu
mask
);
unsigned
long
map
=
*
cpus_addr
(
*
mask
);
/* this always happens on GIC0 */
writel
(
map
<<
16
|
irq
,
gic_data
[
0
].
dist_base
+
GIC_DIST_SOFTINT
);
...
...
arch/arm/include/asm/hardware/gic.h
浏览文件 @
e1342f1d
...
...
@@ -36,7 +36,7 @@
void
gic_dist_init
(
unsigned
int
gic_nr
,
void
__iomem
*
base
,
unsigned
int
irq_start
);
void
gic_cpu_init
(
unsigned
int
gic_nr
,
void
__iomem
*
base
);
void
gic_cascade_irq
(
unsigned
int
gic_nr
,
unsigned
int
irq
);
void
gic_raise_softirq
(
c
pumask_t
cpu
mask
,
unsigned
int
irq
);
void
gic_raise_softirq
(
c
onst
struct
cpumask
*
mask
,
unsigned
int
irq
);
#endif
#endif
arch/arm/include/asm/smp.h
浏览文件 @
e1342f1d
...
...
@@ -53,17 +53,12 @@ extern void smp_store_cpu_info(unsigned int cpuid);
/*
* Raise an IPI cross call on CPUs in callmap.
*/
extern
void
smp_cross_call
(
cpumask_t
callmap
);
/*
* Broadcast a timer interrupt to the other CPUs.
*/
extern
void
smp_send_timer
(
void
);
extern
void
smp_cross_call
(
const
struct
cpumask
*
mask
);
/*
* Broadcast a clock event to other CPUs.
*/
extern
void
smp_timer_broadcast
(
c
pumask_t
mask
);
extern
void
smp_timer_broadcast
(
c
onst
struct
cpumask
*
mask
);
/*
* Boot a secondary CPU, and assign it the specified idle task.
...
...
@@ -102,7 +97,8 @@ extern int platform_cpu_kill(unsigned int cpu);
extern
void
platform_cpu_enable
(
unsigned
int
cpu
);
extern
void
arch_send_call_function_single_ipi
(
int
cpu
);
extern
void
arch_send_call_function_ipi
(
cpumask_t
mask
);
extern
void
arch_send_call_function_ipi_mask
(
const
struct
cpumask
*
mask
);
#define arch_send_call_function_ipi_mask arch_send_call_function_ipi_mask
/*
* Local timer interrupt handling function (can be IPI'ed).
...
...
arch/arm/kernel/smp.c
浏览文件 @
e1342f1d
...
...
@@ -326,14 +326,14 @@ void __init smp_prepare_boot_cpu(void)
per_cpu
(
cpu_data
,
cpu
).
idle
=
current
;
}
static
void
send_ipi_message
(
c
pumask_t
callmap
,
enum
ipi_msg_type
msg
)
static
void
send_ipi_message
(
c
onst
struct
cpumask
*
mask
,
enum
ipi_msg_type
msg
)
{
unsigned
long
flags
;
unsigned
int
cpu
;
local_irq_save
(
flags
);
for_each_cpu
_mask
(
cpu
,
callmap
)
{
for_each_cpu
(
cpu
,
mask
)
{
struct
ipi_data
*
ipi
=
&
per_cpu
(
ipi_data
,
cpu
);
spin_lock
(
&
ipi
->
lock
);
...
...
@@ -344,19 +344,19 @@ static void send_ipi_message(cpumask_t callmap, enum ipi_msg_type msg)
/*
* Call the platform specific cross-CPU call function.
*/
smp_cross_call
(
callmap
);
smp_cross_call
(
mask
);
local_irq_restore
(
flags
);
}
void
arch_send_call_function_ipi
(
cpumask_t
mask
)
void
arch_send_call_function_ipi
_mask
(
const
struct
cpumask
*
mask
)
{
send_ipi_message
(
mask
,
IPI_CALL_FUNC
);
}
void
arch_send_call_function_single_ipi
(
int
cpu
)
{
send_ipi_message
(
cpumask_of
_cpu
(
cpu
),
IPI_CALL_FUNC_SINGLE
);
send_ipi_message
(
cpumask_of
(
cpu
),
IPI_CALL_FUNC_SINGLE
);
}
void
show_ipi_list
(
struct
seq_file
*
p
)
...
...
@@ -498,17 +498,10 @@ asmlinkage void __exception do_IPI(struct pt_regs *regs)
void
smp_send_reschedule
(
int
cpu
)
{
send_ipi_message
(
cpumask_of
_cpu
(
cpu
),
IPI_RESCHEDULE
);
send_ipi_message
(
cpumask_of
(
cpu
),
IPI_RESCHEDULE
);
}
void
smp_send_timer
(
void
)
{
cpumask_t
mask
=
cpu_online_map
;
cpu_clear
(
smp_processor_id
(),
mask
);
send_ipi_message
(
mask
,
IPI_TIMER
);
}
void
smp_timer_broadcast
(
cpumask_t
mask
)
void
smp_timer_broadcast
(
const
struct
cpumask
*
mask
)
{
send_ipi_message
(
mask
,
IPI_TIMER
);
}
...
...
@@ -517,7 +510,7 @@ void smp_send_stop(void)
{
cpumask_t
mask
=
cpu_online_map
;
cpu_clear
(
smp_processor_id
(),
mask
);
send_ipi_message
(
mask
,
IPI_CPU_STOP
);
send_ipi_message
(
&
mask
,
IPI_CPU_STOP
);
}
/*
...
...
@@ -528,20 +521,17 @@ int setup_profiling_timer(unsigned int multiplier)
return
-
EINVAL
;
}
static
int
on_each_cpu_mask
(
void
(
*
func
)(
void
*
),
void
*
info
,
int
wait
,
cpumask_t
mask
)
static
void
on_each_cpu_mask
(
void
(
*
func
)(
void
*
),
void
*
info
,
int
wait
,
const
struct
cpumask
*
mask
)
{
int
ret
=
0
;
preempt_disable
();
ret
=
smp_call_function_mask
(
mask
,
func
,
info
,
wait
);
if
(
cpu
_isset
(
smp_processor_id
(),
mask
))
smp_call_function_many
(
mask
,
func
,
info
,
wait
);
if
(
cpu
mask_test_cpu
(
smp_processor_id
(),
mask
))
func
(
info
);
preempt_enable
();
return
ret
;
}
/**********************************************************************/
...
...
@@ -602,20 +592,17 @@ void flush_tlb_all(void)
void
flush_tlb_mm
(
struct
mm_struct
*
mm
)
{
cpumask_t
mask
=
mm
->
cpu_vm_mask
;
on_each_cpu_mask
(
ipi_flush_tlb_mm
,
mm
,
1
,
mask
);
on_each_cpu_mask
(
ipi_flush_tlb_mm
,
mm
,
1
,
&
mm
->
cpu_vm_mask
);
}
void
flush_tlb_page
(
struct
vm_area_struct
*
vma
,
unsigned
long
uaddr
)
{
cpumask_t
mask
=
vma
->
vm_mm
->
cpu_vm_mask
;
struct
tlb_args
ta
;
ta
.
ta_vma
=
vma
;
ta
.
ta_start
=
uaddr
;
on_each_cpu_mask
(
ipi_flush_tlb_page
,
&
ta
,
1
,
mask
);
on_each_cpu_mask
(
ipi_flush_tlb_page
,
&
ta
,
1
,
&
vma
->
vm_mm
->
cpu_vm_
mask
);
}
void
flush_tlb_kernel_page
(
unsigned
long
kaddr
)
...
...
@@ -630,14 +617,13 @@ void flush_tlb_kernel_page(unsigned long kaddr)
void
flush_tlb_range
(
struct
vm_area_struct
*
vma
,
unsigned
long
start
,
unsigned
long
end
)
{
cpumask_t
mask
=
vma
->
vm_mm
->
cpu_vm_mask
;
struct
tlb_args
ta
;
ta
.
ta_vma
=
vma
;
ta
.
ta_start
=
start
;
ta
.
ta_end
=
end
;
on_each_cpu_mask
(
ipi_flush_tlb_range
,
&
ta
,
1
,
mask
);
on_each_cpu_mask
(
ipi_flush_tlb_range
,
&
ta
,
1
,
&
vma
->
vm_mm
->
cpu_vm_
mask
);
}
void
flush_tlb_kernel_range
(
unsigned
long
start
,
unsigned
long
end
)
...
...
arch/arm/mach-realview/core.c
浏览文件 @
e1342f1d
...
...
@@ -750,14 +750,6 @@ void __init realview_timer_init(unsigned int timer_irq)
{
u32
val
;
#ifdef CONFIG_GENERIC_CLOCKEVENTS_BROADCAST
/*
* The dummy clock device has to be registered before the main device
* so that the latter will broadcast the clock events
*/
local_timer_setup
();
#endif
/*
* set clock frequency:
* REALVIEW_REFCLK is 32KHz
...
...
arch/arm/mach-realview/include/mach/smp.h
浏览文件 @
e1342f1d
...
...
@@ -15,16 +15,9 @@
/*
* We use IRQ1 as the IPI
*/
static
inline
void
smp_cross_call
(
cpumask_t
callmap
)
{
gic_raise_softirq
(
callmap
,
1
);
}
/*
* Do nothing on MPcore.
*/
static
inline
void
smp_cross_call_done
(
cpumask_t
callmap
)
static
inline
void
smp_cross_call
(
const
struct
cpumask
*
mask
)
{
gic_raise_softirq
(
mask
,
1
);
}
#endif
arch/arm/mach-realview/localtimer.c
浏览文件 @
e1342f1d
...
...
@@ -189,8 +189,10 @@ void __cpuinit local_timer_setup(void)
struct
clock_event_device
*
clk
=
&
per_cpu
(
local_clockevent
,
cpu
);
clk
->
name
=
"dummy_timer"
;
clk
->
features
=
CLOCK_EVT_FEAT_DUMMY
;
clk
->
rating
=
200
;
clk
->
features
=
CLOCK_EVT_FEAT_ONESHOT
|
CLOCK_EVT_FEAT_PERIODIC
|
CLOCK_EVT_FEAT_DUMMY
;
clk
->
rating
=
400
;
clk
->
mult
=
1
;
clk
->
set_mode
=
dummy_timer_set_mode
;
clk
->
broadcast
=
smp_timer_broadcast
;
...
...
arch/arm/mach-realview/platsmp.c
浏览文件 @
e1342f1d
...
...
@@ -77,13 +77,6 @@ void __cpuinit platform_secondary_init(unsigned int cpu)
{
trace_hardirqs_off
();
/*
* the primary core may have used a "cross call" soft interrupt
* to get this processor out of WFI in the BootMonitor - make
* sure that we are no longer being sent this soft interrupt
*/
smp_cross_call_done
(
cpumask_of_cpu
(
cpu
));
/*
* if any interrupts are already enabled for the primary
* core (e.g. timer irq), then they will not have been enabled
...
...
@@ -136,7 +129,7 @@ int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle)
* Use smp_cross_call() for this, since there's little
* point duplicating the code here
*/
smp_cross_call
(
cpumask_of
_cpu
(
cpu
));
smp_cross_call
(
cpumask_of
(
cpu
));
timeout
=
jiffies
+
(
1
*
HZ
);
while
(
time_before
(
jiffies
,
timeout
))
{
...
...
@@ -224,11 +217,9 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
if
(
max_cpus
>
ncores
)
max_cpus
=
ncores
;
#if
def CONFIG_LOCAL_TIMERS
#if
defined(CONFIG_LOCAL_TIMERS) || defined(CONFIG_GENERIC_CLOCKEVENTS_BROADCAST)
/*
* Enable the local timer for primary CPU. If the device is
* dummy (!CONFIG_LOCAL_TIMERS), it was already registers in
* realview_timer_init
* Enable the local timer or broadcast device for the boot CPU.
*/
local_timer_setup
();
#endif
...
...
drivers/acpi/acpica/Makefile
浏览文件 @
e1342f1d
...
...
@@ -5,40 +5,43 @@
ccflags-y
:=
-Os
ccflags-$(CONFIG_ACPI_DEBUG)
+=
-DACPI_DEBUG_OUTPUT
obj-y
:=
dsfield.o dsmthdat.o dsopcode.o dswexec.o dswscope.o
\
# use acpi.o to put all files here into acpi.o modparam namespace
obj-y
+=
acpi.o
acpi-y
:=
dsfield.o dsmthdat.o dsopcode.o dswexec.o dswscope.o
\
dsmethod.o dsobject.o dsutils.o dswload.o dswstate.o
\
dsinit.o
obj
-y
+=
evevent.o evregion.o evsci.o evxfevnt.o
\
acpi
-y
+=
evevent.o evregion.o evsci.o evxfevnt.o
\
evmisc.o evrgnini.o evxface.o evxfregn.o
\
evgpe.o evgpeblk.o
obj
-y
+=
exconfig.o exfield.o exnames.o exoparg6.o exresolv.o exstorob.o
\
acpi
-y
+=
exconfig.o exfield.o exnames.o exoparg6.o exresolv.o exstorob.o
\
exconvrt.o exfldio.o exoparg1.o exprep.o exresop.o exsystem.o
\
excreate.o exmisc.o exoparg2.o exregion.o exstore.o exutils.o
\
exdump.o exmutex.o exoparg3.o exresnte.o exstoren.o
obj
-y
+=
hwacpi.o hwgpe.o hwregs.o hwsleep.o hwxface.o hwvalid.o
acpi
-y
+=
hwacpi.o hwgpe.o hwregs.o hwsleep.o hwxface.o hwvalid.o
obj
-$(ACPI_FUTURE_USAGE)
+=
hwtimer.o
acpi
-$(ACPI_FUTURE_USAGE)
+=
hwtimer.o
obj
-y
+=
nsaccess.o nsload.o nssearch.o nsxfeval.o
\
acpi
-y
+=
nsaccess.o nsload.o nssearch.o nsxfeval.o
\
nsalloc.o nseval.o nsnames.o nsutils.o nsxfname.o
\
nsdump.o nsinit.o nsobject.o nswalk.o nsxfobj.o
\
nsparse.o nspredef.o
obj
-$(ACPI_FUTURE_USAGE)
+=
nsdumpdv.o
acpi
-$(ACPI_FUTURE_USAGE)
+=
nsdumpdv.o
obj
-y
+=
psargs.o psparse.o psloop.o pstree.o pswalk.o
\
acpi
-y
+=
psargs.o psparse.o psloop.o pstree.o pswalk.o
\
psopcode.o psscope.o psutils.o psxface.o
obj
-y
+=
rsaddr.o rscreate.o rsinfo.o rsio.o rslist.o rsmisc.o rsxface.o
\
acpi
-y
+=
rsaddr.o rscreate.o rsinfo.o rsio.o rslist.o rsmisc.o rsxface.o
\
rscalc.o rsirq.o rsmemory.o rsutils.o
obj
-$(ACPI_FUTURE_USAGE)
+=
rsdump.o
acpi
-$(ACPI_FUTURE_USAGE)
+=
rsdump.o
obj
-y
+=
tbxface.o tbinstal.o tbutils.o tbfind.o tbfadt.o tbxfroot.o
acpi
-y
+=
tbxface.o tbinstal.o tbutils.o tbfind.o tbfadt.o tbxfroot.o
obj
-y
+=
utalloc.o utdebug.o uteval.o utinit.o utmisc.o utxface.o
\
acpi
-y
+=
utalloc.o utdebug.o uteval.o utinit.o utmisc.o utxface.o
\
utcopy.o utdelete.o utglobal.o utmath.o utobject.o
\
utstate.o utmutex.o utobject.o utresrc.o utlock.o
drivers/acpi/acpica/aclocal.h
浏览文件 @
e1342f1d
...
...
@@ -787,7 +787,12 @@ struct acpi_bit_register_info {
/* For control registers, both ignored and reserved bits must be preserved */
#define ACPI_PM1_CONTROL_IGNORED_BITS 0x0201
/* Bits 9, 0(SCI_EN) */
/*
* The ACPI spec says to ignore PM1_CTL.SCI_EN (bit 0)
* but we need to be able to write ACPI_BITREG_SCI_ENABLE directly
* as a BIOS workaround on some machines.
*/
#define ACPI_PM1_CONTROL_IGNORED_BITS 0x0200
/* Bits 9 */
#define ACPI_PM1_CONTROL_RESERVED_BITS 0xC1F8
/* Bits 14-15, 3-8 */
#define ACPI_PM1_CONTROL_PRESERVED_BITS \
(ACPI_PM1_CONTROL_IGNORED_BITS | ACPI_PM1_CONTROL_RESERVED_BITS)
...
...
drivers/acpi/bus.c
浏览文件 @
e1342f1d
...
...
@@ -312,7 +312,7 @@ int acpi_bus_set_power(acpi_handle handle, int state)
end:
if
(
result
)
printk
(
KERN_WARNING
PREFIX
"
Transitioning device [%s]
to D%d
\n
"
,
"
Device [%s] failed to transition
to D%d
\n
"
,
device
->
pnp
.
bus_id
,
state
);
else
{
device
->
power
.
state
=
state
;
...
...
drivers/acpi/processor_idle.c
浏览文件 @
e1342f1d
...
...
@@ -202,21 +202,44 @@ static void acpi_state_timer_broadcast(struct acpi_processor *pr,
* Suspend / resume control
*/
static
int
acpi_idle_suspend
;
static
u32
saved_bm_rld
;
static
void
acpi_idle_bm_rld_save
(
void
)
{
acpi_read_bit_register
(
ACPI_BITREG_BUS_MASTER_RLD
,
&
saved_bm_rld
);
}
static
void
acpi_idle_bm_rld_restore
(
void
)
{
u32
resumed_bm_rld
;
acpi_read_bit_register
(
ACPI_BITREG_BUS_MASTER_RLD
,
&
resumed_bm_rld
);
if
(
resumed_bm_rld
!=
saved_bm_rld
)
acpi_write_bit_register
(
ACPI_BITREG_BUS_MASTER_RLD
,
saved_bm_rld
);
}
int
acpi_processor_suspend
(
struct
acpi_device
*
device
,
pm_message_t
state
)
{
if
(
acpi_idle_suspend
==
1
)
return
0
;
acpi_idle_bm_rld_save
();
acpi_idle_suspend
=
1
;
return
0
;
}
int
acpi_processor_resume
(
struct
acpi_device
*
device
)
{
if
(
acpi_idle_suspend
==
0
)
return
0
;
acpi_idle_bm_rld_restore
();
acpi_idle_suspend
=
0
;
return
0
;
}
#if defined (CONFIG_GENERIC_TIME) && defined (CONFIG_X86)
static
int
tsc_halts_in_c
(
int
state
)
static
void
tsc_check_state
(
int
state
)
{
switch
(
boot_cpu_data
.
x86_vendor
)
{
case
X86_VENDOR_AMD
:
...
...
@@ -226,13 +249,17 @@ static int tsc_halts_in_c(int state)
* C/P/S0/S1 states when this bit is set.
*/
if
(
boot_cpu_has
(
X86_FEATURE_NONSTOP_TSC
))
return
0
;
return
;
/*FALL THROUGH*/
default:
return
state
>
ACPI_STATE_C1
;
/* TSC could halt in idle, so notify users */
if
(
state
>
ACPI_STATE_C1
)
mark_tsc_unstable
(
"TSC halts in idle"
);
}
}
#else
static
void
tsc_check_state
(
int
state
)
{
return
;
}
#endif
static
int
acpi_processor_get_power_info_fadt
(
struct
acpi_processor
*
pr
)
...
...
@@ -578,14 +605,9 @@ static int acpi_processor_power_verify(struct acpi_processor *pr)
pr
->
power
.
timer_broadcast_on_state
=
INT_MAX
;
for
(
i
=
1
;
i
<
ACPI_PROCESSOR_MAX_POWER
;
i
++
)
{
for
(
i
=
1
;
i
<
ACPI_PROCESSOR_MAX_POWER
&&
i
<=
max_cstate
;
i
++
)
{
struct
acpi_processor_cx
*
cx
=
&
pr
->
power
.
states
[
i
];
#if defined (CONFIG_GENERIC_TIME) && defined (CONFIG_X86)
/* TSC could halt in idle, so notify users */
if
(
tsc_halts_in_c
(
cx
->
type
))
mark_tsc_unstable
(
"TSC halts in idle"
);;
#endif
switch
(
cx
->
type
)
{
case
ACPI_STATE_C1
:
cx
->
valid
=
1
;
...
...
@@ -603,6 +625,8 @@ static int acpi_processor_power_verify(struct acpi_processor *pr)
acpi_timer_check_state
(
i
,
pr
,
cx
);
break
;
}
if
(
cx
->
valid
)
tsc_check_state
(
cx
->
type
);
if
(
cx
->
valid
)
working
++
;
...
...
drivers/acpi/processor_throttling.c
浏览文件 @
e1342f1d
...
...
@@ -45,6 +45,14 @@
#define _COMPONENT ACPI_PROCESSOR_COMPONENT
ACPI_MODULE_NAME
(
"processor_throttling"
);
/* ignore_tpc:
* 0 -> acpi processor driver doesn't ignore _TPC values
* 1 -> acpi processor driver ignores _TPC values
*/
static
int
ignore_tpc
;
module_param
(
ignore_tpc
,
int
,
0644
);
MODULE_PARM_DESC
(
ignore_tpc
,
"Disable broken BIOS _TPC throttling support"
);
struct
throttling_tstate
{
unsigned
int
cpu
;
/* cpu nr */
int
target_state
;
/* target T-state */
...
...
@@ -283,6 +291,10 @@ static int acpi_processor_get_platform_limit(struct acpi_processor *pr)
if
(
!
pr
)
return
-
EINVAL
;
if
(
ignore_tpc
)
goto
end
;
status
=
acpi_evaluate_integer
(
pr
->
handle
,
"_TPC"
,
NULL
,
&
tpc
);
if
(
ACPI_FAILURE
(
status
))
{
if
(
status
!=
AE_NOT_FOUND
)
{
...
...
@@ -290,6 +302,8 @@ static int acpi_processor_get_platform_limit(struct acpi_processor *pr)
}
return
-
ENODEV
;
}
end:
pr
->
throttling_platform_limit
=
(
int
)
tpc
;
return
0
;
}
...
...
@@ -302,6 +316,9 @@ int acpi_processor_tstate_has_changed(struct acpi_processor *pr)
struct
acpi_processor_limit
*
limit
;
int
target_state
;
if
(
ignore_tpc
)
return
0
;
result
=
acpi_processor_get_platform_limit
(
pr
);
if
(
result
)
{
/* Throttling Limit is unsupported */
...
...
@@ -821,6 +838,14 @@ static int acpi_processor_get_throttling_ptc(struct acpi_processor *pr)
ret
=
acpi_read_throttling_status
(
pr
,
&
value
);
if
(
ret
>=
0
)
{
state
=
acpi_get_throttling_state
(
pr
,
value
);
if
(
state
==
-
1
)
{
ACPI_WARNING
((
AE_INFO
,
"Invalid throttling state, reset
\n
"
));
state
=
0
;
ret
=
acpi_processor_set_throttling
(
pr
,
state
);
if
(
ret
)
return
ret
;
}
pr
->
throttling
.
state
=
state
;
}
...
...
drivers/acpi/video.c
浏览文件 @
e1342f1d
...
...
@@ -538,6 +538,41 @@ acpi_video_device_lcd_set_level(struct acpi_video_device *device, int level)
return
-
EINVAL
;
}
/*
* For some buggy _BQC methods, we need to add a constant value to
* the _BQC return value to get the actual current brightness level
*/
static
int
bqc_offset_aml_bug_workaround
;
static
int
__init
video_set_bqc_offset
(
const
struct
dmi_system_id
*
d
)
{
bqc_offset_aml_bug_workaround
=
9
;
return
0
;
}
static
struct
dmi_system_id
video_dmi_table
[]
__initdata
=
{
/*
* Broken _BQC workaround http://bugzilla.kernel.org/show_bug.cgi?id=13121
*/
{
.
callback
=
video_set_bqc_offset
,
.
ident
=
"Acer Aspire 5720"
,
.
matches
=
{
DMI_MATCH
(
DMI_BOARD_VENDOR
,
"Acer"
),
DMI_MATCH
(
DMI_PRODUCT_NAME
,
"Aspire 5720"
),
},
},
{
.
callback
=
video_set_bqc_offset
,
.
ident
=
"Acer Aspire 5710Z"
,
.
matches
=
{
DMI_MATCH
(
DMI_BOARD_VENDOR
,
"Acer"
),
DMI_MATCH
(
DMI_PRODUCT_NAME
,
"Aspire 5710Z"
),
},
},
{}
};
static
int
acpi_video_device_lcd_get_level_current
(
struct
acpi_video_device
*
device
,
unsigned
long
long
*
level
)
...
...
@@ -557,6 +592,7 @@ acpi_video_device_lcd_get_level_current(struct acpi_video_device *device,
*
level
=
device
->
brightness
->
levels
[
*
level
+
2
];
}
*
level
+=
bqc_offset_aml_bug_workaround
;
device
->
brightness
->
curr
=
*
level
;
return
0
;
}
else
{
...
...
@@ -2290,6 +2326,8 @@ EXPORT_SYMBOL(acpi_video_register);
static
int
__init
acpi_video_init
(
void
)
{
dmi_check_system
(
video_dmi_table
);
if
(
intel_opregion_present
())
return
0
;
...
...
drivers/gpu/drm/Kconfig
浏览文件 @
e1342f1d
...
...
@@ -84,6 +84,12 @@ config DRM_I915
config DRM_I915_KMS
bool "Enable modesetting on intel by default"
depends on DRM_I915
# i915 KMS depends on ACPI_VIDEO when ACPI is enabled
# but for select to work, need to select ACPI_VIDEO's dependencies, ick
select VIDEO_OUTPUT_CONTROL if ACPI
select BACKLIGHT_CLASS_DEVICE if ACPI
select INPUT if ACPI
select ACPI_VIDEO if ACPI
help
Choose this option if you want kernel modesetting enabled by default,
and you have a new enough userspace to support this. Running old
...
...
drivers/ide/icside.c
浏览文件 @
e1342f1d
...
...
@@ -466,7 +466,7 @@ icside_register_v6(struct icside_state *state, struct expansion_card *ec)
struct
ide_host
*
host
;
unsigned
int
sel
=
0
;
int
ret
;
hw_regs_t
hw
[
2
],
*
hws
[]
=
{
&
hw
[
0
],
NULL
,
NULL
,
NULL
};
hw_regs_t
hw
[
2
],
*
hws
[]
=
{
&
hw
[
0
],
&
hw
[
1
]
,
NULL
,
NULL
};
struct
ide_port_info
d
=
icside_v6_port_info
;
ioc_base
=
ecardm_iomap
(
ec
,
ECARD_RES_IOCFAST
,
0
,
0
);
...
...
drivers/ide/ide-tape.c
浏览文件 @
e1342f1d
...
...
@@ -614,12 +614,6 @@ static ide_startstop_t ide_tape_issue_pc(ide_drive_t *drive,
{
idetape_tape_t
*
tape
=
drive
->
driver_data
;
if
(
drive
->
pc
->
c
[
0
]
==
REQUEST_SENSE
&&
pc
->
c
[
0
]
==
REQUEST_SENSE
)
{
printk
(
KERN_ERR
"ide-tape: possible ide-tape.c bug - "
"Two request sense in serial were issued
\n
"
);
}
if
(
drive
->
failed_pc
==
NULL
&&
pc
->
c
[
0
]
!=
REQUEST_SENSE
)
drive
->
failed_pc
=
pc
;
...
...
drivers/ide/piix.c
浏览文件 @
e1342f1d
...
...
@@ -263,6 +263,7 @@ static const struct ich_laptop ich_laptop[] = {
{
0x24CA
,
0x1025
,
0x003d
},
/* ICH4 on ACER TM290 */
{
0x266F
,
0x1025
,
0x0066
},
/* ICH6 on ACER Aspire 1694WLMi */
{
0x2653
,
0x1043
,
0x82D8
},
/* ICH6M on Asus Eee 701 */
{
0x27df
,
0x104d
,
0x900e
},
/* ICH7 on Sony TZ-90 */
/* end marker */
{
0
,
}
};
...
...
drivers/platform/x86/asus-laptop.c
浏览文件 @
e1342f1d
...
...
@@ -269,16 +269,16 @@ static struct key_entry asus_keymap[] = {
{
KE_KEY
,
0x34
,
KEY_SWITCHVIDEOMODE
},
{
KE_KEY
,
0x40
,
KEY_PREVIOUSSONG
},
{
KE_KEY
,
0x41
,
KEY_NEXTSONG
},
{
KE_KEY
,
0x43
,
KEY_STOP
},
{
KE_KEY
,
0x43
,
KEY_STOP
CD
},
{
KE_KEY
,
0x45
,
KEY_PLAYPAUSE
},
{
KE_KEY
,
0x50
,
KEY_EMAIL
},
{
KE_KEY
,
0x51
,
KEY_WWW
},
{
KE_KEY
,
0x5C
,
BTN_EXTRA
},
/* Performance
*/
{
KE_KEY
,
0x5C
,
KEY_SCREENLOCK
},
/* Screenlock
*/
{
KE_KEY
,
0x5D
,
KEY_WLAN
},
{
KE_KEY
,
0x61
,
KEY_SWITCHVIDEOMODE
},
{
KE_KEY
,
0x6B
,
BTN_TOUCH
},
/* Lock Mouse */
{
KE_KEY
,
0x82
,
KEY_CAMERA
},
{
KE_KEY
,
0x8A
,
KEY_
TV
},
{
KE_KEY
,
0x8A
,
KEY_
PROG1
},
{
KE_KEY
,
0x95
,
KEY_MEDIA
},
{
KE_KEY
,
0x99
,
KEY_PHONE
},
{
KE_END
,
0
},
...
...
drivers/platform/x86/eeepc-laptop.c
浏览文件 @
e1342f1d
...
...
@@ -158,6 +158,7 @@ enum { KE_KEY, KE_END };
static
struct
key_entry
eeepc_keymap
[]
=
{
/* Sleep already handled via generic ACPI code */
{
KE_KEY
,
0x10
,
KEY_WLAN
},
{
KE_KEY
,
0x11
,
KEY_WLAN
},
{
KE_KEY
,
0x12
,
KEY_PROG1
},
{
KE_KEY
,
0x13
,
KEY_MUTE
},
{
KE_KEY
,
0x14
,
KEY_VOLUMEDOWN
},
...
...
@@ -166,6 +167,8 @@ static struct key_entry eeepc_keymap[] = {
{
KE_KEY
,
0x1b
,
KEY_ZOOM
},
{
KE_KEY
,
0x1c
,
KEY_PROG2
},
{
KE_KEY
,
0x1d
,
KEY_PROG3
},
{
KE_KEY
,
NOTIFY_BRN_MIN
,
KEY_BRIGHTNESSDOWN
},
{
KE_KEY
,
NOTIFY_BRN_MIN
+
2
,
KEY_BRIGHTNESSUP
},
{
KE_KEY
,
0x30
,
KEY_SWITCHVIDEOMODE
},
{
KE_KEY
,
0x31
,
KEY_SWITCHVIDEOMODE
},
{
KE_KEY
,
0x32
,
KEY_SWITCHVIDEOMODE
},
...
...
@@ -381,11 +384,13 @@ static ssize_t show_sys_acpi(int cm, char *buf)
EEEPC_CREATE_DEVICE_ATTR
(
camera
,
CM_ASL_CAMERA
);
EEEPC_CREATE_DEVICE_ATTR
(
cardr
,
CM_ASL_CARDREADER
);
EEEPC_CREATE_DEVICE_ATTR
(
disp
,
CM_ASL_DISPLAYSWITCH
);
EEEPC_CREATE_DEVICE_ATTR
(
cpufv
,
CM_ASL_CPUFV
);
static
struct
attribute
*
platform_attributes
[]
=
{
&
dev_attr_camera
.
attr
,
&
dev_attr_cardr
.
attr
,
&
dev_attr_disp
.
attr
,
&
dev_attr_cpufv
.
attr
,
NULL
};
...
...
@@ -512,15 +517,21 @@ static int eeepc_hotk_check(void)
return
0
;
}
static
void
notify_brn
(
void
)
static
int
notify_brn
(
void
)
{
/* returns the *previous* brightness, or -1 */
struct
backlight_device
*
bd
=
eeepc_backlight_device
;
if
(
bd
)
if
(
bd
)
{
int
old
=
bd
->
props
.
brightness
;
bd
->
props
.
brightness
=
read_brightness
(
bd
);
return
old
;
}
return
-
1
;
}
static
void
eeepc_rfkill_notify
(
acpi_handle
handle
,
u32
event
,
void
*
data
)
{
enum
rfkill_state
state
;
struct
pci_dev
*
dev
;
struct
pci_bus
*
bus
=
pci_find_bus
(
0
,
1
);
...
...
@@ -532,7 +543,9 @@ static void eeepc_rfkill_notify(acpi_handle handle, u32 event, void *data)
return
;
}
if
(
get_acpi
(
CM_ASL_WLAN
)
==
1
)
{
eeepc_wlan_rfkill_state
(
ehotk
->
eeepc_wlan_rfkill
,
&
state
);
if
(
state
==
RFKILL_STATE_UNBLOCKED
)
{
dev
=
pci_get_slot
(
bus
,
0
);
if
(
dev
)
{
/* Device already present */
...
...
@@ -552,23 +565,41 @@ static void eeepc_rfkill_notify(acpi_handle handle, u32 event, void *data)
pci_dev_put
(
dev
);
}
}
rfkill_force_state
(
ehotk
->
eeepc_wlan_rfkill
,
state
);
}
static
void
eeepc_hotk_notify
(
acpi_handle
handle
,
u32
event
,
void
*
data
)
{
static
struct
key_entry
*
key
;
u16
count
;
int
brn
=
-
ENODEV
;
if
(
!
ehotk
)
return
;
if
(
event
>=
NOTIFY_BRN_MIN
&&
event
<=
NOTIFY_BRN_MAX
)
notify_brn
();
brn
=
notify_brn
();
count
=
ehotk
->
event_count
[
event
%
128
]
++
;
acpi_bus_generate_proc_event
(
ehotk
->
device
,
event
,
count
);
acpi_bus_generate_netlink_event
(
ehotk
->
device
->
pnp
.
device_class
,
dev_name
(
&
ehotk
->
device
->
dev
),
event
,
count
);
if
(
ehotk
->
inputdev
)
{
if
(
brn
!=
-
ENODEV
)
{
/* brightness-change events need special
* handling for conversion to key events
*/
if
(
brn
<
0
)
brn
=
event
;
else
brn
+=
NOTIFY_BRN_MIN
;
if
(
event
<
brn
)
event
=
NOTIFY_BRN_MIN
;
/* brightness down */
else
if
(
event
>
brn
)
event
=
NOTIFY_BRN_MIN
+
2
;
/* ... up */
else
event
=
NOTIFY_BRN_MIN
+
1
;
/* ... unchanged */
}
key
=
eepc_get_entry_by_scancode
(
event
);
if
(
key
)
{
switch
(
key
->
type
)
{
...
...
@@ -649,6 +680,9 @@ static int eeepc_hotk_add(struct acpi_device *device)
if
(
ACPI_FAILURE
(
status
))
printk
(
EEEPC_ERR
"Error installing notify handler
\n
"
);
eeepc_register_rfkill_notifier
(
"
\\
_SB.PCI0.P0P6"
);
eeepc_register_rfkill_notifier
(
"
\\
_SB.PCI0.P0P7"
);
if
(
get_acpi
(
CM_ASL_WLAN
)
!=
-
1
)
{
ehotk
->
eeepc_wlan_rfkill
=
rfkill_allocate
(
&
device
->
dev
,
RFKILL_TYPE_WLAN
);
...
...
@@ -704,9 +738,6 @@ static int eeepc_hotk_add(struct acpi_device *device)
goto
bluetooth_fail
;
}
eeepc_register_rfkill_notifier
(
"
\\
_SB.PCI0.P0P6"
);
eeepc_register_rfkill_notifier
(
"
\\
_SB.PCI0.P0P7"
);
return
0
;
bluetooth_fail:
...
...
@@ -717,6 +748,8 @@ static int eeepc_hotk_add(struct acpi_device *device)
wlan_fail:
if
(
ehotk
->
eeepc_wlan_rfkill
)
rfkill_free
(
ehotk
->
eeepc_wlan_rfkill
);
eeepc_unregister_rfkill_notifier
(
"
\\
_SB.PCI0.P0P6"
);
eeepc_unregister_rfkill_notifier
(
"
\\
_SB.PCI0.P0P7"
);
ehotk_fail:
kfree
(
ehotk
);
ehotk
=
NULL
;
...
...
drivers/pnp/pnpacpi/core.c
浏览文件 @
e1342f1d
...
...
@@ -110,11 +110,9 @@ static int pnpacpi_disable_resources(struct pnp_dev *dev)
/* acpi_unregister_gsi(pnp_irq(dev, 0)); */
ret
=
0
;
if
(
acpi_bus_power_manageable
(
handle
))
{
ret
=
acpi_bus_set_power
(
handle
,
ACPI_STATE_D3
);
if
(
ret
)
return
ret
;
}
if
(
acpi_bus_power_manageable
(
handle
))
acpi_bus_set_power
(
handle
,
ACPI_STATE_D3
);
/* continue even if acpi_bus_set_power() fails */
if
(
ACPI_FAILURE
(
acpi_evaluate_object
(
handle
,
"_DIS"
,
NULL
,
NULL
)))
ret
=
-
ENODEV
;
return
ret
;
...
...
drivers/thermal/thermal_sys.c
浏览文件 @
e1342f1d
...
...
@@ -961,7 +961,7 @@ void thermal_zone_device_update(struct thermal_zone_device *tz)
switch
(
trip_type
)
{
case
THERMAL_TRIP_CRITICAL
:
if
(
temp
>
trip_temp
)
{
if
(
temp
>
=
trip_temp
)
{
if
(
tz
->
ops
->
notify
)
ret
=
tz
->
ops
->
notify
(
tz
,
count
,
trip_type
);
...
...
@@ -974,7 +974,7 @@ void thermal_zone_device_update(struct thermal_zone_device *tz)
}
break
;
case
THERMAL_TRIP_HOT
:
if
(
temp
>
trip_temp
)
if
(
temp
>
=
trip_temp
)
if
(
tz
->
ops
->
notify
)
tz
->
ops
->
notify
(
tz
,
count
,
trip_type
);
break
;
...
...
@@ -986,14 +986,14 @@ void thermal_zone_device_update(struct thermal_zone_device *tz)
cdev
=
instance
->
cdev
;
if
(
temp
>
trip_temp
)
if
(
temp
>
=
trip_temp
)
cdev
->
ops
->
set_cur_state
(
cdev
,
1
);
else
cdev
->
ops
->
set_cur_state
(
cdev
,
0
);
}
break
;
case
THERMAL_TRIP_PASSIVE
:
if
(
temp
>
trip_temp
||
tz
->
passive
)
if
(
temp
>
=
trip_temp
||
tz
->
passive
)
thermal_zone_device_passive
(
tz
,
temp
,
trip_temp
,
count
);
break
;
...
...
kernel/panic.c
浏览文件 @
e1342f1d
...
...
@@ -340,39 +340,44 @@ void oops_exit(void)
}
#ifdef WANT_WARN_ON_SLOWPATH
void
warn_slowpath_fmt
(
const
char
*
file
,
int
line
,
const
char
*
fmt
,
...)
{
struct
slowpath_args
{
const
char
*
fmt
;
va_list
args
;
char
function
[
KSYM_SYMBOL_LEN
];
unsigned
long
caller
=
(
unsigned
long
)
__builtin_return_address
(
0
);
const
char
*
board
;
};
sprint_symbol
(
function
,
caller
);
static
void
warn_slowpath_common
(
const
char
*
file
,
int
line
,
void
*
caller
,
struct
slowpath_args
*
args
)
{
const
char
*
board
;
printk
(
KERN_WARNING
"------------[ cut here ]------------
\n
"
);
printk
(
KERN_WARNING
"WARNING: at %s:%d %s()
\n
"
,
file
,
line
,
function
);
printk
(
KERN_WARNING
"WARNING: at %s:%d %pS()
\n
"
,
file
,
line
,
caller
);
board
=
dmi_get_system_info
(
DMI_PRODUCT_NAME
);
if
(
board
)
printk
(
KERN_WARNING
"Hardware name: %s
\n
"
,
board
);
if
(
*
fmt
)
{
va_start
(
args
,
fmt
);
vprintk
(
fmt
,
args
);
va_end
(
args
);
}
if
(
args
)
vprintk
(
args
->
fmt
,
args
->
args
);
print_modules
();
dump_stack
();
print_oops_end_marker
();
add_taint
(
TAINT_WARN
);
}
void
warn_slowpath_fmt
(
const
char
*
file
,
int
line
,
const
char
*
fmt
,
...)
{
struct
slowpath_args
args
;
args
.
fmt
=
fmt
;
va_start
(
args
.
args
,
fmt
);
warn_slowpath_common
(
file
,
line
,
__builtin_return_address
(
0
),
&
args
);
va_end
(
args
.
args
);
}
EXPORT_SYMBOL
(
warn_slowpath_fmt
);
void
warn_slowpath_null
(
const
char
*
file
,
int
line
)
{
static
const
char
*
empty
=
""
;
warn_slowpath_fmt
(
file
,
line
,
empty
);
warn_slowpath_common
(
file
,
line
,
__builtin_return_address
(
0
),
NULL
);
}
EXPORT_SYMBOL
(
warn_slowpath_null
);
#endif
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录