summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSrinivas Kandagatla <srinivas.kandagatla@linaro.org>2018-10-17 13:44:45 +0100
committerSrinivas Kandagatla <srinivas.kandagatla@linaro.org>2018-12-21 09:48:14 +0000
commitca7c77fcd3d05a1a3ab19ea998dba48aa4a0e280 (patch)
treeeef569f61a5f53521726ffe7d556ee96abe37c00
parent6551cce888e171d1640ae927e55c975e1a2cb4b6 (diff)
rpcmem: add support to allocate memory using dma_buf
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
-rw-r--r--src/rpcmem.c62
1 files changed, 57 insertions, 5 deletions
diff --git a/src/rpcmem.c b/src/rpcmem.c
index 309a09b..a2504eb 100644
--- a/src/rpcmem.c
+++ b/src/rpcmem.c
@@ -30,30 +30,46 @@
*/
#include "rpcmem.h"
#include "verify.h"
+#include "fastrpc_internal.h"
#include "AEEQList.h"
#include "AEEstd.h"
+#include "apps_std.h"
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
+#include <fcntl.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/ioctl.h>
+#include <sys/mman.h>
+#include <errno.h>
#define FASTRPC_DEVICE "/dev/fastrpc-adsp"
+
#define PAGE_SIZE 4096
#define PAGE_MASK ~((uintptr_t)PAGE_SIZE - 1)
static QList rpclst;
static pthread_mutex_t rpcmt;
-
struct rpc_info
{
QNode qn;
void *buf;
void *aligned_buf;
int size;
+ int fd;
};
+extern int open_dev(int attach);
+static int rpcmem_open_dev()
+{
+ return open_dev(0);
+}
+
void rpcmem_init()
{
+ int fd;
QList_Ctor(&rpclst);
pthread_mutex_init(&rpcmt, 0);
}
@@ -65,23 +81,52 @@ void rpcmem_deinit()
int rpcmem_to_fd(void *po)
{
- return 1;
+ struct rpc_info *rinfo, *rfree = 0;
+ QNode *pn, *pnn;
+
+ pthread_mutex_lock(&rpcmt);
+ QLIST_NEXTSAFE_FOR_ALL(&rpclst, pn, pnn)
+ {
+ rinfo = STD_RECOVER_REC(struct rpc_info, qn, pn);
+ if (rinfo->aligned_buf == po)
+ {
+ rfree = rinfo;
+ break;
+ }
+ }
+ pthread_mutex_unlock(&rpcmt);
+
+ if (rfree)
+ return rfree->fd;
+
+ return -1;
}
void *rpcmem_alloc(int heapid, uint32 flags, int size)
{
struct rpc_info *rinfo;
+ struct fastrpc_alloc_dma_buf buf;
int nErr = 0;
(void)heapid;
(void)flags;
+ int dev = rpcmem_open_dev();
VERIFY(0 != (rinfo = calloc(1, sizeof(*rinfo))));
- VERIFY(0 != (rinfo->buf = malloc(size + PAGE_SIZE)));
- rinfo->aligned_buf = (void *)(((uintptr_t)rinfo->buf + PAGE_SIZE) & PAGE_MASK);
+
+ buf.size = size + PAGE_SIZE;
+ buf.fd = -1;
+ buf.flags = 0;
+
+ VERIFY((0 == ioctl(dev, FASTRPC_IOCTL_ALLOC_DMA_BUFF, (unsigned long)&buf)) || errno == ENOTTY);
+ VERIFY(0 != (rinfo->buf = mmap(0, size, PROT_READ | PROT_WRITE, MAP_SHARED, buf.fd, 0)));
+ rinfo->fd = buf.fd;
+ rinfo->aligned_buf = (void *)(((uintptr_t)rinfo->buf /*+ PAGE_SIZE*/) & PAGE_MASK);
+ rinfo->aligned_buf = rinfo->buf;
rinfo->size = size;
pthread_mutex_lock(&rpcmt);
QList_AppendNode(&rpclst, &rinfo->qn);
pthread_mutex_unlock(&rpcmt);
+
return rinfo->aligned_buf;
bail:
if (nErr)
@@ -102,6 +147,7 @@ void rpcmem_free(void *po)
{
struct rpc_info *rinfo, *rfree = 0;
QNode *pn, *pnn;
+ int nErr = 0;
pthread_mutex_lock(&rpcmt);
QLIST_NEXTSAFE_FOR_ALL(&rpclst, pn, pnn)
@@ -117,7 +163,13 @@ void rpcmem_free(void *po)
pthread_mutex_unlock(&rpcmt);
if (rfree)
{
- free(rfree->buf);
+ int dev = rpcmem_open_dev(0);
+
+ VERIFY((0 == ioctl(dev, FASTRPC_IOCTL_FREE_DMA_BUFF, (unsigned long)&rfree->fd)) || errno == ENOTTY);
+ munmap(rfree->buf, rfree->size);
free(rfree);
}
+bail:
+ return;
+
}