Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
raspberrypi-kernel
提交
5539f59a
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看板
提交
5539f59a
编写于
3月 21, 2007
作者:
H
Haavard Skinnemoen
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[AVR32] Move setup_bootmem() from mm/init.c to kernel/setup.c
Signed-off-by:
N
Haavard Skinnemoen
<
hskinnemoen@atmel.com
>
上级
e3e7d8d4
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
238 addition
and
239 deletion
+238
-239
arch/avr32/kernel/setup.c
arch/avr32/kernel/setup.c
+238
-0
arch/avr32/mm/init.c
arch/avr32/mm/init.c
+0
-238
include/asm-avr32/setup.h
include/asm-avr32/setup.h
+0
-1
未找到文件。
arch/avr32/kernel/setup.c
浏览文件 @
5539f59a
...
...
@@ -8,12 +8,14 @@
#include <linux/clk.h>
#include <linux/init.h>
#include <linux/initrd.h>
#include <linux/sched.h>
#include <linux/console.h>
#include <linux/ioport.h>
#include <linux/bootmem.h>
#include <linux/fs.h>
#include <linux/module.h>
#include <linux/pfn.h>
#include <linux/root_dev.h>
#include <linux/cpu.h>
#include <linux/kernel.h>
...
...
@@ -260,6 +262,242 @@ static void __init parse_tags(struct tag *t)
t
->
hdr
.
tag
);
}
static
void
__init
print_memory_map
(
const
char
*
what
,
struct
tag_mem_range
*
mem
)
{
printk
(
"%s:
\n
"
,
what
);
for
(;
mem
;
mem
=
mem
->
next
)
{
printk
(
" %08lx - %08lx
\n
"
,
(
unsigned
long
)
mem
->
addr
,
(
unsigned
long
)(
mem
->
addr
+
mem
->
size
));
}
}
#define MAX_LOWMEM HIGHMEM_START
#define MAX_LOWMEM_PFN PFN_DOWN(MAX_LOWMEM)
/*
* Sort a list of memory regions in-place by ascending address.
*
* We're using bubble sort because we only have singly linked lists
* with few elements.
*/
static
void
__init
sort_mem_list
(
struct
tag_mem_range
**
pmem
)
{
int
done
;
struct
tag_mem_range
**
a
,
**
b
;
if
(
!*
pmem
)
return
;
do
{
done
=
1
;
a
=
pmem
,
b
=
&
(
*
pmem
)
->
next
;
while
(
*
b
)
{
if
((
*
a
)
->
addr
>
(
*
b
)
->
addr
)
{
struct
tag_mem_range
*
tmp
;
tmp
=
(
*
b
)
->
next
;
(
*
b
)
->
next
=
*
a
;
*
a
=
*
b
;
*
b
=
tmp
;
done
=
0
;
}
a
=
&
(
*
a
)
->
next
;
b
=
&
(
*
a
)
->
next
;
}
}
while
(
!
done
);
}
/*
* Find a free memory region large enough for storing the
* bootmem bitmap.
*/
static
unsigned
long
__init
find_bootmap_pfn
(
const
struct
tag_mem_range
*
mem
)
{
unsigned
long
bootmap_pages
,
bootmap_len
;
unsigned
long
node_pages
=
PFN_UP
(
mem
->
size
);
unsigned
long
bootmap_addr
=
mem
->
addr
;
struct
tag_mem_range
*
reserved
=
mem_reserved
;
struct
tag_mem_range
*
ramdisk
=
mem_ramdisk
;
unsigned
long
kern_start
=
__pa
(
_stext
);
unsigned
long
kern_end
=
__pa
(
_end
);
bootmap_pages
=
bootmem_bootmap_pages
(
node_pages
);
bootmap_len
=
bootmap_pages
<<
PAGE_SHIFT
;
/*
* Find a large enough region without reserved pages for
* storing the bootmem bitmap. We can take advantage of the
* fact that all lists have been sorted.
*
* We have to check explicitly reserved regions as well as the
* kernel image and any RAMDISK images...
*
* Oh, and we have to make sure we don't overwrite the taglist
* since we're going to use it until the bootmem allocator is
* fully up and running.
*/
while
(
1
)
{
if
((
bootmap_addr
<
kern_end
)
&&
((
bootmap_addr
+
bootmap_len
)
>
kern_start
))
bootmap_addr
=
kern_end
;
while
(
reserved
&&
(
bootmap_addr
>=
(
reserved
->
addr
+
reserved
->
size
)))
reserved
=
reserved
->
next
;
if
(
reserved
&&
((
bootmap_addr
+
bootmap_len
)
>=
reserved
->
addr
))
{
bootmap_addr
=
reserved
->
addr
+
reserved
->
size
;
continue
;
}
while
(
ramdisk
&&
(
bootmap_addr
>=
(
ramdisk
->
addr
+
ramdisk
->
size
)))
ramdisk
=
ramdisk
->
next
;
if
(
!
ramdisk
||
((
bootmap_addr
+
bootmap_len
)
<
ramdisk
->
addr
))
break
;
bootmap_addr
=
ramdisk
->
addr
+
ramdisk
->
size
;
}
if
((
PFN_UP
(
bootmap_addr
)
+
bootmap_len
)
>=
(
mem
->
addr
+
mem
->
size
))
return
~
0UL
;
return
PFN_UP
(
bootmap_addr
);
}
static
void
__init
setup_bootmem
(
void
)
{
unsigned
bootmap_size
;
unsigned
long
first_pfn
,
bootmap_pfn
,
pages
;
unsigned
long
max_pfn
,
max_low_pfn
;
unsigned
long
kern_start
=
__pa
(
_stext
);
unsigned
long
kern_end
=
__pa
(
_end
);
unsigned
node
=
0
;
struct
tag_mem_range
*
bank
,
*
res
;
sort_mem_list
(
&
mem_phys
);
sort_mem_list
(
&
mem_reserved
);
print_memory_map
(
"Physical memory"
,
mem_phys
);
print_memory_map
(
"Reserved memory"
,
mem_reserved
);
nodes_clear
(
node_online_map
);
if
(
mem_ramdisk
)
{
#ifdef CONFIG_BLK_DEV_INITRD
initrd_start
=
(
unsigned
long
)
__va
(
mem_ramdisk
->
addr
);
initrd_end
=
initrd_start
+
mem_ramdisk
->
size
;
print_memory_map
(
"RAMDISK images"
,
mem_ramdisk
);
if
(
mem_ramdisk
->
next
)
printk
(
KERN_WARNING
"Warning: Only the first RAMDISK image "
"will be used
\n
"
);
sort_mem_list
(
&
mem_ramdisk
);
#else
printk
(
KERN_WARNING
"RAM disk image present, but "
"no initrd support in kernel!
\n
"
);
#endif
}
if
(
mem_phys
->
next
)
printk
(
KERN_WARNING
"Only using first memory bank
\n
"
);
for
(
bank
=
mem_phys
;
bank
;
bank
=
NULL
)
{
first_pfn
=
PFN_UP
(
bank
->
addr
);
max_low_pfn
=
max_pfn
=
PFN_DOWN
(
bank
->
addr
+
bank
->
size
);
bootmap_pfn
=
find_bootmap_pfn
(
bank
);
if
(
bootmap_pfn
>
max_pfn
)
panic
(
"No space for bootmem bitmap!
\n
"
);
if
(
max_low_pfn
>
MAX_LOWMEM_PFN
)
{
max_low_pfn
=
MAX_LOWMEM_PFN
;
#ifndef CONFIG_HIGHMEM
/*
* Lowmem is memory that can be addressed
* directly through P1/P2
*/
printk
(
KERN_WARNING
"Node %u: Only %ld MiB of memory will be used.
\n
"
,
node
,
MAX_LOWMEM
>>
20
);
printk
(
KERN_WARNING
"Use a HIGHMEM enabled kernel.
\n
"
);
#else
#error HIGHMEM is not supported by AVR32 yet
#endif
}
/* Initialize the boot-time allocator with low memory only. */
bootmap_size
=
init_bootmem_node
(
NODE_DATA
(
node
),
bootmap_pfn
,
first_pfn
,
max_low_pfn
);
printk
(
"Node %u: bdata = %p, bdata->node_bootmem_map = %p
\n
"
,
node
,
NODE_DATA
(
node
)
->
bdata
,
NODE_DATA
(
node
)
->
bdata
->
node_bootmem_map
);
/*
* Register fully available RAM pages with the bootmem
* allocator.
*/
pages
=
max_low_pfn
-
first_pfn
;
free_bootmem_node
(
NODE_DATA
(
node
),
PFN_PHYS
(
first_pfn
),
PFN_PHYS
(
pages
));
/*
* Reserve space for the kernel image (if present in
* this node)...
*/
if
((
kern_start
>=
PFN_PHYS
(
first_pfn
))
&&
(
kern_start
<
PFN_PHYS
(
max_pfn
)))
{
printk
(
"Node %u: Kernel image %08lx - %08lx
\n
"
,
node
,
kern_start
,
kern_end
);
reserve_bootmem_node
(
NODE_DATA
(
node
),
kern_start
,
kern_end
-
kern_start
);
}
/* ...the bootmem bitmap... */
reserve_bootmem_node
(
NODE_DATA
(
node
),
PFN_PHYS
(
bootmap_pfn
),
bootmap_size
);
/* ...any RAMDISK images... */
for
(
res
=
mem_ramdisk
;
res
;
res
=
res
->
next
)
{
if
(
res
->
addr
>
PFN_PHYS
(
max_pfn
))
break
;
if
(
res
->
addr
>=
PFN_PHYS
(
first_pfn
))
{
printk
(
"Node %u: RAMDISK %08lx - %08lx
\n
"
,
node
,
(
unsigned
long
)
res
->
addr
,
(
unsigned
long
)(
res
->
addr
+
res
->
size
));
reserve_bootmem_node
(
NODE_DATA
(
node
),
res
->
addr
,
res
->
size
);
}
}
/* ...and any other reserved regions. */
for
(
res
=
mem_reserved
;
res
;
res
=
res
->
next
)
{
if
(
res
->
addr
>
PFN_PHYS
(
max_pfn
))
break
;
if
(
res
->
addr
>=
PFN_PHYS
(
first_pfn
))
{
printk
(
"Node %u: Reserved %08lx - %08lx
\n
"
,
node
,
(
unsigned
long
)
res
->
addr
,
(
unsigned
long
)(
res
->
addr
+
res
->
size
));
reserve_bootmem_node
(
NODE_DATA
(
node
),
res
->
addr
,
res
->
size
);
}
}
node_set_online
(
node
);
}
}
void
__init
setup_arch
(
char
**
cmdline_p
)
{
struct
clk
*
cpu_clk
;
...
...
arch/avr32/mm/init.c
浏览文件 @
5539f59a
...
...
@@ -10,11 +10,9 @@
#include <linux/mm.h>
#include <linux/swap.h>
#include <linux/init.h>
#include <linux/initrd.h>
#include <linux/mmzone.h>
#include <linux/bootmem.h>
#include <linux/pagemap.h>
#include <linux/pfn.h>
#include <linux/nodemask.h>
#include <asm/page.h>
...
...
@@ -78,242 +76,6 @@ void show_mem(void)
printk
(
"%d pages swap cached
\n
"
,
cached
);
}
static
void
__init
print_memory_map
(
const
char
*
what
,
struct
tag_mem_range
*
mem
)
{
printk
(
"%s:
\n
"
,
what
);
for
(;
mem
;
mem
=
mem
->
next
)
{
printk
(
" %08lx - %08lx
\n
"
,
(
unsigned
long
)
mem
->
addr
,
(
unsigned
long
)(
mem
->
addr
+
mem
->
size
));
}
}
#define MAX_LOWMEM HIGHMEM_START
#define MAX_LOWMEM_PFN PFN_DOWN(MAX_LOWMEM)
/*
* Sort a list of memory regions in-place by ascending address.
*
* We're using bubble sort because we only have singly linked lists
* with few elements.
*/
static
void
__init
sort_mem_list
(
struct
tag_mem_range
**
pmem
)
{
int
done
;
struct
tag_mem_range
**
a
,
**
b
;
if
(
!*
pmem
)
return
;
do
{
done
=
1
;
a
=
pmem
,
b
=
&
(
*
pmem
)
->
next
;
while
(
*
b
)
{
if
((
*
a
)
->
addr
>
(
*
b
)
->
addr
)
{
struct
tag_mem_range
*
tmp
;
tmp
=
(
*
b
)
->
next
;
(
*
b
)
->
next
=
*
a
;
*
a
=
*
b
;
*
b
=
tmp
;
done
=
0
;
}
a
=
&
(
*
a
)
->
next
;
b
=
&
(
*
a
)
->
next
;
}
}
while
(
!
done
);
}
/*
* Find a free memory region large enough for storing the
* bootmem bitmap.
*/
static
unsigned
long
__init
find_bootmap_pfn
(
const
struct
tag_mem_range
*
mem
)
{
unsigned
long
bootmap_pages
,
bootmap_len
;
unsigned
long
node_pages
=
PFN_UP
(
mem
->
size
);
unsigned
long
bootmap_addr
=
mem
->
addr
;
struct
tag_mem_range
*
reserved
=
mem_reserved
;
struct
tag_mem_range
*
ramdisk
=
mem_ramdisk
;
unsigned
long
kern_start
=
virt_to_phys
(
_stext
);
unsigned
long
kern_end
=
virt_to_phys
(
_end
);
bootmap_pages
=
bootmem_bootmap_pages
(
node_pages
);
bootmap_len
=
bootmap_pages
<<
PAGE_SHIFT
;
/*
* Find a large enough region without reserved pages for
* storing the bootmem bitmap. We can take advantage of the
* fact that all lists have been sorted.
*
* We have to check explicitly reserved regions as well as the
* kernel image and any RAMDISK images...
*
* Oh, and we have to make sure we don't overwrite the taglist
* since we're going to use it until the bootmem allocator is
* fully up and running.
*/
while
(
1
)
{
if
((
bootmap_addr
<
kern_end
)
&&
((
bootmap_addr
+
bootmap_len
)
>
kern_start
))
bootmap_addr
=
kern_end
;
while
(
reserved
&&
(
bootmap_addr
>=
(
reserved
->
addr
+
reserved
->
size
)))
reserved
=
reserved
->
next
;
if
(
reserved
&&
((
bootmap_addr
+
bootmap_len
)
>=
reserved
->
addr
))
{
bootmap_addr
=
reserved
->
addr
+
reserved
->
size
;
continue
;
}
while
(
ramdisk
&&
(
bootmap_addr
>=
(
ramdisk
->
addr
+
ramdisk
->
size
)))
ramdisk
=
ramdisk
->
next
;
if
(
!
ramdisk
||
((
bootmap_addr
+
bootmap_len
)
<
ramdisk
->
addr
))
break
;
bootmap_addr
=
ramdisk
->
addr
+
ramdisk
->
size
;
}
if
((
PFN_UP
(
bootmap_addr
)
+
bootmap_len
)
>=
(
mem
->
addr
+
mem
->
size
))
return
~
0UL
;
return
PFN_UP
(
bootmap_addr
);
}
void
__init
setup_bootmem
(
void
)
{
unsigned
bootmap_size
;
unsigned
long
first_pfn
,
bootmap_pfn
,
pages
;
unsigned
long
max_pfn
,
max_low_pfn
;
unsigned
long
kern_start
=
virt_to_phys
(
_stext
);
unsigned
long
kern_end
=
virt_to_phys
(
_end
);
unsigned
node
=
0
;
struct
tag_mem_range
*
bank
,
*
res
;
sort_mem_list
(
&
mem_phys
);
sort_mem_list
(
&
mem_reserved
);
print_memory_map
(
"Physical memory"
,
mem_phys
);
print_memory_map
(
"Reserved memory"
,
mem_reserved
);
nodes_clear
(
node_online_map
);
if
(
mem_ramdisk
)
{
#ifdef CONFIG_BLK_DEV_INITRD
initrd_start
=
(
unsigned
long
)
__va
(
mem_ramdisk
->
addr
);
initrd_end
=
initrd_start
+
mem_ramdisk
->
size
;
print_memory_map
(
"RAMDISK images"
,
mem_ramdisk
);
if
(
mem_ramdisk
->
next
)
printk
(
KERN_WARNING
"Warning: Only the first RAMDISK image "
"will be used
\n
"
);
sort_mem_list
(
&
mem_ramdisk
);
#else
printk
(
KERN_WARNING
"RAM disk image present, but "
"no initrd support in kernel!
\n
"
);
#endif
}
if
(
mem_phys
->
next
)
printk
(
KERN_WARNING
"Only using first memory bank
\n
"
);
for
(
bank
=
mem_phys
;
bank
;
bank
=
NULL
)
{
first_pfn
=
PFN_UP
(
bank
->
addr
);
max_low_pfn
=
max_pfn
=
PFN_DOWN
(
bank
->
addr
+
bank
->
size
);
bootmap_pfn
=
find_bootmap_pfn
(
bank
);
if
(
bootmap_pfn
>
max_pfn
)
panic
(
"No space for bootmem bitmap!
\n
"
);
if
(
max_low_pfn
>
MAX_LOWMEM_PFN
)
{
max_low_pfn
=
MAX_LOWMEM_PFN
;
#ifndef CONFIG_HIGHMEM
/*
* Lowmem is memory that can be addressed
* directly through P1/P2
*/
printk
(
KERN_WARNING
"Node %u: Only %ld MiB of memory will be used.
\n
"
,
node
,
MAX_LOWMEM
>>
20
);
printk
(
KERN_WARNING
"Use a HIGHMEM enabled kernel.
\n
"
);
#else
#error HIGHMEM is not supported by AVR32 yet
#endif
}
/* Initialize the boot-time allocator with low memory only. */
bootmap_size
=
init_bootmem_node
(
NODE_DATA
(
node
),
bootmap_pfn
,
first_pfn
,
max_low_pfn
);
printk
(
"Node %u: bdata = %p, bdata->node_bootmem_map = %p
\n
"
,
node
,
NODE_DATA
(
node
)
->
bdata
,
NODE_DATA
(
node
)
->
bdata
->
node_bootmem_map
);
/*
* Register fully available RAM pages with the bootmem
* allocator.
*/
pages
=
max_low_pfn
-
first_pfn
;
free_bootmem_node
(
NODE_DATA
(
node
),
PFN_PHYS
(
first_pfn
),
PFN_PHYS
(
pages
));
/*
* Reserve space for the kernel image (if present in
* this node)...
*/
if
((
kern_start
>=
PFN_PHYS
(
first_pfn
))
&&
(
kern_start
<
PFN_PHYS
(
max_pfn
)))
{
printk
(
"Node %u: Kernel image %08lx - %08lx
\n
"
,
node
,
kern_start
,
kern_end
);
reserve_bootmem_node
(
NODE_DATA
(
node
),
kern_start
,
kern_end
-
kern_start
);
}
/* ...the bootmem bitmap... */
reserve_bootmem_node
(
NODE_DATA
(
node
),
PFN_PHYS
(
bootmap_pfn
),
bootmap_size
);
/* ...any RAMDISK images... */
for
(
res
=
mem_ramdisk
;
res
;
res
=
res
->
next
)
{
if
(
res
->
addr
>
PFN_PHYS
(
max_pfn
))
break
;
if
(
res
->
addr
>=
PFN_PHYS
(
first_pfn
))
{
printk
(
"Node %u: RAMDISK %08lx - %08lx
\n
"
,
node
,
(
unsigned
long
)
res
->
addr
,
(
unsigned
long
)(
res
->
addr
+
res
->
size
));
reserve_bootmem_node
(
NODE_DATA
(
node
),
res
->
addr
,
res
->
size
);
}
}
/* ...and any other reserved regions. */
for
(
res
=
mem_reserved
;
res
;
res
=
res
->
next
)
{
if
(
res
->
addr
>
PFN_PHYS
(
max_pfn
))
break
;
if
(
res
->
addr
>=
PFN_PHYS
(
first_pfn
))
{
printk
(
"Node %u: Reserved %08lx - %08lx
\n
"
,
node
,
(
unsigned
long
)
res
->
addr
,
(
unsigned
long
)(
res
->
addr
+
res
->
size
));
reserve_bootmem_node
(
NODE_DATA
(
node
),
res
->
addr
,
res
->
size
);
}
}
node_set_online
(
node
);
}
}
/*
* paging_init() sets up the page tables
*
...
...
include/asm-avr32/setup.h
浏览文件 @
5539f59a
...
...
@@ -130,7 +130,6 @@ extern struct tag_mem_range *mem_ramdisk;
extern
struct
tag
*
bootloader_tags
;
extern
void
setup_bootmem
(
void
);
extern
void
setup_processor
(
void
);
extern
void
board_setup_fbmem
(
unsigned
long
fbmem_start
,
unsigned
long
fbmem_size
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录