From patchwork Tue Jul 7 19:11:37 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Glass X-Patchwork-Id: 1324656 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.a=rsa-sha256 header.s=google header.b=S2ldy++E; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4B1XBY13HBz9s1x for ; Wed, 8 Jul 2020 05:12:36 +1000 (AEST) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 62D7D81BDA; Tue, 7 Jul 2020 21:12:27 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.b="S2ldy++E"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id C30B481C19; Tue, 7 Jul 2020 21:12:25 +0200 (CEST) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,SPF_HELO_NONE,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from mail-io1-xd41.google.com (mail-io1-xd41.google.com [IPv6:2607:f8b0:4864:20::d41]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id AC4D781BCB for ; Tue, 7 Jul 2020 21:12:22 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=sjg@chromium.org Received: by mail-io1-xd41.google.com with SMTP id o5so44279728iow.8 for ; Tue, 07 Jul 2020 12:12:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=BQW+a+jD+esL0nOT+alNQ+HGyfmqW31ezq8Ckdm5yk8=; b=S2ldy++EEb9otTPN6xsH2niu1v5l1Ud4E4IbZbB6xIH8ZGYWWmKZX7guBPGNGeaFED 9qz2bACCeYyhnFJzVZbOiqdh7mtL5T7FgY1gO2BBB2pAy5EYxBzIPsDsNxRjtwYDOL9a M+BTweMEjBpOJEdpvMa4Pd8A0GPapQf1tc+RA= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=BQW+a+jD+esL0nOT+alNQ+HGyfmqW31ezq8Ckdm5yk8=; b=XddpftgOf72NhV6buBqaEmnaBV1L4MPSwL+4fA80RdAyw4r5fJZ349d55zpwlCeXMb YAqS0JnPVNFaP7lcRDy56QYPAsUrfkd5qHaVOYQzCt41KCGjyDxgbVWOQv3hx4trHKgE GC2TFuCyiqpJxKTegL4RlQ0Pjn3esL4AnK9CwQLdiK2BWiaP7FC3uSQKLesLz3Ft3D1f 6BxnteKTeypqTe+qPlk5pywCKJi0q9mKi8jq5AHTh/1SzNw0BHpCmrVhJjjyVpinUGDl l8CiqD43f3Pf24Ua71v/5/2IWIV3wnSHUW79Agbgkko7X/7hj5t5G9kHFmM7vNz/Uil+ BvuA== X-Gm-Message-State: AOAM530TdiaGXqITlfpDb4LKLrfWUj235RRlUW9v9wBg00cgqVXqCZhP 9bq2F1z1vw21EOP6Vi0Iza40a8QjTR4Fnw== X-Google-Smtp-Source: ABdhPJxjQykkC8JTgyzt19aqm8h1sMpbjtwoSydWc/RFk92O+pTw9jNhc2GCfXmMqdZi804COgbXzw== X-Received: by 2002:a6b:640f:: with SMTP id t15mr12881890iog.175.1594149139552; Tue, 07 Jul 2020 12:12:19 -0700 (PDT) Received: from localhost.localdomain (c-73-14-175-90.hsd1.co.comcast.net. [73.14.175.90]) by smtp.gmail.com with ESMTPSA id 186sm9584320iow.26.2020.07.07.12.12.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 07 Jul 2020 12:12:18 -0700 (PDT) From: Simon Glass To: U-Boot Mailing List Cc: Andy Shevchenko , Bin Meng , Wolfgang Wallner , Simon Glass , Marek Vasut , Pavel Herrmann Subject: [PATCH v4 00/35] dm: Add programmatic generation of ACPI tables (part B) Date: Tue, 7 Jul 2020 13:11:37 -0600 Message-Id: <20200707191212.2542638-1-sjg@chromium.org> X-Mailer: git-send-email 2.27.0.383.g050319c2ae-goog MIME-Version: 1.0 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.34 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.102.3 at phobos.denx.de X-Virus-Status: Clean This is split from the original series in an attempt to get things applied in chunks. This part includes: - writing basic ACPI code for integers, strings, names, packages - writing descriptors for GPIO, I2C, interrupts, SPI - writing code to enable/disable ACPI peripherals via GPIOs - writing SSDT and DSDT tables - additional ways to determine ACPI device names Much of this code is taken from coreboot and I have tried to avoid changing the original code for no reason. Changes include: - splitting the acpi_dp functions into their own file - adding tests - adding (lots of) comments - using a context pointer instead of global variables - tidying up some code where couldn't resist (e.g. acpigen_emit_namestring()) Changes in v4: - Add a comment about sandbox to dm_test_irq_get_acpi() - Setup ctx->base as well as ctx->current in acpi_setup_base_tables() - Add a comment about little-endian in acpigen_emit_dword() - Add a #define for the context size in alloc_context() - Rename the length-writing functions to indicate they are for large resources - Use memset() to zero struct acpi_gpio in gpio_get_acpi() - Move common code about the if...else in sb_gpio_get_acpi() - Don't set zero fields in sb_gpio_get_acpi(), and add a comment about it - Update acpi_device_write_interrupt_irq() to return IRQ pin number - Use NULL instead of NUL and drop the 'NUL character' comment - Drop comment about the type always being ACPI_GPIO_TYPE_IO - Rename the length-writing functions to indicate they are for large resources - Update functions to return a GPIO pin number - Update functions to return GPIO/IRQ pin number - Move SPI macros to next patch - Rename the length-writing functions to indicate they are for large - Update functions to return GPIO/IRQ pin number - Move SPI macros to next patch - Rename the length-writing functions to indicate they are for large resources - Add a note about the hard-coded 3-byte length used - Fix 'gas' typo - Use 'null' instead of 'nul' - Use 'writing' instead of emitting in test comment - Use 'writing' instead of emitting in test comment - Change 'nul' to 'null' in commit message and acpigen_write_string() - Move emit->write comment changes to previous patches - s/nul/null/ in the comment - Drop embedded // comments in file comment - Correct return value comment in acpi_dp_add_child() - Rename acpi_dp_write_() to acpi_dp_write_internal() and make static - Use a #define for the test context size - Add a header file for test to allow sharing the context init function - Rename and get_length() into a shared test file - Add missing arg to comment for acpi_dp_write() - Correct reference to device tree in the commit message - Squash in comment change to an earlier patch - Rename acpigen_write_method_() - Use acpi_test_get_length() instead of get_length() - Use acpi_test_get_length() instead of get_length() - Update functions to return GPIO/IRQ pin number - Use a separate variables for reading and writing DW0 - Correct bug in acpigen_set_gpio_val() by putting tx_state_val in LOCAL0 - Fix up the comment for acpigen_set_enable_tx_gpio() - Explain access to DW0 register a bit better and provide a sample - Expand the comments for acpigen_get_dw0_in_local5() - Fix 'diabl' typo - Use new shared acpi_test_alloc_context_size() in test - Update functions to return GPIO/IRQ pin number - Use a separate variables for reading and writing DW0 - Explain in sort_acpi_item_type() why ctx->current is not updated - Explain why 'fill' is used for one method and 'inject' for another - Mention that acpi_device_infer_name() only supports x86 - Add a comment about only supporting USB3.0 Changes in v3: - s/NUL/NULL/ for the NUL character, since that is in more common use - Fix 'an GPIO is found' typo - Update comment in acpi_device_set_i2c() to talk about scope parameter - Make acpi_device_write_spi() static - Add an extra comment about scope to acpi_device_set_spi() - Use BIT() in a few places - Resist the temptation to go to >80 characters - Add a reference to the ACPI spec - Add a define for the 0x80 constant - Move the function comments into this patch - Fix 'easy of testing' typo - Move two function comments into the previous patch - Allow the name parameter to be NULL - Add error checking to acpi_dp_add_integer_array() - Fix 'acpi_device.v' typo - Drop unused ACPI_CPU_STRING - Use an enum for the GPIO priority - Add error checking - Fix incorrect function names and arguments in commments - Add error checking for acpi_dp_add...() functions - Fix function name in comment for acpigen_write_not() - Use #defines for the mask values - Fix 'THe' typo - Rename MAX_ITEMS to MAX_ACPI_ITEMS - Make find_item() static and rename to find_acpi_item() - Rename build_type() and add a comment Drop coreboot_acpi_ids enum - Fix 'THe' typo - Rename build_type() to sort_acpi_item_type() - Refactor the code to remove the extra memcpy() - Recalculate the DSDT checksum only once - Add a comment as to why the checksum byte is set to 0 - Fix 'of' typo - Update acpi_dump_items() to take an enum - Update commit message and subject for clarity Changes in v2: - Update to add a new 'base' field to struct acpi_ctx - Free the memory allocated to the table and context - Fix memset of I2C descriptor - Fix memset of SPI descriptor Changes in v1: - Capitalise ACPI_OPS_PTR - Split into more patches for review - Add tests - Rebase on top of common.h series - Fix 'the an' typo - Move header definitions into this patch - Update sandbox driver slightly for testing - Switch parameter order of _acpi_fill_ssdt() and make it static - Fix 'sentinal' and 'METHOD_FILL_SDDT' typos - Correct the commit subject - Generalise the ACPI function recursion with acpi_recurse_method() - Generalise the ACPI function recursion with acpi_recurse_method() - Use OEM_TABLE_ID instead of ACPI_TABLE_CREATOR - Update ACPI_DSTATUS enum - Drop writing of coreboot tables - Generalise the ACPI function recursion with acpi_recurse_method() - Use acpi,ddn instead of acpi,desc - Rename to acpi_device_infer_name() - Update newly created sandbox tests Simon Glass (35): dm: core: Add an ACPI name for the root node acpi: Add a function to get a device path and scope acpi: Add a way to check device status irq: Add a method to convert an interrupt to ACPI acpi: Support generation of ACPI code acpi: Support generation of interrupt descriptor gpio: Add a method to convert a GPIO to ACPI acpi: Support string output acpi: Support generation of GPIO descriptor acpi: Support generation of a GPIO/irq for a device acpi: Support generation of I2C descriptor acpi: Support generation of SPI descriptor acpigen: Support writing a length acpigen: Support writing a package acpi: Support writing an integer acpi: Support writing a string acpi: Support writing a name acpi: Support writing a UUID acpi: Support writing Device Properties objects via _DSD acpi: Support writing a GPIO acpi: Support copying properties from device tree to ACPI acpi: Add support for various misc ACPI opcodes acpi: Add support for writing a Power Resource acpi: Add support for writing a GPIO power sequence acpi: Add support for a generic power sequence acpi: Add support for SSDT generation x86: acpi: Move MADT down a bit acpi: Record the items added to SSDT acpi: Support ordering SSDT data by device x86: Allow devices to write an SSDT acpi: Add support for DSDT generation x86: Allow devices to write to DSDT pci: Avoid a crash in device_is_on_pci_bus() dm: acpi: Enhance acpi_get_name() acpi: Add an acpi command to list/dump generated ACPI items arch/sandbox/dts/test.dts | 14 +- arch/x86/lib/acpi_table.c | 55 +- cmd/acpi.c | 15 +- doc/device-tree-bindings/chosen.txt | 9 + doc/device-tree-bindings/device.txt | 13 + drivers/core/acpi.c | 229 +++++++- drivers/core/root.c | 13 + drivers/gpio/gpio-uclass.c | 22 + drivers/gpio/sandbox.c | 77 +++ drivers/i2c/sandbox_i2c.c | 1 + drivers/misc/irq-uclass.c | 18 +- drivers/misc/irq_sandbox.c | 16 + drivers/rtc/sandbox_rtc.c | 13 + drivers/spi/sandbox_spi.c | 1 + include/acpi/acpi_device.h | 405 +++++++++++++ include/acpi/acpi_dp.h | 287 +++++++++ include/acpi/acpigen.h | 402 +++++++++++++ include/asm-generic/gpio.h | 27 + include/dm/acpi.h | 80 ++- include/dm/device.h | 2 +- include/irq.h | 43 ++ include/spi.h | 4 +- include/test/ut.h | 17 + lib/acpi/Makefile | 3 + lib/acpi/acpi_device.c | 823 ++++++++++++++++++++++++++ lib/acpi/acpi_dp.c | 402 +++++++++++++ lib/acpi/acpi_table.c | 1 + lib/acpi/acpigen.c | 482 +++++++++++++++ test/dm/Makefile | 2 + test/dm/acpi.c | 277 ++++++++- test/dm/acpi.h | 29 + test/dm/acpi_dp.c | 492 ++++++++++++++++ test/dm/acpigen.c | 876 ++++++++++++++++++++++++++++ test/dm/gpio.c | 62 ++ test/dm/irq.c | 23 + test/dm/pci.c | 14 + 36 files changed, 5215 insertions(+), 34 deletions(-) create mode 100644 include/acpi/acpi_device.h create mode 100644 include/acpi/acpi_dp.h create mode 100644 include/acpi/acpigen.h create mode 100644 lib/acpi/acpi_device.c create mode 100644 lib/acpi/acpi_dp.c create mode 100644 lib/acpi/acpigen.c create mode 100644 test/dm/acpi.h create mode 100644 test/dm/acpi_dp.c create mode 100644 test/dm/acpigen.c