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: 9373523 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id DFE8460839 for ; Wed, 12 Oct 2016 16:18:33 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id D0519296BC for ; Wed, 12 Oct 2016 16:18:33 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id C4E4E296C1; Wed, 12 Oct 2016 16:18:33 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=2.0 tests=BAYES_00,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id E9525296BC for ; Wed, 12 Oct 2016 16:18:32 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754866AbcJLQSc (ORCPT ); Wed, 12 Oct 2016 12:18:32 -0400 Received: from mx07-00178001.pphosted.com ([62.209.51.94]:34850 "EHLO mx07-00178001.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753712AbcJLQSc (ORCPT ); Wed, 12 Oct 2016 12:18:32 -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-remoteproc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-remoteproc@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP 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(-) 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;