From: Simon Glass <simon.glass@canonical.com>
Add a helper function that combines abuf_init() and abuf_map_sysmem()
into a single call. This simplifies code that needs to set up an abuf
from a memory address.
Co-developed-by: Claude Opus 4.5 <noreply@anthropic.com>
Signed-off-by: Simon Glass <simon.glass@canonical.com>
---
include/abuf.h | 12 ++++++++++++
lib/abuf.c | 6 ++++++
test/lib/abuf.c | 23 +++++++++++++++++++++++
3 files changed, 41 insertions(+)
@@ -214,6 +214,18 @@ void abuf_init_const(struct abuf *abuf, const void *data, size_t size);
*/
void abuf_init_const_addr(struct abuf *abuf, ulong addr, size_t size);
+/**
+ * abuf_init_addr() - Set up a new buffer at a given address
+ *
+ * This is similar to abuf_init_const_addr() but uses abuf_map_sysmem()
+ * internally. Note that the abuf is unallocated.
+ *
+ * @abuf: abuf to set up
+ * @addr: Address to use
+ * @size: Size of buffer
+ */
+void abuf_init_addr(struct abuf *abuf, ulong addr, size_t size);
+
/**
* abuf_init_size() - Set up an allocated abuf
*
@@ -188,6 +188,12 @@ void abuf_init_const_addr(struct abuf *abuf, ulong addr, size_t size)
{
return abuf_init_const(abuf, map_sysmem(addr, size), size);
}
+
+void abuf_init_addr(struct abuf *abuf, ulong addr, size_t size)
+{
+ abuf_init(abuf);
+ abuf_map_sysmem(abuf, addr, size);
+}
#endif
void abuf_init_move(struct abuf *abuf, void *data, size_t size)
@@ -91,6 +91,29 @@ static int lib_test_abuf_init_const_addr(struct unit_test_state *uts)
}
LIB_TEST(lib_test_abuf_init_const_addr, 0);
+/* Test abuf_init_addr() */
+static int lib_test_abuf_init_addr(struct unit_test_state *uts)
+{
+ struct abuf buf;
+ ulong start;
+ void *ptr;
+
+ start = ut_check_free();
+
+ ptr = map_sysmem(0x100, 0);
+
+ abuf_init_addr(&buf, 0x100, 10);
+ ut_asserteq_ptr(ptr, buf.data);
+ ut_asserteq(10, buf.size);
+ ut_asserteq(false, buf.alloced);
+
+ /* No memory should have been allocated */
+ ut_assertok(ut_check_delta(start));
+
+ return 0;
+}
+LIB_TEST(lib_test_abuf_init_addr, 0);
+
/* Test abuf_map_sysmem() and abuf_addr() */
static int lib_test_abuf_map_sysmem(struct unit_test_state *uts)
{