rsaddr.c 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346
  1. // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
  2. /*******************************************************************************
  3. *
  4. * Module Name: rsaddr - Address resource descriptors (16/32/64)
  5. *
  6. ******************************************************************************/
  7. #include <acpi/acpi.h>
  8. #include "accommon.h"
  9. #include "acresrc.h"
  10. #define _COMPONENT ACPI_RESOURCES
  11. ACPI_MODULE_NAME("rsaddr")
  12. /*******************************************************************************
  13. *
  14. * acpi_rs_convert_address16 - All WORD (16-bit) address resources
  15. *
  16. ******************************************************************************/
  17. struct acpi_rsconvert_info acpi_rs_convert_address16[5] = {
  18. {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_ADDRESS16,
  19. ACPI_RS_SIZE(struct acpi_resource_address16),
  20. ACPI_RSC_TABLE_SIZE(acpi_rs_convert_address16)},
  21. {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_ADDRESS16,
  22. sizeof(struct aml_resource_address16),
  23. 0},
  24. /* Resource Type, General Flags, and Type-Specific Flags */
  25. {ACPI_RSC_ADDRESS, 0, 0, 0},
  26. /*
  27. * These fields are contiguous in both the source and destination:
  28. * Address Granularity
  29. * Address Range Minimum
  30. * Address Range Maximum
  31. * Address Translation Offset
  32. * Address Length
  33. */
  34. {ACPI_RSC_MOVE16, ACPI_RS_OFFSET(data.address16.address.granularity),
  35. AML_OFFSET(address16.granularity),
  36. 5},
  37. /* Optional resource_source (Index and String) */
  38. {ACPI_RSC_SOURCE, ACPI_RS_OFFSET(data.address16.resource_source),
  39. 0,
  40. sizeof(struct aml_resource_address16)}
  41. };
  42. /*******************************************************************************
  43. *
  44. * acpi_rs_convert_address32 - All DWORD (32-bit) address resources
  45. *
  46. ******************************************************************************/
  47. struct acpi_rsconvert_info acpi_rs_convert_address32[5] = {
  48. {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_ADDRESS32,
  49. ACPI_RS_SIZE(struct acpi_resource_address32),
  50. ACPI_RSC_TABLE_SIZE(acpi_rs_convert_address32)},
  51. {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_ADDRESS32,
  52. sizeof(struct aml_resource_address32),
  53. 0},
  54. /* Resource Type, General Flags, and Type-Specific Flags */
  55. {ACPI_RSC_ADDRESS, 0, 0, 0},
  56. /*
  57. * These fields are contiguous in both the source and destination:
  58. * Address Granularity
  59. * Address Range Minimum
  60. * Address Range Maximum
  61. * Address Translation Offset
  62. * Address Length
  63. */
  64. {ACPI_RSC_MOVE32, ACPI_RS_OFFSET(data.address32.address.granularity),
  65. AML_OFFSET(address32.granularity),
  66. 5},
  67. /* Optional resource_source (Index and String) */
  68. {ACPI_RSC_SOURCE, ACPI_RS_OFFSET(data.address32.resource_source),
  69. 0,
  70. sizeof(struct aml_resource_address32)}
  71. };
  72. /*******************************************************************************
  73. *
  74. * acpi_rs_convert_address64 - All QWORD (64-bit) address resources
  75. *
  76. ******************************************************************************/
  77. struct acpi_rsconvert_info acpi_rs_convert_address64[5] = {
  78. {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_ADDRESS64,
  79. ACPI_RS_SIZE(struct acpi_resource_address64),
  80. ACPI_RSC_TABLE_SIZE(acpi_rs_convert_address64)},
  81. {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_ADDRESS64,
  82. sizeof(struct aml_resource_address64),
  83. 0},
  84. /* Resource Type, General Flags, and Type-Specific Flags */
  85. {ACPI_RSC_ADDRESS, 0, 0, 0},
  86. /*
  87. * These fields are contiguous in both the source and destination:
  88. * Address Granularity
  89. * Address Range Minimum
  90. * Address Range Maximum
  91. * Address Translation Offset
  92. * Address Length
  93. */
  94. {ACPI_RSC_MOVE64, ACPI_RS_OFFSET(data.address64.address.granularity),
  95. AML_OFFSET(address64.granularity),
  96. 5},
  97. /* Optional resource_source (Index and String) */
  98. {ACPI_RSC_SOURCE, ACPI_RS_OFFSET(data.address64.resource_source),
  99. 0,
  100. sizeof(struct aml_resource_address64)}
  101. };
  102. /*******************************************************************************
  103. *
  104. * acpi_rs_convert_ext_address64 - All Extended (64-bit) address resources
  105. *
  106. ******************************************************************************/
  107. struct acpi_rsconvert_info acpi_rs_convert_ext_address64[5] = {
  108. {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64,
  109. ACPI_RS_SIZE(struct acpi_resource_extended_address64),
  110. ACPI_RSC_TABLE_SIZE(acpi_rs_convert_ext_address64)},
  111. {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_EXTENDED_ADDRESS64,
  112. sizeof(struct aml_resource_extended_address64),
  113. 0},
  114. /* Resource Type, General Flags, and Type-Specific Flags */
  115. {ACPI_RSC_ADDRESS, 0, 0, 0},
  116. /* Revision ID */
  117. {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.ext_address64.revision_ID),
  118. AML_OFFSET(ext_address64.revision_ID),
  119. 1},
  120. /*
  121. * These fields are contiguous in both the source and destination:
  122. * Address Granularity
  123. * Address Range Minimum
  124. * Address Range Maximum
  125. * Address Translation Offset
  126. * Address Length
  127. * Type-Specific Attribute
  128. */
  129. {ACPI_RSC_MOVE64,
  130. ACPI_RS_OFFSET(data.ext_address64.address.granularity),
  131. AML_OFFSET(ext_address64.granularity),
  132. 6}
  133. };
  134. /*******************************************************************************
  135. *
  136. * acpi_rs_convert_general_flags - Flags common to all address descriptors
  137. *
  138. ******************************************************************************/
  139. static struct acpi_rsconvert_info acpi_rs_convert_general_flags[6] = {
  140. {ACPI_RSC_FLAGINIT, 0, AML_OFFSET(address.flags),
  141. ACPI_RSC_TABLE_SIZE(acpi_rs_convert_general_flags)},
  142. /* Resource Type (Memory, Io, bus_number, etc.) */
  143. {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.address.resource_type),
  144. AML_OFFSET(address.resource_type),
  145. 1},
  146. /* General flags - Consume, Decode, min_fixed, max_fixed */
  147. {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.address.producer_consumer),
  148. AML_OFFSET(address.flags),
  149. 0},
  150. {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.address.decode),
  151. AML_OFFSET(address.flags),
  152. 1},
  153. {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.address.min_address_fixed),
  154. AML_OFFSET(address.flags),
  155. 2},
  156. {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.address.max_address_fixed),
  157. AML_OFFSET(address.flags),
  158. 3}
  159. };
  160. /*******************************************************************************
  161. *
  162. * acpi_rs_convert_mem_flags - Flags common to Memory address descriptors
  163. *
  164. ******************************************************************************/
  165. static struct acpi_rsconvert_info acpi_rs_convert_mem_flags[5] = {
  166. {ACPI_RSC_FLAGINIT, 0, AML_OFFSET(address.specific_flags),
  167. ACPI_RSC_TABLE_SIZE(acpi_rs_convert_mem_flags)},
  168. /* Memory-specific flags */
  169. {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.address.info.mem.write_protect),
  170. AML_OFFSET(address.specific_flags),
  171. 0},
  172. {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET(data.address.info.mem.caching),
  173. AML_OFFSET(address.specific_flags),
  174. 1},
  175. {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET(data.address.info.mem.range_type),
  176. AML_OFFSET(address.specific_flags),
  177. 3},
  178. {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.address.info.mem.translation),
  179. AML_OFFSET(address.specific_flags),
  180. 5}
  181. };
  182. /*******************************************************************************
  183. *
  184. * acpi_rs_convert_io_flags - Flags common to I/O address descriptors
  185. *
  186. ******************************************************************************/
  187. static struct acpi_rsconvert_info acpi_rs_convert_io_flags[4] = {
  188. {ACPI_RSC_FLAGINIT, 0, AML_OFFSET(address.specific_flags),
  189. ACPI_RSC_TABLE_SIZE(acpi_rs_convert_io_flags)},
  190. /* I/O-specific flags */
  191. {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET(data.address.info.io.range_type),
  192. AML_OFFSET(address.specific_flags),
  193. 0},
  194. {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.address.info.io.translation),
  195. AML_OFFSET(address.specific_flags),
  196. 4},
  197. {ACPI_RSC_1BITFLAG,
  198. ACPI_RS_OFFSET(data.address.info.io.translation_type),
  199. AML_OFFSET(address.specific_flags),
  200. 5}
  201. };
  202. /*******************************************************************************
  203. *
  204. * FUNCTION: acpi_rs_get_address_common
  205. *
  206. * PARAMETERS: resource - Pointer to the internal resource struct
  207. * aml - Pointer to the AML resource descriptor
  208. *
  209. * RETURN: TRUE if the resource_type field is OK, FALSE otherwise
  210. *
  211. * DESCRIPTION: Convert common flag fields from a raw AML resource descriptor
  212. * to an internal resource descriptor
  213. *
  214. ******************************************************************************/
  215. u8
  216. acpi_rs_get_address_common(struct acpi_resource *resource,
  217. union aml_resource *aml)
  218. {
  219. ACPI_FUNCTION_ENTRY();
  220. /* Validate the Resource Type */
  221. if ((aml->address.resource_type > 2) &&
  222. (aml->address.resource_type < 0xC0)) {
  223. return (FALSE);
  224. }
  225. /* Get the Resource Type and General Flags */
  226. (void)acpi_rs_convert_aml_to_resource(resource, aml,
  227. acpi_rs_convert_general_flags);
  228. /* Get the Type-Specific Flags (Memory and I/O descriptors only) */
  229. if (resource->data.address.resource_type == ACPI_MEMORY_RANGE) {
  230. (void)acpi_rs_convert_aml_to_resource(resource, aml,
  231. acpi_rs_convert_mem_flags);
  232. } else if (resource->data.address.resource_type == ACPI_IO_RANGE) {
  233. (void)acpi_rs_convert_aml_to_resource(resource, aml,
  234. acpi_rs_convert_io_flags);
  235. } else {
  236. /* Generic resource type, just grab the type_specific byte */
  237. resource->data.address.info.type_specific =
  238. aml->address.specific_flags;
  239. }
  240. return (TRUE);
  241. }
  242. /*******************************************************************************
  243. *
  244. * FUNCTION: acpi_rs_set_address_common
  245. *
  246. * PARAMETERS: aml - Pointer to the AML resource descriptor
  247. * resource - Pointer to the internal resource struct
  248. *
  249. * RETURN: None
  250. *
  251. * DESCRIPTION: Convert common flag fields from a resource descriptor to an
  252. * AML descriptor
  253. *
  254. ******************************************************************************/
  255. void
  256. acpi_rs_set_address_common(union aml_resource *aml,
  257. struct acpi_resource *resource)
  258. {
  259. ACPI_FUNCTION_ENTRY();
  260. /* Set the Resource Type and General Flags */
  261. (void)acpi_rs_convert_resource_to_aml(resource, aml,
  262. acpi_rs_convert_general_flags);
  263. /* Set the Type-Specific Flags (Memory and I/O descriptors only) */
  264. if (resource->data.address.resource_type == ACPI_MEMORY_RANGE) {
  265. (void)acpi_rs_convert_resource_to_aml(resource, aml,
  266. acpi_rs_convert_mem_flags);
  267. } else if (resource->data.address.resource_type == ACPI_IO_RANGE) {
  268. (void)acpi_rs_convert_resource_to_aml(resource, aml,
  269. acpi_rs_convert_io_flags);
  270. } else {
  271. /* Generic resource type, just copy the type_specific byte */
  272. aml->address.specific_flags =
  273. resource->data.address.info.type_specific;
  274. }
  275. }