#ifndef _LINUX_UNIFORM_BOOT_H
#define _LINUX_UNIFORM_BOOT_H

/* The uniform boot environment information is restricted to 
 * hardware information.  In particular for a simple enough machine
 * all of the environment information should be able to reside in
 * a rom and not need to be moved.  This information is the
 * information a trivial boot room can pass to linux to let it
 * run the hardware.  
 *
 * Also all of the information should be Position Independent Data.  
 * That is it should be safe to relocated any of the information
 * without it's meaning/correctnes changing. The exception is the
 * uniform_boot_header with it's two pointers arg & env.
 * 
 * The addresses in the arg & env pointers must be physical
 * addresses. A physical address is an address you put in the page
 * table. 
 *
 * The Command line is for user policy.  Things like the default
 * root device.
 * 
 */

struct uniform_boot_header
{
	unsigned long header_bytes;
	unsigned long header_checksum;
	unsigned long arg;
	unsigned long arg_bytes;
	unsigned long env;
	unsigned long env_bytes;
};

/* Every entry in the boot enviroment list will correspond to a boot
 * info record.  Encoding both type and size.  The type is obviously
 * so you can tell what it is.  The size allows you to skip that
 * boot enviroment record if you don't know what it easy.  This allows
 * forward compatibility with records not yet defined.
 */
struct ube_record {
	unsigned long tag;		/* tag ID */
	unsigned long size;		/* size of record (in bytes) */
	unsigned long data[0];		/* data */
};


#define UBE_TAG_MEMORY	0x0001

struct ube_memory_range {
	unsigned long long start;
	unsigned long long size;
	unsigned long type;
#define UBE_MEM_RAM      1
#define UBE_MEM_RESERVED 2
#define UBE_MEM_ACPI     3
#define UBE_MEM_NVS      4
	
};

struct ube_memory {
	unsigned long tag;
	unsigned long size;
	struct ube_memory_range map[0];
};

#endif /* _LINUX_UNIFORM_BOOT_H */
