1 /*
2  *  linux/include/asm/setup.h
3  *
4  *  Copyright (C) 1997-1999 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  *  Structure passed to kernel to tell it about the
11  *  hardware it's running on.  See Documentation/arm/Setup
12  *  for more info.
13  */
14 #ifndef __ASMARM_SETUP_H
15 #define __ASMARM_SETUP_H
16 
17 #include <linux/types.h>
18 
19 #define COMMAND_LINE_SIZE 1024
20 
21 /* The list ends with an ATAG_NONE node. */
22 #define ATAG_NONE	0x00000000
23 
24 struct tag_header {
25 	__u32 size;
26 	__u32 tag;
27 };
28 
29 /* The list must start with an ATAG_CORE node */
30 #define ATAG_CORE	0x54410001
31 
32 struct tag_core {
33 	__u32 flags;		/* bit 0 = read-only */
34 	__u32 pagesize;
35 	__u32 rootdev;
36 };
37 
38 /* it is allowed to have multiple ATAG_MEM nodes */
39 #define ATAG_MEM	0x54410002
40 
41 struct tag_mem32 {
42 	__u32	size;
43 	__u32	start;	/* physical start address */
44 };
45 
46 /* VGA text type displays */
47 #define ATAG_VIDEOTEXT	0x54410003
48 
49 struct tag_videotext {
50 	__u8		x;
51 	__u8		y;
52 	__u16		video_page;
53 	__u8		video_mode;
54 	__u8		video_cols;
55 	__u16		video_ega_bx;
56 	__u8		video_lines;
57 	__u8		video_isvga;
58 	__u16		video_points;
59 };
60 
61 /* describes how the ramdisk will be used in kernel */
62 #define ATAG_RAMDISK	0x54410004
63 
64 struct tag_ramdisk {
65 	__u32 flags;	/* bit 0 = load, bit 1 = prompt */
66 	__u32 size;	/* decompressed ramdisk size in _kilo_ bytes */
67 	__u32 start;	/* starting block of floppy-based RAM disk image */
68 };
69 
70 /* describes where the compressed ramdisk image lives (virtual address) */
71 /*
72  * this one accidentally used virtual addresses - as such,
73  * it's deprecated.
74  */
75 #define ATAG_INITRD	0x54410005
76 
77 /* describes where the compressed ramdisk image lives (physical address) */
78 #define ATAG_INITRD2	0x54420005
79 
80 struct tag_initrd {
81 	__u32 start;	/* physical start address */
82 	__u32 size;	/* size of compressed ramdisk image in bytes */
83 };
84 
85 /* board serial number. "64 bits should be enough for everybody" */
86 #define ATAG_SERIAL	0x54410006
87 
88 struct tag_serialnr {
89 	__u32 low;
90 	__u32 high;
91 };
92 
93 /* board revision */
94 #define ATAG_REVISION	0x54410007
95 
96 struct tag_revision {
97 	__u32 rev;
98 };
99 
100 /* initial values for vesafb-type framebuffers. see struct screen_info
101  * in include/linux/tty.h
102  */
103 #define ATAG_VIDEOLFB	0x54410008
104 
105 struct tag_videolfb {
106 	__u16		lfb_width;
107 	__u16		lfb_height;
108 	__u16		lfb_depth;
109 	__u16		lfb_linelength;
110 	__u32		lfb_base;
111 	__u32		lfb_size;
112 	__u8		red_size;
113 	__u8		red_pos;
114 	__u8		green_size;
115 	__u8		green_pos;
116 	__u8		blue_size;
117 	__u8		blue_pos;
118 	__u8		rsvd_size;
119 	__u8		rsvd_pos;
120 };
121 
122 /* command line: \0 terminated string */
123 #define ATAG_CMDLINE	0x54410009
124 
125 struct tag_cmdline {
126 	char	cmdline[1];	/* this is the minimum size */
127 };
128 
129 /* acorn RiscPC specific information */
130 #define ATAG_ACORN	0x41000101
131 
132 struct tag_acorn {
133 	__u32 memc_control_reg;
134 	__u32 vram_pages;
135 	__u8 sounddefault;
136 	__u8 adfsdrives;
137 };
138 
139 /* footbridge memory clock, see arch/arm/mach-footbridge/arch.c */
140 #define ATAG_MEMCLK	0x41000402
141 
142 struct tag_memclk {
143 	__u32 fmemclk;
144 };
145 
146 struct tag {
147 	struct tag_header hdr;
148 	union {
149 		struct tag_core		core;
150 		struct tag_mem32	mem;
151 		struct tag_videotext	videotext;
152 		struct tag_ramdisk	ramdisk;
153 		struct tag_initrd	initrd;
154 		struct tag_serialnr	serialnr;
155 		struct tag_revision	revision;
156 		struct tag_videolfb	videolfb;
157 		struct tag_cmdline	cmdline;
158 
159 		/*
160 		 * Acorn specific
161 		 */
162 		struct tag_acorn	acorn;
163 
164 		/*
165 		 * DC21285 specific
166 		 */
167 		struct tag_memclk	memclk;
168 	} u;
169 };
170 
171 struct tagtable {
172 	__u32 tag;
173 	int (*parse)(const struct tag *);
174 };
175 
176 #define tag_member_present(tag,member)				\
177 	((unsigned long)(&((struct tag *)0L)->member + 1)	\
178 		<= (tag)->hdr.size * 4)
179 
180 #define tag_next(t)	((struct tag *)((__u32 *)(t) + (t)->hdr.size))
181 #define tag_size(type)	((sizeof(struct tag_header) + sizeof(struct type)) >> 2)
182 
183 #define for_each_tag(t,base)		\
184 	for (t = base; t->hdr.size; t = tag_next(t))
185 
186 #ifdef __KERNEL__
187 
188 #define __tag __used __attribute__((__section__(".taglist.init")))
189 #define __tagtable(tag, fn) \
190 static struct tagtable __tagtable_##fn __tag = { tag, fn }
191 
192 /*
193  * Memory map description
194  */
195 #define NR_BANKS 8
196 
197 struct membank {
198 	phys_addr_t start;
199 	unsigned long size;
200 	unsigned int highmem;
201 };
202 
203 struct meminfo {
204 	int nr_banks;
205 	struct membank bank[NR_BANKS];
206 };
207 
208 extern struct meminfo meminfo;
209 
210 #define for_each_bank(iter,mi)				\
211 	for (iter = 0; iter < (mi)->nr_banks; iter++)
212 
213 #define bank_pfn_start(bank)	__phys_to_pfn((bank)->start)
214 #define bank_pfn_end(bank)	__phys_to_pfn((bank)->start + (bank)->size)
215 #define bank_pfn_size(bank)	((bank)->size >> PAGE_SHIFT)
216 #define bank_phys_start(bank)	(bank)->start
217 #define bank_phys_end(bank)	((bank)->start + (bank)->size)
218 #define bank_phys_size(bank)	(bank)->size
219 
220 #endif  /*  __KERNEL__  */
221 
222 #endif
223