acpi: Support writing a string
[platform/kernel/u-boot.git] / include / acpi / acpigen.h
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Core ACPI (Advanced Configuration and Power Interface) support
4  *
5  * Copyright 2019 Google LLC
6  *
7  * Modified from coreboot file acpigen.h
8  */
9
10 #ifndef __ACPI_ACPIGEN_H
11 #define __ACPI_ACPIGEN_H
12
13 #include <linux/types.h>
14
15 struct acpi_ctx;
16
17 /* Top 4 bits of the value used to indicate a three-byte length value */
18 #define ACPI_PKG_LEN_3_BYTES    0x80
19
20 /* ACPI Op/Prefix codes */
21 enum {
22         ZERO_OP                 = 0x00,
23         ONE_OP                  = 0x01,
24         BYTE_PREFIX             = 0x0a,
25         WORD_PREFIX             = 0x0b,
26         DWORD_PREFIX            = 0x0c,
27         STRING_PREFIX           = 0x0d,
28         QWORD_PREFIX            = 0x0e,
29         PACKAGE_OP              = 0x12,
30 };
31
32 /**
33  * acpigen_get_current() - Get the current ACPI code output pointer
34  *
35  * @ctx: ACPI context pointer
36  * @return output pointer
37  */
38 u8 *acpigen_get_current(struct acpi_ctx *ctx);
39
40 /**
41  * acpigen_emit_byte() - Emit a byte to the ACPI code
42  *
43  * @ctx: ACPI context pointer
44  * @data: Value to output
45  */
46 void acpigen_emit_byte(struct acpi_ctx *ctx, uint data);
47
48 /**
49  * acpigen_emit_word() - Emit a 16-bit word to the ACPI code
50  *
51  * @ctx: ACPI context pointer
52  * @data: Value to output
53  */
54 void acpigen_emit_word(struct acpi_ctx *ctx, uint data);
55
56 /**
57  * acpigen_emit_dword() - Emit a 32-bit 'double word' to the ACPI code
58  *
59  * @ctx: ACPI context pointer
60  * @data: Value to output
61  */
62 void acpigen_emit_dword(struct acpi_ctx *ctx, uint data);
63
64 /**
65  * acpigen_emit_stream() - Emit a stream of bytes
66  *
67  * @ctx: ACPI context pointer
68  * @data: Data to output
69  * @size: Size of data in bytes
70  */
71 void acpigen_emit_stream(struct acpi_ctx *ctx, const char *data, int size);
72
73 /**
74  * acpigen_emit_string() - Emit a string
75  *
76  * Emit a string with a null terminator
77  *
78  * @ctx: ACPI context pointer
79  * @str: String to output, or NULL for an empty string
80  */
81 void acpigen_emit_string(struct acpi_ctx *ctx, const char *str);
82
83 /**
84  * acpigen_write_len_f() - Write a 'forward' length placeholder
85  *
86  * This adds space for a length value in the ACPI stream and pushes the current
87  * position (before the length) on the stack. After calling this you can write
88  * some data and then call acpigen_pop_len() to update the length value.
89  *
90  * Usage:
91  *
92  *    acpigen_write_len_f() ------\
93  *    acpigen_write...()          |
94  *    acpigen_write...()          |
95  *      acpigen_write_len_f() --\ |
96  *      acpigen_write...()      | |
97  *      acpigen_write...()      | |
98  *      acpigen_pop_len() ------/ |
99  *    acpigen_write...()          |
100  *    acpigen_pop_len() ----------/
101  *
102  * See ACPI 6.3 section 20.2.4 Package Length Encoding
103  *
104  * This implementation always uses a 3-byte packet length for simplicity. It
105  * could be adjusted to support other lengths.
106  *
107  * @ctx: ACPI context pointer
108  */
109 void acpigen_write_len_f(struct acpi_ctx *ctx);
110
111 /**
112  * acpigen_pop_len() - Update the previously stacked length placeholder
113  *
114  * Call this after the data for the block has been written. It updates the
115  * top length value in the stack and pops it off.
116  *
117  * @ctx: ACPI context pointer
118  */
119 void acpigen_pop_len(struct acpi_ctx *ctx);
120
121 /**
122  * acpigen_write_package() - Start writing a package
123  *
124  * A package collects together a number of elements in the ACPI code. To write
125  * a package use:
126  *
127  * acpigen_write_package(ctx, 3);
128  * ...write things
129  * acpigen_pop_len()
130  *
131  * If you don't know the number of elements in advance, acpigen_write_package()
132  * returns a pointer to the value so you can update it later:
133  *
134  * char *num_elements = acpigen_write_package(ctx, 0);
135  * ...write things
136  * *num_elements += 1;
137  * ...write things
138  * *num_elements += 1;
139  * acpigen_pop_len()
140  *
141  * @ctx: ACPI context pointer
142  * @nr_el: Number of elements (0 if not known)
143  * @returns pointer to the number of elements, which can be updated by the
144  *      caller if needed
145  */
146 char *acpigen_write_package(struct acpi_ctx *ctx, int nr_el);
147
148 /**
149  * acpigen_write_integer() - Write an integer
150  *
151  * This writes an operation (BYTE_OP, WORD_OP, DWORD_OP, QWORD_OP depending on
152  * the integer size) and an integer value. Note that WORD means 16 bits in ACPI.
153  *
154  * @ctx: ACPI context pointer
155  * @data: Integer to write
156  */
157 void acpigen_write_integer(struct acpi_ctx *ctx, u64 data);
158
159 /**
160  * acpigen_write_string() - Write a string
161  *
162  * This writes a STRING_PREFIX followed by a null-terminated string
163  *
164  * @ctx: ACPI context pointer
165  * @str: String to write
166  */
167 void acpigen_write_string(struct acpi_ctx *ctx, const char *str);
168 #endif