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