xref: /OK3568_Linux_fs/kernel/drivers/media/platform/sti/delta/delta-mem.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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