uboot/test/dm/acpigen.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0+
   2/*
   3 * Tests for ACPI code generation
   4 *
   5 * Copyright 2019 Google LLC
   6 * Written by Simon Glass <sjg@chromium.org>
   7 */
   8
   9#include <common.h>
  10#include <dm.h>
  11#include <irq.h>
  12#include <malloc.h>
  13#include <uuid.h>
  14#include <acpi/acpigen.h>
  15#include <acpi/acpi_device.h>
  16#include <acpi/acpi_table.h>
  17#include <asm/gpio.h>
  18#include <asm/unaligned.h>
  19#include <dm/acpi.h>
  20#include <dm/test.h>
  21#include <dm/uclass-internal.h>
  22#include <test/ut.h>
  23#include "acpi.h"
  24
  25/* Maximum size of the ACPI context needed for most tests */
  26#define ACPI_CONTEXT_SIZE       150
  27
  28#define TEST_STRING     "frogmore"
  29#define TEST_STRING2    "ranch"
  30#define TEST_STREAM2    "\xfa\xde"
  31
  32#define TEST_INT8       0x7d
  33#define TEST_INT16      0x2345
  34#define TEST_INT32      0x12345678
  35#define TEST_INT64      0x4567890123456
  36
  37int acpi_test_alloc_context_size(struct acpi_ctx **ctxp, int size)
  38{
  39        struct acpi_ctx *ctx;
  40
  41        *ctxp = NULL;
  42        ctx = malloc(sizeof(*ctx));
  43        if (!ctx)
  44                return -ENOMEM;
  45        ctx->base = malloc(size);
  46        if (!ctx->base) {
  47                free(ctx);
  48                return -ENOMEM;
  49        }
  50        ctx->ltop = 0;
  51        ctx->current = ctx->base;
  52        *ctxp = ctx;
  53
  54        return 0;
  55}
  56
  57int acpi_test_get_length(u8 *ptr)
  58{
  59        if (!(*ptr & 0x80))
  60                return -EINVAL;
  61
  62        return (*ptr & 0xf) | ptr[1] << 4 | ptr[2] << 12;
  63}
  64
  65static int alloc_context(struct acpi_ctx **ctxp)
  66{
  67        return acpi_test_alloc_context_size(ctxp, ACPI_CONTEXT_SIZE);
  68}
  69
  70static void free_context(struct acpi_ctx **ctxp)
  71{
  72        free((*ctxp)->base);
  73        free(*ctxp);
  74        *ctxp = NULL;
  75}
  76
  77/* Test emitting simple types and acpigen_get_current() */
  78static int dm_test_acpi_emit_simple(struct unit_test_state *uts)
  79{
  80        struct acpi_ctx *ctx;
  81        u8 *ptr;
  82
  83        ut_assertok(alloc_context(&ctx));
  84
  85        ptr = acpigen_get_current(ctx);
  86        acpigen_emit_byte(ctx, 0x23);
  87        ut_asserteq(1, acpigen_get_current(ctx) - ptr);
  88        ut_asserteq(0x23, *(u8 *)ptr);
  89
  90        acpigen_emit_word(ctx, 0x1234);
  91        ut_asserteq(3, acpigen_get_current(ctx) - ptr);
  92        ut_asserteq(0x1234, get_unaligned((u16 *)(ptr + 1)));
  93
  94        acpigen_emit_dword(ctx, 0x87654321);
  95        ut_asserteq(7, acpigen_get_current(ctx) - ptr);
  96        ut_asserteq(0x87654321, get_unaligned((u32 *)(ptr + 3)));
  97
  98        free_context(&ctx);
  99
 100        return 0;
 101}
 102DM_TEST(dm_test_acpi_emit_simple, 0);
 103
 104/* Test emitting a stream */
 105static int dm_test_acpi_emit_stream(struct unit_test_state *uts)
 106{
 107        struct acpi_ctx *ctx;
 108        u8 *ptr;
 109
 110        ut_assertok(alloc_context(&ctx));
 111
 112        ptr = acpigen_get_current(ctx);
 113        acpigen_emit_stream(ctx, TEST_STREAM2, 2);
 114        ut_asserteq(2, acpigen_get_current(ctx) - ptr);
 115        ut_asserteq((u8)TEST_STREAM2[0], ptr[0]);
 116        ut_asserteq((u8)TEST_STREAM2[1], ptr[1]);
 117
 118        free_context(&ctx);
 119
 120        return 0;
 121}
 122DM_TEST(dm_test_acpi_emit_stream, 0);
 123
 124/* Test emitting a string */
 125static int dm_test_acpi_emit_string(struct unit_test_state *uts)
 126{
 127        struct acpi_ctx *ctx;
 128        u8 *ptr;
 129
 130        ut_assertok(alloc_context(&ctx));
 131
 132        ptr = acpigen_get_current(ctx);
 133        acpigen_emit_string(ctx, TEST_STRING);
 134        ut_asserteq(sizeof(TEST_STRING), acpigen_get_current(ctx) - ptr);
 135        ut_asserteq_str(TEST_STRING, (char *)ptr);
 136
 137        free_context(&ctx);
 138
 139        return 0;
 140}
 141DM_TEST(dm_test_acpi_emit_string, 0);
 142
 143/* Test emitting an interrupt descriptor */
 144static int dm_test_acpi_interrupt(struct unit_test_state *uts)
 145{
 146        struct acpi_ctx *ctx;
 147        struct udevice *dev;
 148        struct irq irq;
 149        u8 *ptr;
 150
 151        ut_assertok(alloc_context(&ctx));
 152
 153        ptr = acpigen_get_current(ctx);
 154
 155        ut_assertok(uclass_first_device_err(UCLASS_TEST_FDT, &dev));
 156        ut_assertok(irq_get_by_index(dev, 0, &irq));
 157
 158        /* See a-test, property interrupts-extended in the device tree */
 159        ut_asserteq(3, acpi_device_write_interrupt_irq(ctx, &irq));
 160        ut_asserteq(9, acpigen_get_current(ctx) - ptr);
 161        ut_asserteq(ACPI_DESCRIPTOR_INTERRUPT, ptr[0]);
 162        ut_asserteq(6, get_unaligned((u16 *)(ptr + 1)));
 163        ut_asserteq(0x19, ptr[3]);
 164        ut_asserteq(1, ptr[4]);
 165        ut_asserteq(3, get_unaligned((u32 *)(ptr + 5)));
 166
 167        free_context(&ctx);
 168
 169        return 0;
 170}
 171DM_TEST(dm_test_acpi_interrupt, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
 172
 173/* Test emitting a GPIO descriptor */
 174static int dm_test_acpi_gpio(struct unit_test_state *uts)
 175{
 176        struct gpio_desc desc;
 177        struct acpi_ctx *ctx;
 178        struct udevice *dev;
 179        u8 *ptr;
 180
 181        ut_assertok(alloc_context(&ctx));
 182
 183        ptr = acpigen_get_current(ctx);
 184
 185        ut_assertok(uclass_get_device(UCLASS_TEST_FDT, 0, &dev));
 186        ut_asserteq_str("a-test", dev->name);
 187        ut_assertok(gpio_request_by_name(dev, "test-gpios", 1, &desc, 0));
 188
 189        /* This should write GPIO pin 4 (see device tree test.dts ) */
 190        ut_asserteq(4, acpi_device_write_gpio_desc(ctx, &desc));
 191        ut_asserteq(35, acpigen_get_current(ctx) - ptr);
 192        ut_asserteq(ACPI_DESCRIPTOR_GPIO, ptr[0]);
 193        ut_asserteq(32, get_unaligned((u16 *)(ptr + 1)));
 194        ut_asserteq(ACPI_GPIO_REVISION_ID, ptr[3]);
 195        ut_asserteq(ACPI_GPIO_TYPE_IO, ptr[4]);
 196        ut_asserteq(1, get_unaligned((u16 *)(ptr + 5)));
 197        ut_asserteq(9, get_unaligned((u16 *)(ptr + 7)));
 198        ut_asserteq(ACPI_GPIO_PULL_UP, ptr[9]);
 199        ut_asserteq(1234, get_unaligned((u16 *)(ptr + 10)));
 200        ut_asserteq(0, get_unaligned((u16 *)(ptr + 12)));
 201        ut_asserteq(23, get_unaligned((u16 *)(ptr + 14)));
 202        ut_asserteq(0, ptr[16]);
 203        ut_asserteq(25, get_unaligned((u16 *)(ptr + 17)));
 204        ut_asserteq(35, get_unaligned((u16 *)(ptr + 19)));
 205        ut_asserteq(0, get_unaligned((u16 *)(ptr + 21)));
 206
 207        /* pin0 */
 208        ut_asserteq(4, get_unaligned((u16 *)(ptr + 23)));
 209
 210        ut_asserteq_str("\\_SB.PINC", (char *)ptr + 25);
 211
 212        free_context(&ctx);
 213
 214        return 0;
 215}
 216DM_TEST(dm_test_acpi_gpio, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
 217
 218/* Test emitting a GPIO descriptor with an interrupt */
 219static int dm_test_acpi_gpio_irq(struct unit_test_state *uts)
 220{
 221        struct gpio_desc desc;
 222        struct acpi_ctx *ctx;
 223        struct udevice *dev;
 224        u8 *ptr;
 225
 226        ut_assertok(alloc_context(&ctx));
 227
 228        ptr = acpigen_get_current(ctx);
 229
 230        ut_assertok(uclass_get_device(UCLASS_TEST_FDT, 0, &dev));
 231        ut_asserteq_str("a-test", dev->name);
 232        ut_assertok(gpio_request_by_name(dev, "test2-gpios", 2, &desc, 0));
 233
 234        /* This should write GPIO pin 6 (see device tree test.dts ) */
 235        ut_asserteq(6, acpi_device_write_gpio_desc(ctx, &desc));
 236        ut_asserteq(35, acpigen_get_current(ctx) - ptr);
 237        ut_asserteq(ACPI_DESCRIPTOR_GPIO, ptr[0]);
 238        ut_asserteq(32, get_unaligned((u16 *)(ptr + 1)));
 239        ut_asserteq(ACPI_GPIO_REVISION_ID, ptr[3]);
 240        ut_asserteq(ACPI_GPIO_TYPE_INTERRUPT, ptr[4]);
 241        ut_asserteq(1, get_unaligned((u16 *)(ptr + 5)));
 242        ut_asserteq(29, get_unaligned((u16 *)(ptr + 7)));
 243        ut_asserteq(ACPI_GPIO_PULL_DOWN, ptr[9]);
 244        ut_asserteq(0, get_unaligned((u16 *)(ptr + 10)));
 245        ut_asserteq(4321, get_unaligned((u16 *)(ptr + 12)));
 246        ut_asserteq(23, get_unaligned((u16 *)(ptr + 14)));
 247        ut_asserteq(0, ptr[16]);
 248        ut_asserteq(25, get_unaligned((u16 *)(ptr + 17)));
 249        ut_asserteq(35, get_unaligned((u16 *)(ptr + 19)));
 250        ut_asserteq(0, get_unaligned((u16 *)(ptr + 21)));
 251
 252        /* pin0 */
 253        ut_asserteq(6, get_unaligned((u16 *)(ptr + 23)));
 254
 255        ut_asserteq_str("\\_SB.PINC", (char *)ptr + 25);
 256
 257        free_context(&ctx);
 258
 259        return 0;
 260}
 261DM_TEST(dm_test_acpi_gpio_irq, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
 262
 263/* Test emitting either a GPIO or interrupt descriptor */
 264static int dm_test_acpi_interrupt_or_gpio(struct unit_test_state *uts)
 265{
 266        struct acpi_ctx *ctx;
 267        struct udevice *dev;
 268        u8 *ptr;
 269
 270        ut_assertok(alloc_context(&ctx));
 271
 272        ptr = acpigen_get_current(ctx);
 273
 274        /* This should produce an interrupt, even though it also has a GPIO */
 275        ut_assertok(uclass_get_device(UCLASS_TEST_FDT, 0, &dev));
 276        ut_asserteq_str("a-test", dev->name);
 277        ut_asserteq(3, acpi_device_write_interrupt_or_gpio(ctx, dev,
 278                                                           "test2-gpios"));
 279        ut_asserteq(ACPI_DESCRIPTOR_INTERRUPT, ptr[0]);
 280
 281        /* This has no interrupt so should produce a GPIO */
 282        ptr = ctx->current;
 283        ut_assertok(uclass_find_first_device(UCLASS_PANEL_BACKLIGHT, &dev));
 284        ut_asserteq(1, acpi_device_write_interrupt_or_gpio(ctx, dev,
 285                                                           "enable-gpios"));
 286        ut_asserteq(ACPI_DESCRIPTOR_GPIO, ptr[0]);
 287
 288        /* This one has neither */
 289        ptr = acpigen_get_current(ctx);
 290        ut_assertok(uclass_get_device_by_seq(UCLASS_TEST_FDT, 3, &dev));
 291        ut_asserteq_str("b-test", dev->name);
 292        ut_asserteq(-ENOENT,
 293                    acpi_device_write_interrupt_or_gpio(ctx, dev,
 294                                                        "enable-gpios"));
 295
 296        free_context(&ctx);
 297
 298        return 0;
 299}
 300DM_TEST(dm_test_acpi_interrupt_or_gpio,
 301        UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
 302
 303/* Test emitting an I2C descriptor */
 304static int dm_test_acpi_i2c(struct unit_test_state *uts)
 305{
 306        struct acpi_ctx *ctx;
 307        struct udevice *dev;
 308        u8 *ptr;
 309
 310        ut_assertok(alloc_context(&ctx));
 311
 312        ptr = acpigen_get_current(ctx);
 313
 314        ut_assertok(uclass_get_device(UCLASS_RTC, 0, &dev));
 315        ut_asserteq(0x43, acpi_device_write_i2c_dev(ctx, dev));
 316        ut_asserteq(28, acpigen_get_current(ctx) - ptr);
 317        ut_asserteq(ACPI_DESCRIPTOR_SERIAL_BUS, ptr[0]);
 318        ut_asserteq(25, get_unaligned((u16 *)(ptr + 1)));
 319        ut_asserteq(ACPI_I2C_SERIAL_BUS_REVISION_ID, ptr[3]);
 320        ut_asserteq(0, ptr[4]);
 321        ut_asserteq(ACPI_SERIAL_BUS_TYPE_I2C, ptr[5]);
 322        ut_asserteq(0, get_unaligned((u16 *)(ptr + 7)));
 323        ut_asserteq(ACPI_I2C_TYPE_SPECIFIC_REVISION_ID, ptr[9]);
 324        ut_asserteq(6, get_unaligned((u16 *)(ptr + 10)));
 325        ut_asserteq(100000, get_unaligned((u32 *)(ptr + 12)));
 326        ut_asserteq(0x43, get_unaligned((u16 *)(ptr + 16)));
 327        ut_asserteq_str("\\_SB.I2C0", (char *)ptr + 18);
 328
 329        free_context(&ctx);
 330
 331        return 0;
 332}
 333DM_TEST(dm_test_acpi_i2c, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
 334
 335/* Test emitting a SPI descriptor */
 336static int dm_test_acpi_spi(struct unit_test_state *uts)
 337{
 338        struct acpi_ctx *ctx;
 339        struct udevice *dev;
 340        u8 *ptr;
 341
 342        ut_assertok(alloc_context(&ctx));
 343
 344        ptr = acpigen_get_current(ctx);
 345
 346        ut_assertok(uclass_first_device_err(UCLASS_SPI_FLASH, &dev));
 347        ut_assertok(acpi_device_write_spi_dev(ctx, dev));
 348        ut_asserteq(31, acpigen_get_current(ctx) - ptr);
 349        ut_asserteq(ACPI_DESCRIPTOR_SERIAL_BUS, ptr[0]);
 350        ut_asserteq(28, get_unaligned((u16 *)(ptr + 1)));
 351        ut_asserteq(ACPI_SPI_SERIAL_BUS_REVISION_ID, ptr[3]);
 352        ut_asserteq(0, ptr[4]);
 353        ut_asserteq(ACPI_SERIAL_BUS_TYPE_SPI, ptr[5]);
 354        ut_asserteq(2, ptr[6]);
 355        ut_asserteq(0, get_unaligned((u16 *)(ptr + 7)));
 356        ut_asserteq(ACPI_SPI_TYPE_SPECIFIC_REVISION_ID, ptr[9]);
 357        ut_asserteq(9, get_unaligned((u16 *)(ptr + 10)));
 358        ut_asserteq(40000000, get_unaligned((u32 *)(ptr + 12)));
 359        ut_asserteq(8, ptr[16]);
 360        ut_asserteq(0, ptr[17]);
 361        ut_asserteq(0, ptr[18]);
 362        ut_asserteq(0, get_unaligned((u16 *)(ptr + 19)));
 363        ut_asserteq_str("\\_SB.SPI0", (char *)ptr + 21);
 364
 365        free_context(&ctx);
 366
 367        return 0;
 368}
 369DM_TEST(dm_test_acpi_spi, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
 370
 371/* Test emitting a length */
 372static int dm_test_acpi_len(struct unit_test_state *uts)
 373{
 374        const int size = 0xc0000;
 375        struct acpi_ctx *ctx;
 376        u8 *ptr;
 377        int i;
 378
 379        ut_assertok(acpi_test_alloc_context_size(&ctx, size));
 380
 381        ptr = acpigen_get_current(ctx);
 382
 383        /* Write a byte and a 3-byte length */
 384        acpigen_write_len_f(ctx);
 385        acpigen_emit_byte(ctx, 0x23);
 386        acpigen_pop_len(ctx);
 387        ut_asserteq(1 + 3, acpi_test_get_length(ptr));
 388
 389        /* Write 200 bytes so we need two length bytes */
 390        ptr = ctx->current;
 391        acpigen_write_len_f(ctx);
 392        for (i = 0; i < 200; i++)
 393                acpigen_emit_byte(ctx, 0x23);
 394        acpigen_pop_len(ctx);
 395        ut_asserteq(200 + 3, acpi_test_get_length(ptr));
 396
 397        /* Write 40KB so we need three length bytes */
 398        ptr = ctx->current;
 399        acpigen_write_len_f(ctx);
 400        for (i = 0; i < 40000; i++)
 401                acpigen_emit_byte(ctx, 0x23);
 402        acpigen_pop_len(ctx);
 403        ut_asserteq(40000 + 3, acpi_test_get_length(ptr));
 404
 405        free_context(&ctx);
 406
 407        return 0;
 408}
 409DM_TEST(dm_test_acpi_len, 0);
 410
 411/* Test writing a package */
 412static int dm_test_acpi_package(struct unit_test_state *uts)
 413{
 414        struct acpi_ctx *ctx;
 415        char *num_elements;
 416        u8 *ptr;
 417
 418        ut_assertok(alloc_context(&ctx));
 419
 420        ptr = acpigen_get_current(ctx);
 421
 422        num_elements = acpigen_write_package(ctx, 3);
 423        ut_asserteq_ptr(num_elements, ptr + 4);
 424
 425        /* For ease of testing, just emit a byte, not valid package contents */
 426        acpigen_emit_byte(ctx, 0x23);
 427        acpigen_pop_len(ctx);
 428        ut_asserteq(PACKAGE_OP, ptr[0]);
 429        ut_asserteq(5, acpi_test_get_length(ptr + 1));
 430        ut_asserteq(3, ptr[4]);
 431
 432        free_context(&ctx);
 433
 434        return 0;
 435}
 436DM_TEST(dm_test_acpi_package, 0);
 437
 438/* Test writing an integer */
 439static int dm_test_acpi_integer(struct unit_test_state *uts)
 440{
 441        struct acpi_ctx *ctx;
 442        u8 *ptr;
 443
 444        ut_assertok(alloc_context(&ctx));
 445
 446        ptr = acpigen_get_current(ctx);
 447
 448        acpigen_write_integer(ctx, 0);
 449        acpigen_write_integer(ctx, 1);
 450        acpigen_write_integer(ctx, TEST_INT8);
 451        acpigen_write_integer(ctx, TEST_INT16);
 452        acpigen_write_integer(ctx, TEST_INT32);
 453        acpigen_write_integer(ctx, TEST_INT64);
 454
 455        ut_asserteq(6 + 1 + 2 + 4 + 8, acpigen_get_current(ctx) - ptr);
 456
 457        ut_asserteq(ZERO_OP, ptr[0]);
 458
 459        ut_asserteq(ONE_OP, ptr[1]);
 460
 461        ut_asserteq(BYTE_PREFIX, ptr[2]);
 462        ut_asserteq(TEST_INT8, ptr[3]);
 463
 464        ut_asserteq(WORD_PREFIX, ptr[4]);
 465        ut_asserteq(TEST_INT16, get_unaligned((u16 *)(ptr + 5)));
 466
 467        ut_asserteq(DWORD_PREFIX, ptr[7]);
 468        ut_asserteq(TEST_INT32, get_unaligned((u32 *)(ptr + 8)));
 469
 470        ut_asserteq(QWORD_PREFIX, ptr[12]);
 471        ut_asserteq_64(TEST_INT64, get_unaligned((u64 *)(ptr + 13)));
 472
 473        free_context(&ctx);
 474
 475        return 0;
 476}
 477DM_TEST(dm_test_acpi_integer, 0);
 478
 479/* Test writing a string */
 480static int dm_test_acpi_string(struct unit_test_state *uts)
 481{
 482        struct acpi_ctx *ctx;
 483        u8 *ptr;
 484
 485        ut_assertok(alloc_context(&ctx));
 486
 487        ptr = acpigen_get_current(ctx);
 488
 489        acpigen_write_string(ctx, TEST_STRING);
 490        acpigen_write_string(ctx, TEST_STRING2);
 491
 492        ut_asserteq(2 + sizeof(TEST_STRING) + sizeof(TEST_STRING2),
 493                    acpigen_get_current(ctx) - ptr);
 494        ut_asserteq(STRING_PREFIX, ptr[0]);
 495        ut_asserteq_str(TEST_STRING, (char *)ptr + 1);
 496        ptr += 1 + sizeof(TEST_STRING);
 497        ut_asserteq(STRING_PREFIX, ptr[0]);
 498        ut_asserteq_str(TEST_STRING2, (char *)ptr + 1);
 499
 500        free_context(&ctx);
 501
 502        return 0;
 503}
 504DM_TEST(dm_test_acpi_string, 0);
 505
 506/* Test writing a name */
 507static int dm_test_acpi_name(struct unit_test_state *uts)
 508{
 509        struct acpi_ctx *ctx;
 510        u8 *ptr;
 511
 512        ut_assertok(alloc_context(&ctx));
 513
 514        ptr = acpigen_get_current(ctx);
 515
 516        /*
 517         * The names here are made up for testing the various cases. The
 518         * grammar is in the ACPI spec 6.3 section 19.2.2
 519         */
 520        acpigen_write_name(ctx, "\\_SB");
 521        acpigen_write_name(ctx, "\\_SB.I2C0");
 522        acpigen_write_name(ctx, "\\_SB.I2C0.TPM2");
 523        acpigen_write_name(ctx, "\\_SB.I2C0.TPM2.LONG");
 524        acpigen_write_name(ctx, "^^^^SPI0.FLAS");
 525        acpigen_write_name(ctx, "NN");
 526        acpigen_write_name(ctx, "^AB.CD.D.EFG");
 527        acpigen_write_name(ctx, "^^^^");
 528        acpigen_write_name(ctx, "\\");
 529        acpigen_write_name(ctx, "\\ABCD");
 530
 531        ut_asserteq(107, acpigen_get_current(ctx) - ptr);
 532        ut_asserteq(NAME_OP, ptr[0]);
 533        ut_asserteq_strn("\\_SB_", (char *)ptr + 1);
 534        ptr += 6;
 535
 536        ut_asserteq(NAME_OP, ptr[0]);
 537        ut_asserteq('\\', ptr[1]);
 538        ut_asserteq(DUAL_NAME_PREFIX, ptr[2]);
 539        ut_asserteq_strn("_SB_I2C0", (char *)ptr + 3);
 540        ptr += 11;
 541
 542        ut_asserteq(NAME_OP, ptr[0]);
 543        ut_asserteq('\\', ptr[1]);
 544        ut_asserteq(MULTI_NAME_PREFIX, ptr[2]);
 545        ut_asserteq(3, ptr[3]);
 546        ut_asserteq_strn("_SB_I2C0TPM2", (char *)ptr + 4);
 547        ptr += 16;
 548
 549        ut_asserteq(NAME_OP, ptr[0]);
 550        ut_asserteq('\\', ptr[1]);
 551        ut_asserteq(MULTI_NAME_PREFIX, ptr[2]);
 552        ut_asserteq(4, ptr[3]);
 553        ut_asserteq_strn("_SB_I2C0TPM2LONG", (char *)ptr + 4);
 554        ptr += 20;
 555
 556        ut_asserteq(NAME_OP, ptr[0]);
 557        ut_asserteq('^', ptr[1]);
 558        ut_asserteq('^', ptr[2]);
 559        ut_asserteq('^', ptr[3]);
 560        ut_asserteq('^', ptr[4]);
 561        ut_asserteq(DUAL_NAME_PREFIX, ptr[5]);
 562        ut_asserteq_strn("SPI0FLAS", (char *)ptr + 6);
 563        ptr += 14;
 564
 565        ut_asserteq(NAME_OP, ptr[0]);
 566        ut_asserteq_strn("NN__", (char *)ptr + 1);
 567        ptr += 5;
 568
 569        ut_asserteq(NAME_OP, ptr[0]);
 570        ut_asserteq('^', ptr[1]);
 571        ut_asserteq(MULTI_NAME_PREFIX, ptr[2]);
 572        ut_asserteq(4, ptr[3]);
 573        ut_asserteq_strn("AB__CD__D___EFG_", (char *)ptr + 4);
 574        ptr += 20;
 575
 576        ut_asserteq(NAME_OP, ptr[0]);
 577        ut_asserteq('^', ptr[1]);
 578        ut_asserteq('^', ptr[2]);
 579        ut_asserteq('^', ptr[3]);
 580        ut_asserteq('^', ptr[4]);
 581        ut_asserteq(ZERO_OP, ptr[5]);
 582        ptr += 6;
 583
 584        ut_asserteq(NAME_OP, ptr[0]);
 585        ut_asserteq('\\', ptr[1]);
 586        ut_asserteq(ZERO_OP, ptr[2]);
 587        ptr += 3;
 588
 589        ut_asserteq(NAME_OP, ptr[0]);
 590        ut_asserteq_strn("\\ABCD", (char *)ptr + 1);
 591        ptr += 5;
 592
 593        free_context(&ctx);
 594
 595        return 0;
 596}
 597DM_TEST(dm_test_acpi_name, 0);
 598
 599/* Test writing a UUID */
 600static int dm_test_acpi_uuid(struct unit_test_state *uts)
 601{
 602        struct acpi_ctx *ctx;
 603        u8 *ptr;
 604
 605        ut_assertok(alloc_context(&ctx));
 606
 607        ptr = acpigen_get_current(ctx);
 608
 609        ut_assertok(acpigen_write_uuid(ctx,
 610                                       "dbb8e3e6-5886-4ba6-8795-1319f52a966b"));
 611        ut_asserteq(23, acpigen_get_current(ctx) - ptr);
 612        ut_asserteq(BUFFER_OP, ptr[0]);
 613        ut_asserteq(22, acpi_test_get_length(ptr + 1));
 614        ut_asserteq(0xdbb8e3e6, get_unaligned((u32 *)(ptr + 7)));
 615        ut_asserteq(0x5886, get_unaligned((u16 *)(ptr + 11)));
 616        ut_asserteq(0x4ba6, get_unaligned((u16 *)(ptr + 13)));
 617        ut_asserteq(0x9587, get_unaligned((u16 *)(ptr + 15)));
 618        ut_asserteq(0x2af51913, get_unaligned((u32 *)(ptr + 17)));
 619        ut_asserteq(0x6b96, get_unaligned((u16 *)(ptr + 21)));
 620
 621        /* Try a bad UUID */
 622        ut_asserteq(-EINVAL,
 623                    acpigen_write_uuid(ctx,
 624                                       "dbb8e3e6-5886-4ba6x8795-1319f52a966b"));
 625
 626        free_context(&ctx);
 627
 628        return 0;
 629}
 630DM_TEST(dm_test_acpi_uuid, 0);
 631
 632/* Test writing misc ACPI codes */
 633static int dm_test_acpi_misc(struct unit_test_state *uts)
 634{
 635        struct acpi_ctx *ctx;
 636        const int flags = 3;
 637        const int nargs = 4;
 638        u8 *ptr;
 639
 640        ut_assertok(alloc_context(&ctx));
 641
 642        ptr = acpigen_get_current(ctx);
 643        acpigen_write_sleep(ctx, TEST_INT64);
 644        ut_asserteq_64(TEST_INT64, get_unaligned((u64 *)(ptr + 3)));
 645        ptr += 11;
 646
 647        acpigen_write_store(ctx);
 648        ut_asserteq(STORE_OP, *ptr);
 649        ptr++;
 650
 651        acpigen_write_debug_string(ctx, TEST_STRING);
 652        ut_asserteq_str(TEST_STRING, (char *)ptr + 2);
 653        ptr += 2 +  sizeof(TEST_STRING);
 654        ut_asserteq(EXT_OP_PREFIX, ptr[0]);
 655        ut_asserteq(DEBUG_OP, ptr[1]);
 656        ptr += 2;
 657
 658        acpigen_write_sta(ctx, flags);
 659        ut_asserteq(METHOD_OP, ptr[0]);
 660        ut_asserteq(11, acpi_test_get_length(ptr + 1));
 661        ut_asserteq_strn("_STA", (char *)ptr + 4);
 662        ut_asserteq(0, ptr[8]);
 663        ut_asserteq(RETURN_OP, ptr[9]);
 664        ut_asserteq(BYTE_PREFIX, ptr[10]);
 665        ut_asserteq(flags, ptr[11]);
 666        ptr += 12;
 667
 668        acpigen_write_sleep(ctx, TEST_INT16);
 669        ut_asserteq(SLEEP_OP, ptr[1]);
 670        ut_asserteq(TEST_INT16, get_unaligned((u16 *)(ptr + 3)));
 671        ptr += 5;
 672
 673        acpigen_write_method_serialized(ctx, "FRED", nargs);
 674        ut_asserteq(METHOD_OP, ptr[0]);
 675        ut_asserteq_strn("FRED", (char *)ptr + 4);
 676        ut_asserteq(1 << 3 | nargs, ptr[8]);
 677        ut_asserteq(1, ctx->ltop);      /* method is unfinished */
 678
 679        ptr += 9;
 680        acpigen_write_or(ctx, LOCAL0_OP, LOCAL1_OP, LOCAL2_OP);
 681        acpigen_write_and(ctx, LOCAL3_OP, LOCAL4_OP, LOCAL5_OP);
 682        acpigen_write_not(ctx, LOCAL6_OP, LOCAL7_OP);
 683        ut_asserteq(OR_OP, ptr[0]);
 684        ut_asserteq(LOCAL0_OP, ptr[1]);
 685        ut_asserteq(LOCAL1_OP, ptr[2]);
 686        ut_asserteq(LOCAL2_OP, ptr[3]);
 687
 688        ptr += 4;
 689        ut_asserteq(AND_OP, ptr[0]);
 690        ut_asserteq(LOCAL3_OP, ptr[1]);
 691        ut_asserteq(LOCAL4_OP, ptr[2]);
 692        ut_asserteq(LOCAL5_OP, ptr[3]);
 693
 694        ptr += 4;
 695        ut_asserteq(NOT_OP, ptr[0]);
 696        ut_asserteq(LOCAL6_OP, ptr[1]);
 697        ut_asserteq(LOCAL7_OP, ptr[2]);
 698        ptr += 3;
 699        ut_asserteq_ptr(ptr, ctx->current);
 700
 701        free_context(&ctx);
 702
 703        return 0;
 704}
 705DM_TEST(dm_test_acpi_misc, 0);
 706
 707/* Test writing an ACPI power resource */
 708static int dm_test_acpi_power_res(struct unit_test_state *uts)
 709{
 710        const char *const states[] = { "_PR0", "_PR3" };
 711        const char *name = "PRIC";
 712        const int level = 3;
 713        const int order = 2;
 714        struct acpi_ctx *ctx;
 715        u8 *ptr;
 716
 717        ut_assertok(alloc_context(&ctx));
 718
 719        ptr = acpigen_get_current(ctx);
 720
 721        /* PowerResource (PRIC, 0, 0) */
 722        acpigen_write_power_res(ctx, name, level, order, states,
 723                                ARRAY_SIZE(states));
 724        ut_asserteq(0x28, acpigen_get_current(ctx) - ptr);
 725        ut_asserteq(NAME_OP, ptr[0]);
 726        ut_asserteq_strn(states[0], (char *)ptr + 1);
 727        ut_asserteq(8, acpi_test_get_length(ptr + 6));
 728        ut_asserteq_strn(name, (char *)ptr + 0xa);
 729
 730        ut_asserteq_strn(states[1], (char *)ptr + 0xf);
 731        ut_asserteq(8, acpi_test_get_length(ptr + 0x14));
 732        ut_asserteq_strn(name, (char *)ptr + 0x18);
 733
 734        ut_asserteq(POWER_RES_OP, ptr[0x1d]);
 735        ut_asserteq_strn(name, (char *)ptr + 0x21);
 736        ut_asserteq(level, ptr[0x25]);
 737        ut_asserteq(order, get_unaligned((u16 *)(ptr + 0x26)));
 738
 739        /* The length is not set - caller must use acpigen_pop_len() */
 740        ut_asserteq(1, ctx->ltop);
 741
 742        free_context(&ctx);
 743
 744        return 0;
 745}
 746DM_TEST(dm_test_acpi_power_res, 0);
 747
 748/* Test writing ACPI code to toggle a GPIO */
 749static int dm_test_acpi_gpio_toggle(struct unit_test_state *uts)
 750{
 751        const uint addr = 0x80012;
 752        const int txbit = BIT(2);
 753        struct gpio_desc desc;
 754        struct acpi_gpio gpio;
 755        struct acpi_ctx *ctx;
 756        struct udevice *dev;
 757        u8 *ptr;
 758
 759        ut_assertok(alloc_context(&ctx));
 760
 761        ut_assertok(uclass_get_device(UCLASS_TEST_FDT, 0, &dev));
 762        ut_asserteq_str("a-test", dev->name);
 763        ut_assertok(gpio_request_by_name(dev, "test2-gpios", 2, &desc, 0));
 764        ut_assertok(gpio_get_acpi(&desc, &gpio));
 765
 766        /* Spot-check the results - see sb_gpio_get_acpi() */
 767        ptr = acpigen_get_current(ctx);
 768        acpigen_set_enable_tx_gpio(ctx, txbit, "\\_SB.GPC0", "\\_SB.SPC0",
 769                                   &gpio, true);
 770        acpigen_set_enable_tx_gpio(ctx, txbit, "\\_SB.GPC0", "\\_SB.SPC0",
 771                                   &gpio, false);
 772
 773        /* Since this GPIO is active low, we expect it to be cleared here */
 774        ut_asserteq(STORE_OP, *ptr);
 775        ut_asserteq_strn("_SB_GPC0", (char *)ptr + 3);
 776        ut_asserteq(addr + desc.offset, get_unaligned((u32 *)(ptr + 0xc)));
 777        ut_asserteq(LOCAL5_OP, ptr[0x10]);
 778
 779        ut_asserteq(STORE_OP, ptr[0x11]);
 780        ut_asserteq(BYTE_PREFIX, ptr[0x12]);
 781        ut_asserteq(txbit, ptr[0x13]);
 782        ut_asserteq(LOCAL0_OP, ptr[0x14]);
 783
 784        ut_asserteq(NOT_OP, ptr[0x15]);
 785        ut_asserteq(LOCAL0_OP, ptr[0x16]);
 786        ut_asserteq(LOCAL6_OP, ptr[0x17]);
 787        ut_asserteq(AND_OP, ptr[0x18]);
 788        ut_asserteq_strn("_SB_SPC0", (char *)ptr + 0x1e);
 789        ut_asserteq(addr + desc.offset, get_unaligned((u32 *)(ptr + 0x27)));
 790        ut_asserteq(LOCAL5_OP, ptr[0x2b]);
 791
 792        /* Now the second one, which should be set */
 793        ut_asserteq_strn("_SB_GPC0", (char *)ptr + 0x2f);
 794        ut_asserteq(addr + desc.offset, get_unaligned((u32 *)(ptr + 0x38)));
 795        ut_asserteq(LOCAL5_OP, ptr[0x3c]);
 796
 797        ut_asserteq(STORE_OP, ptr[0x3d]);
 798
 799        ut_asserteq(OR_OP, ptr[0x41]);
 800        ut_asserteq(LOCAL0_OP, ptr[0x43]);
 801        ut_asserteq_strn("_SB_SPC0", (char *)ptr + 0x47);
 802        ut_asserteq(addr + desc.offset, get_unaligned((u32 *)(ptr + 0x50)));
 803        ut_asserteq(LOCAL5_OP, ptr[0x54]);
 804        ut_asserteq(0x55, acpigen_get_current(ctx) - ptr);
 805
 806        free_context(&ctx);
 807
 808        return 0;
 809}
 810DM_TEST(dm_test_acpi_gpio_toggle, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
 811
 812/* Test writing ACPI code to output power-sequence info */
 813static int dm_test_acpi_power_seq(struct unit_test_state *uts)
 814{
 815        struct gpio_desc reset, enable, stop;
 816        const uint addr = 0xc00dc, addr_act_low = 0x80012;
 817        const int txbit = BIT(2);
 818        struct acpi_ctx *ctx;
 819        struct udevice *dev;
 820        u8 *ptr;
 821
 822        ut_assertok(acpi_test_alloc_context_size(&ctx, 400));
 823
 824        ut_assertok(uclass_get_device(UCLASS_TEST_FDT, 0, &dev));
 825        ut_asserteq_str("a-test", dev->name);
 826        ut_assertok(gpio_request_by_name(dev, "test2-gpios", 0, &reset, 0));
 827        ut_assertok(gpio_request_by_name(dev, "test2-gpios", 1, &enable, 0));
 828        ut_assertok(gpio_request_by_name(dev, "test2-gpios", 2, &stop, 0));
 829        ptr = acpigen_get_current(ctx);
 830
 831        ut_assertok(acpi_device_add_power_res(ctx, txbit, "\\_SB.GPC0",
 832                                              "\\_SB.SPC0", &reset, 2, 3,
 833                                              &enable, 4, 5, &stop, 6, 7));
 834        ut_asserteq(0x186, acpigen_get_current(ctx) - ptr);
 835        ut_asserteq_strn("PRIC", (char *)ptr + 0x18);
 836
 837        /* First the 'ON' sequence - spot check */
 838        ut_asserteq_strn("_ON_", (char *)ptr + 0x38);
 839
 840        /* reset set */
 841        ut_asserteq(addr + reset.offset, get_unaligned((u32 *)(ptr + 0x49)));
 842        ut_asserteq(OR_OP, ptr[0x52]);
 843
 844        /* enable set */
 845        ut_asserteq(addr + enable.offset, get_unaligned((u32 *)(ptr + 0x72)));
 846        ut_asserteq(OR_OP, ptr[0x7b]);
 847
 848        /* reset clear */
 849        ut_asserteq(addr + reset.offset, get_unaligned((u32 *)(ptr + 0x9f)));
 850        ut_asserteq(NOT_OP, ptr[0xa8]);
 851
 852        /* stop set (disable, active low) */
 853        ut_asserteq(addr_act_low + stop.offset,
 854                    get_unaligned((u32 *)(ptr + 0xcf)));
 855        ut_asserteq(OR_OP, ptr[0xd8]);
 856
 857        /* Now the 'OFF' sequence */
 858        ut_asserteq_strn("_OFF", (char *)ptr + 0xf4);
 859
 860        /* stop clear (enable, active low) */
 861        ut_asserteq(addr_act_low + stop.offset,
 862                    get_unaligned((u32 *)(ptr + 0x105)));
 863        ut_asserteq(NOT_OP, ptr[0x10e]);
 864
 865        /* reset clear */
 866        ut_asserteq(addr + reset.offset, get_unaligned((u32 *)(ptr + 0x135)));
 867        ut_asserteq(OR_OP, ptr[0x13e]);
 868
 869        /* enable clear */
 870        ut_asserteq(addr + enable.offset, get_unaligned((u32 *)(ptr + 0x162)));
 871        ut_asserteq(NOT_OP, ptr[0x16b]);
 872
 873        free_context(&ctx);
 874
 875        return 0;
 876}
 877DM_TEST(dm_test_acpi_power_seq, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
 878
 879/* Test writing values */
 880static int dm_test_acpi_write_values(struct unit_test_state *uts)
 881{
 882        struct acpi_ctx *ctx;
 883        u8 *ptr;
 884
 885        ut_assertok(alloc_context(&ctx));
 886        ptr = acpigen_get_current(ctx);
 887
 888        acpigen_write_zero(ctx);
 889        acpigen_write_one(ctx);
 890        acpigen_write_byte(ctx, TEST_INT8);
 891        acpigen_write_word(ctx, TEST_INT16);
 892        acpigen_write_dword(ctx, TEST_INT32);
 893        acpigen_write_qword(ctx, TEST_INT64);
 894
 895        ut_asserteq(ZERO_OP, *ptr++);
 896
 897        ut_asserteq(ONE_OP, *ptr++);
 898
 899        ut_asserteq(BYTE_PREFIX, *ptr++);
 900        ut_asserteq(TEST_INT8, *ptr++);
 901
 902        ut_asserteq(WORD_PREFIX, *ptr++);
 903        ut_asserteq(TEST_INT16, get_unaligned((u16 *)ptr));
 904        ptr += 2;
 905
 906        ut_asserteq(DWORD_PREFIX, *ptr++);
 907        ut_asserteq(TEST_INT32, get_unaligned((u32 *)ptr));
 908        ptr += 4;
 909
 910        ut_asserteq(QWORD_PREFIX, *ptr++);
 911        ut_asserteq_64(TEST_INT64, get_unaligned((u64 *)ptr));
 912        ptr += 8;
 913
 914        ut_asserteq_ptr(ptr, ctx->current);
 915
 916        free_context(&ctx);
 917
 918        return 0;
 919}
 920DM_TEST(dm_test_acpi_write_values, 0);
 921
 922/* Test writing a scope */
 923static int dm_test_acpi_scope(struct unit_test_state *uts)
 924{
 925        char buf[ACPI_PATH_MAX];
 926        struct acpi_ctx *ctx;
 927        struct udevice *dev;
 928        u8 *ptr;
 929
 930        ut_assertok(alloc_context(&ctx));
 931        ptr = acpigen_get_current(ctx);
 932
 933        ut_assertok(uclass_first_device_err(UCLASS_TEST_ACPI, &dev));
 934        ut_assertok(acpi_device_path(dev, buf, sizeof(buf)));
 935        acpigen_write_scope(ctx, buf);
 936        acpigen_pop_len(ctx);
 937
 938        ut_asserteq(SCOPE_OP, *ptr++);
 939        ut_asserteq(13, acpi_test_get_length(ptr));
 940        ptr += 3;
 941        ut_asserteq(ROOT_PREFIX, *ptr++);
 942        ut_asserteq(DUAL_NAME_PREFIX, *ptr++);
 943        ut_asserteq_strn("_SB_" ACPI_TEST_DEV_NAME, (char *)ptr);
 944        ptr += 8;
 945        ut_asserteq_ptr(ptr, ctx->current);
 946
 947        free_context(&ctx);
 948
 949        return 0;
 950}
 951DM_TEST(dm_test_acpi_scope, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
 952
 953/* Test writing a resource template */
 954static int dm_test_acpi_resource_template(struct unit_test_state *uts)
 955{
 956        struct acpi_gen_regaddr addr;
 957        struct acpi_ctx *ctx;
 958        u8 *ptr;
 959
 960        ut_assertok(alloc_context(&ctx));
 961        ptr = acpigen_get_current(ctx);
 962
 963        addr.space_id = ACPI_ADDRESS_SPACE_EC;
 964        addr.bit_width = 32;
 965        addr.bit_offset = 8;
 966        addr.access_size = ACPI_ACCESS_SIZE_DWORD_ACCESS;
 967        addr.addrl = TEST_INT64 & 0xffffffff;
 968        addr.addrh = TEST_INT64 >> 32;
 969        acpigen_write_register_resource(ctx, &addr);
 970
 971        ut_asserteq(BUFFER_OP, *ptr++);
 972        ut_asserteq(0x17, acpi_test_get_length(ptr));
 973        ptr += 3;
 974        ut_asserteq(WORD_PREFIX, *ptr++);
 975        ut_asserteq(0x11, get_unaligned((u16 *)ptr));
 976        ptr += 2;
 977        ut_asserteq(ACPI_DESCRIPTOR_REGISTER, *ptr++);
 978        ut_asserteq(0xc, *ptr++);
 979        ut_asserteq(0, *ptr++);
 980        ut_asserteq(ACPI_ADDRESS_SPACE_EC, *ptr++);
 981        ut_asserteq(32, *ptr++);
 982        ut_asserteq(8, *ptr++);
 983        ut_asserteq(ACPI_ACCESS_SIZE_DWORD_ACCESS, *ptr++);
 984        ut_asserteq(TEST_INT64 & 0xffffffff, get_unaligned((u32 *)ptr));
 985        ptr += 4;
 986        ut_asserteq(TEST_INT64 >> 32, get_unaligned((u32 *)ptr));
 987        ptr += 4;
 988        ut_asserteq(ACPI_END_TAG, *ptr++);
 989        ut_asserteq(0x00, *ptr++);
 990        ut_asserteq_ptr(ptr, ctx->current);
 991
 992        free_context(&ctx);
 993
 994        return 0;
 995}
 996DM_TEST(dm_test_acpi_resource_template, 0);
 997
 998/* Test writing a device */
 999static int dm_test_acpi_device(struct unit_test_state *uts)
1000{
1001        struct acpi_ctx *ctx;
1002        u8 *ptr;
1003
1004        ut_assertok(alloc_context(&ctx));
1005        ptr = acpigen_get_current(ctx);
1006
1007        acpigen_write_device(ctx, "\\_SB." ACPI_TEST_DEV_NAME);
1008        acpigen_pop_len(ctx);
1009
1010        ut_asserteq(EXT_OP_PREFIX, *ptr++);
1011        ut_asserteq(DEVICE_OP, *ptr++);
1012        ut_asserteq(0xd, acpi_test_get_length(ptr));
1013        ptr += 3;
1014        ut_asserteq(ROOT_PREFIX, *ptr++);
1015        ut_asserteq(DUAL_NAME_PREFIX, *ptr++);
1016        ptr += 8;
1017        ut_asserteq_ptr(ptr, ctx->current);
1018
1019        free_context(&ctx);
1020
1021        return 0;
1022}
1023DM_TEST(dm_test_acpi_device, 0);
1024
1025/* Test writing named values */
1026static int dm_test_acpi_write_name(struct unit_test_state *uts)
1027{
1028        const char *name = "\\_SB." ACPI_TEST_DEV_NAME;
1029        struct acpi_ctx *ctx;
1030        u8 *ptr;
1031
1032        ut_assertok(alloc_context(&ctx));
1033        ptr = acpigen_get_current(ctx);
1034
1035        acpigen_write_name_zero(ctx, name);
1036        acpigen_write_name_one(ctx, name);
1037        acpigen_write_name_byte(ctx, name, TEST_INT8);
1038        acpigen_write_name_word(ctx, name, TEST_INT16);
1039        acpigen_write_name_dword(ctx, name, TEST_INT32);
1040        acpigen_write_name_qword(ctx, name, TEST_INT64);
1041        acpigen_write_name_integer(ctx, name, TEST_INT64 + 1);
1042        acpigen_write_name_string(ctx, name, "baldrick");
1043        acpigen_write_name_string(ctx, name, NULL);
1044
1045        ut_asserteq(NAME_OP, *ptr++);
1046        ut_asserteq_strn("\\._SB_ABCD", (char *)ptr);
1047        ptr += 10;
1048        ut_asserteq(ZERO_OP, *ptr++);
1049
1050        ut_asserteq(NAME_OP, *ptr++);
1051        ptr += 10;
1052        ut_asserteq(ONE_OP, *ptr++);
1053
1054        ut_asserteq(NAME_OP, *ptr++);
1055        ptr += 10;
1056        ut_asserteq(BYTE_PREFIX, *ptr++);
1057        ut_asserteq(TEST_INT8, *ptr++);
1058
1059        ut_asserteq(NAME_OP, *ptr++);
1060        ptr += 10;
1061        ut_asserteq(WORD_PREFIX, *ptr++);
1062        ut_asserteq(TEST_INT16, get_unaligned((u16 *)ptr));
1063        ptr += 2;
1064
1065        ut_asserteq(NAME_OP, *ptr++);
1066        ptr += 10;
1067        ut_asserteq(DWORD_PREFIX, *ptr++);
1068        ut_asserteq(TEST_INT32, get_unaligned((u32 *)ptr));
1069        ptr += 4;
1070
1071        ut_asserteq(NAME_OP, *ptr++);
1072        ptr += 10;
1073        ut_asserteq(QWORD_PREFIX, *ptr++);
1074        ut_asserteq_64(TEST_INT64, get_unaligned((u64 *)ptr));
1075        ptr += 8;
1076
1077        ut_asserteq(NAME_OP, *ptr++);
1078        ptr += 10;
1079        ut_asserteq(QWORD_PREFIX, *ptr++);
1080        ut_asserteq_64(TEST_INT64 + 1, get_unaligned((u64 *)ptr));
1081        ptr += 8;
1082
1083        ut_asserteq(NAME_OP, *ptr++);
1084        ptr += 10;
1085        ut_asserteq(STRING_PREFIX, *ptr++);
1086        ut_asserteq_str("baldrick", (char *)ptr)
1087        ptr += 9;
1088
1089        ut_asserteq(NAME_OP, *ptr++);
1090        ptr += 10;
1091        ut_asserteq(STRING_PREFIX, *ptr++);
1092        ut_asserteq('\0', *ptr++);
1093
1094        ut_asserteq_ptr(ptr, ctx->current);
1095
1096        free_context(&ctx);
1097
1098        return 0;
1099}
1100DM_TEST(dm_test_acpi_write_name, 0);
1101
1102/* Test emitting a _PRW component */
1103static int dm_test_acpi_write_prw(struct unit_test_state *uts)
1104{
1105        struct acpi_ctx *ctx;
1106        u8 *ptr;
1107
1108        ut_assertok(alloc_context(&ctx));
1109
1110        ptr = acpigen_get_current(ctx);
1111        acpigen_write_prw(ctx, 5, 3);
1112        ut_asserteq(NAME_OP, *ptr++);
1113
1114        ut_asserteq_strn("_PRW", (char *)ptr);
1115        ptr += 4;
1116        ut_asserteq(PACKAGE_OP, *ptr++);
1117        ut_asserteq(8, acpi_test_get_length(ptr));
1118        ptr += 3;
1119        ut_asserteq(2, *ptr++);
1120        ut_asserteq(BYTE_PREFIX, *ptr++);
1121        ut_asserteq(5, *ptr++);
1122        ut_asserteq(BYTE_PREFIX, *ptr++);
1123        ut_asserteq(3, *ptr++);
1124        ut_asserteq_ptr(ptr, ctx->current);
1125
1126        free_context(&ctx);
1127
1128        return 0;
1129}
1130DM_TEST(dm_test_acpi_write_prw, 0);
1131
1132/* Test emitting writing conditionals */
1133static int dm_test_acpi_write_cond(struct unit_test_state *uts)
1134{
1135        struct acpi_ctx *ctx;
1136        u8 *ptr;
1137
1138        ut_assertok(alloc_context(&ctx));
1139
1140        ptr = acpigen_get_current(ctx);
1141        acpigen_write_if(ctx);
1142        acpigen_pop_len(ctx);
1143        ut_asserteq(IF_OP, *ptr++);
1144        ut_asserteq(3, acpi_test_get_length(ptr));
1145        ptr += 3;
1146
1147        acpigen_write_else(ctx);
1148        acpigen_pop_len(ctx);
1149        ut_asserteq(ELSE_OP, *ptr++);
1150        ut_asserteq(3, acpi_test_get_length(ptr));
1151        ptr += 3;
1152
1153        acpigen_write_if_lequal_op_int(ctx, LOCAL1_OP, 5);
1154        acpigen_pop_len(ctx);
1155        ut_asserteq(IF_OP, *ptr++);
1156        ut_asserteq(7, acpi_test_get_length(ptr));
1157        ptr += 3;
1158        ut_asserteq(LEQUAL_OP, *ptr++);
1159        ut_asserteq(LOCAL1_OP, *ptr++);
1160        ut_asserteq(BYTE_PREFIX, *ptr++);
1161        ut_asserteq(5, *ptr++);
1162
1163        ut_asserteq_ptr(ptr, ctx->current);
1164
1165        free_context(&ctx);
1166
1167        return 0;
1168}
1169DM_TEST(dm_test_acpi_write_cond, 0);
1170
1171/* Test emitting writing return values and ToBuffer/ToInteger */
1172static int dm_test_acpi_write_return(struct unit_test_state *uts)
1173{
1174        int len = sizeof(TEST_STRING);
1175        struct acpi_ctx *ctx;
1176        u8 *ptr;
1177
1178        ut_assertok(alloc_context(&ctx));
1179
1180        ptr = acpigen_get_current(ctx);
1181        acpigen_write_to_buffer(ctx, ARG0_OP, LOCAL0_OP);
1182        ut_asserteq(TO_BUFFER_OP, *ptr++);
1183        ut_asserteq(ARG0_OP, *ptr++);
1184        ut_asserteq(LOCAL0_OP, *ptr++);
1185
1186        acpigen_write_to_integer(ctx, ARG0_OP, LOCAL0_OP);
1187        ut_asserteq(TO_INTEGER_OP, *ptr++);
1188        ut_asserteq(ARG0_OP, *ptr++);
1189        ut_asserteq(LOCAL0_OP, *ptr++);
1190
1191        acpigen_write_return_byte_buffer(ctx, (u8 *)TEST_STRING, len);
1192        ut_asserteq(RETURN_OP, *ptr++);
1193        ut_asserteq(BUFFER_OP, *ptr++);
1194        ut_asserteq(5 + len, acpi_test_get_length(ptr));
1195        ptr += 3;
1196        ut_asserteq(BYTE_PREFIX, *ptr++);
1197        ut_asserteq(len, *ptr++);
1198        ut_asserteq_mem(TEST_STRING, ptr, len);
1199        ptr += len;
1200
1201        acpigen_write_return_singleton_buffer(ctx, 123);
1202        len = 1;
1203        ut_asserteq(RETURN_OP, *ptr++);
1204        ut_asserteq(BUFFER_OP, *ptr++);
1205        ut_asserteq(4 + len, acpi_test_get_length(ptr));
1206        ptr += 3;
1207        ut_asserteq(ONE_OP, *ptr++);
1208        ut_asserteq(123, *ptr++);
1209
1210        acpigen_write_return_byte(ctx, 43);
1211        ut_asserteq(RETURN_OP, *ptr++);
1212        ut_asserteq(BYTE_PREFIX, *ptr++);
1213        ut_asserteq(43, *ptr++);
1214
1215        ut_asserteq_ptr(ptr, ctx->current);
1216
1217        free_context(&ctx);
1218
1219        return 0;
1220}
1221DM_TEST(dm_test_acpi_write_return, 0);
1222
1223/* Test emitting a DSM for an I2C HID */
1224static int dm_test_acpi_write_i2c_dsm(struct unit_test_state *uts)
1225{
1226        char uuid_str[UUID_STR_LEN + 1];
1227        const int reg_offset = 0x20;
1228        struct acpi_ctx *ctx;
1229        u8 *ptr;
1230
1231        ut_assertok(alloc_context(&ctx));
1232
1233        ptr = acpigen_get_current(ctx);
1234        ut_assertok(acpi_device_write_dsm_i2c_hid(ctx, reg_offset));
1235
1236        /* acpigen_write_dsm_start() */
1237        ut_asserteq(METHOD_OP, *ptr++);
1238        ut_asserteq(0x78, acpi_test_get_length(ptr));
1239        ptr += 3;
1240        ut_asserteq_strn("_DSM", (char *)ptr);
1241        ptr += 4;
1242        ut_asserteq(ACPI_METHOD_SERIALIZED_MASK | 4, *ptr++);
1243
1244        ut_asserteq(TO_BUFFER_OP, *ptr++);
1245        ut_asserteq(ARG0_OP, *ptr++);
1246        ut_asserteq(LOCAL0_OP, *ptr++);
1247
1248        /* acpigen_write_dsm_uuid_start() */
1249        ut_asserteq(IF_OP, *ptr++);
1250        ut_asserteq(0x65, acpi_test_get_length(ptr));
1251        ptr += 3;
1252        ut_asserteq(LEQUAL_OP, *ptr++);
1253        ut_asserteq(LOCAL0_OP, *ptr++);
1254
1255        ut_asserteq(BUFFER_OP, *ptr++);
1256        ut_asserteq(UUID_BIN_LEN + 6, acpi_test_get_length(ptr));
1257        ptr += 3;
1258        ut_asserteq(WORD_PREFIX, *ptr++);
1259        ut_asserteq(UUID_BIN_LEN, get_unaligned((u16 *)ptr));
1260        ptr += 2;
1261        uuid_bin_to_str(ptr, uuid_str, UUID_STR_FORMAT_GUID);
1262        ut_asserteq_str(ACPI_DSM_I2C_HID_UUID, uuid_str);
1263        ptr += UUID_BIN_LEN;
1264
1265        ut_asserteq(TO_INTEGER_OP, *ptr++);
1266        ut_asserteq(ARG2_OP, *ptr++);
1267        ut_asserteq(LOCAL1_OP, *ptr++);
1268
1269        /* acpigen_write_dsm_uuid_start_cond() */
1270        ut_asserteq(IF_OP, *ptr++);
1271        ut_asserteq(0x34, acpi_test_get_length(ptr));
1272        ptr += 3;
1273        ut_asserteq(LEQUAL_OP, *ptr++);
1274        ut_asserteq(LOCAL1_OP, *ptr++);
1275        ut_asserteq(ZERO_OP, *ptr++);
1276
1277        /*
1278         * See code from acpi_device_write_dsm_i2c_hid(). We don't check every
1279         * piece
1280         */
1281        ut_asserteq(TO_INTEGER_OP, *ptr++);
1282        ut_asserteq(ARG1_OP, *ptr++);
1283        ut_asserteq(LOCAL2_OP, *ptr++);
1284
1285        ut_asserteq(IF_OP, *ptr++);
1286        ut_asserteq(0xd, acpi_test_get_length(ptr));
1287        ptr += 3;
1288        ut_asserteq(LEQUAL_OP, *ptr++);
1289        ut_asserteq(LOCAL2_OP, *ptr++);
1290        ut_asserteq(ZERO_OP, *ptr++);   /* function 0 */
1291
1292        ut_asserteq(RETURN_OP, *ptr++);
1293        ut_asserteq(BUFFER_OP, *ptr++);
1294        ptr += 5;
1295
1296        ut_asserteq(ELSE_OP, *ptr++);
1297        ptr += 3;
1298
1299        ut_asserteq(IF_OP, *ptr++);
1300        ut_asserteq(0xd, acpi_test_get_length(ptr));
1301        ptr += 3;
1302        ut_asserteq(LEQUAL_OP, *ptr++);
1303        ut_asserteq(LOCAL2_OP, *ptr++);
1304        ut_asserteq(ONE_OP, *ptr++);
1305
1306        ut_asserteq(RETURN_OP, *ptr++);
1307        ut_asserteq(BUFFER_OP, *ptr++);
1308        ptr += 5;
1309
1310        ut_asserteq(ELSE_OP, *ptr++);
1311        ptr += 3;
1312
1313        ut_asserteq(RETURN_OP, *ptr++);
1314        ut_asserteq(BUFFER_OP, *ptr++);
1315        ptr += 5;
1316
1317        /* acpigen_write_dsm_uuid_start_cond() */
1318        ut_asserteq(IF_OP, *ptr++);
1319        ut_asserteq(9, acpi_test_get_length(ptr));
1320        ptr += 3;
1321        ut_asserteq(LEQUAL_OP, *ptr++);
1322        ut_asserteq(LOCAL1_OP, *ptr++);
1323        ut_asserteq(ONE_OP, *ptr++);    /* function 1 */
1324
1325        ut_asserteq(RETURN_OP, *ptr++);
1326        ut_asserteq(BYTE_PREFIX, *ptr++);
1327        ut_asserteq(reg_offset, *ptr++);
1328
1329        /* acpigen_write_dsm_uuid_end() */
1330        ut_asserteq(RETURN_OP, *ptr++);
1331        ut_asserteq(BUFFER_OP, *ptr++);
1332        ptr += 5;
1333
1334        /* acpigen_write_dsm_end */
1335        ut_asserteq(RETURN_OP, *ptr++);
1336        ut_asserteq(BUFFER_OP, *ptr++);
1337        ptr += 5;
1338
1339        ut_asserteq_ptr(ptr, ctx->current);
1340
1341        free_context(&ctx);
1342
1343        return 0;
1344}
1345DM_TEST(dm_test_acpi_write_i2c_dsm, 0);
1346
1347/* Test emitting a processor */
1348static int dm_test_acpi_write_processor(struct unit_test_state *uts)
1349{
1350        const int cpuindex = 6;
1351        const u32 pblock_addr = 0x12345600;
1352        const u32 pblock_len = 0x60;
1353        struct acpi_ctx *ctx;
1354        u8 *ptr;
1355
1356        ut_assertok(alloc_context(&ctx));
1357
1358        ptr = acpigen_get_current(ctx);
1359        acpigen_write_processor(ctx, cpuindex, pblock_addr, pblock_len);
1360        acpigen_pop_len(ctx);
1361
1362        ut_asserteq(EXT_OP_PREFIX, *ptr++);
1363        ut_asserteq(PROCESSOR_OP, *ptr++);
1364        ut_asserteq(0x13, acpi_test_get_length(ptr));
1365        ptr += 3;
1366        ut_asserteq_strn("\\._PR_CP06", (char *)ptr);
1367        ptr += 10;
1368        ut_asserteq(cpuindex, *ptr++);
1369        ut_asserteq(pblock_addr, get_unaligned((u32 *)ptr));
1370        ptr += 4;
1371        ut_asserteq(pblock_len, *ptr++);
1372
1373        ut_asserteq_ptr(ptr, ctx->current);
1374
1375        free_context(&ctx);
1376
1377        return 0;
1378}
1379DM_TEST(dm_test_acpi_write_processor, 0);
1380
1381/* Test emitting a processor package */
1382static int dm_test_acpi_write_processor_package(struct unit_test_state *uts)
1383{
1384        const int core_count = 3;
1385        struct acpi_ctx *ctx;
1386        u8 *ptr;
1387
1388        ut_assertok(alloc_context(&ctx));
1389
1390        ptr = acpigen_get_current(ctx);
1391        acpigen_write_processor_package(ctx, "XCPU", 0, core_count);
1392
1393        ut_asserteq(NAME_OP, *ptr++);
1394        ut_asserteq_strn("XCPU", (char *)ptr);
1395        ptr += 4;
1396        ut_asserteq(PACKAGE_OP, *ptr++);
1397        ptr += 3;  /* skip length */
1398        ut_asserteq(core_count, *ptr++);
1399
1400        ut_asserteq_strn("\\._PR_CP00", (char *)ptr);
1401        ptr += 10;
1402        ut_asserteq_strn("\\._PR_CP01", (char *)ptr);
1403        ptr += 10;
1404        ut_asserteq_strn("\\._PR_CP02", (char *)ptr);
1405        ptr += 10;
1406
1407        ut_asserteq_ptr(ptr, ctx->current);
1408
1409        free_context(&ctx);
1410
1411        return 0;
1412}
1413DM_TEST(dm_test_acpi_write_processor_package, 0);
1414
1415/* Test emitting a processor notification package */
1416static int dm_test_acpi_write_processor_cnot(struct unit_test_state *uts)
1417{
1418        const int core_count = 3;
1419        struct acpi_ctx *ctx;
1420        u8 *ptr;
1421
1422        ut_assertok(alloc_context(&ctx));
1423
1424        ptr = acpigen_get_current(ctx);
1425        acpigen_write_processor_cnot(ctx, core_count);
1426
1427        ut_asserteq(METHOD_OP, *ptr++);
1428        ptr += 3;  /* skip length */
1429        ut_asserteq_strn("\\._PR_CNOT", (char *)ptr);
1430        ptr += 10;
1431        ut_asserteq(1, *ptr++);
1432
1433        ut_asserteq(NOTIFY_OP, *ptr++);
1434        ut_asserteq_strn("\\._PR_CP00", (char *)ptr);
1435        ptr += 10;
1436        ut_asserteq(ARG0_OP, *ptr++);
1437        ut_asserteq(NOTIFY_OP, *ptr++);
1438        ut_asserteq_strn("\\._PR_CP01", (char *)ptr);
1439        ptr += 10;
1440        ut_asserteq(ARG0_OP, *ptr++);
1441        ut_asserteq(NOTIFY_OP, *ptr++);
1442        ut_asserteq_strn("\\._PR_CP02", (char *)ptr);
1443        ptr += 10;
1444        ut_asserteq(ARG0_OP, *ptr++);
1445
1446        ut_asserteq_ptr(ptr, ctx->current);
1447
1448        free_context(&ctx);
1449
1450        return 0;
1451}
1452DM_TEST(dm_test_acpi_write_processor_cnot, 0);
1453
1454/* Test acpigen_write_tpc */
1455static int dm_test_acpi_write_tpc(struct unit_test_state *uts)
1456{
1457        struct acpi_ctx *ctx;
1458        u8 *ptr;
1459
1460        ut_assertok(alloc_context(&ctx));
1461
1462        ptr = acpigen_get_current(ctx);
1463        acpigen_write_tpc(ctx, "\\TLVL");
1464
1465        ut_asserteq(METHOD_OP, *ptr++);
1466        ptr += 3;  /* skip length */
1467        ut_asserteq_strn("_TPC", (char *)ptr);
1468        ptr += 4;
1469        ut_asserteq(0, *ptr++);
1470        ut_asserteq(RETURN_OP, *ptr++);
1471        ut_asserteq_strn("\\TLVL", (char *)ptr);
1472        ptr += 5;
1473
1474        ut_asserteq_ptr(ptr, ctx->current);
1475
1476        free_context(&ctx);
1477
1478        return 0;
1479}
1480DM_TEST(dm_test_acpi_write_tpc, 0);
1481
1482/* Test acpigen_write_pss_package(), etc. */
1483static int dm_test_acpi_write_pss_psd(struct unit_test_state *uts)
1484{
1485        struct acpi_ctx *ctx;
1486        u8 *ptr;
1487
1488        ut_assertok(alloc_context(&ctx));
1489
1490        ptr = acpigen_get_current(ctx);
1491        acpigen_write_pss_package(ctx, 1, 2, 3, 4, 5, 6);
1492        ut_asserteq(PACKAGE_OP, *ptr++);
1493        ptr += 3;  /* skip length */
1494        ut_asserteq(6, *ptr++);
1495
1496        ut_asserteq(DWORD_PREFIX, *ptr++);
1497        ut_asserteq(1, get_unaligned((u32 *)ptr));
1498        ptr += 5;
1499
1500        ut_asserteq(2, get_unaligned((u32 *)ptr));
1501        ptr += 5;
1502
1503        ut_asserteq(3, get_unaligned((u32 *)ptr));
1504        ptr += 5;
1505
1506        ut_asserteq(4, get_unaligned((u32 *)ptr));
1507        ptr += 5;
1508
1509        ut_asserteq(5, get_unaligned((u32 *)ptr));
1510        ptr += 5;
1511
1512        ut_asserteq(6, get_unaligned((u32 *)ptr));
1513        ptr += 4;
1514
1515        acpigen_write_psd_package(ctx, 6, 7, HW_ALL);
1516        ut_asserteq(NAME_OP, *ptr++);
1517        ut_asserteq_strn("_PSD", (char *)ptr);
1518        ptr += 4;
1519        ut_asserteq(PACKAGE_OP, *ptr++);
1520        ptr += 3;  /* skip length */
1521        ut_asserteq(1, *ptr++);
1522        ut_asserteq(PACKAGE_OP, *ptr++);
1523        ptr += 3;  /* skip length */
1524        ut_asserteq(5, *ptr++);
1525
1526        ut_asserteq(BYTE_PREFIX, *ptr++);
1527        ut_asserteq(5, *ptr++);
1528        ut_asserteq(BYTE_PREFIX, *ptr++);
1529        ut_asserteq(0, *ptr++);
1530
1531        ut_asserteq(DWORD_PREFIX, *ptr++);
1532        ut_asserteq(6, get_unaligned((u32 *)ptr));
1533        ptr += 5;
1534
1535        ut_asserteq(HW_ALL, get_unaligned((u32 *)ptr));
1536        ptr += 5;
1537
1538        ut_asserteq(7, get_unaligned((u32 *)ptr));
1539        ptr += 4;
1540
1541        ut_asserteq_ptr(ptr, ctx->current);
1542
1543        free_context(&ctx);
1544
1545        return 0;
1546}
1547DM_TEST(dm_test_acpi_write_pss_psd, 0);
1548
1549/* Test acpi_write_cst_package() */
1550static int dm_test_acpi_write_cst(struct unit_test_state *uts)
1551{
1552        static struct acpi_cstate cstate_map[] = {
1553                {
1554                        /* C1 */
1555                        .ctype = 1,             /* ACPI C1 */
1556                        .latency = 1,
1557                        .power = 1000,
1558                        .resource = {
1559                                .space_id = ACPI_ADDRESS_SPACE_FIXED,
1560                        },
1561                }, {
1562                        .ctype = 2,             /* ACPI C2 */
1563                        .latency = 50,
1564                        .power = 10,
1565                        .resource = {
1566                                .space_id = ACPI_ADDRESS_SPACE_IO,
1567                                .bit_width = 8,
1568                                .addrl = 0x415,
1569                        },
1570                },
1571        };
1572        int nentries = ARRAY_SIZE(cstate_map);
1573        struct acpi_ctx *ctx;
1574        u8 *ptr;
1575        int i;
1576
1577        ut_assertok(alloc_context(&ctx));
1578
1579        ptr = acpigen_get_current(ctx);
1580        acpigen_write_cst_package(ctx, cstate_map, nentries);
1581
1582        ut_asserteq(NAME_OP, *ptr++);
1583        ut_asserteq_strn("_CST", (char *)ptr);
1584        ptr += 4;
1585        ut_asserteq(PACKAGE_OP, *ptr++);
1586        ptr += 3;  /* skip length */
1587        ut_asserteq(nentries + 1, *ptr++);
1588        ut_asserteq(DWORD_PREFIX, *ptr++);
1589        ut_asserteq(nentries, get_unaligned((u32 *)ptr));
1590        ptr += 4;
1591
1592        for (i = 0; i < nentries; i++) {
1593                ut_asserteq(PACKAGE_OP, *ptr++);
1594                ptr += 3;  /* skip length */
1595                ut_asserteq(4, *ptr++);
1596                ut_asserteq(BUFFER_OP, *ptr++);
1597                ptr += 0x17;
1598                ut_asserteq(DWORD_PREFIX, *ptr++);
1599                ut_asserteq(cstate_map[i].ctype, get_unaligned((u32 *)ptr));
1600                ptr += 5;
1601                ut_asserteq(cstate_map[i].latency, get_unaligned((u32 *)ptr));
1602                ptr += 5;
1603                ut_asserteq(cstate_map[i].power, get_unaligned((u32 *)ptr));
1604                ptr += 4;
1605        }
1606
1607        ut_asserteq_ptr(ptr, ctx->current);
1608
1609        free_context(&ctx);
1610
1611        return 0;
1612}
1613DM_TEST(dm_test_acpi_write_cst, 0);
1614
1615/* Test acpi_write_cst_package() */
1616static int dm_test_acpi_write_csd(struct unit_test_state *uts)
1617{
1618        struct acpi_ctx *ctx;
1619        u8 *ptr;
1620
1621        ut_assertok(alloc_context(&ctx));
1622
1623        ptr = acpigen_get_current(ctx);
1624        acpigen_write_csd_package(ctx, 12, 34, CSD_HW_ALL, 56);
1625
1626        ut_asserteq(NAME_OP, *ptr++);
1627        ut_asserteq_strn("_CSD", (char *)ptr);
1628        ptr += 4;
1629        ut_asserteq(PACKAGE_OP, *ptr++);
1630        ptr += 3;  /* skip length */
1631        ut_asserteq(1, *ptr++);
1632        ut_asserteq(PACKAGE_OP, *ptr++);
1633        ptr += 3;  /* skip length */
1634        ut_asserteq(6, *ptr++);
1635
1636        ut_asserteq(BYTE_PREFIX, *ptr++);
1637        ut_asserteq(6, *ptr++);
1638        ut_asserteq(BYTE_PREFIX, *ptr++);
1639        ut_asserteq(0, *ptr++);
1640        ut_asserteq(DWORD_PREFIX, *ptr++);
1641        ut_asserteq(12, get_unaligned((u32 *)ptr));
1642        ptr += 5;
1643        ut_asserteq(CSD_HW_ALL, get_unaligned((u32 *)ptr));
1644        ptr += 5;
1645        ut_asserteq(34, get_unaligned((u32 *)ptr));
1646        ptr += 5;
1647        ut_asserteq(56, get_unaligned((u32 *)ptr));
1648        ptr += 4;
1649
1650        ut_asserteq_ptr(ptr, ctx->current);
1651
1652        free_context(&ctx);
1653
1654        return 0;
1655}
1656DM_TEST(dm_test_acpi_write_csd, 0);
1657
1658/* Test acpigen_write_tss_package() */
1659static int dm_test_acpi_write_tss(struct unit_test_state *uts)
1660{
1661        static struct acpi_tstate tstate_list[] = {
1662                { 1, 2, 3, 4, 5, },
1663                { 6, 7, 8, 9, 10, },
1664        };
1665        int nentries = ARRAY_SIZE(tstate_list);
1666        struct acpi_ctx *ctx;
1667        u8 *ptr;
1668        int i;
1669
1670        ut_assertok(alloc_context(&ctx));
1671
1672        ptr = acpigen_get_current(ctx);
1673        acpigen_write_tss_package(ctx, tstate_list, nentries);
1674
1675        ut_asserteq(NAME_OP, *ptr++);
1676        ut_asserteq_strn("_TSS", (char *)ptr);
1677        ptr += 4;
1678        ut_asserteq(PACKAGE_OP, *ptr++);
1679        ptr += 3;  /* skip length */
1680        ut_asserteq(nentries, *ptr++);
1681
1682        for (i = 0; i < nentries; i++) {
1683                ut_asserteq(PACKAGE_OP, *ptr++);
1684                ptr += 3;  /* skip length */
1685                ut_asserteq(5, *ptr++);
1686                ut_asserteq(DWORD_PREFIX, *ptr++);
1687                ut_asserteq(tstate_list[i].percent, get_unaligned((u32 *)ptr));
1688                ptr += 5;
1689                ut_asserteq(tstate_list[i].power, get_unaligned((u32 *)ptr));
1690                ptr += 5;
1691                ut_asserteq(tstate_list[i].latency, get_unaligned((u32 *)ptr));
1692                ptr += 5;
1693                ut_asserteq(tstate_list[i].control, get_unaligned((u32 *)ptr));
1694                ptr += 5;
1695                ut_asserteq(tstate_list[i].status, get_unaligned((u32 *)ptr));
1696                ptr += 4;
1697        }
1698
1699        ut_asserteq_ptr(ptr, ctx->current);
1700
1701        free_context(&ctx);
1702
1703        return 0;
1704}
1705DM_TEST(dm_test_acpi_write_tss, 0);
1706
1707/* Test acpigen_write_tsd_package() */
1708static int dm_test_acpi_write_tsd_package(struct unit_test_state *uts)
1709{
1710        struct acpi_ctx *ctx;
1711        u8 *ptr;
1712
1713        ut_assertok(alloc_context(&ctx));
1714
1715        ptr = acpigen_get_current(ctx);
1716        acpigen_write_tsd_package(ctx, 12, 34, HW_ALL);
1717
1718        ut_asserteq(NAME_OP, *ptr++);
1719        ut_asserteq_strn("_TSD", (char *)ptr);
1720        ptr += 4;
1721        ut_asserteq(PACKAGE_OP, *ptr++);
1722        ptr += 3;  /* skip length */
1723        ut_asserteq(1, *ptr++);
1724        ut_asserteq(PACKAGE_OP, *ptr++);
1725        ptr += 3;  /* skip length */
1726        ut_asserteq(5, *ptr++);
1727
1728        ut_asserteq(BYTE_PREFIX, *ptr++);
1729        ut_asserteq(5, *ptr++);
1730        ut_asserteq(BYTE_PREFIX, *ptr++);
1731        ut_asserteq(0, *ptr++);
1732        ut_asserteq(DWORD_PREFIX, *ptr++);
1733        ut_asserteq(12, get_unaligned((u32 *)ptr));
1734        ptr += 5;
1735        ut_asserteq(CSD_HW_ALL, get_unaligned((u32 *)ptr));
1736        ptr += 5;
1737        ut_asserteq(34, get_unaligned((u32 *)ptr));
1738        ptr += 4;
1739
1740        ut_asserteq_ptr(ptr, ctx->current);
1741
1742        free_context(&ctx);
1743
1744        return 0;
1745}
1746DM_TEST(dm_test_acpi_write_tsd_package, 0);
1747