blob: 3bb4d73df6894499b511a208fb44d71b960e07fb [file] [log] [blame]
// Copyright 2021 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "memory.h"
#include <lib/ddk/io-buffer.h>
#include <memory>
struct iwl_iobuf {
io_buffer_t io_buffer = {};
};
zx_status_t iwl_iobuf_allocate_contiguous(struct device* dev, size_t size,
struct iwl_iobuf** out_iobuf) {
zx_status_t status = ZX_OK;
auto iobuf = std::make_unique<struct iwl_iobuf>();
if ((status = io_buffer_init(&iobuf->io_buffer, dev->bti, size,
IO_BUFFER_RW | IO_BUFFER_CONTIG)) != ZX_OK) {
return status;
}
*out_iobuf = iobuf.release();
return ZX_OK;
}
size_t iwl_iobuf_size(const struct iwl_iobuf* iobuf) {
return io_buffer_size(&iobuf->io_buffer, 0);
}
void* iwl_iobuf_virtual(const struct iwl_iobuf* iobuf) { return io_buffer_virt(&iobuf->io_buffer); }
dma_addr_t iwl_iobuf_physical(const struct iwl_iobuf* iobuf) {
return io_buffer_phys(&iobuf->io_buffer);
}
zx_status_t iwl_iobuf_cache_flush(struct iwl_iobuf* iobuf, size_t offset, size_t size) {
return io_buffer_cache_flush(&iobuf->io_buffer, offset, size);
}
void iwl_iobuf_release(struct iwl_iobuf* iobuf) {
io_buffer_release(&iobuf->io_buffer);
delete iobuf;
}