msm: adsprpc: Share initial debug config to DSP
This change enables sharing of a new page to DSP. New page will contain inital debug parameters which we need to pass to the DSP during the process initiation. Change-Id: I8ae12cb364811a97eca3f15e70106b36bcec3f54 Signed-off-by: Vamsi Krishna Gattupalli <quic_vgattupa@quicinc.com>
This commit is contained in:

committed by
Gerrit - the friendly Code Review server

parent
cb7a1b4f73
commit
264671ac79
51
dsp/adsprpc.c
Normal file → Executable file
51
dsp/adsprpc.c
Normal file → Executable file
@@ -214,6 +214,12 @@
|
|||||||
|
|
||||||
#define FASTRPC_USER_PD_FORCE_KILL 2
|
#define FASTRPC_USER_PD_FORCE_KILL 2
|
||||||
|
|
||||||
|
/*
|
||||||
|
* No. of pages shared with DSP during process init
|
||||||
|
* First page for init-mem and second page for proc-attrs
|
||||||
|
*/
|
||||||
|
#define PAGESLEN_WITH_SHAREDBUF 2
|
||||||
|
|
||||||
/* Unique index flag used for mini dump */
|
/* Unique index flag used for mini dump */
|
||||||
static int md_unique_index_flag[MAX_UNIQUE_ID] = { 0, 0, 0, 0, 0 };
|
static int md_unique_index_flag[MAX_UNIQUE_ID] = { 0, 0, 0, 0, 0 };
|
||||||
|
|
||||||
@@ -3542,6 +3548,7 @@ int fastrpc_internal_invoke2(struct fastrpc_file *fl,
|
|||||||
struct fastrpc_ioctl_async_response async_res;
|
struct fastrpc_ioctl_async_response async_res;
|
||||||
uint32_t user_concurrency;
|
uint32_t user_concurrency;
|
||||||
struct fastrpc_ioctl_notif_rsp notif;
|
struct fastrpc_ioctl_notif_rsp notif;
|
||||||
|
struct fastrpc_proc_sharedbuf_info buff_info;
|
||||||
} p;
|
} p;
|
||||||
struct fastrpc_dsp_capabilities *dsp_cap_ptr = NULL;
|
struct fastrpc_dsp_capabilities *dsp_cap_ptr = NULL;
|
||||||
uint32_t size = 0;
|
uint32_t size = 0;
|
||||||
@@ -3562,6 +3569,7 @@ int fastrpc_internal_invoke2(struct fastrpc_file *fl,
|
|||||||
goto bail;
|
goto bail;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (inv2->req) {
|
switch (inv2->req) {
|
||||||
case FASTRPC_INVOKE2_ASYNC:
|
case FASTRPC_INVOKE2_ASYNC:
|
||||||
size = sizeof(struct fastrpc_ioctl_invoke_async);
|
size = sizeof(struct fastrpc_ioctl_invoke_async);
|
||||||
@@ -3620,6 +3628,21 @@ int fastrpc_internal_invoke2(struct fastrpc_file *fl,
|
|||||||
err = fastrpc_get_notif_response(&p.notif,
|
err = fastrpc_get_notif_response(&p.notif,
|
||||||
(void *)inv2->invparam, fl);
|
(void *)inv2->invparam, fl);
|
||||||
break;
|
break;
|
||||||
|
case FASTRPC_INVOKE2_PROC_SHAREDBUF_INFO:
|
||||||
|
VERIFY(err,
|
||||||
|
sizeof(struct fastrpc_proc_sharedbuf_info) >= inv2->size);
|
||||||
|
if (err) {
|
||||||
|
err = -EBADE;
|
||||||
|
goto bail;
|
||||||
|
}
|
||||||
|
K_COPY_FROM_USER(err, fl->is_compat, &p.buff_info,
|
||||||
|
(void *)inv2->invparam, inv2->size);
|
||||||
|
if (err)
|
||||||
|
goto bail;
|
||||||
|
|
||||||
|
fl->sharedbuf_info.buf_fd = p.buff_info.buf_fd;
|
||||||
|
fl->sharedbuf_info.buf_size = p.buff_info.buf_size;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
err = -ENOTTY;
|
err = -ENOTTY;
|
||||||
break;
|
break;
|
||||||
@@ -3720,7 +3743,8 @@ static int fastrpc_init_create_dynamic_process(struct fastrpc_file *fl,
|
|||||||
int err = 0, memlen = 0, mflags = 0, locked = 0;
|
int err = 0, memlen = 0, mflags = 0, locked = 0;
|
||||||
struct fastrpc_ioctl_invoke_async ioctl;
|
struct fastrpc_ioctl_invoke_async ioctl;
|
||||||
struct fastrpc_ioctl_init *init = &uproc->init;
|
struct fastrpc_ioctl_init *init = &uproc->init;
|
||||||
struct smq_phy_page pages[1];
|
/* First page for init-mem and second page for proc-attrs */
|
||||||
|
struct smq_phy_page pages[PAGESLEN_WITH_SHAREDBUF];
|
||||||
struct fastrpc_mmap *file = NULL;
|
struct fastrpc_mmap *file = NULL;
|
||||||
struct fastrpc_buf *imem = NULL;
|
struct fastrpc_buf *imem = NULL;
|
||||||
unsigned long imem_dma_attr = 0;
|
unsigned long imem_dma_attr = 0;
|
||||||
@@ -3729,6 +3753,7 @@ static int fastrpc_init_create_dynamic_process(struct fastrpc_file *fl,
|
|||||||
unsigned int gid = 0, one_mb = 1024*1024;
|
unsigned int gid = 0, one_mb = 1024*1024;
|
||||||
unsigned int dsp_userpd_memlen = 0;
|
unsigned int dsp_userpd_memlen = 0;
|
||||||
struct fastrpc_buf *init_mem;
|
struct fastrpc_buf *init_mem;
|
||||||
|
struct fastrpc_mmap *sharedbuf_map = NULL;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
int pgid;
|
int pgid;
|
||||||
@@ -3862,11 +3887,24 @@ static int fastrpc_init_create_dynamic_process(struct fastrpc_file *fl,
|
|||||||
goto bail;
|
goto bail;
|
||||||
fl->init_mem = imem;
|
fl->init_mem = imem;
|
||||||
|
|
||||||
|
inbuf.pageslen = 1;
|
||||||
|
if ((fl->sharedbuf_info.buf_fd != -1) && fl->sharedbuf_info.buf_size) {
|
||||||
|
mutex_lock(&fl->map_mutex);
|
||||||
|
err = fastrpc_mmap_create(fl, fl->sharedbuf_info.buf_fd, NULL, 0,
|
||||||
|
0, fl->sharedbuf_info.buf_size, mflags, &sharedbuf_map);
|
||||||
|
mutex_unlock(&fl->map_mutex);
|
||||||
|
if (err)
|
||||||
|
goto bail;
|
||||||
|
|
||||||
|
/* if shared buff is available send this as the second page and set pageslen as 2 */
|
||||||
|
inbuf.pageslen = PAGESLEN_WITH_SHAREDBUF;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Prepare remote arguments for dynamic process create
|
* Prepare remote arguments for dynamic process create
|
||||||
* call to remote subsystem.
|
* call to remote subsystem.
|
||||||
*/
|
*/
|
||||||
inbuf.pageslen = 1;
|
|
||||||
ra[0].buf.pv = (void *)&inbuf;
|
ra[0].buf.pv = (void *)&inbuf;
|
||||||
ra[0].buf.len = sizeof(inbuf);
|
ra[0].buf.len = sizeof(inbuf);
|
||||||
fds[0] = -1;
|
fds[0] = -1;
|
||||||
@@ -3881,8 +3919,14 @@ static int fastrpc_init_create_dynamic_process(struct fastrpc_file *fl,
|
|||||||
|
|
||||||
pages[0].addr = imem->phys;
|
pages[0].addr = imem->phys;
|
||||||
pages[0].size = imem->size;
|
pages[0].size = imem->size;
|
||||||
|
|
||||||
|
/* Update IOVA of second page shared with DSP */
|
||||||
|
if (inbuf.pageslen > 1) {
|
||||||
|
pages[1].addr = sharedbuf_map->phys;
|
||||||
|
pages[1].size = sharedbuf_map->size;
|
||||||
|
}
|
||||||
ra[3].buf.pv = (void *)pages;
|
ra[3].buf.pv = (void *)pages;
|
||||||
ra[3].buf.len = 1 * sizeof(*pages);
|
ra[3].buf.len = (inbuf.pageslen) * sizeof(*pages);
|
||||||
fds[3] = -1;
|
fds[3] = -1;
|
||||||
|
|
||||||
inbuf.attrs = uproc->attrs;
|
inbuf.attrs = uproc->attrs;
|
||||||
@@ -6054,6 +6098,7 @@ static int fastrpc_device_open(struct inode *inode, struct file *filp)
|
|||||||
init_completion(&fl->dma_invoke);
|
init_completion(&fl->dma_invoke);
|
||||||
fl->file_close = FASTRPC_PROCESS_DEFAULT_STATE;
|
fl->file_close = FASTRPC_PROCESS_DEFAULT_STATE;
|
||||||
filp->private_data = fl;
|
filp->private_data = fl;
|
||||||
|
fl->sharedbuf_info.buf_fd = -1;
|
||||||
mutex_init(&fl->internal_map_mutex);
|
mutex_init(&fl->internal_map_mutex);
|
||||||
mutex_init(&fl->map_mutex);
|
mutex_init(&fl->map_mutex);
|
||||||
spin_lock_irqsave(&me->hlock, irq_flags);
|
spin_lock_irqsave(&me->hlock, irq_flags);
|
||||||
|
16
dsp/adsprpc_shared.h
Normal file → Executable file
16
dsp/adsprpc_shared.h
Normal file → Executable file
@@ -202,6 +202,15 @@ struct remote_buf {
|
|||||||
size_t len; /* length of buffer */
|
size_t len; /* length of buffer */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* structure to hold fd and size of buffer shared with DSP,
|
||||||
|
* which contains inital debug parameters that needs to be passed
|
||||||
|
* during process initialization.
|
||||||
|
*/
|
||||||
|
struct fastrpc_proc_sharedbuf_info {
|
||||||
|
int buf_fd;
|
||||||
|
int buf_size;
|
||||||
|
};
|
||||||
|
|
||||||
struct remote_dma_handle {
|
struct remote_dma_handle {
|
||||||
int fd;
|
int fd;
|
||||||
uint32_t offset;
|
uint32_t offset;
|
||||||
@@ -299,6 +308,7 @@ enum fastrpc_invoke2_type {
|
|||||||
FASTRPC_INVOKE2_ASYNC_RESPONSE = 2,
|
FASTRPC_INVOKE2_ASYNC_RESPONSE = 2,
|
||||||
FASTRPC_INVOKE2_KERNEL_OPTIMIZATIONS,
|
FASTRPC_INVOKE2_KERNEL_OPTIMIZATIONS,
|
||||||
FASTRPC_INVOKE2_STATUS_NOTIF,
|
FASTRPC_INVOKE2_STATUS_NOTIF,
|
||||||
|
FASTRPC_INVOKE2_PROC_SHAREDBUF_INFO,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct fastrpc_ioctl_invoke2 {
|
struct fastrpc_ioctl_invoke2 {
|
||||||
@@ -1116,6 +1126,12 @@ struct fastrpc_file {
|
|||||||
bool exit_notif;
|
bool exit_notif;
|
||||||
/* Flag to indicate async thread exit requested*/
|
/* Flag to indicate async thread exit requested*/
|
||||||
bool exit_async;
|
bool exit_async;
|
||||||
|
/*
|
||||||
|
* structure to hold fd and size of buffer shared with DSP,
|
||||||
|
* which contains initial debug configurations and other initial
|
||||||
|
* config paramters.
|
||||||
|
*/
|
||||||
|
struct fastrpc_proc_sharedbuf_info sharedbuf_info;
|
||||||
};
|
};
|
||||||
|
|
||||||
union fastrpc_ioctl_param {
|
union fastrpc_ioctl_param {
|
||||||
|
Reference in New Issue
Block a user