acpi: Add acpigen_write_LPI_package

Low Power Idle States defines additional information not present in the
_CST.

See ACPI Specification, Version 6.3 Section 8.4.4.3 _LPI.

BUG=b:178728116, b:185787242
TEST=Boot guybrush and dump ACPI tables

Signed-off-by: Raul E Rangel <rrangel@chromium.org>
Signed-off-by: Jason Glenesk <jason.glenesk@amd.corp-partner.google.com>
Change-Id: I4f5301b95ff8245facaf48e2fbd51cc82df2d8cc
Reviewed-on: https://review.coreboot.org/c/coreboot/+/52529
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Furquan Shaikh <furquan@google.com>
Reviewed-by: Marshall Dawson <marshalldawson3rd@gmail.com>
diff --git a/src/acpi/acpigen.c b/src/acpi/acpigen.c
index 1131729..5c8c1b9 100644
--- a/src/acpi/acpigen.c
+++ b/src/acpi/acpigen.c
@@ -803,6 +803,78 @@
 	acpigen_pop_len();
 }
 
+void acpigen_write_LPI_package(u64 level, const struct acpi_lpi_state *states, u16 nentries)
+{
+	/*
+	* Name (_LPI, Package (0x06)  // _LPI: Low Power Idle States
+	* {
+	*     0x0000,
+	*     0x0000000000000000,
+	*     0x0003,
+	*     Package (0x0A)
+	*     {
+	*         0x00000002,
+	*         0x00000001,
+	*         0x00000001,
+	*         0x00000000,
+	*         0x00000000,
+	*         0x00000000,
+	*         ResourceTemplate ()
+	*         {
+	*             Register (FFixedHW,
+	*                 0x02,               // Bit Width
+	*                 0x02,               // Bit Offset
+	*                 0x0000000000000000, // Address
+	*                 ,)
+	*         },
+	*
+	*        ResourceTemplate ()
+	*        {
+	*            Register (SystemMemory,
+	*                0x00,               // Bit Width
+	*                0x00,               // Bit Offset
+	*                0x0000000000000000, // Address
+	*                ,)
+	*        },
+	*
+	*        ResourceTemplate ()
+	*        {
+	*            Register (SystemMemory,
+	*                0x00,               // Bit Width
+	*                0x00,               // Bit Offset
+	*                0x0000000000000000, // Address
+	*                ,)
+	*        },
+	*
+	*        "C1"
+	*    },
+	*    ...
+	* }
+	*/
+
+	acpigen_write_name("_LPI");
+	acpigen_write_package(3 + nentries);
+	acpigen_write_word(0); /* Revision */
+	acpigen_write_qword(level);
+	acpigen_write_word(nentries);
+
+	for (size_t i = 0; i < nentries; i++, states++) {
+		acpigen_write_package(0xA);
+		acpigen_write_dword(states->min_residency_us);
+		acpigen_write_dword(states->worst_case_wakeup_latency_us);
+		acpigen_write_dword(states->flags);
+		acpigen_write_dword(states->arch_context_lost_flags);
+		acpigen_write_dword(states->residency_counter_frequency_hz);
+		acpigen_write_dword(states->enabled_parent_state);
+		acpigen_write_register_resource(&states->entry_method);
+		acpigen_write_register_resource(&states->residency_counter_register);
+		acpigen_write_register_resource(&states->usage_counter_register);
+		acpigen_write_string(states->state_name);
+		acpigen_pop_len();
+	}
+	acpigen_pop_len();
+}
+
 /*
  * Generates a func with max supported P-states.
  */