v2.4.8 -> v2.4.8.1
[opensuse:kernel.git] / arch / arm / kernel / compat.c
1 /*
2  *  linux/arch/arm/kernel/compat.c
3  *
4  *  Copyright (C) 2001 Russell King
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation.
9  *
10  * We keep the old params compatibility cruft in one place (here)
11  * so we don't end up with lots of 
12  */
13 #include <linux/config.h>
14 #include <linux/types.h>
15 #include <linux/kernel.h>
16 #include <linux/string.h>
17 #include <linux/init.h>
18
19 #include <asm/setup.h>
20 #include <asm/mach-types.h>
21 #include <asm/page.h>
22
23 #include <asm/mach/arch.h>
24
25 static struct tag * __init memtag(struct tag *tag, unsigned long start, unsigned long size)
26 {
27         tag = tag_next(tag);
28         tag->hdr.tag = ATAG_MEM;
29         tag->hdr.size = tag_size(tag_mem32);
30         tag->u.mem.size = size;
31         tag->u.mem.start = start;
32
33         return tag;
34 }
35
36 static void __init build_tag_list(struct param_struct *params, void *taglist, int mem_init)
37 {
38         struct tag *tag = taglist;
39
40         printk(KERN_DEBUG "Converting old-style param struct to taglist\n");
41
42         if (params->u1.s.page_size != PAGE_SIZE) {
43                 printk(KERN_WARNING "Warning: bad configuration page, "
44                        "trying to continue\n");
45                 return;
46         }
47
48         tag->hdr.tag  = ATAG_CORE;
49         tag->hdr.size = tag_size(tag_core);
50         tag->u.core.flags = params->u1.s.flags & FLAG_READONLY;
51         tag->u.core.pagesize = params->u1.s.page_size;
52         tag->u.core.rootdev = params->u1.s.rootdev;
53
54         tag = tag_next(tag);
55         tag->hdr.tag = ATAG_RAMDISK;
56         tag->hdr.size = tag_size(tag_ramdisk);
57         tag->u.ramdisk.flags = (params->u1.s.flags & FLAG_RDLOAD ? 1 : 0) |
58                                (params->u1.s.flags & FLAG_RDPROMPT ? 2 : 0);
59         tag->u.ramdisk.size  = params->u1.s.ramdisk_size;
60         tag->u.ramdisk.start = params->u1.s.rd_start;
61
62         tag = tag_next(tag);
63         tag->hdr.tag = ATAG_INITRD;
64         tag->hdr.size = tag_size(tag_initrd);
65         tag->u.initrd.start = params->u1.s.initrd_start;
66         tag->u.initrd.size  = params->u1.s.initrd_size;
67
68         tag = tag_next(tag);
69         tag->hdr.tag = ATAG_SERIAL;
70         tag->hdr.size = tag_size(tag_serialnr);
71         tag->u.serialnr.low = params->u1.s.system_serial_low;
72         tag->u.serialnr.high = params->u1.s.system_serial_high;
73
74         tag = tag_next(tag);
75         tag->hdr.tag = ATAG_REVISION;
76         tag->hdr.size = tag_size(tag_revision);
77         tag->u.revision.rev = params->u1.s.system_rev;
78
79         if (mem_init) {
80 #ifdef CONFIG_ARCH_ACORN
81                 if (machine_is_riscpc()) {
82                         int i;
83                         for (i = 0; i < 4; i++)
84                                 tag = memtag(tag, PHYS_OFFSET + (i << 26),
85                                          params->u1.s.pages_in_bank[i] * PAGE_SIZE);
86                 } else
87 #endif
88                 tag = memtag(tag, PHYS_OFFSET, params->u1.s.nr_pages * PAGE_SIZE);
89         }
90
91 #ifdef CONFIG_FOOTBRIDGE
92         tag = tag_next(tag);
93         tag->hdr.tag = ATAG_MEMCLK;
94         tag->hdr.size = tag_size(tag_memclk);
95         tag->u.memclk.fmemclk = params->u1.s.mem_fclk_21285;
96 #endif
97
98 #ifdef CONFIG_ARCH_ACORN
99         tag = tag_next(tag);
100         tag->hdr.tag = ATAG_ACORN;
101         tag->hdr.size = tag_size(tag_acorn);
102         tag->u.acorn.memc_control_reg = params->u1.s.memc_control_reg;
103         tag->u.acorn.vram_pages       = params->u1.s.pages_in_vram;
104         tag->u.acorn.sounddefault     = params->u1.s.sounddefault;
105         tag->u.acorn.adfsdrives       = params->u1.s.adfsdrives;
106 #endif
107
108         tag = tag_next(tag);
109         tag->hdr.tag = ATAG_CMDLINE;
110         tag->hdr.size = (strlen(params->commandline) + 3 +
111                          sizeof(struct tag_header)) >> 2;
112         strcpy(tag->u.cmdline.cmdline, params->commandline);
113
114         tag = tag_next(tag);
115         tag->hdr.tag = 0;
116         tag->hdr.size = 0;
117
118         memmove(params, taglist, ((int)tag) - ((int)taglist) +
119                                  sizeof(struct tag_header));
120 }
121
122 void __init convert_to_tag_list(struct param_struct *params, int mem_init)
123 {
124         build_tag_list(params, &params->u2, mem_init);
125 }