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