From patchwork Wed Aug 31 20:50:13 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Loic Pallardy X-Patchwork-Id: 75119 Delivered-To: patch@linaro.org Received: by 10.140.29.52 with SMTP id a49csp532536qga; Wed, 31 Aug 2016 13:51:56 -0700 (PDT) X-Received: by 10.98.95.129 with SMTP id t123mr20537604pfb.148.1472676716338; Wed, 31 Aug 2016 13:51:56 -0700 (PDT) Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id sl8si1457005pab.264.2016.08.31.13.51.56; Wed, 31 Aug 2016 13:51:56 -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 S933840AbcHaUvj (ORCPT + 27 others); Wed, 31 Aug 2016 16:51:39 -0400 Received: from mx08-00178001.pphosted.com ([91.207.212.93]:59542 "EHLO mx07-00178001.pphosted.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S933759AbcHaUvc (ORCPT ); Wed, 31 Aug 2016 16:51:32 -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 u7VKnV2q015778; Wed, 31 Aug 2016 22:51:29 +0200 Received: from beta.dmz-eu.st.com (beta.dmz-eu.st.com [164.129.1.35]) by mx08-.pphosted.com with ESMTP id 255btkb8g8-1 (version=TLSv1 cipher=ECDHE-RSA-AES256-SHA bits=256 verify=NOT); Wed, 31 Aug 2016 22:51:29 +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 6B2D234; Wed, 31 Aug 2016 20:51:28 +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 52AC450E5; Wed, 31 Aug 2016 20:51:28 +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:27 +0200 From: Loic Pallardy To: , , CC: , , , Subject: [PATCH v2 10/19] remoteproc: core: Add function to verify an existing resource in rsc table Date: Wed, 31 Aug 2016 22:50:13 +0200 Message-ID: <1472676622-32533-11-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 When a firmware is build, it can be loaded with a resource usually detailing shared; memory, virtual device, trace log information etc. However, some SoCs or platforms require some hard-coded information. Information may be fixed on both sides: firmware and rproc. Until now, no method exists which allows to compare resource table fixed resources and rproc driver configuration. This new function changes that performing comparison between resources. Only carveout resource supported for the moment. It is rproc driver responsibility to provide list of resources to verify during boot. Signed-off-by: Loic Pallardy --- drivers/remoteproc/remoteproc_core.c | 47 ++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) -- 1.9.1 diff --git a/drivers/remoteproc/remoteproc_core.c b/drivers/remoteproc/remoteproc_core.c index 345bdfb..ffb56c0 100644 --- a/drivers/remoteproc/remoteproc_core.c +++ b/drivers/remoteproc/remoteproc_core.c @@ -951,6 +951,53 @@ int rproc_request_resource(struct rproc *rproc, u32 type, u32 action, void *reso } EXPORT_SYMBOL(rproc_request_resource); +static int __verify_rsc_tbl_entry(struct rproc *rproc, + struct rproc_request_resource *request, + struct resource_table *table, int size) +{ + struct fw_rsc_carveout *tblc, *newc; + 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; + + /* verify firmware resource is part of rproc one */ + if (tblc->pa != FW_RSC_ADDR_ANY) { + int pa_offset = tblc->pa - newc->pa; + + /* is carevout too small ? */ + if (pa_offset < 0) + return -EINVAL; + + if (pa_offset + tblc->len > newc->len) + return -EINVAL; + } + return 0; + default: + dev_err(&rproc->dev, + "Unsupported resource type: %d\n", + hdr->type); + return -EINVAL; + } + } + + return -EINVAL; +} + static int rproc_update_resource_table_entry(struct rproc *rproc, struct rproc_request_resource *request, struct resource_table *table, int size)