aml-build.c 85 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616
  1. /* Support for generating ACPI tables and passing them to Guests
  2. *
  3. * Copyright (C) 2015 Red Hat Inc
  4. *
  5. * Author: Michael S. Tsirkin <mst@redhat.com>
  6. * Author: Igor Mammedov <imammedo@redhat.com>
  7. *
  8. * This program is free software; you can redistribute it and/or modify
  9. * it under the terms of the GNU General Public License as published by
  10. * the Free Software Foundation; either version 2 of the License, or
  11. * (at your option) any later version.
  12. * This program is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU General Public License for more details.
  16. * You should have received a copy of the GNU General Public License along
  17. * with this program; if not, see <http://www.gnu.org/licenses/>.
  18. */
  19. #include "qemu/osdep.h"
  20. #include <glib/gprintf.h>
  21. #include "hw/acpi/aml-build.h"
  22. #include "qemu/bswap.h"
  23. #include "qemu/bitops.h"
  24. #include "system/numa.h"
  25. #include "hw/boards.h"
  26. #include "hw/acpi/tpm.h"
  27. #include "hw/pci/pci_host.h"
  28. #include "hw/pci/pci_bus.h"
  29. #include "hw/pci/pci_bridge.h"
  30. #include "qemu/cutils.h"
  31. static GArray *build_alloc_array(void)
  32. {
  33. return g_array_new(false, true /* clear */, 1);
  34. }
  35. static void build_free_array(GArray *array)
  36. {
  37. g_array_free(array, true);
  38. }
  39. static void build_prepend_byte(GArray *array, uint8_t val)
  40. {
  41. g_array_prepend_val(array, val);
  42. }
  43. static void build_append_byte(GArray *array, uint8_t val)
  44. {
  45. g_array_append_val(array, val);
  46. }
  47. static void build_append_padded_str(GArray *array, const char *str,
  48. size_t maxlen, char pad)
  49. {
  50. size_t i;
  51. size_t len = strlen(str);
  52. g_assert(len <= maxlen);
  53. g_array_append_vals(array, str, len);
  54. for (i = maxlen - len; i > 0; i--) {
  55. g_array_append_val(array, pad);
  56. }
  57. }
  58. static void build_append_array(GArray *array, GArray *val)
  59. {
  60. g_array_append_vals(array, val->data, val->len);
  61. }
  62. #define ACPI_NAMESEG_LEN 4
  63. void crs_range_insert(GPtrArray *ranges, uint64_t base, uint64_t limit)
  64. {
  65. CrsRangeEntry *entry;
  66. entry = g_malloc(sizeof(*entry));
  67. entry->base = base;
  68. entry->limit = limit;
  69. g_ptr_array_add(ranges, entry);
  70. }
  71. static void crs_range_free(gpointer data)
  72. {
  73. CrsRangeEntry *entry = (CrsRangeEntry *)data;
  74. g_free(entry);
  75. }
  76. void crs_range_set_init(CrsRangeSet *range_set)
  77. {
  78. range_set->io_ranges = g_ptr_array_new_with_free_func(crs_range_free);
  79. range_set->mem_ranges = g_ptr_array_new_with_free_func(crs_range_free);
  80. range_set->mem_64bit_ranges =
  81. g_ptr_array_new_with_free_func(crs_range_free);
  82. }
  83. void crs_range_set_free(CrsRangeSet *range_set)
  84. {
  85. g_ptr_array_free(range_set->io_ranges, true);
  86. g_ptr_array_free(range_set->mem_ranges, true);
  87. g_ptr_array_free(range_set->mem_64bit_ranges, true);
  88. }
  89. static gint crs_range_compare(gconstpointer a, gconstpointer b)
  90. {
  91. CrsRangeEntry *entry_a = *(CrsRangeEntry **)a;
  92. CrsRangeEntry *entry_b = *(CrsRangeEntry **)b;
  93. if (entry_a->base < entry_b->base) {
  94. return -1;
  95. } else if (entry_a->base > entry_b->base) {
  96. return 1;
  97. } else {
  98. return 0;
  99. }
  100. }
  101. /*
  102. * crs_replace_with_free_ranges - given the 'used' ranges within [start - end]
  103. * interval, computes the 'free' ranges from the same interval.
  104. * Example: If the input array is { [a1 - a2],[b1 - b2] }, the function
  105. * will return { [base - a1], [a2 - b1], [b2 - limit] }.
  106. */
  107. void crs_replace_with_free_ranges(GPtrArray *ranges,
  108. uint64_t start, uint64_t end)
  109. {
  110. GPtrArray *free_ranges = g_ptr_array_new();
  111. uint64_t free_base = start;
  112. int i;
  113. g_ptr_array_sort(ranges, crs_range_compare);
  114. for (i = 0; i < ranges->len; i++) {
  115. CrsRangeEntry *used = g_ptr_array_index(ranges, i);
  116. if (free_base < used->base) {
  117. crs_range_insert(free_ranges, free_base, used->base - 1);
  118. }
  119. free_base = used->limit + 1;
  120. }
  121. if (free_base < end) {
  122. crs_range_insert(free_ranges, free_base, end);
  123. }
  124. g_ptr_array_set_size(ranges, 0);
  125. for (i = 0; i < free_ranges->len; i++) {
  126. g_ptr_array_add(ranges, g_ptr_array_index(free_ranges, i));
  127. }
  128. g_ptr_array_free(free_ranges, true);
  129. }
  130. /*
  131. * crs_range_merge - merges adjacent ranges in the given array.
  132. * Array elements are deleted and replaced with the merged ranges.
  133. */
  134. static void crs_range_merge(GPtrArray *range)
  135. {
  136. GPtrArray *tmp = g_ptr_array_new_with_free_func(crs_range_free);
  137. CrsRangeEntry *entry;
  138. uint64_t range_base, range_limit;
  139. int i;
  140. if (!range->len) {
  141. return;
  142. }
  143. g_ptr_array_sort(range, crs_range_compare);
  144. entry = g_ptr_array_index(range, 0);
  145. range_base = entry->base;
  146. range_limit = entry->limit;
  147. for (i = 1; i < range->len; i++) {
  148. entry = g_ptr_array_index(range, i);
  149. if (entry->base - 1 == range_limit) {
  150. range_limit = entry->limit;
  151. } else {
  152. crs_range_insert(tmp, range_base, range_limit);
  153. range_base = entry->base;
  154. range_limit = entry->limit;
  155. }
  156. }
  157. crs_range_insert(tmp, range_base, range_limit);
  158. g_ptr_array_set_size(range, 0);
  159. for (i = 0; i < tmp->len; i++) {
  160. entry = g_ptr_array_index(tmp, i);
  161. crs_range_insert(range, entry->base, entry->limit);
  162. }
  163. g_ptr_array_free(tmp, true);
  164. }
  165. static void
  166. build_append_nameseg(GArray *array, const char *seg)
  167. {
  168. int len;
  169. len = strlen(seg);
  170. assert(len <= ACPI_NAMESEG_LEN);
  171. g_array_append_vals(array, seg, len);
  172. /* Pad up to ACPI_NAMESEG_LEN characters if necessary. */
  173. g_array_append_vals(array, "____", ACPI_NAMESEG_LEN - len);
  174. }
  175. static void G_GNUC_PRINTF(2, 0)
  176. build_append_namestringv(GArray *array, const char *format, va_list ap)
  177. {
  178. char *s;
  179. char **segs;
  180. char **segs_iter;
  181. int seg_count = 0;
  182. s = g_strdup_vprintf(format, ap);
  183. segs = g_strsplit(s, ".", 0);
  184. g_free(s);
  185. /* count segments */
  186. segs_iter = segs;
  187. while (*segs_iter) {
  188. ++segs_iter;
  189. ++seg_count;
  190. }
  191. /*
  192. * ACPI 5.0 spec: 20.2.2 Name Objects Encoding:
  193. * "SegCount can be from 1 to 255"
  194. */
  195. assert(seg_count > 0 && seg_count <= 255);
  196. /* handle RootPath || PrefixPath */
  197. s = *segs;
  198. while (*s == '\\' || *s == '^') {
  199. build_append_byte(array, *s);
  200. ++s;
  201. }
  202. switch (seg_count) {
  203. case 1:
  204. if (!*s) {
  205. build_append_byte(array, 0x00); /* NullName */
  206. } else {
  207. build_append_nameseg(array, s);
  208. }
  209. break;
  210. case 2:
  211. build_append_byte(array, 0x2E); /* DualNamePrefix */
  212. build_append_nameseg(array, s);
  213. build_append_nameseg(array, segs[1]);
  214. break;
  215. default:
  216. build_append_byte(array, 0x2F); /* MultiNamePrefix */
  217. build_append_byte(array, seg_count);
  218. /* handle the 1st segment manually due to prefix/root path */
  219. build_append_nameseg(array, s);
  220. /* add the rest of segments */
  221. segs_iter = segs + 1;
  222. while (*segs_iter) {
  223. build_append_nameseg(array, *segs_iter);
  224. ++segs_iter;
  225. }
  226. break;
  227. }
  228. g_strfreev(segs);
  229. }
  230. G_GNUC_PRINTF(2, 3)
  231. static void build_append_namestring(GArray *array, const char *format, ...)
  232. {
  233. va_list ap;
  234. va_start(ap, format);
  235. build_append_namestringv(array, format, ap);
  236. va_end(ap);
  237. }
  238. /* 5.4 Definition Block Encoding */
  239. enum {
  240. PACKAGE_LENGTH_1BYTE_SHIFT = 6, /* Up to 63 - use extra 2 bits. */
  241. PACKAGE_LENGTH_2BYTE_SHIFT = 4,
  242. PACKAGE_LENGTH_3BYTE_SHIFT = 12,
  243. PACKAGE_LENGTH_4BYTE_SHIFT = 20,
  244. };
  245. static void
  246. build_prepend_package_length(GArray *package, unsigned length, bool incl_self)
  247. {
  248. uint8_t byte;
  249. unsigned length_bytes;
  250. if (length + 1 < (1 << PACKAGE_LENGTH_1BYTE_SHIFT)) {
  251. length_bytes = 1;
  252. } else if (length + 2 < (1 << PACKAGE_LENGTH_3BYTE_SHIFT)) {
  253. length_bytes = 2;
  254. } else if (length + 3 < (1 << PACKAGE_LENGTH_4BYTE_SHIFT)) {
  255. length_bytes = 3;
  256. } else {
  257. length_bytes = 4;
  258. }
  259. /*
  260. * NamedField uses PkgLength encoding but it doesn't include length
  261. * of PkgLength itself.
  262. */
  263. if (incl_self) {
  264. /*
  265. * PkgLength is the length of the inclusive length of the data
  266. * and PkgLength's length itself when used for terms with
  267. * explicit length.
  268. */
  269. length += length_bytes;
  270. }
  271. switch (length_bytes) {
  272. case 1:
  273. byte = length;
  274. build_prepend_byte(package, byte);
  275. return;
  276. case 4:
  277. byte = length >> PACKAGE_LENGTH_4BYTE_SHIFT;
  278. build_prepend_byte(package, byte);
  279. length &= (1 << PACKAGE_LENGTH_4BYTE_SHIFT) - 1;
  280. /* fall through */
  281. case 3:
  282. byte = length >> PACKAGE_LENGTH_3BYTE_SHIFT;
  283. build_prepend_byte(package, byte);
  284. length &= (1 << PACKAGE_LENGTH_3BYTE_SHIFT) - 1;
  285. /* fall through */
  286. case 2:
  287. byte = length >> PACKAGE_LENGTH_2BYTE_SHIFT;
  288. build_prepend_byte(package, byte);
  289. length &= (1 << PACKAGE_LENGTH_2BYTE_SHIFT) - 1;
  290. /* fall through */
  291. }
  292. /*
  293. * Most significant two bits of byte zero indicate how many following bytes
  294. * are in PkgLength encoding.
  295. */
  296. byte = ((length_bytes - 1) << PACKAGE_LENGTH_1BYTE_SHIFT) | length;
  297. build_prepend_byte(package, byte);
  298. }
  299. static void
  300. build_append_pkg_length(GArray *array, unsigned length, bool incl_self)
  301. {
  302. GArray *tmp = build_alloc_array();
  303. build_prepend_package_length(tmp, length, incl_self);
  304. build_append_array(array, tmp);
  305. build_free_array(tmp);
  306. }
  307. static void build_package(GArray *package, uint8_t op)
  308. {
  309. build_prepend_package_length(package, package->len, true);
  310. build_prepend_byte(package, op);
  311. }
  312. static void build_extop_package(GArray *package, uint8_t op)
  313. {
  314. build_package(package, op);
  315. build_prepend_byte(package, 0x5B); /* ExtOpPrefix */
  316. }
  317. void build_append_int_noprefix(GArray *table, uint64_t value, int size)
  318. {
  319. int i;
  320. for (i = 0; i < size; ++i) {
  321. build_append_byte(table, value & 0xFF);
  322. value = value >> 8;
  323. }
  324. }
  325. static void build_append_int(GArray *table, uint64_t value)
  326. {
  327. if (value == 0x00) {
  328. build_append_byte(table, 0x00); /* ZeroOp */
  329. } else if (value == 0x01) {
  330. build_append_byte(table, 0x01); /* OneOp */
  331. } else if (value <= 0xFF) {
  332. build_append_byte(table, 0x0A); /* BytePrefix */
  333. build_append_int_noprefix(table, value, 1);
  334. } else if (value <= 0xFFFF) {
  335. build_append_byte(table, 0x0B); /* WordPrefix */
  336. build_append_int_noprefix(table, value, 2);
  337. } else if (value <= 0xFFFFFFFF) {
  338. build_append_byte(table, 0x0C); /* DWordPrefix */
  339. build_append_int_noprefix(table, value, 4);
  340. } else {
  341. build_append_byte(table, 0x0E); /* QWordPrefix */
  342. build_append_int_noprefix(table, value, 8);
  343. }
  344. }
  345. /* Generic Address Structure (GAS)
  346. * ACPI 2.0/3.0: 5.2.3.1 Generic Address Structure
  347. * 2.0 compat note:
  348. * @access_width must be 0, see ACPI 2.0:Table 5-1
  349. */
  350. void build_append_gas(GArray *table, AmlAddressSpace as,
  351. uint8_t bit_width, uint8_t bit_offset,
  352. uint8_t access_width, uint64_t address)
  353. {
  354. build_append_int_noprefix(table, as, 1);
  355. build_append_int_noprefix(table, bit_width, 1);
  356. build_append_int_noprefix(table, bit_offset, 1);
  357. build_append_int_noprefix(table, access_width, 1);
  358. build_append_int_noprefix(table, address, 8);
  359. }
  360. /*
  361. * Build NAME(XXXX, 0x00000000) where 0x00000000 is encoded as a dword,
  362. * and return the offset to 0x00000000 for runtime patching.
  363. *
  364. * Warning: runtime patching is best avoided. Only use this as
  365. * a replacement for DataTableRegion (for guests that don't
  366. * support it).
  367. */
  368. int
  369. build_append_named_dword(GArray *array, const char *name_format, ...)
  370. {
  371. int offset;
  372. va_list ap;
  373. build_append_byte(array, 0x08); /* NameOp */
  374. va_start(ap, name_format);
  375. build_append_namestringv(array, name_format, ap);
  376. va_end(ap);
  377. build_append_byte(array, 0x0C); /* DWordPrefix */
  378. offset = array->len;
  379. build_append_int_noprefix(array, 0x00000000, 4);
  380. assert(array->len == offset + 4);
  381. return offset;
  382. }
  383. static GPtrArray *alloc_list;
  384. static Aml *aml_alloc(void)
  385. {
  386. Aml *var = g_new0(typeof(*var), 1);
  387. g_ptr_array_add(alloc_list, var);
  388. var->block_flags = AML_NO_OPCODE;
  389. var->buf = build_alloc_array();
  390. return var;
  391. }
  392. static Aml *aml_opcode(uint8_t op)
  393. {
  394. Aml *var = aml_alloc();
  395. var->op = op;
  396. var->block_flags = AML_OPCODE;
  397. return var;
  398. }
  399. static Aml *aml_bundle(uint8_t op, AmlBlockFlags flags)
  400. {
  401. Aml *var = aml_alloc();
  402. var->op = op;
  403. var->block_flags = flags;
  404. return var;
  405. }
  406. static void aml_free(gpointer data, gpointer user_data)
  407. {
  408. Aml *var = data;
  409. build_free_array(var->buf);
  410. g_free(var);
  411. }
  412. Aml *init_aml_allocator(void)
  413. {
  414. assert(!alloc_list);
  415. alloc_list = g_ptr_array_new();
  416. return aml_alloc();
  417. }
  418. void free_aml_allocator(void)
  419. {
  420. g_ptr_array_foreach(alloc_list, aml_free, NULL);
  421. g_ptr_array_free(alloc_list, true);
  422. alloc_list = 0;
  423. }
  424. /* pack data with DefBuffer encoding */
  425. static void build_buffer(GArray *array, uint8_t op)
  426. {
  427. GArray *data = build_alloc_array();
  428. build_append_int(data, array->len);
  429. g_array_prepend_vals(array, data->data, data->len);
  430. build_free_array(data);
  431. build_package(array, op);
  432. }
  433. void aml_append(Aml *parent_ctx, Aml *child)
  434. {
  435. GArray *buf = build_alloc_array();
  436. build_append_array(buf, child->buf);
  437. switch (child->block_flags) {
  438. case AML_OPCODE:
  439. build_append_byte(parent_ctx->buf, child->op);
  440. break;
  441. case AML_EXT_PACKAGE:
  442. build_extop_package(buf, child->op);
  443. break;
  444. case AML_PACKAGE:
  445. build_package(buf, child->op);
  446. break;
  447. case AML_RES_TEMPLATE:
  448. build_append_byte(buf, 0x79); /* EndTag */
  449. /*
  450. * checksum operations are treated as succeeded if checksum
  451. * field is zero. [ACPI Spec 1.0b, 6.4.2.8 End Tag]
  452. */
  453. build_append_byte(buf, 0);
  454. /* fall through, to pack resources in buffer */
  455. case AML_BUFFER:
  456. build_buffer(buf, child->op);
  457. break;
  458. case AML_NO_OPCODE:
  459. break;
  460. default:
  461. g_assert_not_reached();
  462. }
  463. build_append_array(parent_ctx->buf, buf);
  464. build_free_array(buf);
  465. }
  466. /* ACPI 1.0b: 16.2.5.1 Namespace Modifier Objects Encoding: DefScope */
  467. Aml *aml_scope(const char *name_format, ...)
  468. {
  469. va_list ap;
  470. Aml *var = aml_bundle(0x10 /* ScopeOp */, AML_PACKAGE);
  471. va_start(ap, name_format);
  472. build_append_namestringv(var->buf, name_format, ap);
  473. va_end(ap);
  474. return var;
  475. }
  476. /* ACPI 1.0b: 16.2.5.3 Type 1 Opcodes Encoding: DefReturn */
  477. Aml *aml_return(Aml *val)
  478. {
  479. Aml *var = aml_opcode(0xA4 /* ReturnOp */);
  480. aml_append(var, val);
  481. return var;
  482. }
  483. /* ACPI 1.0b: 16.2.6.3 Debug Objects Encoding: DebugObj */
  484. Aml *aml_debug(void)
  485. {
  486. Aml *var = aml_alloc();
  487. build_append_byte(var->buf, 0x5B); /* ExtOpPrefix */
  488. build_append_byte(var->buf, 0x31); /* DebugOp */
  489. return var;
  490. }
  491. /*
  492. * ACPI 1.0b: 16.2.3 Data Objects Encoding:
  493. * encodes: ByteConst, WordConst, DWordConst, QWordConst, ZeroOp, OneOp
  494. */
  495. Aml *aml_int(const uint64_t val)
  496. {
  497. Aml *var = aml_alloc();
  498. build_append_int(var->buf, val);
  499. return var;
  500. }
  501. /*
  502. * helper to construct NameString, which returns Aml object
  503. * for using with aml_append or other aml_* terms
  504. */
  505. Aml *aml_name(const char *name_format, ...)
  506. {
  507. va_list ap;
  508. Aml *var = aml_alloc();
  509. va_start(ap, name_format);
  510. build_append_namestringv(var->buf, name_format, ap);
  511. va_end(ap);
  512. return var;
  513. }
  514. /* ACPI 1.0b: 16.2.5.1 Namespace Modifier Objects Encoding: DefName */
  515. Aml *aml_name_decl(const char *name, Aml *val)
  516. {
  517. Aml *var = aml_opcode(0x08 /* NameOp */);
  518. build_append_namestring(var->buf, "%s", name);
  519. aml_append(var, val);
  520. return var;
  521. }
  522. /* ACPI 1.0b: 16.2.6.1 Arg Objects Encoding */
  523. Aml *aml_arg(int pos)
  524. {
  525. uint8_t op = 0x68 /* ARG0 op */ + pos;
  526. assert(pos <= 6);
  527. return aml_opcode(op);
  528. }
  529. /* ACPI 2.0a: 17.2.4.4 Type 2 Opcodes Encoding: DefToInteger */
  530. Aml *aml_to_integer(Aml *arg)
  531. {
  532. Aml *var = aml_opcode(0x99 /* ToIntegerOp */);
  533. aml_append(var, arg);
  534. build_append_byte(var->buf, 0x00 /* NullNameOp */);
  535. return var;
  536. }
  537. /* ACPI 2.0a: 17.2.4.4 Type 2 Opcodes Encoding: DefToHexString */
  538. Aml *aml_to_hexstring(Aml *src, Aml *dst)
  539. {
  540. Aml *var = aml_opcode(0x98 /* ToHexStringOp */);
  541. aml_append(var, src);
  542. if (dst) {
  543. aml_append(var, dst);
  544. } else {
  545. build_append_byte(var->buf, 0x00 /* NullNameOp */);
  546. }
  547. return var;
  548. }
  549. /* ACPI 2.0a: 17.2.4.4 Type 2 Opcodes Encoding: DefToBuffer */
  550. Aml *aml_to_buffer(Aml *src, Aml *dst)
  551. {
  552. Aml *var = aml_opcode(0x96 /* ToBufferOp */);
  553. aml_append(var, src);
  554. if (dst) {
  555. aml_append(var, dst);
  556. } else {
  557. build_append_byte(var->buf, 0x00 /* NullNameOp */);
  558. }
  559. return var;
  560. }
  561. /* ACPI 2.0a: 17.2.4.4 Type 2 Opcodes Encoding: DefToDecimalString */
  562. Aml *aml_to_decimalstring(Aml *src, Aml *dst)
  563. {
  564. Aml *var = aml_opcode(0x97 /* ToDecimalStringOp */);
  565. aml_append(var, src);
  566. if (dst) {
  567. aml_append(var, dst);
  568. } else {
  569. build_append_byte(var->buf, 0x00 /* NullNameOp */);
  570. }
  571. return var;
  572. }
  573. /* ACPI 1.0b: 16.2.5.4 Type 2 Opcodes Encoding: DefStore */
  574. Aml *aml_store(Aml *val, Aml *target)
  575. {
  576. Aml *var = aml_opcode(0x70 /* StoreOp */);
  577. aml_append(var, val);
  578. aml_append(var, target);
  579. return var;
  580. }
  581. /**
  582. * build_opcode_2arg_dst:
  583. * @op: 1-byte opcode
  584. * @arg1: 1st operand
  585. * @arg2: 2nd operand
  586. * @dst: optional target to store to, set to NULL if it's not required
  587. *
  588. * An internal helper to compose AML terms that have
  589. * "Op Operand Operand Target"
  590. * pattern.
  591. *
  592. * Returns: The newly allocated and composed according to pattern Aml object.
  593. */
  594. static Aml *
  595. build_opcode_2arg_dst(uint8_t op, Aml *arg1, Aml *arg2, Aml *dst)
  596. {
  597. Aml *var = aml_opcode(op);
  598. aml_append(var, arg1);
  599. aml_append(var, arg2);
  600. if (dst) {
  601. aml_append(var, dst);
  602. } else {
  603. build_append_byte(var->buf, 0x00 /* NullNameOp */);
  604. }
  605. return var;
  606. }
  607. /* ACPI 1.0b: 16.2.5.4 Type 2 Opcodes Encoding: DefAnd */
  608. Aml *aml_and(Aml *arg1, Aml *arg2, Aml *dst)
  609. {
  610. return build_opcode_2arg_dst(0x7B /* AndOp */, arg1, arg2, dst);
  611. }
  612. /* ACPI 1.0b: 16.2.5.4 Type 2 Opcodes Encoding: DefOr */
  613. Aml *aml_or(Aml *arg1, Aml *arg2, Aml *dst)
  614. {
  615. return build_opcode_2arg_dst(0x7D /* OrOp */, arg1, arg2, dst);
  616. }
  617. /* ACPI 1.0b: 16.2.5.4 Type 2 Opcodes Encoding: DefLAnd */
  618. Aml *aml_land(Aml *arg1, Aml *arg2)
  619. {
  620. Aml *var = aml_opcode(0x90 /* LAndOp */);
  621. aml_append(var, arg1);
  622. aml_append(var, arg2);
  623. return var;
  624. }
  625. /* ACPI 1.0b: 16.2.5.4 Type 2 Opcodes Encoding: DefLOr */
  626. Aml *aml_lor(Aml *arg1, Aml *arg2)
  627. {
  628. Aml *var = aml_opcode(0x91 /* LOrOp */);
  629. aml_append(var, arg1);
  630. aml_append(var, arg2);
  631. return var;
  632. }
  633. /* ACPI 1.0b: 16.2.5.4 Type 2 Opcodes Encoding: DefShiftLeft */
  634. Aml *aml_shiftleft(Aml *arg1, Aml *count)
  635. {
  636. return build_opcode_2arg_dst(0x79 /* ShiftLeftOp */, arg1, count, NULL);
  637. }
  638. /* ACPI 1.0b: 16.2.5.4 Type 2 Opcodes Encoding: DefShiftRight */
  639. Aml *aml_shiftright(Aml *arg1, Aml *count, Aml *dst)
  640. {
  641. return build_opcode_2arg_dst(0x7A /* ShiftRightOp */, arg1, count, dst);
  642. }
  643. /* ACPI 1.0b: 16.2.5.4 Type 2 Opcodes Encoding: DefLLess */
  644. Aml *aml_lless(Aml *arg1, Aml *arg2)
  645. {
  646. Aml *var = aml_opcode(0x95 /* LLessOp */);
  647. aml_append(var, arg1);
  648. aml_append(var, arg2);
  649. return var;
  650. }
  651. /* ACPI 1.0b: 16.2.5.4 Type 2 Opcodes Encoding: DefAdd */
  652. Aml *aml_add(Aml *arg1, Aml *arg2, Aml *dst)
  653. {
  654. return build_opcode_2arg_dst(0x72 /* AddOp */, arg1, arg2, dst);
  655. }
  656. /* ACPI 1.0b: 16.2.5.4 Type 2 Opcodes Encoding: DefSubtract */
  657. Aml *aml_subtract(Aml *arg1, Aml *arg2, Aml *dst)
  658. {
  659. return build_opcode_2arg_dst(0x74 /* SubtractOp */, arg1, arg2, dst);
  660. }
  661. /* ACPI 1.0b: 16.2.5.4 Type 2 Opcodes Encoding: DefIncrement */
  662. Aml *aml_increment(Aml *arg)
  663. {
  664. Aml *var = aml_opcode(0x75 /* IncrementOp */);
  665. aml_append(var, arg);
  666. return var;
  667. }
  668. /* ACPI 1.0b: 16.2.5.4 Type 2 Opcodes Encoding: DefDecrement */
  669. Aml *aml_decrement(Aml *arg)
  670. {
  671. Aml *var = aml_opcode(0x76 /* DecrementOp */);
  672. aml_append(var, arg);
  673. return var;
  674. }
  675. /* ACPI 1.0b: 16.2.5.4 Type 2 Opcodes Encoding: DefIndex */
  676. Aml *aml_index(Aml *arg1, Aml *idx)
  677. {
  678. return build_opcode_2arg_dst(0x88 /* IndexOp */, arg1, idx, NULL);
  679. }
  680. /* ACPI 1.0b: 16.2.5.3 Type 1 Opcodes Encoding: DefNotify */
  681. Aml *aml_notify(Aml *arg1, Aml *arg2)
  682. {
  683. Aml *var = aml_opcode(0x86 /* NotifyOp */);
  684. aml_append(var, arg1);
  685. aml_append(var, arg2);
  686. return var;
  687. }
  688. /* ACPI 1.0b: 16.2.5.3 Type 1 Opcodes Encoding: DefBreak */
  689. Aml *aml_break(void)
  690. {
  691. Aml *var = aml_opcode(0xa5 /* BreakOp */);
  692. return var;
  693. }
  694. /* helper to call method without argument */
  695. Aml *aml_call0(const char *method)
  696. {
  697. Aml *var = aml_alloc();
  698. build_append_namestring(var->buf, "%s", method);
  699. return var;
  700. }
  701. /* helper to call method with 1 argument */
  702. Aml *aml_call1(const char *method, Aml *arg1)
  703. {
  704. Aml *var = aml_alloc();
  705. build_append_namestring(var->buf, "%s", method);
  706. aml_append(var, arg1);
  707. return var;
  708. }
  709. /* helper to call method with 2 arguments */
  710. Aml *aml_call2(const char *method, Aml *arg1, Aml *arg2)
  711. {
  712. Aml *var = aml_alloc();
  713. build_append_namestring(var->buf, "%s", method);
  714. aml_append(var, arg1);
  715. aml_append(var, arg2);
  716. return var;
  717. }
  718. /* helper to call method with 3 arguments */
  719. Aml *aml_call3(const char *method, Aml *arg1, Aml *arg2, Aml *arg3)
  720. {
  721. Aml *var = aml_alloc();
  722. build_append_namestring(var->buf, "%s", method);
  723. aml_append(var, arg1);
  724. aml_append(var, arg2);
  725. aml_append(var, arg3);
  726. return var;
  727. }
  728. /* helper to call method with 4 arguments */
  729. Aml *aml_call4(const char *method, Aml *arg1, Aml *arg2, Aml *arg3, Aml *arg4)
  730. {
  731. Aml *var = aml_alloc();
  732. build_append_namestring(var->buf, "%s", method);
  733. aml_append(var, arg1);
  734. aml_append(var, arg2);
  735. aml_append(var, arg3);
  736. aml_append(var, arg4);
  737. return var;
  738. }
  739. /* helper to call method with 5 arguments */
  740. Aml *aml_call5(const char *method, Aml *arg1, Aml *arg2, Aml *arg3, Aml *arg4,
  741. Aml *arg5)
  742. {
  743. Aml *var = aml_alloc();
  744. build_append_namestring(var->buf, "%s", method);
  745. aml_append(var, arg1);
  746. aml_append(var, arg2);
  747. aml_append(var, arg3);
  748. aml_append(var, arg4);
  749. aml_append(var, arg5);
  750. return var;
  751. }
  752. /* helper to call method with 5 arguments */
  753. Aml *aml_call6(const char *method, Aml *arg1, Aml *arg2, Aml *arg3, Aml *arg4,
  754. Aml *arg5, Aml *arg6)
  755. {
  756. Aml *var = aml_alloc();
  757. build_append_namestring(var->buf, "%s", method);
  758. aml_append(var, arg1);
  759. aml_append(var, arg2);
  760. aml_append(var, arg3);
  761. aml_append(var, arg4);
  762. aml_append(var, arg5);
  763. aml_append(var, arg6);
  764. return var;
  765. }
  766. /*
  767. * ACPI 5.0: 6.4.3.8.1 GPIO Connection Descriptor
  768. * Type 1, Large Item Name 0xC
  769. */
  770. static Aml *aml_gpio_connection(AmlGpioConnectionType type,
  771. AmlConsumerAndProducer con_and_pro,
  772. uint8_t flags, AmlPinConfig pin_config,
  773. uint16_t output_drive,
  774. uint16_t debounce_timeout,
  775. const uint32_t pin_list[], uint32_t pin_count,
  776. const char *resource_source_name,
  777. const uint8_t *vendor_data,
  778. uint16_t vendor_data_len)
  779. {
  780. Aml *var = aml_alloc();
  781. const uint16_t min_desc_len = 0x16;
  782. uint16_t resource_source_name_len, length;
  783. uint16_t pin_table_offset, resource_source_name_offset, vendor_data_offset;
  784. uint32_t i;
  785. assert(resource_source_name);
  786. resource_source_name_len = strlen(resource_source_name) + 1;
  787. length = min_desc_len + resource_source_name_len + vendor_data_len;
  788. pin_table_offset = min_desc_len + 1;
  789. resource_source_name_offset = pin_table_offset + pin_count * 2;
  790. vendor_data_offset = resource_source_name_offset + resource_source_name_len;
  791. build_append_byte(var->buf, 0x8C); /* GPIO Connection Descriptor */
  792. build_append_int_noprefix(var->buf, length, 2); /* Length */
  793. build_append_byte(var->buf, 1); /* Revision ID */
  794. build_append_byte(var->buf, type); /* GPIO Connection Type */
  795. /* General Flags (2 bytes) */
  796. build_append_int_noprefix(var->buf, con_and_pro, 2);
  797. /* Interrupt and IO Flags (2 bytes) */
  798. build_append_int_noprefix(var->buf, flags, 2);
  799. /* Pin Configuration 0 = Default 1 = Pull-up 2 = Pull-down 3 = No Pull */
  800. build_append_byte(var->buf, pin_config);
  801. /* Output Drive Strength (2 bytes) */
  802. build_append_int_noprefix(var->buf, output_drive, 2);
  803. /* Debounce Timeout (2 bytes) */
  804. build_append_int_noprefix(var->buf, debounce_timeout, 2);
  805. /* Pin Table Offset (2 bytes) */
  806. build_append_int_noprefix(var->buf, pin_table_offset, 2);
  807. build_append_byte(var->buf, 0); /* Resource Source Index */
  808. /* Resource Source Name Offset (2 bytes) */
  809. build_append_int_noprefix(var->buf, resource_source_name_offset, 2);
  810. /* Vendor Data Offset (2 bytes) */
  811. build_append_int_noprefix(var->buf, vendor_data_offset, 2);
  812. /* Vendor Data Length (2 bytes) */
  813. build_append_int_noprefix(var->buf, vendor_data_len, 2);
  814. /* Pin Number (2n bytes)*/
  815. for (i = 0; i < pin_count; i++) {
  816. build_append_int_noprefix(var->buf, pin_list[i], 2);
  817. }
  818. /* Resource Source Name */
  819. build_append_namestring(var->buf, "%s", resource_source_name);
  820. build_append_byte(var->buf, '\0');
  821. /* Vendor-defined Data */
  822. if (vendor_data != NULL) {
  823. g_array_append_vals(var->buf, vendor_data, vendor_data_len);
  824. }
  825. return var;
  826. }
  827. /*
  828. * ACPI 5.0: 19.5.53
  829. * GpioInt(GPIO Interrupt Connection Resource Descriptor Macro)
  830. */
  831. Aml *aml_gpio_int(AmlConsumerAndProducer con_and_pro,
  832. AmlLevelAndEdge edge_level,
  833. AmlActiveHighAndLow active_level, AmlShared shared,
  834. AmlPinConfig pin_config, uint16_t debounce_timeout,
  835. const uint32_t pin_list[], uint32_t pin_count,
  836. const char *resource_source_name,
  837. const uint8_t *vendor_data, uint16_t vendor_data_len)
  838. {
  839. uint8_t flags = edge_level | (active_level << 1) | (shared << 3);
  840. return aml_gpio_connection(AML_INTERRUPT_CONNECTION, con_and_pro, flags,
  841. pin_config, 0, debounce_timeout, pin_list,
  842. pin_count, resource_source_name, vendor_data,
  843. vendor_data_len);
  844. }
  845. /*
  846. * ACPI 1.0b: 6.4.3.4 32-Bit Fixed Location Memory Range Descriptor
  847. * (Type 1, Large Item Name 0x6)
  848. */
  849. Aml *aml_memory32_fixed(uint32_t addr, uint32_t size,
  850. AmlReadAndWrite read_and_write)
  851. {
  852. Aml *var = aml_alloc();
  853. build_append_byte(var->buf, 0x86); /* Memory32Fixed Resource Descriptor */
  854. build_append_byte(var->buf, 9); /* Length, bits[7:0] value = 9 */
  855. build_append_byte(var->buf, 0); /* Length, bits[15:8] value = 0 */
  856. build_append_byte(var->buf, read_and_write); /* Write status, 1 rw 0 ro */
  857. /* Range base address */
  858. build_append_byte(var->buf, extract32(addr, 0, 8)); /* bits[7:0] */
  859. build_append_byte(var->buf, extract32(addr, 8, 8)); /* bits[15:8] */
  860. build_append_byte(var->buf, extract32(addr, 16, 8)); /* bits[23:16] */
  861. build_append_byte(var->buf, extract32(addr, 24, 8)); /* bits[31:24] */
  862. /* Range length */
  863. build_append_byte(var->buf, extract32(size, 0, 8)); /* bits[7:0] */
  864. build_append_byte(var->buf, extract32(size, 8, 8)); /* bits[15:8] */
  865. build_append_byte(var->buf, extract32(size, 16, 8)); /* bits[23:16] */
  866. build_append_byte(var->buf, extract32(size, 24, 8)); /* bits[31:24] */
  867. return var;
  868. }
  869. /*
  870. * ACPI 5.0: 6.4.3.6 Extended Interrupt Descriptor
  871. * Type 1, Large Item Name 0x9
  872. */
  873. Aml *aml_interrupt(AmlConsumerAndProducer con_and_pro,
  874. AmlLevelAndEdge level_and_edge,
  875. AmlActiveHighAndLow high_and_low, AmlShared shared,
  876. uint32_t *irq_list, uint8_t irq_count)
  877. {
  878. int i;
  879. Aml *var = aml_alloc();
  880. uint8_t irq_flags = con_and_pro | (level_and_edge << 1)
  881. | (high_and_low << 2) | (shared << 3);
  882. const int header_bytes_in_len = 2;
  883. uint16_t len = header_bytes_in_len + irq_count * sizeof(uint32_t);
  884. assert(irq_count > 0);
  885. build_append_byte(var->buf, 0x89); /* Extended irq descriptor */
  886. build_append_byte(var->buf, len & 0xFF); /* Length, bits[7:0] */
  887. build_append_byte(var->buf, len >> 8); /* Length, bits[15:8] */
  888. build_append_byte(var->buf, irq_flags); /* Interrupt Vector Information. */
  889. build_append_byte(var->buf, irq_count); /* Interrupt table length */
  890. /* Interrupt Number List */
  891. for (i = 0; i < irq_count; i++) {
  892. build_append_int_noprefix(var->buf, irq_list[i], 4);
  893. }
  894. return var;
  895. }
  896. /* ACPI 1.0b: 6.4.2.5 I/O Port Descriptor */
  897. Aml *aml_io(AmlIODecode dec, uint16_t min_base, uint16_t max_base,
  898. uint8_t aln, uint8_t len)
  899. {
  900. Aml *var = aml_alloc();
  901. build_append_byte(var->buf, 0x47); /* IO port descriptor */
  902. build_append_byte(var->buf, dec);
  903. build_append_byte(var->buf, min_base & 0xff);
  904. build_append_byte(var->buf, (min_base >> 8) & 0xff);
  905. build_append_byte(var->buf, max_base & 0xff);
  906. build_append_byte(var->buf, (max_base >> 8) & 0xff);
  907. build_append_byte(var->buf, aln);
  908. build_append_byte(var->buf, len);
  909. return var;
  910. }
  911. /*
  912. * ACPI 1.0b: 6.4.2.1.1 ASL Macro for IRQ Descriptor
  913. *
  914. * More verbose description at:
  915. * ACPI 5.0: 19.5.64 IRQNoFlags (Interrupt Resource Descriptor Macro)
  916. * 6.4.2.1 IRQ Descriptor
  917. */
  918. Aml *aml_irq_no_flags(uint8_t irq)
  919. {
  920. uint16_t irq_mask;
  921. Aml *var = aml_alloc();
  922. assert(irq < 16);
  923. build_append_byte(var->buf, 0x22); /* IRQ descriptor 2 byte form */
  924. irq_mask = 1U << irq;
  925. build_append_byte(var->buf, irq_mask & 0xFF); /* IRQ mask bits[7:0] */
  926. build_append_byte(var->buf, irq_mask >> 8); /* IRQ mask bits[15:8] */
  927. return var;
  928. }
  929. /* ACPI 1.0b: 16.2.5.4 Type 2 Opcodes Encoding: DefLNot */
  930. Aml *aml_lnot(Aml *arg)
  931. {
  932. Aml *var = aml_opcode(0x92 /* LNotOp */);
  933. aml_append(var, arg);
  934. return var;
  935. }
  936. /* ACPI 1.0b: 16.2.5.4 Type 2 Opcodes Encoding: DefLEqual */
  937. Aml *aml_equal(Aml *arg1, Aml *arg2)
  938. {
  939. Aml *var = aml_opcode(0x93 /* LequalOp */);
  940. aml_append(var, arg1);
  941. aml_append(var, arg2);
  942. return var;
  943. }
  944. /* ACPI 1.0b: 16.2.5.4 Type 2 Opcodes Encoding: DefLGreater */
  945. Aml *aml_lgreater(Aml *arg1, Aml *arg2)
  946. {
  947. Aml *var = aml_opcode(0x94 /* LGreaterOp */);
  948. aml_append(var, arg1);
  949. aml_append(var, arg2);
  950. return var;
  951. }
  952. /* ACPI 1.0b: 16.2.5.4 Type 2 Opcodes Encoding: DefLGreaterEqual */
  953. Aml *aml_lgreater_equal(Aml *arg1, Aml *arg2)
  954. {
  955. /* LGreaterEqualOp := LNotOp LLessOp */
  956. Aml *var = aml_opcode(0x92 /* LNotOp */);
  957. build_append_byte(var->buf, 0x95 /* LLessOp */);
  958. aml_append(var, arg1);
  959. aml_append(var, arg2);
  960. return var;
  961. }
  962. /* ACPI 1.0b: 16.2.5.3 Type 1 Opcodes Encoding: DefIfElse */
  963. Aml *aml_if(Aml *predicate)
  964. {
  965. Aml *var = aml_bundle(0xA0 /* IfOp */, AML_PACKAGE);
  966. aml_append(var, predicate);
  967. return var;
  968. }
  969. /* ACPI 1.0b: 16.2.5.3 Type 1 Opcodes Encoding: DefElse */
  970. Aml *aml_else(void)
  971. {
  972. Aml *var = aml_bundle(0xA1 /* ElseOp */, AML_PACKAGE);
  973. return var;
  974. }
  975. /* ACPI 1.0b: 16.2.5.3 Type 1 Opcodes Encoding: DefWhile */
  976. Aml *aml_while(Aml *predicate)
  977. {
  978. Aml *var = aml_bundle(0xA2 /* WhileOp */, AML_PACKAGE);
  979. aml_append(var, predicate);
  980. return var;
  981. }
  982. /* ACPI 1.0b: 16.2.5.2 Named Objects Encoding: DefMethod */
  983. Aml *aml_method(const char *name, int arg_count, AmlSerializeFlag sflag)
  984. {
  985. Aml *var = aml_bundle(0x14 /* MethodOp */, AML_PACKAGE);
  986. int methodflags;
  987. /*
  988. * MethodFlags:
  989. * bit 0-2: ArgCount (0-7)
  990. * bit 3: SerializeFlag
  991. * 0: NotSerialized
  992. * 1: Serialized
  993. * bit 4-7: reserved (must be 0)
  994. */
  995. assert(arg_count < 8);
  996. methodflags = arg_count | (sflag << 3);
  997. build_append_namestring(var->buf, "%s", name);
  998. build_append_byte(var->buf, methodflags); /* MethodFlags: ArgCount */
  999. return var;
  1000. }
  1001. /* ACPI 1.0b: 16.2.5.2 Named Objects Encoding: DefDevice */
  1002. Aml *aml_device(const char *name_format, ...)
  1003. {
  1004. va_list ap;
  1005. Aml *var = aml_bundle(0x82 /* DeviceOp */, AML_EXT_PACKAGE);
  1006. va_start(ap, name_format);
  1007. build_append_namestringv(var->buf, name_format, ap);
  1008. va_end(ap);
  1009. return var;
  1010. }
  1011. /* ACPI 1.0b: 6.4.1 ASL Macros for Resource Descriptors */
  1012. Aml *aml_resource_template(void)
  1013. {
  1014. /* ResourceTemplate is a buffer of Resources with EndTag at the end */
  1015. Aml *var = aml_bundle(0x11 /* BufferOp */, AML_RES_TEMPLATE);
  1016. return var;
  1017. }
  1018. /* ACPI 1.0b: 16.2.5.4 Type 2 Opcodes Encoding: DefBuffer
  1019. * Pass byte_list as NULL to request uninitialized buffer to reserve space.
  1020. */
  1021. Aml *aml_buffer(int buffer_size, uint8_t *byte_list)
  1022. {
  1023. int i;
  1024. Aml *var = aml_bundle(0x11 /* BufferOp */, AML_BUFFER);
  1025. for (i = 0; i < buffer_size; i++) {
  1026. if (byte_list == NULL) {
  1027. build_append_byte(var->buf, 0x0);
  1028. } else {
  1029. build_append_byte(var->buf, byte_list[i]);
  1030. }
  1031. }
  1032. return var;
  1033. }
  1034. /* ACPI 1.0b: 16.2.5.4 Type 2 Opcodes Encoding: DefPackage */
  1035. Aml *aml_package(uint8_t num_elements)
  1036. {
  1037. Aml *var = aml_bundle(0x12 /* PackageOp */, AML_PACKAGE);
  1038. build_append_byte(var->buf, num_elements);
  1039. return var;
  1040. }
  1041. /* ACPI 1.0b: 16.2.5.2 Named Objects Encoding: DefOpRegion */
  1042. Aml *aml_operation_region(const char *name, AmlRegionSpace rs,
  1043. Aml *offset, uint32_t len)
  1044. {
  1045. Aml *var = aml_alloc();
  1046. build_append_byte(var->buf, 0x5B); /* ExtOpPrefix */
  1047. build_append_byte(var->buf, 0x80); /* OpRegionOp */
  1048. build_append_namestring(var->buf, "%s", name);
  1049. build_append_byte(var->buf, rs);
  1050. aml_append(var, offset);
  1051. build_append_int(var->buf, len);
  1052. return var;
  1053. }
  1054. /* ACPI 1.0b: 16.2.5.2 Named Objects Encoding: NamedField */
  1055. Aml *aml_named_field(const char *name, unsigned length)
  1056. {
  1057. Aml *var = aml_alloc();
  1058. build_append_nameseg(var->buf, name);
  1059. build_append_pkg_length(var->buf, length, false);
  1060. return var;
  1061. }
  1062. /* ACPI 1.0b: 16.2.5.2 Named Objects Encoding: ReservedField */
  1063. Aml *aml_reserved_field(unsigned length)
  1064. {
  1065. Aml *var = aml_alloc();
  1066. /* ReservedField := 0x00 PkgLength */
  1067. build_append_byte(var->buf, 0x00);
  1068. build_append_pkg_length(var->buf, length, false);
  1069. return var;
  1070. }
  1071. /* ACPI 1.0b: 16.2.5.2 Named Objects Encoding: DefField */
  1072. Aml *aml_field(const char *name, AmlAccessType type, AmlLockRule lock,
  1073. AmlUpdateRule rule)
  1074. {
  1075. Aml *var = aml_bundle(0x81 /* FieldOp */, AML_EXT_PACKAGE);
  1076. uint8_t flags = rule << 5 | type;
  1077. flags |= lock << 4; /* LockRule at 4 bit offset */
  1078. build_append_namestring(var->buf, "%s", name);
  1079. build_append_byte(var->buf, flags);
  1080. return var;
  1081. }
  1082. static
  1083. Aml *create_field_common(int opcode, Aml *srcbuf, Aml *index, const char *name)
  1084. {
  1085. Aml *var = aml_opcode(opcode);
  1086. aml_append(var, srcbuf);
  1087. aml_append(var, index);
  1088. build_append_namestring(var->buf, "%s", name);
  1089. return var;
  1090. }
  1091. /* ACPI 1.0b: 16.2.5.2 Named Objects Encoding: DefCreateField */
  1092. Aml *aml_create_field(Aml *srcbuf, Aml *bit_index, Aml *num_bits,
  1093. const char *name)
  1094. {
  1095. Aml *var = aml_alloc();
  1096. build_append_byte(var->buf, 0x5B); /* ExtOpPrefix */
  1097. build_append_byte(var->buf, 0x13); /* CreateFieldOp */
  1098. aml_append(var, srcbuf);
  1099. aml_append(var, bit_index);
  1100. aml_append(var, num_bits);
  1101. build_append_namestring(var->buf, "%s", name);
  1102. return var;
  1103. }
  1104. /* ACPI 1.0b: 16.2.5.2 Named Objects Encoding: DefCreateDWordField */
  1105. Aml *aml_create_dword_field(Aml *srcbuf, Aml *index, const char *name)
  1106. {
  1107. return create_field_common(0x8A /* CreateDWordFieldOp */,
  1108. srcbuf, index, name);
  1109. }
  1110. /* ACPI 2.0a: 17.2.4.2 Named Objects Encoding: DefCreateQWordField */
  1111. Aml *aml_create_qword_field(Aml *srcbuf, Aml *index, const char *name)
  1112. {
  1113. return create_field_common(0x8F /* CreateQWordFieldOp */,
  1114. srcbuf, index, name);
  1115. }
  1116. /* ACPI 1.0b: 16.2.3 Data Objects Encoding: String */
  1117. Aml *aml_string(const char *name_format, ...)
  1118. {
  1119. Aml *var = aml_opcode(0x0D /* StringPrefix */);
  1120. va_list ap;
  1121. char *s;
  1122. int len;
  1123. va_start(ap, name_format);
  1124. len = g_vasprintf(&s, name_format, ap);
  1125. va_end(ap);
  1126. g_array_append_vals(var->buf, s, len + 1);
  1127. g_free(s);
  1128. return var;
  1129. }
  1130. /* ACPI 1.0b: 16.2.6.2 Local Objects Encoding */
  1131. Aml *aml_local(int num)
  1132. {
  1133. uint8_t op = 0x60 /* Local0Op */ + num;
  1134. assert(num <= 7);
  1135. return aml_opcode(op);
  1136. }
  1137. /* ACPI 2.0a: 17.2.2 Data Objects Encoding: DefVarPackage */
  1138. Aml *aml_varpackage(uint32_t num_elements)
  1139. {
  1140. Aml *var = aml_bundle(0x13 /* VarPackageOp */, AML_PACKAGE);
  1141. build_append_int(var->buf, num_elements);
  1142. return var;
  1143. }
  1144. /* ACPI 1.0b: 16.2.5.2 Named Objects Encoding: DefProcessor */
  1145. Aml *aml_processor(uint8_t proc_id, uint32_t pblk_addr, uint8_t pblk_len,
  1146. const char *name_format, ...)
  1147. {
  1148. va_list ap;
  1149. Aml *var = aml_bundle(0x83 /* ProcessorOp */, AML_EXT_PACKAGE);
  1150. va_start(ap, name_format);
  1151. build_append_namestringv(var->buf, name_format, ap);
  1152. va_end(ap);
  1153. build_append_byte(var->buf, proc_id); /* ProcID */
  1154. build_append_int_noprefix(var->buf, pblk_addr, sizeof(pblk_addr));
  1155. build_append_byte(var->buf, pblk_len); /* PblkLen */
  1156. return var;
  1157. }
  1158. static uint8_t Hex2Digit(char c)
  1159. {
  1160. if (c >= 'A') {
  1161. return c - 'A' + 10;
  1162. }
  1163. return c - '0';
  1164. }
  1165. /* ACPI 1.0b: 15.2.3.6.4.1 EISAID Macro - Convert EISA ID String To Integer */
  1166. Aml *aml_eisaid(const char *str)
  1167. {
  1168. Aml *var = aml_alloc();
  1169. uint32_t id;
  1170. g_assert(strlen(str) == 7);
  1171. id = (str[0] - 0x40) << 26 |
  1172. (str[1] - 0x40) << 21 |
  1173. (str[2] - 0x40) << 16 |
  1174. Hex2Digit(str[3]) << 12 |
  1175. Hex2Digit(str[4]) << 8 |
  1176. Hex2Digit(str[5]) << 4 |
  1177. Hex2Digit(str[6]);
  1178. build_append_byte(var->buf, 0x0C); /* DWordPrefix */
  1179. build_append_int_noprefix(var->buf, bswap32(id), sizeof(id));
  1180. return var;
  1181. }
  1182. /* ACPI 1.0b: 6.4.3.5.5 Word Address Space Descriptor: bytes 3-5 */
  1183. static Aml *aml_as_desc_header(AmlResourceType type, AmlMinFixed min_fixed,
  1184. AmlMaxFixed max_fixed, AmlDecode dec,
  1185. uint8_t type_flags)
  1186. {
  1187. uint8_t flags = max_fixed | min_fixed | dec;
  1188. Aml *var = aml_alloc();
  1189. build_append_byte(var->buf, type);
  1190. build_append_byte(var->buf, flags);
  1191. build_append_byte(var->buf, type_flags); /* Type Specific Flags */
  1192. return var;
  1193. }
  1194. /* ACPI 1.0b: 6.4.3.5.5 Word Address Space Descriptor */
  1195. static Aml *aml_word_as_desc(AmlResourceType type, AmlMinFixed min_fixed,
  1196. AmlMaxFixed max_fixed, AmlDecode dec,
  1197. uint16_t addr_gran, uint16_t addr_min,
  1198. uint16_t addr_max, uint16_t addr_trans,
  1199. uint16_t len, uint8_t type_flags)
  1200. {
  1201. Aml *var = aml_alloc();
  1202. build_append_byte(var->buf, 0x88); /* Word Address Space Descriptor */
  1203. /* minimum length since we do not encode optional fields */
  1204. build_append_byte(var->buf, 0x0D);
  1205. build_append_byte(var->buf, 0x0);
  1206. aml_append(var,
  1207. aml_as_desc_header(type, min_fixed, max_fixed, dec, type_flags));
  1208. build_append_int_noprefix(var->buf, addr_gran, sizeof(addr_gran));
  1209. build_append_int_noprefix(var->buf, addr_min, sizeof(addr_min));
  1210. build_append_int_noprefix(var->buf, addr_max, sizeof(addr_max));
  1211. build_append_int_noprefix(var->buf, addr_trans, sizeof(addr_trans));
  1212. build_append_int_noprefix(var->buf, len, sizeof(len));
  1213. return var;
  1214. }
  1215. /* ACPI 1.0b: 6.4.3.5.3 DWord Address Space Descriptor */
  1216. static Aml *aml_dword_as_desc(AmlResourceType type, AmlMinFixed min_fixed,
  1217. AmlMaxFixed max_fixed, AmlDecode dec,
  1218. uint32_t addr_gran, uint32_t addr_min,
  1219. uint32_t addr_max, uint32_t addr_trans,
  1220. uint32_t len, uint8_t type_flags)
  1221. {
  1222. Aml *var = aml_alloc();
  1223. build_append_byte(var->buf, 0x87); /* DWord Address Space Descriptor */
  1224. /* minimum length since we do not encode optional fields */
  1225. build_append_byte(var->buf, 23);
  1226. build_append_byte(var->buf, 0x0);
  1227. aml_append(var,
  1228. aml_as_desc_header(type, min_fixed, max_fixed, dec, type_flags));
  1229. build_append_int_noprefix(var->buf, addr_gran, sizeof(addr_gran));
  1230. build_append_int_noprefix(var->buf, addr_min, sizeof(addr_min));
  1231. build_append_int_noprefix(var->buf, addr_max, sizeof(addr_max));
  1232. build_append_int_noprefix(var->buf, addr_trans, sizeof(addr_trans));
  1233. build_append_int_noprefix(var->buf, len, sizeof(len));
  1234. return var;
  1235. }
  1236. /* ACPI 1.0b: 6.4.3.5.1 QWord Address Space Descriptor */
  1237. static Aml *aml_qword_as_desc(AmlResourceType type, AmlMinFixed min_fixed,
  1238. AmlMaxFixed max_fixed, AmlDecode dec,
  1239. uint64_t addr_gran, uint64_t addr_min,
  1240. uint64_t addr_max, uint64_t addr_trans,
  1241. uint64_t len, uint8_t type_flags)
  1242. {
  1243. Aml *var = aml_alloc();
  1244. build_append_byte(var->buf, 0x8A); /* QWord Address Space Descriptor */
  1245. /* minimum length since we do not encode optional fields */
  1246. build_append_byte(var->buf, 0x2B);
  1247. build_append_byte(var->buf, 0x0);
  1248. aml_append(var,
  1249. aml_as_desc_header(type, min_fixed, max_fixed, dec, type_flags));
  1250. build_append_int_noprefix(var->buf, addr_gran, sizeof(addr_gran));
  1251. build_append_int_noprefix(var->buf, addr_min, sizeof(addr_min));
  1252. build_append_int_noprefix(var->buf, addr_max, sizeof(addr_max));
  1253. build_append_int_noprefix(var->buf, addr_trans, sizeof(addr_trans));
  1254. build_append_int_noprefix(var->buf, len, sizeof(len));
  1255. return var;
  1256. }
  1257. /*
  1258. * ACPI 1.0b: 6.4.3.5.6 ASL Macros for WORD Address Descriptor
  1259. *
  1260. * More verbose description at:
  1261. * ACPI 5.0: 19.5.141 WordBusNumber (Word Bus Number Resource Descriptor Macro)
  1262. */
  1263. Aml *aml_word_bus_number(AmlMinFixed min_fixed, AmlMaxFixed max_fixed,
  1264. AmlDecode dec, uint16_t addr_gran,
  1265. uint16_t addr_min, uint16_t addr_max,
  1266. uint16_t addr_trans, uint16_t len)
  1267. {
  1268. return aml_word_as_desc(AML_BUS_NUMBER_RANGE, min_fixed, max_fixed, dec,
  1269. addr_gran, addr_min, addr_max, addr_trans, len, 0);
  1270. }
  1271. /*
  1272. * ACPI 1.0b: 6.4.3.5.6 ASL Macros for WORD Address Descriptor
  1273. *
  1274. * More verbose description at:
  1275. * ACPI 5.0: 19.5.142 WordIO (Word IO Resource Descriptor Macro)
  1276. */
  1277. Aml *aml_word_io(AmlMinFixed min_fixed, AmlMaxFixed max_fixed,
  1278. AmlDecode dec, AmlISARanges isa_ranges,
  1279. uint16_t addr_gran, uint16_t addr_min,
  1280. uint16_t addr_max, uint16_t addr_trans,
  1281. uint16_t len)
  1282. {
  1283. return aml_word_as_desc(AML_IO_RANGE, min_fixed, max_fixed, dec,
  1284. addr_gran, addr_min, addr_max, addr_trans, len,
  1285. isa_ranges);
  1286. }
  1287. /*
  1288. * ACPI 1.0b: 6.4.3.5.4 ASL Macros for DWORD Address Descriptor
  1289. *
  1290. * More verbose description at:
  1291. * ACPI 5.0: 19.5.33 DWordIO (DWord IO Resource Descriptor Macro)
  1292. */
  1293. Aml *aml_dword_io(AmlMinFixed min_fixed, AmlMaxFixed max_fixed,
  1294. AmlDecode dec, AmlISARanges isa_ranges,
  1295. uint32_t addr_gran, uint32_t addr_min,
  1296. uint32_t addr_max, uint32_t addr_trans,
  1297. uint32_t len)
  1298. {
  1299. return aml_dword_as_desc(AML_IO_RANGE, min_fixed, max_fixed, dec,
  1300. addr_gran, addr_min, addr_max, addr_trans, len,
  1301. isa_ranges);
  1302. }
  1303. /*
  1304. * ACPI 1.0b: 6.4.3.5.4 ASL Macros for DWORD Address Space Descriptor
  1305. *
  1306. * More verbose description at:
  1307. * ACPI 5.0: 19.5.34 DWordMemory (DWord Memory Resource Descriptor Macro)
  1308. */
  1309. Aml *aml_dword_memory(AmlDecode dec, AmlMinFixed min_fixed,
  1310. AmlMaxFixed max_fixed, AmlCacheable cacheable,
  1311. AmlReadAndWrite read_and_write,
  1312. uint32_t addr_gran, uint32_t addr_min,
  1313. uint32_t addr_max, uint32_t addr_trans,
  1314. uint32_t len)
  1315. {
  1316. uint8_t flags = read_and_write | (cacheable << 1);
  1317. return aml_dword_as_desc(AML_MEMORY_RANGE, min_fixed, max_fixed,
  1318. dec, addr_gran, addr_min, addr_max,
  1319. addr_trans, len, flags);
  1320. }
  1321. /*
  1322. * ACPI 1.0b: 6.4.3.5.2 ASL Macros for QWORD Address Space Descriptor
  1323. *
  1324. * More verbose description at:
  1325. * ACPI 5.0: 19.5.102 QWordMemory (QWord Memory Resource Descriptor Macro)
  1326. */
  1327. Aml *aml_qword_memory(AmlDecode dec, AmlMinFixed min_fixed,
  1328. AmlMaxFixed max_fixed, AmlCacheable cacheable,
  1329. AmlReadAndWrite read_and_write,
  1330. uint64_t addr_gran, uint64_t addr_min,
  1331. uint64_t addr_max, uint64_t addr_trans,
  1332. uint64_t len)
  1333. {
  1334. uint8_t flags = read_and_write | (cacheable << 1);
  1335. return aml_qword_as_desc(AML_MEMORY_RANGE, min_fixed, max_fixed,
  1336. dec, addr_gran, addr_min, addr_max,
  1337. addr_trans, len, flags);
  1338. }
  1339. /* ACPI 1.0b: 6.4.2.2 DMA Format/6.4.2.2.1 ASL Macro for DMA Descriptor */
  1340. Aml *aml_dma(AmlDmaType typ, AmlDmaBusMaster bm, AmlTransferSize sz,
  1341. uint8_t channel)
  1342. {
  1343. Aml *var = aml_alloc();
  1344. uint8_t flags = sz | bm << 2 | typ << 5;
  1345. assert(channel < 8);
  1346. build_append_byte(var->buf, 0x2A); /* Byte 0: DMA Descriptor */
  1347. build_append_byte(var->buf, 1U << channel); /* Byte 1: _DMA - DmaChannel */
  1348. build_append_byte(var->buf, flags); /* Byte 2 */
  1349. return var;
  1350. }
  1351. /* ACPI 1.0b: 16.2.5.3 Type 1 Opcodes Encoding: DefSleep */
  1352. Aml *aml_sleep(uint64_t msec)
  1353. {
  1354. Aml *var = aml_alloc();
  1355. build_append_byte(var->buf, 0x5B); /* ExtOpPrefix */
  1356. build_append_byte(var->buf, 0x22); /* SleepOp */
  1357. aml_append(var, aml_int(msec));
  1358. return var;
  1359. }
  1360. static uint8_t Hex2Byte(const char *src)
  1361. {
  1362. int hi, lo;
  1363. hi = Hex2Digit(src[0]);
  1364. assert(hi >= 0);
  1365. assert(hi <= 15);
  1366. lo = Hex2Digit(src[1]);
  1367. assert(lo >= 0);
  1368. assert(lo <= 15);
  1369. return (hi << 4) | lo;
  1370. }
  1371. /*
  1372. * ACPI 3.0: 17.5.124 ToUUID (Convert String to UUID Macro)
  1373. * e.g. UUID: aabbccdd-eeff-gghh-iijj-kkllmmnnoopp
  1374. * call aml_touuid("aabbccdd-eeff-gghh-iijj-kkllmmnnoopp");
  1375. */
  1376. Aml *aml_touuid(const char *uuid)
  1377. {
  1378. Aml *var = aml_bundle(0x11 /* BufferOp */, AML_BUFFER);
  1379. assert(strlen(uuid) == 36);
  1380. assert(uuid[8] == '-');
  1381. assert(uuid[13] == '-');
  1382. assert(uuid[18] == '-');
  1383. assert(uuid[23] == '-');
  1384. build_append_byte(var->buf, Hex2Byte(uuid + 6)); /* dd - at offset 00 */
  1385. build_append_byte(var->buf, Hex2Byte(uuid + 4)); /* cc - at offset 01 */
  1386. build_append_byte(var->buf, Hex2Byte(uuid + 2)); /* bb - at offset 02 */
  1387. build_append_byte(var->buf, Hex2Byte(uuid + 0)); /* aa - at offset 03 */
  1388. build_append_byte(var->buf, Hex2Byte(uuid + 11)); /* ff - at offset 04 */
  1389. build_append_byte(var->buf, Hex2Byte(uuid + 9)); /* ee - at offset 05 */
  1390. build_append_byte(var->buf, Hex2Byte(uuid + 16)); /* hh - at offset 06 */
  1391. build_append_byte(var->buf, Hex2Byte(uuid + 14)); /* gg - at offset 07 */
  1392. build_append_byte(var->buf, Hex2Byte(uuid + 19)); /* ii - at offset 08 */
  1393. build_append_byte(var->buf, Hex2Byte(uuid + 21)); /* jj - at offset 09 */
  1394. build_append_byte(var->buf, Hex2Byte(uuid + 24)); /* kk - at offset 10 */
  1395. build_append_byte(var->buf, Hex2Byte(uuid + 26)); /* ll - at offset 11 */
  1396. build_append_byte(var->buf, Hex2Byte(uuid + 28)); /* mm - at offset 12 */
  1397. build_append_byte(var->buf, Hex2Byte(uuid + 30)); /* nn - at offset 13 */
  1398. build_append_byte(var->buf, Hex2Byte(uuid + 32)); /* oo - at offset 14 */
  1399. build_append_byte(var->buf, Hex2Byte(uuid + 34)); /* pp - at offset 15 */
  1400. return var;
  1401. }
  1402. /*
  1403. * ACPI 2.0b: 16.2.3.6.4.3 Unicode Macro (Convert Ascii String To Unicode)
  1404. */
  1405. Aml *aml_unicode(const char *str)
  1406. {
  1407. int i = 0;
  1408. Aml *var = aml_bundle(0x11 /* BufferOp */, AML_BUFFER);
  1409. do {
  1410. build_append_byte(var->buf, str[i]);
  1411. build_append_byte(var->buf, 0);
  1412. i++;
  1413. } while (i <= strlen(str));
  1414. return var;
  1415. }
  1416. /* ACPI 1.0b: 16.2.5.4 Type 2 Opcodes Encoding: DefRefOf */
  1417. Aml *aml_refof(Aml *arg)
  1418. {
  1419. Aml *var = aml_opcode(0x71 /* RefOfOp */);
  1420. aml_append(var, arg);
  1421. return var;
  1422. }
  1423. /* ACPI 1.0b: 16.2.5.4 Type 2 Opcodes Encoding: DefDerefOf */
  1424. Aml *aml_derefof(Aml *arg)
  1425. {
  1426. Aml *var = aml_opcode(0x83 /* DerefOfOp */);
  1427. aml_append(var, arg);
  1428. return var;
  1429. }
  1430. /* ACPI 1.0b: 16.2.5.4 Type 2 Opcodes Encoding: DefSizeOf */
  1431. Aml *aml_sizeof(Aml *arg)
  1432. {
  1433. Aml *var = aml_opcode(0x87 /* SizeOfOp */);
  1434. aml_append(var, arg);
  1435. return var;
  1436. }
  1437. /* ACPI 1.0b: 16.2.5.2 Named Objects Encoding: DefMutex */
  1438. Aml *aml_mutex(const char *name, uint8_t sync_level)
  1439. {
  1440. Aml *var = aml_alloc();
  1441. build_append_byte(var->buf, 0x5B); /* ExtOpPrefix */
  1442. build_append_byte(var->buf, 0x01); /* MutexOp */
  1443. build_append_namestring(var->buf, "%s", name);
  1444. assert(!(sync_level & 0xF0));
  1445. build_append_byte(var->buf, sync_level);
  1446. return var;
  1447. }
  1448. /* ACPI 1.0b: 16.2.5.4 Type 2 Opcodes Encoding: DefAcquire */
  1449. Aml *aml_acquire(Aml *mutex, uint16_t timeout)
  1450. {
  1451. Aml *var = aml_alloc();
  1452. build_append_byte(var->buf, 0x5B); /* ExtOpPrefix */
  1453. build_append_byte(var->buf, 0x23); /* AcquireOp */
  1454. aml_append(var, mutex);
  1455. build_append_int_noprefix(var->buf, timeout, sizeof(timeout));
  1456. return var;
  1457. }
  1458. /* ACPI 1.0b: 16.2.5.3 Type 1 Opcodes Encoding: DefRelease */
  1459. Aml *aml_release(Aml *mutex)
  1460. {
  1461. Aml *var = aml_alloc();
  1462. build_append_byte(var->buf, 0x5B); /* ExtOpPrefix */
  1463. build_append_byte(var->buf, 0x27); /* ReleaseOp */
  1464. aml_append(var, mutex);
  1465. return var;
  1466. }
  1467. /* ACPI 1.0b: 16.2.5.1 Name Space Modifier Objects Encoding: DefAlias */
  1468. Aml *aml_alias(const char *source_object, const char *alias_object)
  1469. {
  1470. Aml *var = aml_opcode(0x06 /* AliasOp */);
  1471. aml_append(var, aml_name("%s", source_object));
  1472. aml_append(var, aml_name("%s", alias_object));
  1473. return var;
  1474. }
  1475. /* ACPI 1.0b: 16.2.5.4 Type 2 Opcodes Encoding: DefConcat */
  1476. Aml *aml_concatenate(Aml *source1, Aml *source2, Aml *target)
  1477. {
  1478. return build_opcode_2arg_dst(0x73 /* ConcatOp */, source1, source2,
  1479. target);
  1480. }
  1481. /* ACPI 1.0b: 16.2.5.4 Type 2 Opcodes Encoding: DefObjectType */
  1482. Aml *aml_object_type(Aml *object)
  1483. {
  1484. Aml *var = aml_opcode(0x8E /* ObjectTypeOp */);
  1485. aml_append(var, object);
  1486. return var;
  1487. }
  1488. void acpi_table_begin(AcpiTable *desc, GArray *array)
  1489. {
  1490. desc->array = array;
  1491. desc->table_offset = array->len;
  1492. /*
  1493. * ACPI spec 1.0b
  1494. * 5.2.3 System Description Table Header
  1495. */
  1496. g_assert(strlen(desc->sig) == 4);
  1497. g_array_append_vals(array, desc->sig, 4); /* Signature */
  1498. /*
  1499. * reserve space for Length field, which will be patched by
  1500. * acpi_table_end() when the table creation is finished.
  1501. */
  1502. build_append_int_noprefix(array, 0, 4); /* Length */
  1503. build_append_int_noprefix(array, desc->rev, 1); /* Revision */
  1504. build_append_int_noprefix(array, 0, 1); /* Checksum */
  1505. build_append_padded_str(array, desc->oem_id, 6, '\0'); /* OEMID */
  1506. /* OEM Table ID */
  1507. build_append_padded_str(array, desc->oem_table_id, 8, '\0');
  1508. build_append_int_noprefix(array, 1, 4); /* OEM Revision */
  1509. g_array_append_vals(array, ACPI_BUILD_APPNAME8, 4); /* Creator ID */
  1510. build_append_int_noprefix(array, 1, 4); /* Creator Revision */
  1511. }
  1512. void acpi_table_end(BIOSLinker *linker, AcpiTable *desc)
  1513. {
  1514. /*
  1515. * ACPI spec 1.0b
  1516. * 5.2.3 System Description Table Header
  1517. * Table 5-2 DESCRIPTION_HEADER Fields
  1518. */
  1519. const unsigned checksum_offset = 9;
  1520. uint32_t table_len = desc->array->len - desc->table_offset;
  1521. uint32_t table_len_le = cpu_to_le32(table_len);
  1522. gchar *len_ptr = &desc->array->data[desc->table_offset + 4];
  1523. /* patch "Length" field that has been reserved by acpi_table_begin()
  1524. * to the actual length, i.e. accumulated table length from
  1525. * acpi_table_begin() till acpi_table_end()
  1526. */
  1527. memcpy(len_ptr, &table_len_le, sizeof table_len_le);
  1528. bios_linker_loader_add_checksum(linker, ACPI_BUILD_TABLE_FILE,
  1529. desc->table_offset, table_len, desc->table_offset + checksum_offset);
  1530. }
  1531. void *acpi_data_push(GArray *table_data, unsigned size)
  1532. {
  1533. unsigned off = table_data->len;
  1534. g_array_set_size(table_data, off + size);
  1535. return table_data->data + off;
  1536. }
  1537. unsigned acpi_data_len(GArray *table)
  1538. {
  1539. assert(g_array_get_element_size(table) == 1);
  1540. return table->len;
  1541. }
  1542. void acpi_add_table(GArray *table_offsets, GArray *table_data)
  1543. {
  1544. uint32_t offset = table_data->len;
  1545. g_array_append_val(table_offsets, offset);
  1546. }
  1547. void acpi_build_tables_init(AcpiBuildTables *tables)
  1548. {
  1549. tables->rsdp = g_array_new(false, true /* clear */, 1);
  1550. tables->table_data = g_array_new(false, true /* clear */, 1);
  1551. tables->tcpalog = g_array_new(false, true /* clear */, 1);
  1552. tables->vmgenid = g_array_new(false, true /* clear */, 1);
  1553. tables->hardware_errors = g_array_new(false, true /* clear */, 1);
  1554. tables->linker = bios_linker_loader_init();
  1555. }
  1556. void acpi_build_tables_cleanup(AcpiBuildTables *tables, bool mfre)
  1557. {
  1558. bios_linker_loader_cleanup(tables->linker);
  1559. g_array_free(tables->rsdp, true);
  1560. g_array_free(tables->table_data, true);
  1561. g_array_free(tables->tcpalog, mfre);
  1562. g_array_free(tables->vmgenid, mfre);
  1563. g_array_free(tables->hardware_errors, mfre);
  1564. }
  1565. /*
  1566. * ACPI spec 5.2.5.3 Root System Description Pointer (RSDP).
  1567. * (Revision 1.0 or later)
  1568. */
  1569. void
  1570. build_rsdp(GArray *tbl, BIOSLinker *linker, AcpiRsdpData *rsdp_data)
  1571. {
  1572. int tbl_off = tbl->len; /* Table offset in the RSDP file */
  1573. switch (rsdp_data->revision) {
  1574. case 0:
  1575. /* With ACPI 1.0, we must have an RSDT pointer */
  1576. g_assert(rsdp_data->rsdt_tbl_offset);
  1577. break;
  1578. case 2:
  1579. /* With ACPI 2.0+, we must have an XSDT pointer */
  1580. g_assert(rsdp_data->xsdt_tbl_offset);
  1581. break;
  1582. default:
  1583. /* Only revisions 0 (ACPI 1.0) and 2 (ACPI 2.0+) are valid for RSDP */
  1584. g_assert_not_reached();
  1585. }
  1586. bios_linker_loader_alloc(linker, ACPI_BUILD_RSDP_FILE, tbl, 16,
  1587. true /* fseg memory */);
  1588. g_array_append_vals(tbl, "RSD PTR ", 8); /* Signature */
  1589. build_append_int_noprefix(tbl, 0, 1); /* Checksum */
  1590. g_array_append_vals(tbl, rsdp_data->oem_id, 6); /* OEMID */
  1591. build_append_int_noprefix(tbl, rsdp_data->revision, 1); /* Revision */
  1592. build_append_int_noprefix(tbl, 0, 4); /* RsdtAddress */
  1593. if (rsdp_data->rsdt_tbl_offset) {
  1594. /* RSDT address to be filled by guest linker */
  1595. bios_linker_loader_add_pointer(linker, ACPI_BUILD_RSDP_FILE,
  1596. tbl_off + 16, 4,
  1597. ACPI_BUILD_TABLE_FILE,
  1598. *rsdp_data->rsdt_tbl_offset);
  1599. }
  1600. /* Checksum to be filled by guest linker */
  1601. bios_linker_loader_add_checksum(linker, ACPI_BUILD_RSDP_FILE,
  1602. tbl_off, 20, /* ACPI rev 1.0 RSDP size */
  1603. 8);
  1604. if (rsdp_data->revision == 0) {
  1605. /* ACPI 1.0 RSDP, we're done */
  1606. return;
  1607. }
  1608. build_append_int_noprefix(tbl, 36, 4); /* Length */
  1609. /* XSDT address to be filled by guest linker */
  1610. build_append_int_noprefix(tbl, 0, 8); /* XsdtAddress */
  1611. /* We already validated our xsdt pointer */
  1612. bios_linker_loader_add_pointer(linker, ACPI_BUILD_RSDP_FILE,
  1613. tbl_off + 24, 8,
  1614. ACPI_BUILD_TABLE_FILE,
  1615. *rsdp_data->xsdt_tbl_offset);
  1616. build_append_int_noprefix(tbl, 0, 1); /* Extended Checksum */
  1617. build_append_int_noprefix(tbl, 0, 3); /* Reserved */
  1618. /* Extended checksum to be filled by Guest linker */
  1619. bios_linker_loader_add_checksum(linker, ACPI_BUILD_RSDP_FILE,
  1620. tbl_off, 36, /* ACPI rev 2.0 RSDP size */
  1621. 32);
  1622. }
  1623. /*
  1624. * ACPI 1.0 Root System Description Table (RSDT)
  1625. */
  1626. void
  1627. build_rsdt(GArray *table_data, BIOSLinker *linker, GArray *table_offsets,
  1628. const char *oem_id, const char *oem_table_id)
  1629. {
  1630. int i;
  1631. AcpiTable table = { .sig = "RSDT", .rev = 1,
  1632. .oem_id = oem_id, .oem_table_id = oem_table_id };
  1633. acpi_table_begin(&table, table_data);
  1634. for (i = 0; i < table_offsets->len; ++i) {
  1635. uint32_t ref_tbl_offset = g_array_index(table_offsets, uint32_t, i);
  1636. uint32_t rsdt_entry_offset = table.array->len;
  1637. /* reserve space for entry */
  1638. build_append_int_noprefix(table.array, 0, 4);
  1639. /* mark position of RSDT entry to be filled by Guest linker */
  1640. bios_linker_loader_add_pointer(linker,
  1641. ACPI_BUILD_TABLE_FILE, rsdt_entry_offset, 4,
  1642. ACPI_BUILD_TABLE_FILE, ref_tbl_offset);
  1643. }
  1644. acpi_table_end(linker, &table);
  1645. }
  1646. /*
  1647. * ACPI 2.0 eXtended System Description Table (XSDT)
  1648. */
  1649. void
  1650. build_xsdt(GArray *table_data, BIOSLinker *linker, GArray *table_offsets,
  1651. const char *oem_id, const char *oem_table_id)
  1652. {
  1653. int i;
  1654. AcpiTable table = { .sig = "XSDT", .rev = 1,
  1655. .oem_id = oem_id, .oem_table_id = oem_table_id };
  1656. acpi_table_begin(&table, table_data);
  1657. for (i = 0; i < table_offsets->len; ++i) {
  1658. uint64_t ref_tbl_offset = g_array_index(table_offsets, uint32_t, i);
  1659. uint64_t xsdt_entry_offset = table.array->len;
  1660. /* reserve space for entry */
  1661. build_append_int_noprefix(table.array, 0, 8);
  1662. /* mark position of RSDT entry to be filled by Guest linker */
  1663. bios_linker_loader_add_pointer(linker,
  1664. ACPI_BUILD_TABLE_FILE, xsdt_entry_offset, 8,
  1665. ACPI_BUILD_TABLE_FILE, ref_tbl_offset);
  1666. }
  1667. acpi_table_end(linker, &table);
  1668. }
  1669. /*
  1670. * ACPI spec, Revision 4.0
  1671. * 5.2.16.2 Memory Affinity Structure
  1672. */
  1673. void build_srat_memory(GArray *table_data, uint64_t base,
  1674. uint64_t len, int node, MemoryAffinityFlags flags)
  1675. {
  1676. build_append_int_noprefix(table_data, 1, 1); /* Type */
  1677. build_append_int_noprefix(table_data, 40, 1); /* Length */
  1678. build_append_int_noprefix(table_data, node, 4); /* Proximity Domain */
  1679. build_append_int_noprefix(table_data, 0, 2); /* Reserved */
  1680. build_append_int_noprefix(table_data, base, 4); /* Base Address Low */
  1681. /* Base Address High */
  1682. build_append_int_noprefix(table_data, base >> 32, 4);
  1683. build_append_int_noprefix(table_data, len, 4); /* Length Low */
  1684. build_append_int_noprefix(table_data, len >> 32, 4); /* Length High */
  1685. build_append_int_noprefix(table_data, 0, 4); /* Reserved */
  1686. build_append_int_noprefix(table_data, flags, 4); /* Flags */
  1687. build_append_int_noprefix(table_data, 0, 8); /* Reserved */
  1688. }
  1689. /*
  1690. * ACPI Spec Revision 6.3
  1691. * Table 5-80 Device Handle - PCI
  1692. */
  1693. static void build_append_srat_pci_device_handle(GArray *table_data,
  1694. uint16_t segment,
  1695. uint8_t bus, uint8_t devfn)
  1696. {
  1697. /* PCI segment number */
  1698. build_append_int_noprefix(table_data, segment, 2);
  1699. /* PCI Bus Device Function */
  1700. build_append_int_noprefix(table_data, bus, 1);
  1701. build_append_int_noprefix(table_data, devfn, 1);
  1702. /* Reserved */
  1703. build_append_int_noprefix(table_data, 0, 12);
  1704. }
  1705. static void build_append_srat_acpi_device_handle(GArray *table_data,
  1706. const char *hid,
  1707. uint32_t uid)
  1708. {
  1709. assert(strlen(hid) == 8);
  1710. /* Device Handle - ACPI */
  1711. for (int i = 0; i < 8; i++) {
  1712. build_append_int_noprefix(table_data, hid[i], 1);
  1713. }
  1714. build_append_int_noprefix(table_data, uid, 4);
  1715. build_append_int_noprefix(table_data, 0, 4);
  1716. }
  1717. /*
  1718. * ACPI spec, Revision 6.3
  1719. * 5.2.16.6 Generic Initiator Affinity Structure
  1720. * With PCI Device Handle.
  1721. */
  1722. void build_srat_pci_generic_initiator(GArray *table_data, uint32_t node,
  1723. uint16_t segment, uint8_t bus,
  1724. uint8_t devfn)
  1725. {
  1726. /* Type */
  1727. build_append_int_noprefix(table_data, 5, 1);
  1728. /* Length */
  1729. build_append_int_noprefix(table_data, 32, 1);
  1730. /* Reserved */
  1731. build_append_int_noprefix(table_data, 0, 1);
  1732. /* Device Handle Type: PCI */
  1733. build_append_int_noprefix(table_data, 1, 1);
  1734. /* Proximity Domain */
  1735. build_append_int_noprefix(table_data, node, 4);
  1736. /* Device Handle */
  1737. build_append_srat_pci_device_handle(table_data, segment, bus, devfn);
  1738. /* Flags - GI Enabled */
  1739. build_append_int_noprefix(table_data, 1, 4);
  1740. /* Reserved */
  1741. build_append_int_noprefix(table_data, 0, 4);
  1742. }
  1743. /*
  1744. * ACPI spec, Revision 6.5
  1745. * 5.2.16.7 Generic Port Affinity Structure
  1746. * With ACPI Device Handle.
  1747. */
  1748. void build_srat_acpi_generic_port(GArray *table_data, uint32_t node,
  1749. const char *hid, uint32_t uid)
  1750. {
  1751. /* Type */
  1752. build_append_int_noprefix(table_data, 6, 1);
  1753. /* Length */
  1754. build_append_int_noprefix(table_data, 32, 1);
  1755. /* Reserved */
  1756. build_append_int_noprefix(table_data, 0, 1);
  1757. /* Device Handle Type: ACPI */
  1758. build_append_int_noprefix(table_data, 0, 1);
  1759. /* Proximity Domain */
  1760. build_append_int_noprefix(table_data, node, 4);
  1761. /* Device Handle */
  1762. build_append_srat_acpi_device_handle(table_data, hid, uid);
  1763. /* Flags - GP Enabled */
  1764. build_append_int_noprefix(table_data, 1, 4);
  1765. /* Reserved */
  1766. build_append_int_noprefix(table_data, 0, 4);
  1767. }
  1768. /*
  1769. * ACPI spec 5.2.17 System Locality Distance Information Table
  1770. * (Revision 2.0 or later)
  1771. */
  1772. void build_slit(GArray *table_data, BIOSLinker *linker, MachineState *ms,
  1773. const char *oem_id, const char *oem_table_id)
  1774. {
  1775. int i, j;
  1776. int nb_numa_nodes = ms->numa_state->num_nodes;
  1777. AcpiTable table = { .sig = "SLIT", .rev = 1,
  1778. .oem_id = oem_id, .oem_table_id = oem_table_id };
  1779. acpi_table_begin(&table, table_data);
  1780. build_append_int_noprefix(table_data, nb_numa_nodes, 8);
  1781. for (i = 0; i < nb_numa_nodes; i++) {
  1782. for (j = 0; j < nb_numa_nodes; j++) {
  1783. assert(ms->numa_state->nodes[i].distance[j]);
  1784. build_append_int_noprefix(table_data,
  1785. ms->numa_state->nodes[i].distance[j],
  1786. 1);
  1787. }
  1788. }
  1789. acpi_table_end(linker, &table);
  1790. }
  1791. /*
  1792. * ACPI spec, Revision 6.3
  1793. * 5.2.29.1 Processor hierarchy node structure (Type 0)
  1794. */
  1795. static void build_processor_hierarchy_node(GArray *tbl, uint32_t flags,
  1796. uint32_t parent, uint32_t id,
  1797. uint32_t *priv_rsrc,
  1798. uint32_t priv_num)
  1799. {
  1800. int i;
  1801. build_append_byte(tbl, 0); /* Type 0 - processor */
  1802. build_append_byte(tbl, 20 + priv_num * 4); /* Length */
  1803. build_append_int_noprefix(tbl, 0, 2); /* Reserved */
  1804. build_append_int_noprefix(tbl, flags, 4); /* Flags */
  1805. build_append_int_noprefix(tbl, parent, 4); /* Parent */
  1806. build_append_int_noprefix(tbl, id, 4); /* ACPI Processor ID */
  1807. /* Number of private resources */
  1808. build_append_int_noprefix(tbl, priv_num, 4);
  1809. /* Private resources[N] */
  1810. if (priv_num > 0) {
  1811. assert(priv_rsrc);
  1812. for (i = 0; i < priv_num; i++) {
  1813. build_append_int_noprefix(tbl, priv_rsrc[i], 4);
  1814. }
  1815. }
  1816. }
  1817. void build_spcr(GArray *table_data, BIOSLinker *linker,
  1818. const AcpiSpcrData *f, const uint8_t rev,
  1819. const char *oem_id, const char *oem_table_id, const char *name)
  1820. {
  1821. AcpiTable table = { .sig = "SPCR", .rev = rev, .oem_id = oem_id,
  1822. .oem_table_id = oem_table_id };
  1823. acpi_table_begin(&table, table_data);
  1824. /* Interface type */
  1825. build_append_int_noprefix(table_data, f->interface_type, 1);
  1826. /* Reserved */
  1827. build_append_int_noprefix(table_data, 0, 3);
  1828. /* Base Address */
  1829. build_append_gas(table_data, f->base_addr.id, f->base_addr.width,
  1830. f->base_addr.offset, f->base_addr.size,
  1831. f->base_addr.addr);
  1832. /* Interrupt type */
  1833. build_append_int_noprefix(table_data, f->interrupt_type, 1);
  1834. /* IRQ */
  1835. build_append_int_noprefix(table_data, f->pc_interrupt, 1);
  1836. /* Global System Interrupt */
  1837. build_append_int_noprefix(table_data, f->interrupt, 4);
  1838. /* Baud Rate */
  1839. build_append_int_noprefix(table_data, f->baud_rate, 1);
  1840. /* Parity */
  1841. build_append_int_noprefix(table_data, f->parity, 1);
  1842. /* Stop Bits */
  1843. build_append_int_noprefix(table_data, f->stop_bits, 1);
  1844. /* Flow Control */
  1845. build_append_int_noprefix(table_data, f->flow_control, 1);
  1846. /* Language */
  1847. build_append_int_noprefix(table_data, f->language, 1);
  1848. /* Terminal Type */
  1849. build_append_int_noprefix(table_data, f->terminal_type, 1);
  1850. /* PCI Device ID */
  1851. build_append_int_noprefix(table_data, f->pci_device_id, 2);
  1852. /* PCI Vendor ID */
  1853. build_append_int_noprefix(table_data, f->pci_vendor_id, 2);
  1854. /* PCI Bus Number */
  1855. build_append_int_noprefix(table_data, f->pci_bus, 1);
  1856. /* PCI Device Number */
  1857. build_append_int_noprefix(table_data, f->pci_device, 1);
  1858. /* PCI Function Number */
  1859. build_append_int_noprefix(table_data, f->pci_function, 1);
  1860. /* PCI Flags */
  1861. build_append_int_noprefix(table_data, f->pci_flags, 4);
  1862. /* PCI Segment */
  1863. build_append_int_noprefix(table_data, f->pci_segment, 1);
  1864. if (rev < 4) {
  1865. /* Reserved */
  1866. build_append_int_noprefix(table_data, 0, 4);
  1867. } else {
  1868. /* UartClkFreq */
  1869. build_append_int_noprefix(table_data, f->uart_clk_freq, 4);
  1870. /* PreciseBaudrate */
  1871. build_append_int_noprefix(table_data, f->precise_baudrate, 4);
  1872. /* NameSpaceStringLength */
  1873. build_append_int_noprefix(table_data, f->namespace_string_length, 2);
  1874. /* NameSpaceStringOffset */
  1875. build_append_int_noprefix(table_data, f->namespace_string_offset, 2);
  1876. /* NamespaceString[] */
  1877. g_array_append_vals(table_data, name, f->namespace_string_length);
  1878. }
  1879. acpi_table_end(linker, &table);
  1880. }
  1881. /*
  1882. * ACPI spec, Revision 6.3
  1883. * 5.2.29 Processor Properties Topology Table (PPTT)
  1884. */
  1885. void build_pptt(GArray *table_data, BIOSLinker *linker, MachineState *ms,
  1886. const char *oem_id, const char *oem_table_id)
  1887. {
  1888. MachineClass *mc = MACHINE_GET_CLASS(ms);
  1889. CPUArchIdList *cpus = ms->possible_cpus;
  1890. int64_t socket_id = -1, cluster_id = -1, core_id = -1;
  1891. uint32_t socket_offset = 0, cluster_offset = 0, core_offset = 0;
  1892. uint32_t pptt_start = table_data->len;
  1893. int n;
  1894. AcpiTable table = { .sig = "PPTT", .rev = 2,
  1895. .oem_id = oem_id, .oem_table_id = oem_table_id };
  1896. acpi_table_begin(&table, table_data);
  1897. /*
  1898. * This works with the assumption that cpus[n].props.*_id has been
  1899. * sorted from top to down levels in mc->possible_cpu_arch_ids().
  1900. * Otherwise, the unexpected and duplicated containers will be
  1901. * created.
  1902. */
  1903. for (n = 0; n < cpus->len; n++) {
  1904. if (cpus->cpus[n].props.socket_id != socket_id) {
  1905. assert(cpus->cpus[n].props.socket_id > socket_id);
  1906. socket_id = cpus->cpus[n].props.socket_id;
  1907. cluster_id = -1;
  1908. core_id = -1;
  1909. socket_offset = table_data->len - pptt_start;
  1910. build_processor_hierarchy_node(table_data,
  1911. (1 << 0), /* Physical package */
  1912. 0, socket_id, NULL, 0);
  1913. }
  1914. if (mc->smp_props.clusters_supported && mc->smp_props.has_clusters) {
  1915. if (cpus->cpus[n].props.cluster_id != cluster_id) {
  1916. assert(cpus->cpus[n].props.cluster_id > cluster_id);
  1917. cluster_id = cpus->cpus[n].props.cluster_id;
  1918. core_id = -1;
  1919. cluster_offset = table_data->len - pptt_start;
  1920. build_processor_hierarchy_node(table_data,
  1921. (0 << 0), /* Not a physical package */
  1922. socket_offset, cluster_id, NULL, 0);
  1923. }
  1924. } else {
  1925. cluster_offset = socket_offset;
  1926. }
  1927. if (ms->smp.threads == 1) {
  1928. build_processor_hierarchy_node(table_data,
  1929. (1 << 1) | /* ACPI Processor ID valid */
  1930. (1 << 3), /* Node is a Leaf */
  1931. cluster_offset, n, NULL, 0);
  1932. } else {
  1933. if (cpus->cpus[n].props.core_id != core_id) {
  1934. assert(cpus->cpus[n].props.core_id > core_id);
  1935. core_id = cpus->cpus[n].props.core_id;
  1936. core_offset = table_data->len - pptt_start;
  1937. build_processor_hierarchy_node(table_data,
  1938. (0 << 0), /* Not a physical package */
  1939. cluster_offset, core_id, NULL, 0);
  1940. }
  1941. build_processor_hierarchy_node(table_data,
  1942. (1 << 1) | /* ACPI Processor ID valid */
  1943. (1 << 2) | /* Processor is a Thread */
  1944. (1 << 3), /* Node is a Leaf */
  1945. core_offset, n, NULL, 0);
  1946. }
  1947. }
  1948. acpi_table_end(linker, &table);
  1949. }
  1950. /* build rev1/rev3/rev5.1/rev6.0 FADT */
  1951. void build_fadt(GArray *tbl, BIOSLinker *linker, const AcpiFadtData *f,
  1952. const char *oem_id, const char *oem_table_id)
  1953. {
  1954. int off;
  1955. AcpiTable table = { .sig = "FACP", .rev = f->rev,
  1956. .oem_id = oem_id, .oem_table_id = oem_table_id };
  1957. acpi_table_begin(&table, tbl);
  1958. /* FACS address to be filled by Guest linker at runtime */
  1959. off = tbl->len;
  1960. build_append_int_noprefix(tbl, 0, 4); /* FIRMWARE_CTRL */
  1961. if (f->facs_tbl_offset) { /* don't patch if not supported by platform */
  1962. bios_linker_loader_add_pointer(linker,
  1963. ACPI_BUILD_TABLE_FILE, off, 4,
  1964. ACPI_BUILD_TABLE_FILE, *f->facs_tbl_offset);
  1965. }
  1966. /* DSDT address to be filled by Guest linker at runtime */
  1967. off = tbl->len;
  1968. build_append_int_noprefix(tbl, 0, 4); /* DSDT */
  1969. if (f->dsdt_tbl_offset) { /* don't patch if not supported by platform */
  1970. bios_linker_loader_add_pointer(linker,
  1971. ACPI_BUILD_TABLE_FILE, off, 4,
  1972. ACPI_BUILD_TABLE_FILE, *f->dsdt_tbl_offset);
  1973. }
  1974. /* ACPI1.0: INT_MODEL, ACPI2.0+: Reserved */
  1975. build_append_int_noprefix(tbl, f->int_model /* Multiple APIC */, 1);
  1976. /* Preferred_PM_Profile */
  1977. build_append_int_noprefix(tbl, 0 /* Unspecified */, 1);
  1978. build_append_int_noprefix(tbl, f->sci_int, 2); /* SCI_INT */
  1979. build_append_int_noprefix(tbl, f->smi_cmd, 4); /* SMI_CMD */
  1980. build_append_int_noprefix(tbl, f->acpi_enable_cmd, 1); /* ACPI_ENABLE */
  1981. build_append_int_noprefix(tbl, f->acpi_disable_cmd, 1); /* ACPI_DISABLE */
  1982. build_append_int_noprefix(tbl, 0 /* not supported */, 1); /* S4BIOS_REQ */
  1983. /* ACPI1.0: Reserved, ACPI2.0+: PSTATE_CNT */
  1984. build_append_int_noprefix(tbl, 0, 1);
  1985. build_append_int_noprefix(tbl, f->pm1a_evt.address, 4); /* PM1a_EVT_BLK */
  1986. build_append_int_noprefix(tbl, 0, 4); /* PM1b_EVT_BLK */
  1987. build_append_int_noprefix(tbl, f->pm1a_cnt.address, 4); /* PM1a_CNT_BLK */
  1988. build_append_int_noprefix(tbl, 0, 4); /* PM1b_CNT_BLK */
  1989. build_append_int_noprefix(tbl, 0, 4); /* PM2_CNT_BLK */
  1990. build_append_int_noprefix(tbl, f->pm_tmr.address, 4); /* PM_TMR_BLK */
  1991. build_append_int_noprefix(tbl, f->gpe0_blk.address, 4); /* GPE0_BLK */
  1992. build_append_int_noprefix(tbl, 0, 4); /* GPE1_BLK */
  1993. /* PM1_EVT_LEN */
  1994. build_append_int_noprefix(tbl, f->pm1a_evt.bit_width / 8, 1);
  1995. /* PM1_CNT_LEN */
  1996. build_append_int_noprefix(tbl, f->pm1a_cnt.bit_width / 8, 1);
  1997. build_append_int_noprefix(tbl, 0, 1); /* PM2_CNT_LEN */
  1998. build_append_int_noprefix(tbl, f->pm_tmr.bit_width / 8, 1); /* PM_TMR_LEN */
  1999. /* GPE0_BLK_LEN */
  2000. build_append_int_noprefix(tbl, f->gpe0_blk.bit_width / 8, 1);
  2001. build_append_int_noprefix(tbl, 0, 1); /* GPE1_BLK_LEN */
  2002. build_append_int_noprefix(tbl, 0, 1); /* GPE1_BASE */
  2003. build_append_int_noprefix(tbl, 0, 1); /* CST_CNT */
  2004. build_append_int_noprefix(tbl, f->plvl2_lat, 2); /* P_LVL2_LAT */
  2005. build_append_int_noprefix(tbl, f->plvl3_lat, 2); /* P_LVL3_LAT */
  2006. build_append_int_noprefix(tbl, 0, 2); /* FLUSH_SIZE */
  2007. build_append_int_noprefix(tbl, 0, 2); /* FLUSH_STRIDE */
  2008. build_append_int_noprefix(tbl, 0, 1); /* DUTY_OFFSET */
  2009. build_append_int_noprefix(tbl, 0, 1); /* DUTY_WIDTH */
  2010. build_append_int_noprefix(tbl, 0, 1); /* DAY_ALRM */
  2011. build_append_int_noprefix(tbl, 0, 1); /* MON_ALRM */
  2012. build_append_int_noprefix(tbl, f->rtc_century, 1); /* CENTURY */
  2013. /* IAPC_BOOT_ARCH */
  2014. if (f->rev == 1) {
  2015. build_append_int_noprefix(tbl, 0, 2);
  2016. } else {
  2017. /* since ACPI v2.0 */
  2018. build_append_int_noprefix(tbl, f->iapc_boot_arch, 2);
  2019. }
  2020. build_append_int_noprefix(tbl, 0, 1); /* Reserved */
  2021. build_append_int_noprefix(tbl, f->flags, 4); /* Flags */
  2022. if (f->rev == 1) {
  2023. goto done;
  2024. }
  2025. build_append_gas_from_struct(tbl, &f->reset_reg); /* RESET_REG */
  2026. build_append_int_noprefix(tbl, f->reset_val, 1); /* RESET_VALUE */
  2027. /* Since ACPI 5.1 */
  2028. if ((f->rev >= 6) || ((f->rev == 5) && f->minor_ver > 0)) {
  2029. build_append_int_noprefix(tbl, f->arm_boot_arch, 2); /* ARM_BOOT_ARCH */
  2030. /* FADT Minor Version */
  2031. build_append_int_noprefix(tbl, f->minor_ver, 1);
  2032. } else {
  2033. build_append_int_noprefix(tbl, 0, 3); /* Reserved up to ACPI 5.0 */
  2034. }
  2035. build_append_int_noprefix(tbl, 0, 8); /* X_FIRMWARE_CTRL */
  2036. /* XDSDT address to be filled by Guest linker at runtime */
  2037. off = tbl->len;
  2038. build_append_int_noprefix(tbl, 0, 8); /* X_DSDT */
  2039. if (f->xdsdt_tbl_offset) {
  2040. bios_linker_loader_add_pointer(linker,
  2041. ACPI_BUILD_TABLE_FILE, off, 8,
  2042. ACPI_BUILD_TABLE_FILE, *f->xdsdt_tbl_offset);
  2043. }
  2044. build_append_gas_from_struct(tbl, &f->pm1a_evt); /* X_PM1a_EVT_BLK */
  2045. /* X_PM1b_EVT_BLK */
  2046. build_append_gas(tbl, AML_AS_SYSTEM_MEMORY, 0 , 0, 0, 0);
  2047. build_append_gas_from_struct(tbl, &f->pm1a_cnt); /* X_PM1a_CNT_BLK */
  2048. /* X_PM1b_CNT_BLK */
  2049. build_append_gas(tbl, AML_AS_SYSTEM_MEMORY, 0 , 0, 0, 0);
  2050. /* X_PM2_CNT_BLK */
  2051. build_append_gas(tbl, AML_AS_SYSTEM_MEMORY, 0 , 0, 0, 0);
  2052. build_append_gas_from_struct(tbl, &f->pm_tmr); /* X_PM_TMR_BLK */
  2053. build_append_gas_from_struct(tbl, &f->gpe0_blk); /* X_GPE0_BLK */
  2054. build_append_gas(tbl, AML_AS_SYSTEM_MEMORY, 0 , 0, 0, 0); /* X_GPE1_BLK */
  2055. if (f->rev <= 4) {
  2056. goto done;
  2057. }
  2058. /* SLEEP_CONTROL_REG */
  2059. build_append_gas_from_struct(tbl, &f->sleep_ctl);
  2060. /* SLEEP_STATUS_REG */
  2061. build_append_gas_from_struct(tbl, &f->sleep_sts);
  2062. if (f->rev == 5) {
  2063. goto done;
  2064. }
  2065. /* Hypervisor Vendor Identity */
  2066. build_append_padded_str(tbl, "QEMU", 8, '\0');
  2067. /* TODO: extra fields need to be added to support revisions above rev6 */
  2068. assert(f->rev == 6);
  2069. done:
  2070. acpi_table_end(linker, &table);
  2071. }
  2072. #ifdef CONFIG_TPM
  2073. /*
  2074. * build_tpm2 - Build the TPM2 table as specified in
  2075. * table 7: TCG Hardware Interface Description Table Format for TPM 2.0
  2076. * of TCG ACPI Specification, Family “1.2” and “2.0”, Version 1.2, Rev 8
  2077. */
  2078. void build_tpm2(GArray *table_data, BIOSLinker *linker, GArray *tcpalog,
  2079. const char *oem_id, const char *oem_table_id)
  2080. {
  2081. uint8_t start_method_params[12] = {};
  2082. unsigned log_addr_offset;
  2083. uint64_t control_area_start_address;
  2084. TPMIf *tpmif = tpm_find();
  2085. uint32_t start_method;
  2086. AcpiTable table = { .sig = "TPM2", .rev = 4,
  2087. .oem_id = oem_id, .oem_table_id = oem_table_id };
  2088. acpi_table_begin(&table, table_data);
  2089. /* Platform Class */
  2090. build_append_int_noprefix(table_data, TPM2_ACPI_CLASS_CLIENT, 2);
  2091. /* Reserved */
  2092. build_append_int_noprefix(table_data, 0, 2);
  2093. if (TPM_IS_TIS_ISA(tpmif) || TPM_IS_TIS_SYSBUS(tpmif)) {
  2094. control_area_start_address = 0;
  2095. start_method = TPM2_START_METHOD_MMIO;
  2096. } else if (TPM_IS_CRB(tpmif)) {
  2097. control_area_start_address = TPM_CRB_ADDR_CTRL;
  2098. start_method = TPM2_START_METHOD_CRB;
  2099. } else {
  2100. g_assert_not_reached();
  2101. }
  2102. /* Address of Control Area */
  2103. build_append_int_noprefix(table_data, control_area_start_address, 8);
  2104. /* Start Method */
  2105. build_append_int_noprefix(table_data, start_method, 4);
  2106. /* Platform Specific Parameters */
  2107. g_array_append_vals(table_data, &start_method_params,
  2108. ARRAY_SIZE(start_method_params));
  2109. /* Log Area Minimum Length */
  2110. build_append_int_noprefix(table_data, TPM_LOG_AREA_MINIMUM_SIZE, 4);
  2111. acpi_data_push(tcpalog, TPM_LOG_AREA_MINIMUM_SIZE);
  2112. bios_linker_loader_alloc(linker, ACPI_BUILD_TPMLOG_FILE, tcpalog, 1,
  2113. false);
  2114. log_addr_offset = table_data->len;
  2115. /* Log Area Start Address to be filled by Guest linker */
  2116. build_append_int_noprefix(table_data, 0, 8);
  2117. bios_linker_loader_add_pointer(linker, ACPI_BUILD_TABLE_FILE,
  2118. log_addr_offset, 8,
  2119. ACPI_BUILD_TPMLOG_FILE, 0);
  2120. acpi_table_end(linker, &table);
  2121. }
  2122. #endif
  2123. Aml *build_crs(PCIHostState *host, CrsRangeSet *range_set, uint32_t io_offset,
  2124. uint32_t mmio32_offset, uint64_t mmio64_offset,
  2125. uint16_t bus_nr_offset)
  2126. {
  2127. Aml *crs = aml_resource_template();
  2128. CrsRangeSet temp_range_set;
  2129. CrsRangeEntry *entry;
  2130. uint8_t max_bus = pci_bus_num(host->bus);
  2131. uint8_t type;
  2132. int devfn;
  2133. int i;
  2134. crs_range_set_init(&temp_range_set);
  2135. for (devfn = 0; devfn < ARRAY_SIZE(host->bus->devices); devfn++) {
  2136. uint64_t range_base, range_limit;
  2137. PCIDevice *dev = host->bus->devices[devfn];
  2138. if (!dev) {
  2139. continue;
  2140. }
  2141. for (i = 0; i < PCI_NUM_REGIONS; i++) {
  2142. PCIIORegion *r = &dev->io_regions[i];
  2143. range_base = r->addr;
  2144. range_limit = r->addr + r->size - 1;
  2145. /*
  2146. * Work-around for old bioses
  2147. * that do not support multiple root buses
  2148. */
  2149. if (!range_base || range_base > range_limit) {
  2150. continue;
  2151. }
  2152. if (r->type & PCI_BASE_ADDRESS_SPACE_IO) {
  2153. crs_range_insert(temp_range_set.io_ranges,
  2154. range_base, range_limit);
  2155. } else { /* "memory" */
  2156. uint64_t length = range_limit - range_base + 1;
  2157. if (range_limit <= UINT32_MAX && length <= UINT32_MAX) {
  2158. crs_range_insert(temp_range_set.mem_ranges, range_base,
  2159. range_limit);
  2160. } else {
  2161. crs_range_insert(temp_range_set.mem_64bit_ranges,
  2162. range_base, range_limit);
  2163. }
  2164. }
  2165. }
  2166. type = dev->config[PCI_HEADER_TYPE] & ~PCI_HEADER_TYPE_MULTI_FUNCTION;
  2167. if (type == PCI_HEADER_TYPE_BRIDGE) {
  2168. uint8_t subordinate = dev->config[PCI_SUBORDINATE_BUS];
  2169. if (subordinate > max_bus) {
  2170. max_bus = subordinate;
  2171. }
  2172. range_base = pci_bridge_get_base(dev, PCI_BASE_ADDRESS_SPACE_IO);
  2173. range_limit = pci_bridge_get_limit(dev, PCI_BASE_ADDRESS_SPACE_IO);
  2174. /*
  2175. * Work-around for old bioses
  2176. * that do not support multiple root buses
  2177. */
  2178. if (range_base && range_base <= range_limit) {
  2179. crs_range_insert(temp_range_set.io_ranges,
  2180. range_base, range_limit);
  2181. }
  2182. range_base =
  2183. pci_bridge_get_base(dev, PCI_BASE_ADDRESS_SPACE_MEMORY);
  2184. range_limit =
  2185. pci_bridge_get_limit(dev, PCI_BASE_ADDRESS_SPACE_MEMORY);
  2186. /*
  2187. * Work-around for old bioses
  2188. * that do not support multiple root buses
  2189. */
  2190. if (range_base && range_base <= range_limit) {
  2191. uint64_t length = range_limit - range_base + 1;
  2192. if (range_limit <= UINT32_MAX && length <= UINT32_MAX) {
  2193. crs_range_insert(temp_range_set.mem_ranges,
  2194. range_base, range_limit);
  2195. } else {
  2196. crs_range_insert(temp_range_set.mem_64bit_ranges,
  2197. range_base, range_limit);
  2198. }
  2199. }
  2200. range_base =
  2201. pci_bridge_get_base(dev, PCI_BASE_ADDRESS_MEM_PREFETCH);
  2202. range_limit =
  2203. pci_bridge_get_limit(dev, PCI_BASE_ADDRESS_MEM_PREFETCH);
  2204. /*
  2205. * Work-around for old bioses
  2206. * that do not support multiple root buses
  2207. */
  2208. if (range_base && range_base <= range_limit) {
  2209. uint64_t length = range_limit - range_base + 1;
  2210. if (range_limit <= UINT32_MAX && length <= UINT32_MAX) {
  2211. crs_range_insert(temp_range_set.mem_ranges,
  2212. range_base, range_limit);
  2213. } else {
  2214. crs_range_insert(temp_range_set.mem_64bit_ranges,
  2215. range_base, range_limit);
  2216. }
  2217. }
  2218. }
  2219. }
  2220. crs_range_merge(temp_range_set.io_ranges);
  2221. for (i = 0; i < temp_range_set.io_ranges->len; i++) {
  2222. entry = g_ptr_array_index(temp_range_set.io_ranges, i);
  2223. aml_append(crs,
  2224. aml_dword_io(AML_MIN_FIXED, AML_MAX_FIXED,
  2225. AML_POS_DECODE, AML_ENTIRE_RANGE,
  2226. 0, entry->base, entry->limit, io_offset,
  2227. entry->limit - entry->base + 1));
  2228. crs_range_insert(range_set->io_ranges, entry->base, entry->limit);
  2229. }
  2230. crs_range_merge(temp_range_set.mem_ranges);
  2231. for (i = 0; i < temp_range_set.mem_ranges->len; i++) {
  2232. entry = g_ptr_array_index(temp_range_set.mem_ranges, i);
  2233. assert(entry->limit <= UINT32_MAX &&
  2234. (entry->limit - entry->base + 1) <= UINT32_MAX);
  2235. aml_append(crs,
  2236. aml_dword_memory(AML_POS_DECODE, AML_MIN_FIXED,
  2237. AML_MAX_FIXED, AML_NON_CACHEABLE,
  2238. AML_READ_WRITE,
  2239. 0, entry->base, entry->limit, mmio32_offset,
  2240. entry->limit - entry->base + 1));
  2241. crs_range_insert(range_set->mem_ranges, entry->base, entry->limit);
  2242. }
  2243. crs_range_merge(temp_range_set.mem_64bit_ranges);
  2244. for (i = 0; i < temp_range_set.mem_64bit_ranges->len; i++) {
  2245. entry = g_ptr_array_index(temp_range_set.mem_64bit_ranges, i);
  2246. aml_append(crs,
  2247. aml_qword_memory(AML_POS_DECODE, AML_MIN_FIXED,
  2248. AML_MAX_FIXED, AML_NON_CACHEABLE,
  2249. AML_READ_WRITE,
  2250. 0, entry->base, entry->limit, mmio64_offset,
  2251. entry->limit - entry->base + 1));
  2252. crs_range_insert(range_set->mem_64bit_ranges,
  2253. entry->base, entry->limit);
  2254. }
  2255. crs_range_set_free(&temp_range_set);
  2256. aml_append(crs,
  2257. aml_word_bus_number(AML_MIN_FIXED, AML_MAX_FIXED, AML_POS_DECODE,
  2258. 0,
  2259. pci_bus_num(host->bus),
  2260. max_bus,
  2261. bus_nr_offset,
  2262. max_bus - pci_bus_num(host->bus) + 1));
  2263. return crs;
  2264. }
  2265. /* ACPI 5.0: 6.4.3.8.2 Serial Bus Connection Descriptors */
  2266. static Aml *aml_serial_bus_device(uint8_t serial_bus_type, uint8_t flags,
  2267. uint16_t type_flags,
  2268. uint8_t revid, uint16_t data_length,
  2269. uint16_t resource_source_len)
  2270. {
  2271. Aml *var = aml_alloc();
  2272. uint16_t length = data_length + resource_source_len + 9;
  2273. build_append_byte(var->buf, 0x8e); /* Serial Bus Connection Descriptor */
  2274. build_append_int_noprefix(var->buf, length, sizeof(length));
  2275. build_append_byte(var->buf, 1); /* Revision ID */
  2276. build_append_byte(var->buf, 0); /* Resource Source Index */
  2277. build_append_byte(var->buf, serial_bus_type); /* Serial Bus Type */
  2278. build_append_byte(var->buf, flags); /* General Flags */
  2279. build_append_int_noprefix(var->buf, type_flags, /* Type Specific Flags */
  2280. sizeof(type_flags));
  2281. build_append_byte(var->buf, revid); /* Type Specification Revision ID */
  2282. build_append_int_noprefix(var->buf, data_length, sizeof(data_length));
  2283. return var;
  2284. }
  2285. /* ACPI 5.0: 6.4.3.8.2.1 I2C Serial Bus Connection Resource Descriptor */
  2286. Aml *aml_i2c_serial_bus_device(uint16_t address, const char *resource_source)
  2287. {
  2288. uint16_t resource_source_len = strlen(resource_source) + 1;
  2289. Aml *var = aml_serial_bus_device(AML_SERIAL_BUS_TYPE_I2C, 0, 0, 1,
  2290. 6, resource_source_len);
  2291. /* Connection Speed. Just set to 100K for now, it doesn't really matter. */
  2292. build_append_int_noprefix(var->buf, 100000, 4);
  2293. build_append_int_noprefix(var->buf, address, sizeof(address));
  2294. /* This is a string, not a name, so just copy it directly in. */
  2295. g_array_append_vals(var->buf, resource_source, resource_source_len);
  2296. return var;
  2297. }