Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
5539f59a
Commit
5539f59a
authored
Mar 21, 2007
by
Haavard Skinnemoen
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[AVR32] Move setup_bootmem() from mm/init.c to kernel/setup.c
Signed-off-by:
Haavard Skinnemoen
<
hskinnemoen@atmel.com
>
parent
e3e7d8d4
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
238 additions
and
239 deletions
+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
No files found.
arch/avr32/kernel/setup.c
View file @
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
View file @
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
View file @
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
);
...
...
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