From patchwork Wed Oct 12 16:00:34 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Loic Pallardy X-Patchwork-Id: 77579 Delivered-To: patch@linaro.org Received: by 10.140.97.247 with SMTP id m110csp553618qge; Wed, 12 Oct 2016 10:54:34 -0700 (PDT) X-Received: by 10.66.82.36 with SMTP id f4mr3016344pay.49.1476294874091; Wed, 12 Oct 2016 10:54:34 -0700 (PDT) Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id y9si8690964paa.103.2016.10.12.10.54.33; Wed, 12 Oct 2016 10:54:34 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933150AbcJLRy3 (ORCPT + 27 others); Wed, 12 Oct 2016 13:54:29 -0400 Received: from mx07-00178001.pphosted.com ([62.209.51.94]:39267 "EHLO mx07-00178001.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755096AbcJLRyV (ORCPT ); Wed, 12 Oct 2016 13:54:21 -0400 Received: from pps.filterd (m0046668.ppops.net [127.0.0.1]) by mx07-00178001.pphosted.com (8.16.0.11/8.16.0.11) with SMTP id u9CFvgWP015204; Wed, 12 Oct 2016 18:01:22 +0200 Received: from beta.dmz-eu.st.com (beta.dmz-eu.st.com [164.129.1.35]) by mx07-.pphosted.com with ESMTP id 2615d4dd2u-1 (version=TLSv1 cipher=ECDHE-RSA-AES256-SHA bits=256 verify=NOT); Wed, 12 Oct 2016 18:01:22 +0200 Received: from zeta.dmz-eu.st.com (zeta.dmz-eu.st.com [164.129.230.9]) by beta.dmz-eu.st.com (STMicroelectronics) with ESMTP id 9A69D31; Wed, 12 Oct 2016 16:01:21 +0000 (GMT) Received: from Webmail-eu.st.com (Safex1hubcas22.st.com [10.75.90.92]) by zeta.dmz-eu.st.com (STMicroelectronics) with ESMTP id 83C812AB4; Wed, 12 Oct 2016 16:01:21 +0000 (GMT) Received: from localhost (10.201.23.23) by Webmail-ga.st.com (10.75.90.48) with Microsoft SMTP Server (TLS) id 14.3.279.2; Wed, 12 Oct 2016 18:01:21 +0200 From: Loic Pallardy To: , , CC: , , , Subject: [PATCH v3 16/20] remoteproc: core: Add resource request action support Date: Wed, 12 Oct 2016 18:00:34 +0200 Message-ID: <1476288038-24909-17-git-send-email-loic.pallardy@st.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1476288038-24909-1-git-send-email-loic.pallardy@st.com> References: <1476288038-24909-1-git-send-email-loic.pallardy@st.com> MIME-Version: 1.0 X-Originating-IP: [10.201.23.23] X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:, , definitions=2016-10-12_09:, , signatures=0 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Handle resource requests according to associated action. Signed-off-by: Loic Pallardy --- drivers/remoteproc/remoteproc_core.c | 98 ++++++++++++++++++++---------------- 1 file changed, 55 insertions(+), 43 deletions(-) -- 1.9.1 diff --git a/drivers/remoteproc/remoteproc_core.c b/drivers/remoteproc/remoteproc_core.c index f4a02f0..559a63b 100644 --- a/drivers/remoteproc/remoteproc_core.c +++ b/drivers/remoteproc/remoteproc_core.c @@ -1145,61 +1145,69 @@ static int rproc_add_resource_table_entry(struct rproc *rproc, return 0; } -static struct resource_table* -rproc_apply_resource_overrides(struct rproc *rproc, - struct resource_table **orig_table, - int *tablesz) +static int rproc_apply_resource_overrides(struct rproc *rproc, + struct resource_table *table, + int tablesz) { struct rproc_request_resource *resource; - struct resource_table *table = *orig_table; - int size = *tablesz; + int ret = 0, size = tablesz; if (!table && size != 0) { dev_err(&rproc->dev, "No table present but table size is set\n"); - return ERR_PTR(-EINVAL); + ret = -EINVAL; + goto out; } - if (IS_ENABLED(DEBUG) || IS_ENABLED(CONFIG_DYNAMIC_DEBUG)) - rproc_dump_resource_table(rproc, table, size); - - if (!table) { - size = sizeof(*table); - table = devm_kzalloc(&rproc->dev, size, GFP_KERNEL); - if (!table) { - table = ERR_PTR(-ENOMEM); - goto out; - } - table->ver = 1; - } + rproc_dump_resource_table(rproc, table, tablesz); list_for_each_entry(resource, &rproc->override_resources, node) { - int updated = 0; + switch (resource->action) { + case RSC_ACT_VERIFY: + ret = rproc_verify_resource_table_entry(rproc, resource, + table, size); + if (ret) { + ret = -EINVAL; + goto out; + } + break; + case RSC_ACT_UPDATE: + /* If we already have a table, update it with the new values. */ + ret = rproc_update_resource_table_entry(rproc, resource, + table, size, false); + if (ret < 0) + goto out; + break; + case RSC_ACT_FORCE_UPDATE: + /* If we already have a table, update it with the new values. */ + ret = rproc_update_resource_table_entry(rproc, resource, + table, size, true); + if (ret < 0) + goto out; + + if (ret) + break; - /* If we already have a table, update it with the new values. */ - updated = rproc_update_resource_table_entry(rproc, resource, - table, size, false); - if (updated < 0) { - table = ERR_PTR(updated); - goto out; - } - if (updated) - continue; + /* Didn't find matching resource entry -- creating a new one. */ + ret = rproc_add_resource_table_entry(rproc, resource, + table, size); + if (ret) + goto out; - /* Didn't find matching resource entry -- creating a new one. */ - updated = rproc_add_resource_table_entry(rproc, resource, - table, size); - if (updated) + break; + default: + dev_err(&rproc->dev, "Unsupported resource action: %d\n", + resource->action); + ret = -EINVAL; goto out; + }; } if (IS_ENABLED(DEBUG) || IS_ENABLED(CONFIG_DYNAMIC_DEBUG)) - rproc_dump_resource_table(rproc, table, size); - - *tablesz = size; + rproc_dump_resource_table(rproc, table, tablesz); out: - return table; + return ret; } /* @@ -1238,12 +1246,6 @@ static int rproc_fw_boot(struct rproc *rproc, const struct firmware *fw) goto clean_up; } - if (!list_empty(&rproc->override_resources)) { - table = rproc_apply_resource_overrides(rproc, &table, &tablesz); - if (IS_ERR(table)) - goto clean_up; - } - /* * Create a copy of the resource table. When a virtio device starts * and calls vring_new_virtqueue() the address of the allocated vring @@ -1256,6 +1258,16 @@ static int rproc_fw_boot(struct rproc *rproc, const struct firmware *fw) rproc->table_ptr = rproc->cached_table; + if (!list_empty(&rproc->override_resources)) { + ret = rproc_apply_resource_overrides(rproc, rproc->cached_table, + tablesz); + if (ret < 0) { + dev_err(dev, "Failed to apply overrides resources\n"); + goto clean_up; + } + + } + /* reset max_notifyid */ rproc->max_notifyid = -1;