diff options
Diffstat (limited to 'roms/u-boot/arch/x86/include')
38 files changed, 3089 insertions, 0 deletions
diff --git a/roms/u-boot/arch/x86/include/asm/arch-coreboot/ipchecksum.h b/roms/u-boot/arch/x86/include/asm/arch-coreboot/ipchecksum.h new file mode 100644 index 00000000..1d73b4d9 --- /dev/null +++ b/roms/u-boot/arch/x86/include/asm/arch-coreboot/ipchecksum.h @@ -0,0 +1,37 @@ +/* + * This file is part of the libpayload project. + * + * It has originally been taken from the FreeBSD project. + * + * Copyright (c) 2001 Charles Mott <cm@linktel.net> + * Copyright (c) 2008 coresystems GmbH + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in the + *    documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef _COREBOOT_IPCHECKSUM_H +#define _COREBOOT_IPCHECKSUM_H + +unsigned short ipchksum(const void *vptr, unsigned long nbytes); + +#endif diff --git a/roms/u-boot/arch/x86/include/asm/arch-coreboot/sysinfo.h b/roms/u-boot/arch/x86/include/asm/arch-coreboot/sysinfo.h new file mode 100644 index 00000000..8e4a61de --- /dev/null +++ b/roms/u-boot/arch/x86/include/asm/arch-coreboot/sysinfo.h @@ -0,0 +1,62 @@ +/* + * This file is part of the libpayload project. + * + * Copyright (C) 2008 Advanced Micro Devices, Inc. + * + * SPDX-License-Identifier:	BSD-3-Clause + */ + +#ifndef _COREBOOT_SYSINFO_H +#define _COREBOOT_SYSINFO_H + +#include <common.h> +#include <compiler.h> +#include <libfdt.h> +#include <asm/arch/tables.h> + +/* Allow a maximum of 16 memory range definitions. */ +#define SYSINFO_MAX_MEM_RANGES 16 +/* Allow a maximum of 8 GPIOs */ +#define SYSINFO_MAX_GPIOS 8 + +struct sysinfo_t { +	int n_memranges; +	struct memrange { +		unsigned long long base; +		unsigned long long size; +		unsigned int type; +	} memrange[SYSINFO_MAX_MEM_RANGES]; + +	u32 cmos_range_start; +	u32 cmos_range_end; +	u32 cmos_checksum_location; +	u32 vbnv_start; +	u32 vbnv_size; + +	char *version; +	char *extra_version; +	char *build; +	char *compile_time; +	char *compile_by; +	char *compile_host; +	char *compile_domain; +	char *compiler; +	char *linker; +	char *assembler; + +	struct cb_framebuffer *framebuffer; + +	int num_gpios; +	struct cb_gpio gpios[SYSINFO_MAX_GPIOS]; + +	void	*vdat_addr; +	u32	vdat_size; +	void	*tstamp_table; +	void	*cbmem_cons; + +	struct cb_serial *serial; +}; + +extern struct sysinfo_t lib_sysinfo; + +#endif diff --git a/roms/u-boot/arch/x86/include/asm/arch-coreboot/tables.h b/roms/u-boot/arch/x86/include/asm/arch-coreboot/tables.h new file mode 100644 index 00000000..0d02fe05 --- /dev/null +++ b/roms/u-boot/arch/x86/include/asm/arch-coreboot/tables.h @@ -0,0 +1,294 @@ +/* + * This file is part of the libpayload project. + * + * Copyright (C) 2008 Advanced Micro Devices, Inc. + * + * SPDX-License-Identifier:	BSD-3-Clause + */ + +#ifndef _COREBOOT_TABLES_H +#define _COREBOOT_TABLES_H + +#include <compiler.h> + +struct cbuint64 { +	u32 lo; +	u32 hi; +}; + +struct cb_header { +	u8 signature[4]; +	u32 header_bytes; +	u32 header_checksum; +	u32 table_bytes; +	u32 table_checksum; +	u32 table_entries; +}; + +struct cb_record { +	u32 tag; +	u32 size; +}; + +#define CB_TAG_UNUSED     0x0000 +#define CB_TAG_MEMORY     0x0001 + +struct cb_memory_range { +	struct cbuint64 start; +	struct cbuint64 size; +	u32 type; +}; + +#define CB_MEM_RAM          1 +#define CB_MEM_RESERVED     2 +#define CB_MEM_ACPI         3 +#define CB_MEM_NVS          4 +#define CB_MEM_UNUSABLE     5 +#define CB_MEM_VENDOR_RSVD  6 +#define CB_MEM_TABLE       16 + +struct cb_memory { +	u32 tag; +	u32 size; +	struct cb_memory_range map[0]; +}; + +#define CB_TAG_HWRPB      0x0002 + +struct cb_hwrpb { +	u32 tag; +	u32 size; +	u64 hwrpb; +}; + +#define CB_TAG_MAINBOARD  0x0003 + +struct cb_mainboard { +	u32 tag; +	u32 size; +	u8 vendor_idx; +	u8 part_number_idx; +	u8 strings[0]; +}; + +#define CB_TAG_VERSION        0x0004 +#define CB_TAG_EXTRA_VERSION  0x0005 +#define CB_TAG_BUILD          0x0006 +#define CB_TAG_COMPILE_TIME   0x0007 +#define CB_TAG_COMPILE_BY     0x0008 +#define CB_TAG_COMPILE_HOST   0x0009 +#define CB_TAG_COMPILE_DOMAIN 0x000a +#define CB_TAG_COMPILER       0x000b +#define CB_TAG_LINKER         0x000c +#define CB_TAG_ASSEMBLER      0x000d + +struct cb_string { +	u32 tag; +	u32 size; +	u8 string[0]; +}; + +#define CB_TAG_SERIAL         0x000f + +struct cb_serial { +	u32 tag; +	u32 size; +#define CB_SERIAL_TYPE_IO_MAPPED     1 +#define CB_SERIAL_TYPE_MEMORY_MAPPED 2 +	u32 type; +	u32 baseaddr; +	u32 baud; +}; + +#define CB_TAG_CONSOLE       0x00010 + +struct cb_console { +	u32 tag; +	u32 size; +	u16 type; +}; + +#define CB_TAG_CONSOLE_SERIAL8250 0 +#define CB_TAG_CONSOLE_VGA        1 /* OBSOLETE */ +#define CB_TAG_CONSOLE_BTEXT      2 /* OBSOLETE */ +#define CB_TAG_CONSOLE_LOGBUF     3 +#define CB_TAG_CONSOLE_SROM       4 /* OBSOLETE */ +#define CB_TAG_CONSOLE_EHCI       5 + +#define CB_TAG_FORWARD       0x00011 + +struct cb_forward { +	u32 tag; +	u32 size; +	u64 forward; +}; + +#define CB_TAG_FRAMEBUFFER      0x0012 +struct cb_framebuffer { +	u32 tag; +	u32 size; + +	u64 physical_address; +	u32 x_resolution; +	u32 y_resolution; +	u32 bytes_per_line; +	u8 bits_per_pixel; +	u8 red_mask_pos; +	u8 red_mask_size; +	u8 green_mask_pos; +	u8 green_mask_size; +	u8 blue_mask_pos; +	u8 blue_mask_size; +	u8 reserved_mask_pos; +	u8 reserved_mask_size; +}; + +#define CB_TAG_GPIO 0x0013 +#define GPIO_MAX_NAME_LENGTH 16 +struct cb_gpio { +	u32 port; +	u32 polarity; +	u32 value; +	u8 name[GPIO_MAX_NAME_LENGTH]; +}; + +struct cb_gpios { +	u32 tag; +	u32 size; + +	u32 count; +	struct cb_gpio gpios[0]; +}; + +#define CB_TAG_FDT	0x0014 +struct cb_fdt { +	uint32_t tag; +	uint32_t size;	/* size of the entire entry */ +	/* the actual FDT gets placed here */ +}; + +#define CB_TAG_VDAT	0x0015 +struct cb_vdat { +	uint32_t tag; +	uint32_t size;	/* size of the entire entry */ +	void	 *vdat_addr; +	uint32_t vdat_size; +}; + +#define CB_TAG_TIMESTAMPS	0x0016 +#define CB_TAG_CBMEM_CONSOLE	0x0017 +#define CB_TAG_MRC_CACHE	0x0018 +struct cb_cbmem_tab { +	uint32_t tag; +	uint32_t size; +	void   *cbmem_tab; +}; + +#define CB_TAG_VBNV		0x0019 +struct cb_vbnv { +	uint32_t tag; +	uint32_t size; +	uint32_t vbnv_start; +	uint32_t vbnv_size; +}; + +#define CB_TAG_CMOS_OPTION_TABLE 0x00c8 +struct cb_cmos_option_table { +	u32 tag; +	u32 size; +	u32 header_length; +}; + +#define CB_TAG_OPTION         0x00c9 +#define CMOS_MAX_NAME_LENGTH    32 +struct cb_cmos_entries { +	u32 tag; +	u32 size; +	u32 bit; +	u32 length; +	u32 config; +	u32 config_id; +	u8 name[CMOS_MAX_NAME_LENGTH]; +}; + + +#define CB_TAG_OPTION_ENUM    0x00ca +#define CMOS_MAX_TEXT_LENGTH 32 +struct cb_cmos_enums { +	u32 tag; +	u32 size; +	u32 config_id; +	u32 value; +	u8 text[CMOS_MAX_TEXT_LENGTH]; +}; + +#define CB_TAG_OPTION_DEFAULTS 0x00cb +#define CMOS_IMAGE_BUFFER_SIZE 128 +struct cb_cmos_defaults { +	u32 tag; +	u32 size; +	u32 name_length; +	u8 name[CMOS_MAX_NAME_LENGTH]; +	u8 default_set[CMOS_IMAGE_BUFFER_SIZE]; +}; + +#define CB_TAG_OPTION_CHECKSUM 0x00cc +#define CHECKSUM_NONE	0 +#define CHECKSUM_PCBIOS	1 +struct	cb_cmos_checksum { +	u32 tag; +	u32 size; +	u32 range_start; +	u32 range_end; +	u32 location; +	u32 type; +}; + +/* Helpful macros */ + +#define MEM_RANGE_COUNT(_rec) \ +	(((_rec)->size - sizeof(*(_rec))) / sizeof((_rec)->map[0])) + +#define MEM_RANGE_PTR(_rec, _idx) \ +	(((u8 *) (_rec)) + sizeof(*(_rec)) \ +	+ (sizeof((_rec)->map[0]) * (_idx))) + +#define MB_VENDOR_STRING(_mb) \ +	(((unsigned char *) ((_mb)->strings)) + (_mb)->vendor_idx) + +#define MB_PART_STRING(_mb) \ +	(((unsigned char *) ((_mb)->strings)) + (_mb)->part_number_idx) + +#define UNPACK_CB64(_in) \ +	((((u64) _in.hi) << 32) | _in.lo) + +struct sysinfo_t; + +int get_coreboot_info(struct sysinfo_t *info); + +#define CBMEM_TOC_RESERVED      512 +#define MAX_CBMEM_ENTRIES       16 +#define CBMEM_MAGIC             0x434f5245 + +struct cbmem_entry { +	u32 magic; +	u32 id; +	u64 base; +	u64 size; +} __packed; + +#define CBMEM_ID_FREESPACE      0x46524545 +#define CBMEM_ID_GDT            0x4c474454 +#define CBMEM_ID_ACPI           0x41435049 +#define CBMEM_ID_CBTABLE        0x43425442 +#define CBMEM_ID_PIRQ           0x49525154 +#define CBMEM_ID_MPTABLE        0x534d5054 +#define CBMEM_ID_RESUME         0x5245534d +#define CBMEM_ID_RESUME_SCRATCH 0x52455343 +#define CBMEM_ID_SMBIOS         0x534d4254 +#define CBMEM_ID_TIMESTAMP      0x54494d45 +#define CBMEM_ID_MRCDATA        0x4d524344 +#define CBMEM_ID_CONSOLE        0x434f4e53 +#define CBMEM_ID_NONE           0x00000000 + +#endif diff --git a/roms/u-boot/arch/x86/include/asm/arch-coreboot/timestamp.h b/roms/u-boot/arch/x86/include/asm/arch-coreboot/timestamp.h new file mode 100644 index 00000000..fcfc1d54 --- /dev/null +++ b/roms/u-boot/arch/x86/include/asm/arch-coreboot/timestamp.h @@ -0,0 +1,59 @@ +/* + * This file is part of the coreboot project. + * + * Copyright (C) 2011 The ChromiumOS Authors.  All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA, 02110-1301 USA + */ + +#ifndef __COREBOOT_TIMESTAMP_H__ +#define __COREBOOT_TIMESTAMP_H__ + +enum timestamp_id { +	/* coreboot specific timestamp IDs */ +	TS_START_ROMSTAGE = 1, +	TS_BEFORE_INITRAM = 2, +	TS_AFTER_INITRAM = 3, +	TS_END_ROMSTAGE = 4, +	TS_START_COPYRAM = 8, +	TS_END_COPYRAM = 9, +	TS_START_RAMSTAGE = 10, +	TS_DEVICE_ENUMERATE = 30, +	TS_DEVICE_CONFIGURE = 40, +	TS_DEVICE_ENABLE = 50, +	TS_DEVICE_INITIALIZE = 60, +	TS_DEVICE_DONE = 70, +	TS_CBMEM_POST = 75, +	TS_WRITE_TABLES = 80, +	TS_LOAD_PAYLOAD = 90, +	TS_ACPI_WAKE_JUMP = 98, +	TS_SELFBOOT_JUMP = 99, + +	/* U-Boot entry IDs start at 1000 */ +	TS_U_BOOT_INITTED = 1000, /* This is where u-boot starts */ +	TS_U_BOOT_START_KERNEL = 1100, /* Right before jumping to kernel. */ +}; + +void timestamp_init(void); +void timestamp_add(enum timestamp_id id, uint64_t ts_time); +void timestamp_add_now(enum timestamp_id id); + +/** + * timestamp_add_to_bootstage - Add important coreboot timestamps to bootstage + * + * @return 0 if ok, -1 if no timestamps were found + */ +int timestamp_add_to_bootstage(void); + +#endif diff --git a/roms/u-boot/arch/x86/include/asm/bitops.h b/roms/u-boot/arch/x86/include/asm/bitops.h new file mode 100644 index 00000000..5a7e4cba --- /dev/null +++ b/roms/u-boot/arch/x86/include/asm/bitops.h @@ -0,0 +1,389 @@ +#ifndef _I386_BITOPS_H +#define _I386_BITOPS_H + +/* + * Copyright 1992, Linus Torvalds. + */ + + +/* + * These have to be done with inline assembly: that way the bit-setting + * is guaranteed to be atomic. All bit operations return 0 if the bit + * was cleared before the operation and != 0 if it was not. + * + * bit 0 is the LSB of addr; bit 32 is the LSB of (addr+1). + */ + +#ifdef CONFIG_SMP +#define LOCK_PREFIX "lock ; " +#else +#define LOCK_PREFIX "" +#endif + +#define ADDR (*(volatile long *) addr) + +/** + * set_bit - Atomically set a bit in memory + * @nr: the bit to set + * @addr: the address to start counting from + * + * This function is atomic and may not be reordered.  See __set_bit() + * if you do not require the atomic guarantees. + * Note that @nr may be almost arbitrarily large; this function is not + * restricted to acting on a single-word quantity. + */ +static __inline__ void set_bit(int nr, volatile void * addr) +{ +	__asm__ __volatile__( LOCK_PREFIX +		"btsl %1,%0" +		:"=m" (ADDR) +		:"Ir" (nr)); +} + +/** + * __set_bit - Set a bit in memory + * @nr: the bit to set + * @addr: the address to start counting from + * + * Unlike set_bit(), this function is non-atomic and may be reordered. + * If it's called on the same region of memory simultaneously, the effect + * may be that only one operation succeeds. + */ +static __inline__ void __set_bit(int nr, volatile void * addr) +{ +	__asm__( +		"btsl %1,%0" +		:"=m" (ADDR) +		:"Ir" (nr)); +} + +/** + * clear_bit - Clears a bit in memory + * @nr: Bit to clear + * @addr: Address to start counting from + * + * clear_bit() is atomic and may not be reordered.  However, it does + * not contain a memory barrier, so if it is used for locking purposes, + * you should call smp_mb__before_clear_bit() and/or smp_mb__after_clear_bit() + * in order to ensure changes are visible on other processors. + */ +static __inline__ void clear_bit(int nr, volatile void * addr) +{ +	__asm__ __volatile__( LOCK_PREFIX +		"btrl %1,%0" +		:"=m" (ADDR) +		:"Ir" (nr)); +} +#define smp_mb__before_clear_bit()	barrier() +#define smp_mb__after_clear_bit()	barrier() + +/** + * __change_bit - Toggle a bit in memory + * @nr: the bit to set + * @addr: the address to start counting from + * + * Unlike change_bit(), this function is non-atomic and may be reordered. + * If it's called on the same region of memory simultaneously, the effect + * may be that only one operation succeeds. + */ +static __inline__ void __change_bit(int nr, volatile void * addr) +{ +	__asm__ __volatile__( +		"btcl %1,%0" +		:"=m" (ADDR) +		:"Ir" (nr)); +} + +/** + * change_bit - Toggle a bit in memory + * @nr: Bit to clear + * @addr: Address to start counting from + * + * change_bit() is atomic and may not be reordered. + * Note that @nr may be almost arbitrarily large; this function is not + * restricted to acting on a single-word quantity. + */ +static __inline__ void change_bit(int nr, volatile void * addr) +{ +	__asm__ __volatile__( LOCK_PREFIX +		"btcl %1,%0" +		:"=m" (ADDR) +		:"Ir" (nr)); +} + +/** + * test_and_set_bit - Set a bit and return its old value + * @nr: Bit to set + * @addr: Address to count from + * + * This operation is atomic and cannot be reordered. + * It also implies a memory barrier. + */ +static __inline__ int test_and_set_bit(int nr, volatile void * addr) +{ +	int oldbit; + +	__asm__ __volatile__( LOCK_PREFIX +		"btsl %2,%1\n\tsbbl %0,%0" +		:"=r" (oldbit),"=m" (ADDR) +		:"Ir" (nr) : "memory"); +	return oldbit; +} + +/** + * __test_and_set_bit - Set a bit and return its old value + * @nr: Bit to set + * @addr: Address to count from + * + * This operation is non-atomic and can be reordered. + * If two examples of this operation race, one can appear to succeed + * but actually fail.  You must protect multiple accesses with a lock. + */ +static __inline__ int __test_and_set_bit(int nr, volatile void * addr) +{ +	int oldbit; + +	__asm__( +		"btsl %2,%1\n\tsbbl %0,%0" +		:"=r" (oldbit),"=m" (ADDR) +		:"Ir" (nr)); +	return oldbit; +} + +/** + * test_and_clear_bit - Clear a bit and return its old value + * @nr: Bit to set + * @addr: Address to count from + * + * This operation is atomic and cannot be reordered. + * It also implies a memory barrier. + */ +static __inline__ int test_and_clear_bit(int nr, volatile void * addr) +{ +	int oldbit; + +	__asm__ __volatile__( LOCK_PREFIX +		"btrl %2,%1\n\tsbbl %0,%0" +		:"=r" (oldbit),"=m" (ADDR) +		:"Ir" (nr) : "memory"); +	return oldbit; +} + +/** + * __test_and_clear_bit - Clear a bit and return its old value + * @nr: Bit to set + * @addr: Address to count from + * + * This operation is non-atomic and can be reordered. + * If two examples of this operation race, one can appear to succeed + * but actually fail.  You must protect multiple accesses with a lock. + */ +static __inline__ int __test_and_clear_bit(int nr, volatile void * addr) +{ +	int oldbit; + +	__asm__( +		"btrl %2,%1\n\tsbbl %0,%0" +		:"=r" (oldbit),"=m" (ADDR) +		:"Ir" (nr)); +	return oldbit; +} + +/* WARNING: non atomic and it can be reordered! */ +static __inline__ int __test_and_change_bit(int nr, volatile void * addr) +{ +	int oldbit; + +	__asm__ __volatile__( +		"btcl %2,%1\n\tsbbl %0,%0" +		:"=r" (oldbit),"=m" (ADDR) +		:"Ir" (nr) : "memory"); +	return oldbit; +} + +/** + * test_and_change_bit - Change a bit and return its new value + * @nr: Bit to set + * @addr: Address to count from + * + * This operation is atomic and cannot be reordered. + * It also implies a memory barrier. + */ +static __inline__ int test_and_change_bit(int nr, volatile void * addr) +{ +	int oldbit; + +	__asm__ __volatile__( LOCK_PREFIX +		"btcl %2,%1\n\tsbbl %0,%0" +		:"=r" (oldbit),"=m" (ADDR) +		:"Ir" (nr) : "memory"); +	return oldbit; +} + +#if 0 /* Fool kernel-doc since it doesn't do macros yet */ +/** + * test_bit - Determine whether a bit is set + * @nr: bit number to test + * @addr: Address to start counting from + */ +static int test_bit(int nr, const volatile void * addr); +#endif + +static __inline__ int constant_test_bit(int nr, const volatile void * addr) +{ +	return ((1UL << (nr & 31)) & (((const volatile unsigned int *) addr)[nr >> 5])) != 0; +} + +static __inline__ int variable_test_bit(int nr, volatile void * addr) +{ +	int oldbit; + +	__asm__ __volatile__( +		"btl %2,%1\n\tsbbl %0,%0" +		:"=r" (oldbit) +		:"m" (ADDR),"Ir" (nr)); +	return oldbit; +} + +#define test_bit(nr,addr) \ +(__builtin_constant_p(nr) ? \ + constant_test_bit((nr),(addr)) : \ + variable_test_bit((nr),(addr))) + +/** + * find_first_zero_bit - find the first zero bit in a memory region + * @addr: The address to start the search at + * @size: The maximum size to search + * + * Returns the bit-number of the first zero bit, not the number of the byte + * containing a bit. + */ +static __inline__ int find_first_zero_bit(void * addr, unsigned size) +{ +	int d0, d1, d2; +	int res; + +	if (!size) +		return 0; +	/* This looks at memory. Mark it volatile to tell gcc not to move it around */ +	__asm__ __volatile__( +		"movl $-1,%%eax\n\t" +		"xorl %%edx,%%edx\n\t" +		"repe; scasl\n\t" +		"je 1f\n\t" +		"xorl -4(%%edi),%%eax\n\t" +		"subl $4,%%edi\n\t" +		"bsfl %%eax,%%edx\n" +		"1:\tsubl %%ebx,%%edi\n\t" +		"shll $3,%%edi\n\t" +		"addl %%edi,%%edx" +		:"=d" (res), "=&c" (d0), "=&D" (d1), "=&a" (d2) +		:"1" ((size + 31) >> 5), "2" (addr), "b" (addr)); +	return res; +} + +/** + * find_next_zero_bit - find the first zero bit in a memory region + * @addr: The address to base the search on + * @offset: The bitnumber to start searching at + * @size: The maximum size to search + */ +static __inline__ int find_next_zero_bit (void * addr, int size, int offset) +{ +	unsigned long * p = ((unsigned long *) addr) + (offset >> 5); +	int set = 0, bit = offset & 31, res; + +	if (bit) { +		/* +		 * Look for zero in first byte +		 */ +		__asm__("bsfl %1,%0\n\t" +			"jne 1f\n\t" +			"movl $32, %0\n" +			"1:" +			: "=r" (set) +			: "r" (~(*p >> bit))); +		if (set < (32 - bit)) +			return set + offset; +		set = 32 - bit; +		p++; +	} +	/* +	 * No zero yet, search remaining full bytes for a zero +	 */ +	res = find_first_zero_bit (p, size - 32 * (p - (unsigned long *) addr)); +	return (offset + set + res); +} + +/** + * ffz - find first zero in word. + * @word: The word to search + * + * Undefined if no zero exists, so code should check against ~0UL first. + */ +static __inline__ unsigned long ffz(unsigned long word) +{ +	__asm__("bsfl %1,%0" +		:"=r" (word) +		:"r" (~word)); +	return word; +} + +#ifdef __KERNEL__ + +/** + * ffs - find first bit set + * @x: the word to search + * + * This is defined the same way as + * the libc and compiler builtin ffs routines, therefore + * differs in spirit from the above ffz (man ffs). + */ +static __inline__ int ffs(int x) +{ +	int r; + +	__asm__("bsfl %1,%0\n\t" +		"jnz 1f\n\t" +		"movl $-1,%0\n" +		"1:" : "=r" (r) : "g" (x)); +	return r+1; +} +#define PLATFORM_FFS + +static inline int __ilog2(unsigned int x) +{ +	return generic_fls(x) - 1; +} + +/** + * hweightN - returns the hamming weight of a N-bit word + * @x: the word to weigh + * + * The Hamming Weight of a number is the total number of bits set in it. + */ + +#define hweight32(x) generic_hweight32(x) +#define hweight16(x) generic_hweight16(x) +#define hweight8(x) generic_hweight8(x) + +#endif /* __KERNEL__ */ + +#ifdef __KERNEL__ + +#define ext2_set_bit                 __test_and_set_bit +#define ext2_clear_bit               __test_and_clear_bit +#define ext2_test_bit                test_bit +#define ext2_find_first_zero_bit     find_first_zero_bit +#define ext2_find_next_zero_bit      find_next_zero_bit + +/* Bitmap functions for the minix filesystem.  */ +#define minix_test_and_set_bit(nr,addr) __test_and_set_bit(nr,addr) +#define minix_set_bit(nr,addr) __set_bit(nr,addr) +#define minix_test_and_clear_bit(nr,addr) __test_and_clear_bit(nr,addr) +#define minix_test_bit(nr,addr) test_bit(nr,addr) +#define minix_find_first_zero_bit(addr,size) find_first_zero_bit(addr,size) + +#endif /* __KERNEL__ */ + +#endif /* _I386_BITOPS_H */ diff --git a/roms/u-boot/arch/x86/include/asm/bootparam.h b/roms/u-boot/arch/x86/include/asm/bootparam.h new file mode 100644 index 00000000..14009511 --- /dev/null +++ b/roms/u-boot/arch/x86/include/asm/bootparam.h @@ -0,0 +1,120 @@ +#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 <asm/video/edid.h> + +/* setup data types */ +#define SETUP_NONE			0 +#define SETUP_E820_EXT			1 + +/* 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]; +}; + +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 */ +	__u8  _pad4[144];				/* 0x0b0 */ +	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_NR_SUBARCHS, +}; +#endif /* _ASM_X86_BOOTPARAM_H */ diff --git a/roms/u-boot/arch/x86/include/asm/byteorder.h b/roms/u-boot/arch/x86/include/asm/byteorder.h new file mode 100644 index 00000000..7dfeb8bb --- /dev/null +++ b/roms/u-boot/arch/x86/include/asm/byteorder.h @@ -0,0 +1,43 @@ +#ifndef _I386_BYTEORDER_H +#define _I386_BYTEORDER_H + +#include <asm/types.h> + +#ifdef __GNUC__ + + +static __inline__ __u32 ___arch__swab32(__u32 x) +{ +#ifdef CONFIG_X86_BSWAP +	__asm__("bswap %0" : "=r" (x) : "0" (x)); +#else +	__asm__("xchgb %b0,%h0\n\t"	/* swap lower bytes	*/ +		"rorl $16,%0\n\t"	/* swap words		*/ +		"xchgb %b0,%h0"		/* swap higher bytes	*/ +		:"=q" (x) +		: "0" (x)); +#endif +	return x; +} + +static __inline__ __u16 ___arch__swab16(__u16 x) +{ +	__asm__("xchgb %b0,%h0"		/* swap bytes		*/ \ +		: "=q" (x) \ +		:  "0" (x)); \ +		return x; +} + +#define __arch__swab32(x) ___arch__swab32(x) +#define __arch__swab16(x) ___arch__swab16(x) + +#if !defined(__STRICT_ANSI__) || defined(__KERNEL__) +#  define __BYTEORDER_HAS_U64__ +#  define __SWAB_64_THRU_32__ +#endif + +#endif /* __GNUC__ */ + +#include <linux/byteorder/little_endian.h> + +#endif /* _I386_BYTEORDER_H */ diff --git a/roms/u-boot/arch/x86/include/asm/cache.h b/roms/u-boot/arch/x86/include/asm/cache.h new file mode 100644 index 00000000..508b63f5 --- /dev/null +++ b/roms/u-boot/arch/x86/include/asm/cache.h @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2011 The Chromium OS Authors. + * + * SPDX-License-Identifier:	GPL-2.0+ + */ + +#ifndef __X86_CACHE_H__ +#define __X86_CACHE_H__ + +/* + * If CONFIG_SYS_CACHELINE_SIZE is defined use it for DMA alignment.  Otherwise + * use 64-bytes, a safe default for x86. + */ +#ifdef CONFIG_SYS_CACHELINE_SIZE +#define ARCH_DMA_MINALIGN	CONFIG_SYS_CACHELINE_SIZE +#else +#define ARCH_DMA_MINALIGN	64 +#endif + +static inline void wbinvd(void) +{ +	asm volatile ("wbinvd" : : : "memory"); +} + +static inline void invd(void) +{ +	asm volatile("invd" : : : "memory"); +} + +/* Enable caches and write buffer */ +void enable_caches(void); + +/* Disable caches and write buffer */ +void disable_caches(void); + +#endif /* __X86_CACHE_H__ */ diff --git a/roms/u-boot/arch/x86/include/asm/config.h b/roms/u-boot/arch/x86/include/asm/config.h new file mode 100644 index 00000000..f06a15cd --- /dev/null +++ b/roms/u-boot/arch/x86/include/asm/config.h @@ -0,0 +1,11 @@ +/* + * Copyright 2009 Freescale Semiconductor, Inc. + * + * SPDX-License-Identifier:	GPL-2.0+ + */ + +#ifndef _ASM_CONFIG_H_ +#define _ASM_CONFIG_H_ + +#define CONFIG_SYS_GENERIC_BOARD +#endif diff --git a/roms/u-boot/arch/x86/include/asm/control_regs.h b/roms/u-boot/arch/x86/include/asm/control_regs.h new file mode 100644 index 00000000..9e67478a --- /dev/null +++ b/roms/u-boot/arch/x86/include/asm/control_regs.h @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2012 The Chromium OS Authors. + * + * (C) Copyright 2008-2011 + * Graeme Russ, <graeme.russ@gmail.com> + * + * (C) Copyright 2002 + * Daniel Engström, Omicron Ceti AB, <daniel@omicron.se> + * + * Portions of this file are derived from the Linux kernel source + *  Copyright (C) 1991, 1992  Linus Torvalds + * + * SPDX-License-Identifier:	GPL-2.0+ + */ + +#ifndef __X86_CONTROL_REGS_H +#define __X86_CONTROL_REGS_H + +/* + * The memory clobber prevents the GCC from reordering the read/write order + * of CR0 +*/ +static inline unsigned long read_cr0(void) +{ +	unsigned long val; + +	asm volatile ("movl %%cr0, %0" : "=r" (val) : : "memory"); +	return val; +} + +static inline void write_cr0(unsigned long val) +{ +	asm volatile ("movl %0, %%cr0" : : "r" (val) : "memory"); +} + +static inline unsigned long read_cr2(void) +{ +	unsigned long val; + +	asm volatile("mov %%cr2,%0\n\t" : "=r" (val) : : "memory"); +	return val; +} + +static inline unsigned long read_cr3(void) +{ +	unsigned long val; + +	asm volatile("mov %%cr3,%0\n\t" : "=r" (val) : : "memory"); +	return val; +} + +static inline unsigned long read_cr4(void) +{ +	unsigned long val; + +	asm volatile("mov %%cr4,%0\n\t" : "=r" (val) : : "memory"); +	return val; +} + +static inline unsigned long get_debugreg(int regno) +{ +	unsigned long val = 0;  /* Damn you, gcc! */ + +	switch (regno) { +	case 0: +		asm("mov %%db0, %0" : "=r" (val)); +		break; +	case 1: +		asm("mov %%db1, %0" : "=r" (val)); +		break; +	case 2: +		asm("mov %%db2, %0" : "=r" (val)); +		break; +	case 3: +		asm("mov %%db3, %0" : "=r" (val)); +		break; +	case 6: +		asm("mov %%db6, %0" : "=r" (val)); +		break; +	case 7: +		asm("mov %%db7, %0" : "=r" (val)); +		break; +	default: +		val = 0; +	} +	return val; +} + +#endif diff --git a/roms/u-boot/arch/x86/include/asm/e820.h b/roms/u-boot/arch/x86/include/asm/e820.h new file mode 100644 index 00000000..d155ce9c --- /dev/null +++ b/roms/u-boot/arch/x86/include/asm/e820.h @@ -0,0 +1,155 @@ +#ifndef _ASM_X86_E820_H +#define _ASM_X86_E820_H +#define E820MAP	0x2d0		/* our map */ +#define E820MAX	128		/* number of entries in E820MAP */ + +/* + * Legacy E820 BIOS limits us to 128 (E820MAX) nodes due to the + * constrained space in the zeropage.  If we have more nodes than + * that, and if we've booted off EFI firmware, then the EFI tables + * passed us from the EFI firmware can list more nodes.  Size our + * internal memory map tables to have room for these additional + * nodes, based on up to three entries per node for which the + * kernel was built: MAX_NUMNODES == (1 << CONFIG_NODES_SHIFT), + * plus E820MAX, allowing space for the possible duplicate E820 + * entries that might need room in the same arrays, prior to the + * call to sanitize_e820_map() to remove duplicates.  The allowance + * of three memory map entries per node is "enough" entries for + * the initial hardware platform motivating this mechanism to make + * use of additional EFI map entries.  Future platforms may want + * to allow more than three entries per node or otherwise refine + * this size. + */ + +/* + * Odd: 'make headers_check' complains about numa.h if I try + * to collapse the next two #ifdef lines to a single line: + *	#if defined(__KERNEL__) && defined(CONFIG_EFI) + */ +#ifdef __KERNEL__ +#ifdef CONFIG_EFI +#include <linux/numa.h> +#define E820_X_MAX (E820MAX + 3 * MAX_NUMNODES) +#else	/* ! CONFIG_EFI */ +#define E820_X_MAX E820MAX +#endif +#else	/* ! __KERNEL__ */ +#define E820_X_MAX E820MAX +#endif + +#define E820NR	0x1e8		/* # entries in E820MAP */ + +#define E820_RAM	1 +#define E820_RESERVED	2 +#define E820_ACPI	3 +#define E820_NVS	4 +#define E820_UNUSABLE	5 + +/* reserved RAM used by kernel itself */ +#define E820_RESERVED_KERN        128 + +#ifndef __ASSEMBLY__ +#include <linux/types.h> +struct e820entry { +	__u64 addr;	/* start of memory segment */ +	__u64 size;	/* size of memory segment */ +	__u32 type;	/* type of memory segment */ +} __attribute__((packed)); + +struct e820map { +	__u32 nr_map; +	struct e820entry map[E820_X_MAX]; +}; + +#define ISA_START_ADDRESS	0xa0000 +#define ISA_END_ADDRESS		0x100000 + +#define BIOS_BEGIN		0x000a0000 +#define BIOS_END		0x00100000 + +#ifdef __KERNEL__ +/* see comment in arch/x86/kernel/e820.c */ +extern struct e820map e820; +extern struct e820map e820_saved; + +extern unsigned long pci_mem_start; +extern int e820_any_mapped(u64 start, u64 end, unsigned type); +extern int e820_all_mapped(u64 start, u64 end, unsigned type); +extern void e820_add_region(u64 start, u64 size, int type); +extern void e820_print_map(char *who); +extern int +sanitize_e820_map(struct e820entry *biosmap, int max_nr_map, u32 *pnr_map); +extern u64 e820_update_range(u64 start, u64 size, unsigned old_type, +			       unsigned new_type); +extern u64 e820_remove_range(u64 start, u64 size, unsigned old_type, +			     int checktype); +extern void update_e820(void); +extern void e820_setup_gap(void); +extern int e820_search_gap(unsigned long *gapstart, unsigned long *gapsize, +			unsigned long start_addr, unsigned long long end_addr); +struct setup_data; +extern void parse_e820_ext(struct setup_data *data, unsigned long pa_data); + +#if defined(CONFIG_X86_64) || \ +	(defined(CONFIG_X86_32) && defined(CONFIG_HIBERNATION)) +extern void e820_mark_nosave_regions(unsigned long limit_pfn); +#else +static inline void e820_mark_nosave_regions(unsigned long limit_pfn) +{ +} +#endif + +#ifdef CONFIG_MEMTEST +extern void early_memtest(unsigned long start, unsigned long end); +#else +static inline void early_memtest(unsigned long start, unsigned long end) +{ +} +#endif + +extern unsigned long end_user_pfn; + +extern u64 find_e820_area(u64 start, u64 end, u64 size, u64 align); +extern u64 find_e820_area_size(u64 start, u64 *sizep, u64 align); +extern void reserve_early(u64 start, u64 end, char *name); +extern void reserve_early_overlap_ok(u64 start, u64 end, char *name); +extern void free_early(u64 start, u64 end); +extern void early_res_to_bootmem(u64 start, u64 end); +extern u64 early_reserve_e820(u64 startt, u64 sizet, u64 align); + +extern unsigned long e820_end_of_ram_pfn(void); +extern unsigned long e820_end_of_low_ram_pfn(void); +extern int e820_find_active_region(const struct e820entry *ei, +				  unsigned long start_pfn, +				  unsigned long last_pfn, +				  unsigned long *ei_startpfn, +				  unsigned long *ei_endpfn); +extern void e820_register_active_regions(int nid, unsigned long start_pfn, +					 unsigned long end_pfn); +extern u64 e820_hole_size(u64 start, u64 end); +extern void finish_e820_parsing(void); +extern void e820_reserve_resources(void); +extern void e820_reserve_resources_late(void); +extern void setup_memory_map(void); +extern char *default_machine_specific_memory_setup(void); + +/* + * Returns true iff the specified range [s,e) is completely contained inside + * the ISA region. + */ +/* +static inline bool is_ISA_range(u64 s, u64 e) +{ +	return s >= ISA_START_ADDRESS && e <= ISA_END_ADDRESS; +} +*/ +#endif /* __KERNEL__ */ +#endif /* __ASSEMBLY__ */ + +#ifdef __KERNEL__ +/* #include <linux/ioport.h> */ + +#define HIGH_MEMORY	(1024*1024) +#endif /* __KERNEL__ */ + +#endif /* _ASM_X86_E820_H */ diff --git a/roms/u-boot/arch/x86/include/asm/errno.h b/roms/u-boot/arch/x86/include/asm/errno.h new file mode 100644 index 00000000..4c82b503 --- /dev/null +++ b/roms/u-boot/arch/x86/include/asm/errno.h @@ -0,0 +1 @@ +#include <asm-generic/errno.h> diff --git a/roms/u-boot/arch/x86/include/asm/global_data.h b/roms/u-boot/arch/x86/include/asm/global_data.h new file mode 100644 index 00000000..3e8e2cdb --- /dev/null +++ b/roms/u-boot/arch/x86/include/asm/global_data.h @@ -0,0 +1,48 @@ +/* + * (C) Copyright 2002-2010 + * Wolfgang Denk, DENX Software Engineering, wd@denx.de. + * + * SPDX-License-Identifier:	GPL-2.0+ + */ + +#ifndef	__ASM_GBL_DATA_H +#define __ASM_GBL_DATA_H + +#ifndef __ASSEMBLY__ + +/* Architecture-specific global data */ +struct arch_global_data { +	struct global_data *gd_addr;		/* Location of Global Data */ +	uint64_t tsc_base;		/* Initial value returned by rdtsc() */ +	uint32_t tsc_base_kclocks;	/* Initial tsc as a kclocks value */ +	uint32_t tsc_prev;		/* For show_boot_progress() */ +	void *new_fdt;			/* Relocated FDT */ +}; + +#endif + +#include <asm-generic/global_data.h> + +#ifndef __ASSEMBLY__ +static inline __attribute__((no_instrument_function)) gd_t *get_fs_gd_ptr(void) +{ +	gd_t *gd_ptr; + +	asm volatile("fs movl 0, %0\n" : "=r" (gd_ptr)); + +	return gd_ptr; +} + +#define gd	get_fs_gd_ptr() + +#endif + +/* + * Our private Global Data Flags + */ +#define GD_FLG_COLD_BOOT	0x00100	/* Cold Boot */ +#define GD_FLG_WARM_BOOT	0x00200	/* Warm Boot */ + +#define DECLARE_GLOBAL_DATA_PTR + +#endif /* __ASM_GBL_DATA_H */ diff --git a/roms/u-boot/arch/x86/include/asm/gpio.h b/roms/u-boot/arch/x86/include/asm/gpio.h new file mode 100644 index 00000000..fe09f315 --- /dev/null +++ b/roms/u-boot/arch/x86/include/asm/gpio.h @@ -0,0 +1,11 @@ +/* + * Copyright (c) 2012, Google Inc. All rights reserved. + * SPDX-License-Identifier:	GPL-2.0+ + */ + +#ifndef _X86_GPIO_H_ +#define _X86_GPIO_H_ + +#include <asm-generic/gpio.h> + +#endif /* _X86_GPIO_H_ */ diff --git a/roms/u-boot/arch/x86/include/asm/i8254.h b/roms/u-boot/arch/x86/include/asm/i8254.h new file mode 100644 index 00000000..c3ccd4f9 --- /dev/null +++ b/roms/u-boot/arch/x86/include/asm/i8254.h @@ -0,0 +1,39 @@ +/* + * (C) Copyright 2002 + * Daniel Engström, Omicron Ceti AB, daniel@omicron.se. + * + * SPDX-License-Identifier:	GPL-2.0+ + */ + + +/* i8254.h Intel 8254 PIT registers */ + + +#ifndef _ASMI386_I8254_H_ +#define _ASMI386_I8954_H_       1 + + +#define PIT_T0		0x00		/* PIT channel 0 count/status */ +#define PIT_T1		0x01		/* PIT channel 1 count/status */ +#define PIT_T2		0x02		/* PIT channel 2 count/status */ +#define PIT_COMMAND	0x03		/* PIT mode control, latch and read back */ + +/* PIT Command Register Bit Definitions */ + +#define PIT_CMD_CTR0	0x00		/* Select PIT counter 0 */ +#define PIT_CMD_CTR1	0x40		/* Select PIT counter 1 */ +#define PIT_CMD_CTR2	0x80		/* Select PIT counter 2 */ + +#define PIT_CMD_LATCH	0x00		/* Counter Latch Command */ +#define PIT_CMD_LOW	0x10		/* Access counter bits 7-0 */ +#define PIT_CMD_HIGH	0x20		/* Access counter bits 15-8 */ +#define PIT_CMD_BOTH	0x30		/* Access counter bits 15-0 in two accesses */ + +#define PIT_CMD_MODE0	0x00		/* Select mode 0 */ +#define PIT_CMD_MODE1	0x02		/* Select mode 1 */ +#define PIT_CMD_MODE2	0x04		/* Select mode 2 */ +#define PIT_CMD_MODE3	0x06		/* Select mode 3 */ +#define PIT_CMD_MODE4	0x08		/* Select mode 4 */ +#define PIT_CMD_MODE5	0x0A		/* Select mode 5 */ + +#endif diff --git a/roms/u-boot/arch/x86/include/asm/i8259.h b/roms/u-boot/arch/x86/include/asm/i8259.h new file mode 100644 index 00000000..73113f90 --- /dev/null +++ b/roms/u-boot/arch/x86/include/asm/i8259.h @@ -0,0 +1,72 @@ +/* + * (C) Copyright 2002 + * Daniel Engström, Omicron Ceti AB, daniel@omicron.se. + * + * SPDX-License-Identifier:	GPL-2.0+ + */ + +/* i8259.h i8259 PIC Registers */ + +#ifndef _ASMI386_I8259_H_ +#define _ASMI386_I8959_H_       1 + + +/* PIC I/O mapped registers */ + +#define IRR		0x0	/* Interrupt Request Register */ +#define ISR		0x0	/* In-Service Register */ +#define ICW1		0x0	/* Initialization Control Word 1 */ +#define OCW2		0x0	/* Operation Control Word 2 */ +#define OCW3		0x0	/* Operation Control Word 3 */ +#define ICW2		0x1	/* Initialization Control Word 2 */ +#define ICW3		0x1	/* Initialization Control Word 3 */ +#define ICW4		0x1	/* Initialization Control Word 4 */ +#define IMR		0x1	/* Interrupt Mask Register */ + +/* bits for IRR, IMR, ISR and ICW3 */ +#define	IR7		0x80	/* IR7 */ +#define	IR6		0x40	/* IR6 */ +#define	IR5		0x20	/* IR5 */ +#define	IR4		0x10	/* IR4 */ +#define	IR3		0x08	/* IR3 */ +#define	IR2		0x04	/* IR2 */ +#define	IR1		0x02	/* IR1 */ +#define	IR0		0x01	/* IR0 */ + +/* bits for SEOI */ +#define	SEOI_IR7	0x07	/* IR7 */ +#define	SEOI_IR6	0x06	/* IR6 */ +#define	SEOI_IR5	0x05	/* IR5 */ +#define	SEOI_IR4	0x04	/* IR4 */ +#define	SEOI_IR3	0x03	/* IR3 */ +#define	SEOI_IR2	0x02	/* IR2 */ +#define	SEOI_IR1	0x01	/* IR1 */ +#define	SEOI_IR0	0x00	/* IR0 */ + +/* OCW2 bits */ +#define OCW2_RCLR	0x00	/* Rotate/clear */ +#define OCW2_NEOI	0x20	/* Non specific EOI */ +#define OCW2_NOP	0x40	/* NOP */ +#define OCW2_SEOI	0x60	/* Specific EOI */ +#define OCW2_RSET	0x80	/* Rotate/set */ +#define OCW2_REOI	0xA0	/* Rotate on non specific EOI */ +#define OCW2_PSET	0xC0	/* Priority Set Command */ +#define OCW2_RSEOI	0xE0	/* Rotate on specific EOI */ + +/* ICW1 bits */ +#define ICW1_SEL	0x10	/* Select ICW1 */ +#define ICW1_LTIM	0x08	/* Level-Triggered Interrupt Mode */ +#define ICW1_ADI	0x04	/* Address Interval */ +#define ICW1_SNGL	0x02	/* Single PIC */ +#define ICW1_EICW4	0x01	/* Expect initilization ICW4 */ + +/* ICW2 is the starting vector number */ + +/* ICW2 is bit-mask of present slaves for a master device, + * or the slave ID for a slave device */ + +/* ICW4 bits */ +#define	ICW4_AEOI	0x02	/* Automatic EOI Mode */ +#define ICW4_PM		0x01	/* Microprocessor Mode */ + +#endif diff --git a/roms/u-boot/arch/x86/include/asm/ibmpc.h b/roms/u-boot/arch/x86/include/asm/ibmpc.h new file mode 100644 index 00000000..0f9665f5 --- /dev/null +++ b/roms/u-boot/arch/x86/include/asm/ibmpc.h @@ -0,0 +1,31 @@ +/* + * (C) Copyright 2002 + * Daniel Engström, Omicron Ceti AB, daniel@omicron.se + * + * SPDX-License-Identifier:	GPL-2.0+ + */ + +#ifndef __ASM_IBMPC_H_ +#define __ASM_IBMPC_H_ 1 + +/* misc ports in an ibm compatible pc */ + +#define MASTER_PIC      0x20 +#define PIT_BASE	0x40 +#define KBDDATA         0x60 +#define SYSCTLB         0x62 +#define KBDCMD          0x64 +#define SYSCTLA         0x92 +#define SLAVE_PIC       0xa0 + +#if 1 +#define UART0_BASE     0x3f8 +#define UART1_BASE     0x2f8 +#else +/* FixMe: uarts swapped */ +#define UART0_BASE     0x2f8 +#define UART1_BASE     0x3f8 +#endif + + +#endif diff --git a/roms/u-boot/arch/x86/include/asm/init_helpers.h b/roms/u-boot/arch/x86/include/asm/init_helpers.h new file mode 100644 index 00000000..b07887ea --- /dev/null +++ b/roms/u-boot/arch/x86/include/asm/init_helpers.h @@ -0,0 +1,19 @@ +/* + * (C) Copyright 2011 + * Graeme Russ, <graeme.russ@gmail.com> + * + * SPDX-License-Identifier:	GPL-2.0+ + */ + +#ifndef _INIT_HELPERS_H_ +#define _INIT_HELPERS_H_ + +int calculate_relocation_address(void); + +int init_cache_f_r(void); +int init_bd_struct_r(void); +int init_func_spi(void); +int find_fdt(void); +int prepare_fdt(void); + +#endif	/* !_INIT_HELPERS_H_ */ diff --git a/roms/u-boot/arch/x86/include/asm/interrupt.h b/roms/u-boot/arch/x86/include/asm/interrupt.h new file mode 100644 index 00000000..3f46e092 --- /dev/null +++ b/roms/u-boot/arch/x86/include/asm/interrupt.h @@ -0,0 +1,30 @@ +/* + * (C) Copyright 2009 + * Graeme Russ, graeme.russ@gmail.com + * + * (C) Copyright 2002 + * Daniel Engström, Omicron Ceti AB, daniel@omicron.se + * + * SPDX-License-Identifier:	GPL-2.0+ + */ + +#ifndef __ASM_INTERRUPT_H_ +#define __ASM_INTERRUPT_H_ 1 + +#include <asm/types.h> + +/* arch/x86/cpu/interrupts.c */ +void set_vector(u8 intnum, void *routine); + +/* arch/x86/lib/interrupts.c */ +void disable_irq(int irq); +void enable_irq(int irq); + +/* Architecture specific functions */ +void mask_irq(int irq); +void unmask_irq(int irq); +void specific_eoi(int irq); + +extern char exception_stack[]; + +#endif diff --git a/roms/u-boot/arch/x86/include/asm/io.h b/roms/u-boot/arch/x86/include/asm/io.h new file mode 100644 index 00000000..86bac90e --- /dev/null +++ b/roms/u-boot/arch/x86/include/asm/io.h @@ -0,0 +1,249 @@ +#ifndef _ASM_IO_H +#define _ASM_IO_H + +#include <compiler.h> + +/* + * This file contains the definitions for the x86 IO instructions + * inb/inw/inl/outb/outw/outl and the "string versions" of the same + * (insb/insw/insl/outsb/outsw/outsl). You can also use "pausing" + * versions of the single-IO instructions (inb_p/inw_p/..). + * + * This file is not meant to be obfuscating: it's just complicated + * to (a) handle it all in a way that makes gcc able to optimize it + * as well as possible and (b) trying to avoid writing the same thing + * over and over again with slight variations and possibly making a + * mistake somewhere. + */ + +/* + * Thanks to James van Artsdalen for a better timing-fix than + * the two short jumps: using outb's to a nonexistent port seems + * to guarantee better timings even on fast machines. + * + * On the other hand, I'd like to be sure of a non-existent port: + * I feel a bit unsafe about using 0x80 (should be safe, though) + * + *		Linus + */ + + /* +  *  Bit simplified and optimized by Jan Hubicka +  *  Support of BIGMEM added by Gerhard Wichert, Siemens AG, July 1999. +  * +  *  isa_memset_io, isa_memcpy_fromio, isa_memcpy_toio added, +  *  isa_read[wl] and isa_write[wl] fixed +  *  - Arnaldo Carvalho de Melo <acme@conectiva.com.br> +  */ + +#define IO_SPACE_LIMIT 0xffff + +#include <asm/types.h> + + +#ifdef __KERNEL__ + + +/* + * readX/writeX() are used to access memory mapped devices. On some + * architectures the memory mapped IO stuff needs to be accessed + * differently. On the x86 architecture, we just read/write the + * memory location directly. + */ + +#define readb(addr) (*(volatile unsigned char *) (addr)) +#define readw(addr) (*(volatile unsigned short *) (addr)) +#define readl(addr) (*(volatile unsigned int *) (addr)) +#define __raw_readb readb +#define __raw_readw readw +#define __raw_readl readl + +#define writeb(b,addr) (*(volatile unsigned char *) (addr) = (b)) +#define writew(b,addr) (*(volatile unsigned short *) (addr) = (b)) +#define writel(b,addr) (*(volatile unsigned int *) (addr) = (b)) +#define __raw_writeb writeb +#define __raw_writew writew +#define __raw_writel writel + +#define memset_io(a,b,c)	memset((a),(b),(c)) +#define memcpy_fromio(a,b,c)	memcpy((a),(b),(c)) +#define memcpy_toio(a,b,c)	memcpy((a),(b),(c)) + +/* + * ISA space is 'always mapped' on a typical x86 system, no need to + * explicitly ioremap() it. The fact that the ISA IO space is mapped + * to PAGE_OFFSET is pure coincidence - it does not mean ISA values + * are physical addresses. The following constant pointer can be + * used as the IO-area pointer (it can be iounmapped as well, so the + * analogy with PCI is quite large): + */ +#define isa_readb(a) readb((a)) +#define isa_readw(a) readw((a)) +#define isa_readl(a) readl((a)) +#define isa_writeb(b,a) writeb(b,(a)) +#define isa_writew(w,a) writew(w,(a)) +#define isa_writel(l,a) writel(l,(a)) +#define isa_memset_io(a,b,c)		memset_io((a),(b),(c)) +#define isa_memcpy_fromio(a,b,c)	memcpy_fromio((a),(b),(c)) +#define isa_memcpy_toio(a,b,c)		memcpy_toio((a),(b),(c)) + + +static inline int check_signature(unsigned long io_addr, +	const unsigned char *signature, int length) +{ +	int retval = 0; +	do { +		if (readb(io_addr) != *signature) +			goto out; +		io_addr++; +		signature++; +		length--; +	} while (length); +	retval = 1; +out: +	return retval; +} + +/** + *	isa_check_signature		-	find BIOS signatures + *	@io_addr: mmio address to check + *	@signature:  signature block + *	@length: length of signature + * + *	Perform a signature comparison with the ISA mmio address io_addr. + *	Returns 1 on a match. + * + *	This function is deprecated. New drivers should use ioremap and + *	check_signature. + */ + + +static inline int isa_check_signature(unsigned long io_addr, +	const unsigned char *signature, int length) +{ +	int retval = 0; +	do { +		if (isa_readb(io_addr) != *signature) +			goto out; +		io_addr++; +		signature++; +		length--; +	} while (length); +	retval = 1; +out: +	return retval; +} + +#endif /* __KERNEL__ */ + +#ifdef SLOW_IO_BY_JUMPING +#define __SLOW_DOWN_IO "\njmp 1f\n1:\tjmp 1f\n1:" +#else +#define __SLOW_DOWN_IO "\noutb %%al,$0xed" +#endif + +#ifdef REALLY_SLOW_IO +#define __FULL_SLOW_DOWN_IO __SLOW_DOWN_IO __SLOW_DOWN_IO __SLOW_DOWN_IO __SLOW_DOWN_IO +#else +#define __FULL_SLOW_DOWN_IO __SLOW_DOWN_IO +#endif + + +/* + * Talk about misusing macros.. + */ +#define __OUT1(s,x) \ +static inline void out##s(unsigned x value, unsigned short port) { + +#define __OUT2(s,s1,s2) \ +__asm__ __volatile__ ("out" #s " %" s1 "0,%" s2 "1" + + +#define __OUT(s,s1,x) \ +__OUT1(s,x) __OUT2(s,s1,"w") : : "a" (value), "Nd" (port)); } \ +__OUT1(s##_p,x) __OUT2(s,s1,"w") __FULL_SLOW_DOWN_IO : : "a" (value), "Nd" (port));} + +#define __IN1(s) \ +static inline RETURN_TYPE in##s(unsigned short port) { RETURN_TYPE _v; + +#define __IN2(s,s1,s2) \ +__asm__ __volatile__ ("in" #s " %" s2 "1,%" s1 "0" + +#define __IN(s,s1,i...) \ +__IN1(s) __IN2(s,s1,"w") : "=a" (_v) : "Nd" (port) ,##i ); return _v; } \ +__IN1(s##_p) __IN2(s,s1,"w") __FULL_SLOW_DOWN_IO : "=a" (_v) : "Nd" (port) ,##i ); return _v; } + +#define __INS(s) \ +static inline void ins##s(unsigned short port, void * addr, unsigned long count) \ +{ __asm__ __volatile__ ("rep ; ins" #s \ +: "=D" (addr), "=c" (count) : "d" (port),"0" (addr),"1" (count)); } + +#define __OUTS(s) \ +static inline void outs##s(unsigned short port, const void * addr, unsigned long count) \ +{ __asm__ __volatile__ ("rep ; outs" #s \ +: "=S" (addr), "=c" (count) : "d" (port),"0" (addr),"1" (count)); } + +#define RETURN_TYPE unsigned char +__IN(b,"") +#undef RETURN_TYPE +#define RETURN_TYPE unsigned short +__IN(w,"") +#undef RETURN_TYPE +#define RETURN_TYPE unsigned int +__IN(l,"") +#undef RETURN_TYPE + +__OUT(b,"b",char) +__OUT(w,"w",short) +__OUT(l,,int) + +__INS(b) +__INS(w) +__INS(l) + +__OUTS(b) +__OUTS(w) +__OUTS(l) + +static inline void sync(void) +{ +} + +/* + * Given a physical address and a length, return a virtual address + * that can be used to access the memory range with the caching + * properties specified by "flags". + */ +#define MAP_NOCACHE	(0) +#define MAP_WRCOMBINE	(0) +#define MAP_WRBACK	(0) +#define MAP_WRTHROUGH	(0) + +static inline void * +map_physmem(phys_addr_t paddr, unsigned long len, unsigned long flags) +{ +	return (void *)(uintptr_t)paddr; +} + +/* + * Take down a mapping set up by map_physmem(). + */ +static inline void unmap_physmem(void *vaddr, unsigned long flags) +{ + +} + +static inline phys_addr_t virt_to_phys(void * vaddr) +{ +	return (phys_addr_t)(uintptr_t)(vaddr); +} + +/* + * TODO: The kernel offers some more advanced versions of barriers, it might + * have some advantages to use them instead of the simple one here. + */ +#define dmb()		__asm__ __volatile__ ("" : : : "memory") +#define __iormb()	dmb() +#define __iowmb()	dmb() + +#endif diff --git a/roms/u-boot/arch/x86/include/asm/ioctl.h b/roms/u-boot/arch/x86/include/asm/ioctl.h new file mode 100644 index 00000000..b279fe06 --- /dev/null +++ b/roms/u-boot/arch/x86/include/asm/ioctl.h @@ -0,0 +1 @@ +#include <asm-generic/ioctl.h> diff --git a/roms/u-boot/arch/x86/include/asm/ist.h b/roms/u-boot/arch/x86/include/asm/ist.h new file mode 100644 index 00000000..0cdbb45b --- /dev/null +++ b/roms/u-boot/arch/x86/include/asm/ist.h @@ -0,0 +1,26 @@ +#ifndef _ASM_X86_IST_H +#define _ASM_X86_IST_H + +/* + * Include file for the interface to IST BIOS + * Copyright 2002 Andy Grover <andrew.grover@intel.com> + * +  * SPDX-License-Identifier:	GPL-2.0+ + */ + + +#include <linux/types.h> + +struct ist_info { +	__u32 signature; +	__u32 command; +	__u32 event; +	__u32 perf_level; +}; + +#ifdef __KERNEL__ + +extern struct ist_info ist_info; + +#endif	/* __KERNEL__ */ +#endif /* _ASM_X86_IST_H */ diff --git a/roms/u-boot/arch/x86/include/asm/msr-index.h b/roms/u-boot/arch/x86/include/asm/msr-index.h new file mode 100644 index 00000000..0a36e178 --- /dev/null +++ b/roms/u-boot/arch/x86/include/asm/msr-index.h @@ -0,0 +1,456 @@ +/* + * Taken from the linux kernel file of the same name + * + * (C) Copyright 2012 + * Graeme Russ, <graeme.russ@gmail.com> + * + * SPDX-License-Identifier:	GPL-2.0+ + */ + +#ifndef _ASM_X86_MSR_INDEX_H +#define _ASM_X86_MSR_INDEX_H + +/* CPU model specific register (MSR) numbers */ + +/* x86-64 specific MSRs */ +#define MSR_EFER		0xc0000080 /* extended feature register */ +#define MSR_STAR		0xc0000081 /* legacy mode SYSCALL target */ +#define MSR_LSTAR		0xc0000082 /* long mode SYSCALL target */ +#define MSR_CSTAR		0xc0000083 /* compat mode SYSCALL target */ +#define MSR_SYSCALL_MASK	0xc0000084 /* EFLAGS mask for syscall */ +#define MSR_FS_BASE		0xc0000100 /* 64bit FS base */ +#define MSR_GS_BASE		0xc0000101 /* 64bit GS base */ +#define MSR_KERNEL_GS_BASE	0xc0000102 /* SwapGS GS shadow */ +#define MSR_TSC_AUX		0xc0000103 /* Auxiliary TSC */ + +/* EFER bits: */ +#define _EFER_SCE		0  /* SYSCALL/SYSRET */ +#define _EFER_LME		8  /* Long mode enable */ +#define _EFER_LMA		10 /* Long mode active (read-only) */ +#define _EFER_NX		11 /* No execute enable */ +#define _EFER_SVME		12 /* Enable virtualization */ +#define _EFER_LMSLE		13 /* Long Mode Segment Limit Enable */ +#define _EFER_FFXSR		14 /* Enable Fast FXSAVE/FXRSTOR */ + +#define EFER_SCE		(1<<_EFER_SCE) +#define EFER_LME		(1<<_EFER_LME) +#define EFER_LMA		(1<<_EFER_LMA) +#define EFER_NX			(1<<_EFER_NX) +#define EFER_SVME		(1<<_EFER_SVME) +#define EFER_LMSLE		(1<<_EFER_LMSLE) +#define EFER_FFXSR		(1<<_EFER_FFXSR) + +/* Intel MSRs. Some also available on other CPUs */ +#define MSR_IA32_PERFCTR0		0x000000c1 +#define MSR_IA32_PERFCTR1		0x000000c2 +#define MSR_FSB_FREQ			0x000000cd + +#define MSR_NHM_SNB_PKG_CST_CFG_CTL	0x000000e2 +#define NHM_C3_AUTO_DEMOTE		(1UL << 25) +#define NHM_C1_AUTO_DEMOTE		(1UL << 26) +#define ATM_LNC_C6_AUTO_DEMOTE		(1UL << 25) + +#define MSR_MTRRcap			0x000000fe +#define MSR_IA32_BBL_CR_CTL		0x00000119 +#define MSR_IA32_BBL_CR_CTL3		0x0000011e + +#define MSR_IA32_SYSENTER_CS		0x00000174 +#define MSR_IA32_SYSENTER_ESP		0x00000175 +#define MSR_IA32_SYSENTER_EIP		0x00000176 + +#define MSR_IA32_MCG_CAP		0x00000179 +#define MSR_IA32_MCG_STATUS		0x0000017a +#define MSR_IA32_MCG_CTL		0x0000017b + +#define MSR_OFFCORE_RSP_0		0x000001a6 +#define MSR_OFFCORE_RSP_1		0x000001a7 + +#define MSR_IA32_PEBS_ENABLE		0x000003f1 +#define MSR_IA32_DS_AREA		0x00000600 +#define MSR_IA32_PERF_CAPABILITIES	0x00000345 + +#define MSR_MTRRfix64K_00000		0x00000250 +#define MSR_MTRRfix16K_80000		0x00000258 +#define MSR_MTRRfix16K_A0000		0x00000259 +#define MSR_MTRRfix4K_C0000		0x00000268 +#define MSR_MTRRfix4K_C8000		0x00000269 +#define MSR_MTRRfix4K_D0000		0x0000026a +#define MSR_MTRRfix4K_D8000		0x0000026b +#define MSR_MTRRfix4K_E0000		0x0000026c +#define MSR_MTRRfix4K_E8000		0x0000026d +#define MSR_MTRRfix4K_F0000		0x0000026e +#define MSR_MTRRfix4K_F8000		0x0000026f +#define MSR_MTRRdefType			0x000002ff + +#define MSR_IA32_CR_PAT			0x00000277 + +#define MSR_IA32_DEBUGCTLMSR		0x000001d9 +#define MSR_IA32_LASTBRANCHFROMIP	0x000001db +#define MSR_IA32_LASTBRANCHTOIP		0x000001dc +#define MSR_IA32_LASTINTFROMIP		0x000001dd +#define MSR_IA32_LASTINTTOIP		0x000001de + +/* DEBUGCTLMSR bits (others vary by model): */ +#define DEBUGCTLMSR_LBR			(1UL <<  0) +#define DEBUGCTLMSR_BTF			(1UL <<  1) +#define DEBUGCTLMSR_TR			(1UL <<  6) +#define DEBUGCTLMSR_BTS			(1UL <<  7) +#define DEBUGCTLMSR_BTINT		(1UL <<  8) +#define DEBUGCTLMSR_BTS_OFF_OS		(1UL <<  9) +#define DEBUGCTLMSR_BTS_OFF_USR		(1UL << 10) +#define DEBUGCTLMSR_FREEZE_LBRS_ON_PMI	(1UL << 11) + +#define MSR_IA32_MC0_CTL		0x00000400 +#define MSR_IA32_MC0_STATUS		0x00000401 +#define MSR_IA32_MC0_ADDR		0x00000402 +#define MSR_IA32_MC0_MISC		0x00000403 + +#define MSR_AMD64_MC0_MASK		0xc0010044 + +#define MSR_IA32_MCx_CTL(x)		(MSR_IA32_MC0_CTL + 4*(x)) +#define MSR_IA32_MCx_STATUS(x)		(MSR_IA32_MC0_STATUS + 4*(x)) +#define MSR_IA32_MCx_ADDR(x)		(MSR_IA32_MC0_ADDR + 4*(x)) +#define MSR_IA32_MCx_MISC(x)		(MSR_IA32_MC0_MISC + 4*(x)) + +#define MSR_AMD64_MCx_MASK(x)		(MSR_AMD64_MC0_MASK + (x)) + +/* These are consecutive and not in the normal 4er MCE bank block */ +#define MSR_IA32_MC0_CTL2		0x00000280 +#define MSR_IA32_MCx_CTL2(x)		(MSR_IA32_MC0_CTL2 + (x)) + +#define MSR_P6_PERFCTR0			0x000000c1 +#define MSR_P6_PERFCTR1			0x000000c2 +#define MSR_P6_EVNTSEL0			0x00000186 +#define MSR_P6_EVNTSEL1			0x00000187 + +/* AMD64 MSRs. Not complete. See the architecture manual for a more +   complete list. */ + +#define MSR_AMD64_PATCH_LEVEL		0x0000008b +#define MSR_AMD64_NB_CFG		0xc001001f +#define MSR_AMD64_PATCH_LOADER		0xc0010020 +#define MSR_AMD64_OSVW_ID_LENGTH	0xc0010140 +#define MSR_AMD64_OSVW_STATUS		0xc0010141 +#define MSR_AMD64_DC_CFG		0xc0011022 +#define MSR_AMD64_IBSFETCHCTL		0xc0011030 +#define MSR_AMD64_IBSFETCHLINAD		0xc0011031 +#define MSR_AMD64_IBSFETCHPHYSAD	0xc0011032 +#define MSR_AMD64_IBSOPCTL		0xc0011033 +#define MSR_AMD64_IBSOPRIP		0xc0011034 +#define MSR_AMD64_IBSOPDATA		0xc0011035 +#define MSR_AMD64_IBSOPDATA2		0xc0011036 +#define MSR_AMD64_IBSOPDATA3		0xc0011037 +#define MSR_AMD64_IBSDCLINAD		0xc0011038 +#define MSR_AMD64_IBSDCPHYSAD		0xc0011039 +#define MSR_AMD64_IBSCTL		0xc001103a +#define MSR_AMD64_IBSBRTARGET		0xc001103b + +/* Fam 15h MSRs */ +#define MSR_F15H_PERF_CTL		0xc0010200 +#define MSR_F15H_PERF_CTR		0xc0010201 + +/* Fam 10h MSRs */ +#define MSR_FAM10H_MMIO_CONF_BASE	0xc0010058 +#define FAM10H_MMIO_CONF_ENABLE		(1<<0) +#define FAM10H_MMIO_CONF_BUSRANGE_MASK	0xf +#define FAM10H_MMIO_CONF_BUSRANGE_SHIFT 2 +#define FAM10H_MMIO_CONF_BASE_MASK	0xfffffffULL +#define FAM10H_MMIO_CONF_BASE_SHIFT	20 +#define MSR_FAM10H_NODE_ID		0xc001100c + +/* K8 MSRs */ +#define MSR_K8_TOP_MEM1			0xc001001a +#define MSR_K8_TOP_MEM2			0xc001001d +#define MSR_K8_SYSCFG			0xc0010010 +#define MSR_K8_INT_PENDING_MSG		0xc0010055 +/* C1E active bits in int pending message */ +#define K8_INTP_C1E_ACTIVE_MASK		0x18000000 +#define MSR_K8_TSEG_ADDR		0xc0010112 +#define K8_MTRRFIXRANGE_DRAM_ENABLE	0x00040000 /* MtrrFixDramEn bit    */ +#define K8_MTRRFIXRANGE_DRAM_MODIFY	0x00080000 /* MtrrFixDramModEn bit */ +#define K8_MTRR_RDMEM_WRMEM_MASK	0x18181818 /* Mask: RdMem|WrMem    */ + +/* K7 MSRs */ +#define MSR_K7_EVNTSEL0			0xc0010000 +#define MSR_K7_PERFCTR0			0xc0010004 +#define MSR_K7_EVNTSEL1			0xc0010001 +#define MSR_K7_PERFCTR1			0xc0010005 +#define MSR_K7_EVNTSEL2			0xc0010002 +#define MSR_K7_PERFCTR2			0xc0010006 +#define MSR_K7_EVNTSEL3			0xc0010003 +#define MSR_K7_PERFCTR3			0xc0010007 +#define MSR_K7_CLK_CTL			0xc001001b +#define MSR_K7_HWCR			0xc0010015 +#define MSR_K7_FID_VID_CTL		0xc0010041 +#define MSR_K7_FID_VID_STATUS		0xc0010042 + +/* K6 MSRs */ +#define MSR_K6_WHCR			0xc0000082 +#define MSR_K6_UWCCR			0xc0000085 +#define MSR_K6_EPMR			0xc0000086 +#define MSR_K6_PSOR			0xc0000087 +#define MSR_K6_PFIR			0xc0000088 + +/* Centaur-Hauls/IDT defined MSRs. */ +#define MSR_IDT_FCR1			0x00000107 +#define MSR_IDT_FCR2			0x00000108 +#define MSR_IDT_FCR3			0x00000109 +#define MSR_IDT_FCR4			0x0000010a + +#define MSR_IDT_MCR0			0x00000110 +#define MSR_IDT_MCR1			0x00000111 +#define MSR_IDT_MCR2			0x00000112 +#define MSR_IDT_MCR3			0x00000113 +#define MSR_IDT_MCR4			0x00000114 +#define MSR_IDT_MCR5			0x00000115 +#define MSR_IDT_MCR6			0x00000116 +#define MSR_IDT_MCR7			0x00000117 +#define MSR_IDT_MCR_CTRL		0x00000120 + +/* VIA Cyrix defined MSRs*/ +#define MSR_VIA_FCR			0x00001107 +#define MSR_VIA_LONGHAUL		0x0000110a +#define MSR_VIA_RNG			0x0000110b +#define MSR_VIA_BCR2			0x00001147 + +/* Transmeta defined MSRs */ +#define MSR_TMTA_LONGRUN_CTRL		0x80868010 +#define MSR_TMTA_LONGRUN_FLAGS		0x80868011 +#define MSR_TMTA_LRTI_READOUT		0x80868018 +#define MSR_TMTA_LRTI_VOLT_MHZ		0x8086801a + +/* Intel defined MSRs. */ +#define MSR_IA32_P5_MC_ADDR		0x00000000 +#define MSR_IA32_P5_MC_TYPE		0x00000001 +#define MSR_IA32_TSC			0x00000010 +#define MSR_IA32_PLATFORM_ID		0x00000017 +#define MSR_IA32_EBL_CR_POWERON		0x0000002a +#define MSR_EBC_FREQUENCY_ID		0x0000002c +#define MSR_IA32_FEATURE_CONTROL        0x0000003a + +#define FEATURE_CONTROL_LOCKED				(1<<0) +#define FEATURE_CONTROL_VMXON_ENABLED_INSIDE_SMX	(1<<1) +#define FEATURE_CONTROL_VMXON_ENABLED_OUTSIDE_SMX	(1<<2) + +#define MSR_IA32_APICBASE		0x0000001b +#define MSR_IA32_APICBASE_BSP		(1<<8) +#define MSR_IA32_APICBASE_ENABLE	(1<<11) +#define MSR_IA32_APICBASE_BASE		(0xfffff<<12) + +#define MSR_IA32_UCODE_WRITE		0x00000079 +#define MSR_IA32_UCODE_REV		0x0000008b + +#define MSR_IA32_PERF_STATUS		0x00000198 +#define MSR_IA32_PERF_CTL		0x00000199 + +#define MSR_IA32_MPERF			0x000000e7 +#define MSR_IA32_APERF			0x000000e8 + +#define MSR_IA32_THERM_CONTROL		0x0000019a +#define MSR_IA32_THERM_INTERRUPT	0x0000019b + +#define THERM_INT_HIGH_ENABLE		(1 << 0) +#define THERM_INT_LOW_ENABLE		(1 << 1) +#define THERM_INT_PLN_ENABLE		(1 << 24) + +#define MSR_IA32_THERM_STATUS		0x0000019c + +#define THERM_STATUS_PROCHOT		(1 << 0) +#define THERM_STATUS_POWER_LIMIT	(1 << 10) + +#define MSR_THERM2_CTL			0x0000019d + +#define MSR_THERM2_CTL_TM_SELECT	(1ULL << 16) + +#define MSR_IA32_MISC_ENABLE		0x000001a0 + +#define MSR_IA32_TEMPERATURE_TARGET	0x000001a2 + +#define MSR_IA32_ENERGY_PERF_BIAS	0x000001b0 + +#define MSR_IA32_PACKAGE_THERM_STATUS		0x000001b1 + +#define PACKAGE_THERM_STATUS_PROCHOT		(1 << 0) +#define PACKAGE_THERM_STATUS_POWER_LIMIT	(1 << 10) + +#define MSR_IA32_PACKAGE_THERM_INTERRUPT	0x000001b2 + +#define PACKAGE_THERM_INT_HIGH_ENABLE		(1 << 0) +#define PACKAGE_THERM_INT_LOW_ENABLE		(1 << 1) +#define PACKAGE_THERM_INT_PLN_ENABLE		(1 << 24) + +/* Thermal Thresholds Support */ +#define THERM_INT_THRESHOLD0_ENABLE    (1 << 15) +#define THERM_SHIFT_THRESHOLD0        8 +#define THERM_MASK_THRESHOLD0          (0x7f << THERM_SHIFT_THRESHOLD0) +#define THERM_INT_THRESHOLD1_ENABLE    (1 << 23) +#define THERM_SHIFT_THRESHOLD1        16 +#define THERM_MASK_THRESHOLD1          (0x7f << THERM_SHIFT_THRESHOLD1) +#define THERM_STATUS_THRESHOLD0        (1 << 6) +#define THERM_LOG_THRESHOLD0           (1 << 7) +#define THERM_STATUS_THRESHOLD1        (1 << 8) +#define THERM_LOG_THRESHOLD1           (1 << 9) + +/* MISC_ENABLE bits: architectural */ +#define MSR_IA32_MISC_ENABLE_FAST_STRING	(1ULL << 0) +#define MSR_IA32_MISC_ENABLE_TCC		(1ULL << 1) +#define MSR_IA32_MISC_ENABLE_EMON		(1ULL << 7) +#define MSR_IA32_MISC_ENABLE_BTS_UNAVAIL	(1ULL << 11) +#define MSR_IA32_MISC_ENABLE_PEBS_UNAVAIL	(1ULL << 12) +#define MSR_IA32_MISC_ENABLE_ENHANCED_SPEEDSTEP	(1ULL << 16) +#define MSR_IA32_MISC_ENABLE_MWAIT		(1ULL << 18) +#define MSR_IA32_MISC_ENABLE_LIMIT_CPUID	(1ULL << 22) +#define MSR_IA32_MISC_ENABLE_XTPR_DISABLE	(1ULL << 23) +#define MSR_IA32_MISC_ENABLE_XD_DISABLE		(1ULL << 34) + +/* MISC_ENABLE bits: model-specific, meaning may vary from core to core */ +#define MSR_IA32_MISC_ENABLE_X87_COMPAT		(1ULL << 2) +#define MSR_IA32_MISC_ENABLE_TM1		(1ULL << 3) +#define MSR_IA32_MISC_ENABLE_SPLIT_LOCK_DISABLE	(1ULL << 4) +#define MSR_IA32_MISC_ENABLE_L3CACHE_DISABLE	(1ULL << 6) +#define MSR_IA32_MISC_ENABLE_SUPPRESS_LOCK	(1ULL << 8) +#define MSR_IA32_MISC_ENABLE_PREFETCH_DISABLE	(1ULL << 9) +#define MSR_IA32_MISC_ENABLE_FERR		(1ULL << 10) +#define MSR_IA32_MISC_ENABLE_FERR_MULTIPLEX	(1ULL << 10) +#define MSR_IA32_MISC_ENABLE_TM2		(1ULL << 13) +#define MSR_IA32_MISC_ENABLE_ADJ_PREF_DISABLE	(1ULL << 19) +#define MSR_IA32_MISC_ENABLE_SPEEDSTEP_LOCK	(1ULL << 20) +#define MSR_IA32_MISC_ENABLE_L1D_CONTEXT	(1ULL << 24) +#define MSR_IA32_MISC_ENABLE_DCU_PREF_DISABLE	(1ULL << 37) +#define MSR_IA32_MISC_ENABLE_TURBO_DISABLE	(1ULL << 38) +#define MSR_IA32_MISC_ENABLE_IP_PREF_DISABLE	(1ULL << 39) + +/* P4/Xeon+ specific */ +#define MSR_IA32_MCG_EAX		0x00000180 +#define MSR_IA32_MCG_EBX		0x00000181 +#define MSR_IA32_MCG_ECX		0x00000182 +#define MSR_IA32_MCG_EDX		0x00000183 +#define MSR_IA32_MCG_ESI		0x00000184 +#define MSR_IA32_MCG_EDI		0x00000185 +#define MSR_IA32_MCG_EBP		0x00000186 +#define MSR_IA32_MCG_ESP		0x00000187 +#define MSR_IA32_MCG_EFLAGS		0x00000188 +#define MSR_IA32_MCG_EIP		0x00000189 +#define MSR_IA32_MCG_RESERVED		0x0000018a + +/* Pentium IV performance counter MSRs */ +#define MSR_P4_BPU_PERFCTR0		0x00000300 +#define MSR_P4_BPU_PERFCTR1		0x00000301 +#define MSR_P4_BPU_PERFCTR2		0x00000302 +#define MSR_P4_BPU_PERFCTR3		0x00000303 +#define MSR_P4_MS_PERFCTR0		0x00000304 +#define MSR_P4_MS_PERFCTR1		0x00000305 +#define MSR_P4_MS_PERFCTR2		0x00000306 +#define MSR_P4_MS_PERFCTR3		0x00000307 +#define MSR_P4_FLAME_PERFCTR0		0x00000308 +#define MSR_P4_FLAME_PERFCTR1		0x00000309 +#define MSR_P4_FLAME_PERFCTR2		0x0000030a +#define MSR_P4_FLAME_PERFCTR3		0x0000030b +#define MSR_P4_IQ_PERFCTR0		0x0000030c +#define MSR_P4_IQ_PERFCTR1		0x0000030d +#define MSR_P4_IQ_PERFCTR2		0x0000030e +#define MSR_P4_IQ_PERFCTR3		0x0000030f +#define MSR_P4_IQ_PERFCTR4		0x00000310 +#define MSR_P4_IQ_PERFCTR5		0x00000311 +#define MSR_P4_BPU_CCCR0		0x00000360 +#define MSR_P4_BPU_CCCR1		0x00000361 +#define MSR_P4_BPU_CCCR2		0x00000362 +#define MSR_P4_BPU_CCCR3		0x00000363 +#define MSR_P4_MS_CCCR0			0x00000364 +#define MSR_P4_MS_CCCR1			0x00000365 +#define MSR_P4_MS_CCCR2			0x00000366 +#define MSR_P4_MS_CCCR3			0x00000367 +#define MSR_P4_FLAME_CCCR0		0x00000368 +#define MSR_P4_FLAME_CCCR1		0x00000369 +#define MSR_P4_FLAME_CCCR2		0x0000036a +#define MSR_P4_FLAME_CCCR3		0x0000036b +#define MSR_P4_IQ_CCCR0			0x0000036c +#define MSR_P4_IQ_CCCR1			0x0000036d +#define MSR_P4_IQ_CCCR2			0x0000036e +#define MSR_P4_IQ_CCCR3			0x0000036f +#define MSR_P4_IQ_CCCR4			0x00000370 +#define MSR_P4_IQ_CCCR5			0x00000371 +#define MSR_P4_ALF_ESCR0		0x000003ca +#define MSR_P4_ALF_ESCR1		0x000003cb +#define MSR_P4_BPU_ESCR0		0x000003b2 +#define MSR_P4_BPU_ESCR1		0x000003b3 +#define MSR_P4_BSU_ESCR0		0x000003a0 +#define MSR_P4_BSU_ESCR1		0x000003a1 +#define MSR_P4_CRU_ESCR0		0x000003b8 +#define MSR_P4_CRU_ESCR1		0x000003b9 +#define MSR_P4_CRU_ESCR2		0x000003cc +#define MSR_P4_CRU_ESCR3		0x000003cd +#define MSR_P4_CRU_ESCR4		0x000003e0 +#define MSR_P4_CRU_ESCR5		0x000003e1 +#define MSR_P4_DAC_ESCR0		0x000003a8 +#define MSR_P4_DAC_ESCR1		0x000003a9 +#define MSR_P4_FIRM_ESCR0		0x000003a4 +#define MSR_P4_FIRM_ESCR1		0x000003a5 +#define MSR_P4_FLAME_ESCR0		0x000003a6 +#define MSR_P4_FLAME_ESCR1		0x000003a7 +#define MSR_P4_FSB_ESCR0		0x000003a2 +#define MSR_P4_FSB_ESCR1		0x000003a3 +#define MSR_P4_IQ_ESCR0			0x000003ba +#define MSR_P4_IQ_ESCR1			0x000003bb +#define MSR_P4_IS_ESCR0			0x000003b4 +#define MSR_P4_IS_ESCR1			0x000003b5 +#define MSR_P4_ITLB_ESCR0		0x000003b6 +#define MSR_P4_ITLB_ESCR1		0x000003b7 +#define MSR_P4_IX_ESCR0			0x000003c8 +#define MSR_P4_IX_ESCR1			0x000003c9 +#define MSR_P4_MOB_ESCR0		0x000003aa +#define MSR_P4_MOB_ESCR1		0x000003ab +#define MSR_P4_MS_ESCR0			0x000003c0 +#define MSR_P4_MS_ESCR1			0x000003c1 +#define MSR_P4_PMH_ESCR0		0x000003ac +#define MSR_P4_PMH_ESCR1		0x000003ad +#define MSR_P4_RAT_ESCR0		0x000003bc +#define MSR_P4_RAT_ESCR1		0x000003bd +#define MSR_P4_SAAT_ESCR0		0x000003ae +#define MSR_P4_SAAT_ESCR1		0x000003af +#define MSR_P4_SSU_ESCR0		0x000003be +#define MSR_P4_SSU_ESCR1		0x000003bf /* guess: not in manual */ + +#define MSR_P4_TBPU_ESCR0		0x000003c2 +#define MSR_P4_TBPU_ESCR1		0x000003c3 +#define MSR_P4_TC_ESCR0			0x000003c4 +#define MSR_P4_TC_ESCR1			0x000003c5 +#define MSR_P4_U2L_ESCR0		0x000003b0 +#define MSR_P4_U2L_ESCR1		0x000003b1 + +#define MSR_P4_PEBS_MATRIX_VERT		0x000003f2 + +/* Intel Core-based CPU performance counters */ +#define MSR_CORE_PERF_FIXED_CTR0	0x00000309 +#define MSR_CORE_PERF_FIXED_CTR1	0x0000030a +#define MSR_CORE_PERF_FIXED_CTR2	0x0000030b +#define MSR_CORE_PERF_FIXED_CTR_CTRL	0x0000038d +#define MSR_CORE_PERF_GLOBAL_STATUS	0x0000038e +#define MSR_CORE_PERF_GLOBAL_CTRL	0x0000038f +#define MSR_CORE_PERF_GLOBAL_OVF_CTRL	0x00000390 + +/* Geode defined MSRs */ +#define MSR_GEODE_BUSCONT_CONF0		0x00001900 + +/* Intel VT MSRs */ +#define MSR_IA32_VMX_BASIC              0x00000480 +#define MSR_IA32_VMX_PINBASED_CTLS      0x00000481 +#define MSR_IA32_VMX_PROCBASED_CTLS     0x00000482 +#define MSR_IA32_VMX_EXIT_CTLS          0x00000483 +#define MSR_IA32_VMX_ENTRY_CTLS         0x00000484 +#define MSR_IA32_VMX_MISC               0x00000485 +#define MSR_IA32_VMX_CR0_FIXED0         0x00000486 +#define MSR_IA32_VMX_CR0_FIXED1         0x00000487 +#define MSR_IA32_VMX_CR4_FIXED0         0x00000488 +#define MSR_IA32_VMX_CR4_FIXED1         0x00000489 +#define MSR_IA32_VMX_VMCS_ENUM          0x0000048a +#define MSR_IA32_VMX_PROCBASED_CTLS2    0x0000048b +#define MSR_IA32_VMX_EPT_VPID_CAP       0x0000048c + +/* AMD-V MSRs */ + +#define MSR_VM_CR                       0xc0010114 +#define MSR_VM_IGNNE                    0xc0010115 +#define MSR_VM_HSAVE_PA                 0xc0010117 + +#endif /* _ASM_X86_MSR_INDEX_H */ diff --git a/roms/u-boot/arch/x86/include/asm/msr.h b/roms/u-boot/arch/x86/include/asm/msr.h new file mode 100644 index 00000000..3b5915d5 --- /dev/null +++ b/roms/u-boot/arch/x86/include/asm/msr.h @@ -0,0 +1,226 @@ +/* + * Taken from the linux kernel file of the same name + * + * (C) Copyright 2012 + * Graeme Russ, <graeme.russ@gmail.com> + * + * SPDX-License-Identifier:	GPL-2.0+ + */ + +#ifndef _ASM_X86_MSR_H +#define _ASM_X86_MSR_H + +#include <asm/msr-index.h> + +#ifndef __ASSEMBLY__ + +#include <linux/types.h> +#include <linux/ioctl.h> + +#define X86_IOC_RDMSR_REGS	_IOWR('c', 0xA0, __u32[8]) +#define X86_IOC_WRMSR_REGS	_IOWR('c', 0xA1, __u32[8]) + +#ifdef __KERNEL__ + +#include <asm/errno.h> + +struct msr { +	union { +		struct { +			u32 l; +			u32 h; +		}; +		u64 q; +	}; +}; + +struct msr_info { +	u32 msr_no; +	struct msr reg; +	struct msr *msrs; +	int err; +}; + +struct msr_regs_info { +	u32 *regs; +	int err; +}; + +static inline unsigned long long native_read_tscp(unsigned int *aux) +{ +	unsigned long low, high; +	asm volatile(".byte 0x0f,0x01,0xf9" +		     : "=a" (low), "=d" (high), "=c" (*aux)); +	return low | ((u64)high << 32); +} + +/* + * both i386 and x86_64 returns 64-bit value in edx:eax, but gcc's "A" + * constraint has different meanings. For i386, "A" means exactly + * edx:eax, while for x86_64 it doesn't mean rdx:rax or edx:eax. Instead, + * it means rax *or* rdx. + */ +#ifdef CONFIG_X86_64 +#define DECLARE_ARGS(val, low, high)	unsigned low, high +#define EAX_EDX_VAL(val, low, high)	((low) | ((u64)(high) << 32)) +#define EAX_EDX_ARGS(val, low, high)	"a" (low), "d" (high) +#define EAX_EDX_RET(val, low, high)	"=a" (low), "=d" (high) +#else +#define DECLARE_ARGS(val, low, high)	unsigned long long val +#define EAX_EDX_VAL(val, low, high)	(val) +#define EAX_EDX_ARGS(val, low, high)	"A" (val) +#define EAX_EDX_RET(val, low, high)	"=A" (val) +#endif + +static inline __attribute__((no_instrument_function)) +	unsigned long long native_read_msr(unsigned int msr) +{ +	DECLARE_ARGS(val, low, high); + +	asm volatile("rdmsr" : EAX_EDX_RET(val, low, high) : "c" (msr)); +	return EAX_EDX_VAL(val, low, high); +} + +static inline void native_write_msr(unsigned int msr, +				    unsigned low, unsigned high) +{ +	asm volatile("wrmsr" : : "c" (msr), "a"(low), "d" (high) : "memory"); +} + +extern unsigned long long native_read_tsc(void); + +extern int native_rdmsr_safe_regs(u32 regs[8]); +extern int native_wrmsr_safe_regs(u32 regs[8]); + +static inline unsigned long long native_read_pmc(int counter) +{ +	DECLARE_ARGS(val, low, high); + +	asm volatile("rdpmc" : EAX_EDX_RET(val, low, high) : "c" (counter)); +	return EAX_EDX_VAL(val, low, high); +} + +#ifdef CONFIG_PARAVIRT +#include <asm/paravirt.h> +#else +#include <errno.h> +/* + * Access to machine-specific registers (available on 586 and better only) + * Note: the rd* operations modify the parameters directly (without using + * pointer indirection), this allows gcc to optimize better + */ + +#define rdmsr(msr, val1, val2)					\ +do {								\ +	u64 __val = native_read_msr((msr));			\ +	(void)((val1) = (u32)__val);				\ +	(void)((val2) = (u32)(__val >> 32));			\ +} while (0) + +static inline void wrmsr(unsigned msr, unsigned low, unsigned high) +{ +	native_write_msr(msr, low, high); +} + +#define rdmsrl(msr, val)			\ +	((val) = native_read_msr((msr))) + +#define wrmsrl(msr, val)						\ +	native_write_msr((msr), (u32)((u64)(val)), (u32)((u64)(val) >> 32)) + +/* rdmsr with exception handling */ +#define rdmsr_safe(msr, p1, p2)					\ +({								\ +	int __err;						\ +	u64 __val = native_read_msr_safe((msr), &__err);	\ +	(*p1) = (u32)__val;					\ +	(*p2) = (u32)(__val >> 32);				\ +	__err;							\ +}) + +static inline int rdmsrl_amd_safe(unsigned msr, unsigned long long *p) +{ +	u32 gprs[8] = { 0 }; +	int err; + +	gprs[1] = msr; +	gprs[7] = 0x9c5a203a; + +	err = native_rdmsr_safe_regs(gprs); + +	*p = gprs[0] | ((u64)gprs[2] << 32); + +	return err; +} + +static inline int wrmsrl_amd_safe(unsigned msr, unsigned long long val) +{ +	u32 gprs[8] = { 0 }; + +	gprs[0] = (u32)val; +	gprs[1] = msr; +	gprs[2] = val >> 32; +	gprs[7] = 0x9c5a203a; + +	return native_wrmsr_safe_regs(gprs); +} + +static inline int rdmsr_safe_regs(u32 regs[8]) +{ +	return native_rdmsr_safe_regs(regs); +} + +static inline int wrmsr_safe_regs(u32 regs[8]) +{ +	return native_wrmsr_safe_regs(regs); +} + +#define rdtscl(low)						\ +	((low) = (u32)__native_read_tsc()) + +#define rdtscll(val)						\ +	((val) = __native_read_tsc()) + +#define rdpmc(counter, low, high)			\ +do {							\ +	u64 _l = native_read_pmc((counter));		\ +	(low)  = (u32)_l;				\ +	(high) = (u32)(_l >> 32);			\ +} while (0) + +#define rdtscp(low, high, aux)					\ +do {                                                            \ +	unsigned long long _val = native_read_tscp(&(aux));     \ +	(low) = (u32)_val;                                      \ +	(high) = (u32)(_val >> 32);                             \ +} while (0) + +#define rdtscpll(val, aux) (val) = native_read_tscp(&(aux)) + +#endif	/* !CONFIG_PARAVIRT */ + + +#define checking_wrmsrl(msr, val) wrmsr_safe((msr), (u32)(val),		\ +					     (u32)((val) >> 32)) + +#define write_tsc(val1, val2) wrmsr(MSR_IA32_TSC, (val1), (val2)) + +#define write_rdtscp_aux(val) wrmsr(MSR_TSC_AUX, (val), 0) + +struct msr *msrs_alloc(void); +void msrs_free(struct msr *msrs); + +#ifdef CONFIG_SMP +int rdmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 *l, u32 *h); +int wrmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 l, u32 h); +void rdmsr_on_cpus(const struct cpumask *mask, u32 msr_no, struct msr *msrs); +void wrmsr_on_cpus(const struct cpumask *mask, u32 msr_no, struct msr *msrs); +int rdmsr_safe_on_cpu(unsigned int cpu, u32 msr_no, u32 *l, u32 *h); +int wrmsr_safe_on_cpu(unsigned int cpu, u32 msr_no, u32 l, u32 h); +int rdmsr_safe_regs_on_cpu(unsigned int cpu, u32 regs[8]); +int wrmsr_safe_regs_on_cpu(unsigned int cpu, u32 regs[8]); + +#endif  /* CONFIG_SMP */ +#endif /* __KERNEL__ */ +#endif /* __ASSEMBLY__ */ +#endif /* _ASM_X86_MSR_H */ diff --git a/roms/u-boot/arch/x86/include/asm/pci.h b/roms/u-boot/arch/x86/include/asm/pci.h new file mode 100644 index 00000000..6b161881 --- /dev/null +++ b/roms/u-boot/arch/x86/include/asm/pci.h @@ -0,0 +1,16 @@ + +/* + * (C) Copyright 2002 + * Daniel Engström, Omicron Ceti AB, daniel@omicron.se + * + * SPDX-License-Identifier:	GPL-2.0+ + */ + +#ifndef _PCI_I386_H_ +#define _PCI_I386_H_ + +#define DEFINE_PCI_DEVICE_TABLE(_table) \ +	const struct pci_device_id _table[] + +void pci_setup_type1(struct pci_controller *hose); +#endif diff --git a/roms/u-boot/arch/x86/include/asm/posix_types.h b/roms/u-boot/arch/x86/include/asm/posix_types.h new file mode 100644 index 00000000..5529f327 --- /dev/null +++ b/roms/u-boot/arch/x86/include/asm/posix_types.h @@ -0,0 +1,80 @@ +#ifndef __ARCH_I386_POSIX_TYPES_H +#define __ARCH_I386_POSIX_TYPES_H + +/* + * This file is generally used by user-level software, so you need to + * be a little careful about namespace pollution etc.  Also, we cannot + * assume GCC is being used. + */ + +typedef unsigned short	__kernel_dev_t; +typedef unsigned long	__kernel_ino_t; +typedef unsigned short	__kernel_mode_t; +typedef unsigned short	__kernel_nlink_t; +typedef long		__kernel_off_t; +typedef int		__kernel_pid_t; +typedef unsigned short	__kernel_ipc_pid_t; +typedef unsigned short	__kernel_uid_t; +typedef unsigned short	__kernel_gid_t; +typedef unsigned int	__kernel_size_t; +typedef int		__kernel_ssize_t; +typedef int		__kernel_ptrdiff_t; +typedef long		__kernel_time_t; +typedef long		__kernel_suseconds_t; +typedef long		__kernel_clock_t; +typedef int		__kernel_daddr_t; +typedef char *		__kernel_caddr_t; +typedef unsigned short	__kernel_uid16_t; +typedef unsigned short	__kernel_gid16_t; +typedef unsigned int	__kernel_uid32_t; +typedef unsigned int	__kernel_gid32_t; + +typedef unsigned short	__kernel_old_uid_t; +typedef unsigned short	__kernel_old_gid_t; + +#ifdef __GNUC__ +typedef long long	__kernel_loff_t; +#endif + +typedef struct { +#if defined(__KERNEL__) || defined(__USE_ALL) +	int	val[2]; +#else /* !defined(__KERNEL__) && !defined(__USE_ALL) */ +	int	__val[2]; +#endif /* !defined(__KERNEL__) && !defined(__USE_ALL) */ +} __kernel_fsid_t; + +#if defined(__KERNEL__) || !defined(__GLIBC__) || (__GLIBC__ < 2) + +#undef	__FD_SET +#define __FD_SET(fd,fdsetp) \ +		__asm__ __volatile__("btsl %1,%0": \ +			"=m" (*(__kernel_fd_set *) (fdsetp)):"r" ((int) (fd))) + +#undef	__FD_CLR +#define __FD_CLR(fd,fdsetp) \ +		__asm__ __volatile__("btrl %1,%0": \ +			"=m" (*(__kernel_fd_set *) (fdsetp)):"r" ((int) (fd))) + +#undef	__FD_ISSET +#define __FD_ISSET(fd,fdsetp) (__extension__ ({ \ +		unsigned char __result; \ +		__asm__ __volatile__("btl %1,%2 ; setb %0" \ +			:"=q" (__result) :"r" ((int) (fd)), \ +			"m" (*(__kernel_fd_set *) (fdsetp))); \ +		__result; })) + +#undef	__FD_ZERO +#define __FD_ZERO(fdsetp) \ +do { \ +	int __d0, __d1; \ +	__asm__ __volatile__("cld ; rep ; stosl" \ +			:"=m" (*(__kernel_fd_set *) (fdsetp)), \ +			  "=&c" (__d0), "=&D" (__d1) \ +			:"a" (0), "1" (__FDSET_LONGS), \ +			"2" ((__kernel_fd_set *) (fdsetp)) : "memory"); \ +} while (0) + +#endif /* defined(__KERNEL__) || !defined(__GLIBC__) || (__GLIBC__ < 2) */ + +#endif diff --git a/roms/u-boot/arch/x86/include/asm/processor-flags.h b/roms/u-boot/arch/x86/include/asm/processor-flags.h new file mode 100644 index 00000000..7a3e836e --- /dev/null +++ b/roms/u-boot/arch/x86/include/asm/processor-flags.h @@ -0,0 +1,100 @@ +#ifndef _ASM_X86_PROCESSOR_FLAGS_H +#define _ASM_X86_PROCESSOR_FLAGS_H +/* Various flags defined: can be included from assembler. */ + +/* + * EFLAGS bits + */ +#define X86_EFLAGS_CF	0x00000001 /* Carry Flag */ +#define X86_EFLAGS_PF	0x00000004 /* Parity Flag */ +#define X86_EFLAGS_AF	0x00000010 /* Auxillary carry Flag */ +#define X86_EFLAGS_ZF	0x00000040 /* Zero Flag */ +#define X86_EFLAGS_SF	0x00000080 /* Sign Flag */ +#define X86_EFLAGS_TF	0x00000100 /* Trap Flag */ +#define X86_EFLAGS_IF	0x00000200 /* Interrupt Flag */ +#define X86_EFLAGS_DF	0x00000400 /* Direction Flag */ +#define X86_EFLAGS_OF	0x00000800 /* Overflow Flag */ +#define X86_EFLAGS_IOPL	0x00003000 /* IOPL mask */ +#define X86_EFLAGS_NT	0x00004000 /* Nested Task */ +#define X86_EFLAGS_RF	0x00010000 /* Resume Flag */ +#define X86_EFLAGS_VM	0x00020000 /* Virtual Mode */ +#define X86_EFLAGS_AC	0x00040000 /* Alignment Check */ +#define X86_EFLAGS_VIF	0x00080000 /* Virtual Interrupt Flag */ +#define X86_EFLAGS_VIP	0x00100000 /* Virtual Interrupt Pending */ +#define X86_EFLAGS_ID	0x00200000 /* CPUID detection flag */ + +/* + * Basic CPU control in CR0 + */ +#define X86_CR0_PE	0x00000001 /* Protection Enable */ +#define X86_CR0_MP	0x00000002 /* Monitor Coprocessor */ +#define X86_CR0_EM	0x00000004 /* Emulation */ +#define X86_CR0_TS	0x00000008 /* Task Switched */ +#define X86_CR0_ET	0x00000010 /* Extension Type */ +#define X86_CR0_NE	0x00000020 /* Numeric Error */ +#define X86_CR0_WP	0x00010000 /* Write Protect */ +#define X86_CR0_AM	0x00040000 /* Alignment Mask */ +#define X86_CR0_NW	0x20000000 /* Not Write-through */ +#define X86_CR0_CD	0x40000000 /* Cache Disable */ +#define X86_CR0_PG	0x80000000 /* Paging */ + +/* + * Paging options in CR3 + */ +#define X86_CR3_PWT	0x00000008 /* Page Write Through */ +#define X86_CR3_PCD	0x00000010 /* Page Cache Disable */ + +/* + * Intel CPU features in CR4 + */ +#define X86_CR4_VME	0x00000001 /* enable vm86 extensions */ +#define X86_CR4_PVI	0x00000002 /* virtual interrupts flag enable */ +#define X86_CR4_TSD	0x00000004 /* disable time stamp at ipl 3 */ +#define X86_CR4_DE	0x00000008 /* enable debugging extensions */ +#define X86_CR4_PSE	0x00000010 /* enable page size extensions */ +#define X86_CR4_PAE	0x00000020 /* enable physical address extensions */ +#define X86_CR4_MCE	0x00000040 /* Machine check enable */ +#define X86_CR4_PGE	0x00000080 /* enable global pages */ +#define X86_CR4_PCE	0x00000100 /* enable performance counters at ipl 3 */ +#define X86_CR4_OSFXSR	0x00000200 /* enable fast FPU save and restore */ +#define X86_CR4_OSXMMEXCPT 0x00000400 /* enable unmasked SSE exceptions */ +#define X86_CR4_VMXE	0x00002000 /* enable VMX virtualization */ +#define X86_CR4_OSXSAVE 0x00040000 /* enable xsave and xrestore */ + +/* + * x86-64 Task Priority Register, CR8 + */ +#define X86_CR8_TPR	0x0000000F /* task priority register */ + +/* + * AMD and Transmeta use MSRs for configuration; see <asm/msr-index.h> + */ + +/* + *      NSC/Cyrix CPU configuration register indexes + */ +#define CX86_PCR0	0x20 +#define CX86_GCR	0xb8 +#define CX86_CCR0	0xc0 +#define CX86_CCR1	0xc1 +#define CX86_CCR2	0xc2 +#define CX86_CCR3	0xc3 +#define CX86_CCR4	0xe8 +#define CX86_CCR5	0xe9 +#define CX86_CCR6	0xea +#define CX86_CCR7	0xeb +#define CX86_PCR1	0xf0 +#define CX86_DIR0	0xfe +#define CX86_DIR1	0xff +#define CX86_ARR_BASE	0xc4 +#define CX86_RCR_BASE	0xdc + +#ifdef __KERNEL__ +#ifdef CONFIG_VM86 +#define X86_VM_MASK	X86_EFLAGS_VM +#else +#define X86_VM_MASK	0 /* No VM86 support */ +#endif +#endif + +#endif /* _ASM_X86_PROCESSOR_FLAGS_H */ diff --git a/roms/u-boot/arch/x86/include/asm/processor.h b/roms/u-boot/arch/x86/include/asm/processor.h new file mode 100644 index 00000000..bb3172ff --- /dev/null +++ b/roms/u-boot/arch/x86/include/asm/processor.h @@ -0,0 +1,33 @@ +/* + * (C) Copyright 2002 + * Daniel Engström, Omicron Ceti AB, daniel@omicron.se + * + * SPDX-License-Identifier:	GPL-2.0+ + */ + +#ifndef __ASM_PROCESSOR_H_ +#define __ASM_PROCESSOR_H_ 1 + +#define X86_GDT_ENTRY_SIZE	8 + +#ifndef __ASSEMBLY__ + +enum { +	X86_GDT_ENTRY_NULL = 0, +	X86_GDT_ENTRY_UNUSED, +	X86_GDT_ENTRY_32BIT_CS, +	X86_GDT_ENTRY_32BIT_DS, +	X86_GDT_ENTRY_32BIT_FS, +	X86_GDT_ENTRY_16BIT_CS, +	X86_GDT_ENTRY_16BIT_DS, +	X86_GDT_NUM_ENTRIES +}; +#else +/* NOTE: If the above enum is modified, this define must be checked */ +#define X86_GDT_ENTRY_32BIT_DS	3 +#define X86_GDT_NUM_ENTRIES	7 +#endif + +#define X86_GDT_SIZE		(X86_GDT_NUM_ENTRIES * X86_GDT_ENTRY_SIZE) + +#endif diff --git a/roms/u-boot/arch/x86/include/asm/ptrace.h b/roms/u-boot/arch/x86/include/asm/ptrace.h new file mode 100644 index 00000000..a727dbfb --- /dev/null +++ b/roms/u-boot/arch/x86/include/asm/ptrace.h @@ -0,0 +1,90 @@ +#ifndef _I386_PTRACE_H +#define _I386_PTRACE_H + +#include <asm/types.h> + +#define EBX 0 +#define ECX 1 +#define EDX 2 +#define ESI 3 +#define EDI 4 +#define EBP 5 +#define EAX 6 +#define DS 7 +#define ES 8 +#define FS 9 +#define GS 10 +#define ORIG_EAX 11 +#define EIP 12 +#define CS  13 +#define EFL 14 +#define UESP 15 +#define SS   16 +#define FRAME_SIZE 17 + +/* this struct defines the way the registers are stored on the +   stack during a system call. */ + +struct pt_regs { +	long ebx; +	long ecx; +	long edx; +	long esi; +	long edi; +	long ebp; +	long eax; +	int  xds; +	int  xes; +	int  xfs; +	int  xgs; +	long orig_eax; +	long eip; +	int  xcs; +	long eflags; +	long esp; +	int  xss; +}  __attribute__ ((packed)); + +struct irq_regs { +	/* Pushed by irq_common_entry */ +	long ebx; +	long ecx; +	long edx; +	long esi; +	long edi; +	long ebp; +	long esp; +	long eax; +	long xds; +	long xes; +	long xfs; +	long xgs; +	long xss; +	/* Pushed by vector handler (irq_<num>) */ +	long irq_id; +	/* Pushed by cpu in response to interrupt */ +	long eip; +	long xcs; +	long eflags; +}  __attribute__ ((packed)); + +/* Arbitrarily choose the same ptrace numbers as used by the Sparc code. */ +#define PTRACE_GETREGS            12 +#define PTRACE_SETREGS            13 +#define PTRACE_GETFPREGS          14 +#define PTRACE_SETFPREGS          15 +#define PTRACE_GETFPXREGS         18 +#define PTRACE_SETFPXREGS         19 + +#define PTRACE_SETOPTIONS         21 + +/* options set using PTRACE_SETOPTIONS */ +#define PTRACE_O_TRACESYSGOOD     0x00000001 + +#ifdef __KERNEL__ +#define user_mode(regs) ((VM_MASK & (regs)->eflags) || (3 & (regs)->xcs)) +#define instruction_pointer(regs) ((regs)->eip) +extern void show_regs(struct pt_regs *); +#endif + +#endif diff --git a/roms/u-boot/arch/x86/include/asm/relocate.h b/roms/u-boot/arch/x86/include/asm/relocate.h new file mode 100644 index 00000000..eb186b9f --- /dev/null +++ b/roms/u-boot/arch/x86/include/asm/relocate.h @@ -0,0 +1,18 @@ +/* + * (C) Copyright 2011 + * Graeme Russ, <graeme.russ@gmail.com> + * + * SPDX-License-Identifier:	GPL-2.0+ + */ + +#ifndef _RELOCATE_H_ +#define _RELOCATE_H_ + +#include <common.h> + +int copy_uboot_to_ram(void); +int copy_fdt_to_ram(void); +int clear_bss(void); +int do_elf_reloc_fixups(void); + +#endif	/* !_RELOCATE_H_ */ diff --git a/roms/u-boot/arch/x86/include/asm/sections.h b/roms/u-boot/arch/x86/include/asm/sections.h new file mode 100644 index 00000000..22d7f5af --- /dev/null +++ b/roms/u-boot/arch/x86/include/asm/sections.h @@ -0,0 +1,11 @@ +/* + * Copyright (c) 2012 The Chromium OS Authors. + * SPDX-License-Identifier:	GPL-2.0+ + */ + +#ifndef __ASM_X86_SECTIONS_H +#define __ASM_X86_SECTIONS_H + +#include <asm-generic/sections.h> + +#endif diff --git a/roms/u-boot/arch/x86/include/asm/string.h b/roms/u-boot/arch/x86/include/asm/string.h new file mode 100644 index 00000000..0ad612f6 --- /dev/null +++ b/roms/u-boot/arch/x86/include/asm/string.h @@ -0,0 +1,32 @@ +#ifndef __ASM_I386_STRING_H +#define __ASM_I386_STRING_H + +/* + * We don't do inline string functions, since the + * optimised inline asm versions are not small. + */ +#undef __HAVE_ARCH_STRNCPY +extern char *strncpy(char *__dest, __const__ char *__src, __kernel_size_t __n); + +#undef __HAVE_ARCH_STRRCHR +extern char * strrchr(const char * s, int c); + +#undef __HAVE_ARCH_STRCHR +extern char * strchr(const char * s, int c); + +#define __HAVE_ARCH_MEMCPY +extern void * memcpy(void *, const void *, __kernel_size_t); + +#undef __HAVE_ARCH_MEMMOVE +extern void * memmove(void *, const void *, __kernel_size_t); + +#undef __HAVE_ARCH_MEMCHR +extern void * memchr(const void *, int, __kernel_size_t); + +#define __HAVE_ARCH_MEMSET +extern void * memset(void *, int, __kernel_size_t); + +#undef __HAVE_ARCH_MEMZERO +extern void memzero(void *ptr, __kernel_size_t n); + +#endif diff --git a/roms/u-boot/arch/x86/include/asm/types.h b/roms/u-boot/arch/x86/include/asm/types.h new file mode 100644 index 00000000..e9fde88f --- /dev/null +++ b/roms/u-boot/arch/x86/include/asm/types.h @@ -0,0 +1,53 @@ +#ifndef __ASM_I386_TYPES_H +#define __ASM_I386_TYPES_H + +typedef unsigned short umode_t; + +/* + * __xx is ok: it doesn't pollute the POSIX namespace. Use these in the + * header files exported to user space + */ + +typedef __signed__ char __s8; +typedef unsigned char __u8; + +typedef __signed__ short __s16; +typedef unsigned short __u16; + +typedef __signed__ int __s32; +typedef unsigned int __u32; + +#if defined(__GNUC__) +__extension__ typedef __signed__ long long __s64; +__extension__ typedef unsigned long long __u64; +#endif + +/* + * These aren't exported outside the kernel to avoid name space clashes + */ +#ifdef __KERNEL__ + +typedef signed char s8; +typedef unsigned char u8; + +typedef signed short s16; +typedef unsigned short u16; + +typedef signed int s32; +typedef unsigned int u32; + +typedef signed long long s64; +typedef unsigned long long u64; + +#define BITS_PER_LONG 32 + +/* Dma addresses are 32-bits wide.  */ + +typedef u32 dma_addr_t; + +typedef unsigned long long phys_addr_t; +typedef unsigned long long phys_size_t; + +#endif /* __KERNEL__ */ + +#endif diff --git a/roms/u-boot/arch/x86/include/asm/u-boot-x86.h b/roms/u-boot/arch/x86/include/asm/u-boot-x86.h new file mode 100644 index 00000000..9e525dd7 --- /dev/null +++ b/roms/u-boot/arch/x86/include/asm/u-boot-x86.h @@ -0,0 +1,62 @@ +/* + * (C) Copyright 2002 + * Daniel Engström, Omicron Ceti AB, daniel@omicron.se. + * + * SPDX-License-Identifier:	GPL-2.0+ + */ + +#ifndef _U_BOOT_I386_H_ +#define _U_BOOT_I386_H_	1 + +/* cpu/.../cpu.c */ +int x86_cpu_init_r(void); +int cpu_init_r(void); +int x86_cpu_init_f(void); +int cpu_init_f(void); +void init_gd(gd_t *id, u64 *gdt_addr); +void setup_gdt(gd_t *id, u64 *gdt_addr); +int init_cache(void); +int cleanup_before_linux(void); +void panic_puts(const char *str); + +/* cpu/.../timer.c */ +void timer_isr(void *); +typedef void (timer_fnc_t) (void); +int register_timer_isr (timer_fnc_t *isr_func); +unsigned long get_tbclk_mhz(void); +void timer_set_base(uint64_t base); +int pcat_timer_init(void); + +/* Architecture specific - can be in arch/x86/cpu/, arch/x86/lib/, or $(BOARD)/ */ +int dram_init_f(void); + +/* cpu/.../interrupts.c */ +int cpu_init_interrupts(void); + +/* board/.../... */ +int dram_init(void); + +void setup_pcat_compatibility(void); + +void isa_unmap_rom(u32 addr); +u32 isa_map_rom(u32 bus_addr, int size); + +/* arch/x86/lib/... */ +int video_bios_init(void); + +void	board_init_f_r_trampoline(ulong) __attribute__ ((noreturn)); +void	board_init_f_r(void) __attribute__ ((noreturn)); + +/* Read the time stamp counter */ +static inline __attribute__((no_instrument_function)) uint64_t rdtsc(void) +{ +	uint32_t high, low; +	__asm__ __volatile__("rdtsc" : "=a" (low), "=d" (high)); +	return (((uint64_t)high) << 32) | low; +} + +/* board/... */ +void timer_set_tsc_base(uint64_t new_base); +uint64_t timer_get_tsc(void); + +#endif	/* _U_BOOT_I386_H_ */ diff --git a/roms/u-boot/arch/x86/include/asm/u-boot.h b/roms/u-boot/arch/x86/include/asm/u-boot.h new file mode 100644 index 00000000..623771a3 --- /dev/null +++ b/roms/u-boot/arch/x86/include/asm/u-boot.h @@ -0,0 +1,29 @@ +/* + * (C) Copyright 2002 + * Sysgo Real-Time Solutions, GmbH <www.elinos.com> + * Marius Groeger <mgroeger@sysgo.de> + * + * (C) Copyright 2002 + * Sysgo Real-Time Solutions, GmbH <www.elinos.com> + * Alex Zuepke <azu@sysgo.de> + * + * SPDX-License-Identifier:	GPL-2.0+ + * + ******************************************************************** + * NOTE: This header file defines an interface to U-Boot. Including + * this (unmodified) header file in another file is considered normal + * use of U-Boot, and does *not* fall under the heading of "derived + * work". + ******************************************************************** + */ + +#ifndef _U_BOOT_H_ +#define _U_BOOT_H_	1 + +/* Use the generic board which requires a unified bd_info */ +#include <asm-generic/u-boot.h> + +/* For image.h:image_check_target_arch() */ +#define IH_ARCH_DEFAULT IH_ARCH_I386 + +#endif	/* _U_BOOT_H_ */ diff --git a/roms/u-boot/arch/x86/include/asm/unaligned.h b/roms/u-boot/arch/x86/include/asm/unaligned.h new file mode 100644 index 00000000..6cecbbb2 --- /dev/null +++ b/roms/u-boot/arch/x86/include/asm/unaligned.h @@ -0,0 +1 @@ +#include <asm-generic/unaligned.h> diff --git a/roms/u-boot/arch/x86/include/asm/video/edid.h b/roms/u-boot/arch/x86/include/asm/video/edid.h new file mode 100644 index 00000000..928c342b --- /dev/null +++ b/roms/u-boot/arch/x86/include/asm/video/edid.h @@ -0,0 +1,16 @@ +#ifndef __linux_video_edid_h__ +#define __linux_video_edid_h__ + +#if !defined(__KERNEL__) || defined(CONFIG_X86) + +struct edid_info { +	unsigned char dummy[128]; +}; + +#ifdef __KERNEL__ +extern struct edid_info edid_info; +#endif /* __KERNEL__ */ + +#endif + +#endif /* __linux_video_edid_h__ */ diff --git a/roms/u-boot/arch/x86/include/asm/zimage.h b/roms/u-boot/arch/x86/include/asm/zimage.h new file mode 100644 index 00000000..0f366626 --- /dev/null +++ b/roms/u-boot/arch/x86/include/asm/zimage.h @@ -0,0 +1,44 @@ +/* + * (C) Copyright 2002 + * Daniel Engström, Omicron Ceti AB, daniel@omicron.se + * + * SPDX-License-Identifier:	GPL-2.0+ + */ + +#ifndef _ASM_ZIMAGE_H_ +#define _ASM_ZIMAGE_H_ + +#include <asm/bootparam.h> +#include <asm/e820.h> + +/* linux i386 zImage/bzImage header. Offsets relative to + * the start of the image */ + +#define HEAP_FLAG           0x80 +#define BIG_KERNEL_FLAG     0x01 + +/* magic numbers */ +#define KERNEL_MAGIC        0xaa55 +#define KERNEL_V2_MAGIC     0x53726448 +#define COMMAND_LINE_MAGIC  0xA33F + +/* limits */ +#define BZIMAGE_MAX_SIZE   15*1024*1024     /* 15MB */ +#define ZIMAGE_MAX_SIZE    512*1024         /* 512k */ +#define SETUP_MAX_SIZE     32768 + +#define SETUP_START_OFFSET 0x200 +#define BZIMAGE_LOAD_ADDR  0x100000 +#define ZIMAGE_LOAD_ADDR   0x10000 + +/* Implementation defined function to install an e820 map. */ +unsigned install_e820_map(unsigned max_entries, struct e820entry *); + +struct boot_params *load_zimage(char *image, unsigned long kernel_size, +				void **load_address); +int setup_zimage(struct boot_params *setup_base, char *cmd_line, int auto_boot, +		 unsigned long initrd_addr, unsigned long initrd_size); + +void boot_zimage(void *setup_base, void *load_address); + +#endif  | 
