| 1 |
13 |
serginhofr |
/*
|
| 2 |
|
|
* linux/include/linux/edd.h
|
| 3 |
|
|
* Copyright (C) 2002, 2003, 2004 Dell Inc.
|
| 4 |
|
|
* by Matt Domsch <Matt_Domsch@dell.com>
|
| 5 |
|
|
*
|
| 6 |
|
|
* structures and definitions for the int 13h, ax={41,48}h
|
| 7 |
|
|
* BIOS Enhanced Disk Drive Services
|
| 8 |
|
|
* This is based on the T13 group document D1572 Revision 0 (August 14 2002)
|
| 9 |
|
|
* available at http://www.t13.org/docs2002/d1572r0.pdf. It is
|
| 10 |
|
|
* very similar to D1484 Revision 3 http://www.t13.org/docs2002/d1484r3.pdf
|
| 11 |
|
|
*
|
| 12 |
|
|
* In a nutshell, arch/{i386,x86_64}/boot/setup.S populates a scratch
|
| 13 |
|
|
* table in the boot_params that contains a list of BIOS-enumerated
|
| 14 |
|
|
* boot devices.
|
| 15 |
|
|
* In arch/{i386,x86_64}/kernel/setup.c, this information is
|
| 16 |
|
|
* transferred into the edd structure, and in drivers/firmware/edd.c, that
|
| 17 |
|
|
* information is used to identify BIOS boot disk. The code in setup.S
|
| 18 |
|
|
* is very sensitive to the size of these structures.
|
| 19 |
|
|
*
|
| 20 |
|
|
* This program is free software; you can redistribute it and/or modify
|
| 21 |
|
|
* it under the terms of the GNU General Public License v2.0 as published by
|
| 22 |
|
|
* the Free Software Foundation
|
| 23 |
|
|
*
|
| 24 |
|
|
* This program is distributed in the hope that it will be useful,
|
| 25 |
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
| 26 |
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
| 27 |
|
|
* GNU General Public License for more details.
|
| 28 |
|
|
*
|
| 29 |
|
|
*/
|
| 30 |
|
|
#ifndef _LINUX_EDD_H
|
| 31 |
|
|
#define _LINUX_EDD_H
|
| 32 |
|
|
|
| 33 |
|
|
#include <linux/types.h>
|
| 34 |
|
|
|
| 35 |
|
|
#define EDDNR 0x1e9 /* addr of number of edd_info structs at EDDBUF
|
| 36 |
|
|
in boot_params - treat this as 1 byte */
|
| 37 |
|
|
#define EDDBUF 0xd00 /* addr of edd_info structs in boot_params */
|
| 38 |
|
|
#define EDDMAXNR 6 /* number of edd_info structs starting at EDDBUF */
|
| 39 |
|
|
#define EDDEXTSIZE 8 /* change these if you muck with the structures */
|
| 40 |
|
|
#define EDDPARMSIZE 74
|
| 41 |
|
|
#define CHECKEXTENSIONSPRESENT 0x41
|
| 42 |
|
|
#define GETDEVICEPARAMETERS 0x48
|
| 43 |
|
|
#define LEGACYGETDEVICEPARAMETERS 0x08
|
| 44 |
|
|
#define EDDMAGIC1 0x55AA
|
| 45 |
|
|
#define EDDMAGIC2 0xAA55
|
| 46 |
|
|
|
| 47 |
|
|
|
| 48 |
|
|
#define READ_SECTORS 0x02 /* int13 AH=0x02 is READ_SECTORS command */
|
| 49 |
|
|
#define EDD_MBR_SIG_OFFSET 0x1B8 /* offset of signature in the MBR */
|
| 50 |
|
|
#define EDD_MBR_SIG_BUF 0x290 /* addr in boot params */
|
| 51 |
|
|
#define EDD_MBR_SIG_MAX 16 /* max number of signatures to store */
|
| 52 |
|
|
#define EDD_MBR_SIG_NR_BUF 0x1ea /* addr of number of MBR signtaures at EDD_MBR_SIG_BUF
|
| 53 |
|
|
in boot_params - treat this as 1 byte */
|
| 54 |
|
|
|
| 55 |
|
|
#ifndef __ASSEMBLY__
|
| 56 |
|
|
|
| 57 |
|
|
#define EDD_EXT_FIXED_DISK_ACCESS (1 << 0)
|
| 58 |
|
|
#define EDD_EXT_DEVICE_LOCKING_AND_EJECTING (1 << 1)
|
| 59 |
|
|
#define EDD_EXT_ENHANCED_DISK_DRIVE_SUPPORT (1 << 2)
|
| 60 |
|
|
#define EDD_EXT_64BIT_EXTENSIONS (1 << 3)
|
| 61 |
|
|
|
| 62 |
|
|
#define EDD_INFO_DMA_BOUNDARY_ERROR_TRANSPARENT (1 << 0)
|
| 63 |
|
|
#define EDD_INFO_GEOMETRY_VALID (1 << 1)
|
| 64 |
|
|
#define EDD_INFO_REMOVABLE (1 << 2)
|
| 65 |
|
|
#define EDD_INFO_WRITE_VERIFY (1 << 3)
|
| 66 |
|
|
#define EDD_INFO_MEDIA_CHANGE_NOTIFICATION (1 << 4)
|
| 67 |
|
|
#define EDD_INFO_LOCKABLE (1 << 5)
|
| 68 |
|
|
#define EDD_INFO_NO_MEDIA_PRESENT (1 << 6)
|
| 69 |
|
|
#define EDD_INFO_USE_INT13_FN50 (1 << 7)
|
| 70 |
|
|
|
| 71 |
|
|
struct edd_device_params {
|
| 72 |
|
|
__u16 length;
|
| 73 |
|
|
__u16 info_flags;
|
| 74 |
|
|
__u32 num_default_cylinders;
|
| 75 |
|
|
__u32 num_default_heads;
|
| 76 |
|
|
__u32 sectors_per_track;
|
| 77 |
|
|
__u64 number_of_sectors;
|
| 78 |
|
|
__u16 bytes_per_sector;
|
| 79 |
|
|
__u32 dpte_ptr; /* 0xFFFFFFFF for our purposes */
|
| 80 |
|
|
__u16 key; /* = 0xBEDD */
|
| 81 |
|
|
__u8 device_path_info_length; /* = 44 */
|
| 82 |
|
|
__u8 reserved2;
|
| 83 |
|
|
__u16 reserved3;
|
| 84 |
|
|
__u8 host_bus_type[4];
|
| 85 |
|
|
__u8 interface_type[8];
|
| 86 |
|
|
union {
|
| 87 |
|
|
struct {
|
| 88 |
|
|
__u16 base_address;
|
| 89 |
|
|
__u16 reserved1;
|
| 90 |
|
|
__u32 reserved2;
|
| 91 |
|
|
} __attribute__ ((packed)) isa;
|
| 92 |
|
|
struct {
|
| 93 |
|
|
__u8 bus;
|
| 94 |
|
|
__u8 slot;
|
| 95 |
|
|
__u8 function;
|
| 96 |
|
|
__u8 channel;
|
| 97 |
|
|
__u32 reserved;
|
| 98 |
|
|
} __attribute__ ((packed)) pci;
|
| 99 |
|
|
/* pcix is same as pci */
|
| 100 |
|
|
struct {
|
| 101 |
|
|
__u64 reserved;
|
| 102 |
|
|
} __attribute__ ((packed)) ibnd;
|
| 103 |
|
|
struct {
|
| 104 |
|
|
__u64 reserved;
|
| 105 |
|
|
} __attribute__ ((packed)) xprs;
|
| 106 |
|
|
struct {
|
| 107 |
|
|
__u64 reserved;
|
| 108 |
|
|
} __attribute__ ((packed)) htpt;
|
| 109 |
|
|
struct {
|
| 110 |
|
|
__u64 reserved;
|
| 111 |
|
|
} __attribute__ ((packed)) unknown;
|
| 112 |
|
|
} interface_path;
|
| 113 |
|
|
union {
|
| 114 |
|
|
struct {
|
| 115 |
|
|
__u8 device;
|
| 116 |
|
|
__u8 reserved1;
|
| 117 |
|
|
__u16 reserved2;
|
| 118 |
|
|
__u32 reserved3;
|
| 119 |
|
|
__u64 reserved4;
|
| 120 |
|
|
} __attribute__ ((packed)) ata;
|
| 121 |
|
|
struct {
|
| 122 |
|
|
__u8 device;
|
| 123 |
|
|
__u8 lun;
|
| 124 |
|
|
__u8 reserved1;
|
| 125 |
|
|
__u8 reserved2;
|
| 126 |
|
|
__u32 reserved3;
|
| 127 |
|
|
__u64 reserved4;
|
| 128 |
|
|
} __attribute__ ((packed)) atapi;
|
| 129 |
|
|
struct {
|
| 130 |
|
|
__u16 id;
|
| 131 |
|
|
__u64 lun;
|
| 132 |
|
|
__u16 reserved1;
|
| 133 |
|
|
__u32 reserved2;
|
| 134 |
|
|
} __attribute__ ((packed)) scsi;
|
| 135 |
|
|
struct {
|
| 136 |
|
|
__u64 serial_number;
|
| 137 |
|
|
__u64 reserved;
|
| 138 |
|
|
} __attribute__ ((packed)) usb;
|
| 139 |
|
|
struct {
|
| 140 |
|
|
__u64 eui;
|
| 141 |
|
|
__u64 reserved;
|
| 142 |
|
|
} __attribute__ ((packed)) i1394;
|
| 143 |
|
|
struct {
|
| 144 |
|
|
__u64 wwid;
|
| 145 |
|
|
__u64 lun;
|
| 146 |
|
|
} __attribute__ ((packed)) fibre;
|
| 147 |
|
|
struct {
|
| 148 |
|
|
__u64 identity_tag;
|
| 149 |
|
|
__u64 reserved;
|
| 150 |
|
|
} __attribute__ ((packed)) i2o;
|
| 151 |
|
|
struct {
|
| 152 |
|
|
__u32 array_number;
|
| 153 |
|
|
__u32 reserved1;
|
| 154 |
|
|
__u64 reserved2;
|
| 155 |
|
|
} __attribute__ ((packed)) raid;
|
| 156 |
|
|
struct {
|
| 157 |
|
|
__u8 device;
|
| 158 |
|
|
__u8 reserved1;
|
| 159 |
|
|
__u16 reserved2;
|
| 160 |
|
|
__u32 reserved3;
|
| 161 |
|
|
__u64 reserved4;
|
| 162 |
|
|
} __attribute__ ((packed)) sata;
|
| 163 |
|
|
struct {
|
| 164 |
|
|
__u64 reserved1;
|
| 165 |
|
|
__u64 reserved2;
|
| 166 |
|
|
} __attribute__ ((packed)) unknown;
|
| 167 |
|
|
} device_path;
|
| 168 |
|
|
__u8 reserved4;
|
| 169 |
|
|
__u8 checksum;
|
| 170 |
|
|
} __attribute__ ((packed));
|
| 171 |
|
|
|
| 172 |
|
|
struct edd_info {
|
| 173 |
|
|
__u8 device;
|
| 174 |
|
|
__u8 version;
|
| 175 |
|
|
__u16 interface_support;
|
| 176 |
|
|
__u16 legacy_max_cylinder;
|
| 177 |
|
|
__u8 legacy_max_head;
|
| 178 |
|
|
__u8 legacy_sectors_per_track;
|
| 179 |
|
|
struct edd_device_params params;
|
| 180 |
|
|
} __attribute__ ((packed));
|
| 181 |
|
|
|
| 182 |
|
|
struct edd {
|
| 183 |
|
|
unsigned int mbr_signature[EDD_MBR_SIG_MAX];
|
| 184 |
|
|
struct edd_info edd_info[EDDMAXNR];
|
| 185 |
|
|
unsigned char mbr_signature_nr;
|
| 186 |
|
|
unsigned char edd_info_nr;
|
| 187 |
|
|
};
|
| 188 |
|
|
|
| 189 |
|
|
#endif /*!__ASSEMBLY__ */
|
| 190 |
|
|
|
| 191 |
|
|
#endif /* _LINUX_EDD_H */
|