You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

DevicePath.h 17KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535
  1. /** @file
  2. The device path protocol as defined in UEFI 2.0.
  3. The device path represents a programatic path to a device. It's the view
  4. from a software point of view. It also must persist from boot to boot, so
  5. it can not contain things like PCI bus numbers that change from boot to boot.
  6. Copyright (c) 2006 - 2008, Intel Corporation
  7. All rights reserved. This program and the accompanying materials
  8. are licensed and made available under the terms and conditions of the BSD License
  9. which accompanies this distribution. The full text of the license may be found at
  10. http://opensource.org/licenses/bsd-license.php
  11. THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
  12. WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
  13. **/
  14. #ifndef __EFI_DEVICE_PATH_PROTOCOL_H__
  15. #define __EFI_DEVICE_PATH_PROTOCOL_H__
  16. #include <gpxe/efi/Guid/PcAnsi.h>
  17. ///
  18. /// Device Path protocol
  19. ///
  20. #define EFI_DEVICE_PATH_PROTOCOL_GUID \
  21. { \
  22. 0x9576e91, 0x6d3f, 0x11d2, {0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b } \
  23. }
  24. //
  25. // Protocol GUID defined in EFI1.1.
  26. //
  27. ///
  28. /// Device Path information
  29. ///
  30. #define DEVICE_PATH_PROTOCOL EFI_DEVICE_PATH_PROTOCOL_GUID
  31. #pragma pack(1)
  32. /**
  33. This protocol can be used on any device handle to obtain generic path/location
  34. information concerning the physical device or logical device. If the handle does
  35. not logically map to a physical device, the handle may not necessarily support
  36. the device path protocol. The device path describes the location of the device
  37. the handle is for. The size of the Device Path can be determined from the structures
  38. that make up the Device Path.
  39. **/
  40. typedef struct {
  41. UINT8 Type; ///< 0x01 Hardware Device Path
  42. ///< 0x02 ACPI Device Path
  43. ///< 0x03 Messaging Device Path
  44. ///< 0x04 Media Device Path
  45. ///< 0x05 BIOS Boot Specification Device Path
  46. ///< 0x7F End of Hardware Device Path
  47. UINT8 SubType; ///< Varies by Type
  48. ///< 0xFF End Entire Device Path, or
  49. ///< 0x01 End This Instance of a Device Path and start a new
  50. ///< Device Path
  51. UINT8 Length[2]; ///< Specific Device Path data. Type and Sub-Type define
  52. ///< type of data. Size of data is included in Length.
  53. } EFI_DEVICE_PATH_PROTOCOL;
  54. ///
  55. /// For backward-compatible with EFI1.1.
  56. ///
  57. typedef EFI_DEVICE_PATH_PROTOCOL EFI_DEVICE_PATH;
  58. ///
  59. /// Hardware Device Paths
  60. ///
  61. #define HARDWARE_DEVICE_PATH 0x01
  62. #define HW_PCI_DP 0x01
  63. typedef struct {
  64. EFI_DEVICE_PATH_PROTOCOL Header;
  65. UINT8 Function;
  66. UINT8 Device;
  67. } PCI_DEVICE_PATH;
  68. #define HW_PCCARD_DP 0x02
  69. typedef struct {
  70. EFI_DEVICE_PATH_PROTOCOL Header;
  71. UINT8 FunctionNumber;
  72. } PCCARD_DEVICE_PATH;
  73. #define HW_MEMMAP_DP 0x03
  74. typedef struct {
  75. EFI_DEVICE_PATH_PROTOCOL Header;
  76. UINT32 MemoryType;
  77. EFI_PHYSICAL_ADDRESS StartingAddress;
  78. EFI_PHYSICAL_ADDRESS EndingAddress;
  79. } MEMMAP_DEVICE_PATH;
  80. #define HW_VENDOR_DP 0x04
  81. typedef struct {
  82. EFI_DEVICE_PATH_PROTOCOL Header;
  83. EFI_GUID Guid;
  84. } VENDOR_DEVICE_PATH;
  85. #define HW_CONTROLLER_DP 0x05
  86. typedef struct {
  87. EFI_DEVICE_PATH_PROTOCOL Header;
  88. UINT32 ControllerNumber;
  89. } CONTROLLER_DEVICE_PATH;
  90. ///
  91. /// ACPI Device Paths
  92. ///
  93. #define ACPI_DEVICE_PATH 0x02
  94. #define ACPI_DP 0x01
  95. typedef struct {
  96. EFI_DEVICE_PATH_PROTOCOL Header;
  97. UINT32 HID;
  98. UINT32 UID;
  99. } ACPI_HID_DEVICE_PATH;
  100. #define ACPI_EXTENDED_DP 0x02
  101. typedef struct {
  102. EFI_DEVICE_PATH_PROTOCOL Header;
  103. UINT32 HID;
  104. UINT32 UID;
  105. UINT32 CID;
  106. ///
  107. /// Optional variable length _HIDSTR
  108. /// Optional variable length _UIDSTR
  109. /// Optional variable length _CIDSTR
  110. ///
  111. } ACPI_EXTENDED_HID_DEVICE_PATH;
  112. //
  113. // EISA ID Macro
  114. // EISA ID Definition 32-bits
  115. // bits[15:0] - three character compressed ASCII EISA ID.
  116. // bits[31:16] - binary number
  117. // Compressed ASCII is 5 bits per character 0b00001 = 'A' 0b11010 = 'Z'
  118. //
  119. #define PNP_EISA_ID_CONST 0x41d0
  120. #define EISA_ID(_Name, _Num) ((UINT32)((_Name) | (_Num) << 16))
  121. #define EISA_PNP_ID(_PNPId) (EISA_ID(PNP_EISA_ID_CONST, (_PNPId)))
  122. #define EFI_PNP_ID(_PNPId) (EISA_ID(PNP_EISA_ID_CONST, (_PNPId)))
  123. #define PNP_EISA_ID_MASK 0xffff
  124. #define EISA_ID_TO_NUM(_Id) ((_Id) >> 16)
  125. #define ACPI_ADR_DP 0x03
  126. typedef struct {
  127. EFI_DEVICE_PATH_PROTOCOL Header;
  128. UINT32 ADR;
  129. } ACPI_ADR_DEVICE_PATH;
  130. #define ACPI_ADR_DISPLAY_TYPE_OTHER 0
  131. #define ACPI_ADR_DISPLAY_TYPE_VGA 1
  132. #define ACPI_ADR_DISPLAY_TYPE_TV 2
  133. #define ACPI_ADR_DISPLAY_TYPE_EXTERNAL_DIGITAL 3
  134. #define ACPI_ADR_DISPLAY_TYPE_INTERNAL_DIGITAL 4
  135. #define ACPI_DISPLAY_ADR(_DeviceIdScheme, _HeadId, _NonVgaOutput, _BiosCanDetect, _VendorInfo, _Type, _Port, _Index) \
  136. ((UINT32)( (((_DeviceIdScheme) & 0x1) << 31) | \
  137. (((_HeadId) & 0x7) << 18) | \
  138. (((_NonVgaOutput) & 0x1) << 17) | \
  139. (((_BiosCanDetect) & 0x1) << 16) | \
  140. (((_VendorInfo) & 0xf) << 12) | \
  141. (((_Type) & 0xf) << 8) | \
  142. (((_Port) & 0xf) << 4) | \
  143. ((_Index) & 0xf) ))
  144. ///
  145. /// Messaging Device Paths
  146. ///
  147. #define MESSAGING_DEVICE_PATH 0x03
  148. #define MSG_ATAPI_DP 0x01
  149. typedef struct {
  150. EFI_DEVICE_PATH_PROTOCOL Header;
  151. UINT8 PrimarySecondary;
  152. UINT8 SlaveMaster;
  153. UINT16 Lun;
  154. } ATAPI_DEVICE_PATH;
  155. #define MSG_SCSI_DP 0x02
  156. typedef struct {
  157. EFI_DEVICE_PATH_PROTOCOL Header;
  158. UINT16 Pun;
  159. UINT16 Lun;
  160. } SCSI_DEVICE_PATH;
  161. #define MSG_FIBRECHANNEL_DP 0x03
  162. typedef struct {
  163. EFI_DEVICE_PATH_PROTOCOL Header;
  164. UINT32 Reserved;
  165. UINT64 WWN;
  166. UINT64 Lun;
  167. } FIBRECHANNEL_DEVICE_PATH;
  168. #define MSG_1394_DP 0x04
  169. typedef struct {
  170. EFI_DEVICE_PATH_PROTOCOL Header;
  171. UINT32 Reserved;
  172. UINT64 Guid;
  173. } F1394_DEVICE_PATH;
  174. #define MSG_USB_DP 0x05
  175. typedef struct {
  176. EFI_DEVICE_PATH_PROTOCOL Header;
  177. UINT8 ParentPortNumber;
  178. UINT8 InterfaceNumber;
  179. } USB_DEVICE_PATH;
  180. #define MSG_USB_CLASS_DP 0x0f
  181. typedef struct {
  182. EFI_DEVICE_PATH_PROTOCOL Header;
  183. UINT16 VendorId;
  184. UINT16 ProductId;
  185. UINT8 DeviceClass;
  186. UINT8 DeviceSubClass;
  187. UINT8 DeviceProtocol;
  188. } USB_CLASS_DEVICE_PATH;
  189. #define MSG_USB_WWID_DP 0x10
  190. typedef struct {
  191. EFI_DEVICE_PATH_PROTOCOL Header;
  192. UINT16 InterfaceNumber;
  193. UINT16 VendorId;
  194. UINT16 ProductId;
  195. // CHAR16 SerialNumber[...];
  196. } USB_WWID_DEVICE_PATH;
  197. #define MSG_DEVICE_LOGICAL_UNIT_DP 0x11
  198. typedef struct {
  199. EFI_DEVICE_PATH_PROTOCOL Header;
  200. UINT8 Lun;
  201. } DEVICE_LOGICAL_UNIT_DEVICE_PATH;
  202. #define MSG_SATA_DP 0x12
  203. typedef struct {
  204. EFI_DEVICE_PATH_PROTOCOL Header;
  205. UINT16 HBAPortNumber;
  206. UINT16 PortMultiplierPortNumber;
  207. UINT16 Lun;
  208. } SATA_DEVICE_PATH;
  209. #define MSG_I2O_DP 0x06
  210. typedef struct {
  211. EFI_DEVICE_PATH_PROTOCOL Header;
  212. UINT32 Tid;
  213. } I2O_DEVICE_PATH;
  214. #define MSG_MAC_ADDR_DP 0x0b
  215. typedef struct {
  216. EFI_DEVICE_PATH_PROTOCOL Header;
  217. EFI_MAC_ADDRESS MacAddress;
  218. UINT8 IfType;
  219. } MAC_ADDR_DEVICE_PATH;
  220. #define MSG_IPv4_DP 0x0c
  221. typedef struct {
  222. EFI_DEVICE_PATH_PROTOCOL Header;
  223. EFI_IPv4_ADDRESS LocalIpAddress;
  224. EFI_IPv4_ADDRESS RemoteIpAddress;
  225. UINT16 LocalPort;
  226. UINT16 RemotePort;
  227. UINT16 Protocol;
  228. BOOLEAN StaticIpAddress;
  229. } IPv4_DEVICE_PATH;
  230. #define MSG_IPv6_DP 0x0d
  231. typedef struct {
  232. EFI_DEVICE_PATH_PROTOCOL Header;
  233. EFI_IPv6_ADDRESS LocalIpAddress;
  234. EFI_IPv6_ADDRESS RemoteIpAddress;
  235. UINT16 LocalPort;
  236. UINT16 RemotePort;
  237. UINT16 Protocol;
  238. BOOLEAN StaticIpAddress;
  239. } IPv6_DEVICE_PATH;
  240. #define MSG_INFINIBAND_DP 0x09
  241. typedef struct {
  242. EFI_DEVICE_PATH_PROTOCOL Header;
  243. UINT32 ResourceFlags;
  244. UINT8 PortGid[16];
  245. UINT64 ServiceId;
  246. UINT64 TargetPortId;
  247. UINT64 DeviceId;
  248. } INFINIBAND_DEVICE_PATH;
  249. #define INFINIBAND_RESOURCE_FLAG_IOC_SERVICE 0x01
  250. #define INFINIBAND_RESOURCE_FLAG_EXTENDED_BOOT_ENVIRONMENT 0x02
  251. #define INFINIBAND_RESOURCE_FLAG_CONSOLE_PROTOCOL 0x04
  252. #define INFINIBAND_RESOURCE_FLAG_STORAGE_PROTOCOL 0x08
  253. #define INFINIBAND_RESOURCE_FLAG_NETWORK_PROTOCOL 0x10
  254. #define MSG_UART_DP 0x0e
  255. typedef struct {
  256. EFI_DEVICE_PATH_PROTOCOL Header;
  257. UINT32 Reserved;
  258. UINT64 BaudRate;
  259. UINT8 DataBits;
  260. UINT8 Parity;
  261. UINT8 StopBits;
  262. } UART_DEVICE_PATH;
  263. //
  264. // Use VENDOR_DEVICE_PATH struct
  265. //
  266. #define MSG_VENDOR_DP 0x0a
  267. typedef VENDOR_DEVICE_PATH VENDOR_DEFINED_DEVICE_PATH;
  268. #define DEVICE_PATH_MESSAGING_PC_ANSI EFI_PC_ANSI_GUID
  269. #define DEVICE_PATH_MESSAGING_VT_100 EFI_VT_100_GUID
  270. #define DEVICE_PATH_MESSAGING_VT_100_PLUS EFI_VT_100_PLUS_GUID
  271. #define DEVICE_PATH_MESSAGING_VT_UTF8 EFI_VT_UTF8_GUID
  272. #define DEVICE_PATH_MESSAGING_UART_FLOW_CONTROL EFI_UART_DEVICE_PATH_GUID
  273. typedef struct {
  274. EFI_DEVICE_PATH_PROTOCOL Header;
  275. EFI_GUID Guid;
  276. UINT32 FlowControlMap;
  277. } UART_FLOW_CONTROL_DEVICE_PATH;
  278. #define DEVICE_PATH_MESSAGING_SAS EFI_SAS_DEVICE_PATH_GUID
  279. typedef struct {
  280. EFI_DEVICE_PATH_PROTOCOL Header;
  281. EFI_GUID Guid;
  282. UINT32 Reserved;
  283. UINT64 SasAddress;
  284. UINT64 Lun;
  285. UINT16 DeviceTopology;
  286. UINT16 RelativeTargetPort;
  287. } SAS_DEVICE_PATH;
  288. #define MSG_ISCSI_DP 0x13
  289. typedef struct {
  290. EFI_DEVICE_PATH_PROTOCOL Header;
  291. UINT16 NetworkProtocol;
  292. UINT16 LoginOption;
  293. UINT64 Lun;
  294. UINT16 TargetPortalGroupTag;
  295. // CHAR8 iSCSI Target Name
  296. } ISCSI_DEVICE_PATH;
  297. #define ISCSI_LOGIN_OPTION_NO_HEADER_DIGEST 0x0000
  298. #define ISCSI_LOGIN_OPTION_HEADER_DIGEST_USING_CRC32C 0x0002
  299. #define ISCSI_LOGIN_OPTION_NO_DATA_DIGEST 0x0000
  300. #define ISCSI_LOGIN_OPTION_DATA_DIGEST_USING_CRC32C 0x0008
  301. #define ISCSI_LOGIN_OPTION_AUTHMETHOD_CHAP 0x0000
  302. #define ISCSI_LOGIN_OPTION_AUTHMETHOD_NON 0x1000
  303. #define ISCSI_LOGIN_OPTION_CHAP_BI 0x0000
  304. #define ISCSI_LOGIN_OPTION_CHAP_UNI 0x2000
  305. //
  306. // Media Device Path
  307. //
  308. #define MEDIA_DEVICE_PATH 0x04
  309. #define MEDIA_HARDDRIVE_DP 0x01
  310. typedef struct {
  311. EFI_DEVICE_PATH_PROTOCOL Header;
  312. UINT32 PartitionNumber;
  313. UINT64 PartitionStart;
  314. UINT64 PartitionSize;
  315. UINT8 Signature[16];
  316. UINT8 MBRType;
  317. UINT8 SignatureType;
  318. } HARDDRIVE_DEVICE_PATH;
  319. #define MBR_TYPE_PCAT 0x01
  320. #define MBR_TYPE_EFI_PARTITION_TABLE_HEADER 0x02
  321. #define SIGNATURE_TYPE_MBR 0x01
  322. #define SIGNATURE_TYPE_GUID 0x02
  323. #define MEDIA_CDROM_DP 0x02
  324. typedef struct {
  325. EFI_DEVICE_PATH_PROTOCOL Header;
  326. UINT32 BootEntry;
  327. UINT64 PartitionStart;
  328. UINT64 PartitionSize;
  329. } CDROM_DEVICE_PATH;
  330. //
  331. // Use VENDOR_DEVICE_PATH struct
  332. //
  333. #define MEDIA_VENDOR_DP 0x03
  334. #define MEDIA_FILEPATH_DP 0x04
  335. typedef struct {
  336. EFI_DEVICE_PATH_PROTOCOL Header;
  337. CHAR16 PathName[1];
  338. } FILEPATH_DEVICE_PATH;
  339. #define SIZE_OF_FILEPATH_DEVICE_PATH EFI_FIELD_OFFSET(FILEPATH_DEVICE_PATH,PathName)
  340. #define MEDIA_PROTOCOL_DP 0x05
  341. typedef struct {
  342. EFI_DEVICE_PATH_PROTOCOL Header;
  343. EFI_GUID Protocol;
  344. } MEDIA_PROTOCOL_DEVICE_PATH;
  345. #define MEDIA_PIWG_FW_VOL_DP 0x7
  346. typedef struct {
  347. EFI_DEVICE_PATH_PROTOCOL Header;
  348. EFI_GUID FvName;
  349. } MEDIA_FW_VOL_DEVICE_PATH;
  350. #define MEDIA_PIWG_FW_FILE_DP 0x6
  351. typedef struct {
  352. EFI_DEVICE_PATH_PROTOCOL Header;
  353. EFI_GUID FvFileName;
  354. } MEDIA_FW_VOL_FILEPATH_DEVICE_PATH;
  355. //
  356. // BBS Device Path
  357. //
  358. #define BBS_DEVICE_PATH 0x05
  359. #define BBS_BBS_DP 0x01
  360. typedef struct {
  361. EFI_DEVICE_PATH_PROTOCOL Header;
  362. UINT16 DeviceType;
  363. UINT16 StatusFlag;
  364. CHAR8 String[1];
  365. } BBS_BBS_DEVICE_PATH;
  366. //
  367. // DeviceType definitions - from BBS specification
  368. //
  369. #define BBS_TYPE_FLOPPY 0x01
  370. #define BBS_TYPE_HARDDRIVE 0x02
  371. #define BBS_TYPE_CDROM 0x03
  372. #define BBS_TYPE_PCMCIA 0x04
  373. #define BBS_TYPE_USB 0x05
  374. #define BBS_TYPE_EMBEDDED_NETWORK 0x06
  375. #define BBS_TYPE_BEV 0x80
  376. #define BBS_TYPE_UNKNOWN 0xFF
  377. ///
  378. /// Union of all possible Device Paths and pointers to Device Paths
  379. ///
  380. typedef union {
  381. EFI_DEVICE_PATH_PROTOCOL DevPath;
  382. PCI_DEVICE_PATH Pci;
  383. PCCARD_DEVICE_PATH PcCard;
  384. MEMMAP_DEVICE_PATH MemMap;
  385. VENDOR_DEVICE_PATH Vendor;
  386. CONTROLLER_DEVICE_PATH Controller;
  387. ACPI_HID_DEVICE_PATH Acpi;
  388. ATAPI_DEVICE_PATH Atapi;
  389. SCSI_DEVICE_PATH Scsi;
  390. ISCSI_DEVICE_PATH Iscsi;
  391. FIBRECHANNEL_DEVICE_PATH FibreChannel;
  392. F1394_DEVICE_PATH F1394;
  393. USB_DEVICE_PATH Usb;
  394. SATA_DEVICE_PATH Sata;
  395. USB_CLASS_DEVICE_PATH UsbClass;
  396. I2O_DEVICE_PATH I2O;
  397. MAC_ADDR_DEVICE_PATH MacAddr;
  398. IPv4_DEVICE_PATH Ipv4;
  399. IPv6_DEVICE_PATH Ipv6;
  400. INFINIBAND_DEVICE_PATH InfiniBand;
  401. UART_DEVICE_PATH Uart;
  402. HARDDRIVE_DEVICE_PATH HardDrive;
  403. CDROM_DEVICE_PATH CD;
  404. FILEPATH_DEVICE_PATH FilePath;
  405. MEDIA_PROTOCOL_DEVICE_PATH MediaProtocol;
  406. BBS_BBS_DEVICE_PATH Bbs;
  407. } EFI_DEV_PATH;
  408. typedef union {
  409. EFI_DEVICE_PATH_PROTOCOL *DevPath;
  410. PCI_DEVICE_PATH *Pci;
  411. PCCARD_DEVICE_PATH *PcCard;
  412. MEMMAP_DEVICE_PATH *MemMap;
  413. VENDOR_DEVICE_PATH *Vendor;
  414. CONTROLLER_DEVICE_PATH *Controller;
  415. ACPI_HID_DEVICE_PATH *Acpi;
  416. ACPI_EXTENDED_HID_DEVICE_PATH *ExtendedAcpi;
  417. ATAPI_DEVICE_PATH *Atapi;
  418. SCSI_DEVICE_PATH *Scsi;
  419. FIBRECHANNEL_DEVICE_PATH *FibreChannel;
  420. F1394_DEVICE_PATH *F1394;
  421. USB_DEVICE_PATH *Usb;
  422. SATA_DEVICE_PATH *Sata;
  423. USB_CLASS_DEVICE_PATH *UsbClass;
  424. I2O_DEVICE_PATH *I2O;
  425. MAC_ADDR_DEVICE_PATH *MacAddr;
  426. IPv4_DEVICE_PATH *Ipv4;
  427. IPv6_DEVICE_PATH *Ipv6;
  428. INFINIBAND_DEVICE_PATH *InfiniBand;
  429. UART_DEVICE_PATH *Uart;
  430. HARDDRIVE_DEVICE_PATH *HardDrive;
  431. CDROM_DEVICE_PATH *CD;
  432. FILEPATH_DEVICE_PATH *FilePath;
  433. MEDIA_PROTOCOL_DEVICE_PATH *MediaProtocol;
  434. BBS_BBS_DEVICE_PATH *Bbs;
  435. UINT8 *Raw;
  436. } EFI_DEV_PATH_PTR;
  437. #pragma pack()
  438. #define END_DEVICE_PATH_TYPE 0x7f
  439. #define END_ENTIRE_DEVICE_PATH_SUBTYPE 0xFF
  440. #define END_INSTANCE_DEVICE_PATH_SUBTYPE 0x01
  441. extern EFI_GUID gEfiDevicePathProtocolGuid;
  442. #endif