From patchwork Wed Oct 12 16:00:21 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Loic PALLARDY X-Patchwork-Id: 9373459 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 7D050607FD for ; Wed, 12 Oct 2016 16:04:13 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 6DA9729686 for ; Wed, 12 Oct 2016 16:04:13 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 625A529687; Wed, 12 Oct 2016 16:04:13 +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 83F1529688 for ; Wed, 12 Oct 2016 16:04:09 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755529AbcJLQDx (ORCPT ); Wed, 12 Oct 2016 12:03:53 -0400 Received: from mx07-00178001.pphosted.com ([62.209.51.94]:1943 "EHLO mx07-00178001.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753422AbcJLQCx (ORCPT ); Wed, 12 Oct 2016 12:02:53 -0400 Received: from pps.filterd (m0046037.ppops.net [127.0.0.1]) by m0046037.ppops.net (8.16.0.11/8.16.0.11) with SMTP id u9CFxTVc024457; Wed, 12 Oct 2016 18:01:08 +0200 Received: from beta.dmz-eu.st.com (beta.dmz-eu.st.com [164.129.1.35]) by mx07-.pphosted.com with ESMTP id 2615cu5d52-1 (version=TLSv1 cipher=ECDHE-RSA-AES256-SHA bits=256 verify=NOT); Wed, 12 Oct 2016 18:01:08 +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 C125E34; Wed, 12 Oct 2016 16:01:07 +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 AAD312AB0; Wed, 12 Oct 2016 16:01:07 +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:07 +0200 From: Loic Pallardy To: , , CC: , , , Subject: [PATCH v3 03/20] remoteproc: core: Add function to amend an existing resource table entry Date: Wed, 12 Oct 2016 18:00:21 +0200 Message-ID: <1476288038-24909-4-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 From: Lee Jones Sometimes the firmware does not know best. When a firmware is built, it can be loaded with a resource table, usually detailing shared; memory, virtual device, trace log information etc. However, some vendors require this hard-coded information to be amended with new/improved information obtained from Device Tree for instance. Until now, no method exists which allows the resource table to be amended. The addition of this function changes that. It is now possible to pull in a resource table and amend it before it is finally shared with the remote device. Signed-off-by: Lee Jones Signed-off-by: Loic Pallardy --- drivers/remoteproc/remoteproc_core.c | 63 ++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/drivers/remoteproc/remoteproc_core.c b/drivers/remoteproc/remoteproc_core.c index 3c8395b..c3830b4 100644 --- a/drivers/remoteproc/remoteproc_core.c +++ b/drivers/remoteproc/remoteproc_core.c @@ -909,6 +909,69 @@ int rproc_request_resource(struct rproc *rproc, u32 type, void *resource) } EXPORT_SYMBOL(rproc_request_resource); +static int rproc_update_resource_table_entry(struct rproc *rproc, + struct rproc_request_resource *request, + struct resource_table *table, int size) +{ + struct fw_rsc_carveout *tblc, *newc; + struct fw_rsc_devmem *tbld, *newd; + struct fw_rsc_trace *tblt, *newt; + int updated = true; + int i; + + for (i = 0; i < table->num; i++) { + int offset = table->offset[i]; + struct fw_rsc_hdr *hdr = (void *)table + offset; + void *rsc = (void *)hdr + sizeof(*hdr); + + if (request->type != hdr->type) + continue; + + switch (hdr->type) { + case RSC_CARVEOUT: + tblc = rsc; + newc = request->resource; + + if (strncmp(newc->name, tblc->name, + sizeof(*tblc->name))) + break; + + memcpy(tblc, newc, request->size); + + return updated; + case RSC_DEVMEM: + tbld = rsc; + newd = request->resource; + + if (strncmp(newd->name, tbld->name, + sizeof(*tbld->name))) + break; + + memcpy(tbld, newd, request->size); + + return updated; + case RSC_TRACE: + tblt = rsc; + newt = request->resource; + + if (strncmp(newt->name, tblt->name, + sizeof(*tblt->name))) + break; + + memcpy(tblt, newt, request->size); + + return updated; + default: + dev_err(&rproc->dev, + "Unsupported resource type: %d\n", + hdr->type); + return -EINVAL; + } + } + + return !updated; +} + /* * take a firmware and boot a remote processor with it. */