| /* |
| * Copyright 2017, Data61, CSIRO (ABN 41 687 119 230) |
| * Copyright 2020, HENSOLDT Cyber GmbH |
| * |
| * SPDX-License-Identifier: GPL-2.0-only |
| */ |
| |
| #include <ethdrivers/helpers.h> |
| |
| dma_addr_t dma_alloc_pin(ps_dma_man_t *dma_man, size_t size, int cached, int alignment) |
| { |
| void *virt = ps_dma_alloc(dma_man, size, alignment, cached, PS_MEM_NORMAL); |
| if (!virt) { |
| ZF_LOGE("ps_dma_alloc() failed for size=%zu, alignment=%d", |
| size, alignment); |
| return (dma_addr_t) { |
| .virt = NULL, .phys = 0 |
| }; |
| } |
| uintptr_t phys = ps_dma_pin(dma_man, virt, size); |
| if (!phys) { |
| ZF_LOGE("ps_dma_pin() failed for virt=%p, size=%zu", virt, size); |
| /* hmm this shouldn't really happen */ |
| ps_dma_free(dma_man, virt, size); |
| return (dma_addr_t) { |
| .virt = NULL, .phys = 0 |
| }; |
| } |
| if (!cached) { |
| /* Prevent any cache bombs */ |
| ps_dma_cache_clean_invalidate(dma_man, virt, size); |
| } |
| return (dma_addr_t) { |
| .virt = virt, .phys = phys |
| }; |
| } |
| |
| void dma_unpin_free(ps_dma_man_t *dma_man, void *virt, size_t size) |
| { |
| ps_dma_unpin(dma_man, virt, size); |
| ps_dma_free(dma_man, virt, size); |
| } |