18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Copyright (C) STMicroelectronics SA 2015 48c2ecf20Sopenharmony_ci * Author: Hugues Fruchet <hugues.fruchet@st.com> for STMicroelectronics. 58c2ecf20Sopenharmony_ci */ 68c2ecf20Sopenharmony_ci 78c2ecf20Sopenharmony_ci#include "delta.h" 88c2ecf20Sopenharmony_ci#include "delta-mem.h" 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ciint hw_alloc(struct delta_ctx *ctx, u32 size, const char *name, 118c2ecf20Sopenharmony_ci struct delta_buf *buf) 128c2ecf20Sopenharmony_ci{ 138c2ecf20Sopenharmony_ci struct delta_dev *delta = ctx->dev; 148c2ecf20Sopenharmony_ci dma_addr_t dma_addr; 158c2ecf20Sopenharmony_ci void *addr; 168c2ecf20Sopenharmony_ci unsigned long attrs = DMA_ATTR_WRITE_COMBINE; 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_ci addr = dma_alloc_attrs(delta->dev, size, &dma_addr, 198c2ecf20Sopenharmony_ci GFP_KERNEL | __GFP_NOWARN, attrs); 208c2ecf20Sopenharmony_ci if (!addr) { 218c2ecf20Sopenharmony_ci dev_err(delta->dev, 228c2ecf20Sopenharmony_ci "%s hw_alloc:dma_alloc_coherent failed for %s (size=%d)\n", 238c2ecf20Sopenharmony_ci ctx->name, name, size); 248c2ecf20Sopenharmony_ci ctx->sys_errors++; 258c2ecf20Sopenharmony_ci return -ENOMEM; 268c2ecf20Sopenharmony_ci } 278c2ecf20Sopenharmony_ci 288c2ecf20Sopenharmony_ci buf->size = size; 298c2ecf20Sopenharmony_ci buf->paddr = dma_addr; 308c2ecf20Sopenharmony_ci buf->vaddr = addr; 318c2ecf20Sopenharmony_ci buf->name = name; 328c2ecf20Sopenharmony_ci buf->attrs = attrs; 338c2ecf20Sopenharmony_ci 348c2ecf20Sopenharmony_ci dev_dbg(delta->dev, 358c2ecf20Sopenharmony_ci "%s allocate %d bytes of HW memory @(virt=0x%p, phy=0x%pad): %s\n", 368c2ecf20Sopenharmony_ci ctx->name, size, buf->vaddr, &buf->paddr, buf->name); 378c2ecf20Sopenharmony_ci 388c2ecf20Sopenharmony_ci return 0; 398c2ecf20Sopenharmony_ci} 408c2ecf20Sopenharmony_ci 418c2ecf20Sopenharmony_civoid hw_free(struct delta_ctx *ctx, struct delta_buf *buf) 428c2ecf20Sopenharmony_ci{ 438c2ecf20Sopenharmony_ci struct delta_dev *delta = ctx->dev; 448c2ecf20Sopenharmony_ci 458c2ecf20Sopenharmony_ci dev_dbg(delta->dev, 468c2ecf20Sopenharmony_ci "%s free %d bytes of HW memory @(virt=0x%p, phy=0x%pad): %s\n", 478c2ecf20Sopenharmony_ci ctx->name, buf->size, buf->vaddr, &buf->paddr, buf->name); 488c2ecf20Sopenharmony_ci 498c2ecf20Sopenharmony_ci dma_free_attrs(delta->dev, buf->size, 508c2ecf20Sopenharmony_ci buf->vaddr, buf->paddr, buf->attrs); 518c2ecf20Sopenharmony_ci} 52