summaryrefslogtreecommitdiff
path: root/drivers/char
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2017-02-03 06:26:48 -0800
committerGerrit - the friendly Code Review server <code-review@localhost>2017-02-03 06:26:47 -0800
commit294fecd4b8eff8165312d4d68ae0ef22786ddcdb (patch)
tree97c86b33234963a678d302b46883dd17b258e63d /drivers/char
parente8cc3a4e40d60187ff2041ec1428a9d9583b62cb (diff)
parent150e613cb7c5ca0e48a837ac98f800473ededabb (diff)
Merge "msm: ADSPRPC: Use domain information to open channels"
Diffstat (limited to 'drivers/char')
-rw-r--r--drivers/char/adsprpc.c122
-rw-r--r--drivers/char/adsprpc_compat.c4
2 files changed, 76 insertions, 50 deletions
diff --git a/drivers/char/adsprpc.c b/drivers/char/adsprpc.c
index 3c8c1f9acbfa..fd0123d79f1d 100644
--- a/drivers/char/adsprpc.c
+++ b/drivers/char/adsprpc.c
@@ -1493,6 +1493,7 @@ static int fastrpc_internal_invoke(struct fastrpc_file *fl, uint32_t mode,
return err;
}
+static int fastrpc_channel_open(struct fastrpc_file *fl);
static int fastrpc_init_process(struct fastrpc_file *fl,
struct fastrpc_ioctl_init_attrs *uproc)
{
@@ -1501,6 +1502,10 @@ static int fastrpc_init_process(struct fastrpc_file *fl,
struct fastrpc_ioctl_init *init = &uproc->init;
struct smq_phy_page pages[1];
struct fastrpc_mmap *file = 0, *mem = 0;
+
+ VERIFY(err, !fastrpc_channel_open(fl));
+ if (err)
+ goto bail;
if (init->flags == FASTRPC_INIT_ATTACH) {
remote_arg_t ra[1];
int tgid = current->tgid;
@@ -1651,6 +1656,9 @@ static int fastrpc_release_current_dsp_process(struct fastrpc_file *fl)
remote_arg_t ra[1];
int tgid = 0;
+ VERIFY(err, fl->cid >= 0 && fl->cid < NUM_CHANNELS);
+ if (err)
+ goto bail;
VERIFY(err, fl->apps->channel[fl->cid].chan != 0);
if (err)
goto bail;
@@ -2307,42 +2315,20 @@ static const struct file_operations debugfs_fops = {
.open = fastrpc_debugfs_open,
.read = fastrpc_debugfs_read,
};
-
-static int fastrpc_device_open(struct inode *inode, struct file *filp)
+static int fastrpc_channel_open(struct fastrpc_file *fl)
{
- int cid = MINOR(inode->i_rdev);
- struct dentry *debugfs_file;
- int err = 0;
struct fastrpc_apps *me = &gfa;
- struct fastrpc_file *fl = 0;
-
- VERIFY(err, fl = kzalloc(sizeof(*fl), GFP_KERNEL));
- if (err)
- return err;
-
- filp->private_data = fl;
+ int cid, err = 0;
mutex_lock(&me->smd_mutex);
- debugfs_file = debugfs_create_file(current->comm, 0644, debugfs_root,
- fl, &debugfs_fops);
- context_list_ctor(&fl->clst);
- spin_lock_init(&fl->hlock);
- INIT_HLIST_HEAD(&fl->maps);
- INIT_HLIST_HEAD(&fl->bufs);
- INIT_HLIST_NODE(&fl->hn);
- fl->tgid = current->tgid;
- fl->apps = me;
- fl->cid = cid;
- if (debugfs_file != NULL)
- fl->debugfs_file = debugfs_file;
- memset(&fl->perf, 0, sizeof(fl->perf));
-
- VERIFY(err, !fastrpc_session_alloc_locked(&me->channel[cid], 0,
- &fl->sctx));
+ VERIFY(err, fl && fl->sctx);
+ if (err)
+ goto bail;
+ cid = fl->cid;
+ VERIFY(err, cid >= 0 && cid < NUM_CHANNELS);
if (err)
goto bail;
- fl->cid = cid;
fl->ssrcount = me->channel[cid].ssrcount;
if ((kref_get_unless_zero(&me->channel[cid].kref) == 0) ||
(me->channel[cid].chan == 0)) {
@@ -2368,25 +2354,58 @@ static int fastrpc_device_open(struct inode *inode, struct file *filp)
me->channel[cid].ssrcount;
}
}
- spin_lock(&me->hlock);
- hlist_add_head(&fl->hn, &me->drivers);
- spin_unlock(&me->hlock);
bail:
mutex_unlock(&me->smd_mutex);
-
- if (err && fl)
- fastrpc_device_release(inode, filp);
return err;
}
+static int fastrpc_device_open(struct inode *inode, struct file *filp)
+{
+ int err = 0;
+ struct fastrpc_file *fl = 0;
+ struct fastrpc_apps *me = &gfa;
+
+ VERIFY(err, fl = kzalloc(sizeof(*fl), GFP_KERNEL));
+ if (err)
+ return err;
+
+ context_list_ctor(&fl->clst);
+ spin_lock_init(&fl->hlock);
+ INIT_HLIST_HEAD(&fl->maps);
+ INIT_HLIST_HEAD(&fl->bufs);
+ INIT_HLIST_NODE(&fl->hn);
+ fl->tgid = current->tgid;
+ fl->apps = me;
+ fl->mode = FASTRPC_MODE_SERIAL;
+ fl->cid = -1;
+ filp->private_data = fl;
+ spin_lock(&me->hlock);
+ hlist_add_head(&fl->hn, &me->drivers);
+ spin_unlock(&me->hlock);
+ return 0;
+}
+
static int fastrpc_get_info(struct fastrpc_file *fl, uint32_t *info)
{
int err = 0;
+ uint32_t cid;
- VERIFY(err, fl && fl->sctx);
+ VERIFY(err, fl != 0);
if (err)
goto bail;
+ if (fl->cid == -1) {
+ cid = *info;
+ VERIFY(err, cid < NUM_CHANNELS);
+ if (err)
+ goto bail;
+ fl->cid = cid;
+ fl->ssrcount = fl->apps->channel[cid].ssrcount;
+ VERIFY(err, !fastrpc_session_alloc_locked(
+ &fl->apps->channel[cid], 0, &fl->sctx));
+ if (err)
+ goto bail;
+ }
*info = (fl->sctx->smmu.enabled ? 1 : 0);
bail:
return err;
@@ -2487,6 +2506,9 @@ static long fastrpc_device_ioctl(struct file *file, unsigned int ioctl_num,
goto bail;
break;
case FASTRPC_IOCTL_GETINFO:
+ VERIFY(err, 0 == copy_from_user(&info, param, sizeof(info)));
+ if (err)
+ goto bail;
VERIFY(err, 0 == (err = fastrpc_get_info(fl, &info)));
if (err)
goto bail;
@@ -2802,6 +2824,7 @@ static struct platform_driver fastrpc_driver = {
static int __init fastrpc_device_init(void)
{
struct fastrpc_apps *me = &gfa;
+ struct device *dev = 0;
int err = 0, i;
memset(me, 0, sizeof(*me));
@@ -2818,7 +2841,7 @@ static int __init fastrpc_device_init(void)
cdev_init(&me->cdev, &fops);
me->cdev.owner = THIS_MODULE;
VERIFY(err, 0 == cdev_add(&me->cdev, MKDEV(MAJOR(me->dev_no), 0),
- NUM_CHANNELS));
+ 1));
if (err)
goto cdev_init_bail;
me->class = class_create(THIS_MODULE, "fastrpc");
@@ -2826,15 +2849,14 @@ static int __init fastrpc_device_init(void)
if (err)
goto class_create_bail;
me->compat = (NULL == fops.compat_ioctl) ? 0 : 1;
+ dev = device_create(me->class, NULL,
+ MKDEV(MAJOR(me->dev_no), 0),
+ NULL, gcinfo[0].name);
+ VERIFY(err, !IS_ERR_OR_NULL(dev));
+ if (err)
+ goto device_create_bail;
for (i = 0; i < NUM_CHANNELS; i++) {
- if (!gcinfo[i].name)
- continue;
- me->channel[i].dev = device_create(me->class, NULL,
- MKDEV(MAJOR(me->dev_no), i),
- NULL, gcinfo[i].name);
- VERIFY(err, !IS_ERR(me->channel[i].dev));
- if (err)
- goto device_create_bail;
+ me->channel[i].dev = dev;
me->channel[i].ssrcount = 0;
me->channel[i].prevssrcount = 0;
me->channel[i].ramdumpenabled = 0;
@@ -2853,12 +2875,12 @@ static int __init fastrpc_device_init(void)
return 0;
device_create_bail:
for (i = 0; i < NUM_CHANNELS; i++) {
- if (IS_ERR_OR_NULL(me->channel[i].dev))
- continue;
- device_destroy(me->class, MKDEV(MAJOR(me->dev_no), i));
- subsys_notif_unregister_notifier(me->channel[i].handle,
- &me->channel[i].nb);
+ if (me->channel[i].handle)
+ subsys_notif_unregister_notifier(me->channel[i].handle,
+ &me->channel[i].nb);
}
+ if (!IS_ERR_OR_NULL(dev))
+ device_destroy(me->class, MKDEV(MAJOR(me->dev_no), 0));
class_destroy(me->class);
class_create_bail:
cdev_del(&me->cdev);
diff --git a/drivers/char/adsprpc_compat.c b/drivers/char/adsprpc_compat.c
index f7e84dd55606..fcd6d1142618 100644
--- a/drivers/char/adsprpc_compat.c
+++ b/drivers/char/adsprpc_compat.c
@@ -391,6 +391,10 @@ long compat_fastrpc_device_ioctl(struct file *filp, unsigned int cmd,
sizeof(*info))));
if (err)
return -EFAULT;
+ err = get_user(u, info32);
+ err |= put_user(u, info);
+ if (err)
+ return err;
ret = filp->f_op->unlocked_ioctl(filp, FASTRPC_IOCTL_GETINFO,
(unsigned long)info);
if (ret)