summaryrefslogtreecommitdiff
path: root/lib/acpi/acpigen.c
diff options
context:
space:
mode:
authorSimon Glass <sjg@chromium.org>2020-07-07 13:11:52 -0600
committerBin Meng <bmeng.cn@gmail.com>2020-07-17 14:32:24 +0800
commit83b2bd5a74a4a07a738ba039afc3028d8df2f97d (patch)
treec5f57ccdad2b04017ede514165076a493e61ade3 /lib/acpi/acpigen.c
parent03967ce2e5e4332edd1e023360707a1086f42242 (diff)
acpi: Support writing an integer
ACPI supports storing integers in various ways. Add a function to handle this. Signed-off-by: Simon Glass <sjg@chromium.org> Reviewed-by: Wolfgang Wallner <wolfgang.wallner@br-automation.com> Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
Diffstat (limited to 'lib/acpi/acpigen.c')
-rw-r--r--lib/acpi/acpigen.c51
1 files changed, 51 insertions, 0 deletions
diff --git a/lib/acpi/acpigen.c b/lib/acpi/acpigen.c
index 9043c2bc72..27d4eab7a6 100644
--- a/lib/acpi/acpigen.c
+++ b/lib/acpi/acpigen.c
@@ -83,6 +83,57 @@ char *acpigen_write_package(struct acpi_ctx *ctx, int nr_el)
return p;
}
+void acpigen_write_byte(struct acpi_ctx *ctx, unsigned int data)
+{
+ acpigen_emit_byte(ctx, BYTE_PREFIX);
+ acpigen_emit_byte(ctx, data & 0xff);
+}
+
+void acpigen_write_word(struct acpi_ctx *ctx, unsigned int data)
+{
+ acpigen_emit_byte(ctx, WORD_PREFIX);
+ acpigen_emit_word(ctx, data);
+}
+
+void acpigen_write_dword(struct acpi_ctx *ctx, unsigned int data)
+{
+ acpigen_emit_byte(ctx, DWORD_PREFIX);
+ acpigen_emit_dword(ctx, data);
+}
+
+void acpigen_write_qword(struct acpi_ctx *ctx, u64 data)
+{
+ acpigen_emit_byte(ctx, QWORD_PREFIX);
+ acpigen_emit_dword(ctx, data & 0xffffffff);
+ acpigen_emit_dword(ctx, (data >> 32) & 0xffffffff);
+}
+
+void acpigen_write_zero(struct acpi_ctx *ctx)
+{
+ acpigen_emit_byte(ctx, ZERO_OP);
+}
+
+void acpigen_write_one(struct acpi_ctx *ctx)
+{
+ acpigen_emit_byte(ctx, ONE_OP);
+}
+
+void acpigen_write_integer(struct acpi_ctx *ctx, u64 data)
+{
+ if (data == 0)
+ acpigen_write_zero(ctx);
+ else if (data == 1)
+ acpigen_write_one(ctx);
+ else if (data <= 0xff)
+ acpigen_write_byte(ctx, (unsigned char)data);
+ else if (data <= 0xffff)
+ acpigen_write_word(ctx, (unsigned int)data);
+ else if (data <= 0xffffffff)
+ acpigen_write_dword(ctx, (unsigned int)data);
+ else
+ acpigen_write_qword(ctx, data);
+}
+
void acpigen_emit_stream(struct acpi_ctx *ctx, const char *data, int size)
{
int i;