This patch adds minimal support for device tree on x86. The device tree blob is passed to the kernel via setup_data which requires at least boot protocol 2.09. Memory size, restricted memory regions, boot arguments are gathered the traditional way so things like cmd_line are just here to let the code compile. The current plan is use the device tree as an extension and to gather information which can not be enumerated and would have to be hardcoded otherwise. This includes things like - which devices are on this I2C/SPI bus? - how are the interrupts wired to IO APIC? - where could my hpet be? Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Dirk Brandewie <dirk.brandewie@gmail.com> Acked-by: Grant Likely <grant.likely@secretlab.ca> Cc: sodaville@linutronix.de Cc: devicetree-discuss@lists.ozlabs.org LKML-Reference: <1298405266-1624-3-git-send-email-bigeasy@linutronix.de> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
		
			
				
	
	
		
			134 lines
		
	
	
	
		
			3.2 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			134 lines
		
	
	
	
		
			3.2 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
#ifndef _ASM_X86_BOOTPARAM_H
 | 
						|
#define _ASM_X86_BOOTPARAM_H
 | 
						|
 | 
						|
#include <linux/types.h>
 | 
						|
#include <linux/screen_info.h>
 | 
						|
#include <linux/apm_bios.h>
 | 
						|
#include <linux/edd.h>
 | 
						|
#include <asm/e820.h>
 | 
						|
#include <asm/ist.h>
 | 
						|
#include <video/edid.h>
 | 
						|
 | 
						|
/* setup data types */
 | 
						|
#define SETUP_NONE			0
 | 
						|
#define SETUP_E820_EXT			1
 | 
						|
#define SETUP_DTB			2
 | 
						|
 | 
						|
/* extensible setup data list node */
 | 
						|
struct setup_data {
 | 
						|
	__u64 next;
 | 
						|
	__u32 type;
 | 
						|
	__u32 len;
 | 
						|
	__u8 data[0];
 | 
						|
};
 | 
						|
 | 
						|
struct setup_header {
 | 
						|
	__u8	setup_sects;
 | 
						|
	__u16	root_flags;
 | 
						|
	__u32	syssize;
 | 
						|
	__u16	ram_size;
 | 
						|
#define RAMDISK_IMAGE_START_MASK	0x07FF
 | 
						|
#define RAMDISK_PROMPT_FLAG		0x8000
 | 
						|
#define RAMDISK_LOAD_FLAG		0x4000
 | 
						|
	__u16	vid_mode;
 | 
						|
	__u16	root_dev;
 | 
						|
	__u16	boot_flag;
 | 
						|
	__u16	jump;
 | 
						|
	__u32	header;
 | 
						|
	__u16	version;
 | 
						|
	__u32	realmode_swtch;
 | 
						|
	__u16	start_sys;
 | 
						|
	__u16	kernel_version;
 | 
						|
	__u8	type_of_loader;
 | 
						|
	__u8	loadflags;
 | 
						|
#define LOADED_HIGH	(1<<0)
 | 
						|
#define QUIET_FLAG	(1<<5)
 | 
						|
#define KEEP_SEGMENTS	(1<<6)
 | 
						|
#define CAN_USE_HEAP	(1<<7)
 | 
						|
	__u16	setup_move_size;
 | 
						|
	__u32	code32_start;
 | 
						|
	__u32	ramdisk_image;
 | 
						|
	__u32	ramdisk_size;
 | 
						|
	__u32	bootsect_kludge;
 | 
						|
	__u16	heap_end_ptr;
 | 
						|
	__u8	ext_loader_ver;
 | 
						|
	__u8	ext_loader_type;
 | 
						|
	__u32	cmd_line_ptr;
 | 
						|
	__u32	initrd_addr_max;
 | 
						|
	__u32	kernel_alignment;
 | 
						|
	__u8	relocatable_kernel;
 | 
						|
	__u8	_pad2[3];
 | 
						|
	__u32	cmdline_size;
 | 
						|
	__u32	hardware_subarch;
 | 
						|
	__u64	hardware_subarch_data;
 | 
						|
	__u32	payload_offset;
 | 
						|
	__u32	payload_length;
 | 
						|
	__u64	setup_data;
 | 
						|
} __attribute__((packed));
 | 
						|
 | 
						|
struct sys_desc_table {
 | 
						|
	__u16 length;
 | 
						|
	__u8  table[14];
 | 
						|
};
 | 
						|
 | 
						|
/* Gleaned from OFW's set-parameters in cpu/x86/pc/linux.fth */
 | 
						|
struct olpc_ofw_header {
 | 
						|
	__u32 ofw_magic;	/* OFW signature */
 | 
						|
	__u32 ofw_version;
 | 
						|
	__u32 cif_handler;	/* callback into OFW */
 | 
						|
	__u32 irq_desc_table;
 | 
						|
} __attribute__((packed));
 | 
						|
 | 
						|
struct efi_info {
 | 
						|
	__u32 efi_loader_signature;
 | 
						|
	__u32 efi_systab;
 | 
						|
	__u32 efi_memdesc_size;
 | 
						|
	__u32 efi_memdesc_version;
 | 
						|
	__u32 efi_memmap;
 | 
						|
	__u32 efi_memmap_size;
 | 
						|
	__u32 efi_systab_hi;
 | 
						|
	__u32 efi_memmap_hi;
 | 
						|
};
 | 
						|
 | 
						|
/* The so-called "zeropage" */
 | 
						|
struct boot_params {
 | 
						|
	struct screen_info screen_info;			/* 0x000 */
 | 
						|
	struct apm_bios_info apm_bios_info;		/* 0x040 */
 | 
						|
	__u8  _pad2[4];					/* 0x054 */
 | 
						|
	__u64  tboot_addr;				/* 0x058 */
 | 
						|
	struct ist_info ist_info;			/* 0x060 */
 | 
						|
	__u8  _pad3[16];				/* 0x070 */
 | 
						|
	__u8  hd0_info[16];	/* obsolete! */		/* 0x080 */
 | 
						|
	__u8  hd1_info[16];	/* obsolete! */		/* 0x090 */
 | 
						|
	struct sys_desc_table sys_desc_table;		/* 0x0a0 */
 | 
						|
	struct olpc_ofw_header olpc_ofw_header;		/* 0x0b0 */
 | 
						|
	__u8  _pad4[128];				/* 0x0c0 */
 | 
						|
	struct edid_info edid_info;			/* 0x140 */
 | 
						|
	struct efi_info efi_info;			/* 0x1c0 */
 | 
						|
	__u32 alt_mem_k;				/* 0x1e0 */
 | 
						|
	__u32 scratch;		/* Scratch field! */	/* 0x1e4 */
 | 
						|
	__u8  e820_entries;				/* 0x1e8 */
 | 
						|
	__u8  eddbuf_entries;				/* 0x1e9 */
 | 
						|
	__u8  edd_mbr_sig_buf_entries;			/* 0x1ea */
 | 
						|
	__u8  _pad6[6];					/* 0x1eb */
 | 
						|
	struct setup_header hdr;    /* setup header */	/* 0x1f1 */
 | 
						|
	__u8  _pad7[0x290-0x1f1-sizeof(struct setup_header)];
 | 
						|
	__u32 edd_mbr_sig_buffer[EDD_MBR_SIG_MAX];	/* 0x290 */
 | 
						|
	struct e820entry e820_map[E820MAX];		/* 0x2d0 */
 | 
						|
	__u8  _pad8[48];				/* 0xcd0 */
 | 
						|
	struct edd_info eddbuf[EDDMAXNR];		/* 0xd00 */
 | 
						|
	__u8  _pad9[276];				/* 0xeec */
 | 
						|
} __attribute__((packed));
 | 
						|
 | 
						|
enum {
 | 
						|
	X86_SUBARCH_PC = 0,
 | 
						|
	X86_SUBARCH_LGUEST,
 | 
						|
	X86_SUBARCH_XEN,
 | 
						|
	X86_SUBARCH_MRST,
 | 
						|
	X86_SUBARCH_CE4100,
 | 
						|
	X86_NR_SUBARCHS,
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
 | 
						|
#endif /* _ASM_X86_BOOTPARAM_H */
 |