1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * Copyright (C) STMicroelectronics SA 2015
4*4882a593Smuzhiyun * Author: Hugues Fruchet <hugues.fruchet@st.com> for STMicroelectronics.
5*4882a593Smuzhiyun */
6*4882a593Smuzhiyun
7*4882a593Smuzhiyun #include "delta.h"
8*4882a593Smuzhiyun #include "delta-mem.h"
9*4882a593Smuzhiyun
hw_alloc(struct delta_ctx * ctx,u32 size,const char * name,struct delta_buf * buf)10*4882a593Smuzhiyun int hw_alloc(struct delta_ctx *ctx, u32 size, const char *name,
11*4882a593Smuzhiyun struct delta_buf *buf)
12*4882a593Smuzhiyun {
13*4882a593Smuzhiyun struct delta_dev *delta = ctx->dev;
14*4882a593Smuzhiyun dma_addr_t dma_addr;
15*4882a593Smuzhiyun void *addr;
16*4882a593Smuzhiyun unsigned long attrs = DMA_ATTR_WRITE_COMBINE;
17*4882a593Smuzhiyun
18*4882a593Smuzhiyun addr = dma_alloc_attrs(delta->dev, size, &dma_addr,
19*4882a593Smuzhiyun GFP_KERNEL | __GFP_NOWARN, attrs);
20*4882a593Smuzhiyun if (!addr) {
21*4882a593Smuzhiyun dev_err(delta->dev,
22*4882a593Smuzhiyun "%s hw_alloc:dma_alloc_coherent failed for %s (size=%d)\n",
23*4882a593Smuzhiyun ctx->name, name, size);
24*4882a593Smuzhiyun ctx->sys_errors++;
25*4882a593Smuzhiyun return -ENOMEM;
26*4882a593Smuzhiyun }
27*4882a593Smuzhiyun
28*4882a593Smuzhiyun buf->size = size;
29*4882a593Smuzhiyun buf->paddr = dma_addr;
30*4882a593Smuzhiyun buf->vaddr = addr;
31*4882a593Smuzhiyun buf->name = name;
32*4882a593Smuzhiyun buf->attrs = attrs;
33*4882a593Smuzhiyun
34*4882a593Smuzhiyun dev_dbg(delta->dev,
35*4882a593Smuzhiyun "%s allocate %d bytes of HW memory @(virt=0x%p, phy=0x%pad): %s\n",
36*4882a593Smuzhiyun ctx->name, size, buf->vaddr, &buf->paddr, buf->name);
37*4882a593Smuzhiyun
38*4882a593Smuzhiyun return 0;
39*4882a593Smuzhiyun }
40*4882a593Smuzhiyun
hw_free(struct delta_ctx * ctx,struct delta_buf * buf)41*4882a593Smuzhiyun void hw_free(struct delta_ctx *ctx, struct delta_buf *buf)
42*4882a593Smuzhiyun {
43*4882a593Smuzhiyun struct delta_dev *delta = ctx->dev;
44*4882a593Smuzhiyun
45*4882a593Smuzhiyun dev_dbg(delta->dev,
46*4882a593Smuzhiyun "%s free %d bytes of HW memory @(virt=0x%p, phy=0x%pad): %s\n",
47*4882a593Smuzhiyun ctx->name, buf->size, buf->vaddr, &buf->paddr, buf->name);
48*4882a593Smuzhiyun
49*4882a593Smuzhiyun dma_free_attrs(delta->dev, buf->size,
50*4882a593Smuzhiyun buf->vaddr, buf->paddr, buf->attrs);
51*4882a593Smuzhiyun }
52