From patchwork Fri Oct 27 12:44:12 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Loic Pallardy X-Patchwork-Id: 117316 Delivered-To: patch@linaro.org Received: by 10.140.22.164 with SMTP id 33csp727681qgn; Fri, 27 Oct 2017 05:45:14 -0700 (PDT) X-Google-Smtp-Source: ABhQp+Th3cVf8vuVPGeTh9r4tm816f2TcTfcbTBzUwzFQQ/IIbUAsPLcXhmmeBRjRoRATGNHFJOH X-Received: by 10.84.234.199 with SMTP id i7mr293402plt.15.1509108313911; Fri, 27 Oct 2017 05:45:13 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1509108313; cv=none; d=google.com; s=arc-20160816; b=jggD6gYZdjh+Q/BvVf6I9xodI0PZuLA+a+6C1vDKUBawVKxQrQxKdVr9IlvXQg6FDj j3cB1TwjRlYpbZm5oWYG5T6l7uf3zS7LjdCLmjFgT2PvtivEgiLH0nxCTdf9jssKaXoa KW7b8UlGHRAK4r/6wc+vmmI1wwauC83O8x4CI7+NTmsMPm6Bds8aqXkRU3STTi+k8lpb yJ23sJuhD2hPXU6yVNK+sYP6m6RPQiaayY3I4+EJrnsvg3ss3W14Q1BgThlE1EKK+TfC Ti5RLqIFMLfoviPT1QmRzYtrNocZxQb/TuNEfGYZ39O08+aYwCIKWGR9KeOQE2RtTSWM jG+w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:arc-authentication-results; bh=kfIybiZrRFmbLp69G04wDpzKWQ1RYst1WhIH+V4z+48=; b=ZHJD8Yx2p7Klj7uf6RJqlk88tgGWsND1O6As27GaefeRc8K7phKTrttfk+9I4Q8aWZ bgWXsX9YqCl1E9Fjvdm81adBhf/2wW0RW7iqfnkW7C+e3Wfh+ZuIHGqioO4VrVcAY3YM i7fDcMq25hr3vNqeOCl5caH6tmetrJRBQPrWtmnE0cfgfh2xAq/zPmY/EcJHKRuUmdRS zW0q27VJbuaqY9YU0mfoDvlCwJyS6k8KpSyiCoWIqn+GsZP0yMpB0gl4AhOL4IQ2S6UZ /e2L72gKdCag9X1r+Dva8MP/KzDQDIrl7tedcz/P0zemKR0XNKl7obobTBaP33OFF+l8 S4Cg== ARC-Authentication-Results: i=1; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id y23si5364448pfa.140.2017.10.27.05.45.13; Fri, 27 Oct 2017 05:45:13 -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 S1752695AbdJ0MpK (ORCPT + 27 others); Fri, 27 Oct 2017 08:45:10 -0400 Received: from mx08-00178001.pphosted.com ([91.207.212.93]:38010 "EHLO mx07-00178001.pphosted.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752629AbdJ0Mog (ORCPT ); Fri, 27 Oct 2017 08:44:36 -0400 Received: from pps.filterd (m0046660.ppops.net [127.0.0.1]) by mx08-.pphosted.com (8.16.0.21/8.16.0.21) with SMTP id v9RCi2oP004813; Fri, 27 Oct 2017 14:44:34 +0200 Received: from beta.dmz-eu.st.com (beta.dmz-eu.st.com [164.129.1.35]) by mx08-00178001.pphosted.com with ESMTP id 2dtg42ywkf-1 (version=TLSv1 cipher=ECDHE-RSA-AES256-SHA bits=256 verify=NOT); Fri, 27 Oct 2017 14:44:34 +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 4C93234; Fri, 27 Oct 2017 12:44:34 +0000 (GMT) Received: from Webmail-eu.st.com (sfhdag7node2.st.com [10.75.127.20]) by zeta.dmz-eu.st.com (STMicroelectronics) with ESMTP id 3849E26E0; Fri, 27 Oct 2017 12:44:34 +0000 (GMT) Received: from localhost (10.75.127.48) by SFHDAG7NODE2.st.com (10.75.127.20) with Microsoft SMTP Server (TLS) id 15.0.1347.2; Fri, 27 Oct 2017 14:44:33 +0200 From: Loic Pallardy To: , CC: , , , , Loic Pallardy Subject: [PATCH 5/7] remoteproc: modify rproc_handle_carveout to support preallocated region Date: Fri, 27 Oct 2017 14:44:12 +0200 Message-ID: <1509108254-22296-6-git-send-email-loic.pallardy@st.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1509108254-22296-1-git-send-email-loic.pallardy@st.com> References: <1509108254-22296-1-git-send-email-loic.pallardy@st.com> MIME-Version: 1.0 X-Originating-IP: [10.75.127.48] X-ClientProxiedBy: SFHDAG4NODE1.st.com (10.75.127.10) To SFHDAG7NODE2.st.com (10.75.127.20) X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:, , definitions=2017-10-27_07:, , signatures=0 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org In current version rproc_handle_carveout function support only dynamic region allocation. This patch extends rproc_handle_carveout function to support different carveout configurations: - fixed DA and fixed PA: check if already part of pre-registered carveouts (platform driver). If no, return error. - fixed DA and any PA: check if already part of pre-allocated carveouts (platform driver). If not found and rproc supports iommu, continue with dynamic allocation (DA will be used for iommu programming), else return error as no way to force DA. - any DA and any PA: use original dynamic allocation Signed-off-by: Loic Pallardy --- drivers/remoteproc/remoteproc_core.c | 40 ++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) -- 1.9.1 diff --git a/drivers/remoteproc/remoteproc_core.c b/drivers/remoteproc/remoteproc_core.c index 78525d1..515a17a 100644 --- a/drivers/remoteproc/remoteproc_core.c +++ b/drivers/remoteproc/remoteproc_core.c @@ -184,6 +184,10 @@ void *rproc_da_to_va(struct rproc *rproc, u64 da, int len) struct rproc_mem_entry *carveout; void *ptr = NULL; + /* + * da_to_va platform driver is deprecated. Driver should register + * carveout thanks to rproc_add_carveout function + */ if (rproc->ops->da_to_va) { ptr = rproc->ops->da_to_va(rproc, da, len); if (ptr) @@ -677,6 +681,7 @@ static int rproc_handle_carveout(struct rproc *rproc, struct rproc_mem_entry *carveout, *mapping; struct device *dev = &rproc->dev; dma_addr_t dma; + phys_addr_t pa; void *va; int ret; @@ -698,6 +703,41 @@ static int rproc_handle_carveout(struct rproc *rproc, if (!carveout) return -ENOMEM; + /* Check carveout rsc already part of a registered carveout */ + if (rsc->da != FW_RSC_ADDR_ANY) { + va = rproc_find_carveout_by_da(rproc, rsc->da, rsc->len); + + if (va) { + /* Registered region found */ + pa = rproc_va_to_pa(va); + if (rsc->pa != FW_RSC_ADDR_ANY && rsc->pa != (u32)pa) { + /* Carveout doesn't match request */ + dev_err(dev->parent, + "Failed to find carveout fitting da and pa\n"); + return -ENOMEM; + } + + /* Update rsc table with physical address */ + rsc->pa = (u32)pa; + + /* Update carveouts list */ + carveout->va = va; + carveout->len = rsc->len; + carveout->da = rsc->da; + carveout->priv = (void *)CARVEOUT_RSC; + + list_add_tail(&carveout->node, &rproc->carveouts); + + return 0; + } + + if (!rproc->domain) { + dev_err(dev->parent, + "Bad carveout rsc configuration\n"); + return -ENOMEM; + } + } + va = dma_alloc_coherent(dev->parent, rsc->len, &dma, GFP_KERNEL); if (!va) { dev_err(dev->parent,