+int
+hba_bind_sbuf(struct hba_cmdh* cmdh, struct hba_cmdt* cmdt, struct membuf mbuf)
+{
+ assert_msg(mbuf.buffer <= 0x400000, "HBA: Buffer too big");
+ cmdh->prdt_len = 1;
+ cmdt->entries[0] = (struct hba_prdte){ .data_base = vmm_v2p(mbuf.buffer),
+ .byte_count = mbuf.size - 1 };
+}
+
+int
+hba_bind_vbuf(struct hba_cmdh* cmdh, struct hba_cmdt* cmdt, struct vecbuf* vbuf)
+{
+ size_t i = 0;
+ struct vecbuf *pos, *n;
+
+ llist_for_each(pos, n, &vbuf->components, components)
+ {
+ assert_msg(i < HBA_MAX_PRDTE, "HBA: Too many PRDTEs");
+ assert_msg(pos->buf.buffer <= 0x400000, "HBA: Buffer too big");
+
+ cmdt->entries[i++] =
+ (struct hba_prdte){ .data_base = vmm_v2p(pos->buf.buffer),
+ .byte_count = pos->buf.size - 1 };
+ }
+
+ cmdh->prdt_len = i + 1;
+}
+