Received: by 2002:a05:6a10:2726:0:0:0:0 with SMTP id ib38csp1083917pxb; Wed, 6 Apr 2022 08:19:43 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxFtq7q5N6o5idCrKEjSFU4WtFXKC8E6VmgczqJS8mj/GENupoMGoezA05xoOjOz6vk5sNP X-Received: by 2002:a17:90a:8405:b0:1bc:d521:b2c9 with SMTP id j5-20020a17090a840500b001bcd521b2c9mr10535293pjn.119.1649258383050; Wed, 06 Apr 2022 08:19:43 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1649258383; cv=none; d=google.com; s=arc-20160816; b=gTgf9lTNEc8Vkn6+W0SM16pM/MlExjOYawIaEV0o/EhCwmlmKDMxX+s99tcxRnldXO BvLnfGGcinlplSFmuVzJlp5OWff/U5RaUoLiY16pjsJdoWXpMZK/wm2520Vbc7unGalQ CsV9X/zS4J8UJc9ryVTfWQpR90zBMsJoVq1pul3M7wtWTkCxUOPdpRlnRFGXHHC4OE0X zaR1t/vXX/O0MPesf3f0OJpXW7Ld7GCRqrL02RW83Hmb91k2A2yt8+VEzqH7NA/IAgtd 7ApyRx1OPW4ZGXjyVE1gXxymPnluvOZ7prSYhy0LEVjmWbpKmXNyE/pbL3D/pJgaHIZ6 goSQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=jJktV2MZUbteZjvTj9QuYJux8SWlQyGFeaPGkgSU5wA=; b=S7pyu1Ef0HAJMsN+ZSUv2+c3mtuRbQcZMvmqLFHsf9CjA9mSmNQZhV1N9tjf1gG7dQ jxcS1rsVpWBUZpGtK/ZslbQ6U1DdBivskFncjtRCOFdxoBA42LqhE8qs5B4ePboXbflZ +jlSY8ZZCEkNG2S2TBOpZdVfY00zruRN5cf5XZF0EIV9PDDgPhjfK5wtsWhueozIV+tO IqspXFK1j62rFg8etngksCV648ta9COJwJBwZ4M2A7oEepqQdXGm9mkFH6aR+6U/VKPK DfRdNogyNaztLwnow0mXZ6xZdUvK8U6oB4fHytq2Hq7270Va/C1npvoy6nwTXAed07HJ ekiA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@foss.st.com header.s=selector1 header.b=rEC0UXEj; spf=softfail (google.com: domain of transitioning linux-kernel-owner@vger.kernel.org does not designate 23.128.96.19 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=foss.st.com Return-Path: Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net. [23.128.96.19]) by mx.google.com with ESMTPS id nl10-20020a17090b384a00b001c98dbffe90si5524215pjb.26.2022.04.06.08.19.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 06 Apr 2022 08:19:43 -0700 (PDT) Received-SPF: softfail (google.com: domain of transitioning linux-kernel-owner@vger.kernel.org does not designate 23.128.96.19 as permitted sender) client-ip=23.128.96.19; Authentication-Results: mx.google.com; dkim=pass header.i=@foss.st.com header.s=selector1 header.b=rEC0UXEj; spf=softfail (google.com: domain of transitioning linux-kernel-owner@vger.kernel.org does not designate 23.128.96.19 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=foss.st.com Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id DA262515583; Wed, 6 Apr 2022 06:18:13 -0700 (PDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233057AbiDFNS6 (ORCPT + 99 others); Wed, 6 Apr 2022 09:18:58 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60322 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233375AbiDFNRy (ORCPT ); Wed, 6 Apr 2022 09:17:54 -0400 Received: from mx07-00178001.pphosted.com (mx07-00178001.pphosted.com [185.132.182.106]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 86D1B611C4F; Wed, 6 Apr 2022 02:55:58 -0700 (PDT) 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 ESMTP id 2369Gkic013964; Wed, 6 Apr 2022 11:55:25 +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-transfer-encoding : content-type; s=selector1; bh=jJktV2MZUbteZjvTj9QuYJux8SWlQyGFeaPGkgSU5wA=; b=rEC0UXEj7n8oVMGapxMjbT3QLAkbIDzO6VLKnh0FoXO8HzmjSUQiig7uW6dV8zkMc9jm Hi82nnJeHPeZ9p5lOA/4HSqqghn9FQlfohoLW5/0bPjxDjdav8LeWA5qWNpPPwl+xdj+ 2m2DRk/vCbkmcZz6NGEHG+z03/sKdcsNvVufi8iBWPkP2aRI8TQFDNva2WKAOA2D4D2E cOr8qobTCfVDTcCS8KoYg0p9ye91YyvLreQljQEreNexd0VsFrgd/AsB7xZ+LTNyK4CU MG6TdkrYEMqDZZPEQNQXG+7BZ8VHVuQtS7+nWwAdpH61Rzyas7myqrCxKXasaYo+F9oe CQ== Received: from beta.dmz-eu.st.com (beta.dmz-eu.st.com [164.129.1.35]) by mx07-00178001.pphosted.com (PPS) with ESMTPS id 3f6du0vqt7-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 06 Apr 2022 11:55:25 +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 C7131100038; Wed, 6 Apr 2022 11:55:24 +0200 (CEST) Received: from Webmail-eu.st.com (sfhdag2node2.st.com [10.75.127.5]) by euls16034.sgp.st.com (STMicroelectronics) with ESMTP id BE6E420F2A4; Wed, 6 Apr 2022 11:55:24 +0200 (CEST) Received: from localhost (10.75.127.47) by SFHDAG2NODE2.st.com (10.75.127.5) with Microsoft SMTP Server (TLS) id 15.0.1497.26; Wed, 6 Apr 2022 11:55:24 +0200 From: Arnaud Pouliquen To: Bjorn Andersson , Mathieu Poirier CC: , , , Rob Herring , Christoph Hellwig , Stefano Stabellini , Bruce Ashfield , Subject: [RFC PATCH v5 1/4] remoteproc: core: Introduce virtio device add/remove functions Date: Wed, 6 Apr 2022 11:54:43 +0200 Message-ID: <20220406095446.1187968-2-arnaud.pouliquen@foss.st.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220406095446.1187968-1-arnaud.pouliquen@foss.st.com> References: <20220406095446.1187968-1-arnaud.pouliquen@foss.st.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-Originating-IP: [10.75.127.47] X-ClientProxiedBy: SFHDAG2NODE2.st.com (10.75.127.5) To SFHDAG2NODE2.st.com (10.75.127.5) X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.850,Hydra:6.0.425,FMLib:17.11.64.514 definitions=2022-04-06_03,2022-04-05_01,2022-02-23_01 X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,RDNS_NONE,SPF_HELO_NONE,T_SCC_BODY_TEXT_LINE autolearn=no autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org In preparation of the migration of the management of rvdev in remoteproc_virtio.c, this patch spins off new functions to manage the remoteproc virtio device. - rproc_rvdev_add_device - rproc_rvdev_remove_device The rproc_rvdev_add_device and rproc_rvdev_remove_device will be moved to remoteproc_virtio.c. The rproc_vdev_data structure is introduced to provide information for the rvdev creation. This structure allows to manage the rvdev and vrings allocation in the rproc_rvdev_add_device function. Signed-off-by: Arnaud Pouliquen --- drivers/remoteproc/remoteproc_core.c | 157 +++++++++++++---------- drivers/remoteproc/remoteproc_internal.h | 15 +++ 2 files changed, 106 insertions(+), 66 deletions(-) diff --git a/drivers/remoteproc/remoteproc_core.c b/drivers/remoteproc/remoteproc_core.c index c510125769b9..3a469220ac73 100644 --- a/drivers/remoteproc/remoteproc_core.c +++ b/drivers/remoteproc/remoteproc_core.c @@ -484,74 +484,23 @@ static int copy_dma_range_map(struct device *to, struct device *from) return 0; } -/** - * rproc_handle_vdev() - handle a vdev fw resource - * @rproc: the remote processor - * @ptr: the vring resource descriptor - * @offset: offset of the resource entry - * @avail: size of available data (for sanity checking the image) - * - * This resource entry requests the host to statically register a virtio - * device (vdev), and setup everything needed to support it. It contains - * everything needed to make it possible: the virtio device id, virtio - * device features, vrings information, virtio config space, etc... - * - * Before registering the vdev, the vrings are allocated from non-cacheable - * physically contiguous memory. Currently we only support two vrings per - * remote processor (temporary limitation). We might also want to consider - * doing the vring allocation only later when ->find_vqs() is invoked, and - * then release them upon ->del_vqs(). - * - * Note: @da is currently not really handled correctly: we dynamically - * allocate it using the DMA API, ignoring requested hard coded addresses, - * and we don't take care of any required IOMMU programming. This is all - * going to be taken care of when the generic iommu-based DMA API will be - * merged. Meanwhile, statically-addressed iommu-based firmware images should - * use RSC_DEVMEM resource entries to map their required @da to the physical - * address of their base CMA region (ouch, hacky!). - * - * Return: 0 on success, or an appropriate error code otherwise - */ -static int rproc_handle_vdev(struct rproc *rproc, void *ptr, - int offset, int avail) +static struct rproc_vdev * +rproc_rvdev_add_device(struct rproc *rproc, struct rproc_vdev_data *rvdev_data) { - struct fw_rsc_vdev *rsc = ptr; - struct device *dev = &rproc->dev; struct rproc_vdev *rvdev; - int i, ret; + struct fw_rsc_vdev *rsc = rvdev_data->rsc; char name[16]; - - /* make sure resource isn't truncated */ - if (struct_size(rsc, vring, rsc->num_of_vrings) + rsc->config_len > - avail) { - dev_err(dev, "vdev rsc is truncated\n"); - return -EINVAL; - } - - /* make sure reserved bytes are zeroes */ - if (rsc->reserved[0] || rsc->reserved[1]) { - dev_err(dev, "vdev rsc has non zero reserved bytes\n"); - return -EINVAL; - } - - 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; - } + int i, ret; rvdev = kzalloc(sizeof(*rvdev), GFP_KERNEL); if (!rvdev) - return -ENOMEM; + return ERR_PTR(-ENOMEM); kref_init(&rvdev->refcount); - rvdev->id = rsc->id; + rvdev->id = rvdev_data->id; rvdev->rproc = rproc; - rvdev->index = rproc->nb_vdev++; + rvdev->index = rvdev_data->index; /* Initialise vdev subdevice */ snprintf(name, sizeof(name), "vdev%dbuffer", rvdev->index); @@ -563,7 +512,7 @@ static int rproc_handle_vdev(struct rproc *rproc, void *ptr, ret = device_register(&rvdev->dev); if (ret) { put_device(&rvdev->dev); - return ret; + return ERR_PTR(ret); } ret = copy_dma_range_map(&rvdev->dev, rproc->dev.parent); @@ -576,7 +525,7 @@ static int rproc_handle_vdev(struct rproc *rproc, void *ptr, ret = dma_coerce_mask_and_coherent(&rvdev->dev, dma_get_mask(rproc->dev.parent)); if (ret) { - dev_warn(dev, + dev_warn(&rvdev->dev, "Failed to set DMA mask %llx. Trying to continue... (%pe)\n", dma_get_mask(rproc->dev.parent), ERR_PTR(ret)); } @@ -589,7 +538,7 @@ static int rproc_handle_vdev(struct rproc *rproc, void *ptr, } /* remember the resource offset*/ - rvdev->rsc_offset = offset; + rvdev->rsc_offset = rvdev_data->rsc_offset; /* allocate the vring resources */ for (i = 0; i < rsc->num_of_vrings; i++) { @@ -605,21 +554,20 @@ static int rproc_handle_vdev(struct rproc *rproc, void *ptr, rproc_add_subdev(rproc, &rvdev->subdev); - return 0; + return rvdev; unwind_vring_allocations: for (i--; i >= 0; i--) rproc_free_vring(&rvdev->vring[i]); free_rvdev: device_unregister(&rvdev->dev); - return ret; + return ERR_PTR(ret); } -void rproc_vdev_release(struct kref *ref) +static void rproc_rvdev_remove_device(struct rproc_vdev *rvdev) { - struct rproc_vdev *rvdev = container_of(ref, struct rproc_vdev, refcount); - struct rproc_vring *rvring; struct rproc *rproc = rvdev->rproc; + struct rproc_vring *rvring; int id; for (id = 0; id < ARRAY_SIZE(rvdev->vring); id++) { @@ -632,6 +580,83 @@ void rproc_vdev_release(struct kref *ref) device_unregister(&rvdev->dev); } +/** + * rproc_handle_vdev() - handle a vdev fw resource + * @rproc: the remote processor + * @ptr: the vring resource descriptor + * @offset: offset of the resource entry + * @avail: size of available data (for sanity checking the image) + * + * This resource entry requests the host to statically register a virtio + * device (vdev), and setup everything needed to support it. It contains + * everything needed to make it possible: the virtio device id, virtio + * device features, vrings information, virtio config space, etc... + * + * Before registering the vdev, the vrings are allocated from non-cacheable + * physically contiguous memory. Currently we only support two vrings per + * remote processor (temporary limitation). We might also want to consider + * doing the vring allocation only later when ->find_vqs() is invoked, and + * then release them upon ->del_vqs(). + * + * Note: @da is currently not really handled correctly: we dynamically + * allocate it using the DMA API, ignoring requested hard coded addresses, + * and we don't take care of any required IOMMU programming. This is all + * going to be taken care of when the generic iommu-based DMA API will be + * merged. Meanwhile, statically-addressed iommu-based firmware images should + * use RSC_DEVMEM resource entries to map their required @da to the physical + * address of their base CMA region (ouch, hacky!). + * + * Return: 0 on success, or an appropriate error code otherwise + */ +static int rproc_handle_vdev(struct rproc *rproc, void *ptr, + int offset, int avail) +{ + struct fw_rsc_vdev *rsc = ptr; + struct device *dev = &rproc->dev; + struct rproc_vdev *rvdev; + struct rproc_vdev_data rvdev_data; + + /* make sure resource isn't truncated */ + if (struct_size(rsc, vring, rsc->num_of_vrings) + rsc->config_len > + avail) { + dev_err(dev, "vdev rsc is truncated\n"); + return -EINVAL; + } + + /* make sure reserved bytes are zeroes */ + if (rsc->reserved[0] || rsc->reserved[1]) { + dev_err(dev, "vdev rsc has non zero reserved bytes\n"); + return -EINVAL; + } + + 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; + } + + rvdev_data.id = rsc->id; + rvdev_data.index = rproc->nb_vdev++; + rvdev_data.rsc_offset = offset; + rvdev_data.rsc = rsc; + + rvdev = rproc_rvdev_add_device(rproc, &rvdev_data); + if (IS_ERR(rvdev)) + return PTR_ERR(rvdev); + + return 0; +} + +void rproc_vdev_release(struct kref *ref) +{ + struct rproc_vdev *rvdev = container_of(ref, struct rproc_vdev, refcount); + + 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 72d4d3d7d94d..99f2ff88079f 100644 --- a/drivers/remoteproc/remoteproc_internal.h +++ b/drivers/remoteproc/remoteproc_internal.h @@ -24,6 +24,21 @@ struct rproc_debug_trace { struct rproc_mem_entry trace_mem; }; +/** + * struct rproc_vdev_data - remoteproc virtio device data + * @rsc_offset: offset of the vdev's resource entry + * @id: virtio device id (as in virtio_ids.h) + * @index: vdev position versus other vdev declared in resource table + * @rsc: pointer to the vdev resource entry. Valid onlyduring vdev init as the resource can + * be cached by rproc. + */ +struct rproc_vdev_data { + u32 rsc_offset; + unsigned int id; + unsigned int index; + struct fw_rsc_vdev *rsc; +}; + /* from remoteproc_core.c */ void rproc_release(struct kref *kref); irqreturn_t rproc_vq_interrupt(struct rproc *rproc, int vq_id); -- 2.25.1