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