From patchwork Thu Nov 30 16:46:40 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Loic Pallardy X-Patchwork-Id: 120239 Delivered-To: patch@linaro.org Received: by 10.140.22.227 with SMTP id 90csp21655qgn; Thu, 30 Nov 2017 08:47:23 -0800 (PST) X-Google-Smtp-Source: AGs4zMYLZfv5h7tF+PoVbKfBQJfL7ry4HiHV1FMlH1+OqphVQ7A+qQsDNE8wNhtfmk0zQvlCXjvc X-Received: by 10.84.137.106 with SMTP id 97mr3260353plm.429.1512060443243; Thu, 30 Nov 2017 08:47:23 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1512060443; cv=none; d=google.com; s=arc-20160816; b=my7Jir4KKLNSq+lsCn6zhG0QPPZfijcH2++HXiTeyWWf3ewk0C8MItGNUM9IHpHqp+ dGAzE/5qa+hSar3MB+RGGQnodhfew86tU9+lFxx6+zQkfG9tXUQSWkwJ32AMxRP1xkRu 9cO0tpufvQ5anueBvahmh0fAxuArTzaSrUb6YWuOEo1D69fCUG42yU+JlBKuHfderrei MCcK9LsqzO/Ayg1p0G0vMAGG3S1pATyIXOg3k7MBCHPdIChS2/P9udeXhaHGEluThHz8 wJJXcy0uyJS236o/M93qQ/VvhUnBcwowJ9M7z7oKdPnj56Wm/PF+OkQUh4q4zZX0IDB8 6yOw== 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=MI5EEgtwbTRnd4dL2s1fxOpGeQMBU2Sc60ROuySGVCxUJMUgYbPOG53/fMJvjq47+i 9zRN5pO3EP8q7OApBpDy+ylJ8Zl4j51v+7s9WeZG3BmvuwHsN1qFRBWAUiEf+I4iO8Oi uWsm3i/J5oRdwtKKO04yQaiaIyMPDsUhQTgcnYc+vQhqzVA4WDTuR30eEcrYS6fC5K3F nbE7OWDm+RIQzAw52nNBmSePaPk31O8BzcAM3MPH5ao0r4lNRlBNprJqIWDFdZUaQjZq HLyleoIJvMghLoL7BWmM5k4DiFlxyAjYsD1rnkBq7oPT2yNKP4zbRzNn+SJGE4N5dbeN rA8Q== 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 k4si3231917pgf.300.2017.11.30.08.47.22; Thu, 30 Nov 2017 08:47:23 -0800 (PST) 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 S1753780AbdK3QrV (ORCPT + 28 others); Thu, 30 Nov 2017 11:47:21 -0500 Received: from mx08-00178001.pphosted.com ([91.207.212.93]:19485 "EHLO mx07-00178001.pphosted.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1753611AbdK3QrR (ORCPT ); Thu, 30 Nov 2017 11:47:17 -0500 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 vAUGiFI9001566; Thu, 30 Nov 2017 17:47:15 +0100 Received: from beta.dmz-eu.st.com (beta.dmz-eu.st.com [164.129.1.35]) by mx08-00178001.pphosted.com with ESMTP id 2eexh9v2rk-1 (version=TLSv1 cipher=ECDHE-RSA-AES256-SHA bits=256 verify=NOT); Thu, 30 Nov 2017 17:47:15 +0100 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 D052042; Thu, 30 Nov 2017 16:47:14 +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 9AAF2537A; Thu, 30 Nov 2017 16:47:14 +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; Thu, 30 Nov 2017 17:47:14 +0100 From: Loic Pallardy To: , CC: , , , , Loic Pallardy Subject: [PATCH v2 05/16] remoteproc: modify rproc_handle_carveout to support preallocated region Date: Thu, 30 Nov 2017 17:46:40 +0100 Message-ID: <1512060411-729-6-git-send-email-loic.pallardy@st.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1512060411-729-1-git-send-email-loic.pallardy@st.com> References: <1512060411-729-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-11-30_05:, , 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,