pci.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320
  1. /*
  2. * GRUB -- GRand Unified Bootloader
  3. * Copyright (C) 2006,2007,2008 Free Software Foundation, Inc.
  4. *
  5. * GRUB is free software: you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License as published by
  7. * the Free Software Foundation, either version 3 of the License, or
  8. * (at your option) any later version.
  9. *
  10. * GRUB is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU General Public License
  16. * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
  17. */
  18. #ifndef GRUB_EFI_PCI_HEADER
  19. #define GRUB_EFI_PCI_HEADER 1
  20. #include <grub/symbol.h>
  21. #define GRUB_EFI_PCI_IO_GUID \
  22. { 0x4cf5b200, 0x68b8, 0x4ca5, { 0x9e, 0xec, 0xb2, 0x3e, 0x3f, 0x50, 0x02, 0x9a }}
  23. #define GRUB_EFI_PCI_ROOT_IO_GUID \
  24. { 0x2F707EBB, 0x4A1A, 0x11d4, { 0x9A, 0x38, 0x00, 0x90, 0x27, 0x3F, 0xC1, 0x4D }}
  25. typedef enum
  26. {
  27. GRUB_EFI_PCI_IO_WIDTH_UINT8,
  28. GRUB_EFI_PCI_IO_WIDTH_UINT16,
  29. GRUB_EFI_PCI_IO_WIDTH_UINT32,
  30. GRUB_EFI_PCI_IO_WIDTH_UINT64,
  31. GRUB_EFI_PCI_IO_WIDTH_FIFO_UINT8,
  32. GRUB_EFI_PCI_IO_WIDTH_FIFO_UINT16,
  33. GRUB_EFI_PCI_IO_WIDTH_FIFO_UINT32,
  34. GRUB_EFI_PCI_IO_WIDTH_FIFO_UINT64,
  35. GRUB_EFI_PCI_IO_WIDTH_FILL_UINT8,
  36. GRUB_EFI_PCI_IO_WIDTH_FILL_UINT16,
  37. GRUB_EFI_PCI_IO_WIDTH_FILL_UINT32,
  38. GRUB_EFI_PCI_IO_WIDTH_FILL_UINT64,
  39. GRUB_EFI_PCI_IO_WIDTH_MAXIMUM,
  40. }
  41. grub_efi_pci_io_width_t;
  42. struct grub_efi_pci_io;
  43. typedef grub_efi_status_t
  44. (*grub_efi_pci_io_mem_t) (struct grub_efi_pci_io *this,
  45. grub_efi_pci_io_width_t width,
  46. grub_efi_uint8_t bar_index,
  47. grub_efi_uint64_t offset,
  48. grub_efi_uintn_t count,
  49. void *buffer);
  50. typedef grub_efi_status_t
  51. (*grub_efi_pci_io_config_t) (struct grub_efi_pci_io *this,
  52. grub_efi_pci_io_width_t width,
  53. grub_efi_uint32_t offset,
  54. grub_efi_uintn_t count,
  55. void *buffer);
  56. typedef struct
  57. {
  58. grub_efi_pci_io_mem_t read;
  59. grub_efi_pci_io_mem_t write;
  60. } grub_efi_pci_io_access_t;
  61. typedef struct
  62. {
  63. grub_efi_pci_io_config_t read;
  64. grub_efi_pci_io_config_t write;
  65. } grub_efi_pci_io_config_access_t;
  66. typedef enum
  67. {
  68. GRUB_EFI_PCI_IO_OPERATION_BUS_MASTER_READ,
  69. GRUB_EFI_PCI_IO_OPERATION_BUS_MASTER_WRITE,
  70. GRUB_EFI_PCI_IO_OPERATION_BUS_MASTER_COMMON_BUFFER,
  71. GRUB_EFI_PCI_IO_OPERATION_BUS_MASTER_MAXIMUM
  72. }
  73. grub_efi_pci_io_operation_t;
  74. #define GRUB_EFI_PCI_IO_ATTRIBUTE_ISA_IO 0x0002
  75. #define GRUB_EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO 0x0004
  76. #define GRUB_EFI_PCI_IO_ATTRIBUTE_VGA_MEMORY 0x0008
  77. #define GRUB_EFI_PCI_IO_ATTRIBUTE_VGA_IO 0x0010
  78. #define GRUB_EFI_PCI_IO_ATTRIBUTE_IDE_PRIMARY_IO 0x0020
  79. #define GRUB_EFI_PCI_IO_ATTRIBUTE_IDE_SECONDARY_IO 0x0040
  80. #define GRUB_EFI_PCI_IO_ATTRIBUTE_MEMORY_WRITE_COMBINE 0x0080
  81. #define GRUB_EFI_PCI_IO_ATTRIBUTE_IO 0x0100
  82. #define GRUB_EFI_PCI_IO_ATTRIBUTE_MEMORY 0x0200
  83. #define GRUB_EFI_PCI_IO_ATTRIBUTE_BUS_MASTER 0x0400
  84. #define GRUB_EFI_PCI_IO_ATTRIBUTE_MEMORY_CACHED 0x0800
  85. #define GRUB_EFI_PCI_IO_ATTRIBUTE_MEMORY_DISABLE 0x1000
  86. #define GRUB_EFI_PCI_IO_ATTRIBUTE_EMBEDDED_DEVICE 0x2000
  87. #define GRUB_EFI_PCI_IO_ATTRIBUTE_EMBEDDED_ROM 0x4000
  88. #define GRUB_EFI_PCI_IO_ATTRIBUTE_DUAL_ADDRESS_CYCLE 0x8000
  89. #define GRUB_EFI_PCI_IO_ATTRIBUTE_ISA_IO_16 0x10000
  90. #define GRUB_EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO_16 0x20000
  91. #define GRUB_EFI_PCI_IO_ATTRIBUTE_VGA_IO_16 0x40000
  92. typedef enum
  93. {
  94. GRUB_EFI_PCI_IO_ATTRIBUTE_OPERATION_GET,
  95. GRUB_EFI_PCI_IO_ATTRIBUTE_OPERATION_SET,
  96. GRUB_EFI_PCI_IO_ATTRIBUTE_OPERATION_ENABLE,
  97. GRUB_EFI_PCI_IO_ATTRIBUTE_OPERATION_DISABLE,
  98. GRUB_EFI_PCI_IO_ATTRIBUTE_OPERATION_SUPPORTED,
  99. GRUB_EFI_PCI_IO_ATTRIBUTE_OPERATION_MAXIMUM
  100. }
  101. grub_efi_pci_io_attribute_operation_t;
  102. typedef grub_efi_status_t
  103. (*grub_efi_pci_io_poll_io_mem_t) (struct grub_efi_pci_io *this,
  104. grub_efi_pci_io_width_t width,
  105. grub_efi_uint8_t bar_ndex,
  106. grub_efi_uint64_t offset,
  107. grub_efi_uint64_t mask,
  108. grub_efi_uint64_t value,
  109. grub_efi_uint64_t delay,
  110. grub_efi_uint64_t *result);
  111. typedef grub_efi_status_t
  112. (*grub_efi_pci_io_copy_mem_t) (struct grub_efi_pci_io *this,
  113. grub_efi_pci_io_width_t width,
  114. grub_efi_uint8_t dest_bar_index,
  115. grub_efi_uint64_t dest_offset,
  116. grub_efi_uint8_t src_bar_index,
  117. grub_efi_uint64_t src_offset,
  118. grub_efi_uintn_t count);
  119. typedef grub_efi_status_t
  120. (*grub_efi_pci_io_map_t) (struct grub_efi_pci_io *this,
  121. grub_efi_pci_io_operation_t operation,
  122. void *host_address,
  123. grub_efi_uintn_t *number_of_bytes,
  124. grub_efi_uint64_t *device_address,
  125. void **mapping);
  126. typedef grub_efi_status_t
  127. (*grub_efi_pci_io_unmap_t) (struct grub_efi_pci_io *this,
  128. void *mapping);
  129. typedef grub_efi_status_t
  130. (*grub_efi_pci_io_allocate_buffer_t) (struct grub_efi_pci_io *this,
  131. grub_efi_allocate_type_t type,
  132. grub_efi_memory_type_t memory_type,
  133. grub_efi_uintn_t pages,
  134. void **host_address,
  135. grub_efi_uint64_t attributes);
  136. typedef grub_efi_status_t
  137. (*grub_efi_pci_io_free_buffer_t) (struct grub_efi_pci_io *this,
  138. grub_efi_allocate_type_t type,
  139. grub_efi_memory_type_t memory_type,
  140. grub_efi_uintn_t pages,
  141. void **host_address,
  142. grub_efi_uint64_t attributes);
  143. typedef grub_efi_status_t
  144. (*grub_efi_pci_io_flush_t) (struct grub_efi_pci_io *this);
  145. typedef grub_efi_status_t
  146. (*grub_efi_pci_io_get_location_t) (struct grub_efi_pci_io *this,
  147. grub_efi_uintn_t *segment_number,
  148. grub_efi_uintn_t *bus_number,
  149. grub_efi_uintn_t *device_number,
  150. grub_efi_uintn_t *function_number);
  151. typedef grub_efi_status_t
  152. (*grub_efi_pci_io_attributes_t) (struct grub_efi_pci_io *this,
  153. grub_efi_pci_io_attribute_operation_t operation,
  154. grub_efi_uint64_t attributes,
  155. grub_efi_uint64_t *result);
  156. typedef grub_efi_status_t
  157. (*grub_efi_pci_io_get_bar_attributes_t) (struct grub_efi_pci_io *this,
  158. grub_efi_uint8_t bar_index,
  159. grub_efi_uint64_t *supports,
  160. void **resources);
  161. typedef grub_efi_status_t
  162. (*grub_efi_pci_io_set_bar_attributes_t) (struct grub_efi_pci_io *this,
  163. grub_efi_uint64_t attributes,
  164. grub_efi_uint8_t bar_index,
  165. grub_efi_uint64_t *offset,
  166. grub_efi_uint64_t *length);
  167. struct grub_efi_pci_io {
  168. grub_efi_pci_io_poll_io_mem_t poll_mem;
  169. grub_efi_pci_io_poll_io_mem_t poll_io;
  170. grub_efi_pci_io_access_t mem;
  171. grub_efi_pci_io_access_t io;
  172. grub_efi_pci_io_config_access_t pci;
  173. grub_efi_pci_io_copy_mem_t copy_mem;
  174. grub_efi_pci_io_map_t map;
  175. grub_efi_pci_io_unmap_t unmap;
  176. grub_efi_pci_io_allocate_buffer_t allocate_buffer;
  177. grub_efi_pci_io_free_buffer_t free_buffer;
  178. grub_efi_pci_io_flush_t flush;
  179. grub_efi_pci_io_get_location_t get_location;
  180. grub_efi_pci_io_attributes_t attributes;
  181. grub_efi_pci_io_get_bar_attributes_t get_bar_attributes;
  182. grub_efi_pci_io_set_bar_attributes_t set_bar_attributes;
  183. grub_efi_uint64_t rom_size;
  184. void *rom_image;
  185. };
  186. typedef struct grub_efi_pci_io grub_efi_pci_io_t;
  187. struct grub_efi_pci_root_io;
  188. typedef struct
  189. {
  190. grub_efi_status_t(*read) (struct grub_efi_pci_root_io *this,
  191. grub_efi_pci_io_width_t width,
  192. grub_efi_uint64_t address,
  193. grub_efi_uintn_t count,
  194. void *buffer);
  195. grub_efi_status_t(*write) (struct grub_efi_pci_root_io *this,
  196. grub_efi_pci_io_width_t width,
  197. grub_efi_uint64_t address,
  198. grub_efi_uintn_t count,
  199. void *buffer);
  200. } grub_efi_pci_root_io_access_t;
  201. typedef enum
  202. {
  203. GRUB_EFI_PCI_ROOT_IO_OPERATION_BUS_MASTER_READ,
  204. GRUB_EFI_PCI_ROOT_IO_OPERATION_BUS_MASTER_WRITE,
  205. GRUB_EFI_PCI_ROOT_IO_OPERATION_BUS_MASTER_COMMON_BUFFER,
  206. GRUB_EFI_PCI_ROOT_IO_OPERATION_BUS_MASTER_READ_64,
  207. GRUB_EFI_PCI_ROOT_IO_OPERATION_BUS_MASTER_WRITE_64,
  208. GRUB_EFI_PCI_ROOT_IO_OPERATION_BUS_MASTER_COMMON_BUFFER_64,
  209. GRUB_EFI_PCI_ROOT_IO_OPERATION_BUS_MASTER_MAXIMUM
  210. }
  211. grub_efi_pci_root_io_operation_t;
  212. typedef grub_efi_status_t
  213. (*grub_efi_pci_root_io_poll_io_mem_t) (struct grub_efi_pci_root_io *this,
  214. grub_efi_pci_io_width_t width,
  215. grub_efi_uint64_t address,
  216. grub_efi_uint64_t mask,
  217. grub_efi_uint64_t value,
  218. grub_efi_uint64_t delay,
  219. grub_efi_uint64_t *result);
  220. typedef grub_efi_status_t
  221. (*grub_efi_pci_root_io_copy_mem_t) (struct grub_efi_pci_root_io *this,
  222. grub_efi_pci_io_width_t width,
  223. grub_efi_uint64_t dest_offset,
  224. grub_efi_uint64_t src_offset,
  225. grub_efi_uintn_t count);
  226. typedef grub_efi_status_t
  227. (*grub_efi_pci_root_io_map_t) (struct grub_efi_pci_root_io *this,
  228. grub_efi_pci_root_io_operation_t operation,
  229. void *host_address,
  230. grub_efi_uintn_t *number_of_bytes,
  231. grub_efi_uint64_t *device_address,
  232. void **mapping);
  233. typedef grub_efi_status_t
  234. (*grub_efi_pci_root_io_unmap_t) (struct grub_efi_pci_root_io *this,
  235. void *mapping);
  236. typedef grub_efi_status_t
  237. (*grub_efi_pci_root_io_allocate_buffer_t) (struct grub_efi_pci_root_io *this,
  238. grub_efi_allocate_type_t type,
  239. grub_efi_memory_type_t memory_type,
  240. grub_efi_uintn_t pages,
  241. void **host_address,
  242. grub_efi_uint64_t attributes);
  243. typedef grub_efi_status_t
  244. (*grub_efi_pci_root_io_free_buffer_t) (struct grub_efi_pci_root_io *this,
  245. grub_efi_uintn_t pages,
  246. void **host_address);
  247. typedef grub_efi_status_t
  248. (*grub_efi_pci_root_io_flush_t) (struct grub_efi_pci_root_io *this);
  249. typedef grub_efi_status_t
  250. (*grub_efi_pci_root_io_get_attributes_t) (struct grub_efi_pci_root_io *this,
  251. grub_efi_uint64_t *supports,
  252. void **resources);
  253. typedef grub_efi_status_t
  254. (*grub_efi_pci_root_io_set_attributes_t) (struct grub_efi_pci_root_io *this,
  255. grub_efi_uint64_t attributes,
  256. grub_efi_uint64_t *offset,
  257. grub_efi_uint64_t *length);
  258. typedef grub_efi_status_t
  259. (*grub_efi_pci_root_io_configuration_t) (struct grub_efi_pci_root_io *this,
  260. void **resources);
  261. struct grub_efi_pci_root_io {
  262. grub_efi_handle_t parent;
  263. grub_efi_pci_root_io_poll_io_mem_t poll_mem;
  264. grub_efi_pci_root_io_poll_io_mem_t poll_io;
  265. grub_efi_pci_root_io_access_t mem;
  266. grub_efi_pci_root_io_access_t io;
  267. grub_efi_pci_root_io_access_t pci;
  268. grub_efi_pci_root_io_copy_mem_t copy_mem;
  269. grub_efi_pci_root_io_map_t map;
  270. grub_efi_pci_root_io_unmap_t unmap;
  271. grub_efi_pci_root_io_allocate_buffer_t allocate_buffer;
  272. grub_efi_pci_root_io_free_buffer_t free_buffer;
  273. grub_efi_pci_root_io_flush_t flush;
  274. grub_efi_pci_root_io_get_attributes_t get_attributes;
  275. grub_efi_pci_root_io_set_attributes_t set_attributes;
  276. grub_efi_pci_root_io_configuration_t configuration;
  277. };
  278. typedef struct grub_efi_pci_root_io grub_efi_pci_root_io_t;
  279. #endif /* !GRUB_EFI_PCI_HEADER */