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