From patchwork Fri Oct 1 10:12:28 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arnaud Pouliquen X-Patchwork-Id: 12530243 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id D57D2C433F5 for ; Fri, 1 Oct 2021 10:12:55 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id B717361A81 for ; Fri, 1 Oct 2021 10:12:55 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1353468AbhJAKOi (ORCPT ); Fri, 1 Oct 2021 06:14:38 -0400 Received: from mx07-00178001.pphosted.com ([185.132.182.106]:45714 "EHLO mx07-00178001.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1353454AbhJAKOi (ORCPT ); Fri, 1 Oct 2021 06:14:38 -0400 Received: from pps.filterd (m0046668.ppops.net [127.0.0.1]) by mx07-00178001.pphosted.com (8.16.1.2/8.16.1.2) with SMTP id 1918RG1U001404; Fri, 1 Oct 2021 12:12:45 +0200 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=foss.st.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-type; s=selector1; bh=1ScxvjHigUPw1A6oSV9FAGfkRH4qQlq4DRQ/9hNoelA=; b=0TUT2crj/7Jpd/91OQKoR6Ji+4OMKnsJPICleWmE6Zmdn+dhSNAYEaekZzTOiI2zw+tv QrSgfkA9ppTuT+OMKw5YilEoXcmaWE9cg0rh59qgCM7/xgcy9zdc9pXBcaQcVtapStW8 rZKYCbf9WuLubEgEgKvJxMSLKLczPyleWOPP2LDTb1RdQpGefKfas5Rmc5msvThOpJV7 glwfQS0PENTT2FkOLrN9t0/G32OjUSBzcenQbMiBNQzvXN7UgAPw3+GPZ91+Dd/KdgIf K5fv3/7e/tM3aAGgVhAOTBHzQBSgYaD4f9qiMmH4aIp8mgnaeb5RODtmnP0wUqT1kO6V dg== Received: from beta.dmz-eu.st.com (beta.dmz-eu.st.com [164.129.1.35]) by mx07-00178001.pphosted.com with ESMTP id 3bds9njb4u-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 01 Oct 2021 12:12:45 +0200 Received: from euls16034.sgp.st.com (euls16034.sgp.st.com [10.75.44.20]) by beta.dmz-eu.st.com (STMicroelectronics) with ESMTP id B562A100038; Fri, 1 Oct 2021 12:12:44 +0200 (CEST) Received: from Webmail-eu.st.com (sfhdag2node2.st.com [10.75.127.5]) by euls16034.sgp.st.com (STMicroelectronics) with ESMTP id AC735226FDD; Fri, 1 Oct 2021 12:12:44 +0200 (CEST) Received: from localhost (10.75.127.51) by SFHDAG2NODE2.st.com (10.75.127.5) with Microsoft SMTP Server (TLS) id 15.0.1497.18; Fri, 1 Oct 2021 12:12:44 +0200 From: Arnaud Pouliquen To: Bjorn Andersson , Ohad Ben-Cohen , Mathieu Poirier CC: , , , Rob Herring , Christoph Hellwig , Stefano Stabellini , Bruce Ashfield , Subject: [RFC PATCH 1/7] remoteproc: core: Introduce virtio device add/remove functions Date: Fri, 1 Oct 2021 12:12:28 +0200 Message-ID: <20211001101234.4247-2-arnaud.pouliquen@foss.st.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20211001101234.4247-1-arnaud.pouliquen@foss.st.com> References: <20211001101234.4247-1-arnaud.pouliquen@foss.st.com> MIME-Version: 1.0 X-Originating-IP: [10.75.127.51] X-ClientProxiedBy: SFHDAG2NODE3.st.com (10.75.127.6) To SFHDAG2NODE2.st.com (10.75.127.5) X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.182.1,Aquarius:18.0.790,Hydra:6.0.391,FMLib:17.0.607.475 definitions=2021-10-01_01,2021-09-30_01,2020-04-07_01 Precedence: bulk List-ID: X-Mailing-List: linux-remoteproc@vger.kernel.org In preparation of the migration of the management of rvdev in rproc_virtio, this patch spins off new functions to manage the remoteproc virtio device. The rproc_rvdev_add_device and rproc_rvdev_remove_device will be moved to remoteproc_virtio. In addition the rproc_register_rvdev and rproc_unregister_rvdev is created as it will be exported (used in rproc_rvdev_add_device and rproc_rvdev_remove_device functions). Signed-off-by: Arnaud Pouliquen --- drivers/remoteproc/remoteproc_core.c | 102 ++++++++++++++++++--------- 1 file changed, 67 insertions(+), 35 deletions(-) diff --git a/drivers/remoteproc/remoteproc_core.c b/drivers/remoteproc/remoteproc_core.c index 502b6604b757..7c783ca291a7 100644 --- a/drivers/remoteproc/remoteproc_core.c +++ b/drivers/remoteproc/remoteproc_core.c @@ -484,6 +484,69 @@ static int copy_dma_range_map(struct device *to, struct device *from) return 0; } +static void rproc_register_rvdev(struct rproc_vdev *rvdev) +{ + if (rvdev && rvdev->rproc) + list_add_tail(&rvdev->node, &rvdev->rproc->rvdevs); +} + +static void rproc_unregister_rvdev(struct rproc_vdev *rvdev) +{ + if (rvdev) + list_del(&rvdev->node); +} + +static int rproc_rvdev_add_device(struct rproc_vdev *rvdev) +{ + struct rproc *rproc = rvdev->rproc; + char name[16]; + int ret; + + snprintf(name, sizeof(name), "vdev%dbuffer", rvdev->index); + rvdev->dev.parent = &rproc->dev; + ret = copy_dma_range_map(&rvdev->dev, rproc->dev.parent); + if (ret) + return ret; + + rvdev->dev.release = rproc_rvdev_release; + dev_set_name(&rvdev->dev, "%s#%s", dev_name(rvdev->dev.parent), name); + dev_set_drvdata(&rvdev->dev, rvdev); + + ret = device_register(&rvdev->dev); + if (ret) { + put_device(&rvdev->dev); + return ret; + } + /* Make device dma capable by inheriting from parent's capabilities */ + set_dma_ops(&rvdev->dev, get_dma_ops(rproc->dev.parent)); + + ret = dma_coerce_mask_and_coherent(&rvdev->dev, + dma_get_mask(rproc->dev.parent)); + if (ret) { + dev_warn(&rvdev->dev, + "Failed to set DMA mask %llx. Trying to continue... %x\n", + dma_get_mask(rproc->dev.parent), ret); + } + + rproc_register_rvdev(rvdev); + + rvdev->subdev.start = rproc_vdev_do_start; + rvdev->subdev.stop = rproc_vdev_do_stop; + + rproc_add_subdev(rproc, &rvdev->subdev); + + return 0; +} + +static void rproc_rvdev_remove_device(struct rproc_vdev *rvdev) +{ + struct rproc *rproc = rvdev->rproc; + + rproc_remove_subdev(rproc, &rvdev->subdev); + rproc_unregister_rvdev(rvdev); + device_unregister(&rvdev->dev); +} + /** * rproc_handle_vdev() - handle a vdev fw resource * @rproc: the remote processor @@ -519,7 +582,6 @@ static int rproc_handle_vdev(struct rproc *rproc, void *ptr, struct device *dev = &rproc->dev; struct rproc_vdev *rvdev; int i, ret; - char name[16]; /* make sure resource isn't truncated */ if (struct_size(rsc, vring, rsc->num_of_vrings) + rsc->config_len > @@ -551,33 +613,13 @@ static int rproc_handle_vdev(struct rproc *rproc, void *ptr, rvdev->id = rsc->id; rvdev->rproc = rproc; - rvdev->index = rproc->nb_vdev++; + rvdev->index = rproc->nb_vdev; - /* Initialise vdev subdevice */ - snprintf(name, sizeof(name), "vdev%dbuffer", rvdev->index); - rvdev->dev.parent = &rproc->dev; - ret = copy_dma_range_map(&rvdev->dev, rproc->dev.parent); + ret = rproc_rvdev_add_device(rvdev); if (ret) return ret; - rvdev->dev.release = rproc_rvdev_release; - dev_set_name(&rvdev->dev, "%s#%s", dev_name(rvdev->dev.parent), name); - dev_set_drvdata(&rvdev->dev, rvdev); - ret = device_register(&rvdev->dev); - if (ret) { - put_device(&rvdev->dev); - return ret; - } - /* Make device dma capable by inheriting from parent's capabilities */ - set_dma_ops(&rvdev->dev, get_dma_ops(rproc->dev.parent)); - - ret = dma_coerce_mask_and_coherent(&rvdev->dev, - dma_get_mask(rproc->dev.parent)); - if (ret) { - dev_warn(dev, - "Failed to set DMA mask %llx. Trying to continue... %x\n", - dma_get_mask(rproc->dev.parent), ret); - } + rproc->nb_vdev++; /* parse the vrings */ for (i = 0; i < rsc->num_of_vrings; i++) { @@ -596,13 +638,6 @@ static int rproc_handle_vdev(struct rproc *rproc, void *ptr, goto unwind_vring_allocations; } - list_add_tail(&rvdev->node, &rproc->rvdevs); - - rvdev->subdev.start = rproc_vdev_do_start; - rvdev->subdev.stop = rproc_vdev_do_stop; - - rproc_add_subdev(rproc, &rvdev->subdev); - return 0; unwind_vring_allocations: @@ -617,7 +652,6 @@ void rproc_vdev_release(struct kref *ref) { struct rproc_vdev *rvdev = container_of(ref, struct rproc_vdev, refcount); struct rproc_vring *rvring; - struct rproc *rproc = rvdev->rproc; int id; for (id = 0; id < ARRAY_SIZE(rvdev->vring); id++) { @@ -625,9 +659,7 @@ void rproc_vdev_release(struct kref *ref) rproc_free_vring(rvring); } - rproc_remove_subdev(rproc, &rvdev->subdev); - list_del(&rvdev->node); - device_unregister(&rvdev->dev); + rproc_rvdev_remove_device(rvdev); } /** From patchwork Fri Oct 1 10:12:29 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arnaud Pouliquen X-Patchwork-Id: 12530253 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 7889FC433EF for ; Fri, 1 Oct 2021 10:15:03 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 50CC461A81 for ; Fri, 1 Oct 2021 10:15:03 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1353541AbhJAKQq (ORCPT ); Fri, 1 Oct 2021 06:16:46 -0400 Received: from mx07-00178001.pphosted.com ([185.132.182.106]:59220 "EHLO mx07-00178001.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1353543AbhJAKQn (ORCPT ); Fri, 1 Oct 2021 06:16:43 -0400 Received: from pps.filterd (m0241204.ppops.net [127.0.0.1]) by mx07-00178001.pphosted.com (8.16.1.2/8.16.1.2) with SMTP id 1916jY5b023300; Fri, 1 Oct 2021 12:12:53 +0200 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=foss.st.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-type; s=selector1; bh=oDnzOxeAClL1cqWNdYr1JKKaDCCCduqwrOwXRoLdFfQ=; b=YfZhgQfZ0ViCTJPMChj2rwSSS8Eeim4+1KskYHNML55CeLIj5frp7IyohNAK+QdsCfZW 8zL30Wv6MhV0r6hZeZlyRJrAK/0kQuGKB0TAnYqVkFSwFBfY8rrzjzUGswz24IDG/fiy xYTgLQOkBg/LtmgSHNI4cLCVmGP4eimIBZL0CYzyXtIGtKNTx5F0i3/5uB5Cn+J9/TwH dwP8NYNdAnkstf4HGiSFEmo/PQ9aBBAA2Cz1tXJl/1k9J647BElUFhFlbOh03ZwXLH68 e64pSsV1QF1xjRVz3Fywn1k5Y+amhgFoRUtkg0cqJtL/1O2/QKnXPiHCL2ayOXHHxHyl tw== Received: from beta.dmz-eu.st.com (beta.dmz-eu.st.com [164.129.1.35]) by mx07-00178001.pphosted.com with ESMTP id 3bdwbjh775-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 01 Oct 2021 12:12:53 +0200 Received: from euls16034.sgp.st.com (euls16034.sgp.st.com [10.75.44.20]) by beta.dmz-eu.st.com (STMicroelectronics) with ESMTP id AA8F910002A; Fri, 1 Oct 2021 12:12:45 +0200 (CEST) Received: from Webmail-eu.st.com (sfhdag2node2.st.com [10.75.127.5]) by euls16034.sgp.st.com (STMicroelectronics) with ESMTP id A0796226FDD; Fri, 1 Oct 2021 12:12:45 +0200 (CEST) Received: from localhost (10.75.127.48) by SFHDAG2NODE2.st.com (10.75.127.5) with Microsoft SMTP Server (TLS) id 15.0.1497.18; Fri, 1 Oct 2021 12:12:45 +0200 From: Arnaud Pouliquen To: Bjorn Andersson , Ohad Ben-Cohen , Mathieu Poirier CC: , , , Rob Herring , Christoph Hellwig , Stefano Stabellini , Bruce Ashfield , Subject: [RFC PATCH 2/7] remoteproc: Move rvdev management in rproc_virtio Date: Fri, 1 Oct 2021 12:12:29 +0200 Message-ID: <20211001101234.4247-3-arnaud.pouliquen@foss.st.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20211001101234.4247-1-arnaud.pouliquen@foss.st.com> References: <20211001101234.4247-1-arnaud.pouliquen@foss.st.com> MIME-Version: 1.0 X-Originating-IP: [10.75.127.48] X-ClientProxiedBy: SFHDAG1NODE2.st.com (10.75.127.2) To SFHDAG2NODE2.st.com (10.75.127.5) X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.182.1,Aquarius:18.0.790,Hydra:6.0.391,FMLib:17.0.607.475 definitions=2021-10-01_01,2021-10-01_01,2020-04-07_01 Precedence: bulk List-ID: X-Mailing-List: linux-remoteproc@vger.kernel.org Move functions related to the management of the rproc_vdev structure in the remoteproc virtio. The aim is to decorrelate as possible the virtio management form the core part. Due to the strong correlation between the vrings and the resource table the vrings management is kept in the remoteproc core. Signed-off-by: Arnaud Pouliquen --- drivers/remoteproc/remoteproc_core.c | 127 ----------------------- drivers/remoteproc/remoteproc_internal.h | 19 +++- drivers/remoteproc/remoteproc_virtio.c | 121 ++++++++++++++++++++- 3 files changed, 134 insertions(+), 133 deletions(-) diff --git a/drivers/remoteproc/remoteproc_core.c b/drivers/remoteproc/remoteproc_core.c index 7c783ca291a7..67ccd088db8f 100644 --- a/drivers/remoteproc/remoteproc_core.c +++ b/drivers/remoteproc/remoteproc_core.c @@ -434,119 +434,6 @@ void rproc_free_vring(struct rproc_vring *rvring) } } -static int rproc_vdev_do_start(struct rproc_subdev *subdev) -{ - struct rproc_vdev *rvdev = container_of(subdev, struct rproc_vdev, subdev); - - return rproc_add_virtio_dev(rvdev, rvdev->id); -} - -static void rproc_vdev_do_stop(struct rproc_subdev *subdev, bool crashed) -{ - struct rproc_vdev *rvdev = container_of(subdev, struct rproc_vdev, subdev); - int ret; - - ret = device_for_each_child(&rvdev->dev, NULL, rproc_remove_virtio_dev); - if (ret) - dev_warn(&rvdev->dev, "can't remove vdev child device: %d\n", ret); -} - -/** - * rproc_rvdev_release() - release the existence of a rvdev - * - * @dev: the subdevice's dev - */ -static void rproc_rvdev_release(struct device *dev) -{ - struct rproc_vdev *rvdev = container_of(dev, struct rproc_vdev, dev); - - of_reserved_mem_device_release(dev); - - kfree(rvdev); -} - -static int copy_dma_range_map(struct device *to, struct device *from) -{ - const struct bus_dma_region *map = from->dma_range_map, *new_map, *r; - int num_ranges = 0; - - if (!map) - return 0; - - for (r = map; r->size; r++) - num_ranges++; - - new_map = kmemdup(map, array_size(num_ranges + 1, sizeof(*map)), - GFP_KERNEL); - if (!new_map) - return -ENOMEM; - to->dma_range_map = new_map; - return 0; -} - -static void rproc_register_rvdev(struct rproc_vdev *rvdev) -{ - if (rvdev && rvdev->rproc) - list_add_tail(&rvdev->node, &rvdev->rproc->rvdevs); -} - -static void rproc_unregister_rvdev(struct rproc_vdev *rvdev) -{ - if (rvdev) - list_del(&rvdev->node); -} - -static int rproc_rvdev_add_device(struct rproc_vdev *rvdev) -{ - struct rproc *rproc = rvdev->rproc; - char name[16]; - int ret; - - snprintf(name, sizeof(name), "vdev%dbuffer", rvdev->index); - rvdev->dev.parent = &rproc->dev; - ret = copy_dma_range_map(&rvdev->dev, rproc->dev.parent); - if (ret) - return ret; - - rvdev->dev.release = rproc_rvdev_release; - dev_set_name(&rvdev->dev, "%s#%s", dev_name(rvdev->dev.parent), name); - dev_set_drvdata(&rvdev->dev, rvdev); - - ret = device_register(&rvdev->dev); - if (ret) { - put_device(&rvdev->dev); - return ret; - } - /* Make device dma capable by inheriting from parent's capabilities */ - set_dma_ops(&rvdev->dev, get_dma_ops(rproc->dev.parent)); - - ret = dma_coerce_mask_and_coherent(&rvdev->dev, - dma_get_mask(rproc->dev.parent)); - if (ret) { - dev_warn(&rvdev->dev, - "Failed to set DMA mask %llx. Trying to continue... %x\n", - dma_get_mask(rproc->dev.parent), ret); - } - - rproc_register_rvdev(rvdev); - - rvdev->subdev.start = rproc_vdev_do_start; - rvdev->subdev.stop = rproc_vdev_do_stop; - - rproc_add_subdev(rproc, &rvdev->subdev); - - return 0; -} - -static void rproc_rvdev_remove_device(struct rproc_vdev *rvdev) -{ - struct rproc *rproc = rvdev->rproc; - - rproc_remove_subdev(rproc, &rvdev->subdev); - rproc_unregister_rvdev(rvdev); - device_unregister(&rvdev->dev); -} - /** * rproc_handle_vdev() - handle a vdev fw resource * @rproc: the remote processor @@ -648,20 +535,6 @@ static int rproc_handle_vdev(struct rproc *rproc, void *ptr, return ret; } -void rproc_vdev_release(struct kref *ref) -{ - struct rproc_vdev *rvdev = container_of(ref, struct rproc_vdev, refcount); - struct rproc_vring *rvring; - int id; - - for (id = 0; id < ARRAY_SIZE(rvdev->vring); id++) { - rvring = &rvdev->vring[id]; - rproc_free_vring(rvring); - } - - rproc_rvdev_remove_device(rvdev); -} - /** * rproc_handle_trace() - handle a shared trace buffer resource * @rproc: the remote processor diff --git a/drivers/remoteproc/remoteproc_internal.h b/drivers/remoteproc/remoteproc_internal.h index a328e634b1de..152fe2e8668a 100644 --- a/drivers/remoteproc/remoteproc_internal.h +++ b/drivers/remoteproc/remoteproc_internal.h @@ -26,14 +26,13 @@ struct rproc_debug_trace { /* from remoteproc_core.c */ void rproc_release(struct kref *kref); -irqreturn_t rproc_vq_interrupt(struct rproc *rproc, int vq_id); -void rproc_vdev_release(struct kref *ref); int rproc_of_parse_firmware(struct device *dev, int index, const char **fw_name); /* from remoteproc_virtio.c */ -int rproc_add_virtio_dev(struct rproc_vdev *rvdev, int id); -int rproc_remove_virtio_dev(struct device *dev, void *data); +int rproc_rvdev_add_device(struct rproc_vdev *rvdev); +irqreturn_t rproc_vq_interrupt(struct rproc *rproc, int vq_id); +void rproc_vdev_release(struct kref *ref); /* from remoteproc_debugfs.c */ void rproc_remove_trace_file(struct dentry *tfile); @@ -196,4 +195,16 @@ bool rproc_u64_fit_in_size_t(u64 val) return (val <= (size_t) -1); } +static inline void rproc_register_rvdev(struct rproc_vdev *rvdev) +{ + if (rvdev && rvdev->rproc) + list_add_tail(&rvdev->node, &rvdev->rproc->rvdevs); +} + +static inline void rproc_unregister_rvdev(struct rproc_vdev *rvdev) +{ + if (rvdev) + list_del(&rvdev->node); +} + #endif /* REMOTEPROC_INTERNAL_H */ diff --git a/drivers/remoteproc/remoteproc_virtio.c b/drivers/remoteproc/remoteproc_virtio.c index cf4d54e98e6a..5e5a78b3243f 100644 --- a/drivers/remoteproc/remoteproc_virtio.c +++ b/drivers/remoteproc/remoteproc_virtio.c @@ -9,7 +9,9 @@ * Brian Swetland */ +#include #include +#include #include #include #include @@ -23,6 +25,25 @@ #include "remoteproc_internal.h" +static int copy_dma_range_map(struct device *to, struct device *from) +{ + const struct bus_dma_region *map = from->dma_range_map, *new_map, *r; + int num_ranges = 0; + + if (!map) + return 0; + + for (r = map; r->size; r++) + num_ranges++; + + new_map = kmemdup(map, array_size(num_ranges + 1, sizeof(*map)), + GFP_KERNEL); + if (!new_map) + return -ENOMEM; + to->dma_range_map = new_map; + return 0; +} + /* kick the remote processor, and let it know which virtqueue to poke at */ static bool rproc_virtio_notify(struct virtqueue *vq) { @@ -327,7 +348,7 @@ static void rproc_virtio_dev_release(struct device *dev) * * Return: 0 on success or an appropriate error value otherwise */ -int rproc_add_virtio_dev(struct rproc_vdev *rvdev, int id) +static int rproc_add_virtio_dev(struct rproc_vdev *rvdev, int id) { struct rproc *rproc = rvdev->rproc; struct device *dev = &rvdev->dev; @@ -435,10 +456,106 @@ int rproc_add_virtio_dev(struct rproc_vdev *rvdev, int id) * * Return: 0 */ -int rproc_remove_virtio_dev(struct device *dev, void *data) +static int rproc_remove_virtio_dev(struct device *dev, void *data) { struct virtio_device *vdev = dev_to_virtio(dev); unregister_virtio_device(vdev); return 0; } + +static int rproc_vdev_do_start(struct rproc_subdev *subdev) +{ + struct rproc_vdev *rvdev = container_of(subdev, struct rproc_vdev, subdev); + + return rproc_add_virtio_dev(rvdev, rvdev->id); +} + +static void rproc_vdev_do_stop(struct rproc_subdev *subdev, bool crashed) +{ + struct rproc_vdev *rvdev = container_of(subdev, struct rproc_vdev, subdev); + int ret; + + ret = device_for_each_child(&rvdev->dev, NULL, rproc_remove_virtio_dev); + if (ret) + dev_warn(&rvdev->dev, "can't remove vdev child device: %d\n", ret); +} + +/** + * rproc_rvdev_release() - release the existence of a rvdev + * + * @dev: the subdevice's dev + */ +static void rproc_rvdev_release(struct device *dev) +{ + struct rproc_vdev *rvdev = container_of(dev, struct rproc_vdev, dev); + + of_reserved_mem_device_release(dev); + + kfree(rvdev); +} + +int rproc_rvdev_add_device(struct rproc_vdev *rvdev) +{ + struct rproc *rproc = rvdev->rproc; + char name[16]; + int ret; + + snprintf(name, sizeof(name), "vdev%dbuffer", rvdev->index); + rvdev->dev.parent = &rproc->dev; + ret = copy_dma_range_map(&rvdev->dev, rproc->dev.parent); + if (ret) + return ret; + + rvdev->dev.release = rproc_rvdev_release; + dev_set_name(&rvdev->dev, "%s#%s", dev_name(rvdev->dev.parent), name); + dev_set_drvdata(&rvdev->dev, rvdev); + + ret = device_register(&rvdev->dev); + if (ret) { + put_device(&rvdev->dev); + return ret; + } + /* Make device dma capable by inheriting from parent's capabilities */ + set_dma_ops(&rvdev->dev, get_dma_ops(rproc->dev.parent)); + + ret = dma_coerce_mask_and_coherent(&rvdev->dev, + dma_get_mask(rproc->dev.parent)); + if (ret) { + dev_warn(&rvdev->dev, + "Failed to set DMA mask %llx. Trying to continue... %x\n", + dma_get_mask(rproc->dev.parent), ret); + } + + rproc_register_rvdev(rvdev); + + rvdev->subdev.start = rproc_vdev_do_start; + rvdev->subdev.stop = rproc_vdev_do_stop; + + rproc_add_subdev(rproc, &rvdev->subdev); + + return 0; +} + +static void rproc_rvdev_remove_device(struct rproc_vdev *rvdev) +{ + struct rproc *rproc = rvdev->rproc; + + rproc_remove_subdev(rproc, &rvdev->subdev); + rproc_unregister_rvdev(rvdev); + device_unregister(&rvdev->dev); +} + +void rproc_vdev_release(struct kref *ref) +{ + struct rproc_vdev *rvdev = container_of(ref, struct rproc_vdev, refcount); + struct rproc_vring *rvring; + int id; + + for (id = 0; id < ARRAY_SIZE(rvdev->vring); id++) { + rvring = &rvdev->vring[id]; + rproc_free_vring(rvring); + } + + rproc_rvdev_remove_device(rvdev); +} From patchwork Fri Oct 1 10:12:30 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arnaud Pouliquen X-Patchwork-Id: 12530245 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id D2461C433EF for ; Fri, 1 Oct 2021 10:12:58 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id B67D461A58 for ; Fri, 1 Oct 2021 10:12:58 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1353477AbhJAKOj (ORCPT ); Fri, 1 Oct 2021 06:14:39 -0400 Received: from mx07-00178001.pphosted.com ([185.132.182.106]:45712 "EHLO mx07-00178001.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1353453AbhJAKOi (ORCPT ); Fri, 1 Oct 2021 06:14:38 -0400 Received: from pps.filterd (m0046668.ppops.net [127.0.0.1]) by mx07-00178001.pphosted.com (8.16.1.2/8.16.1.2) with SMTP id 1918NLNV032017; Fri, 1 Oct 2021 12:12:47 +0200 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=foss.st.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-type; s=selector1; bh=zRbhdB+toguxYDHOMlJ+jXPLzLlUhANjFvRiywkPkb8=; b=mneJCka3x2IWFOG0/vFtYVRITDdvIUaq3obZnm7Xz30bcXx1B5ruveRKmAnCXVJKnez+ e9sVwfuY1NwfTTivUuzjR91YxkknH4EpST4H2jXSLpYLJP+aCvGK1FVruD0b3pWObO97 4vXlBhu2d+1zFlQmfuNWUIUdEZbBAYbm7LXx5E2IrSsPZBQt/imSjXgCP5TFx5VoAVnW sDsEhiELnJoFHE/FiKXL+7uJril/ekgJypJics+ZW+wRDiY1Zsgt13QJfIhtf6XSr6tY Ygs7jbif/wHVnEr5DmJNwfqvFW4pBtbIVXeaeVZgAgJvM15gjWHWCAp7np9uxg0XG20/ Xg== Received: from beta.dmz-eu.st.com (beta.dmz-eu.st.com [164.129.1.35]) by mx07-00178001.pphosted.com with ESMTP id 3bds9njb50-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 01 Oct 2021 12:12:46 +0200 Received: from euls16034.sgp.st.com (euls16034.sgp.st.com [10.75.44.20]) by beta.dmz-eu.st.com (STMicroelectronics) with ESMTP id 7BB84100034; Fri, 1 Oct 2021 12:12:46 +0200 (CEST) Received: from Webmail-eu.st.com (sfhdag2node2.st.com [10.75.127.5]) by euls16034.sgp.st.com (STMicroelectronics) with ESMTP id 6FDCE226FDD; Fri, 1 Oct 2021 12:12:46 +0200 (CEST) Received: from localhost (10.75.127.51) by SFHDAG2NODE2.st.com (10.75.127.5) with Microsoft SMTP Server (TLS) id 15.0.1497.18; Fri, 1 Oct 2021 12:12:45 +0200 From: Arnaud Pouliquen To: Bjorn Andersson , Ohad Ben-Cohen , Mathieu Poirier CC: , , , Rob Herring , Christoph Hellwig , Stefano Stabellini , Bruce Ashfield , Subject: [RFC PATCH 3/7] remoteproc: Remove vdev_to_rvdev and vdev_to_rproc from remoteproc API Date: Fri, 1 Oct 2021 12:12:30 +0200 Message-ID: <20211001101234.4247-4-arnaud.pouliquen@foss.st.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20211001101234.4247-1-arnaud.pouliquen@foss.st.com> References: <20211001101234.4247-1-arnaud.pouliquen@foss.st.com> MIME-Version: 1.0 X-Originating-IP: [10.75.127.51] X-ClientProxiedBy: SFHDAG2NODE1.st.com (10.75.127.4) To SFHDAG2NODE2.st.com (10.75.127.5) X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.182.1,Aquarius:18.0.790,Hydra:6.0.391,FMLib:17.0.607.475 definitions=2021-10-01_01,2021-09-30_01,2020-04-07_01 Precedence: bulk List-ID: X-Mailing-List: linux-remoteproc@vger.kernel.org These both functions are only used by the remoteproc_virtio. There is no reason to expose them in the API. Move the functions in remoteproc_virtio.c Signed-off-by: Arnaud Pouliquen --- drivers/remoteproc/remoteproc_virtio.c | 12 ++++++++++++ include/linux/remoteproc.h | 12 ------------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/drivers/remoteproc/remoteproc_virtio.c b/drivers/remoteproc/remoteproc_virtio.c index 5e5a78b3243f..c9eecd2f9fb2 100644 --- a/drivers/remoteproc/remoteproc_virtio.c +++ b/drivers/remoteproc/remoteproc_virtio.c @@ -25,6 +25,18 @@ #include "remoteproc_internal.h" +static struct rproc_vdev *vdev_to_rvdev(struct virtio_device *vdev) +{ + return container_of(vdev->dev.parent, struct rproc_vdev, dev); +} + +static struct rproc *vdev_to_rproc(struct virtio_device *vdev) +{ + struct rproc_vdev *rvdev = vdev_to_rvdev(vdev); + + return rvdev->rproc; +} + static int copy_dma_range_map(struct device *to, struct device *from) { const struct bus_dma_region *map = from->dma_range_map, *new_map, *r; diff --git a/include/linux/remoteproc.h b/include/linux/remoteproc.h index 83c09ac36b13..e0600e1e5c17 100644 --- a/include/linux/remoteproc.h +++ b/include/linux/remoteproc.h @@ -684,18 +684,6 @@ int rproc_coredump_add_custom_segment(struct rproc *rproc, void *priv); int rproc_coredump_set_elf_info(struct rproc *rproc, u8 class, u16 machine); -static inline struct rproc_vdev *vdev_to_rvdev(struct virtio_device *vdev) -{ - return container_of(vdev->dev.parent, struct rproc_vdev, dev); -} - -static inline struct rproc *vdev_to_rproc(struct virtio_device *vdev) -{ - struct rproc_vdev *rvdev = vdev_to_rvdev(vdev); - - return rvdev->rproc; -} - void rproc_add_subdev(struct rproc *rproc, struct rproc_subdev *subdev); void rproc_remove_subdev(struct rproc *rproc, struct rproc_subdev *subdev); From patchwork Fri Oct 1 10:12:31 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arnaud Pouliquen X-Patchwork-Id: 12530247 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 281BEC433FE for ; Fri, 1 Oct 2021 10:14:54 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 0611661A58 for ; Fri, 1 Oct 2021 10:14:54 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1353513AbhJAKQh (ORCPT ); Fri, 1 Oct 2021 06:16:37 -0400 Received: from mx07-00178001.pphosted.com ([185.132.182.106]:47716 "EHLO mx07-00178001.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1353517AbhJAKQg (ORCPT ); Fri, 1 Oct 2021 06:16:36 -0400 Received: from pps.filterd (m0046668.ppops.net [127.0.0.1]) by mx07-00178001.pphosted.com (8.16.1.2/8.16.1.2) with SMTP id 1918RG1V001404; Fri, 1 Oct 2021 12:12:47 +0200 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=foss.st.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-type; s=selector1; bh=klYlsgXNrX/dEhQFG0PtdrruuCVV1pMU8Q+SHb4aKw4=; b=fSxYlbA0sG2aM8ouZccxZ0mGQGvJRYZDEjs+78o9/nWkru+XxgtM4Ov3Cscuv7GAIS9+ nu5m3XiKsgS688dhX5AH2Qd5gmqQ1IdikWRNQkFM3jIr/IuXk22fedxb2c8Uccfxxzr1 dO4s5hg5qkLbvL6hPBhbYs7kVpO1XDNmFlMUmVGub8x+ToVBFVDUORswr/PMSmq4Wo8L dL1UaN403UeHpWwV6nQdedU0PRaW5V/WUo8593SXqbkuKSzS8bojUIZaq3qG3ELC3t2Y 3DelcD38VOxA1gEcZXAHBOnoyw3e6ypGUYKWPZPx2QcV8zJGu01NT0ChUaYDlzAAoGQU sw== Received: from beta.dmz-eu.st.com (beta.dmz-eu.st.com [164.129.1.35]) by mx07-00178001.pphosted.com with ESMTP id 3bds9njb51-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 01 Oct 2021 12:12:47 +0200 Received: from euls16034.sgp.st.com (euls16034.sgp.st.com [10.75.44.20]) by beta.dmz-eu.st.com (STMicroelectronics) with ESMTP id 3F013100038; Fri, 1 Oct 2021 12:12:47 +0200 (CEST) Received: from Webmail-eu.st.com (sfhdag2node2.st.com [10.75.127.5]) by euls16034.sgp.st.com (STMicroelectronics) with ESMTP id 35C93226FDD; Fri, 1 Oct 2021 12:12:47 +0200 (CEST) Received: from localhost (10.75.127.51) by SFHDAG2NODE2.st.com (10.75.127.5) with Microsoft SMTP Server (TLS) id 15.0.1497.18; Fri, 1 Oct 2021 12:12:46 +0200 From: Arnaud Pouliquen To: Bjorn Andersson , Ohad Ben-Cohen , Mathieu Poirier CC: , , , Rob Herring , Christoph Hellwig , Stefano Stabellini , Bruce Ashfield , Subject: [RFC PATCH 4/7] remoteproc: create the REMOTEPROC_VIRTIO config Date: Fri, 1 Oct 2021 12:12:31 +0200 Message-ID: <20211001101234.4247-5-arnaud.pouliquen@foss.st.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20211001101234.4247-1-arnaud.pouliquen@foss.st.com> References: <20211001101234.4247-1-arnaud.pouliquen@foss.st.com> MIME-Version: 1.0 X-Originating-IP: [10.75.127.51] X-ClientProxiedBy: SFHDAG2NODE3.st.com (10.75.127.6) To SFHDAG2NODE2.st.com (10.75.127.5) X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.182.1,Aquarius:18.0.790,Hydra:6.0.391,FMLib:17.0.607.475 definitions=2021-10-01_01,2021-09-30_01,2020-04-07_01 Precedence: bulk List-ID: X-Mailing-List: linux-remoteproc@vger.kernel.org Create the config to associate to the remoteproc virtio. Notice that the REMOTEPROC_VIRTIO config can not set to m. the reason is that it defines API that is used by the built-in remote proc core. Functions such are rproc_add_virtio_dev can be called during the Linux boot phase. Signed-off-by: Arnaud Pouliquen --- drivers/remoteproc/Kconfig | 11 +++++++++- drivers/remoteproc/Makefile | 2 +- drivers/remoteproc/remoteproc_internal.h | 28 ++++++++++++++++++++++++ 3 files changed, 39 insertions(+), 2 deletions(-) diff --git a/drivers/remoteproc/Kconfig b/drivers/remoteproc/Kconfig index 9a6eedc3994a..f271552c0d84 100644 --- a/drivers/remoteproc/Kconfig +++ b/drivers/remoteproc/Kconfig @@ -6,7 +6,7 @@ config REMOTEPROC depends on HAS_DMA select CRC32 select FW_LOADER - select VIRTIO + select REMOTEPROC_VIRTIO select WANT_DEV_COREDUMP help Support for remote processors (such as DSP coprocessors). These @@ -14,6 +14,15 @@ config REMOTEPROC if REMOTEPROC +config REMOTEPROC_VIRTIO + bool "Remoteproc virtio device " + select VIRTIO + help + Say y here to have a virtio device support for the remoteproc + communication. + + It's safe to say N if you don't use the virtio for the IPC. + config REMOTEPROC_CDEV bool "Remoteproc character device interface" help diff --git a/drivers/remoteproc/Makefile b/drivers/remoteproc/Makefile index bb26c9e4ef9c..73d2384a76aa 100644 --- a/drivers/remoteproc/Makefile +++ b/drivers/remoteproc/Makefile @@ -8,8 +8,8 @@ remoteproc-y := remoteproc_core.o remoteproc-y += remoteproc_coredump.o remoteproc-y += remoteproc_debugfs.o remoteproc-y += remoteproc_sysfs.o -remoteproc-y += remoteproc_virtio.o remoteproc-y += remoteproc_elf_loader.o +obj-$(CONFIG_REMOTEPROC_VIRTIO) += remoteproc_virtio.o obj-$(CONFIG_REMOTEPROC_CDEV) += remoteproc_cdev.o obj-$(CONFIG_IMX_REMOTEPROC) += imx_rproc.o obj-$(CONFIG_INGENIC_VPU_RPROC) += ingenic_rproc.o diff --git a/drivers/remoteproc/remoteproc_internal.h b/drivers/remoteproc/remoteproc_internal.h index 152fe2e8668a..4ce012c353c0 100644 --- a/drivers/remoteproc/remoteproc_internal.h +++ b/drivers/remoteproc/remoteproc_internal.h @@ -30,10 +30,38 @@ int rproc_of_parse_firmware(struct device *dev, int index, const char **fw_name); /* from remoteproc_virtio.c */ +#if IS_ENABLED(CONFIG_REMOTEPROC_VIRTIO) + int rproc_rvdev_add_device(struct rproc_vdev *rvdev); irqreturn_t rproc_vq_interrupt(struct rproc *rproc, int vq_id); void rproc_vdev_release(struct kref *ref); +#else + +int rproc_rvdev_add_device(struct rproc_vdev *rvdev) +{ + /* This shouldn't be possible */ + WARN_ON(1); + + return -ENXIO; +} + +static inline irqreturn_t rproc_vq_interrupt(struct rproc *rproc, int vq_id) +{ + /* This shouldn't be possible */ + WARN_ON(1); + + return IRQ_NONE; +} + +static inline void rproc_vdev_release(struct kref *ref) +{ + /* This shouldn't be possible */ + WARN_ON(1); +} + +#endif + /* from remoteproc_debugfs.c */ void rproc_remove_trace_file(struct dentry *tfile); struct dentry *rproc_create_trace_file(const char *name, struct rproc *rproc, From patchwork Fri Oct 1 10:12:32 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arnaud Pouliquen X-Patchwork-Id: 12530251 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 48540C433F5 for ; Fri, 1 Oct 2021 10:15:02 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 287D961A81 for ; Fri, 1 Oct 2021 10:15:02 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1353535AbhJAKQo (ORCPT ); Fri, 1 Oct 2021 06:16:44 -0400 Received: from mx07-00178001.pphosted.com ([185.132.182.106]:59206 "EHLO mx07-00178001.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1353526AbhJAKQm (ORCPT ); Fri, 1 Oct 2021 06:16:42 -0400 Received: from pps.filterd (m0241204.ppops.net [127.0.0.1]) by mx07-00178001.pphosted.com (8.16.1.2/8.16.1.2) with SMTP id 1916jbE5023327; Fri, 1 Oct 2021 12:12:53 +0200 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=foss.st.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-type; s=selector1; bh=E1I/w2w0cB+PtZXQKX4NanqnPqz4eb/cNsElTQRr8GA=; b=UWtK9qrmNWR0rsbOjmooR6tvJpUyxf2OqiyvxwtVIj/kYwuIWnS+NFlUF08gCQBNR+79 SK8uIc5vmNaUQRjiIRWwFMHjqRUEgSR4lIiEyTooY23FdNye+4FwOleiMJJu/U/JTwmY sW2UrpipGyizxkDXov7dbVdIxGpjJKsSQFvcK1tyTEut8hjSDhJRo/8hx08c4CI5n5Gb 1suTVZllNCnw8lQ3OAatyM6rijVAoGrSmwujnCoyNwCoo7nCkeN2iLBjBrfU+HpHsU3P 6bs7CCOk4YzINBh1xXqMqgdyLC9yWzr/PDxXNGlst8gRm1dxUCIvGEmt/h9zb78Q5InB xA== Received: from beta.dmz-eu.st.com (beta.dmz-eu.st.com [164.129.1.35]) by mx07-00178001.pphosted.com with ESMTP id 3bdwbjh779-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 01 Oct 2021 12:12:53 +0200 Received: from euls16034.sgp.st.com (euls16034.sgp.st.com [10.75.44.20]) by beta.dmz-eu.st.com (STMicroelectronics) with ESMTP id 02E0E100034; Fri, 1 Oct 2021 12:12:48 +0200 (CEST) Received: from Webmail-eu.st.com (sfhdag2node2.st.com [10.75.127.5]) by euls16034.sgp.st.com (STMicroelectronics) with ESMTP id EE751226FDD; Fri, 1 Oct 2021 12:12:47 +0200 (CEST) Received: from localhost (10.75.127.49) by SFHDAG2NODE2.st.com (10.75.127.5) with Microsoft SMTP Server (TLS) id 15.0.1497.18; Fri, 1 Oct 2021 12:12:47 +0200 From: Arnaud Pouliquen To: Bjorn Andersson , Ohad Ben-Cohen , Mathieu Poirier CC: , , , Rob Herring , Christoph Hellwig , Stefano Stabellini , Bruce Ashfield , Subject: [RFC PATCH 5/7] remoteproc: virtio: Create platform device for the remoteproc_virtio Date: Fri, 1 Oct 2021 12:12:32 +0200 Message-ID: <20211001101234.4247-6-arnaud.pouliquen@foss.st.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20211001101234.4247-1-arnaud.pouliquen@foss.st.com> References: <20211001101234.4247-1-arnaud.pouliquen@foss.st.com> MIME-Version: 1.0 X-Originating-IP: [10.75.127.49] X-ClientProxiedBy: SFHDAG1NODE2.st.com (10.75.127.2) To SFHDAG2NODE2.st.com (10.75.127.5) X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.182.1,Aquarius:18.0.790,Hydra:6.0.391,FMLib:17.0.607.475 definitions=2021-10-01_01,2021-10-01_01,2020-04-07_01 Precedence: bulk List-ID: X-Mailing-List: linux-remoteproc@vger.kernel.org Define a platform device for the remoteproc virtio to prepare the management of the remoteproc virtio as a platform device. The platform device allows to pass rproc_vdev_data platform data to specify properties that are stored in the rproc_vdev structure. Such approach will allow to preserve legacy remoteproc virtio device creation but also to probe the device using device tree mechanism. Signed-off-by: Arnaud Pouliquen --- drivers/remoteproc/remoteproc_internal.h | 6 +++ drivers/remoteproc/remoteproc_virtio.c | 65 ++++++++++++++++++++++++ include/linux/remoteproc.h | 2 + 3 files changed, 73 insertions(+) diff --git a/drivers/remoteproc/remoteproc_internal.h b/drivers/remoteproc/remoteproc_internal.h index 4ce012c353c0..1b963a8912ed 100644 --- a/drivers/remoteproc/remoteproc_internal.h +++ b/drivers/remoteproc/remoteproc_internal.h @@ -24,6 +24,12 @@ struct rproc_debug_trace { struct rproc_mem_entry trace_mem; }; +struct rproc_vdev_data { + u32 rsc_offset; + unsigned int id; + unsigned int index; +}; + /* from remoteproc_core.c */ void rproc_release(struct kref *kref); int rproc_of_parse_firmware(struct device *dev, int index, diff --git a/drivers/remoteproc/remoteproc_virtio.c b/drivers/remoteproc/remoteproc_virtio.c index c9eecd2f9fb2..9b2ab79e4c4c 100644 --- a/drivers/remoteproc/remoteproc_virtio.c +++ b/drivers/remoteproc/remoteproc_virtio.c @@ -4,6 +4,7 @@ * * Copyright (C) 2011 Texas Instruments, Inc. * Copyright (C) 2011 Google, Inc. + * Copyright (C) 2021 STMicroelectronics * * Ohad Ben-Cohen * Brian Swetland @@ -13,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -571,3 +573,66 @@ void rproc_vdev_release(struct kref *ref) rproc_rvdev_remove_device(rvdev); } + +static int rproc_virtio_probe(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + struct rproc_vdev_data *vdev_data = dev->platform_data; + struct rproc_vdev *rvdev; + struct rproc *rproc; + + if (!vdev_data) + return -EINVAL; + + rvdev = devm_kzalloc(dev, sizeof(*rvdev), GFP_KERNEL); + if (!rvdev) + return -ENOMEM; + + rproc = container_of(dev->parent, struct rproc, dev); + + rvdev->rsc_offset = vdev_data->rsc_offset; + rvdev->id = vdev_data->id; + rvdev->index = vdev_data->index; + + rvdev->pdev = pdev; + rvdev->rproc = rproc; + + platform_set_drvdata(pdev, rvdev); + + return rproc_rvdev_add_device(rvdev); +} + +static int rproc_virtio_remove(struct platform_device *pdev) +{ + struct rproc_vdev *rvdev = dev_get_drvdata(&pdev->dev); + struct rproc *rproc = rvdev->rproc; + struct rproc_vring *rvring; + int id; + + for (id = 0; id < ARRAY_SIZE(rvdev->vring); id++) { + rvring = &rvdev->vring[id]; + rproc_free_vring(rvring); + } + + rproc_remove_subdev(rproc, &rvdev->subdev); + rproc_unregister_rvdev(rvdev); + dev_dbg(&pdev->dev, "virtio dev %d removed\n", rvdev->index); + + return 0; +} + +/* Platform driver */ +static const struct of_device_id rproc_virtio_match[] = { + { .compatible = "rproc-virtio", }, + {}, +}; + +static struct platform_driver rproc_virtio_driver = { + .probe = rproc_virtio_probe, + .remove = rproc_virtio_remove, + .driver = { + .name = "rproc-virtio", + .of_match_table = rproc_virtio_match, + }, +}; +builtin_platform_driver(rproc_virtio_driver); diff --git a/include/linux/remoteproc.h b/include/linux/remoteproc.h index e0600e1e5c17..542a3d4664f2 100644 --- a/include/linux/remoteproc.h +++ b/include/linux/remoteproc.h @@ -616,6 +616,7 @@ struct rproc_vring { * struct rproc_vdev - remoteproc state for a supported virtio device * @refcount: reference counter for the vdev and vring allocations * @subdev: handle for registering the vdev as a rproc subdevice + * @pdev: remoteproc virtio platform device * @dev: device struct used for reference count semantics * @id: virtio device id (as in virtio_ids.h) * @node: list node @@ -628,6 +629,7 @@ struct rproc_vdev { struct kref refcount; struct rproc_subdev subdev; + struct platform_device *pdev; struct device dev; unsigned int id; From patchwork Fri Oct 1 10:12:33 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arnaud Pouliquen X-Patchwork-Id: 12530249 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 6EB09C433F5 for ; Fri, 1 Oct 2021 10:14:56 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 537AB61A58 for ; Fri, 1 Oct 2021 10:14:56 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1353527AbhJAKQj (ORCPT ); Fri, 1 Oct 2021 06:16:39 -0400 Received: from mx07-00178001.pphosted.com ([185.132.182.106]:47736 "EHLO mx07-00178001.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1353420AbhJAKQi (ORCPT ); Fri, 1 Oct 2021 06:16:38 -0400 Received: from pps.filterd (m0046668.ppops.net [127.0.0.1]) by mx07-00178001.pphosted.com (8.16.1.2/8.16.1.2) with SMTP id 1918I0b7030519; Fri, 1 Oct 2021 12:12:49 +0200 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=foss.st.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-type; s=selector1; bh=m+VP0hcuRq/Ykjd7M5pZ16VJNgKkpYObCuedev0S0vE=; b=qWl2iJ8vSTb0Z+8PHE+REEm9cvgbBe3/p/WWgJGy8moxCNOzwlUkGyIhQ1fKi4GE2/Vp vv2irS4sFqBbuPgcs3IuMphxZI350fhrX+MTSTg92TzbXSRSbSYyJtYhgAFjAD0HTcZE k9aUN41vRPJ6AVp84auZA5YLPOa/aSnpoMIisHo0G5GQGHzEEeAKJh1PvjBrxP+DK9s4 /uv25qTyS4wbKqeaFzuSra4xIqqNJFt0211HN0BPa4nS+VT80EaF4ug2lu+Gui5T8KFb 9AvBUAn76xHEQBY99i6oKGarW2I85cca97iuqrE8xxzZU9yJytJibyenxU34Mq3ukr46 KA== Received: from beta.dmz-eu.st.com (beta.dmz-eu.st.com [164.129.1.35]) by mx07-00178001.pphosted.com with ESMTP id 3bds9njb56-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 01 Oct 2021 12:12:49 +0200 Received: from euls16034.sgp.st.com (euls16034.sgp.st.com [10.75.44.20]) by beta.dmz-eu.st.com (STMicroelectronics) with ESMTP id CC727100039; Fri, 1 Oct 2021 12:12:48 +0200 (CEST) Received: from Webmail-eu.st.com (sfhdag2node2.st.com [10.75.127.5]) by euls16034.sgp.st.com (STMicroelectronics) with ESMTP id C2932226FDD; Fri, 1 Oct 2021 12:12:48 +0200 (CEST) Received: from localhost (10.75.127.48) by SFHDAG2NODE2.st.com (10.75.127.5) with Microsoft SMTP Server (TLS) id 15.0.1497.18; Fri, 1 Oct 2021 12:12:48 +0200 From: Arnaud Pouliquen To: Bjorn Andersson , Ohad Ben-Cohen , Mathieu Poirier CC: , , , Rob Herring , Christoph Hellwig , Stefano Stabellini , Bruce Ashfield , Subject: [RFC PATCH 6/7] remoteproc: virtio: Add helper to create platform device Date: Fri, 1 Oct 2021 12:12:33 +0200 Message-ID: <20211001101234.4247-7-arnaud.pouliquen@foss.st.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20211001101234.4247-1-arnaud.pouliquen@foss.st.com> References: <20211001101234.4247-1-arnaud.pouliquen@foss.st.com> MIME-Version: 1.0 X-Originating-IP: [10.75.127.48] X-ClientProxiedBy: SFHDAG2NODE3.st.com (10.75.127.6) To SFHDAG2NODE2.st.com (10.75.127.5) X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.182.1,Aquarius:18.0.790,Hydra:6.0.391,FMLib:17.0.607.475 definitions=2021-10-01_01,2021-09-30_01,2020-04-07_01 Precedence: bulk List-ID: X-Mailing-List: linux-remoteproc@vger.kernel.org Add capability to create platform device for the rproc virtio. This is a step to move forward the management of the rproc virtio as an independent device. Signed-off-by: Arnaud Pouliquen --- drivers/remoteproc/remoteproc_internal.h | 15 ++++++++++ drivers/remoteproc/remoteproc_virtio.c | 36 ++++++++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/drivers/remoteproc/remoteproc_internal.h b/drivers/remoteproc/remoteproc_internal.h index 1b963a8912ed..0bb1b14e5136 100644 --- a/drivers/remoteproc/remoteproc_internal.h +++ b/drivers/remoteproc/remoteproc_internal.h @@ -39,11 +39,26 @@ int rproc_of_parse_firmware(struct device *dev, int index, #if IS_ENABLED(CONFIG_REMOTEPROC_VIRTIO) int rproc_rvdev_add_device(struct rproc_vdev *rvdev); +struct platform_device * +rproc_virtio_register_device(struct rproc *rproc, struct rproc_vdev_data *vdev_data); +void rproc_virtio_unregister_device(struct rproc_vdev *rvdev); irqreturn_t rproc_vq_interrupt(struct rproc *rproc, int vq_id); void rproc_vdev_release(struct kref *ref); #else +static inline struct platform_device * +rproc_virtio_register_device(struct rproc *rproc, struct rproc_vdev_data *vdev_data) +{ + return ERR_PTR(-ENXIO); +} + +static inline void rproc_virtio_unregister_device(struct rproc_vdev *rvdev) +{ + /* This shouldn't be possible */ + WARN_ON(1); +} + int rproc_rvdev_add_device(struct rproc_vdev *rvdev) { /* This shouldn't be possible */ diff --git a/drivers/remoteproc/remoteproc_virtio.c b/drivers/remoteproc/remoteproc_virtio.c index 9b2ab79e4c4c..7188fb8ce40f 100644 --- a/drivers/remoteproc/remoteproc_virtio.c +++ b/drivers/remoteproc/remoteproc_virtio.c @@ -574,6 +574,42 @@ void rproc_vdev_release(struct kref *ref) rproc_rvdev_remove_device(rvdev); } +/** + * rproc_virtio_register_device() - register a remoteproc virtio device + * @rproc: rproc handle to add the remoteproc virtio device to + * @vdev_data: platform device data + * + * Return: 0 on success, and an appropriate error value otherwise + */ +struct platform_device * +rproc_virtio_register_device(struct rproc *rproc, struct rproc_vdev_data *vdev_data) +{ + struct device *dev = &rproc->dev; + struct platform_device *pdev; + + pdev = platform_device_register_data(dev, "rproc-virtio", vdev_data->index, vdev_data, + sizeof(*vdev_data)); + if (PTR_ERR_OR_ZERO(pdev)) { + dev_err(rproc->dev.parent, + "failed to create rproc-virtio device\n"); + } + + return pdev; +} +EXPORT_SYMBOL(rproc_virtio_register_device); + +/** + * rproc_virtio_unregister_device() - unregister a remoteproc virtio device + * @rvdev: remote proc virtio handle to unregister + * + */ +void rproc_virtio_unregister_device(struct rproc_vdev *rvdev) +{ + if (rvdev->pdev) + platform_device_unregister(rvdev->pdev); +} +EXPORT_SYMBOL(rproc_virtio_unregister_device); + static int rproc_virtio_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; From patchwork Fri Oct 1 10:12:34 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arnaud Pouliquen X-Patchwork-Id: 12530255 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id BAF1DC433FE for ; Fri, 1 Oct 2021 10:15:03 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id A6D1461A80 for ; Fri, 1 Oct 2021 10:15:03 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1353544AbhJAKQq (ORCPT ); Fri, 1 Oct 2021 06:16:46 -0400 Received: from mx07-00178001.pphosted.com ([185.132.182.106]:59222 "EHLO mx07-00178001.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1353532AbhJAKQo (ORCPT ); Fri, 1 Oct 2021 06:16:44 -0400 Received: from pps.filterd (m0241204.ppops.net [127.0.0.1]) by mx07-00178001.pphosted.com (8.16.1.2/8.16.1.2) with SMTP id 1916jZGB023307; Fri, 1 Oct 2021 12:12:54 +0200 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=foss.st.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-type; s=selector1; bh=k5eZoy/Oi0pd8rrnAh553nooZA4WeP9CiI99yZeGReQ=; b=YdBfRDRdo3ebDqlp43jG0bqw/YH4C4ARtHGVvmy2nQ8SFQ9AnaOBF92Jr3QJvOASX+DW OJDYz0QH7LpZUPtoE0LJ0+WhyJ2hVkYn8f3JyoCdlfzhBXKNqB788JUr6WCTQhv8pzW+ zu/V1Pb1AOmdRUgaYYh+VUEqdZtVwivfId/piyuU2FV6ywMtcsrzjBA4eSCsAzsXXh3K B83/IeTQTDhuQLK7jpl8wRKuyDg92439ptNI+OUboLsA0csKu0dw4P5aMl5DREeW9nXE AocXyM1sqvDp7fZ1aByHvwszjfHj4kj8FjjeBn1nyQe31/szseiToHLkIrOPkXMgh8st TA== Received: from beta.dmz-eu.st.com (beta.dmz-eu.st.com [164.129.1.35]) by mx07-00178001.pphosted.com with ESMTP id 3bdwbjh77f-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 01 Oct 2021 12:12:54 +0200 Received: from euls16034.sgp.st.com (euls16034.sgp.st.com [10.75.44.20]) by beta.dmz-eu.st.com (STMicroelectronics) with ESMTP id 8F1F4100038; Fri, 1 Oct 2021 12:12:49 +0200 (CEST) Received: from Webmail-eu.st.com (sfhdag2node2.st.com [10.75.127.5]) by euls16034.sgp.st.com (STMicroelectronics) with ESMTP id 84D92226FDD; Fri, 1 Oct 2021 12:12:49 +0200 (CEST) Received: from localhost (10.75.127.48) by SFHDAG2NODE2.st.com (10.75.127.5) with Microsoft SMTP Server (TLS) id 15.0.1497.18; Fri, 1 Oct 2021 12:12:48 +0200 From: Arnaud Pouliquen To: Bjorn Andersson , Ohad Ben-Cohen , Mathieu Poirier CC: , , , Rob Herring , Christoph Hellwig , Stefano Stabellini , Bruce Ashfield , Subject: [RFC PATCH 7/7] remoteproc: Instantiate the new remoteproc virtio platform device Date: Fri, 1 Oct 2021 12:12:34 +0200 Message-ID: <20211001101234.4247-8-arnaud.pouliquen@foss.st.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20211001101234.4247-1-arnaud.pouliquen@foss.st.com> References: <20211001101234.4247-1-arnaud.pouliquen@foss.st.com> MIME-Version: 1.0 X-Originating-IP: [10.75.127.48] X-ClientProxiedBy: SFHDAG1NODE2.st.com (10.75.127.2) To SFHDAG2NODE2.st.com (10.75.127.5) X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.182.1,Aquarius:18.0.790,Hydra:6.0.391,FMLib:17.0.607.475 definitions=2021-10-01_01,2021-10-01_01,2020-04-07_01 Precedence: bulk List-ID: X-Mailing-List: linux-remoteproc@vger.kernel.org Migrate from the rvdev device to the rvdev platform device. From this patch, when a vdev resource is found in the resource table the remoteproc core register a platform device. All reference to the rvdev->dev has been updated to rvdev-pdev->dev The use of kref counter is replaced by get/put_device on the remoteproc virtio device. Signed-off-by: Arnaud Pouliquen --- drivers/remoteproc/remoteproc_core.c | 49 +++++++------ drivers/remoteproc/remoteproc_internal.h | 16 ---- drivers/remoteproc/remoteproc_virtio.c | 93 ++++++------------------ include/linux/remoteproc.h | 4 - 4 files changed, 50 insertions(+), 112 deletions(-) diff --git a/drivers/remoteproc/remoteproc_core.c b/drivers/remoteproc/remoteproc_core.c index 67ccd088db8f..d9256db8b130 100644 --- a/drivers/remoteproc/remoteproc_core.c +++ b/drivers/remoteproc/remoteproc_core.c @@ -467,6 +467,8 @@ static int rproc_handle_vdev(struct rproc *rproc, void *ptr, { struct fw_rsc_vdev *rsc = ptr; struct device *dev = &rproc->dev; + struct rproc_vdev_data vdev_data; + struct platform_device *pdev; struct rproc_vdev *rvdev; int i, ret; @@ -486,28 +488,34 @@ static int rproc_handle_vdev(struct rproc *rproc, void *ptr, dev_dbg(dev, "vdev rsc: id %d, dfeatures 0x%x, cfg len %d, %d vrings\n", rsc->id, rsc->dfeatures, rsc->config_len, rsc->num_of_vrings); - /* we currently support only two vrings per rvdev */ - if (rsc->num_of_vrings > ARRAY_SIZE(rvdev->vring)) { - dev_err(dev, "too many vrings: %d\n", rsc->num_of_vrings); - return -EINVAL; - } + /* platform data of the new rvdev platform */ + vdev_data.rsc_offset = offset; + vdev_data.id = rsc->id; + vdev_data.index = rproc->nb_vdev; - rvdev = kzalloc(sizeof(*rvdev), GFP_KERNEL); - if (!rvdev) - return -ENOMEM; - - kref_init(&rvdev->refcount); - - rvdev->id = rsc->id; - rvdev->rproc = rproc; - rvdev->index = rproc->nb_vdev; + pdev = rproc_virtio_register_device(rproc, &vdev_data); + if (PTR_ERR_OR_ZERO(pdev)) { + dev_err(rproc->dev.parent, + "failed to create rproc-virtio device\n"); + return PTR_ERR_OR_ZERO(pdev); + } - ret = rproc_rvdev_add_device(rvdev); - if (ret) - return ret; + /* If we made it to this point the remote proc virtio platform at been probed */ + rvdev = platform_get_drvdata(pdev); + if (WARN_ON(!rvdev)) { + ret = -EINVAL; + goto free_rvdev; + } rproc->nb_vdev++; + /* we currently support only two vrings per rvdev */ + if (rsc->num_of_vrings > ARRAY_SIZE(rvdev->vring)) { + dev_err(dev, "too many vrings: %d\n", rsc->num_of_vrings); + ret = -EINVAL; + goto free_rvdev; + } + /* parse the vrings */ for (i = 0; i < rsc->num_of_vrings; i++) { ret = rproc_parse_vring(rvdev, rsc, i); @@ -515,9 +523,6 @@ static int rproc_handle_vdev(struct rproc *rproc, void *ptr, goto free_rvdev; } - /* remember the resource offset*/ - rvdev->rsc_offset = offset; - /* allocate the vring resources */ for (i = 0; i < rsc->num_of_vrings; i++) { ret = rproc_alloc_vring(rvdev, i); @@ -531,7 +536,7 @@ static int rproc_handle_vdev(struct rproc *rproc, void *ptr, for (i--; i >= 0; i--) rproc_free_vring(&rvdev->vring[i]); free_rvdev: - device_unregister(&rvdev->dev); + rproc_virtio_unregister_device(rvdev); return ret; } @@ -1270,7 +1275,7 @@ void rproc_resource_cleanup(struct rproc *rproc) /* clean up remote vdev entries */ list_for_each_entry_safe(rvdev, rvtmp, &rproc->rvdevs, node) - kref_put(&rvdev->refcount, rproc_vdev_release); + rproc_virtio_unregister_device(rvdev); rproc_coredump_cleanup(rproc); } diff --git a/drivers/remoteproc/remoteproc_internal.h b/drivers/remoteproc/remoteproc_internal.h index 0bb1b14e5136..2f68e7380c77 100644 --- a/drivers/remoteproc/remoteproc_internal.h +++ b/drivers/remoteproc/remoteproc_internal.h @@ -38,12 +38,10 @@ int rproc_of_parse_firmware(struct device *dev, int index, /* from remoteproc_virtio.c */ #if IS_ENABLED(CONFIG_REMOTEPROC_VIRTIO) -int rproc_rvdev_add_device(struct rproc_vdev *rvdev); struct platform_device * rproc_virtio_register_device(struct rproc *rproc, struct rproc_vdev_data *vdev_data); void rproc_virtio_unregister_device(struct rproc_vdev *rvdev); irqreturn_t rproc_vq_interrupt(struct rproc *rproc, int vq_id); -void rproc_vdev_release(struct kref *ref); #else @@ -59,14 +57,6 @@ static inline void rproc_virtio_unregister_device(struct rproc_vdev *rvdev) WARN_ON(1); } -int rproc_rvdev_add_device(struct rproc_vdev *rvdev) -{ - /* This shouldn't be possible */ - WARN_ON(1); - - return -ENXIO; -} - static inline irqreturn_t rproc_vq_interrupt(struct rproc *rproc, int vq_id) { /* This shouldn't be possible */ @@ -75,12 +65,6 @@ static inline irqreturn_t rproc_vq_interrupt(struct rproc *rproc, int vq_id) return IRQ_NONE; } -static inline void rproc_vdev_release(struct kref *ref) -{ - /* This shouldn't be possible */ - WARN_ON(1); -} - #endif /* from remoteproc_debugfs.c */ diff --git a/drivers/remoteproc/remoteproc_virtio.c b/drivers/remoteproc/remoteproc_virtio.c index 7188fb8ce40f..34781a2136e6 100644 --- a/drivers/remoteproc/remoteproc_virtio.c +++ b/drivers/remoteproc/remoteproc_virtio.c @@ -29,7 +29,11 @@ static struct rproc_vdev *vdev_to_rvdev(struct virtio_device *vdev) { - return container_of(vdev->dev.parent, struct rproc_vdev, dev); + struct platform_device *pdev; + + pdev = container_of(vdev->dev.parent, struct platform_device, dev); + + return platform_get_drvdata(pdev); } static struct rproc *vdev_to_rproc(struct virtio_device *vdev) @@ -343,13 +347,10 @@ static void rproc_virtio_dev_release(struct device *dev) { struct virtio_device *vdev = dev_to_virtio(dev); struct rproc_vdev *rvdev = vdev_to_rvdev(vdev); - struct rproc *rproc = vdev_to_rproc(vdev); kfree(vdev); - kref_put(&rvdev->refcount, rproc_vdev_release); - - put_device(&rproc->dev); + put_device(&rvdev->pdev->dev); } /** @@ -365,7 +366,7 @@ static void rproc_virtio_dev_release(struct device *dev) static int rproc_add_virtio_dev(struct rproc_vdev *rvdev, int id) { struct rproc *rproc = rvdev->rproc; - struct device *dev = &rvdev->dev; + struct device *dev = &rvdev->pdev->dev; struct virtio_device *vdev; struct rproc_mem_entry *mem; int ret; @@ -436,17 +437,15 @@ static int rproc_add_virtio_dev(struct rproc_vdev *rvdev, int id) vdev->dev.release = rproc_virtio_dev_release; /* - * We're indirectly making a non-temporary copy of the rproc pointer + * We're indirectly making a non-temporary copy of the rvdev pointer * here, because drivers probed with this vdev will indirectly * access the wrapping rproc. * - * Therefore we must increment the rproc refcount here, and decrement + * Therefore we must increment the rvdev refcount here, and decrement * it _only_ when the vdev is released. */ - get_device(&rproc->dev); + get_device(dev); - /* Reference the vdev and vring allocations */ - kref_get(&rvdev->refcount); ret = register_virtio_device(vdev); if (ret) { @@ -488,57 +487,33 @@ static int rproc_vdev_do_start(struct rproc_subdev *subdev) static void rproc_vdev_do_stop(struct rproc_subdev *subdev, bool crashed) { struct rproc_vdev *rvdev = container_of(subdev, struct rproc_vdev, subdev); + struct device *dev = &rvdev->pdev->dev; int ret; - ret = device_for_each_child(&rvdev->dev, NULL, rproc_remove_virtio_dev); + ret = device_for_each_child(dev, NULL, rproc_remove_virtio_dev); if (ret) - dev_warn(&rvdev->dev, "can't remove vdev child device: %d\n", ret); -} - -/** - * rproc_rvdev_release() - release the existence of a rvdev - * - * @dev: the subdevice's dev - */ -static void rproc_rvdev_release(struct device *dev) -{ - struct rproc_vdev *rvdev = container_of(dev, struct rproc_vdev, dev); - - of_reserved_mem_device_release(dev); - - kfree(rvdev); + dev_warn(dev, "can't remove vdev child device: %d\n", ret); } -int rproc_rvdev_add_device(struct rproc_vdev *rvdev) +static int rproc_rvdev_add_device(struct rproc_vdev *rvdev) { struct rproc *rproc = rvdev->rproc; - char name[16]; + struct device *dev = &rvdev->pdev->dev; int ret; - snprintf(name, sizeof(name), "vdev%dbuffer", rvdev->index); - rvdev->dev.parent = &rproc->dev; - ret = copy_dma_range_map(&rvdev->dev, rproc->dev.parent); + ret = copy_dma_range_map(dev, rproc->dev.parent); if (ret) return ret; - rvdev->dev.release = rproc_rvdev_release; - dev_set_name(&rvdev->dev, "%s#%s", dev_name(rvdev->dev.parent), name); - dev_set_drvdata(&rvdev->dev, rvdev); - ret = device_register(&rvdev->dev); - if (ret) { - put_device(&rvdev->dev); - return ret; - } /* Make device dma capable by inheriting from parent's capabilities */ - set_dma_ops(&rvdev->dev, get_dma_ops(rproc->dev.parent)); + set_dma_ops(dev, get_dma_ops(rproc->dev.parent)); - ret = dma_coerce_mask_and_coherent(&rvdev->dev, - dma_get_mask(rproc->dev.parent)); + ret = dma_coerce_mask_and_coherent(dev, dma_get_mask(rproc->dev.parent)); if (ret) { - dev_warn(&rvdev->dev, - "Failed to set DMA mask %llx. Trying to continue... %x\n", + dev_warn(dev, "Failed to set DMA mask %llx. Trying to continue... %x\n", dma_get_mask(rproc->dev.parent), ret); + return ret; } rproc_register_rvdev(rvdev); @@ -548,30 +523,9 @@ int rproc_rvdev_add_device(struct rproc_vdev *rvdev) rproc_add_subdev(rproc, &rvdev->subdev); - return 0; -} - -static void rproc_rvdev_remove_device(struct rproc_vdev *rvdev) -{ - struct rproc *rproc = rvdev->rproc; - - rproc_remove_subdev(rproc, &rvdev->subdev); - rproc_unregister_rvdev(rvdev); - device_unregister(&rvdev->dev); -} - -void rproc_vdev_release(struct kref *ref) -{ - struct rproc_vdev *rvdev = container_of(ref, struct rproc_vdev, refcount); - struct rproc_vring *rvring; - int id; + dev_dbg(dev, "virtio dev %d added\n", rvdev->index); - for (id = 0; id < ARRAY_SIZE(rvdev->vring); id++) { - rvring = &rvdev->vring[id]; - rproc_free_vring(rvring); - } - - rproc_rvdev_remove_device(rvdev); + return 0; } /** @@ -590,8 +544,7 @@ rproc_virtio_register_device(struct rproc *rproc, struct rproc_vdev_data *vdev_d pdev = platform_device_register_data(dev, "rproc-virtio", vdev_data->index, vdev_data, sizeof(*vdev_data)); if (PTR_ERR_OR_ZERO(pdev)) { - dev_err(rproc->dev.parent, - "failed to create rproc-virtio device\n"); + dev_err(rproc->dev.parent, "failed to create rproc-virtio device\n"); } return pdev; diff --git a/include/linux/remoteproc.h b/include/linux/remoteproc.h index 542a3d4664f2..7951a3e2b62a 100644 --- a/include/linux/remoteproc.h +++ b/include/linux/remoteproc.h @@ -614,10 +614,8 @@ struct rproc_vring { /** * struct rproc_vdev - remoteproc state for a supported virtio device - * @refcount: reference counter for the vdev and vring allocations * @subdev: handle for registering the vdev as a rproc subdevice * @pdev: remoteproc virtio platform device - * @dev: device struct used for reference count semantics * @id: virtio device id (as in virtio_ids.h) * @node: list node * @rproc: the rproc handle @@ -626,11 +624,9 @@ struct rproc_vring { * @index: vdev position versus other vdev declared in resource table */ struct rproc_vdev { - struct kref refcount; struct rproc_subdev subdev; struct platform_device *pdev; - struct device dev; unsigned int id; struct list_head node;