From mboxrd@z Thu Jan 1 00:00:00 1970 From: Bin Meng Date: Sun, 28 Jun 2020 17:55:07 +0800 Subject: [PATCH v3 08/35] acpi: Support string output In-Reply-To: <20200613205459.v3.8.I16b67cc18d7b82670005ce5aabd2f162f60a50a6@changeid> References: <20200614025523.40183-1-sjg@chromium.org> <20200613205459.v3.8.I16b67cc18d7b82670005ce5aabd2f162f60a50a6@changeid> Message-ID: List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de Hi Simon, On Sun, Jun 14, 2020 at 10:55 AM Simon Glass wrote: > > Add support for output of strings and streams of bytes. > > Signed-off-by: Simon Glass > Reviewed-by: Wolfgang Wallner > --- > > (no changes since v1) > > include/acpi/acpigen.h | 19 +++++++++++++++++++ > lib/acpi/acpigen.c | 14 ++++++++++++++ > test/dm/acpigen.c | 42 ++++++++++++++++++++++++++++++++++++++++++ > 3 files changed, 75 insertions(+) > > diff --git a/include/acpi/acpigen.h b/include/acpi/acpigen.h > index 8809cdb4e1..7365cce738 100644 > --- a/include/acpi/acpigen.h > +++ b/include/acpi/acpigen.h > @@ -46,4 +46,23 @@ void acpigen_emit_word(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 nul terminator nits: null > + * > + * @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 > diff --git a/lib/acpi/acpigen.c b/lib/acpi/acpigen.c > index 59bd3af0b7..1223f0d1c4 100644 > --- a/lib/acpi/acpigen.c > +++ b/lib/acpi/acpigen.c > @@ -36,3 +36,17 @@ void acpigen_emit_dword(struct acpi_ctx *ctx, uint data) > acpigen_emit_byte(ctx, (data >> 16) & 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'); /* NUL */ nits: NULL > +} > diff --git a/test/dm/acpigen.c b/test/dm/acpigen.c > index 4ee5c9cfe2..fac9886f2e 100644 > --- a/test/dm/acpigen.c > +++ b/test/dm/acpigen.c > @@ -17,6 +17,9 @@ > #include > #include > > +#define TEST_STRING "frogmore" > +#define TEST_STREAM2 "\xfa\xde" > + > static int alloc_context(struct acpi_ctx **ctxp) > { > struct acpi_ctx *ctx; > @@ -70,6 +73,45 @@ static int dm_test_acpi_emit_simple(struct unit_test_state *uts) > } > 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 */ > static int dm_test_acpi_interrupt(struct unit_test_state *uts) > { > -- Other than that, Reviewed-by: Bin Meng Regards, Bin