blob: aa6e6508cb8c8db0f41cc436f4c6aaae3c05cd04 [file] [log] [blame]
Angel Pons182dbde2020-04-02 23:49:05 +02001/* SPDX-License-Identifier: GPL-2.0-only */
Aaron Durbin76c37002012-10-30 09:03:43 -05002
Furquan Shaikh76cedd22020-05-02 10:24:23 -07003#include <acpi/acpi.h>
Kyösti Mälkki5daa1d32020-06-14 12:01:58 +03004#include <acpi/acpi_gnvs.h>
Furquan Shaikh76cedd22020-05-02 10:24:23 -07005#include <acpi/acpigen.h>
Aaron Durbin76c37002012-10-30 09:03:43 -05006#include <string.h>
Elyes HAOUAS26071aa2019-02-15 08:21:33 +01007#include <version.h>
Kyösti Mälkki661ad462020-12-29 06:26:21 +02008#include <soc/nvs.h>
Elyes HAOUAS26071aa2019-02-15 08:21:33 +01009
Aaron Durbin76c37002012-10-30 09:03:43 -050010#include "pch.h"
11
Kyösti Mälkki0c1dd9c2020-06-17 23:37:49 +030012static void acpi_create_serialio_ssdt_entry(int id, struct global_nvs *gnvs)
Duncan Lauried7cb8d02013-05-15 15:03:57 -070013{
14 char sio_name[5] = {};
Elyes HAOUAS035df002016-10-03 21:54:16 +020015 snprintf(sio_name, sizeof(sio_name), "S%1uEN", id);
Vladimir Serbinenko9bb5c5c2014-11-09 03:51:32 +010016 acpigen_write_name_byte(sio_name, gnvs->s0b[id] ? 1 : 0);
Duncan Lauried7cb8d02013-05-15 15:03:57 -070017}
18
19void acpi_create_serialio_ssdt(acpi_header_t *ssdt)
20{
21 unsigned long current = (unsigned long)ssdt + sizeof(acpi_header_t);
Kyösti Mälkki0c1dd9c2020-06-17 23:37:49 +030022 struct global_nvs *gnvs = acpi_get_gnvs();
Vladimir Serbinenko9bb5c5c2014-11-09 03:51:32 +010023 int id;
Duncan Lauried7cb8d02013-05-15 15:03:57 -070024
25 if (!gnvs)
26 return;
27
28 /* Fill the SSDT header */
29 memset((void *)ssdt, 0, sizeof(acpi_header_t));
30 memcpy(&ssdt->signature, "SSDT", 4);
Himanshu Sahdev15062532019-09-23 15:43:28 +053031 ssdt->revision = get_acpi_table_revision(SSDT);
Duncan Lauried7cb8d02013-05-15 15:03:57 -070032 memcpy(&ssdt->oem_id, OEM_ID, 6);
Vladimir Serbinenko6b330f22014-10-05 11:08:40 +020033 memcpy(&ssdt->oem_table_id, "SERIALIO", 8);
34 ssdt->oem_revision = 43;
Duncan Lauried7cb8d02013-05-15 15:03:57 -070035 memcpy(&ssdt->asl_compiler_id, ASLC, 4);
Elyes HAOUAS26071aa2019-02-15 08:21:33 +010036 ssdt->asl_compiler_revision = asl_revision;
Duncan Lauried7cb8d02013-05-15 15:03:57 -070037 ssdt->length = sizeof(acpi_header_t);
Angel Pons8cb83742020-10-17 18:28:29 +020038 acpigen_set_current((char *)current);
Duncan Lauried7cb8d02013-05-15 15:03:57 -070039
40 /* Fill the SSDT with an entry for each SerialIO device */
41 for (id = 0; id < 8; id++)
Vladimir Serbinenko9bb5c5c2014-11-09 03:51:32 +010042 acpi_create_serialio_ssdt_entry(id, gnvs);
Duncan Lauried7cb8d02013-05-15 15:03:57 -070043
44 /* (Re)calculate length and checksum. */
45 current = (unsigned long)acpigen_get_current();
46 ssdt->length = current - (unsigned long)ssdt;
47 ssdt->checksum = acpi_checksum((void *)ssdt, ssdt->length);
48}