From patchwork Wed Aug 31 20:50:17 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Loic Pallardy X-Patchwork-Id: 75131 Delivered-To: patch@linaro.org Received: by 10.140.29.52 with SMTP id a49csp534213qga; Wed, 31 Aug 2016 13:56:47 -0700 (PDT) X-Received: by 10.66.161.195 with SMTP id xu3mr20321966pab.68.1472676737599; Wed, 31 Aug 2016 13:52:17 -0700 (PDT) Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id m6si1521848pfi.52.2016.08.31.13.52.16; Wed, 31 Aug 2016 13:52:17 -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 S934062AbcHaUwN (ORCPT + 27 others); Wed, 31 Aug 2016 16:52:13 -0400 Received: from mx08-00178001.pphosted.com ([91.207.212.93]:59570 "EHLO mx07-00178001.pphosted.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S933885AbcHaUv7 (ORCPT ); Wed, 31 Aug 2016 16:51:59 -0400 Received: from pps.filterd (m0046661.ppops.net [127.0.0.1]) by mx08-00178001.pphosted.com (8.16.0.11/8.16.0.11) with SMTP id u7VKnBtD015758; Wed, 31 Aug 2016 22:51:47 +0200 Received: from beta.dmz-eu.st.com (beta.dmz-eu.st.com [164.129.1.35]) by mx08-.pphosted.com with ESMTP id 255btkb8j1-1 (version=TLSv1 cipher=ECDHE-RSA-AES256-SHA bits=256 verify=NOT); Wed, 31 Aug 2016 22:51:47 +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 2BC7331; Wed, 31 Aug 2016 20:51:47 +0000 (GMT) Received: from Webmail-eu.st.com (Safex1hubcas23.st.com [10.75.90.46]) by zeta.dmz-eu.st.com (STMicroelectronics) with ESMTP id 11C8750E2; Wed, 31 Aug 2016 20:51:47 +0000 (GMT) Received: from localhost (10.129.5.21) by webmail-ga.st.com (10.75.90.48) with Microsoft SMTP Server (TLS) id 14.3.279.2; Wed, 31 Aug 2016 22:51:46 +0200 From: Loic Pallardy To: , , CC: , , , Subject: [PATCH v2 14/19] remoteproc: core: Add resource request action support Date: Wed, 31 Aug 2016 22:50:17 +0200 Message-ID: <1472676622-32533-15-git-send-email-loic.pallardy@st.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1472676622-32533-1-git-send-email-loic.pallardy@st.com> References: <1472676622-32533-1-git-send-email-loic.pallardy@st.com> MIME-Version: 1.0 X-Originating-IP: [10.129.5.21] X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:, , definitions=2016-08-31_04:, , 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 | 96 ++++++++++++++++++++---------------- 1 file changed, 53 insertions(+), 43 deletions(-) -- 1.9.1 diff --git a/drivers/remoteproc/remoteproc_core.c b/drivers/remoteproc/remoteproc_core.c index 25a429b..67b83d0 100644 --- a/drivers/remoteproc/remoteproc_core.c +++ b/drivers/remoteproc/remoteproc_core.c @@ -1171,58 +1171,64 @@ static int __add_rsc_tbl_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; } - - 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: + if (__verify_rsc_tbl_entry(rproc, resource, table, size)) { + ret = -EINVAL; + goto out; + } + break; + case RSC_ACT_UPDATE: + /* If we already have a table, update it with the new values. */ + ret = __update_rsc_tbl_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 = __update_rsc_tbl_entry(rproc, resource, table, size, true); + if (ret < 0) + goto out; - /* If we already have a table, update it with the new values. */ - updated = __update_rsc_tbl_entry(rproc, resource, table, size, - false); - if (updated < 0) { - table = ERR_PTR(updated); - goto out; - } - if (updated) - continue; + if (ret) + break; - /* Didn't find matching resource entry -- creating a new one. */ - updated = __add_rsc_tbl_entry(rproc, resource, table, size); - if (updated) + /* Didn't find matching resource entry -- creating a new one. */ + ret = __add_rsc_tbl_entry(rproc, resource, table, size); + if (ret) + goto out; + + break; + case RSC_ACT_LOCAL: + /* nothing to do */ + break; + default: + dev_err(&rproc->dev, "Unsupported resource action: %d\n", + resource->action); + ret = -EINVAL; goto out; + }; } - rproc_dump_resource_table(rproc, table, size); - - *tablesz = size; - out: - return table; + rproc_dump_resource_table(rproc, table, tablesz); + return ret; } /* @@ -1261,12 +1267,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 @@ -1281,6 +1281,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) { + dev_err(dev, "Failed to apply overrides resources\n"); + goto clean_up; + } + + } + /* reset max_notifyid */ rproc->max_notifyid = -1;