acpi: Support string output
Add support for output of strings and streams of bytes. 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>
This commit is contained in:
		
							parent
							
								
									2912686c08
								
							
						
					
					
						commit
						7fb8da4ce1
					
				|  | @ -46,4 +46,23 @@ void acpigen_emit_word(struct acpi_ctx *ctx, uint data); | ||||||
|  */ |  */ | ||||||
| void acpigen_emit_dword(struct acpi_ctx *ctx, uint data); | void acpigen_emit_dword(struct acpi_ctx *ctx, uint data); | ||||||
| 
 | 
 | ||||||
|  | /**
 | ||||||
|  |  * acpigen_emit_stream() - Emit a stream of bytes | ||||||
|  |  * | ||||||
|  |  * @ctx: ACPI context pointer | ||||||
|  |  * @data: Data to output | ||||||
|  |  * @size: Size of data in bytes | ||||||
|  |  */ | ||||||
|  | void acpigen_emit_stream(struct acpi_ctx *ctx, const char *data, int size); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * acpigen_emit_string() - Emit a string | ||||||
|  |  * | ||||||
|  |  * Emit a string with a null terminator | ||||||
|  |  * | ||||||
|  |  * @ctx: ACPI context pointer | ||||||
|  |  * @str: String to output, or NULL for an empty string | ||||||
|  |  */ | ||||||
|  | void acpigen_emit_string(struct acpi_ctx *ctx, const char *str); | ||||||
|  | 
 | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | @ -37,3 +37,17 @@ void acpigen_emit_dword(struct acpi_ctx *ctx, uint data) | ||||||
| 	acpigen_emit_byte(ctx, (data >> 16) & 0xff); | 	acpigen_emit_byte(ctx, (data >> 16) & 0xff); | ||||||
| 	acpigen_emit_byte(ctx, (data >> 24) & 0xff); | 	acpigen_emit_byte(ctx, (data >> 24) & 0xff); | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | void acpigen_emit_stream(struct acpi_ctx *ctx, const char *data, int size) | ||||||
|  | { | ||||||
|  | 	int i; | ||||||
|  | 
 | ||||||
|  | 	for (i = 0; i < size; i++) | ||||||
|  | 		acpigen_emit_byte(ctx, data[i]); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void acpigen_emit_string(struct acpi_ctx *ctx, const char *str) | ||||||
|  | { | ||||||
|  | 	acpigen_emit_stream(ctx, str, str ? strlen(str) : 0); | ||||||
|  | 	acpigen_emit_byte(ctx, '\0'); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @ -20,6 +20,9 @@ | ||||||
| /* Maximum size of the ACPI context needed for most tests */ | /* Maximum size of the ACPI context needed for most tests */ | ||||||
| #define ACPI_CONTEXT_SIZE	150 | #define ACPI_CONTEXT_SIZE	150 | ||||||
| 
 | 
 | ||||||
|  | #define TEST_STRING	"frogmore" | ||||||
|  | #define TEST_STREAM2	"\xfa\xde" | ||||||
|  | 
 | ||||||
| static int alloc_context(struct acpi_ctx **ctxp) | static int alloc_context(struct acpi_ctx **ctxp) | ||||||
| { | { | ||||||
| 	struct acpi_ctx *ctx; | 	struct acpi_ctx *ctx; | ||||||
|  | @ -73,6 +76,45 @@ static int dm_test_acpi_emit_simple(struct unit_test_state *uts) | ||||||
| } | } | ||||||
| DM_TEST(dm_test_acpi_emit_simple, 0); | DM_TEST(dm_test_acpi_emit_simple, 0); | ||||||
| 
 | 
 | ||||||
|  | /* Test emitting a stream */ | ||||||
|  | static int dm_test_acpi_emit_stream(struct unit_test_state *uts) | ||||||
|  | { | ||||||
|  | 	struct acpi_ctx *ctx; | ||||||
|  | 	u8 *ptr; | ||||||
|  | 
 | ||||||
|  | 	ut_assertok(alloc_context(&ctx)); | ||||||
|  | 
 | ||||||
|  | 	ptr = acpigen_get_current(ctx); | ||||||
|  | 	acpigen_emit_stream(ctx, TEST_STREAM2, 2); | ||||||
|  | 	ut_asserteq(2, acpigen_get_current(ctx) - ptr); | ||||||
|  | 	ut_asserteq((u8)TEST_STREAM2[0], ptr[0]); | ||||||
|  | 	ut_asserteq((u8)TEST_STREAM2[1], ptr[1]); | ||||||
|  | 
 | ||||||
|  | 	free_context(&ctx); | ||||||
|  | 
 | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  | DM_TEST(dm_test_acpi_emit_stream, 0); | ||||||
|  | 
 | ||||||
|  | /* Test emitting a string */ | ||||||
|  | static int dm_test_acpi_emit_string(struct unit_test_state *uts) | ||||||
|  | { | ||||||
|  | 	struct acpi_ctx *ctx; | ||||||
|  | 	u8 *ptr; | ||||||
|  | 
 | ||||||
|  | 	ut_assertok(alloc_context(&ctx)); | ||||||
|  | 
 | ||||||
|  | 	ptr = acpigen_get_current(ctx); | ||||||
|  | 	acpigen_emit_string(ctx, TEST_STRING); | ||||||
|  | 	ut_asserteq(sizeof(TEST_STRING), acpigen_get_current(ctx) - ptr); | ||||||
|  | 	ut_asserteq_str(TEST_STRING, (char *)ptr); | ||||||
|  | 
 | ||||||
|  | 	free_context(&ctx); | ||||||
|  | 
 | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  | DM_TEST(dm_test_acpi_emit_string, 0); | ||||||
|  | 
 | ||||||
| /* Test emitting an interrupt descriptor */ | /* Test emitting an interrupt descriptor */ | ||||||
| static int dm_test_acpi_interrupt(struct unit_test_state *uts) | static int dm_test_acpi_interrupt(struct unit_test_state *uts) | ||||||
| { | { | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue