diff options
| -rw-r--r-- | arch/i386/include/asm/bootparam.h | 123 | ||||
| -rw-r--r-- | arch/i386/include/asm/e820.h | 155 | ||||
| -rw-r--r-- | arch/i386/include/asm/ioctl.h | 1 | ||||
| -rw-r--r-- | arch/i386/include/asm/ist.h | 34 | ||||
| -rw-r--r-- | arch/i386/include/asm/video/edid.h | 16 | ||||
| -rw-r--r-- | arch/i386/lib/zimage.c | 127 | ||||
| -rw-r--r-- | include/asm-generic/ioctl.h | 105 | ||||
| -rw-r--r-- | include/linux/apm_bios.h | 220 | ||||
| -rw-r--r-- | include/linux/compiler-gcc.h | 87 | ||||
| -rw-r--r-- | include/linux/compiler-gcc4.h | 61 | ||||
| -rw-r--r-- | include/linux/compiler.h | 303 | ||||
| -rw-r--r-- | include/linux/edd.h | 194 | ||||
| -rw-r--r-- | include/linux/ioctl.h | 6 | ||||
| -rw-r--r-- | include/linux/ioport.h | 192 | ||||
| -rw-r--r-- | include/linux/screen_info.h | 84 | 
15 files changed, 1676 insertions, 32 deletions
| diff --git a/arch/i386/include/asm/bootparam.h b/arch/i386/include/asm/bootparam.h new file mode 100644 index 000000000..64d2e1f13 --- /dev/null +++ b/arch/i386/include/asm/bootparam.h @@ -0,0 +1,123 @@ +#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/arch/i386/include/asm/e820.h b/arch/i386/include/asm/e820.h new file mode 100644 index 000000000..d155ce9ce --- /dev/null +++ b/arch/i386/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/arch/i386/include/asm/ioctl.h b/arch/i386/include/asm/ioctl.h new file mode 100644 index 000000000..b279fe06d --- /dev/null +++ b/arch/i386/include/asm/ioctl.h @@ -0,0 +1 @@ +#include <asm-generic/ioctl.h> diff --git a/arch/i386/include/asm/ist.h b/arch/i386/include/asm/ist.h new file mode 100644 index 000000000..7e5dff1de --- /dev/null +++ b/arch/i386/include/asm/ist.h @@ -0,0 +1,34 @@ +#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> + * + * 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; either version 2, or (at your option) any + * later version. + * + * 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. + */ + + +#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/arch/i386/include/asm/video/edid.h b/arch/i386/include/asm/video/edid.h new file mode 100644 index 000000000..928c342b3 --- /dev/null +++ b/arch/i386/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/arch/i386/lib/zimage.c b/arch/i386/lib/zimage.c index c3b4e597a..b39615a3e 100644 --- a/arch/i386/lib/zimage.c +++ b/arch/i386/lib/zimage.c @@ -34,6 +34,8 @@  #include <asm/zimage.h>  #include <asm/realmode.h>  #include <asm/byteorder.h> +#include <asm/bootparam.h> +#include <asm/ic/sc520.h>  /*   * Memory lay-out: @@ -90,48 +92,56 @@ void *load_zimage(char *image, unsigned long kernel_size,  	int big_image;  	void *load_address; +	struct setup_header *hdr = (struct setup_header *)(image + SETUP_SECTS_OFF);  	setup_base = (void*)DEFAULT_SETUP_BASE;	/* base address for real-mode segment */ -	if (KERNEL_MAGIC != *(u16*)(image + BOOT_FLAG_OFF)) { -		printf("Error: Invalid kernel magic (found 0x%04x, expected 0xaa55)\n", -		       *(u16*)(image + BOOT_FLAG_OFF)); +	if (KERNEL_MAGIC != hdr->boot_flag) { +		printf("Error: Invalid Boot Flag (found 0x%04x, expected 0x%04x)\n", +				hdr->boot_flag, KERNEL_MAGIC);  		return 0; +	} else { +		printf("Valid Boot Flag\n");  	} -  	/* determine boot protocol version */ -	if (KERNEL_V2_MAGIC == *(u32*)(image+HEADER_OFF)) { -		bootproto = *(u16*)(image+VERSION_OFF); +	if (KERNEL_V2_MAGIC == hdr->header) { +		printf("Magic signature found\n"); + +		bootproto = hdr->version;  	} else {  		/* Very old kernel */ +		printf("Magic signature not found\n");  		bootproto = 0x0100;  	}  	/* determine size of setup */ -	if (0 == *(u8*)(image + SETUP_SECTS_OFF)) { +	if (0 == hdr->setup_sects) { +		printf("Setup Sectors = 0 (defaulting to 4)\n");  		setup_size = 5 * 512;  	} else { -		setup_size = (*(u8*)(image + SETUP_SECTS_OFF) + 1) * 512; +		setup_size = (hdr->setup_sects + 1) * 512;  	} +	printf("Setup Size = 0x%8.8lx\n", (ulong)setup_size); +  	if (setup_size > SETUP_MAX_SIZE) {  		printf("Error: Setup is too large (%d bytes)\n", setup_size);  	}  	/* Determine image type */ -	big_image = (bootproto >= 0x0200) && (*(u8*)(image + LOADFLAGS_OFF) & BIG_KERNEL_FLAG); +	big_image = (bootproto >= 0x0200) && (hdr->loadflags & BIG_KERNEL_FLAG); -	/* Derermine load address */ -	load_address = (void*)(big_image ? BZIMAGE_LOAD_ADDR:ZIMAGE_LOAD_ADDR); +	/* Determine load address */ +	load_address = (void*)(big_image ? BZIMAGE_LOAD_ADDR : ZIMAGE_LOAD_ADDR);  	/* load setup */ +	printf("Moving Real-Mode Code to 0x%8.8lx (%d bytes)\n", (ulong)setup_base, setup_size);  	memmove(setup_base, image, setup_size);  	printf("Using boot protocol version %x.%02x\n",  	       (bootproto & 0xff00) >> 8, bootproto & 0xff); -  	if (bootproto == 0x0100) {  		*(u16*)(setup_base + CMD_LINE_MAGIC_OFF) = COMMAND_LINE_MAGIC; @@ -154,48 +164,58 @@ void *load_zimage(char *image, unsigned long kernel_size,  		memset((void*)0x90000 + setup_size, 0, SETUP_MAX_SIZE-setup_size);  	} +	/* We are now setting up the real-mode version of the header */ +	hdr = (struct setup_header *)(setup_base + SETUP_SECTS_OFF); +  	if (bootproto >= 0x0200) { -		*(u8*)(setup_base + TYPE_OF_LOADER_OFF) = 0xff; -		printf("Linux kernel version %s\n", -		       (char*)(setup_base + SETUP_START_OFFSET + -			       *(u16*)(setup_base + START_SYS_OFF + 2))); +		hdr->type_of_loader = 8; + +		if (hdr->setup_sects >= 15) +			printf("Linux kernel version %s\n", (char *) +					(setup_base + (hdr->kernel_version + 0x200))); +		else +			printf("Setup Sectors < 15 - Cannot print kernel version.\n");  		if (initrd_addr) {  			printf("Initial RAM disk at linear address 0x%08lx, size %ld bytes\n",  			       initrd_addr, initrd_size); -			*(u32*)(setup_base + RAMDISK_IMAGE_OFF) = initrd_addr; -			*(u32*)(setup_base + RAMDISK_SIZE_OFF)=initrd_size; +			hdr->ramdisk_image = initrd_addr; +			hdr->ramdisk_size = initrd_size;  		}  	}  	if (bootproto >= 0x0201) { -		*(u16*)(setup_base + HEAP_END_PTR_OFF) = HEAP_END_OFFSET; - -		/* CAN_USE_HEAP */ -		*(u8*)(setup_base + LOADFLAGS_OFF) = -			*(u8*)(setup_base + LOADFLAGS_OFF) | HEAP_FLAG; +		hdr->heap_end_ptr = HEAP_END_OFFSET; +		hdr->loadflags |= HEAP_FLAG;  	}  	if (bootproto >= 0x0202) { -		*(u32*)(setup_base + CMD_LINE_PTR_OFF) = (u32)setup_base + COMMAND_LINE_OFFSET; +		hdr->cmd_line_ptr = (u32)setup_base + COMMAND_LINE_OFFSET;  	} else if (bootproto >= 0x0200) { +  		*(u16*)(setup_base + CMD_LINE_MAGIC_OFF) = COMMAND_LINE_MAGIC;  		*(u16*)(setup_base + CMD_LINE_OFFSET_OFF) = COMMAND_LINE_OFFSET; -		*(u16*)(setup_base + SETUP_MOVE_SIZE_OFF) = 0x9100; + +		hdr->setup_move_size = 0x9100;  	} +	if (bootproto >= 0x0204) +		kernel_size = hdr->syssize * 16; +	else +		kernel_size -= setup_size; +  	if (big_image) { -		if ((kernel_size - setup_size) > BZIMAGE_MAX_SIZE) { +		if ((kernel_size) > BZIMAGE_MAX_SIZE) {  			printf("Error: bzImage kernel too big! (size: %ld, max: %d)\n", -			       kernel_size - setup_size, BZIMAGE_MAX_SIZE); +			       kernel_size, BZIMAGE_MAX_SIZE);  			return 0;  		} -	} else if ((kernel_size - setup_size) > ZIMAGE_MAX_SIZE) { +	} else if ((kernel_size) > ZIMAGE_MAX_SIZE) {  		printf("Error: zImage kernel too big! (size: %ld, max: %d)\n", -		       kernel_size - setup_size, ZIMAGE_MAX_SIZE); +		       kernel_size, ZIMAGE_MAX_SIZE);  		return 0;  	} @@ -203,10 +223,10 @@ void *load_zimage(char *image, unsigned long kernel_size,  	build_command_line(setup_base + COMMAND_LINE_OFFSET, auto_boot);  	printf("Loading %czImage at address 0x%08x (%ld bytes)\n", big_image ? 'b' : ' ', -	       (u32)load_address, kernel_size - setup_size); +	       (u32)load_address, kernel_size); -	memmove(load_address, image + setup_size, kernel_size - setup_size); +	memmove(load_address, image + setup_size, kernel_size);  	/* ready for booting */  	return setup_base; @@ -218,8 +238,51 @@ void boot_zimage(void *setup_base)  	memset(®s, 0, sizeof(struct pt_regs));  	regs.xds = (u32)setup_base >> 4; -	regs.xss = 0x9000; +	regs.xes = regs.xds; +	regs.xss = regs.xds;  	regs.esp = 0x9000;  	regs.eflags = 0;  	enter_realmode(((u32)setup_base+SETUP_START_OFFSET)>>4, 0, ®s, ®s);  } + +int do_zboot (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) +{ +	void *base_ptr; +	void *bzImage_addr; +	ulong bzImage_size = 0; + +	disable_interrupts(); + +	/* Setup board for maximum PC/AT Compatibility */ +	setup_pcat_compatibility(); + +	/* argv[1] holds the address of the bzImage */ +	bzImage_addr = (void *)simple_strtoul(argv[1], NULL, 16); + +	if (argc == 3) +		bzImage_size = simple_strtoul(argv[2], NULL, 16); + +	/* Lets look for*/ +	base_ptr = load_zimage (bzImage_addr, bzImage_size, 0, 0, 0); + +	if (NULL == base_ptr) { +		printf ("## Kernel loading failed ...\n"); +	} else { +		printf ("## Transferring control to Linux (at address %08x) ...\n", +			(u32)base_ptr); + +		/* we assume that the kernel is in place */ +		printf("\nStarting kernel ...\n\n"); + +		boot_zimage(base_ptr); +		/* does not return */ +	} + +	return -1; +} + +U_BOOT_CMD( +	zboot, 3, 0,	do_zboot, +	"Boot bzImage", +	"" +); diff --git a/include/asm-generic/ioctl.h b/include/asm-generic/ioctl.h new file mode 100644 index 000000000..15828b2d6 --- /dev/null +++ b/include/asm-generic/ioctl.h @@ -0,0 +1,105 @@ +#ifndef _ASM_GENERIC_IOCTL_H +#define _ASM_GENERIC_IOCTL_H + +/* ioctl command encoding: 32 bits total, command in lower 16 bits, + * size of the parameter structure in the lower 14 bits of the + * upper 16 bits. + * Encoding the size of the parameter structure in the ioctl request + * is useful for catching programs compiled with old versions + * and to avoid overwriting user space outside the user buffer area. + * The highest 2 bits are reserved for indicating the ``access mode''. + * NOTE: This limits the max parameter size to 16kB -1 ! + */ + +/* + * The following is for compatibility across the various Linux + * platforms.  The generic ioctl numbering scheme doesn't really enforce + * a type field.  De facto, however, the top 8 bits of the lower 16 + * bits are indeed used as a type field, so we might just as well make + * this explicit here.  Please be sure to use the decoding macros + * below from now on. + */ +#define _IOC_NRBITS	8 +#define _IOC_TYPEBITS	8 + +/* + * Let any architecture override either of the following before + * including this file. + */ + +#ifndef _IOC_SIZEBITS +# define _IOC_SIZEBITS	14 +#endif + +#ifndef _IOC_DIRBITS +# define _IOC_DIRBITS	2 +#endif + +#define _IOC_NRMASK	((1 << _IOC_NRBITS)-1) +#define _IOC_TYPEMASK	((1 << _IOC_TYPEBITS)-1) +#define _IOC_SIZEMASK	((1 << _IOC_SIZEBITS)-1) +#define _IOC_DIRMASK	((1 << _IOC_DIRBITS)-1) + +#define _IOC_NRSHIFT	0 +#define _IOC_TYPESHIFT	(_IOC_NRSHIFT+_IOC_NRBITS) +#define _IOC_SIZESHIFT	(_IOC_TYPESHIFT+_IOC_TYPEBITS) +#define _IOC_DIRSHIFT	(_IOC_SIZESHIFT+_IOC_SIZEBITS) + +/* + * Direction bits, which any architecture can choose to override + * before including this file. + */ + +#ifndef _IOC_NONE +# define _IOC_NONE	0U +#endif + +#ifndef _IOC_WRITE +# define _IOC_WRITE	1U +#endif + +#ifndef _IOC_READ +# define _IOC_READ	2U +#endif + +#define _IOC(dir,type,nr,size) \ +	(((dir)  << _IOC_DIRSHIFT) | \ +	 ((type) << _IOC_TYPESHIFT) | \ +	 ((nr)   << _IOC_NRSHIFT) | \ +	 ((size) << _IOC_SIZESHIFT)) + +#ifdef __KERNEL__ +/* provoke compile error for invalid uses of size argument */ +extern unsigned int __invalid_size_argument_for_IOC; +#define _IOC_TYPECHECK(t) \ +	((sizeof(t) == sizeof(t[1]) && \ +	  sizeof(t) < (1 << _IOC_SIZEBITS)) ? \ +	  sizeof(t) : __invalid_size_argument_for_IOC) +#else +#define _IOC_TYPECHECK(t) (sizeof(t)) +#endif + +/* used to create numbers */ +#define _IO(type,nr)		_IOC(_IOC_NONE,(type),(nr),0) +#define _IOR(type,nr,size)	_IOC(_IOC_READ,(type),(nr),(_IOC_TYPECHECK(size))) +#define _IOW(type,nr,size)	_IOC(_IOC_WRITE,(type),(nr),(_IOC_TYPECHECK(size))) +#define _IOWR(type,nr,size)	_IOC(_IOC_READ|_IOC_WRITE,(type),(nr),(_IOC_TYPECHECK(size))) +#define _IOR_BAD(type,nr,size)	_IOC(_IOC_READ,(type),(nr),sizeof(size)) +#define _IOW_BAD(type,nr,size)	_IOC(_IOC_WRITE,(type),(nr),sizeof(size)) +#define _IOWR_BAD(type,nr,size)	_IOC(_IOC_READ|_IOC_WRITE,(type),(nr),sizeof(size)) + +/* used to decode ioctl numbers.. */ +#define _IOC_DIR(nr)		(((nr) >> _IOC_DIRSHIFT) & _IOC_DIRMASK) +#define _IOC_TYPE(nr)		(((nr) >> _IOC_TYPESHIFT) & _IOC_TYPEMASK) +#define _IOC_NR(nr)		(((nr) >> _IOC_NRSHIFT) & _IOC_NRMASK) +#define _IOC_SIZE(nr)		(((nr) >> _IOC_SIZESHIFT) & _IOC_SIZEMASK) + +/* ...and for the drivers/sound files... */ + +#define IOC_IN		(_IOC_WRITE << _IOC_DIRSHIFT) +#define IOC_OUT		(_IOC_READ << _IOC_DIRSHIFT) +#define IOC_INOUT	((_IOC_WRITE|_IOC_READ) << _IOC_DIRSHIFT) +#define IOCSIZE_MASK	(_IOC_SIZEMASK << _IOC_SIZESHIFT) +#define IOCSIZE_SHIFT	(_IOC_SIZESHIFT) + +#endif /* _ASM_GENERIC_IOCTL_H */ diff --git a/include/linux/apm_bios.h b/include/linux/apm_bios.h new file mode 100644 index 000000000..01a6244c9 --- /dev/null +++ b/include/linux/apm_bios.h @@ -0,0 +1,220 @@ +#ifndef _LINUX_APM_H +#define _LINUX_APM_H + +/* + * Include file for the interface to an APM BIOS + * Copyright 1994-2001 Stephen Rothwell (sfr@canb.auug.org.au) + * + * 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; either version 2, or (at your option) any + * later version. + * + * 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. + */ + +#include <linux/types.h> + +typedef unsigned short	apm_event_t; +typedef unsigned short	apm_eventinfo_t; + +struct apm_bios_info { +	__u16	version; +	__u16	cseg; +	__u32	offset; +	__u16	cseg_16; +	__u16	dseg; +	__u16	flags; +	__u16	cseg_len; +	__u16	cseg_16_len; +	__u16	dseg_len; +}; + +#ifdef __KERNEL__ + +#define APM_CS		(GDT_ENTRY_APMBIOS_BASE * 8) +#define APM_CS_16	(APM_CS + 8) +#define APM_DS		(APM_CS_16 + 8) + +/* Results of APM Installation Check */ +#define APM_16_BIT_SUPPORT	0x0001 +#define APM_32_BIT_SUPPORT	0x0002 +#define APM_IDLE_SLOWS_CLOCK	0x0004 +#define APM_BIOS_DISABLED      	0x0008 +#define APM_BIOS_DISENGAGED     0x0010 + +/* + * Data for APM that is persistent across module unload/load + */ +struct apm_info { +	struct apm_bios_info	bios; +	unsigned short		connection_version; +	int			get_power_status_broken; +	int			get_power_status_swabinminutes; +	int			allow_ints; +	int			forbid_idle; +	int			realmode_power_off; +	int			disabled; +}; + +/* + * The APM function codes + */ +#define	APM_FUNC_INST_CHECK	0x5300 +#define	APM_FUNC_REAL_CONN	0x5301 +#define	APM_FUNC_16BIT_CONN	0x5302 +#define	APM_FUNC_32BIT_CONN	0x5303 +#define	APM_FUNC_DISCONN	0x5304 +#define	APM_FUNC_IDLE		0x5305 +#define	APM_FUNC_BUSY		0x5306 +#define	APM_FUNC_SET_STATE	0x5307 +#define	APM_FUNC_ENABLE_PM	0x5308 +#define	APM_FUNC_RESTORE_BIOS	0x5309 +#define	APM_FUNC_GET_STATUS	0x530a +#define	APM_FUNC_GET_EVENT	0x530b +#define	APM_FUNC_GET_STATE	0x530c +#define	APM_FUNC_ENABLE_DEV_PM	0x530d +#define	APM_FUNC_VERSION	0x530e +#define	APM_FUNC_ENGAGE_PM	0x530f +#define	APM_FUNC_GET_CAP	0x5310 +#define	APM_FUNC_RESUME_TIMER	0x5311 +#define	APM_FUNC_RESUME_ON_RING	0x5312 +#define	APM_FUNC_TIMER		0x5313 + +/* + * Function code for APM_FUNC_RESUME_TIMER + */ +#define	APM_FUNC_DISABLE_TIMER	0 +#define	APM_FUNC_GET_TIMER	1 +#define	APM_FUNC_SET_TIMER	2 + +/* + * Function code for APM_FUNC_RESUME_ON_RING + */ +#define	APM_FUNC_DISABLE_RING	0 +#define	APM_FUNC_ENABLE_RING	1 +#define	APM_FUNC_GET_RING	2 + +/* + * Function code for APM_FUNC_TIMER_STATUS + */ +#define	APM_FUNC_TIMER_DISABLE	0 +#define	APM_FUNC_TIMER_ENABLE	1 +#define	APM_FUNC_TIMER_GET	2 + +/* + * in arch/i386/kernel/setup.c + */ +extern struct apm_info	apm_info; + +#endif	/* __KERNEL__ */ + +/* + * Power states + */ +#define APM_STATE_READY		0x0000 +#define APM_STATE_STANDBY	0x0001 +#define APM_STATE_SUSPEND	0x0002 +#define APM_STATE_OFF		0x0003 +#define APM_STATE_BUSY		0x0004 +#define APM_STATE_REJECT	0x0005 +#define APM_STATE_OEM_SYS	0x0020 +#define APM_STATE_OEM_DEV	0x0040 + +#define APM_STATE_DISABLE	0x0000 +#define APM_STATE_ENABLE	0x0001 + +#define APM_STATE_DISENGAGE	0x0000 +#define APM_STATE_ENGAGE	0x0001 + +/* + * Events (results of Get PM Event) + */ +#define APM_SYS_STANDBY		0x0001 +#define APM_SYS_SUSPEND		0x0002 +#define APM_NORMAL_RESUME	0x0003 +#define APM_CRITICAL_RESUME	0x0004 +#define APM_LOW_BATTERY		0x0005 +#define APM_POWER_STATUS_CHANGE	0x0006 +#define APM_UPDATE_TIME		0x0007 +#define APM_CRITICAL_SUSPEND	0x0008 +#define APM_USER_STANDBY	0x0009 +#define APM_USER_SUSPEND	0x000a +#define APM_STANDBY_RESUME	0x000b +#define APM_CAPABILITY_CHANGE	0x000c + +/* + * Error codes + */ +#define APM_SUCCESS		0x00 +#define APM_DISABLED		0x01 +#define APM_CONNECTED		0x02 +#define APM_NOT_CONNECTED	0x03 +#define APM_16_CONNECTED	0x05 +#define APM_16_UNSUPPORTED	0x06 +#define APM_32_CONNECTED	0x07 +#define APM_32_UNSUPPORTED	0x08 +#define APM_BAD_DEVICE		0x09 +#define APM_BAD_PARAM		0x0a +#define APM_NOT_ENGAGED		0x0b +#define APM_BAD_FUNCTION	0x0c +#define APM_RESUME_DISABLED	0x0d +#define APM_NO_ERROR		0x53 +#define APM_BAD_STATE		0x60 +#define APM_NO_EVENTS		0x80 +#define APM_NOT_PRESENT		0x86 + +/* + * APM Device IDs + */ +#define APM_DEVICE_BIOS		0x0000 +#define APM_DEVICE_ALL		0x0001 +#define APM_DEVICE_DISPLAY	0x0100 +#define APM_DEVICE_STORAGE	0x0200 +#define APM_DEVICE_PARALLEL	0x0300 +#define APM_DEVICE_SERIAL	0x0400 +#define APM_DEVICE_NETWORK	0x0500 +#define APM_DEVICE_PCMCIA	0x0600 +#define APM_DEVICE_BATTERY	0x8000 +#define APM_DEVICE_OEM		0xe000 +#define APM_DEVICE_OLD_ALL	0xffff +#define APM_DEVICE_CLASS	0x00ff +#define APM_DEVICE_MASK		0xff00 + +#ifdef __KERNEL__ +/* + * This is the "All Devices" ID communicated to the BIOS + */ +#define APM_DEVICE_BALL		((apm_info.connection_version > 0x0100) ? \ +				 APM_DEVICE_ALL : APM_DEVICE_OLD_ALL) +#endif + +/* + * Battery status + */ +#define APM_MAX_BATTERIES	2 + +/* + * APM defined capability bit flags + */ +#define APM_CAP_GLOBAL_STANDBY		0x0001 +#define APM_CAP_GLOBAL_SUSPEND		0x0002 +#define APM_CAP_RESUME_STANDBY_TIMER	0x0004 /* Timer resume from standby */ +#define APM_CAP_RESUME_SUSPEND_TIMER	0x0008 /* Timer resume from suspend */ +#define APM_CAP_RESUME_STANDBY_RING	0x0010 /* Resume on Ring fr standby */ +#define APM_CAP_RESUME_SUSPEND_RING	0x0020 /* Resume on Ring fr suspend */ +#define APM_CAP_RESUME_STANDBY_PCMCIA	0x0040 /* Resume on PCMCIA Ring	*/ +#define APM_CAP_RESUME_SUSPEND_PCMCIA	0x0080 /* Resume on PCMCIA Ring	*/ + +/* + * ioctl operations + */ +#include <linux/ioctl.h> + +#define APM_IOC_STANDBY		_IO('A', 1) +#define APM_IOC_SUSPEND		_IO('A', 2) + +#endif	/* LINUX_APM_H */ diff --git a/include/linux/compiler-gcc.h b/include/linux/compiler-gcc.h new file mode 100644 index 000000000..73dcf804b --- /dev/null +++ b/include/linux/compiler-gcc.h @@ -0,0 +1,87 @@ +#ifndef __LINUX_COMPILER_H +#error "Please don't include <linux/compiler-gcc.h> directly, include <linux/compiler.h> instead." +#endif + +/* + * Common definitions for all gcc versions go here. + */ + + +/* Optimization barrier */ +/* The "volatile" is due to gcc bugs */ +#define barrier() __asm__ __volatile__("": : :"memory") + +/* + * This macro obfuscates arithmetic on a variable address so that gcc + * shouldn't recognize the original var, and make assumptions about it. + * + * This is needed because the C standard makes it undefined to do + * pointer arithmetic on "objects" outside their boundaries and the + * gcc optimizers assume this is the case. In particular they + * assume such arithmetic does not wrap. + * + * A miscompilation has been observed because of this on PPC. + * To work around it we hide the relationship of the pointer and the object + * using this macro. + * + * Versions of the ppc64 compiler before 4.1 had a bug where use of + * RELOC_HIDE could trash r30. The bug can be worked around by changing + * the inline assembly constraint from =g to =r, in this particular + * case either is valid. + */ +#define RELOC_HIDE(ptr, off)					\ +  ({ unsigned long __ptr;					\ +    __asm__ ("" : "=r"(__ptr) : "0"(ptr));		\ +    (typeof(ptr)) (__ptr + (off)); }) + +/* &a[0] degrades to a pointer: a different type from an array */ +#define __must_be_array(a) \ +  BUILD_BUG_ON_ZERO(__builtin_types_compatible_p(typeof(a), typeof(&a[0]))) + +/* + * Force always-inline if the user requests it so via the .config, + * or if gcc is too old: + */ +#if !defined(CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING) || \ +    !defined(CONFIG_OPTIMIZE_INLINING) || (__GNUC__ < 4) +# define inline		inline		__attribute__((always_inline)) +# define __inline__	__inline__	__attribute__((always_inline)) +# define __inline	__inline	__attribute__((always_inline)) +#endif + +#define __deprecated			__attribute__((deprecated)) +#define __packed			__attribute__((packed)) +#define __weak				__attribute__((weak)) + +/* + * it doesn't make sense on ARM (currently the only user of __naked) to trace + * naked functions because then mcount is called without stack and frame pointer + * being set up and there is no chance to restore the lr register to the value + * before mcount was called. + */ +#define __naked				__attribute__((naked)) notrace + +#define __noreturn			__attribute__((noreturn)) + +/* + * From the GCC manual: + * + * Many functions have no effects except the return value and their + * return value depends only on the parameters and/or global + * variables.  Such a function can be subject to common subexpression + * elimination and loop optimization just as an arithmetic operator + * would be. + * [...] + */ +#define __pure				__attribute__((pure)) +#define __aligned(x)			__attribute__((aligned(x))) +#define __printf(a,b)			__attribute__((format(printf,a,b))) +#define  noinline			__attribute__((noinline)) +#define __attribute_const__		__attribute__((__const__)) +#define __maybe_unused			__attribute__((unused)) +#define __always_unused			__attribute__((unused)) + +#define __gcc_header(x) #x +#define _gcc_header(x) __gcc_header(linux/compiler-gcc##x.h) +#define gcc_header(x) _gcc_header(x) +#include gcc_header(__GNUC__) diff --git a/include/linux/compiler-gcc4.h b/include/linux/compiler-gcc4.h new file mode 100644 index 000000000..94dea3ffb --- /dev/null +++ b/include/linux/compiler-gcc4.h @@ -0,0 +1,61 @@ +#ifndef __LINUX_COMPILER_H +#error "Please don't include <linux/compiler-gcc4.h> directly, include <linux/compiler.h> instead." +#endif + +/* GCC 4.1.[01] miscompiles __weak */ +#ifdef __KERNEL__ +# if __GNUC_MINOR__ == 1 && __GNUC_PATCHLEVEL__ <= 1 +#  error Your version of gcc miscompiles the __weak directive +# endif +#endif + +#define __used			__attribute__((__used__)) +#define __must_check 		__attribute__((warn_unused_result)) +#define __compiler_offsetof(a,b) __builtin_offsetof(a,b) +#define __always_inline		inline __attribute__((always_inline)) + +/* + * A trick to suppress uninitialized variable warning without generating any + * code + */ +#define uninitialized_var(x) x = x + +#if __GNUC_MINOR__ >= 3 +/* Mark functions as cold. gcc will assume any path leading to a call +   to them will be unlikely.  This means a lot of manual unlikely()s +   are unnecessary now for any paths leading to the usual suspects +   like BUG(), printk(), panic() etc. [but let's keep them for now for +   older compilers] + +   Early snapshots of gcc 4.3 don't support this and we can't detect this +   in the preprocessor, but we can live with this because they're unreleased. +   Maketime probing would be overkill here. + +   gcc also has a __attribute__((__hot__)) to move hot functions into +   a special section, but I don't see any sense in this right now in +   the kernel context */ +#define __cold			__attribute__((__cold__)) + + +#if __GNUC_MINOR__ >= 5 +/* + * Mark a position in code as unreachable.  This can be used to + * suppress control flow warnings after asm blocks that transfer + * control elsewhere. + * + * Early snapshots of gcc 4.5 don't support this and we can't detect + * this in the preprocessor, but we can live with this because they're + * unreleased.  Really, we need to have autoconf for the kernel. + */ +#define unreachable() __builtin_unreachable() +#endif + +#endif + +#if __GNUC_MINOR__ > 0 +#define __compiletime_object_size(obj) __builtin_object_size(obj, 0) +#endif +#if __GNUC_MINOR__ >= 4 +#define __compiletime_warning(message) __attribute__((warning(message))) +#define __compiletime_error(message) __attribute__((error(message))) +#endif diff --git a/include/linux/compiler.h b/include/linux/compiler.h new file mode 100644 index 000000000..5be3dab4a --- /dev/null +++ b/include/linux/compiler.h @@ -0,0 +1,303 @@ +#ifndef __LINUX_COMPILER_H +#define __LINUX_COMPILER_H + +#ifndef __ASSEMBLY__ + +#ifdef __CHECKER__ +# define __user		__attribute__((noderef, address_space(1))) +# define __kernel	/* default address space */ +# define __safe		__attribute__((safe)) +# define __force	__attribute__((force)) +# define __nocast	__attribute__((nocast)) +# define __iomem	__attribute__((noderef, address_space(2))) +# define __acquires(x)	__attribute__((context(x,0,1))) +# define __releases(x)	__attribute__((context(x,1,0))) +# define __acquire(x)	__context__(x,1) +# define __release(x)	__context__(x,-1) +# define __cond_lock(x,c)	((c) ? ({ __acquire(x); 1; }) : 0) +extern void __chk_user_ptr(const volatile void __user *); +extern void __chk_io_ptr(const volatile void __iomem *); +#else +# define __user +# define __kernel +# define __safe +# define __force +# define __nocast +# define __iomem +# define __chk_user_ptr(x) (void)0 +# define __chk_io_ptr(x) (void)0 +# define __builtin_warning(x, y...) (1) +# define __acquires(x) +# define __releases(x) +# define __acquire(x) (void)0 +# define __release(x) (void)0 +# define __cond_lock(x,c) (c) +#endif + +#ifdef __KERNEL__ + +#ifdef __GNUC__ +#include <linux/compiler-gcc.h> +#endif + +#define notrace __attribute__((no_instrument_function)) + +/* Intel compiler defines __GNUC__. So we will overwrite implementations + * coming from above header files here + */ +#ifdef __INTEL_COMPILER +# include <linux/compiler-intel.h> +#endif + +/* + * Generic compiler-dependent macros required for kernel + * build go below this comment. Actual compiler/compiler version + * specific implementations come from the above header files + */ + +struct ftrace_branch_data { +	const char *func; +	const char *file; +	unsigned line; +	union { +		struct { +			unsigned long correct; +			unsigned long incorrect; +		}; +		struct { +			unsigned long miss; +			unsigned long hit; +		}; +		unsigned long miss_hit[2]; +	}; +}; + +/* + * Note: DISABLE_BRANCH_PROFILING can be used by special lowlevel code + * to disable branch tracing on a per file basis. + */ +#if defined(CONFIG_TRACE_BRANCH_PROFILING) \ +    && !defined(DISABLE_BRANCH_PROFILING) && !defined(__CHECKER__) +void ftrace_likely_update(struct ftrace_branch_data *f, int val, int expect); + +#define likely_notrace(x)	__builtin_expect(!!(x), 1) +#define unlikely_notrace(x)	__builtin_expect(!!(x), 0) + +#define __branch_check__(x, expect) ({					\ +			int ______r;					\ +			static struct ftrace_branch_data		\ +				__attribute__((__aligned__(4)))		\ +				__attribute__((section("_ftrace_annotated_branch"))) \ +				______f = {				\ +				.func = __func__,			\ +				.file = __FILE__,			\ +				.line = __LINE__,			\ +			};						\ +			______r = likely_notrace(x);			\ +			ftrace_likely_update(&______f, ______r, expect); \ +			______r;					\ +		}) + +/* + * Using __builtin_constant_p(x) to ignore cases where the return + * value is always the same.  This idea is taken from a similar patch + * written by Daniel Walker. + */ +# ifndef likely +#  define likely(x)	(__builtin_constant_p(x) ? !!(x) : __branch_check__(x, 1)) +# endif +# ifndef unlikely +#  define unlikely(x)	(__builtin_constant_p(x) ? !!(x) : __branch_check__(x, 0)) +# endif + +#ifdef CONFIG_PROFILE_ALL_BRANCHES +/* + * "Define 'is'", Bill Clinton + * "Define 'if'", Steven Rostedt + */ +#define if(cond, ...) __trace_if( (cond , ## __VA_ARGS__) ) +#define __trace_if(cond) \ +	if (__builtin_constant_p((cond)) ? !!(cond) :			\ +	({								\ +		int ______r;						\ +		static struct ftrace_branch_data			\ +			__attribute__((__aligned__(4)))			\ +			__attribute__((section("_ftrace_branch")))	\ +			______f = {					\ +				.func = __func__,			\ +				.file = __FILE__,			\ +				.line = __LINE__,			\ +			};						\ +		______r = !!(cond);					\ +		______f.miss_hit[______r]++;					\ +		______r;						\ +	})) +#endif /* CONFIG_PROFILE_ALL_BRANCHES */ + +#else +# define likely(x)	__builtin_expect(!!(x), 1) +# define unlikely(x)	__builtin_expect(!!(x), 0) +#endif + +/* Optimization barrier */ +#ifndef barrier +# define barrier() __memory_barrier() +#endif + +/* Unreachable code */ +#ifndef unreachable +# define unreachable() do { } while (1) +#endif + +#ifndef RELOC_HIDE +# define RELOC_HIDE(ptr, off)					\ +  ({ unsigned long __ptr;					\ +     __ptr = (unsigned long) (ptr);				\ +    (typeof(ptr)) (__ptr + (off)); }) +#endif + +#endif /* __KERNEL__ */ + +#endif /* __ASSEMBLY__ */ + +#ifdef __KERNEL__ +/* + * Allow us to mark functions as 'deprecated' and have gcc emit a nice + * warning for each use, in hopes of speeding the functions removal. + * Usage is: + * 		int __deprecated foo(void) + */ +#ifndef __deprecated +# define __deprecated		/* unimplemented */ +#endif + +#ifdef MODULE +#define __deprecated_for_modules __deprecated +#else +#define __deprecated_for_modules +#endif + +#ifndef __must_check +#define __must_check +#endif + +#ifndef CONFIG_ENABLE_MUST_CHECK +#undef __must_check +#define __must_check +#endif +#ifndef CONFIG_ENABLE_WARN_DEPRECATED +#undef __deprecated +#undef __deprecated_for_modules +#define __deprecated +#define __deprecated_for_modules +#endif + +/* + * Allow us to avoid 'defined but not used' warnings on functions and data, + * as well as force them to be emitted to the assembly file. + * + * As of gcc 3.4, static functions that are not marked with attribute((used)) + * may be elided from the assembly file.  As of gcc 3.4, static data not so + * marked will not be elided, but this may change in a future gcc version. + * + * NOTE: Because distributions shipped with a backported unit-at-a-time + * compiler in gcc 3.3, we must define __used to be __attribute__((used)) + * for gcc >=3.3 instead of 3.4. + * + * In prior versions of gcc, such functions and data would be emitted, but + * would be warned about except with attribute((unused)). + * + * Mark functions that are referenced only in inline assembly as __used so + * the code is emitted even though it appears to be unreferenced. + */ +#ifndef __used +# define __used			/* unimplemented */ +#endif + +#ifndef __maybe_unused +# define __maybe_unused		/* unimplemented */ +#endif + +#ifndef __always_unused +# define __always_unused	/* unimplemented */ +#endif + +#ifndef noinline +#define noinline +#endif + +/* + * Rather then using noinline to prevent stack consumption, use + * noinline_for_stack instead.  For documentaiton reasons. + */ +#define noinline_for_stack noinline + +#ifndef __always_inline +#define __always_inline inline +#endif + +#endif /* __KERNEL__ */ + +/* + * From the GCC manual: + * + * Many functions do not examine any values except their arguments, + * and have no effects except the return value.  Basically this is + * just slightly more strict class than the `pure' attribute above, + * since function is not allowed to read global memory. + * + * Note that a function that has pointer arguments and examines the + * data pointed to must _not_ be declared `const'.  Likewise, a + * function that calls a non-`const' function usually must not be + * `const'.  It does not make sense for a `const' function to return + * `void'. + */ +#ifndef __attribute_const__ +# define __attribute_const__	/* unimplemented */ +#endif + +/* + * Tell gcc if a function is cold. The compiler will assume any path + * directly leading to the call is unlikely. + */ + +#ifndef __cold +#define __cold +#endif + +/* Simple shorthand for a section definition */ +#ifndef __section +# define __section(S) __attribute__ ((__section__(#S))) +#endif + +/* Are two types/vars the same type (ignoring qualifiers)? */ +#ifndef __same_type +# define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b)) +#endif + +/* Compile time object size, -1 for unknown */ +#ifndef __compiletime_object_size +# define __compiletime_object_size(obj) -1 +#endif +#ifndef __compiletime_warning +# define __compiletime_warning(message) +#endif +#ifndef __compiletime_error +# define __compiletime_error(message) +#endif + +/* + * Prevent the compiler from merging or refetching accesses.  The compiler + * is also forbidden from reordering successive instances of ACCESS_ONCE(), + * but only when the compiler is aware of some particular ordering.  One way + * to make the compiler aware of ordering is to put the two invocations of + * ACCESS_ONCE() in different C statements. + * + * This macro does absolutely -nothing- to prevent the CPU from reordering, + * merging, or refetching absolutely anything at any time.  Its main intended + * use is to mediate communication between process-level code and irq/NMI + * handlers, all running on the same CPU. + */ +#define ACCESS_ONCE(x) (*(volatile typeof(x) *)&(x)) + +#endif /* __LINUX_COMPILER_H */ diff --git a/include/linux/edd.h b/include/linux/edd.h new file mode 100644 index 000000000..4cbd0fe9d --- /dev/null +++ b/include/linux/edd.h @@ -0,0 +1,194 @@ +/* + * linux/include/linux/edd.h + *  Copyright (C) 2002, 2003, 2004 Dell Inc. + *  by Matt Domsch <Matt_Domsch@dell.com> + * + * structures and definitions for the int 13h, ax={41,48}h + * BIOS Enhanced Disk Drive Services + * This is based on the T13 group document D1572 Revision 0 (August 14 2002) + * available at http://www.t13.org/docs2002/d1572r0.pdf.  It is + * very similar to D1484 Revision 3 http://www.t13.org/docs2002/d1484r3.pdf + * + * In a nutshell, arch/{i386,x86_64}/boot/setup.S populates a scratch + * table in the boot_params that contains a list of BIOS-enumerated + * boot devices. + * In arch/{i386,x86_64}/kernel/setup.c, this information is + * transferred into the edd structure, and in drivers/firmware/edd.c, that + * information is used to identify BIOS boot disk.  The code in setup.S + * is very sensitive to the size of these structures. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License v2.0 as published by + * the Free Software Foundation + * + * 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. + * + */ +#ifndef _LINUX_EDD_H +#define _LINUX_EDD_H + +#include <linux/types.h> + +#define EDDNR 0x1e9		/* addr of number of edd_info structs at EDDBUF +				   in boot_params - treat this as 1 byte  */ +#define EDDBUF	0xd00		/* addr of edd_info structs in boot_params */ +#define EDDMAXNR 6		/* number of edd_info structs starting at EDDBUF  */ +#define EDDEXTSIZE 8		/* change these if you muck with the structures */ +#define EDDPARMSIZE 74 +#define CHECKEXTENSIONSPRESENT 0x41 +#define GETDEVICEPARAMETERS 0x48 +#define LEGACYGETDEVICEPARAMETERS 0x08 +#define EDDMAGIC1 0x55AA +#define EDDMAGIC2 0xAA55 + + +#define READ_SECTORS 0x02         /* int13 AH=0x02 is READ_SECTORS command */ +#define EDD_MBR_SIG_OFFSET 0x1B8  /* offset of signature in the MBR */ +#define EDD_MBR_SIG_BUF    0x290  /* addr in boot params */ +#define EDD_MBR_SIG_MAX 16        /* max number of signatures to store */ +#define EDD_MBR_SIG_NR_BUF 0x1ea  /* addr of number of MBR signtaures at EDD_MBR_SIG_BUF +				     in boot_params - treat this as 1 byte  */ + +#ifndef __ASSEMBLY__ + +#define EDD_EXT_FIXED_DISK_ACCESS           (1 << 0) +#define EDD_EXT_DEVICE_LOCKING_AND_EJECTING (1 << 1) +#define EDD_EXT_ENHANCED_DISK_DRIVE_SUPPORT (1 << 2) +#define EDD_EXT_64BIT_EXTENSIONS            (1 << 3) + +#define EDD_INFO_DMA_BOUNDARY_ERROR_TRANSPARENT (1 << 0) +#define EDD_INFO_GEOMETRY_VALID                (1 << 1) +#define EDD_INFO_REMOVABLE                     (1 << 2) +#define EDD_INFO_WRITE_VERIFY                  (1 << 3) +#define EDD_INFO_MEDIA_CHANGE_NOTIFICATION     (1 << 4) +#define EDD_INFO_LOCKABLE                      (1 << 5) +#define EDD_INFO_NO_MEDIA_PRESENT              (1 << 6) +#define EDD_INFO_USE_INT13_FN50                (1 << 7) + +struct edd_device_params { +	__u16 length; +	__u16 info_flags; +	__u32 num_default_cylinders; +	__u32 num_default_heads; +	__u32 sectors_per_track; +	__u64 number_of_sectors; +	__u16 bytes_per_sector; +	__u32 dpte_ptr;		/* 0xFFFFFFFF for our purposes */ +	__u16 key;		/* = 0xBEDD */ +	__u8 device_path_info_length;	/* = 44 */ +	__u8 reserved2; +	__u16 reserved3; +	__u8 host_bus_type[4]; +	__u8 interface_type[8]; +	union { +		struct { +			__u16 base_address; +			__u16 reserved1; +			__u32 reserved2; +		} __attribute__ ((packed)) isa; +		struct { +			__u8 bus; +			__u8 slot; +			__u8 function; +			__u8 channel; +			__u32 reserved; +		} __attribute__ ((packed)) pci; +		/* pcix is same as pci */ +		struct { +			__u64 reserved; +		} __attribute__ ((packed)) ibnd; +		struct { +			__u64 reserved; +		} __attribute__ ((packed)) xprs; +		struct { +			__u64 reserved; +		} __attribute__ ((packed)) htpt; +		struct { +			__u64 reserved; +		} __attribute__ ((packed)) unknown; +	} interface_path; +	union { +		struct { +			__u8 device; +			__u8 reserved1; +			__u16 reserved2; +			__u32 reserved3; +			__u64 reserved4; +		} __attribute__ ((packed)) ata; +		struct { +			__u8 device; +			__u8 lun; +			__u8 reserved1; +			__u8 reserved2; +			__u32 reserved3; +			__u64 reserved4; +		} __attribute__ ((packed)) atapi; +		struct { +			__u16 id; +			__u64 lun; +			__u16 reserved1; +			__u32 reserved2; +		} __attribute__ ((packed)) scsi; +		struct { +			__u64 serial_number; +			__u64 reserved; +		} __attribute__ ((packed)) usb; +		struct { +			__u64 eui; +			__u64 reserved; +		} __attribute__ ((packed)) i1394; +		struct { +			__u64 wwid; +			__u64 lun; +		} __attribute__ ((packed)) fibre; +		struct { +			__u64 identity_tag; +			__u64 reserved; +		} __attribute__ ((packed)) i2o; +		struct { +			__u32 array_number; +			__u32 reserved1; +			__u64 reserved2; +		} __attribute__ ((packed)) raid; +		struct { +			__u8 device; +			__u8 reserved1; +			__u16 reserved2; +			__u32 reserved3; +			__u64 reserved4; +		} __attribute__ ((packed)) sata; +		struct { +			__u64 reserved1; +			__u64 reserved2; +		} __attribute__ ((packed)) unknown; +	} device_path; +	__u8 reserved4; +	__u8 checksum; +} __attribute__ ((packed)); + +struct edd_info { +	__u8 device; +	__u8 version; +	__u16 interface_support; +	__u16 legacy_max_cylinder; +	__u8 legacy_max_head; +	__u8 legacy_sectors_per_track; +	struct edd_device_params params; +} __attribute__ ((packed)); + +struct edd { +	unsigned int mbr_signature[EDD_MBR_SIG_MAX]; +	struct edd_info edd_info[EDDMAXNR]; +	unsigned char mbr_signature_nr; +	unsigned char edd_info_nr; +}; + +#ifdef __KERNEL__ +extern struct edd edd; +#endif /* __KERNEL__ */ +#endif				/*!__ASSEMBLY__ */ + +#endif				/* _LINUX_EDD_H */ diff --git a/include/linux/ioctl.h b/include/linux/ioctl.h new file mode 100644 index 000000000..7e55c3614 --- /dev/null +++ b/include/linux/ioctl.h @@ -0,0 +1,6 @@ +#ifndef _LINUX_IOCTL_H +#define _LINUX_IOCTL_H + +#include <asm/ioctl.h> + +#endif /* _LINUX_IOCTL_H */ diff --git a/include/linux/ioport.h b/include/linux/ioport.h new file mode 100644 index 000000000..7129504e0 --- /dev/null +++ b/include/linux/ioport.h @@ -0,0 +1,192 @@ +/* + * ioport.h	Definitions of routines for detecting, reserving and + *		allocating system resources. + * + * Authors:	Linus Torvalds + */ + +#ifndef _LINUX_IOPORT_H +#define _LINUX_IOPORT_H + +#ifndef __ASSEMBLY__ +#include <linux/compiler.h> +#include <linux/types.h> +/* + * Resources are tree-like, allowing + * nesting etc.. + */ +struct resource { +	resource_size_t start; +	resource_size_t end; +	const char *name; +	unsigned long flags; +	struct resource *parent, *sibling, *child; +}; + +struct resource_list { +	struct resource_list *next; +	struct resource *res; +	struct pci_dev *dev; +}; + +/* + * IO resources have these defined flags. + */ +#define IORESOURCE_BITS		0x000000ff	/* Bus-specific bits */ + +#define IORESOURCE_TYPE_BITS	0x00000f00	/* Resource type */ +#define IORESOURCE_IO		0x00000100 +#define IORESOURCE_MEM		0x00000200 +#define IORESOURCE_IRQ		0x00000400 +#define IORESOURCE_DMA		0x00000800 + +#define IORESOURCE_PREFETCH	0x00001000	/* No side effects */ +#define IORESOURCE_READONLY	0x00002000 +#define IORESOURCE_CACHEABLE	0x00004000 +#define IORESOURCE_RANGELENGTH	0x00008000 +#define IORESOURCE_SHADOWABLE	0x00010000 + +#define IORESOURCE_SIZEALIGN	0x00020000	/* size indicates alignment */ +#define IORESOURCE_STARTALIGN	0x00040000	/* start field is alignment */ + +#define IORESOURCE_MEM_64	0x00100000 + +#define IORESOURCE_EXCLUSIVE	0x08000000	/* Userland may not map this resource */ +#define IORESOURCE_DISABLED	0x10000000 +#define IORESOURCE_UNSET	0x20000000 +#define IORESOURCE_AUTO		0x40000000 +#define IORESOURCE_BUSY		0x80000000	/* Driver has marked this resource busy */ + +/* PnP IRQ specific bits (IORESOURCE_BITS) */ +#define IORESOURCE_IRQ_HIGHEDGE		(1<<0) +#define IORESOURCE_IRQ_LOWEDGE		(1<<1) +#define IORESOURCE_IRQ_HIGHLEVEL	(1<<2) +#define IORESOURCE_IRQ_LOWLEVEL		(1<<3) +#define IORESOURCE_IRQ_SHAREABLE	(1<<4) +#define IORESOURCE_IRQ_OPTIONAL 	(1<<5) + +/* PnP DMA specific bits (IORESOURCE_BITS) */ +#define IORESOURCE_DMA_TYPE_MASK	(3<<0) +#define IORESOURCE_DMA_8BIT		(0<<0) +#define IORESOURCE_DMA_8AND16BIT	(1<<0) +#define IORESOURCE_DMA_16BIT		(2<<0) + +#define IORESOURCE_DMA_MASTER		(1<<2) +#define IORESOURCE_DMA_BYTE		(1<<3) +#define IORESOURCE_DMA_WORD		(1<<4) + +#define IORESOURCE_DMA_SPEED_MASK	(3<<6) +#define IORESOURCE_DMA_COMPATIBLE	(0<<6) +#define IORESOURCE_DMA_TYPEA		(1<<6) +#define IORESOURCE_DMA_TYPEB		(2<<6) +#define IORESOURCE_DMA_TYPEF		(3<<6) + +/* PnP memory I/O specific bits (IORESOURCE_BITS) */ +#define IORESOURCE_MEM_WRITEABLE	(1<<0)	/* dup: IORESOURCE_READONLY */ +#define IORESOURCE_MEM_CACHEABLE	(1<<1)	/* dup: IORESOURCE_CACHEABLE */ +#define IORESOURCE_MEM_RANGELENGTH	(1<<2)	/* dup: IORESOURCE_RANGELENGTH */ +#define IORESOURCE_MEM_TYPE_MASK	(3<<3) +#define IORESOURCE_MEM_8BIT		(0<<3) +#define IORESOURCE_MEM_16BIT		(1<<3) +#define IORESOURCE_MEM_8AND16BIT	(2<<3) +#define IORESOURCE_MEM_32BIT		(3<<3) +#define IORESOURCE_MEM_SHADOWABLE	(1<<5)	/* dup: IORESOURCE_SHADOWABLE */ +#define IORESOURCE_MEM_EXPANSIONROM	(1<<6) + +/* PnP I/O specific bits (IORESOURCE_BITS) */ +#define IORESOURCE_IO_16BIT_ADDR	(1<<0) +#define IORESOURCE_IO_FIXED		(1<<1) + +/* PCI ROM control bits (IORESOURCE_BITS) */ +#define IORESOURCE_ROM_ENABLE		(1<<0)	/* ROM is enabled, same as PCI_ROM_ADDRESS_ENABLE */ +#define IORESOURCE_ROM_SHADOW		(1<<1)	/* ROM is copy at C000:0 */ +#define IORESOURCE_ROM_COPY		(1<<2)	/* ROM is alloc'd copy, resource field overlaid */ +#define IORESOURCE_ROM_BIOS_COPY	(1<<3)	/* ROM is BIOS copy, resource field overlaid */ + +/* PCI control bits.  Shares IORESOURCE_BITS with above PCI ROM.  */ +#define IORESOURCE_PCI_FIXED		(1<<4)	/* Do not move resource */ + +/* PC/ISA/whatever - the normal PC address spaces: IO and memory */ +extern struct resource ioport_resource; +extern struct resource iomem_resource; + +extern int request_resource(struct resource *root, struct resource *new); +extern int release_resource(struct resource *new); +extern void reserve_region_with_split(struct resource *root, +			     resource_size_t start, resource_size_t end, +			     const char *name); +extern int insert_resource(struct resource *parent, struct resource *new); +extern void insert_resource_expand_to_fit(struct resource *root, struct resource *new); +extern int allocate_resource(struct resource *root, struct resource *new, +			     resource_size_t size, resource_size_t min, +			     resource_size_t max, resource_size_t align, +			     void (*alignf)(void *, struct resource *, +					    resource_size_t, resource_size_t), +			     void *alignf_data); +int adjust_resource(struct resource *res, resource_size_t start, +		    resource_size_t size); +resource_size_t resource_alignment(struct resource *res); +static inline resource_size_t resource_size(const struct resource *res) +{ +	return res->end - res->start + 1; +} +static inline unsigned long resource_type(const struct resource *res) +{ +	return res->flags & IORESOURCE_TYPE_BITS; +} + +/* Convenience shorthand with allocation */ +#define request_region(start,n,name)	__request_region(&ioport_resource, (start), (n), (name), 0) +#define __request_mem_region(start,n,name, excl) __request_region(&iomem_resource, (start), (n), (name), excl) +#define request_mem_region(start,n,name) __request_region(&iomem_resource, (start), (n), (name), 0) +#define request_mem_region_exclusive(start,n,name) \ +	__request_region(&iomem_resource, (start), (n), (name), IORESOURCE_EXCLUSIVE) +#define rename_region(region, newname) do { (region)->name = (newname); } while (0) + +extern struct resource * __request_region(struct resource *, +					resource_size_t start, +					resource_size_t n, +					const char *name, int flags); + +/* Compatibility cruft */ +#define release_region(start,n)	__release_region(&ioport_resource, (start), (n)) +#define check_mem_region(start,n)	__check_region(&iomem_resource, (start), (n)) +#define release_mem_region(start,n)	__release_region(&iomem_resource, (start), (n)) + +extern int __check_region(struct resource *, resource_size_t, resource_size_t); +extern void __release_region(struct resource *, resource_size_t, +				resource_size_t); + +static inline int __deprecated check_region(resource_size_t s, +						resource_size_t n) +{ +	return __check_region(&ioport_resource, s, n); +} + +/* Wrappers for managed devices */ +struct device; +#define devm_request_region(dev,start,n,name) \ +	__devm_request_region(dev, &ioport_resource, (start), (n), (name)) +#define devm_request_mem_region(dev,start,n,name) \ +	__devm_request_region(dev, &iomem_resource, (start), (n), (name)) + +extern struct resource * __devm_request_region(struct device *dev, +				struct resource *parent, resource_size_t start, +				resource_size_t n, const char *name); + +#define devm_release_region(dev, start, n) \ +	__devm_release_region(dev, &ioport_resource, (start), (n)) +#define devm_release_mem_region(dev, start, n) \ +	__devm_release_region(dev, &iomem_resource, (start), (n)) + +extern void __devm_release_region(struct device *dev, struct resource *parent, +				  resource_size_t start, resource_size_t n); +extern int iomem_map_sanity_check(resource_size_t addr, unsigned long size); +extern int iomem_is_exclusive(u64 addr); + +extern int +walk_system_ram_range(unsigned long start_pfn, unsigned long nr_pages, +		void *arg, int (*func)(unsigned long, unsigned long, void *)); + +#endif /* __ASSEMBLY__ */ +#endif	/* _LINUX_IOPORT_H */ diff --git a/include/linux/screen_info.h b/include/linux/screen_info.h new file mode 100644 index 000000000..899fbb487 --- /dev/null +++ b/include/linux/screen_info.h @@ -0,0 +1,84 @@ +#ifndef _SCREEN_INFO_H +#define _SCREEN_INFO_H + +#include <linux/types.h> + +/* + * These are set up by the setup-routine at boot-time: + */ + +struct screen_info { +	__u8  orig_x;		/* 0x00 */ +	__u8  orig_y;		/* 0x01 */ +	__u16 ext_mem_k;	/* 0x02 */ +	__u16 orig_video_page;	/* 0x04 */ +	__u8  orig_video_mode;	/* 0x06 */ +	__u8  orig_video_cols;	/* 0x07 */ +	__u8  flags;		/* 0x08 */ +	__u8  unused2;		/* 0x09 */ +	__u16 orig_video_ega_bx;/* 0x0a */ +	__u16 unused3;		/* 0x0c */ +	__u8  orig_video_lines;	/* 0x0e */ +	__u8  orig_video_isVGA;	/* 0x0f */ +	__u16 orig_video_points;/* 0x10 */ + +	/* VESA graphic mode -- linear frame buffer */ +	__u16 lfb_width;	/* 0x12 */ +	__u16 lfb_height;	/* 0x14 */ +	__u16 lfb_depth;	/* 0x16 */ +	__u32 lfb_base;		/* 0x18 */ +	__u32 lfb_size;		/* 0x1c */ +	__u16 cl_magic, cl_offset; /* 0x20 */ +	__u16 lfb_linelength;	/* 0x24 */ +	__u8  red_size;		/* 0x26 */ +	__u8  red_pos;		/* 0x27 */ +	__u8  green_size;	/* 0x28 */ +	__u8  green_pos;	/* 0x29 */ +	__u8  blue_size;	/* 0x2a */ +	__u8  blue_pos;		/* 0x2b */ +	__u8  rsvd_size;	/* 0x2c */ +	__u8  rsvd_pos;		/* 0x2d */ +	__u16 vesapm_seg;	/* 0x2e */ +	__u16 vesapm_off;	/* 0x30 */ +	__u16 pages;		/* 0x32 */ +	__u16 vesa_attributes;	/* 0x34 */ +	__u32 capabilities;     /* 0x36 */ +	__u8  _reserved[6];	/* 0x3a */ +} __attribute__((packed)); + +#define VIDEO_TYPE_MDA		0x10	/* Monochrome Text Display	*/ +#define VIDEO_TYPE_CGA		0x11	/* CGA Display 			*/ +#define VIDEO_TYPE_EGAM		0x20	/* EGA/VGA in Monochrome Mode	*/ +#define VIDEO_TYPE_EGAC		0x21	/* EGA in Color Mode		*/ +#define VIDEO_TYPE_VGAC		0x22	/* VGA+ in Color Mode		*/ +#define VIDEO_TYPE_VLFB		0x23	/* VESA VGA in graphic mode	*/ + +#define VIDEO_TYPE_PICA_S3	0x30	/* ACER PICA-61 local S3 video	*/ +#define VIDEO_TYPE_MIPS_G364	0x31    /* MIPS Magnum 4000 G364 video  */ +#define VIDEO_TYPE_SGI          0x33    /* Various SGI graphics hardware */ + +#define VIDEO_TYPE_TGAC		0x40	/* DEC TGA */ + +#define VIDEO_TYPE_SUN          0x50    /* Sun frame buffer. */ +#define VIDEO_TYPE_SUNPCI       0x51    /* Sun PCI based frame buffer. */ + +#define VIDEO_TYPE_PMAC		0x60	/* PowerMacintosh frame buffer. */ + +#define VIDEO_TYPE_EFI		0x70	/* EFI graphic mode		*/ + +#define VIDEO_FLAGS_NOCURSOR	(1 << 0) /* The video mode has no cursor set */ + +#ifdef __KERNEL__ +extern struct screen_info screen_info; + +#define ORIG_X			(screen_info.orig_x) +#define ORIG_Y			(screen_info.orig_y) +#define ORIG_VIDEO_MODE		(screen_info.orig_video_mode) +#define ORIG_VIDEO_COLS 	(screen_info.orig_video_cols) +#define ORIG_VIDEO_EGA_BX	(screen_info.orig_video_ega_bx) +#define ORIG_VIDEO_LINES	(screen_info.orig_video_lines) +#define ORIG_VIDEO_ISVGA	(screen_info.orig_video_isVGA) +#define ORIG_VIDEO_POINTS       (screen_info.orig_video_points) +#endif /* __KERNEL__ */ + +#endif /* _SCREEN_INFO_H */ |