xref: /rk3399_rockchip-uboot/arch/arm/include/asm/setup.h (revision 2ae0a53a439c007f3f2aeb3b8317abb843e87361)
1819833afSPeter Tyser /*
2819833afSPeter Tyser  *  linux/include/asm/setup.h
3819833afSPeter Tyser  *
4819833afSPeter Tyser  *  Copyright (C) 1997-1999 Russell King
5819833afSPeter Tyser  *
6819833afSPeter Tyser  * This program is free software; you can redistribute it and/or modify
7819833afSPeter Tyser  * it under the terms of the GNU General Public License version 2 as
8819833afSPeter Tyser  * published by the Free Software Foundation.
9819833afSPeter Tyser  *
10819833afSPeter Tyser  *  Structure passed to kernel to tell it about the
11819833afSPeter Tyser  *  hardware it's running on.  See linux/Documentation/arm/Setup
12819833afSPeter Tyser  *  for more info.
13819833afSPeter Tyser  *
14819833afSPeter Tyser  * NOTE:
15819833afSPeter Tyser  *  This file contains two ways to pass information from the boot
16819833afSPeter Tyser  *  loader to the kernel. The old struct param_struct is deprecated,
17819833afSPeter Tyser  *  but it will be kept in the kernel for 5 years from now
18819833afSPeter Tyser  *  (2001). This will allow boot loaders to convert to the new struct
19819833afSPeter Tyser  *  tag way.
20819833afSPeter Tyser  */
21819833afSPeter Tyser #ifndef __ASMARM_SETUP_H
22819833afSPeter Tyser #define __ASMARM_SETUP_H
23819833afSPeter Tyser 
24819833afSPeter Tyser /*
25819833afSPeter Tyser  * Usage:
26819833afSPeter Tyser  *  - do not go blindly adding fields, add them at the end
27819833afSPeter Tyser  *  - when adding fields, don't rely on the address until
28819833afSPeter Tyser  *    a patch from me has been released
29819833afSPeter Tyser  *  - unused fields should be zero (for future expansion)
30819833afSPeter Tyser  *  - this structure is relatively short-lived - only
31819833afSPeter Tyser  *    guaranteed to contain useful data in setup_arch()
32819833afSPeter Tyser  */
33*2ae0a53aSJason Zhu #define COMMAND_LINE_SIZE 2048
34819833afSPeter Tyser 
35819833afSPeter Tyser /* This is the old deprecated way to pass parameters to the kernel */
36819833afSPeter Tyser struct param_struct {
37819833afSPeter Tyser     union {
38819833afSPeter Tyser 	struct {
39819833afSPeter Tyser 	    unsigned long page_size;		/*  0 */
40819833afSPeter Tyser 	    unsigned long nr_pages;		/*  4 */
41819833afSPeter Tyser 	    unsigned long ramdisk_size;		/*  8 */
42819833afSPeter Tyser 	    unsigned long flags;		/* 12 */
43819833afSPeter Tyser #define FLAG_READONLY	1
44819833afSPeter Tyser #define FLAG_RDLOAD	4
45819833afSPeter Tyser #define FLAG_RDPROMPT	8
46819833afSPeter Tyser 	    unsigned long rootdev;		/* 16 */
47819833afSPeter Tyser 	    unsigned long video_num_cols;	/* 20 */
48819833afSPeter Tyser 	    unsigned long video_num_rows;	/* 24 */
49819833afSPeter Tyser 	    unsigned long video_x;		/* 28 */
50819833afSPeter Tyser 	    unsigned long video_y;		/* 32 */
51819833afSPeter Tyser 	    unsigned long memc_control_reg;	/* 36 */
52819833afSPeter Tyser 	    unsigned char sounddefault;		/* 40 */
53819833afSPeter Tyser 	    unsigned char adfsdrives;		/* 41 */
54819833afSPeter Tyser 	    unsigned char bytes_per_char_h;	/* 42 */
55819833afSPeter Tyser 	    unsigned char bytes_per_char_v;	/* 43 */
56819833afSPeter Tyser 	    unsigned long pages_in_bank[4];	/* 44 */
57819833afSPeter Tyser 	    unsigned long pages_in_vram;	/* 60 */
58819833afSPeter Tyser 	    unsigned long initrd_start;		/* 64 */
59819833afSPeter Tyser 	    unsigned long initrd_size;		/* 68 */
60819833afSPeter Tyser 	    unsigned long rd_start;		/* 72 */
61819833afSPeter Tyser 	    unsigned long system_rev;		/* 76 */
62819833afSPeter Tyser 	    unsigned long system_serial_low;	/* 80 */
63819833afSPeter Tyser 	    unsigned long system_serial_high;	/* 84 */
64819833afSPeter Tyser 	    unsigned long mem_fclk_21285;       /* 88 */
65819833afSPeter Tyser 	} s;
66819833afSPeter Tyser 	char unused[256];
67819833afSPeter Tyser     } u1;
68819833afSPeter Tyser     union {
69819833afSPeter Tyser 	char paths[8][128];
70819833afSPeter Tyser 	struct {
71819833afSPeter Tyser 	    unsigned long magic;
72819833afSPeter Tyser 	    char n[1024 - sizeof(unsigned long)];
73819833afSPeter Tyser 	} s;
74819833afSPeter Tyser     } u2;
75819833afSPeter Tyser     char commandline[COMMAND_LINE_SIZE];
76819833afSPeter Tyser };
77819833afSPeter Tyser 
78819833afSPeter Tyser 
79819833afSPeter Tyser /*
80819833afSPeter Tyser  * The new way of passing information: a list of tagged entries
81819833afSPeter Tyser  */
82819833afSPeter Tyser 
83819833afSPeter Tyser /* The list ends with an ATAG_NONE node. */
84819833afSPeter Tyser #define ATAG_NONE	0x00000000
85819833afSPeter Tyser 
86819833afSPeter Tyser struct tag_header {
87819833afSPeter Tyser 	u32 size;
88819833afSPeter Tyser 	u32 tag;
89819833afSPeter Tyser };
90819833afSPeter Tyser 
91819833afSPeter Tyser /* The list must start with an ATAG_CORE node */
92819833afSPeter Tyser #define ATAG_CORE	0x54410001
93819833afSPeter Tyser 
94819833afSPeter Tyser struct tag_core {
95819833afSPeter Tyser 	u32 flags;		/* bit 0 = read-only */
96819833afSPeter Tyser 	u32 pagesize;
97819833afSPeter Tyser 	u32 rootdev;
98819833afSPeter Tyser };
99819833afSPeter Tyser 
100819833afSPeter Tyser /* it is allowed to have multiple ATAG_MEM nodes */
101819833afSPeter Tyser #define ATAG_MEM	0x54410002
102819833afSPeter Tyser 
103819833afSPeter Tyser struct tag_mem32 {
104819833afSPeter Tyser 	u32	size;
105819833afSPeter Tyser 	u32	start;	/* physical start address */
106819833afSPeter Tyser };
107819833afSPeter Tyser 
108819833afSPeter Tyser /* VGA text type displays */
109819833afSPeter Tyser #define ATAG_VIDEOTEXT	0x54410003
110819833afSPeter Tyser 
111819833afSPeter Tyser struct tag_videotext {
112819833afSPeter Tyser 	u8		x;
113819833afSPeter Tyser 	u8		y;
114819833afSPeter Tyser 	u16		video_page;
115819833afSPeter Tyser 	u8		video_mode;
116819833afSPeter Tyser 	u8		video_cols;
117819833afSPeter Tyser 	u16		video_ega_bx;
118819833afSPeter Tyser 	u8		video_lines;
119819833afSPeter Tyser 	u8		video_isvga;
120819833afSPeter Tyser 	u16		video_points;
121819833afSPeter Tyser };
122819833afSPeter Tyser 
123819833afSPeter Tyser /* describes how the ramdisk will be used in kernel */
124819833afSPeter Tyser #define ATAG_RAMDISK	0x54410004
125819833afSPeter Tyser 
126819833afSPeter Tyser struct tag_ramdisk {
127819833afSPeter Tyser 	u32 flags;	/* bit 0 = load, bit 1 = prompt */
128819833afSPeter Tyser 	u32 size;	/* decompressed ramdisk size in _kilo_ bytes */
129819833afSPeter Tyser 	u32 start;	/* starting block of floppy-based RAM disk image */
130819833afSPeter Tyser };
131819833afSPeter Tyser 
132819833afSPeter Tyser /* describes where the compressed ramdisk image lives (virtual address) */
133819833afSPeter Tyser /*
134819833afSPeter Tyser  * this one accidentally used virtual addresses - as such,
135fc0b5948SRobert P. J. Day  * it's deprecated.
136819833afSPeter Tyser  */
137819833afSPeter Tyser #define ATAG_INITRD	0x54410005
138819833afSPeter Tyser 
139819833afSPeter Tyser /* describes where the compressed ramdisk image lives (physical address) */
140819833afSPeter Tyser #define ATAG_INITRD2	0x54420005
141819833afSPeter Tyser 
142819833afSPeter Tyser struct tag_initrd {
143819833afSPeter Tyser 	u32 start;	/* physical start address */
144819833afSPeter Tyser 	u32 size;	/* size of compressed ramdisk image in bytes */
145819833afSPeter Tyser };
146819833afSPeter Tyser 
147819833afSPeter Tyser /* board serial number. "64 bits should be enough for everybody" */
148819833afSPeter Tyser #define ATAG_SERIAL	0x54410006
149819833afSPeter Tyser 
150819833afSPeter Tyser struct tag_serialnr {
151819833afSPeter Tyser 	u32 low;
152819833afSPeter Tyser 	u32 high;
153819833afSPeter Tyser };
154819833afSPeter Tyser 
155819833afSPeter Tyser /* board revision */
156819833afSPeter Tyser #define ATAG_REVISION	0x54410007
157819833afSPeter Tyser 
158819833afSPeter Tyser struct tag_revision {
159819833afSPeter Tyser 	u32 rev;
160819833afSPeter Tyser };
161819833afSPeter Tyser 
162819833afSPeter Tyser /* initial values for vesafb-type framebuffers. see struct screen_info
163819833afSPeter Tyser  * in include/linux/tty.h
164819833afSPeter Tyser  */
165819833afSPeter Tyser #define ATAG_VIDEOLFB	0x54410008
166819833afSPeter Tyser 
167819833afSPeter Tyser struct tag_videolfb {
168819833afSPeter Tyser 	u16		lfb_width;
169819833afSPeter Tyser 	u16		lfb_height;
170819833afSPeter Tyser 	u16		lfb_depth;
171819833afSPeter Tyser 	u16		lfb_linelength;
172819833afSPeter Tyser 	u32		lfb_base;
173819833afSPeter Tyser 	u32		lfb_size;
174819833afSPeter Tyser 	u8		red_size;
175819833afSPeter Tyser 	u8		red_pos;
176819833afSPeter Tyser 	u8		green_size;
177819833afSPeter Tyser 	u8		green_pos;
178819833afSPeter Tyser 	u8		blue_size;
179819833afSPeter Tyser 	u8		blue_pos;
180819833afSPeter Tyser 	u8		rsvd_size;
181819833afSPeter Tyser 	u8		rsvd_pos;
182819833afSPeter Tyser };
183819833afSPeter Tyser 
184819833afSPeter Tyser /* command line: \0 terminated string */
185819833afSPeter Tyser #define ATAG_CMDLINE	0x54410009
186819833afSPeter Tyser 
187819833afSPeter Tyser struct tag_cmdline {
188819833afSPeter Tyser 	char	cmdline[1];	/* this is the minimum size */
189819833afSPeter Tyser };
190819833afSPeter Tyser 
191819833afSPeter Tyser /* acorn RiscPC specific information */
192819833afSPeter Tyser #define ATAG_ACORN	0x41000101
193819833afSPeter Tyser 
194819833afSPeter Tyser struct tag_acorn {
195819833afSPeter Tyser 	u32 memc_control_reg;
196819833afSPeter Tyser 	u32 vram_pages;
197819833afSPeter Tyser 	u8 sounddefault;
198819833afSPeter Tyser 	u8 adfsdrives;
199819833afSPeter Tyser };
200819833afSPeter Tyser 
201819833afSPeter Tyser /* footbridge memory clock, see arch/arm/mach-footbridge/arch.c */
202819833afSPeter Tyser #define ATAG_MEMCLK	0x41000402
203819833afSPeter Tyser 
204819833afSPeter Tyser struct tag_memclk {
205819833afSPeter Tyser 	u32 fmemclk;
206819833afSPeter Tyser };
207819833afSPeter Tyser 
208819833afSPeter Tyser struct tag {
209819833afSPeter Tyser 	struct tag_header hdr;
210819833afSPeter Tyser 	union {
211819833afSPeter Tyser 		struct tag_core		core;
212819833afSPeter Tyser 		struct tag_mem32	mem;
213819833afSPeter Tyser 		struct tag_videotext	videotext;
214819833afSPeter Tyser 		struct tag_ramdisk	ramdisk;
215819833afSPeter Tyser 		struct tag_initrd	initrd;
216819833afSPeter Tyser 		struct tag_serialnr	serialnr;
217819833afSPeter Tyser 		struct tag_revision	revision;
218819833afSPeter Tyser 		struct tag_videolfb	videolfb;
219819833afSPeter Tyser 		struct tag_cmdline	cmdline;
220819833afSPeter Tyser 
221819833afSPeter Tyser 		/*
222819833afSPeter Tyser 		 * Acorn specific
223819833afSPeter Tyser 		 */
224819833afSPeter Tyser 		struct tag_acorn	acorn;
225819833afSPeter Tyser 
226819833afSPeter Tyser 		/*
227819833afSPeter Tyser 		 * DC21285 specific
228819833afSPeter Tyser 		 */
229819833afSPeter Tyser 		struct tag_memclk	memclk;
230819833afSPeter Tyser 	} u;
231819833afSPeter Tyser };
232819833afSPeter Tyser 
233819833afSPeter Tyser struct tagtable {
234819833afSPeter Tyser 	u32 tag;
235819833afSPeter Tyser 	int (*parse)(const struct tag *);
236819833afSPeter Tyser };
237819833afSPeter Tyser 
238819833afSPeter Tyser #define __tag __attribute__((unused, __section__(".taglist")))
239819833afSPeter Tyser #define __tagtable(tag, fn) \
240819833afSPeter Tyser static struct tagtable __tagtable_##fn __tag = { tag, fn }
241819833afSPeter Tyser 
242819833afSPeter Tyser #define tag_member_present(tag,member)				\
243819833afSPeter Tyser 	((unsigned long)(&((struct tag *)0L)->member + 1)	\
244819833afSPeter Tyser 		<= (tag)->hdr.size * 4)
245819833afSPeter Tyser 
246819833afSPeter Tyser #define tag_next(t)	((struct tag *)((u32 *)(t) + (t)->hdr.size))
247819833afSPeter Tyser #define tag_size(type)	((sizeof(struct tag_header) + sizeof(struct type)) >> 2)
248819833afSPeter Tyser 
249819833afSPeter Tyser #define for_each_tag(t,base)		\
250819833afSPeter Tyser 	for (t = base; t->hdr.size; t = tag_next(t))
251819833afSPeter Tyser 
252819833afSPeter Tyser /*
253819833afSPeter Tyser  * Memory map description
254819833afSPeter Tyser  */
255819833afSPeter Tyser #define NR_BANKS 8
256819833afSPeter Tyser 
257819833afSPeter Tyser struct meminfo {
258819833afSPeter Tyser 	int nr_banks;
259819833afSPeter Tyser 	unsigned long end;
260819833afSPeter Tyser 	struct {
261819833afSPeter Tyser 		unsigned long start;
262819833afSPeter Tyser 		unsigned long size;
263819833afSPeter Tyser 		int           node;
264819833afSPeter Tyser 	} bank[NR_BANKS];
265819833afSPeter Tyser };
266819833afSPeter Tyser 
267819833afSPeter Tyser extern struct meminfo meminfo;
268819833afSPeter Tyser 
269819833afSPeter Tyser #endif
27089e6f138SPali Rohár 
27189e6f138SPali Rohár /*
27289e6f138SPali Rohár  * Board specified tags
27389e6f138SPali Rohár  */
27489e6f138SPali Rohár void setup_board_tags(struct tag **in_params);
275