Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
gsplhtlxg
clone-Linux
提交
33526a53
C
clone-Linux
项目概览
gsplhtlxg
/
clone-Linux
通知
2
Star
0
Fork
1
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
C
clone-Linux
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
33526a53
编写于
4月 05, 2009
作者:
L
Len Brown
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'x2apic' into release
上级
47ae106d
786c221a
变更
7
隐藏空白更改
内联
并排
Showing
7 changed file
with
194 addition
and
8 deletion
+194
-8
arch/x86/kernel/acpi/boot.c
arch/x86/kernel/acpi/boot.c
+59
-4
arch/x86/mm/srat_64.c
arch/x86/mm/srat_64.c
+30
-0
drivers/acpi/numa.c
drivers/acpi/numa.c
+45
-1
drivers/acpi/processor_core.c
drivers/acpi/processor_core.c
+26
-0
drivers/acpi/tables.c
drivers/acpi/tables.c
+30
-0
include/acpi/actbl1.h
include/acpi/actbl1.h
+3
-3
include/linux/acpi.h
include/linux/acpi.h
+1
-0
未找到文件。
arch/x86/kernel/acpi/boot.c
浏览文件 @
33526a53
...
...
@@ -259,6 +259,35 @@ static void __cpuinit acpi_register_lapic(int id, u8 enabled)
generic_processor_info
(
id
,
ver
);
}
static
int
__init
acpi_parse_x2apic
(
struct
acpi_subtable_header
*
header
,
const
unsigned
long
end
)
{
struct
acpi_madt_local_x2apic
*
processor
=
NULL
;
processor
=
(
struct
acpi_madt_local_x2apic
*
)
header
;
if
(
BAD_MADT_ENTRY
(
processor
,
end
))
return
-
EINVAL
;
acpi_table_print_madt_entry
(
header
);
#ifdef CONFIG_X86_X2APIC
/*
* We need to register disabled CPU as well to permit
* counting disabled CPUs. This allows us to size
* cpus_possible_map more accurately, to permit
* to not preallocating memory for all NR_CPUS
* when we use CPU hotplug.
*/
acpi_register_lapic
(
processor
->
local_apic_id
,
/* APIC ID */
processor
->
lapic_flags
&
ACPI_MADT_ENABLED
);
#else
printk
(
KERN_WARNING
PREFIX
"x2apic entry ignored
\n
"
);
#endif
return
0
;
}
static
int
__init
acpi_parse_lapic
(
struct
acpi_subtable_header
*
header
,
const
unsigned
long
end
)
{
...
...
@@ -318,6 +347,25 @@ acpi_parse_lapic_addr_ovr(struct acpi_subtable_header * header,
return
0
;
}
static
int
__init
acpi_parse_x2apic_nmi
(
struct
acpi_subtable_header
*
header
,
const
unsigned
long
end
)
{
struct
acpi_madt_local_x2apic_nmi
*
x2apic_nmi
=
NULL
;
x2apic_nmi
=
(
struct
acpi_madt_local_x2apic_nmi
*
)
header
;
if
(
BAD_MADT_ENTRY
(
x2apic_nmi
,
end
))
return
-
EINVAL
;
acpi_table_print_madt_entry
(
header
);
if
(
x2apic_nmi
->
lint
!=
1
)
printk
(
KERN_WARNING
PREFIX
"NMI not connected to LINT 1!
\n
"
);
return
0
;
}
static
int
__init
acpi_parse_lapic_nmi
(
struct
acpi_subtable_header
*
header
,
const
unsigned
long
end
)
{
...
...
@@ -823,6 +871,7 @@ static int __init early_acpi_parse_madt_lapic_addr_ovr(void)
static
int
__init
acpi_parse_madt_lapic_entries
(
void
)
{
int
count
;
int
x2count
=
0
;
if
(
!
cpu_has_apic
)
return
-
ENODEV
;
...
...
@@ -846,22 +895,28 @@ static int __init acpi_parse_madt_lapic_entries(void)
count
=
acpi_table_parse_madt
(
ACPI_MADT_TYPE_LOCAL_SAPIC
,
acpi_parse_sapic
,
MAX_APICS
);
if
(
!
count
)
if
(
!
count
)
{
x2count
=
acpi_table_parse_madt
(
ACPI_MADT_TYPE_LOCAL_X2APIC
,
acpi_parse_x2apic
,
MAX_APICS
);
count
=
acpi_table_parse_madt
(
ACPI_MADT_TYPE_LOCAL_APIC
,
acpi_parse_lapic
,
MAX_APICS
);
if
(
!
count
)
{
}
if
(
!
count
&&
!
x2count
)
{
printk
(
KERN_ERR
PREFIX
"No LAPIC entries present
\n
"
);
/* TBD: Cleanup to allow fallback to MPS */
return
-
ENODEV
;
}
else
if
(
count
<
0
)
{
}
else
if
(
count
<
0
||
x2count
<
0
)
{
printk
(
KERN_ERR
PREFIX
"Error parsing LAPIC entry
\n
"
);
/* TBD: Cleanup to allow fallback to MPS */
return
count
;
}
x2count
=
acpi_table_parse_madt
(
ACPI_MADT_TYPE_LOCAL_X2APIC_NMI
,
acpi_parse_x2apic_nmi
,
0
);
count
=
acpi_table_parse_madt
(
ACPI_MADT_TYPE_LOCAL_APIC_NMI
,
acpi_parse_lapic_nmi
,
0
);
if
(
count
<
0
)
{
if
(
count
<
0
||
x2count
<
0
)
{
printk
(
KERN_ERR
PREFIX
"Error parsing LAPIC NMI entry
\n
"
);
/* TBD: Cleanup to allow fallback to MPS */
return
count
;
...
...
arch/x86/mm/srat_64.c
浏览文件 @
33526a53
...
...
@@ -115,6 +115,36 @@ void __init acpi_numa_slit_init(struct acpi_table_slit *slit)
reserve_early
(
phys
,
phys
+
length
,
"ACPI SLIT"
);
}
/* Callback for Proximity Domain -> x2APIC mapping */
void
__init
acpi_numa_x2apic_affinity_init
(
struct
acpi_srat_x2apic_cpu_affinity
*
pa
)
{
int
pxm
,
node
;
int
apic_id
;
if
(
srat_disabled
())
return
;
if
(
pa
->
header
.
length
<
sizeof
(
struct
acpi_srat_x2apic_cpu_affinity
))
{
bad_srat
();
return
;
}
if
((
pa
->
flags
&
ACPI_SRAT_CPU_ENABLED
)
==
0
)
return
;
pxm
=
pa
->
proximity_domain
;
node
=
setup_node
(
pxm
);
if
(
node
<
0
)
{
printk
(
KERN_ERR
"SRAT: Too many proximity domains %x
\n
"
,
pxm
);
bad_srat
();
return
;
}
apic_id
=
pa
->
apic_id
;
apicid_to_node
[
apic_id
]
=
node
;
acpi_numa
=
1
;
printk
(
KERN_INFO
"SRAT: PXM %u -> APIC %u -> Node %u
\n
"
,
pxm
,
apic_id
,
node
);
}
/* Callback for Proximity Domain -> LAPIC mapping */
void
__init
acpi_numa_processor_affinity_init
(
struct
acpi_srat_cpu_affinity
*
pa
)
...
...
drivers/acpi/numa.c
浏览文件 @
33526a53
...
...
@@ -131,6 +131,21 @@ acpi_table_print_srat_entry(struct acpi_subtable_header *header)
#endif
/* ACPI_DEBUG_OUTPUT */
break
;
case
ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY
:
#ifdef ACPI_DEBUG_OUTPUT
{
struct
acpi_srat_x2apic_cpu_affinity
*
p
=
(
struct
acpi_srat_x2apic_cpu_affinity
*
)
header
;
ACPI_DEBUG_PRINT
((
ACPI_DB_INFO
,
"SRAT Processor (x2apicid[0x%08x]) in"
" proximity domain %d %s
\n
"
,
p
->
apic_id
,
p
->
proximity_domain
,
(
p
->
flags
&
ACPI_SRAT_CPU_ENABLED
)
?
"enabled"
:
"disabled"
));
}
#endif
/* ACPI_DEBUG_OUTPUT */
break
;
default:
printk
(
KERN_WARNING
PREFIX
"Found unsupported SRAT entry (type = 0x%x)
\n
"
,
...
...
@@ -180,8 +195,35 @@ static int __init acpi_parse_slit(struct acpi_table_header *table)
return
0
;
}
void
__init
__attribute__
((
weak
))
acpi_numa_x2apic_affinity_init
(
struct
acpi_srat_x2apic_cpu_affinity
*
pa
)
{
printk
(
KERN_WARNING
PREFIX
"Found unsupported x2apic [0x%08x] SRAT entry
\n
"
,
pa
->
apic_id
);
return
;
}
static
int
__init
acpi_parse_x2apic_affinity
(
struct
acpi_subtable_header
*
header
,
const
unsigned
long
end
)
{
struct
acpi_srat_x2apic_cpu_affinity
*
processor_affinity
;
processor_affinity
=
(
struct
acpi_srat_x2apic_cpu_affinity
*
)
header
;
if
(
!
processor_affinity
)
return
-
EINVAL
;
acpi_table_print_srat_entry
(
header
);
/* let architecture-dependent part to do it */
acpi_numa_x2apic_affinity_init
(
processor_affinity
);
return
0
;
}
static
int
__init
acpi_parse_processor_affinity
(
struct
acpi_subtable_header
*
header
,
acpi_parse_processor_affinity
(
struct
acpi_subtable_header
*
header
,
const
unsigned
long
end
)
{
struct
acpi_srat_cpu_affinity
*
processor_affinity
;
...
...
@@ -241,6 +283,8 @@ int __init acpi_numa_init(void)
{
/* SRAT: Static Resource Affinity Table */
if
(
!
acpi_table_parse
(
ACPI_SIG_SRAT
,
acpi_parse_srat
))
{
acpi_table_parse_srat
(
ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY
,
acpi_parse_x2apic_affinity
,
NR_CPUS
);
acpi_table_parse_srat
(
ACPI_SRAT_TYPE_CPU_AFFINITY
,
acpi_parse_processor_affinity
,
NR_CPUS
);
acpi_table_parse_srat
(
ACPI_SRAT_TYPE_MEMORY_AFFINITY
,
...
...
drivers/acpi/processor_core.c
浏览文件 @
33526a53
...
...
@@ -427,6 +427,29 @@ static int map_lapic_id(struct acpi_subtable_header *entry,
return
0
;
}
static
int
map_x2apic_id
(
struct
acpi_subtable_header
*
entry
,
int
device_declaration
,
u32
acpi_id
,
int
*
apic_id
)
{
struct
acpi_madt_local_x2apic
*
apic
=
(
struct
acpi_madt_local_x2apic
*
)
entry
;
u32
tmp
=
apic
->
local_apic_id
;
/* Only check enabled APICs*/
if
(
!
(
apic
->
lapic_flags
&
ACPI_MADT_ENABLED
))
return
0
;
/* Device statement declaration type */
if
(
device_declaration
)
{
if
(
apic
->
uid
==
acpi_id
)
goto
found
;
}
return
0
;
found:
*
apic_id
=
tmp
;
return
1
;
}
static
int
map_lsapic_id
(
struct
acpi_subtable_header
*
entry
,
int
device_declaration
,
u32
acpi_id
,
int
*
apic_id
)
{
...
...
@@ -476,6 +499,9 @@ static int map_madt_entry(int type, u32 acpi_id)
if
(
header
->
type
==
ACPI_MADT_TYPE_LOCAL_APIC
)
{
if
(
map_lapic_id
(
header
,
acpi_id
,
&
apic_id
))
break
;
}
else
if
(
header
->
type
==
ACPI_MADT_TYPE_LOCAL_X2APIC
)
{
if
(
map_x2apic_id
(
header
,
type
,
acpi_id
,
&
apic_id
))
break
;
}
else
if
(
header
->
type
==
ACPI_MADT_TYPE_LOCAL_SAPIC
)
{
if
(
map_lsapic_id
(
header
,
type
,
acpi_id
,
&
apic_id
))
break
;
...
...
drivers/acpi/tables.c
浏览文件 @
33526a53
...
...
@@ -62,6 +62,18 @@ void acpi_table_print_madt_entry(struct acpi_subtable_header *header)
}
break
;
case
ACPI_MADT_TYPE_LOCAL_X2APIC
:
{
struct
acpi_madt_local_x2apic
*
p
=
(
struct
acpi_madt_local_x2apic
*
)
header
;
printk
(
KERN_INFO
PREFIX
"X2APIC (apic_id[0x%02x] uid[0x%02x] %s)
\n
"
,
p
->
local_apic_id
,
p
->
uid
,
(
p
->
lapic_flags
&
ACPI_MADT_ENABLED
)
?
"enabled"
:
"disabled"
);
}
break
;
case
ACPI_MADT_TYPE_IO_APIC
:
{
struct
acpi_madt_io_apic
*
p
=
...
...
@@ -116,6 +128,24 @@ void acpi_table_print_madt_entry(struct acpi_subtable_header *header)
}
break
;
case
ACPI_MADT_TYPE_LOCAL_X2APIC_NMI
:
{
u16
polarity
,
trigger
;
struct
acpi_madt_local_x2apic_nmi
*
p
=
(
struct
acpi_madt_local_x2apic_nmi
*
)
header
;
polarity
=
p
->
inti_flags
&
ACPI_MADT_POLARITY_MASK
;
trigger
=
(
p
->
inti_flags
&
ACPI_MADT_TRIGGER_MASK
)
>>
2
;
printk
(
KERN_INFO
PREFIX
"X2APIC_NMI (uid[0x%02x] %s %s lint[0x%x])
\n
"
,
p
->
uid
,
mps_inti_flags_polarity
[
polarity
],
mps_inti_flags_trigger
[
trigger
],
p
->
lint
);
}
break
;
case
ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE
:
{
struct
acpi_madt_local_apic_override
*
p
=
...
...
include/acpi/actbl1.h
浏览文件 @
33526a53
...
...
@@ -1016,9 +1016,9 @@ struct acpi_madt_interrupt_source {
struct
acpi_madt_local_x2apic
{
struct
acpi_subtable_header
header
;
u16
reserved
;
/* Reserved - must be zero */
u32
local_apic_id
;
/* Processor
X2_
APIC ID */
u32
local_apic_id
;
/* Processor
x2
APIC ID */
u32
lapic_flags
;
u32
uid
;
/*
Extended X2_APIC processor
ID */
u32
uid
;
/*
ACPI processor U
ID */
};
/* 10: Local X2APIC NMI (07/2008) */
...
...
@@ -1026,7 +1026,7 @@ struct acpi_madt_local_x2apic {
struct
acpi_madt_local_x2apic_nmi
{
struct
acpi_subtable_header
header
;
u16
inti_flags
;
u32
uid
;
/*
Processor X2_APIC
ID */
u32
uid
;
/*
ACPI processor U
ID */
u8
lint
;
/* LINTn to which NMI is connected */
u8
reserved
[
3
];
};
...
...
include/linux/acpi.h
浏览文件 @
33526a53
...
...
@@ -96,6 +96,7 @@ void acpi_table_print_madt_entry (struct acpi_subtable_header *madt);
/* the following four functions are architecture-dependent */
void
acpi_numa_slit_init
(
struct
acpi_table_slit
*
slit
);
void
acpi_numa_processor_affinity_init
(
struct
acpi_srat_cpu_affinity
*
pa
);
void
acpi_numa_x2apic_affinity_init
(
struct
acpi_srat_x2apic_cpu_affinity
*
pa
);
void
acpi_numa_memory_affinity_init
(
struct
acpi_srat_mem_affinity
*
ma
);
void
acpi_numa_arch_fixup
(
void
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录