/* Flag if dsp attributes are cached */
        bool valid_attributes;
        u32 dsp_attributes[FASTRPC_MAX_DSP_ATTRIBUTES];
+       struct fastrpc_device *secure_fdevice;
        struct fastrpc_device *fdevice;
+       bool secure;
 };
 
 struct fastrpc_device {
        struct fastrpc_channel_ctx *cctx;
        struct miscdevice miscdev;
+       bool secure;
 };
 
 struct fastrpc_user {
                return -EFAULT;
 
        /* create SMMU mapping */
-       err = fastrpc_map_create(fl, req.fd, req.length, &map);
+       err = fastrpc_map_create(fl, req.fd, req.length, 0, &map);
        if (err) {
                dev_err(dev, "failed to map buffer, fd = %d\n", req.fd);
                return err;
 };
 
 static int fastrpc_device_register(struct device *dev, struct fastrpc_channel_ctx *cctx,
-                                  const char *domain)
+                                  bool is_secured, const char *domain)
 {
        struct fastrpc_device *fdev;
        int err;
        if (!fdev)
                return -ENOMEM;
 
+       fdev->secure = is_secured;
        fdev->cctx = cctx;
        fdev->miscdev.minor = MISC_DYNAMIC_MINOR;
        fdev->miscdev.fops = &fastrpc_fops;
-       fdev->miscdev.name = devm_kasprintf(dev, GFP_KERNEL, "fastrpc-%s", domain);
+       fdev->miscdev.name = devm_kasprintf(dev, GFP_KERNEL, "fastrpc-%s%s",
+                                           domain, is_secured ? "-secure" : "");
        err = misc_register(&fdev->miscdev);
-       if (!err)
-               cctx->fdevice = fdev;
+       if (!err) {
+               if (is_secured)
+                       cctx->secure_fdevice = fdev;
+               else
+                       cctx->fdevice = fdev;
+       }
 
        return err;
 }
        struct fastrpc_channel_ctx *data;
        int i, err, domain_id = -1;
        const char *domain;
+       bool secure_dsp;
 
        err = of_property_read_string(rdev->of_node, "label", &domain);
        if (err) {
        if (!data)
                return -ENOMEM;
 
-       err = fastrpc_device_register(rdev, data, domains[domain_id]);
-       if (err) {
-               kfree(data);
-               return err;
+
+       secure_dsp = !(of_property_read_bool(rdev->of_node, "qcom,non-secure-domain"));
+       data->secure = secure_dsp;
+
+       switch (domain_id) {
+       case ADSP_DOMAIN_ID:
+       case MDSP_DOMAIN_ID:
+       case SDSP_DOMAIN_ID:
+               err = fastrpc_device_register(rdev, data, secure_dsp, domains[domain_id]);
+               if (err)
+                       goto fdev_error;
+               break;
+       case CDSP_DOMAIN_ID:
+               /* Create both device nodes so that we can allow both Signed and Unsigned PD */
+               err = fastrpc_device_register(rdev, data, true, domains[domain_id]);
+               if (err)
+                       goto fdev_error;
+
+               err = fastrpc_device_register(rdev, data, false, domains[domain_id]);
+               if (err)
+                       goto fdev_error;
+               break;
+       default:
+               err = -EINVAL;
+               goto fdev_error;
        }
 
        kref_init(&data->refcount);
        data->rpdev = rpdev;
 
        return of_platform_populate(rdev->of_node, NULL, NULL, rdev);
+fdev_error:
+       kfree(data);
+       return err;
 }
 
 static void fastrpc_notify_users(struct fastrpc_user *user)
        if (cctx->fdevice)
                misc_deregister(&cctx->fdevice->miscdev);
 
+       if (cctx->secure_fdevice)
+               misc_deregister(&cctx->secure_fdevice->miscdev);
+
        of_platform_depopulate(&rpdev->dev);
 
        cctx->rpdev = NULL;