1*819833afSPeter Tyser /* 2*819833afSPeter Tyser * linux/include/asm/setup.h 3*819833afSPeter Tyser * 4*819833afSPeter Tyser * Copyright (C) 1997-1999 Russell King 5*819833afSPeter Tyser * 6*819833afSPeter Tyser * This program is free software; you can redistribute it and/or modify 7*819833afSPeter Tyser * it under the terms of the GNU General Public License version 2 as 8*819833afSPeter Tyser * published by the Free Software Foundation. 9*819833afSPeter Tyser * 10*819833afSPeter Tyser * Structure passed to kernel to tell it about the 11*819833afSPeter Tyser * hardware it's running on. See linux/Documentation/arm/Setup 12*819833afSPeter Tyser * for more info. 13*819833afSPeter Tyser * 14*819833afSPeter Tyser * NOTE: 15*819833afSPeter Tyser * This file contains two ways to pass information from the boot 16*819833afSPeter Tyser * loader to the kernel. The old struct param_struct is deprecated, 17*819833afSPeter Tyser * but it will be kept in the kernel for 5 years from now 18*819833afSPeter Tyser * (2001). This will allow boot loaders to convert to the new struct 19*819833afSPeter Tyser * tag way. 20*819833afSPeter Tyser */ 21*819833afSPeter Tyser #ifndef __ASMARM_SETUP_H 22*819833afSPeter Tyser #define __ASMARM_SETUP_H 23*819833afSPeter Tyser 24*819833afSPeter Tyser /* 25*819833afSPeter Tyser * Usage: 26*819833afSPeter Tyser * - do not go blindly adding fields, add them at the end 27*819833afSPeter Tyser * - when adding fields, don't rely on the address until 28*819833afSPeter Tyser * a patch from me has been released 29*819833afSPeter Tyser * - unused fields should be zero (for future expansion) 30*819833afSPeter Tyser * - this structure is relatively short-lived - only 31*819833afSPeter Tyser * guaranteed to contain useful data in setup_arch() 32*819833afSPeter Tyser */ 33*819833afSPeter Tyser #define COMMAND_LINE_SIZE 1024 34*819833afSPeter Tyser 35*819833afSPeter Tyser /* This is the old deprecated way to pass parameters to the kernel */ 36*819833afSPeter Tyser struct param_struct { 37*819833afSPeter Tyser union { 38*819833afSPeter Tyser struct { 39*819833afSPeter Tyser unsigned long page_size; /* 0 */ 40*819833afSPeter Tyser unsigned long nr_pages; /* 4 */ 41*819833afSPeter Tyser unsigned long ramdisk_size; /* 8 */ 42*819833afSPeter Tyser unsigned long flags; /* 12 */ 43*819833afSPeter Tyser #define FLAG_READONLY 1 44*819833afSPeter Tyser #define FLAG_RDLOAD 4 45*819833afSPeter Tyser #define FLAG_RDPROMPT 8 46*819833afSPeter Tyser unsigned long rootdev; /* 16 */ 47*819833afSPeter Tyser unsigned long video_num_cols; /* 20 */ 48*819833afSPeter Tyser unsigned long video_num_rows; /* 24 */ 49*819833afSPeter Tyser unsigned long video_x; /* 28 */ 50*819833afSPeter Tyser unsigned long video_y; /* 32 */ 51*819833afSPeter Tyser unsigned long memc_control_reg; /* 36 */ 52*819833afSPeter Tyser unsigned char sounddefault; /* 40 */ 53*819833afSPeter Tyser unsigned char adfsdrives; /* 41 */ 54*819833afSPeter Tyser unsigned char bytes_per_char_h; /* 42 */ 55*819833afSPeter Tyser unsigned char bytes_per_char_v; /* 43 */ 56*819833afSPeter Tyser unsigned long pages_in_bank[4]; /* 44 */ 57*819833afSPeter Tyser unsigned long pages_in_vram; /* 60 */ 58*819833afSPeter Tyser unsigned long initrd_start; /* 64 */ 59*819833afSPeter Tyser unsigned long initrd_size; /* 68 */ 60*819833afSPeter Tyser unsigned long rd_start; /* 72 */ 61*819833afSPeter Tyser unsigned long system_rev; /* 76 */ 62*819833afSPeter Tyser unsigned long system_serial_low; /* 80 */ 63*819833afSPeter Tyser unsigned long system_serial_high; /* 84 */ 64*819833afSPeter Tyser unsigned long mem_fclk_21285; /* 88 */ 65*819833afSPeter Tyser } s; 66*819833afSPeter Tyser char unused[256]; 67*819833afSPeter Tyser } u1; 68*819833afSPeter Tyser union { 69*819833afSPeter Tyser char paths[8][128]; 70*819833afSPeter Tyser struct { 71*819833afSPeter Tyser unsigned long magic; 72*819833afSPeter Tyser char n[1024 - sizeof(unsigned long)]; 73*819833afSPeter Tyser } s; 74*819833afSPeter Tyser } u2; 75*819833afSPeter Tyser char commandline[COMMAND_LINE_SIZE]; 76*819833afSPeter Tyser }; 77*819833afSPeter Tyser 78*819833afSPeter Tyser 79*819833afSPeter Tyser /* 80*819833afSPeter Tyser * The new way of passing information: a list of tagged entries 81*819833afSPeter Tyser */ 82*819833afSPeter Tyser 83*819833afSPeter Tyser /* The list ends with an ATAG_NONE node. */ 84*819833afSPeter Tyser #define ATAG_NONE 0x00000000 85*819833afSPeter Tyser 86*819833afSPeter Tyser struct tag_header { 87*819833afSPeter Tyser u32 size; 88*819833afSPeter Tyser u32 tag; 89*819833afSPeter Tyser }; 90*819833afSPeter Tyser 91*819833afSPeter Tyser /* The list must start with an ATAG_CORE node */ 92*819833afSPeter Tyser #define ATAG_CORE 0x54410001 93*819833afSPeter Tyser 94*819833afSPeter Tyser struct tag_core { 95*819833afSPeter Tyser u32 flags; /* bit 0 = read-only */ 96*819833afSPeter Tyser u32 pagesize; 97*819833afSPeter Tyser u32 rootdev; 98*819833afSPeter Tyser }; 99*819833afSPeter Tyser 100*819833afSPeter Tyser /* it is allowed to have multiple ATAG_MEM nodes */ 101*819833afSPeter Tyser #define ATAG_MEM 0x54410002 102*819833afSPeter Tyser 103*819833afSPeter Tyser struct tag_mem32 { 104*819833afSPeter Tyser u32 size; 105*819833afSPeter Tyser u32 start; /* physical start address */ 106*819833afSPeter Tyser }; 107*819833afSPeter Tyser 108*819833afSPeter Tyser /* VGA text type displays */ 109*819833afSPeter Tyser #define ATAG_VIDEOTEXT 0x54410003 110*819833afSPeter Tyser 111*819833afSPeter Tyser struct tag_videotext { 112*819833afSPeter Tyser u8 x; 113*819833afSPeter Tyser u8 y; 114*819833afSPeter Tyser u16 video_page; 115*819833afSPeter Tyser u8 video_mode; 116*819833afSPeter Tyser u8 video_cols; 117*819833afSPeter Tyser u16 video_ega_bx; 118*819833afSPeter Tyser u8 video_lines; 119*819833afSPeter Tyser u8 video_isvga; 120*819833afSPeter Tyser u16 video_points; 121*819833afSPeter Tyser }; 122*819833afSPeter Tyser 123*819833afSPeter Tyser /* describes how the ramdisk will be used in kernel */ 124*819833afSPeter Tyser #define ATAG_RAMDISK 0x54410004 125*819833afSPeter Tyser 126*819833afSPeter Tyser struct tag_ramdisk { 127*819833afSPeter Tyser u32 flags; /* bit 0 = load, bit 1 = prompt */ 128*819833afSPeter Tyser u32 size; /* decompressed ramdisk size in _kilo_ bytes */ 129*819833afSPeter Tyser u32 start; /* starting block of floppy-based RAM disk image */ 130*819833afSPeter Tyser }; 131*819833afSPeter Tyser 132*819833afSPeter Tyser /* describes where the compressed ramdisk image lives (virtual address) */ 133*819833afSPeter Tyser /* 134*819833afSPeter Tyser * this one accidentally used virtual addresses - as such, 135*819833afSPeter Tyser * its depreciated. 136*819833afSPeter Tyser */ 137*819833afSPeter Tyser #define ATAG_INITRD 0x54410005 138*819833afSPeter Tyser 139*819833afSPeter Tyser /* describes where the compressed ramdisk image lives (physical address) */ 140*819833afSPeter Tyser #define ATAG_INITRD2 0x54420005 141*819833afSPeter Tyser 142*819833afSPeter Tyser struct tag_initrd { 143*819833afSPeter Tyser u32 start; /* physical start address */ 144*819833afSPeter Tyser u32 size; /* size of compressed ramdisk image in bytes */ 145*819833afSPeter Tyser }; 146*819833afSPeter Tyser 147*819833afSPeter Tyser /* board serial number. "64 bits should be enough for everybody" */ 148*819833afSPeter Tyser #define ATAG_SERIAL 0x54410006 149*819833afSPeter Tyser 150*819833afSPeter Tyser struct tag_serialnr { 151*819833afSPeter Tyser u32 low; 152*819833afSPeter Tyser u32 high; 153*819833afSPeter Tyser }; 154*819833afSPeter Tyser 155*819833afSPeter Tyser /* board revision */ 156*819833afSPeter Tyser #define ATAG_REVISION 0x54410007 157*819833afSPeter Tyser 158*819833afSPeter Tyser struct tag_revision { 159*819833afSPeter Tyser u32 rev; 160*819833afSPeter Tyser }; 161*819833afSPeter Tyser 162*819833afSPeter Tyser /* initial values for vesafb-type framebuffers. see struct screen_info 163*819833afSPeter Tyser * in include/linux/tty.h 164*819833afSPeter Tyser */ 165*819833afSPeter Tyser #define ATAG_VIDEOLFB 0x54410008 166*819833afSPeter Tyser 167*819833afSPeter Tyser struct tag_videolfb { 168*819833afSPeter Tyser u16 lfb_width; 169*819833afSPeter Tyser u16 lfb_height; 170*819833afSPeter Tyser u16 lfb_depth; 171*819833afSPeter Tyser u16 lfb_linelength; 172*819833afSPeter Tyser u32 lfb_base; 173*819833afSPeter Tyser u32 lfb_size; 174*819833afSPeter Tyser u8 red_size; 175*819833afSPeter Tyser u8 red_pos; 176*819833afSPeter Tyser u8 green_size; 177*819833afSPeter Tyser u8 green_pos; 178*819833afSPeter Tyser u8 blue_size; 179*819833afSPeter Tyser u8 blue_pos; 180*819833afSPeter Tyser u8 rsvd_size; 181*819833afSPeter Tyser u8 rsvd_pos; 182*819833afSPeter Tyser }; 183*819833afSPeter Tyser 184*819833afSPeter Tyser /* command line: \0 terminated string */ 185*819833afSPeter Tyser #define ATAG_CMDLINE 0x54410009 186*819833afSPeter Tyser 187*819833afSPeter Tyser struct tag_cmdline { 188*819833afSPeter Tyser char cmdline[1]; /* this is the minimum size */ 189*819833afSPeter Tyser }; 190*819833afSPeter Tyser 191*819833afSPeter Tyser /* acorn RiscPC specific information */ 192*819833afSPeter Tyser #define ATAG_ACORN 0x41000101 193*819833afSPeter Tyser 194*819833afSPeter Tyser struct tag_acorn { 195*819833afSPeter Tyser u32 memc_control_reg; 196*819833afSPeter Tyser u32 vram_pages; 197*819833afSPeter Tyser u8 sounddefault; 198*819833afSPeter Tyser u8 adfsdrives; 199*819833afSPeter Tyser }; 200*819833afSPeter Tyser 201*819833afSPeter Tyser /* footbridge memory clock, see arch/arm/mach-footbridge/arch.c */ 202*819833afSPeter Tyser #define ATAG_MEMCLK 0x41000402 203*819833afSPeter Tyser 204*819833afSPeter Tyser struct tag_memclk { 205*819833afSPeter Tyser u32 fmemclk; 206*819833afSPeter Tyser }; 207*819833afSPeter Tyser 208*819833afSPeter Tyser struct tag { 209*819833afSPeter Tyser struct tag_header hdr; 210*819833afSPeter Tyser union { 211*819833afSPeter Tyser struct tag_core core; 212*819833afSPeter Tyser struct tag_mem32 mem; 213*819833afSPeter Tyser struct tag_videotext videotext; 214*819833afSPeter Tyser struct tag_ramdisk ramdisk; 215*819833afSPeter Tyser struct tag_initrd initrd; 216*819833afSPeter Tyser struct tag_serialnr serialnr; 217*819833afSPeter Tyser struct tag_revision revision; 218*819833afSPeter Tyser struct tag_videolfb videolfb; 219*819833afSPeter Tyser struct tag_cmdline cmdline; 220*819833afSPeter Tyser 221*819833afSPeter Tyser /* 222*819833afSPeter Tyser * Acorn specific 223*819833afSPeter Tyser */ 224*819833afSPeter Tyser struct tag_acorn acorn; 225*819833afSPeter Tyser 226*819833afSPeter Tyser /* 227*819833afSPeter Tyser * DC21285 specific 228*819833afSPeter Tyser */ 229*819833afSPeter Tyser struct tag_memclk memclk; 230*819833afSPeter Tyser } u; 231*819833afSPeter Tyser }; 232*819833afSPeter Tyser 233*819833afSPeter Tyser struct tagtable { 234*819833afSPeter Tyser u32 tag; 235*819833afSPeter Tyser int (*parse)(const struct tag *); 236*819833afSPeter Tyser }; 237*819833afSPeter Tyser 238*819833afSPeter Tyser #define __tag __attribute__((unused, __section__(".taglist"))) 239*819833afSPeter Tyser #define __tagtable(tag, fn) \ 240*819833afSPeter Tyser static struct tagtable __tagtable_##fn __tag = { tag, fn } 241*819833afSPeter Tyser 242*819833afSPeter Tyser #define tag_member_present(tag,member) \ 243*819833afSPeter Tyser ((unsigned long)(&((struct tag *)0L)->member + 1) \ 244*819833afSPeter Tyser <= (tag)->hdr.size * 4) 245*819833afSPeter Tyser 246*819833afSPeter Tyser #define tag_next(t) ((struct tag *)((u32 *)(t) + (t)->hdr.size)) 247*819833afSPeter Tyser #define tag_size(type) ((sizeof(struct tag_header) + sizeof(struct type)) >> 2) 248*819833afSPeter Tyser 249*819833afSPeter Tyser #define for_each_tag(t,base) \ 250*819833afSPeter Tyser for (t = base; t->hdr.size; t = tag_next(t)) 251*819833afSPeter Tyser 252*819833afSPeter Tyser /* 253*819833afSPeter Tyser * Memory map description 254*819833afSPeter Tyser */ 255*819833afSPeter Tyser #define NR_BANKS 8 256*819833afSPeter Tyser 257*819833afSPeter Tyser struct meminfo { 258*819833afSPeter Tyser int nr_banks; 259*819833afSPeter Tyser unsigned long end; 260*819833afSPeter Tyser struct { 261*819833afSPeter Tyser unsigned long start; 262*819833afSPeter Tyser unsigned long size; 263*819833afSPeter Tyser int node; 264*819833afSPeter Tyser } bank[NR_BANKS]; 265*819833afSPeter Tyser }; 266*819833afSPeter Tyser 267*819833afSPeter Tyser extern struct meminfo meminfo; 268*819833afSPeter Tyser 269*819833afSPeter Tyser #endif 270