1// SPDX-License-Identifier: GPL-2.0+ 2/* 3 * Write an ACPI Secondary System Descriptor Table (SSDT) table 4 * 5 * Copyright 2021 Google LLC 6 */ 7 8#define LOG_CATEGORY LOGC_ACPI 9 10#include <acpi/acpi_table.h> 11#include <dm/acpi.h> 12#include <tables_csum.h> 13#include <linux/errno.h> 14#include <linux/string.h> 15 16int acpi_write_ssdt(struct acpi_ctx *ctx, const struct acpi_writer *entry) 17{ 18 struct acpi_table_header *ssdt; 19 int ret; 20 21 ssdt = ctx->current; 22 memset(ssdt, '\0', sizeof(struct acpi_table_header)); 23 24 acpi_fill_header(ssdt, "SSDT"); 25 ssdt->revision = acpi_get_table_revision(ACPITAB_SSDT); 26 ssdt->creator_revision = 1; 27 ssdt->length = sizeof(struct acpi_table_header); 28 29 acpi_inc(ctx, sizeof(struct acpi_table_header)); 30 31 ret = acpi_fill_ssdt(ctx); 32 if (ret) { 33 ctx->current = ssdt; 34 return log_msg_ret("fill", ret); 35 } 36 37 /* (Re)calculate length and checksum */ 38 ssdt->length = ctx->current - (void *)ssdt; 39 ssdt->checksum = table_compute_checksum((void *)ssdt, ssdt->length); 40 log_debug("SSDT at %p, length %x\n", ssdt, ssdt->length); 41 42 /* Drop the table if it is empty */ 43 if (ssdt->length == sizeof(struct acpi_table_header)) 44 return log_msg_ret("fill", -ENOENT); 45 acpi_add_table(ctx, ssdt); 46 47 return 0; 48} 49ACPI_WRITER(6ssdt, "SSDT", acpi_write_ssdt, 0); 50