Lines Matching refs:buffer

5 #include <ddk/io-buffer.h>
16 // Returns true if a buffer with these parameters was allocated using
32 static zx_status_t io_buffer_init_common(io_buffer_t* buffer, zx_handle_t bti_handle,
65 buffer->bti_handle = bti_handle;
66 buffer->vmo_handle = vmo_handle;
67 buffer->pmt_handle = pmt_handle;
68 buffer->size = size;
69 buffer->offset = offset;
70 buffer->virt = (void *)virt;
71 buffer->phys = phys;
76 zx_status_t io_buffer_init_aligned(io_buffer_t* buffer, zx_handle_t bti, size_t size,
78 memset(buffer, 0, sizeof(*buffer));
112 return io_buffer_init_common(buffer, bti, vmo_handle, size, 0, flags);
115 zx_status_t io_buffer_init(io_buffer_t* buffer, zx_handle_t bti, size_t size, uint32_t flags) {
117 return io_buffer_init_aligned(buffer, bti, size, 0, flags);
120 zx_status_t io_buffer_init_vmo(io_buffer_t* buffer, zx_handle_t bti, zx_handle_t vmo_handle,
122 memset(buffer, 0, sizeof(*buffer));
138 return io_buffer_init_common(buffer, bti, vmo_handle, size, offset, flags);
141 zx_status_t io_buffer_init_mmio(io_buffer_t* buffer, zx_handle_t vmo_handle, void* virt,
143 memset(buffer, 0, sizeof(*buffer));
148 buffer->vmo_handle = vmo_handle;
149 buffer->size = size;
150 buffer->offset = offset;
151 buffer->virt = (void *)virt;
156 zx_status_t io_buffer_init_physical(io_buffer_t* buffer, zx_handle_t bti, zx_paddr_t addr,
158 memset(buffer, 0, sizeof(*buffer));
193 buffer->bti_handle = bti;
194 buffer->vmo_handle = vmo_handle;
195 buffer->pmt_handle = pmt;
196 buffer->size = size;
197 buffer->offset = 0;
198 buffer->virt = (void *)virt;
199 buffer->phys = phys;
200 buffer->phys_list = NULL;
201 buffer->phys_count = 0;
205 void io_buffer_release(io_buffer_t* buffer) {
206 if (buffer->vmo_handle != ZX_HANDLE_INVALID) {
207 if (buffer->pmt_handle != ZX_HANDLE_INVALID) {
208 zx_status_t status = zx_pmt_unpin(buffer->pmt_handle);
210 buffer->pmt_handle = ZX_HANDLE_INVALID;
213 zx_vmar_unmap(zx_vmar_root_self(), (uintptr_t)buffer->virt, buffer->size);
214 zx_handle_close(buffer->vmo_handle);
215 buffer->vmo_handle = ZX_HANDLE_INVALID;
217 if (buffer->phys_list && buffer->pmt_handle != ZX_HANDLE_INVALID) {
218 zx_status_t status = zx_pmt_unpin(buffer->pmt_handle);
220 buffer->pmt_handle = ZX_HANDLE_INVALID;
222 free(buffer->phys_list);
223 buffer->phys_list = NULL;
224 buffer->phys = 0;
225 buffer->phys_count = 0;
228 zx_status_t io_buffer_cache_op(io_buffer_t* buffer, const uint32_t op,
231 return zx_vmo_op_range(buffer->vmo_handle, op, buffer->offset + offset, size, NULL, 0);
237 zx_status_t io_buffer_cache_flush(io_buffer_t* buffer, zx_off_t offset, size_t length) {
238 if (offset + length < offset || offset + length > buffer->size) {
241 return zx_cache_flush(io_buffer_virt(buffer) + offset, length, ZX_CACHE_FLUSH_DATA);
244 zx_status_t io_buffer_cache_flush_invalidate(io_buffer_t* buffer, zx_off_t offset, size_t length) {
245 if (offset + length < offset || offset + length > buffer->size) {
248 return zx_cache_flush(io_buffer_virt(buffer) + offset, length,
252 zx_status_t io_buffer_physmap(io_buffer_t* buffer) {
253 if (buffer->phys_count > 0) {
256 if (buffer->size == 0) {
259 if (buffer->pmt_handle != ZX_HANDLE_INVALID && buffer->phys == IO_BUFFER_INVALID_PHYS) {
265 uint64_t page_offset = ROUNDDOWN(buffer->offset, PAGE_SIZE);
266 // The buffer size is the vmo size from offset 0.
267 uint64_t page_length = buffer->size - page_offset;
276 if (buffer->phys == IO_BUFFER_INVALID_PHYS) {
278 zx_status_t status = io_buffer_physmap_range(buffer, page_offset, page_length,
284 buffer->pmt_handle = pmt;
286 // If this is a contiguous io-buffer, just populate the page array
289 paddrs[i] = buffer->phys + page_offset + i * PAGE_SIZE;
291 paddrs[0] += buffer->offset & (PAGE_SIZE - 1);
293 buffer->phys_list = paddrs;
294 buffer->phys_count = pages;
298 zx_status_t io_buffer_physmap_range(io_buffer_t* buffer, zx_off_t offset,
312 zx_status_t status = zx_bti_pin(buffer->bti_handle, options, buffer->vmo_handle,