From patchwork Mon Sep 24 00:41:34 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 973791 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-tegra-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="KtNLuEC8"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 42JQVj69H5z9s3C for ; Mon, 24 Sep 2018 10:46:05 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727320AbeIXGpl (ORCPT ); Mon, 24 Sep 2018 02:45:41 -0400 Received: from mail-pl1-f195.google.com ([209.85.214.195]:45246 "EHLO mail-pl1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726053AbeIXGpk (ORCPT ); Mon, 24 Sep 2018 02:45:40 -0400 Received: by mail-pl1-f195.google.com with SMTP id j8-v6so8330518pll.12; Sun, 23 Sep 2018 17:46:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=ImtNeDFgwkeNNxKU07DnlmMuPLQIHVyVVmQEszJwKBI=; b=KtNLuEC8GJgiz9sgV7j1aawXwBosKjjRjJSfr4+rHvqjzE9nqrgzpO5BPrsz1CpdB3 K0NsEk8o1/7IDIU0FbQe6v/vW0cKmi2pis+ND7GBce34rScELVDye7Fc9vDC3XTrFe6V avW0doSyXI+7BgU+3u01FKrnZ34LvEjraxMF/VyUoTTXPCpmS7I4WrelJRDd/wSTiKQk WZCBKQV5eHomm1e2JEOKxE5TQIN/zVpsD8DIO2T65YOhgOmoTxs8XYqjszuy2QRwUWdC KQnwW34tSPaBK2lATlIUlfOZtn0mu18fmtSLfiZWenX/wwt9ycrMwOnwNO7pMcK7UGt3 GEBg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=ImtNeDFgwkeNNxKU07DnlmMuPLQIHVyVVmQEszJwKBI=; b=WsqFYsfi6Cexn2otSfInP7vcmvEeIkjjKHtaHvufcONC32yV+4hCYBVfk9pF0GmlJB /dSahldEhYj/1NFTtBUQ+XnzlIEwB3o/PeKLkujbU1m72X71rnTNZXVUbTNEZqoVJ+ch M0Qc9Gymgf4u0BcS1m05j++vl4NxXjrz05RzegZXXMUTVUYFDejWamXBjj7c3CPXcmQI XopaHITZw9tz3IENKrFhYw4SrbqxSTOypl10rty1Lzl+tUFqZgvL7sJpfDTFT2ggn0Ok 5otXgnYxtogXH1Nyo4aaa6W/HaLJGV4Wn6mkW3B8Zgzo3cs2DHDdP6FXbWjp8amv6WV7 ctXQ== X-Gm-Message-State: ABuFfojCyv3k2OF6VoxFZEJP5Y6aJwYLxpxOGTR2mgoFuyn1mp/fX2fd 2tSmIJw9Kgv68TDTMLJQBU8= X-Google-Smtp-Source: ACcGV63Yr3cNdbSY5DTB5GSFKrpdIXCFJ0hEvk1Lo0w06Bgmop3PYJnUzzluery9TKP4Mtfrz/f1/Q== X-Received: by 2002:a17:902:2f43:: with SMTP id s61-v6mr8133569plb.176.1537749963644; Sun, 23 Sep 2018 17:46:03 -0700 (PDT) Received: from localhost.localdomain (109-252-91-213.nat.spd-mgts.ru. [109.252.91.213]) by smtp.gmail.com with ESMTPSA id 82-v6sm5121839pfr.115.2018.09.23.17.45.58 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 23 Sep 2018 17:46:03 -0700 (PDT) From: Dmitry Osipenko To: Thierry Reding , Jonathan Hunter , Joerg Roedel , Rob Herring , Robin Murphy Cc: iommu@lists.linux-foundation.org, devicetree@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 01/20] iommu/tegra: gart: Remove pr_fmt and clean up includes Date: Mon, 24 Sep 2018 03:41:34 +0300 Message-Id: <20180924004153.8232-2-digetx@gmail.com> X-Mailer: git-send-email 2.19.0 In-Reply-To: <20180924004153.8232-1-digetx@gmail.com> References: <20180924004153.8232-1-digetx@gmail.com> MIME-Version: 1.0 Sender: linux-tegra-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org Remove unneeded headers inclusion and sort the headers in alphabet order. Remove pr_fmt macro since there is no pr_*() in the code and it doesn't affect dev_*() functions. Signed-off-by: Dmitry Osipenko Acked-by: Thierry Reding --- drivers/iommu/tegra-gart.c | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/drivers/iommu/tegra-gart.c b/drivers/iommu/tegra-gart.c index 7b1361d57a17..6dda7ee1d36c 100644 --- a/drivers/iommu/tegra-gart.c +++ b/drivers/iommu/tegra-gart.c @@ -17,21 +17,14 @@ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. */ -#define pr_fmt(fmt) "%s(): " fmt, __func__ - +#include +#include +#include #include -#include -#include +#include #include +#include #include -#include -#include -#include -#include -#include -#include - -#include /* bitmap of the page sizes currently supported */ #define GART_IOMMU_PGSIZES (SZ_4K) From patchwork Mon Sep 24 00:41:35 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 973792 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-tegra-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="a1Rir0dY"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 42JQVr335Rz9s3C for ; Mon, 24 Sep 2018 10:46:12 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727357AbeIXGpq (ORCPT ); Mon, 24 Sep 2018 02:45:46 -0400 Received: from mail-pf1-f196.google.com ([209.85.210.196]:37759 "EHLO mail-pf1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726053AbeIXGpq (ORCPT ); Mon, 24 Sep 2018 02:45:46 -0400 Received: by mail-pf1-f196.google.com with SMTP id a18-v6so1501756pfo.4; Sun, 23 Sep 2018 17:46:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=qIv3vTRv+J8tb4vjEUWUp/YU2ZUCcpaHFqa4rq9cf38=; b=a1Rir0dY76KCXqWSZolEfGqrXWRB0upz0oeGy99pJ6d3nOVmmrxd14gvgrZnLL/JCC owdm26ozcHC3u9azx0e6PNVeoeUly6iARoKub63ffERkGAKBSeR/RJd4QqUXhGXE5Ret KzezqCTVZkNS12N/59x1wOJif2XjYP7cIVYyWulNiOhFR35sco48Vi3E0lp7nYx0zLQM hjsjafVSoam8qALwYPAiklDcYyqxX00t17Uk3YwGKXaWDoi0R/2iAhtQR7YjAb5pfmSG 5MSrFQgajWBFqDzdM9zu5m0fhri157TQyDrCwRn1Bt7jljKCUAlzJmJnpe4iqIS0IA60 8jvg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=qIv3vTRv+J8tb4vjEUWUp/YU2ZUCcpaHFqa4rq9cf38=; b=t6gsyl+ihONGY+9/GJhkvt97Yl4zg473Fd+k/PyPjfrEiyWj6yk25Ac/WTT4YynpFb 5bkmN1f3ATiMNcIjxhkwjZKkIpWLb8wPXwZlxzP/nCMX2KdOxLNZpPMd+Ak3hYOOMERh CEvLJ6gZhrzlOnv8BwmzMrJ1PeRQ3sy2hREB7FOOgviQbHati6BrLUhlHSqPxHZEei8B lnagPqsNdTnUprf7gwl7BydMDPOKwP4oAhTvZ83V0lHHK2847N4R7z/J+GQieWMMeH5B VVzV9fIN34F9plFZjiHGibUeKAlxnhdo7OlTIwKDMpSU65K91Uv1jfwSW9LGxox+IfgL vTBA== X-Gm-Message-State: APzg51BRSVxBcG3E9/Mo58ReR7r9fAj2xg2sunpQMLtBmLDPYyro/NOA WIci61iVHY6uGFDzC+J23CTFboLL X-Google-Smtp-Source: ANB0VdbEBmJ8+VqIRnpwutWLPp5bQ1OlcWQn/AzAESi7dGVK5+DpatCHojpmP0mJgdlkcOx7N1J0eg== X-Received: by 2002:a62:174a:: with SMTP id 71-v6mr8161209pfx.217.1537749969573; Sun, 23 Sep 2018 17:46:09 -0700 (PDT) Received: from localhost.localdomain (109-252-91-213.nat.spd-mgts.ru. [109.252.91.213]) by smtp.gmail.com with ESMTPSA id 82-v6sm5121839pfr.115.2018.09.23.17.46.04 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 23 Sep 2018 17:46:09 -0700 (PDT) From: Dmitry Osipenko To: Thierry Reding , Jonathan Hunter , Joerg Roedel , Rob Herring , Robin Murphy Cc: iommu@lists.linux-foundation.org, devicetree@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 02/20] iommu/tegra: gart: Clean up driver probe errors handling Date: Mon, 24 Sep 2018 03:41:35 +0300 Message-Id: <20180924004153.8232-3-digetx@gmail.com> X-Mailer: git-send-email 2.19.0 In-Reply-To: <20180924004153.8232-1-digetx@gmail.com> References: <20180924004153.8232-1-digetx@gmail.com> MIME-Version: 1.0 Sender: linux-tegra-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org Properly clean up allocated resources on the drivers probe failure and remove unneeded checks. Signed-off-by: Dmitry Osipenko Acked-by: Thierry Reding --- drivers/iommu/tegra-gart.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/drivers/iommu/tegra-gart.c b/drivers/iommu/tegra-gart.c index 6dda7ee1d36c..e9524ed264cf 100644 --- a/drivers/iommu/tegra-gart.c +++ b/drivers/iommu/tegra-gart.c @@ -408,9 +408,6 @@ static int tegra_gart_probe(struct platform_device *pdev) struct device *dev = &pdev->dev; int ret; - if (gart_handle) - return -EIO; - BUILD_BUG_ON(PAGE_SHIFT != GART_PAGE_SHIFT); /* the GART memory aperture is required */ @@ -445,8 +442,7 @@ static int tegra_gart_probe(struct platform_device *pdev) ret = iommu_device_register(&gart->iommu); if (ret) { dev_err(dev, "Failed to register IOMMU\n"); - iommu_device_sysfs_remove(&gart->iommu); - return ret; + goto remove_sysfs; } gart->dev = &pdev->dev; @@ -460,7 +456,8 @@ static int tegra_gart_probe(struct platform_device *pdev) gart->savedata = vmalloc(array_size(sizeof(u32), gart->page_count)); if (!gart->savedata) { dev_err(dev, "failed to allocate context save area\n"); - return -ENOMEM; + ret = -ENOMEM; + goto unregister_iommu; } platform_set_drvdata(pdev, gart); @@ -469,6 +466,13 @@ static int tegra_gart_probe(struct platform_device *pdev) gart_handle = gart; return 0; + +unregister_iommu: + iommu_device_unregister(&gart->iommu); +remove_sysfs: + iommu_device_sysfs_remove(&gart->iommu); + + return ret; } static int tegra_gart_remove(struct platform_device *pdev) From patchwork Mon Sep 24 00:41:36 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 973793 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-tegra-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="OSPsrIHS"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 42JQVx3xkgz9s3C for ; Mon, 24 Sep 2018 10:46:17 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727410AbeIXGpw (ORCPT ); Mon, 24 Sep 2018 02:45:52 -0400 Received: from mail-pf1-f196.google.com ([209.85.210.196]:41399 "EHLO mail-pf1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726053AbeIXGpw (ORCPT ); Mon, 24 Sep 2018 02:45:52 -0400 Received: by mail-pf1-f196.google.com with SMTP id h79-v6so8306807pfk.8; Sun, 23 Sep 2018 17:46:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=IKKvvnsQS7iai+eSRHoNOQky8ZsVQ/gE/DDyaWyDr/8=; b=OSPsrIHSYUxs2BnK2TxhyizSwTA9VZ7x+zOm/vkoGautfTrwEnMGsV7L4vNE5DFDAF XI7Wpw0trFEBeggYNh472RQOuQdncmfvEtAL7KRBBhy2yuETdFeHMZYmAyd9aYveg+wx GoyUmiW9K44Q3sTpryfFxcmycpE5hGZq21DGmfa4swSRsvRmnr0FCAKUarrVqUHME4N1 rx4tHjHVZbeMdBncpsZTg3zN0raCZCTGfrZ/99RLsgZ9F+63DLGl4nTKycHu77Ze7Zbp qazYXpZg8SiM7V/gSyUZ+XELAcp3u/cqUhuT8ohjxEq9Kej2e6rJfBer4yJ+olCdGg6T yN1Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=IKKvvnsQS7iai+eSRHoNOQky8ZsVQ/gE/DDyaWyDr/8=; b=Ppqxndmye4rVLPOuAsE9s/7qf72dpupR5e+X5kzrebkjp60+qLbtGXBp8UsDviazYy uZeJ1HY8Vd6uSOygteWuQ/UtKrBmQ9+iytI1t03LG5HunrNgH38LBkNCMR++hWJWyU2u ZggRSS5p4uwNv39G9tFlAdA1kJ/1QqRPPLETD+4U2f+R/Q5E9RJlELBbAq6cok3wAyTS 4sBX7kAlaVkoTYkCrMhYVHFiwLRPYOqI3enn3DrR9+cbEYTZq3Pnm9otHBJO3g0jIaZI 4SWrAswJlCzvcPMHLd1FA+G3NFsVPVo+99VFBIi6djFR9tFZaSlDY/+i5PVdH3JsQdfy kYNg== X-Gm-Message-State: ABuFfojUkyv8/71pCz+wLF/h5WvMoNGfLHgtoH09qSh5LhRT5TPtOqlX OTbpQYq3dmmrBmiSB2JEupI= X-Google-Smtp-Source: ACcGV62NlENUqmwO/b+a6R4Aep1uL5oOdlj3YwHpOtBQZG0NFvDURl0ycLikLG0WyNvQ44gKUJR9rQ== X-Received: by 2002:a63:560e:: with SMTP id k14-v6mr7536328pgb.189.1537749975494; Sun, 23 Sep 2018 17:46:15 -0700 (PDT) Received: from localhost.localdomain (109-252-91-213.nat.spd-mgts.ru. [109.252.91.213]) by smtp.gmail.com with ESMTPSA id 82-v6sm5121839pfr.115.2018.09.23.17.46.09 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 23 Sep 2018 17:46:15 -0700 (PDT) From: Dmitry Osipenko To: Thierry Reding , Jonathan Hunter , Joerg Roedel , Rob Herring , Robin Murphy Cc: iommu@lists.linux-foundation.org, devicetree@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 03/20] iommu/tegra: gart: Ignore devices without IOMMU phandle in DT Date: Mon, 24 Sep 2018 03:41:36 +0300 Message-Id: <20180924004153.8232-4-digetx@gmail.com> X-Mailer: git-send-email 2.19.0 In-Reply-To: <20180924004153.8232-1-digetx@gmail.com> References: <20180924004153.8232-1-digetx@gmail.com> MIME-Version: 1.0 Sender: linux-tegra-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org GART can't handle all devices, hence ignore devices that aren't related to GART. IOMMU phandle must be explicitly assign to devices in the device tree. Signed-off-by: Dmitry Osipenko Acked-by: Thierry Reding --- drivers/iommu/tegra-gart.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/drivers/iommu/tegra-gart.c b/drivers/iommu/tegra-gart.c index e9524ed264cf..f6cf5cd5aaca 100644 --- a/drivers/iommu/tegra-gart.c +++ b/drivers/iommu/tegra-gart.c @@ -342,8 +342,12 @@ static bool gart_iommu_capable(enum iommu_cap cap) static int gart_iommu_add_device(struct device *dev) { - struct iommu_group *group = iommu_group_get_for_dev(dev); + struct iommu_group *group; + if (!dev->iommu_fwspec) + return -ENODEV; + + group = iommu_group_get_for_dev(dev); if (IS_ERR(group)) return PTR_ERR(group); @@ -360,6 +364,12 @@ static void gart_iommu_remove_device(struct device *dev) iommu_device_unlink(&gart_handle->iommu, dev); } +static int gart_iommu_of_xlate(struct device *dev, + struct of_phandle_args *args) +{ + return 0; +} + static const struct iommu_ops gart_iommu_ops = { .capable = gart_iommu_capable, .domain_alloc = gart_iommu_domain_alloc, @@ -373,6 +383,7 @@ static const struct iommu_ops gart_iommu_ops = { .unmap = gart_iommu_unmap, .iova_to_phys = gart_iommu_iova_to_phys, .pgsize_bitmap = GART_IOMMU_PGSIZES, + .of_xlate = gart_iommu_of_xlate, }; static int tegra_gart_suspend(struct device *dev) @@ -438,6 +449,7 @@ static int tegra_gart_probe(struct platform_device *pdev) } iommu_device_set_ops(&gart->iommu, &gart_iommu_ops); + iommu_device_set_fwnode(&gart->iommu, dev->fwnode); ret = iommu_device_register(&gart->iommu); if (ret) { From patchwork Mon Sep 24 00:41:37 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 973794 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-tegra-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="D752C2+z"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 42JQW80BW1z9s3C for ; Mon, 24 Sep 2018 10:46:28 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727422AbeIXGp6 (ORCPT ); Mon, 24 Sep 2018 02:45:58 -0400 Received: from mail-pl1-f196.google.com ([209.85.214.196]:35652 "EHLO mail-pl1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726053AbeIXGp6 (ORCPT ); Mon, 24 Sep 2018 02:45:58 -0400 Received: by mail-pl1-f196.google.com with SMTP id g2-v6so8342928plo.2; Sun, 23 Sep 2018 17:46:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=30ufeD3CxV7WsB0liotdolVz3OINlqOzVXL8Z3r3AF4=; b=D752C2+zYXdrEGyBS1CaGDPnyR2WiP83TdZzYlE4iwOINfoFAp+BTJg/M5Kgx0rD0n Nr2oGDcuvJlH+3TIffIBf3/3TMMbdlg1axumXN6HoDG9cStJk1kbJd2cbArLrmQKYo0S LmOIwhYDoDqCwCMzzDmAiIWuOU2+15FkUWDNNImrVSHzzdCCpmv0ZZdMjpvezTOfI2Si ladq0CE1SYrXyFTWopD1Eb7NOFWoHuROgtbkzm2TAaUzsgY2Hr67BiTC3dLNLpBdAlpv 3xoNvNlS+lXBytC0SynXx7QM+Z96DZelsHYxxLqzjQ8PSqYqj2MNSwsQ90AB84B/VbOG GEyQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=30ufeD3CxV7WsB0liotdolVz3OINlqOzVXL8Z3r3AF4=; b=RPUQDoTsoz0a62wfUXKsRQg3JE05vi2mtqDLQDA2DxmiMU6WL0kzYqc5s0a2YF6Poj +QiZqvG5h+NNwej9OGsuj6zhBEsyn0j825EKydm73Deymv7QrDTlSSbvDzsSQD2gnPqU vuTNIIt85qBJRYyRH0GDcprUxeTxf1Z6hZd6A096E4qVgV1a+3qeeFuKiZspUQjjP9Nv FLCMeRfhh3h5WO8iBOgsPWWCdmkCf+LbuGvkAtSWsw9vpaNOsC3MhY7bHSK7e2140qVe AlZQvlTlAjyyl57Kym9aK0gKsbk/EPmishnTGoz4JjUYAug0tC3VTUtmpQBCeE3o+OVj jhdg== X-Gm-Message-State: ABuFfog9sNRkHbA1vZ0/GjyjBc2UMxIP29SrEFgz4rSZtRj/MMbtXTxM GPNrHEA59udZe/iqhyadqzI= X-Google-Smtp-Source: ACcGV62jtkcyNjseSBZAncl7Lf0FtclScoEv6DkzNmkTfQdc2POLzni7Uasx5rjxauVQh2FUunVlwg== X-Received: by 2002:a17:902:784a:: with SMTP id e10-v6mr8239165pln.197.1537749981458; Sun, 23 Sep 2018 17:46:21 -0700 (PDT) Received: from localhost.localdomain (109-252-91-213.nat.spd-mgts.ru. [109.252.91.213]) by smtp.gmail.com with ESMTPSA id 82-v6sm5121839pfr.115.2018.09.23.17.46.15 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 23 Sep 2018 17:46:20 -0700 (PDT) From: Dmitry Osipenko To: Thierry Reding , Jonathan Hunter , Joerg Roedel , Rob Herring , Robin Murphy Cc: iommu@lists.linux-foundation.org, devicetree@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 04/20] iommu: Introduce iotlb_sync_map callback Date: Mon, 24 Sep 2018 03:41:37 +0300 Message-Id: <20180924004153.8232-5-digetx@gmail.com> X-Mailer: git-send-email 2.19.0 In-Reply-To: <20180924004153.8232-1-digetx@gmail.com> References: <20180924004153.8232-1-digetx@gmail.com> MIME-Version: 1.0 Sender: linux-tegra-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org Introduce iotlb_sync_map() callback that is invoked in the end of iommu_map(). This new callback allows IOMMU drivers to avoid syncing after mapping of each contiguous chunk and sync only when the whole mapping is completed, optimizing performance of the mapping operation. Signed-off-by: Dmitry Osipenko Reviewed-by: Robin Murphy Reviewed-by: Thierry Reding --- drivers/iommu/iommu.c | 8 ++++++-- include/linux/iommu.h | 1 + 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c index 8c15c5980299..8979b16caf61 100644 --- a/drivers/iommu/iommu.c +++ b/drivers/iommu/iommu.c @@ -1545,13 +1545,14 @@ static size_t iommu_pgsize(struct iommu_domain *domain, int iommu_map(struct iommu_domain *domain, unsigned long iova, phys_addr_t paddr, size_t size, int prot) { + const struct iommu_ops *ops = domain->ops; unsigned long orig_iova = iova; unsigned int min_pagesz; size_t orig_size = size; phys_addr_t orig_paddr = paddr; int ret = 0; - if (unlikely(domain->ops->map == NULL || + if (unlikely(ops->map == NULL || domain->pgsize_bitmap == 0UL)) return -ENODEV; @@ -1580,7 +1581,7 @@ int iommu_map(struct iommu_domain *domain, unsigned long iova, pr_debug("mapping: iova 0x%lx pa %pa pgsize 0x%zx\n", iova, &paddr, pgsize); - ret = domain->ops->map(domain, iova, paddr, pgsize, prot); + ret = ops->map(domain, iova, paddr, pgsize, prot); if (ret) break; @@ -1589,6 +1590,9 @@ int iommu_map(struct iommu_domain *domain, unsigned long iova, size -= pgsize; } + if (ops->iotlb_sync_map) + ops->iotlb_sync_map(domain); + /* unroll mapping in case something went wrong */ if (ret) iommu_unmap(domain, orig_iova, orig_size - size); diff --git a/include/linux/iommu.h b/include/linux/iommu.h index 87994c265bf5..4c488eb69752 100644 --- a/include/linux/iommu.h +++ b/include/linux/iommu.h @@ -202,6 +202,7 @@ struct iommu_ops { void (*flush_iotlb_all)(struct iommu_domain *domain); void (*iotlb_range_add)(struct iommu_domain *domain, unsigned long iova, size_t size); + void (*iotlb_sync_map)(struct iommu_domain *domain); void (*iotlb_sync)(struct iommu_domain *domain); phys_addr_t (*iova_to_phys)(struct iommu_domain *domain, dma_addr_t iova); int (*add_device)(struct device *dev); From patchwork Mon Sep 24 00:41:38 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 973795 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-tegra-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="eOUFSx6/"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 42JQW9408Tz9sC7 for ; Mon, 24 Sep 2018 10:46:29 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727386AbeIXGqE (ORCPT ); Mon, 24 Sep 2018 02:46:04 -0400 Received: from mail-pl1-f196.google.com ([209.85.214.196]:37099 "EHLO mail-pl1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726053AbeIXGqE (ORCPT ); Mon, 24 Sep 2018 02:46:04 -0400 Received: by mail-pl1-f196.google.com with SMTP id q1-v6so2864193plr.4; Sun, 23 Sep 2018 17:46:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=j2PKJHjqEhI+l//cZxSKKS1WEBOnDTX7PbZa88wC/DU=; b=eOUFSx6/VLOL1XKeCTBujqagN7IgX3JF8hA6z852l26wQXhyyCkI2qmGFVUP6mwPCG x/U1skJQZKoHNbQ4vlQtj21RqY+3GuZf0d5pEE04wjaMbtEaoUaSUQ1GqycCjdi9xEkT lEyT2YS/GeGOr3sjY2E7GKGWUblQQOZ7dZRtLuVhmElxwPu8nQ2dEqaXk44qWGIO6sTg Nu9uuV4zgF3IqEOPsi3j/+dNMBhO0GHnP6VfnYxz2ZPcCy1JsMX43LdSIURGNqMZj108 qzEMtRLlrrf+UcBB4Cjq/GZxVMnHbKhHqSKEq+XsO5Osd4lCx41kmFFVZkeKGH/JzTjZ CkDg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=j2PKJHjqEhI+l//cZxSKKS1WEBOnDTX7PbZa88wC/DU=; b=rARO6V707Q0E4A2wYxO1PI2RL3jQgXxj7QiTDj22DCogFyIQAzq6n8VyvGo+cyjg29 SGk1SoU+Ax52XstX2RgsFI8XyeuICoWoTERZQMKNYb/caVcBAyEVT5Z/BDjTfR7MoJu8 SJhq11xt5Zpsoex0c8So0m1hoYxWUUnczpw4T64xeLplZ/YSWs0fcz1tCfbY+KcxiQ2a PLvfeLcYxS/+CQvfyVDLD/kzu+iukH8nz3QhTghVEpICITsRalCIJAEdsl1gRB5jx79M 7My/E0moOe20NwmrLSqatR82hHPYIt7lhTaM7x61rAqHjuDZyCIq4FISxZZaG8XsDXwy m0hw== X-Gm-Message-State: ABuFfojnNukDSmsBcTC//xwQeKlpA4tMTxu+iuQDhK6h+RxBsu69Ul6Y tpLRxqEZAv1n7qWqWn3U8fM= X-Google-Smtp-Source: ACcGV630EHtLbE9IGVmmVcUmFMcYNZkbxw8L16Z0covYoyg0pbmOjgTQb1iXCSZkKxHV/yv3Ejnhyw== X-Received: by 2002:a17:902:bf0c:: with SMTP id bi12-v6mr8232719plb.219.1537749987412; Sun, 23 Sep 2018 17:46:27 -0700 (PDT) Received: from localhost.localdomain (109-252-91-213.nat.spd-mgts.ru. [109.252.91.213]) by smtp.gmail.com with ESMTPSA id 82-v6sm5121839pfr.115.2018.09.23.17.46.21 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 23 Sep 2018 17:46:26 -0700 (PDT) From: Dmitry Osipenko To: Thierry Reding , Jonathan Hunter , Joerg Roedel , Rob Herring , Robin Murphy Cc: iommu@lists.linux-foundation.org, devicetree@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 05/20] iommu/tegra: gart: Optimize mapping / unmapping performance Date: Mon, 24 Sep 2018 03:41:38 +0300 Message-Id: <20180924004153.8232-6-digetx@gmail.com> X-Mailer: git-send-email 2.19.0 In-Reply-To: <20180924004153.8232-1-digetx@gmail.com> References: <20180924004153.8232-1-digetx@gmail.com> MIME-Version: 1.0 Sender: linux-tegra-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org Currently GART writes one page entry at a time. More optimal would be to aggregate the writes and flush BUS buffer in the end, this gives map/unmap 10-40% performance boost (depending on size of mapping) in comparison to flushing after each page entry update. Signed-off-by: Dmitry Osipenko Acked-by: Thierry Reding --- drivers/iommu/tegra-gart.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/drivers/iommu/tegra-gart.c b/drivers/iommu/tegra-gart.c index f6cf5cd5aaca..86a855c0d031 100644 --- a/drivers/iommu/tegra-gart.c +++ b/drivers/iommu/tegra-gart.c @@ -287,7 +287,6 @@ static int gart_iommu_map(struct iommu_domain *domain, unsigned long iova, } } gart_set_pte(gart, iova, GART_PTE(pfn)); - FLUSH_GART_REGS(gart); spin_unlock_irqrestore(&gart->pte_lock, flags); return 0; } @@ -304,7 +303,6 @@ static size_t gart_iommu_unmap(struct iommu_domain *domain, unsigned long iova, spin_lock_irqsave(&gart->pte_lock, flags); gart_set_pte(gart, iova, 0); - FLUSH_GART_REGS(gart); spin_unlock_irqrestore(&gart->pte_lock, flags); return bytes; } @@ -370,6 +368,14 @@ static int gart_iommu_of_xlate(struct device *dev, return 0; } +static void gart_iommu_sync(struct iommu_domain *domain) +{ + struct gart_domain *gart_domain = to_gart_domain(domain); + struct gart_device *gart = gart_domain->gart; + + FLUSH_GART_REGS(gart); +} + static const struct iommu_ops gart_iommu_ops = { .capable = gart_iommu_capable, .domain_alloc = gart_iommu_domain_alloc, @@ -384,6 +390,8 @@ static const struct iommu_ops gart_iommu_ops = { .iova_to_phys = gart_iommu_iova_to_phys, .pgsize_bitmap = GART_IOMMU_PGSIZES, .of_xlate = gart_iommu_of_xlate, + .iotlb_sync_map = gart_iommu_sync, + .iotlb_sync = gart_iommu_sync, }; static int tegra_gart_suspend(struct device *dev) From patchwork Mon Sep 24 00:41:39 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 973797 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-tegra-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="vUN+J5+M"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 42JQWN3JhMz9sB4 for ; Mon, 24 Sep 2018 10:46:40 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727434AbeIXGqK (ORCPT ); Mon, 24 Sep 2018 02:46:10 -0400 Received: from mail-pf1-f196.google.com ([209.85.210.196]:35211 "EHLO mail-pf1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726053AbeIXGqK (ORCPT ); Mon, 24 Sep 2018 02:46:10 -0400 Received: by mail-pf1-f196.google.com with SMTP id p12-v6so8312693pfh.2; Sun, 23 Sep 2018 17:46:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=Jwig3gR4KuZu0LsKNX4C9XVq74klR1l14Mz0aRWZXhE=; b=vUN+J5+M1MN3GMRH4asx+EAJafNw4dNxG5dKZf1snWTVSwIh2OHUybe7Jfo9ZUW1HI dWIe5Bysnqp8FO8xZXNj6cKcms2jrFfECdRY/TbG2H7/sFaXZ+OlHcqlkIaT8rCwYG/m hLtN2nfPiQPTKDRKD0z7Mgml9Fc9Idkz2rIcx3yfe6Z+IUYp18TbqK962XqKkDQKiYwn yA+M8V+9kMgcC2N4BmuJaqZfFsuyKbScQ/1oezD7AO/bulOs/twwbew8tEH/JIzDoV9j kF9OQKe7s7wsy0tf13S4gBkUPFUx8ZDDNzz8u291+ewHqPhv15uYJ5f5BSfifGUA7gR4 uD8Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Jwig3gR4KuZu0LsKNX4C9XVq74klR1l14Mz0aRWZXhE=; b=bFieqdQx7rsBQ99Z0lPfspU5+cBxogd4md87L7ezT42x4ru2mrfpKfIN3gLpP6wNAP UoRKMZG69rMvbzcIi7qP7+Gq5Mpho2tH5OjyZSVmIVWqhiJkIycHK+Ujr+4DW/U9Lqz9 eaakWDSqJSKTU+5/dEr2IdrbZSSZ11hSB9PKTwSasdF5E43JTxgkIJZhe3hswHWJ3Op7 t8/YsMncEqltGNYkh2oPDlMUDMl4OA8RJ8SqSmnTsZqSG3DXLQoEoTmITukMOSOmumKE WOEGMMYYDX3lffE2IcmeLip7RGxoSgU9MH/ojq5XfC6/dCrf5bt9B3Y1T0FafqUqGzbX B2Ug== X-Gm-Message-State: ABuFfohHfb3dvikYIzrcLb0BZrUID880Zx7cgiSEIX+dKn41pRPXh3YP JS4cWGE8RCXU8Cy8W7+Vb6Q= X-Google-Smtp-Source: ACcGV63pUUAntWuhmn5g2fY34gtzUqvNNwlneupvoagQSM/7hMhtWMifC7VbrNnEqOjt4aQIchTmug== X-Received: by 2002:a65:4c43:: with SMTP id l3-v6mr7327138pgr.451.1537749993374; Sun, 23 Sep 2018 17:46:33 -0700 (PDT) Received: from localhost.localdomain (109-252-91-213.nat.spd-mgts.ru. [109.252.91.213]) by smtp.gmail.com with ESMTPSA id 82-v6sm5121839pfr.115.2018.09.23.17.46.27 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 23 Sep 2018 17:46:32 -0700 (PDT) From: Dmitry Osipenko To: Thierry Reding , Jonathan Hunter , Joerg Roedel , Rob Herring , Robin Murphy Cc: iommu@lists.linux-foundation.org, devicetree@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 06/20] dt-bindings: memory: tegra: Squash tegra20-gart into tegra20-mc Date: Mon, 24 Sep 2018 03:41:39 +0300 Message-Id: <20180924004153.8232-7-digetx@gmail.com> X-Mailer: git-send-email 2.19.0 In-Reply-To: <20180924004153.8232-1-digetx@gmail.com> References: <20180924004153.8232-1-digetx@gmail.com> MIME-Version: 1.0 Sender: linux-tegra-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org Splitting GART and Memory Controller wasn't a good decision that was made back in the day. Given that the GART driver wasn't ever been used by anything in the kernel, we decided that it will be better to correct the mistakes of the past and merge two bindings into a single one. As a result there is a DT ABI change for the Memory Controller that allows not to break newer kernels using older DT and not to break older kernels using newer DT, that is done by changing the 'compatible' of the node to 'tegra20-mc-gart' and adding a new-required clock property. The new clock property also puts the tegra20-mc binding in line with the bindings of the later Tegra generations. Signed-off-by: Dmitry Osipenko Reviewed-by: Rob Herring --- .../bindings/iommu/nvidia,tegra20-gart.txt | 14 ---------- .../memory-controllers/nvidia,tegra20-mc.txt | 27 +++++++++++++------ 2 files changed, 19 insertions(+), 22 deletions(-) delete mode 100644 Documentation/devicetree/bindings/iommu/nvidia,tegra20-gart.txt diff --git a/Documentation/devicetree/bindings/iommu/nvidia,tegra20-gart.txt b/Documentation/devicetree/bindings/iommu/nvidia,tegra20-gart.txt deleted file mode 100644 index 099d9362ebc1..000000000000 --- a/Documentation/devicetree/bindings/iommu/nvidia,tegra20-gart.txt +++ /dev/null @@ -1,14 +0,0 @@ -NVIDIA Tegra 20 GART - -Required properties: -- compatible: "nvidia,tegra20-gart" -- reg: Two pairs of cells specifying the physical address and size of - the memory controller registers and the GART aperture respectively. - -Example: - - gart { - compatible = "nvidia,tegra20-gart"; - reg = <0x7000f024 0x00000018 /* controller registers */ - 0x58000000 0x02000000>; /* GART aperture */ - }; diff --git a/Documentation/devicetree/bindings/memory-controllers/nvidia,tegra20-mc.txt b/Documentation/devicetree/bindings/memory-controllers/nvidia,tegra20-mc.txt index 7d60a50a4fa1..e55328237df4 100644 --- a/Documentation/devicetree/bindings/memory-controllers/nvidia,tegra20-mc.txt +++ b/Documentation/devicetree/bindings/memory-controllers/nvidia,tegra20-mc.txt @@ -1,26 +1,37 @@ NVIDIA Tegra20 MC(Memory Controller) Required properties: -- compatible : "nvidia,tegra20-mc" -- reg : Should contain 2 register ranges(address and length); see the - example below. Note that the MC registers are interleaved with the - GART registers, and hence must be represented as multiple ranges. +- compatible : "nvidia,tegra20-mc-gart" +- reg : Should contain 2 register ranges: physical base address and length of + the controller's registers and the GART aperture respectively. +- clocks: Must contain an entry for each entry in clock-names. + See ../clocks/clock-bindings.txt for details. +- clock-names: Must include the following entries: + - mc: the module's clock input - interrupts : Should contain MC General interrupt. - #reset-cells : Should be 1. This cell represents memory client module ID. The assignments may be found in header file or in the TRM documentation. +- #iommu-cells: Should be 0. This cell represents the number of cells in an + IOMMU specifier needed to encode an address. GART supports only a single + address space that is shared by all devices, therefore no additional + information needed for the address encoding. Example: mc: memory-controller@7000f000 { - compatible = "nvidia,tegra20-mc"; - reg = <0x7000f000 0x024 - 0x7000f03c 0x3c4>; - interrupts = <0 77 0x04>; + compatible = "nvidia,tegra20-mc-gart"; + reg = <0x7000f000 0x400 /* controller registers */ + 0x58000000 0x02000000>; /* GART aperture */ + clocks = <&tegra_car TEGRA20_CLK_MC>; + clock-names = "mc"; + interrupts = ; #reset-cells = <1>; + #iommu-cells = <0>; }; video-codec@6001a000 { compatible = "nvidia,tegra20-vde"; ... resets = <&mc TEGRA20_MC_RESET_VDE>; + iommus = <&mc>; }; From patchwork Mon Sep 24 00:41:40 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 973798 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-tegra-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="uESIYksk"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 42JQWR6wSqz9s3C for ; Mon, 24 Sep 2018 10:46:43 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727476AbeIXGqQ (ORCPT ); Mon, 24 Sep 2018 02:46:16 -0400 Received: from mail-pg1-f194.google.com ([209.85.215.194]:46101 "EHLO mail-pg1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726053AbeIXGqQ (ORCPT ); Mon, 24 Sep 2018 02:46:16 -0400 Received: by mail-pg1-f194.google.com with SMTP id b129-v6so8395567pga.13; Sun, 23 Sep 2018 17:46:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=SI8Q6dD3CUH5YH2wzC2h9K3OfGvC4psAICvLOPR9GV8=; b=uESIYkskJYP59nDx43lamKjiLV5RlLmEXauKxz9GRd4gkzQHD3t/xrdx2g9CVj4/Uf aDMX6p8oHIFDzRrvyHh0f4ifs3H3MTiBExK49Cqh3sam7EXIvpeF8lfkxIZ3CtFbxRfF kC5tDBRGG912x/Dd6jh074CDsjKCLfTS22H9o1EowvoY83m8sNFZ5oc1oZzvu3JKWWaY A8AMu7vcJ6NO1LjamWghysweitpVwNsGwuGRpa1uE49LrSDqawI56rPhyHCQqgDnE1Xw 1lLfjAZRRj0naT8WASnrm5Cwpe7MundUquE733fICiFtzXGbGbtz1sc+ccBHpZDzr9Uj y9UA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=SI8Q6dD3CUH5YH2wzC2h9K3OfGvC4psAICvLOPR9GV8=; b=ZGJYHwOR4ANRg6rf8WH7l/FCVd77ikcsJl9sMTRwGS877CrU6QFrDm7tsTy5dgYwnS mRBtip6ihnSXq+15hkHzZvSoGRsWjdzKoeu1iDvlLL3L+OaKuaJpphk8Ho8NUzdDaAGr wDiR4HJ0oX66E03yweN7e1UsJw17TxXUh++HMvo5KQSaG9U0x6DrB5eS7uo4PruXcsh3 YK7R0ivuAa0g/HksMPwVvDYlct5Vxuv8utjwhac3sv0xpkk5gTuYFK15LlP9M1sAwY+x Kbi7aJjyKLtdarInFzmz8RPRosJapZHGKivMXUzkLj9TM9aIjvRCwyJzMVwHIy1LCWPh VoPw== X-Gm-Message-State: APzg51D5D1R9tpxxx/W+6AWm7SpABSv2wniqYO2q9gsZw3nFAqZEMeV1 jPbS391MQHsuhkx5TCmBXP8= X-Google-Smtp-Source: ANB0VdaUTvK/+mPu1lUdwCYZeyh08CC4BmP+roFXSVnRkhmPzRMJbsvDR4VmcVX1B9dGO74Jl717bQ== X-Received: by 2002:a62:71c4:: with SMTP id m187-v6mr8032037pfc.232.1537749999233; Sun, 23 Sep 2018 17:46:39 -0700 (PDT) Received: from localhost.localdomain (109-252-91-213.nat.spd-mgts.ru. [109.252.91.213]) by smtp.gmail.com with ESMTPSA id 82-v6sm5121839pfr.115.2018.09.23.17.46.33 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 23 Sep 2018 17:46:38 -0700 (PDT) From: Dmitry Osipenko To: Thierry Reding , Jonathan Hunter , Joerg Roedel , Rob Herring , Robin Murphy Cc: iommu@lists.linux-foundation.org, devicetree@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 07/20] ARM: dts: tegra20: Update Memory Controller node to the new binding Date: Mon, 24 Sep 2018 03:41:40 +0300 Message-Id: <20180924004153.8232-8-digetx@gmail.com> X-Mailer: git-send-email 2.19.0 In-Reply-To: <20180924004153.8232-1-digetx@gmail.com> References: <20180924004153.8232-1-digetx@gmail.com> MIME-Version: 1.0 Sender: linux-tegra-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org Device tree binding of Memory Controller has been changed: GART has been squashed into the MC, there are a new mandatory clock and #iommu-cells properties, the compatible has been changed to 'tegra20-mc-gart'. Signed-off-by: Dmitry Osipenko --- arch/arm/boot/dts/tegra20.dtsi | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/arch/arm/boot/dts/tegra20.dtsi b/arch/arm/boot/dts/tegra20.dtsi index 979f38293fe5..3ebaf38cc598 100644 --- a/arch/arm/boot/dts/tegra20.dtsi +++ b/arch/arm/boot/dts/tegra20.dtsi @@ -616,17 +616,14 @@ }; mc: memory-controller@7000f000 { - compatible = "nvidia,tegra20-mc"; - reg = <0x7000f000 0x024 - 0x7000f03c 0x3c4>; + compatible = "nvidia,tegra20-mc-gart"; + reg = <0x7000f000 0x400 /* controller registers */ + 0x58000000 0x02000000>; /* GART aperture */ + clocks = <&tegra_car TEGRA20_CLK_MC>; + clock-names = "mc"; interrupts = ; #reset-cells = <1>; - }; - - iommu@7000f024 { - compatible = "nvidia,tegra20-gart"; - reg = <0x7000f024 0x00000018 /* controller registers */ - 0x58000000 0x02000000>; /* GART aperture */ + #iommu-cells = <0>; }; memory-controller@7000f400 { From patchwork Mon Sep 24 00:41:41 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 973799 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-tegra-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="dE4+gD3e"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 42JQWV6mK0z9sB4 for ; Mon, 24 Sep 2018 10:46:46 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727486AbeIXGqW (ORCPT ); Mon, 24 Sep 2018 02:46:22 -0400 Received: from mail-pl1-f196.google.com ([209.85.214.196]:33970 "EHLO mail-pl1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726053AbeIXGqV (ORCPT ); Mon, 24 Sep 2018 02:46:21 -0400 Received: by mail-pl1-f196.google.com with SMTP id f6-v6so8351653plo.1; Sun, 23 Sep 2018 17:46:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=fgvd47ntIDWOVMFx52mLZxwC1YUjcA5K/VrZts78hGo=; b=dE4+gD3eWRl6MqDgR5cnOpaC+9i1FNbQg4OmU4XEPauv3Gn5SSIhQX2qCn81XDG3oo 0EBKME3dBkkKYrmu8+YIRnIGVIv8aUxsdHGDb1TV2WeO4Rm0Vw899MqxWFR0nFjGDJJq 7ulsffMNMX1PuRkp9TkSTuMNF8zITHMDEcJ7tKV40VQZQnLYn55uvSLArCayG4/3sg/C 1Nd2QTrZoW53QgOSwKqEpQyQcRQYH552QghrJqAXhlRxhzRdhQknglr0vu57+8HuIt0s hQc1D5pG+6r7ztCEBSYhxNnVjPFsXvEjSJRwzkkFGcpN8ksNC8ePFiotuFnw+0jxczM+ zOSg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=fgvd47ntIDWOVMFx52mLZxwC1YUjcA5K/VrZts78hGo=; b=RTteJORJOJZv5b9zb/DA7t6qEEJLDxOK+zWUKw6drmxsGwguxGoTZq4S0ywjhKhulf zCCYh6mTAF23YECFqyyJO6WzcQSeDWEG3Z+1NVFEfHmugr4jlFTJurg2LVc5rqBoHA9e KN7rJCliPe40HoclJY3DqA3PHAns/aIVK3j/GzMXAGpzr5S/kcZ5j/jiocnCxJHbTkeI KZYqVQScOQH5pTlM0yPlYriPSHrdpAIJjxYDChNYzNFzJRIBbudphxkJkmBjojjavZWo DzesMt+1xz3i4PVBFOpQWgIWP5QG6DefJAthSdFPOC75KEpmIWDb9gGCqB/dTuLRz3BI /dgw== X-Gm-Message-State: ABuFfojWzTN99gQccuY7IyTZUQcTZsEjqKOV7RzfQTGnL4a5DVF3kByQ IdpXHTmsd0/F69nXuFz+R2M= X-Google-Smtp-Source: ACcGV62HHSzdFrB6PwmUo/G9bbcalxNT4YYBS+XvKOydi59D2Ktf2Nt8aidtHohWyWu37T5eogbo9Q== X-Received: by 2002:a17:902:2ac3:: with SMTP id j61-v6mr8244943plb.172.1537750005122; Sun, 23 Sep 2018 17:46:45 -0700 (PDT) Received: from localhost.localdomain (109-252-91-213.nat.spd-mgts.ru. [109.252.91.213]) by smtp.gmail.com with ESMTPSA id 82-v6sm5121839pfr.115.2018.09.23.17.46.39 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 23 Sep 2018 17:46:44 -0700 (PDT) From: Dmitry Osipenko To: Thierry Reding , Jonathan Hunter , Joerg Roedel , Rob Herring , Robin Murphy Cc: iommu@lists.linux-foundation.org, devicetree@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 08/20] memory: tegra: Don't invoke Tegra30+ specific memory timing setup on Tegra20 Date: Mon, 24 Sep 2018 03:41:41 +0300 Message-Id: <20180924004153.8232-9-digetx@gmail.com> X-Mailer: git-send-email 2.19.0 In-Reply-To: <20180924004153.8232-1-digetx@gmail.com> References: <20180924004153.8232-1-digetx@gmail.com> MIME-Version: 1.0 Sender: linux-tegra-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org This fixes irrelevant "tegra-mc 7000f000.memory-controller: no memory timings for RAM code 0 registered" warning message during of kernels boot-up on Tegra20. Fixes: a8d502fd3348 ("memory: tegra: Squash tegra20-mc into common tegra-mc driver") Signed-off-by: Dmitry Osipenko Acked-by: Jon Hunter --- drivers/memory/tegra/mc.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/drivers/memory/tegra/mc.c b/drivers/memory/tegra/mc.c index bd25faf6d13d..e56862495f36 100644 --- a/drivers/memory/tegra/mc.c +++ b/drivers/memory/tegra/mc.c @@ -664,12 +664,13 @@ static int tegra_mc_probe(struct platform_device *pdev) } isr = tegra_mc_irq; - } - err = tegra_mc_setup_timings(mc); - if (err < 0) { - dev_err(&pdev->dev, "failed to setup timings: %d\n", err); - return err; + err = tegra_mc_setup_timings(mc); + if (err < 0) { + dev_err(&pdev->dev, "failed to setup timings: %d\n", + err); + return err; + } } mc->irq = platform_get_irq(pdev, 0); From patchwork Mon Sep 24 00:41:42 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 973800 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-tegra-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="N0K+2WCe"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 42JQWk1yCmz9s3C for ; Mon, 24 Sep 2018 10:46:58 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727503AbeIXGq2 (ORCPT ); Mon, 24 Sep 2018 02:46:28 -0400 Received: from mail-pl1-f194.google.com ([209.85.214.194]:47018 "EHLO mail-pl1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727485AbeIXGq2 (ORCPT ); Mon, 24 Sep 2018 02:46:28 -0400 Received: by mail-pl1-f194.google.com with SMTP id v19-v6so671797ply.13; Sun, 23 Sep 2018 17:46:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=a2m75vP+vhO9R4rPd3Yk3+I0Wa14hKEFn6WSeRYz02s=; b=N0K+2WCe4CrfLi9FisR6f4c4hTp52HW5HGJYGJJD8roOZLd7l3wx0LcyJp+Ks4jFd8 k0DqhamiCG6HqIGzW2WJSGZcLjiXuU6MUJMvZe9BIACn95mhOKpuyuB+RjXAN60p+7Ce vbeftHlAVlNhPHZflAG3S+xjCQddtCSm8HlVQ+WrAOXZdB4cQ7LEvt8LWUt0aInTcT4L rG7hpADppOnPxArSIC6pibykyDllaFO2BoAn/qBkn5Bjmj8EWLEaM4EkpNHN1hOdtEgU p/HQ/8mraNr4ob1l5vnbMx6K7mw8ZUXs2dM0AZ4NUE+bFE7CV56vYTbR8R2gCR6cpEPZ OnvA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=a2m75vP+vhO9R4rPd3Yk3+I0Wa14hKEFn6WSeRYz02s=; b=qs0wyeNTTcS/kJ8zC/CpbI+47ggCSyK+VdNF022Ak1KePgyhgrB1sojQnbf9iDpH8X 3/CWnRpDVk6Devowidwv2jLg5n3yeqszo/u4SiwWSV1++k1NdA5YEAuHNiXU10VPjhjY ImrVVczIMOQc/9taiZasSSWiF5ENZxTSGX3Ma2gqrnpwy1EVf/8iRTjleN4U0LChBL+W U7f3nhUMO3CtXRyjwlY2S0y8hDsrVkjWF6TRLFQfZdtEBvqwgUt2vfc4IZYcrz4XR0S2 8sztC1iKoG/W7Nmz6bNB4Hy5osVe1n7xjmRHmcJm3cvyJJyCPwmnqckK68OuCSCV3Qa2 KLrA== X-Gm-Message-State: ABuFfohRXVqcCMmP2dNmCx5PMSFj6jsjLuBl3SyZR064VvsmNu2Gmm7n Cb8Rd9vOLHZEiI6WDNvTtqQ= X-Google-Smtp-Source: ACcGV63ZZqh2K8szyNPvFRWHz7tGVXlW5Ljgz/khYbm4n1rRCu3VqOsNtNZrOESZhE1GKnYZhtVkzg== X-Received: by 2002:a17:902:7c07:: with SMTP id x7-v6mr8312981pll.113.1537750011009; Sun, 23 Sep 2018 17:46:51 -0700 (PDT) Received: from localhost.localdomain (109-252-91-213.nat.spd-mgts.ru. [109.252.91.213]) by smtp.gmail.com with ESMTPSA id 82-v6sm5121839pfr.115.2018.09.23.17.46.45 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 23 Sep 2018 17:46:50 -0700 (PDT) From: Dmitry Osipenko To: Thierry Reding , Jonathan Hunter , Joerg Roedel , Rob Herring , Robin Murphy Cc: iommu@lists.linux-foundation.org, devicetree@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 09/20] memory: tegra: Adapt to Tegra20 device-tree binding changes Date: Mon, 24 Sep 2018 03:41:42 +0300 Message-Id: <20180924004153.8232-10-digetx@gmail.com> X-Mailer: git-send-email 2.19.0 In-Reply-To: <20180924004153.8232-1-digetx@gmail.com> References: <20180924004153.8232-1-digetx@gmail.com> MIME-Version: 1.0 Sender: linux-tegra-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org The tegra20-mc device-tree binding has been changed, GART has been squashed into Memory Controller and now the clock property is mandatory for Tegra20, the DT compatible has been changed as well. Adapt driver to the DT changes. Signed-off-by: Dmitry Osipenko --- drivers/memory/tegra/mc.c | 21 ++++++++------------- drivers/memory/tegra/mc.h | 6 ------ include/soc/tegra/mc.h | 2 +- 3 files changed, 9 insertions(+), 20 deletions(-) diff --git a/drivers/memory/tegra/mc.c b/drivers/memory/tegra/mc.c index e56862495f36..1b4ceefd82f9 100644 --- a/drivers/memory/tegra/mc.c +++ b/drivers/memory/tegra/mc.c @@ -51,7 +51,7 @@ static const struct of_device_id tegra_mc_of_match[] = { #ifdef CONFIG_ARCH_TEGRA_2x_SOC - { .compatible = "nvidia,tegra20-mc", .data = &tegra20_mc_soc }, + { .compatible = "nvidia,tegra20-mc-gart", .data = &tegra20_mc_soc }, #endif #ifdef CONFIG_ARCH_TEGRA_3x_SOC { .compatible = "nvidia,tegra30-mc", .data = &tegra30_mc_soc }, @@ -638,24 +638,19 @@ static int tegra_mc_probe(struct platform_device *pdev) if (IS_ERR(mc->regs)) return PTR_ERR(mc->regs); + mc->clk = devm_clk_get(&pdev->dev, "mc"); + if (IS_ERR(mc->clk)) { + dev_err(&pdev->dev, "failed to get MC clock: %ld\n", + PTR_ERR(mc->clk)); + return PTR_ERR(mc->clk); + } + #ifdef CONFIG_ARCH_TEGRA_2x_SOC if (mc->soc == &tegra20_mc_soc) { - res = platform_get_resource(pdev, IORESOURCE_MEM, 1); - mc->regs2 = devm_ioremap_resource(&pdev->dev, res); - if (IS_ERR(mc->regs2)) - return PTR_ERR(mc->regs2); - isr = tegra20_mc_irq; } else #endif { - mc->clk = devm_clk_get(&pdev->dev, "mc"); - if (IS_ERR(mc->clk)) { - dev_err(&pdev->dev, "failed to get MC clock: %ld\n", - PTR_ERR(mc->clk)); - return PTR_ERR(mc->clk); - } - err = tegra_mc_setup_latency_allowance(mc); if (err < 0) { dev_err(&pdev->dev, "failed to setup latency allowance: %d\n", diff --git a/drivers/memory/tegra/mc.h b/drivers/memory/tegra/mc.h index 01065f12ebeb..9856f085e487 100644 --- a/drivers/memory/tegra/mc.h +++ b/drivers/memory/tegra/mc.h @@ -26,18 +26,12 @@ static inline u32 mc_readl(struct tegra_mc *mc, unsigned long offset) { - if (mc->regs2 && offset >= 0x24) - return readl(mc->regs2 + offset - 0x3c); - return readl(mc->regs + offset); } static inline void mc_writel(struct tegra_mc *mc, u32 value, unsigned long offset) { - if (mc->regs2 && offset >= 0x24) - return writel(value, mc->regs2 + offset - 0x3c); - writel(value, mc->regs + offset); } diff --git a/include/soc/tegra/mc.h b/include/soc/tegra/mc.h index b43f37fea096..db5bfdf589b4 100644 --- a/include/soc/tegra/mc.h +++ b/include/soc/tegra/mc.h @@ -144,7 +144,7 @@ struct tegra_mc_soc { struct tegra_mc { struct device *dev; struct tegra_smmu *smmu; - void __iomem *regs, *regs2; + void __iomem *regs; struct clk *clk; int irq; From patchwork Mon Sep 24 00:41:43 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 973801 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-tegra-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="BfSJ8q3L"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 42JQWl0f4bz9sC7 for ; Mon, 24 Sep 2018 10:46:59 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727523AbeIXGqe (ORCPT ); Mon, 24 Sep 2018 02:46:34 -0400 Received: from mail-pg1-f193.google.com ([209.85.215.193]:44679 "EHLO mail-pg1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727485AbeIXGqe (ORCPT ); Mon, 24 Sep 2018 02:46:34 -0400 Received: by mail-pg1-f193.google.com with SMTP id g2-v6so405336pgu.11; Sun, 23 Sep 2018 17:46:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=ouqXLjUunN0zjItu13Z4M/nn8hcgnEka9D6ynQqkQts=; b=BfSJ8q3L7S3UhQoP5s5ZbIXTB6pPwwl7TSYhUyrIxThgh0kCyN8WBd3KhOzR6kJJhp KzoGoTvNAUJLpXp14avtHvUMgY6w5VAq213zp4Fmndx73kKMnzNGi9FpXCZoXaWLiBhr SWSGe6SeF0/5ormFH32R3cezDL84AcGGGKqw1Ud+y4o77QSD27f5v0vWWUCIxYq49g1v bYXAVakpl8RQu5fdN5MAaa+zed8ntgedJx5UjADA1ILwRZLgtABPMb4t17+JA3AIG6Mh d1uHjr2qv3W5QVybv6mIWjXATvS1EgISZu3Hlc/OMXKhaNAnE5gKxNwoDoAXW7sWeMPv JEqQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=ouqXLjUunN0zjItu13Z4M/nn8hcgnEka9D6ynQqkQts=; b=Cz/XVg+mW/tf7FMVaTKa/40TmOf4J94uwx6FX+aL+6jF9hJ6KHMKvVBu1R6fgJmwDi sYw9irTRpc5uqEnJdnXuQJt23J/kE2HyU4tyZg4F3KYaB1WTW1k1mu1j+g4rZZ6gkJOJ Tc5hYRszcsh/8aIGCzKXIyoR1pICBJz9jwoClJ6c7JV2TRutB/zFy0wXV1NYBTYNjJuO JARX9pBvMlDnyzNQF12EVmDhGPzYGDY7PJMbHnAzIqh+FELts8Lo92qmi//IZu4dCalI p4Q1ZaA5Cr978/u+6/fQbQB1TYw1fD+Y5sEx2v2MHFJgfRRRzfl5xSYxv1g83RNFUaVr f2GQ== X-Gm-Message-State: ABuFfoi0/OlEWNnpdM7yYztqlHG+05StxGdjkiRH2tvL3CbYuMqkUJ6M uJYPAOXy6W65fSWIGH5Mrmw= X-Google-Smtp-Source: ACcGV61Yp8r3Hla30JwcleOAq02poWVLVt7pfIt8hCmMUqg0heCx5hndpVcDs9PDE+MgkRR2d4PVjQ== X-Received: by 2002:a63:d256:: with SMTP id t22-v6mr7193480pgi.335.1537750017015; Sun, 23 Sep 2018 17:46:57 -0700 (PDT) Received: from localhost.localdomain (109-252-91-213.nat.spd-mgts.ru. [109.252.91.213]) by smtp.gmail.com with ESMTPSA id 82-v6sm5121839pfr.115.2018.09.23.17.46.51 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 23 Sep 2018 17:46:56 -0700 (PDT) From: Dmitry Osipenko To: Thierry Reding , Jonathan Hunter , Joerg Roedel , Rob Herring , Robin Murphy Cc: iommu@lists.linux-foundation.org, devicetree@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 10/20] memory: tegra: Read client ID on GART page fault Date: Mon, 24 Sep 2018 03:41:43 +0300 Message-Id: <20180924004153.8232-11-digetx@gmail.com> X-Mailer: git-send-email 2.19.0 In-Reply-To: <20180924004153.8232-1-digetx@gmail.com> References: <20180924004153.8232-1-digetx@gmail.com> MIME-Version: 1.0 Sender: linux-tegra-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org With the device tree binding changes, now Memory Controller has access to GART registers. Hence it is now possible to read client ID on GART page fault to get information about what memory client causes the fault. Signed-off-by: Dmitry Osipenko --- drivers/memory/tegra/mc.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/drivers/memory/tegra/mc.c b/drivers/memory/tegra/mc.c index 1b4ceefd82f9..5454ffe5b2e0 100644 --- a/drivers/memory/tegra/mc.c +++ b/drivers/memory/tegra/mc.c @@ -38,6 +38,7 @@ #define MC_ERR_ADR 0x0c +#define MC_GART_ERROR_REQ 0x30 #define MC_DECERR_EMEM_OTHERS_STATUS 0x58 #define MC_SECURITY_VIOLATION_STATUS 0x74 @@ -575,8 +576,15 @@ static __maybe_unused irqreturn_t tegra20_mc_irq(int irq, void *data) break; case MC_INT_INVALID_GART_PAGE: - dev_err_ratelimited(mc->dev, "%s\n", error); - continue; + reg = MC_GART_ERROR_REQ; + value = mc_readl(mc, reg); + + id = (value >> 1) & mc->soc->client_id_mask; + desc = error_names[2]; + + if (value & BIT(0)) + direction = "write"; + break; case MC_INT_SECURITY_VIOLATION: reg = MC_SECURITY_VIOLATION_STATUS; From patchwork Mon Sep 24 00:41:44 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 973802 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-tegra-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="gKU2WXpx"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 42JQWr3Vpvz9s3C for ; Mon, 24 Sep 2018 10:47:04 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727543AbeIXGqk (ORCPT ); Mon, 24 Sep 2018 02:46:40 -0400 Received: from mail-pg1-f194.google.com ([209.85.215.194]:38371 "EHLO mail-pg1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727485AbeIXGqk (ORCPT ); Mon, 24 Sep 2018 02:46:40 -0400 Received: by mail-pg1-f194.google.com with SMTP id r77-v6so3287538pgr.5; Sun, 23 Sep 2018 17:47:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=AJU/OMIS95Lf3Tx6/awWt2CDF0phION8a6f3KzZn+vM=; b=gKU2WXpxx8gqqyh9kjjIL4k/qRd2WzOpM+IKV5piWz2GX5/tyarPgCbA6n++7TpHSu 4SLmpcq1nOXWToTd/tD5RuSlDVIJsU9i/mn3YykJxX0XqkZR92pftQiNN7lDUhq4Kj67 UjxKLE1h+xzwxLumupaRjbWHURw6lwSrfhflLA/wLJggyA8qXq6366zQLkiav7/Hufq+ EioahlQNjhr/3zorOmPEHXjNaH24O14kJzABOul0pD60gKw1dmix8waGP+R9kL2q7pGT 9WXwfSpuNYiGqvbLDfLXfkAHCjGuNK4/yGrdMRPvdEAj2sJJebBge/LKDvYvHOzlqJnT Joqg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=AJU/OMIS95Lf3Tx6/awWt2CDF0phION8a6f3KzZn+vM=; b=jNjvLptCg0Tzu8zIYgTJE1hF4/pf9AsNLkhMniwnpXIHQ5QNgANaQBlvc0TbewFFtL dX5aZ2dOdMrxNd8wcdINtIpIkMecSjojoUhGZtjq2RXbvNnCQ0CGAOlO00KqOuNnXcm2 Js9aA1zzoYdRTizj9deQB5o8tO2DrkRARYnyPdhivvGKuimu2BxgxDg8Oh3/bIU5T2Fu 0JC3McNqVOeqO1vEyEznjm4uO3GphvkVa3cvfcqWxNvyjn0NszDP3BL9rPGcvJvEtw+T tehRIJspJU9saHzZfWrBxirF645yBpvdB49RcIvbe0AAtl1/ulobO+9OYgVF0U+7d+wV I49Q== X-Gm-Message-State: APzg51B22gXciIh/MXn89EtCaZI8VtKOZliY1GaBSuLAkdCa45YMVpTC M1VLQV2EeQkYvtdT8PMfsG4= X-Google-Smtp-Source: ANB0VdZgCXGORQFbxvpnupv3C+fgv6mQsLbDdYx5GH9zmi1/bifO5LaL7vL0WdyOaiyNTVMpJcJqvQ== X-Received: by 2002:a62:7510:: with SMTP id q16-v6mr8046015pfc.225.1537750022895; Sun, 23 Sep 2018 17:47:02 -0700 (PDT) Received: from localhost.localdomain (109-252-91-213.nat.spd-mgts.ru. [109.252.91.213]) by smtp.gmail.com with ESMTPSA id 82-v6sm5121839pfr.115.2018.09.23.17.46.57 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 23 Sep 2018 17:47:02 -0700 (PDT) From: Dmitry Osipenko To: Thierry Reding , Jonathan Hunter , Joerg Roedel , Rob Herring , Robin Murphy Cc: iommu@lists.linux-foundation.org, devicetree@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 11/20] memory: tegra: Use of_device_get_match_data() Date: Mon, 24 Sep 2018 03:41:44 +0300 Message-Id: <20180924004153.8232-12-digetx@gmail.com> X-Mailer: git-send-email 2.19.0 In-Reply-To: <20180924004153.8232-1-digetx@gmail.com> References: <20180924004153.8232-1-digetx@gmail.com> MIME-Version: 1.0 Sender: linux-tegra-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org There is no need to match device with the DT node since it was already matched, use of_device_get_match_data() helper to get the match-data. Signed-off-by: Dmitry Osipenko --- drivers/memory/tegra/mc.c | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/drivers/memory/tegra/mc.c b/drivers/memory/tegra/mc.c index 5454ffe5b2e0..cdc33f93cf7c 100644 --- a/drivers/memory/tegra/mc.c +++ b/drivers/memory/tegra/mc.c @@ -11,8 +11,7 @@ #include #include #include -#include -#include +#include #include #include @@ -619,23 +618,18 @@ static __maybe_unused irqreturn_t tegra20_mc_irq(int irq, void *data) static int tegra_mc_probe(struct platform_device *pdev) { - const struct of_device_id *match; struct resource *res; struct tegra_mc *mc; void *isr; int err; - match = of_match_node(tegra_mc_of_match, pdev->dev.of_node); - if (!match) - return -ENODEV; - mc = devm_kzalloc(&pdev->dev, sizeof(*mc), GFP_KERNEL); if (!mc) return -ENOMEM; platform_set_drvdata(pdev, mc); spin_lock_init(&mc->lock); - mc->soc = match->data; + mc->soc = of_device_get_match_data(&pdev->dev); mc->dev = &pdev->dev; /* length of MC tick in nanoseconds */ From patchwork Mon Sep 24 00:41:45 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 973803 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-tegra-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="M2YgzYod"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 42JQX10G9dz9sB4 for ; Mon, 24 Sep 2018 10:47:13 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727585AbeIXGqq (ORCPT ); Mon, 24 Sep 2018 02:46:46 -0400 Received: from mail-pl1-f196.google.com ([209.85.214.196]:38855 "EHLO mail-pl1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727485AbeIXGqq (ORCPT ); Mon, 24 Sep 2018 02:46:46 -0400 Received: by mail-pl1-f196.google.com with SMTP id u11-v6so8345445plq.5; Sun, 23 Sep 2018 17:47:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=AR5aLIvn+L1kfLKG5AYiwjqZfuuNlKOYlr56vWakhOA=; b=M2YgzYodsbOm7ZZAJg/Rpm2WC9Z+Ep3HK+4SbNlX6rU8FJ8Nf6XsV9BmMfZZR6ku0P gR1MI8wqgLdijGhG1VZTxrwtHOf61rI/JDJZCbGWasyqykDaYHRT9+i7901MMAp0hjC+ e9IYnp8A8MvKhqCNhvIjgIHTp7WSZfIKxCMTFGMgbil8ZIc79LbMRwte8le8kWLJxZXf r8/SWSn0yeDs2XArGTLqvyHjjLAy83Yc2aHIsE0YpIy+3rHNA/qB+W8YhIrwPdtGblic /rOpCQqLw+Uun6FSBlViN1/yXDy0H6xXo4rKVDfVUWXogFJ1MKVrMlSgtN3tT2hzvUZW JUHA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=AR5aLIvn+L1kfLKG5AYiwjqZfuuNlKOYlr56vWakhOA=; b=H+HVmC7Sih9OzSfLSwPho+klINvwx8Z4hQ9eN/fnt6c6WZcoFuQzkD9ZeKLVk52kRX Ik9xUoAF8MWfZLZLBNE1846gmRC2VGfW4rEhz13MqlinaKCMXnQ/IRj0bkDZHBDML1kR WD1EJfu21072KUqMwLXEJu5Jztdfln3EJXKxtvzOxyv1BsjYmjz1nvNB730Aabg0MUBD HErW1KpQcdrK3DKaKniauS0YPILAgtFGHywb92JycEutqId+NtUmpbGeorPMr4P/Gh56 c3YN4SRCYx0J+P9m0S6co8DtKcI9Ekz8FDbez7g9zJ3GYmn1DFjx4wBOlSZ851TTJ7Sg xzfQ== X-Gm-Message-State: ABuFfoiSSxyOedPZNYrC0Den/BcPLf17buk8L3Nrp5TWeLZjThVHBN+F VmQdPX+hnqnN++SoKzjABBjaIyrN X-Google-Smtp-Source: ACcGV63UCQoFRTl+G4eHDjSRB2NyUv0XHaXDHzTBhp57ZA9HioMHdl3R6pqn8GtausbppTY8E0KLEg== X-Received: by 2002:a17:902:7001:: with SMTP id y1-v6mr5800390plk.259.1537750029092; Sun, 23 Sep 2018 17:47:09 -0700 (PDT) Received: from localhost.localdomain (109-252-91-213.nat.spd-mgts.ru. [109.252.91.213]) by smtp.gmail.com with ESMTPSA id 82-v6sm5121839pfr.115.2018.09.23.17.47.03 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 23 Sep 2018 17:47:08 -0700 (PDT) From: Dmitry Osipenko To: Thierry Reding , Jonathan Hunter , Joerg Roedel , Rob Herring , Robin Murphy Cc: iommu@lists.linux-foundation.org, devicetree@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 12/20] iommu/tegra: gart: Integrate with Memory Controller driver Date: Mon, 24 Sep 2018 03:41:45 +0300 Message-Id: <20180924004153.8232-13-digetx@gmail.com> X-Mailer: git-send-email 2.19.0 In-Reply-To: <20180924004153.8232-1-digetx@gmail.com> References: <20180924004153.8232-1-digetx@gmail.com> MIME-Version: 1.0 Sender: linux-tegra-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org The device-tree binding has been changed. There is no separate GART device anymore, it is squashed into the Memory Controller. Integrate GART module with the MC in a way it is done for the SMMU of Tegra30+. Signed-off-by: Dmitry Osipenko --- drivers/iommu/Kconfig | 1 + drivers/iommu/tegra-gart.c | 98 ++++++++++---------------------------- drivers/memory/tegra/mc.c | 41 ++++++++++++++++ include/soc/tegra/mc.h | 27 +++++++++++ 4 files changed, 93 insertions(+), 74 deletions(-) diff --git a/drivers/iommu/Kconfig b/drivers/iommu/Kconfig index c60395b7470f..33f97e5f07ca 100644 --- a/drivers/iommu/Kconfig +++ b/drivers/iommu/Kconfig @@ -269,6 +269,7 @@ config ROCKCHIP_IOMMU config TEGRA_IOMMU_GART bool "Tegra GART IOMMU Support" depends on ARCH_TEGRA_2x_SOC + depends on TEGRA_MC select IOMMU_API help Enables support for remapping discontiguous physical memory diff --git a/drivers/iommu/tegra-gart.c b/drivers/iommu/tegra-gart.c index 86a855c0d031..1c89b20ba4bb 100644 --- a/drivers/iommu/tegra-gart.c +++ b/drivers/iommu/tegra-gart.c @@ -21,11 +21,13 @@ #include #include #include -#include +#include #include #include #include +#include + /* bitmap of the page sizes currently supported */ #define GART_IOMMU_PGSIZES (SZ_4K) @@ -394,9 +396,8 @@ static const struct iommu_ops gart_iommu_ops = { .iotlb_sync = gart_iommu_sync, }; -static int tegra_gart_suspend(struct device *dev) +int tegra_gart_suspend(struct gart_device *gart) { - struct gart_device *gart = dev_get_drvdata(dev); unsigned long iova; u32 *data = gart->savedata; unsigned long flags; @@ -408,9 +409,8 @@ static int tegra_gart_suspend(struct device *dev) return 0; } -static int tegra_gart_resume(struct device *dev) +int tegra_gart_resume(struct gart_device *gart) { - struct gart_device *gart = dev_get_drvdata(dev); unsigned long flags; spin_lock_irqsave(&gart->pte_lock, flags); @@ -419,41 +419,39 @@ static int tegra_gart_resume(struct device *dev) return 0; } -static int tegra_gart_probe(struct platform_device *pdev) +struct gart_device *tegra_gart_probe(struct device *dev, + const struct tegra_smmu_soc *soc, + struct tegra_mc *mc) { struct gart_device *gart; - struct resource *res, *res_remap; + struct resource *res_remap; void __iomem *gart_regs; - struct device *dev = &pdev->dev; int ret; BUILD_BUG_ON(PAGE_SHIFT != GART_PAGE_SHIFT); + /* Tegra30+ has an SMMU and no GART */ + if (soc) + return NULL; + /* the GART memory aperture is required */ - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - res_remap = platform_get_resource(pdev, IORESOURCE_MEM, 1); - if (!res || !res_remap) { + res_remap = platform_get_resource(to_platform_device(dev), + IORESOURCE_MEM, 1); + if (!res_remap) { dev_err(dev, "GART memory aperture expected\n"); - return -ENXIO; + return ERR_PTR(-ENXIO); } gart = devm_kzalloc(dev, sizeof(*gart), GFP_KERNEL); if (!gart) { dev_err(dev, "failed to allocate gart_device\n"); - return -ENOMEM; + return ERR_PTR(-ENOMEM); } - gart_regs = devm_ioremap(dev, res->start, resource_size(res)); - if (!gart_regs) { - dev_err(dev, "failed to remap GART registers\n"); - return -ENXIO; - } - - ret = iommu_device_sysfs_add(&gart->iommu, &pdev->dev, NULL, - dev_name(&pdev->dev)); + ret = iommu_device_sysfs_add(&gart->iommu, dev, NULL, "gart"); if (ret) { dev_err(dev, "Failed to register IOMMU in sysfs\n"); - return ret; + return ERR_PTR(ret); } iommu_device_set_ops(&gart->iommu, &gart_iommu_ops); @@ -465,7 +463,8 @@ static int tegra_gart_probe(struct platform_device *pdev) goto remove_sysfs; } - gart->dev = &pdev->dev; + gart->dev = dev; + gart_regs = mc->regs + GART_REG_BASE; spin_lock_init(&gart->pte_lock); spin_lock_init(&gart->client_lock); INIT_LIST_HEAD(&gart->client); @@ -480,72 +479,23 @@ static int tegra_gart_probe(struct platform_device *pdev) goto unregister_iommu; } - platform_set_drvdata(pdev, gart); do_gart_setup(gart, NULL); gart_handle = gart; - return 0; + return gart; unregister_iommu: iommu_device_unregister(&gart->iommu); remove_sysfs: iommu_device_sysfs_remove(&gart->iommu); - return ret; -} - -static int tegra_gart_remove(struct platform_device *pdev) -{ - struct gart_device *gart = platform_get_drvdata(pdev); - - iommu_device_unregister(&gart->iommu); - iommu_device_sysfs_remove(&gart->iommu); - - writel(0, gart->regs + GART_CONFIG); - if (gart->savedata) - vfree(gart->savedata); - gart_handle = NULL; - return 0; -} - -static const struct dev_pm_ops tegra_gart_pm_ops = { - .suspend = tegra_gart_suspend, - .resume = tegra_gart_resume, -}; - -static const struct of_device_id tegra_gart_of_match[] = { - { .compatible = "nvidia,tegra20-gart", }, - { }, -}; -MODULE_DEVICE_TABLE(of, tegra_gart_of_match); - -static struct platform_driver tegra_gart_driver = { - .probe = tegra_gart_probe, - .remove = tegra_gart_remove, - .driver = { - .name = "tegra-gart", - .pm = &tegra_gart_pm_ops, - .of_match_table = tegra_gart_of_match, - }, -}; - -static int tegra_gart_init(void) -{ - return platform_driver_register(&tegra_gart_driver); -} - -static void __exit tegra_gart_exit(void) -{ - platform_driver_unregister(&tegra_gart_driver); + return ERR_PTR(ret); } -subsys_initcall(tegra_gart_init); -module_exit(tegra_gart_exit); module_param(gart_debug, bool, 0644); MODULE_PARM_DESC(gart_debug, "Enable GART debugging"); MODULE_DESCRIPTION("IOMMU API for GART in Tegra20"); MODULE_AUTHOR("Hiroshi DOYU "); -MODULE_ALIAS("platform:tegra-gart"); MODULE_LICENSE("GPL v2"); diff --git a/drivers/memory/tegra/mc.c b/drivers/memory/tegra/mc.c index cdc33f93cf7c..cdb6f1069930 100644 --- a/drivers/memory/tegra/mc.c +++ b/drivers/memory/tegra/mc.c @@ -700,13 +700,54 @@ static int tegra_mc_probe(struct platform_device *pdev) PTR_ERR(mc->smmu)); } + if (IS_ENABLED(CONFIG_TEGRA_IOMMU_GART)) { + mc->gart = tegra_gart_probe(&pdev->dev, mc->soc->smmu, mc); + if (IS_ERR(mc->gart)) + dev_err(&pdev->dev, "failed to probe GART: %ld\n", + PTR_ERR(mc->gart)); + } + + return 0; +} + +static int tegra_mc_suspend(struct device *dev) +{ + struct tegra_mc *mc = dev_get_drvdata(dev); + int err; + + if (mc->gart) { + err = tegra_gart_suspend(mc->gart); + if (err) + return err; + } + return 0; } +static int tegra_mc_resume(struct device *dev) +{ + struct tegra_mc *mc = dev_get_drvdata(dev); + int err; + + if (mc->gart) { + err = tegra_gart_resume(mc->gart); + if (err) + return err; + } + + return 0; +} + +static const struct dev_pm_ops tegra_mc_pm_ops = { + .suspend = tegra_mc_suspend, + .resume = tegra_mc_resume, +}; + static struct platform_driver tegra_mc_driver = { .driver = { .name = "tegra-mc", .of_match_table = tegra_mc_of_match, + .pm = &tegra_mc_pm_ops, .suppress_bind_attrs = true, }, .prevent_deferred_probe = true, diff --git a/include/soc/tegra/mc.h b/include/soc/tegra/mc.h index db5bfdf589b4..5da42e3fb801 100644 --- a/include/soc/tegra/mc.h +++ b/include/soc/tegra/mc.h @@ -77,6 +77,7 @@ struct tegra_smmu_soc { struct tegra_mc; struct tegra_smmu; +struct gart_device; #ifdef CONFIG_TEGRA_IOMMU_SMMU struct tegra_smmu *tegra_smmu_probe(struct device *dev, @@ -96,6 +97,31 @@ static inline void tegra_smmu_remove(struct tegra_smmu *smmu) } #endif +#ifdef CONFIG_TEGRA_IOMMU_GART +struct gart_device *tegra_gart_probe(struct device *dev, + const struct tegra_smmu_soc *soc, + struct tegra_mc *mc); +int tegra_gart_suspend(struct gart_device *gart); +int tegra_gart_resume(struct gart_device *gart); +#else +static inline struct gart_device * +tegra_gart_probe(struct device *dev, const struct tegra_smmu_soc *soc, + struct tegra_mc *mc) +{ + return NULL; +} + +static inline int tegra_gart_suspend(struct gart_device *gart) +{ + return -ENODEV; +} + +static inline int tegra_gart_resume(struct gart_device *gart) +{ + return -ENODEV; +} +#endif + struct tegra_mc_reset { const char *name; unsigned long id; @@ -144,6 +170,7 @@ struct tegra_mc_soc { struct tegra_mc { struct device *dev; struct tegra_smmu *smmu; + struct gart_device *gart; void __iomem *regs; struct clk *clk; int irq; From patchwork Mon Sep 24 00:41:46 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 973806 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-tegra-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="F5XKBDnl"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 42JQXR3YQ8z9sB4 for ; Mon, 24 Sep 2018 10:47:35 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727057AbeIXGqw (ORCPT ); Mon, 24 Sep 2018 02:46:52 -0400 Received: from mail-pg1-f194.google.com ([209.85.215.194]:37248 "EHLO mail-pg1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725742AbeIXGqw (ORCPT ); Mon, 24 Sep 2018 02:46:52 -0400 Received: by mail-pg1-f194.google.com with SMTP id c10-v6so1424682pgq.4; Sun, 23 Sep 2018 17:47:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=xbmP4w1+k4iZZVe/x3jH6bMmJ9XtwjJDAZgIUWobb9s=; b=F5XKBDnlsARrOxB8ATLtQRGKb+l4U7TOvPaZc9ctDL+NzDtOop2vPSs3z3qr0JysWg 8rFIRHYy/464DNKBt7aUdTCOD/ZdajiMR7L+F1TSKc5HjwM7bgv+idrM9ZtmFSZ7N+/v J0YZ2VoMW8fNBMKUOsnPP83O7nP8gTn2+mZiyjBvdxj587NhqVCeASDIUx2bbIwvxrX1 9RbqVFJ7bGG5meOA534K/oB7ObJScAw3Aawb47h1oJeBkDfQ/ISTNAZbuZ7S323DqKZu 9XtiXtvNNwdvxLpju3uXjwJDdfb8L0voZuuRSJKwMefRA4M3M84s8ELdyAwXT3joY9JQ 5TvQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=xbmP4w1+k4iZZVe/x3jH6bMmJ9XtwjJDAZgIUWobb9s=; b=IWDrP19pisbcB9wwR5A9ndBV42qCqJR3+9YLn9S9VNl3MvlZ0Dlrg10Kh+qY0DT5fW Hji8odw3fekYhYPGUHMDH4qfV0HKfUfnvPinipyfndTs9EMoOs8zHIzRrPSyonSZe/Pz bzy6DDUwQ21lRlSV8YiAEftrXUe6RVl6a1t138pmj5zCvnfDF5nvZb2GA9rDCzIrvChJ WLYe8tuZGWqhVEqndsOoz3NhLt2ZXHRcuF4SQs71f2H1zaNE2VXib2/X3fxCDsYIYzUh Io9Lu12e/a9Fx/V0Zr7ZpAylKVhbIS379NgGOo2lr18AXscIQYV+ggI1q7Q2i5T89/bG fWUA== X-Gm-Message-State: ABuFfojKvKBlp/JtQrRDFenYnoghUhHkf3dthpzUAIlzW7BFxueSXhBM 7N2Mc7AwspsmpqnnnMj5eXg= X-Google-Smtp-Source: ACcGV61iQThEjySxODGCn5IkgXOQWTE0nwggaaRd/yaDyKXm6M7CfvRu3N0PsYXl9aV9heZwdWX0qw== X-Received: by 2002:a63:350f:: with SMTP id c15-v6mr7307140pga.206.1537750035006; Sun, 23 Sep 2018 17:47:15 -0700 (PDT) Received: from localhost.localdomain (109-252-91-213.nat.spd-mgts.ru. [109.252.91.213]) by smtp.gmail.com with ESMTPSA id 82-v6sm5121839pfr.115.2018.09.23.17.47.09 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 23 Sep 2018 17:47:14 -0700 (PDT) From: Dmitry Osipenko To: Thierry Reding , Jonathan Hunter , Joerg Roedel , Rob Herring , Robin Murphy Cc: iommu@lists.linux-foundation.org, devicetree@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 13/20] iommu/tegra: gart: Fix spinlock recursion Date: Mon, 24 Sep 2018 03:41:46 +0300 Message-Id: <20180924004153.8232-14-digetx@gmail.com> X-Mailer: git-send-email 2.19.0 In-Reply-To: <20180924004153.8232-1-digetx@gmail.com> References: <20180924004153.8232-1-digetx@gmail.com> MIME-Version: 1.0 Sender: linux-tegra-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org Fix spinlock recursion bug that happens on IOMMU domain destruction if any of the allocated domains have devices attached to them. Signed-off-by: Dmitry Osipenko Acked-by: Thierry Reding --- drivers/iommu/tegra-gart.c | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/drivers/iommu/tegra-gart.c b/drivers/iommu/tegra-gart.c index 1c89b20ba4bb..e6fe139576c3 100644 --- a/drivers/iommu/tegra-gart.c +++ b/drivers/iommu/tegra-gart.c @@ -195,25 +195,33 @@ static int gart_iommu_attach_dev(struct iommu_domain *domain, return err; } -static void gart_iommu_detach_dev(struct iommu_domain *domain, - struct device *dev) +static void __gart_iommu_detach_dev(struct iommu_domain *domain, + struct device *dev) { struct gart_domain *gart_domain = to_gart_domain(domain); struct gart_device *gart = gart_domain->gart; struct gart_client *c; - spin_lock(&gart->client_lock); - list_for_each_entry(c, &gart->client, list) { if (c->dev == dev) { list_del(&c->list); devm_kfree(gart->dev, c); dev_dbg(gart->dev, "Detached %s\n", dev_name(dev)); - goto out; + return; } } - dev_err(gart->dev, "Couldn't find\n"); -out: + + dev_err(gart->dev, "Couldn't find %s to detach\n", dev_name(dev)); +} + +static void gart_iommu_detach_dev(struct iommu_domain *domain, + struct device *dev) +{ + struct gart_domain *gart_domain = to_gart_domain(domain); + struct gart_device *gart = gart_domain->gart; + + spin_lock(&gart->client_lock); + __gart_iommu_detach_dev(domain, dev); spin_unlock(&gart->client_lock); } @@ -253,7 +261,7 @@ static void gart_iommu_domain_free(struct iommu_domain *domain) struct gart_client *c; list_for_each_entry(c, &gart->client, list) - gart_iommu_detach_dev(domain, c->dev); + __gart_iommu_detach_dev(domain, c->dev); } spin_unlock(&gart->client_lock); } From patchwork Mon Sep 24 00:41:47 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 973805 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-tegra-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="qPKIQ6OT"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 42JQXQ5rxvz9s4s for ; Mon, 24 Sep 2018 10:47:34 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727582AbeIXGq6 (ORCPT ); Mon, 24 Sep 2018 02:46:58 -0400 Received: from mail-pf1-f193.google.com ([209.85.210.193]:35249 "EHLO mail-pf1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725742AbeIXGq5 (ORCPT ); Mon, 24 Sep 2018 02:46:57 -0400 Received: by mail-pf1-f193.google.com with SMTP id p12-v6so8313229pfh.2; Sun, 23 Sep 2018 17:47:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=YOOMCH2KwkYbAYwpexjwI99bbfGpSnTLhrWo5MkIH4Y=; b=qPKIQ6OTTXw8MbDOh30LTWWB9kBOZVaIfkXenTR4doEmpODTnRFkH5AtgqJJdygb0e 5atSCL7mH9+HtoRbHTMkD+x5kVzi1lrXzkO1W/Oa1k9Rp8kqBROXeVbYtMkHep6a2+CC n/c0HiiZgpm0g4W2UPA6fV5AD5jeoz+a5WXsqYv2Kv+nsTGMMldlPrle66+y95919zUw spLXvQHjz0ahR9ccnhL9zN840Hw0UcgZbDe0hnhNkn8HMtEZ0rlqui1d62LXE4WBgWYt eyQG566r8YgJwcfDI4BIEoBioCcsy4pQdcZA3xMNqfg9hyKgKMPqXMlQT+DNrNHCcKPf Cfxg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=YOOMCH2KwkYbAYwpexjwI99bbfGpSnTLhrWo5MkIH4Y=; b=RD/m4UNhXuiDUtbuRLAiWkGs+8ylYNomqxgDQSsnGxGkpuKiC9WY4cumkTOG8329BZ c/rh7ldKTLoS5BGB9ZsvxPjxtvcttuwBqvN0DnGFJMCt138P7Bg3SZuyIj18BqdQuQMe Xv2+b71Kjckd2neNUTTckRUDmLaXCLgyn/KUzmFMo1CwnaiLfFsFVgANGG5iYzIBDCRA RpL3fSgOFipjWnX5pk7IQAeW6b7oF6KleZfWb1oBK4+M3CI+mKdnRH3bPEj6w1Xfusbb 9wKR6lmox/n3XpSRZqdnKyUh62P6npZ8BjlsiFPVkyNvYn8zGyz/kVCb/LeJU6Wgcr9y e+zA== X-Gm-Message-State: APzg51Ah04qqZykfwruh4SpM0DzBkqa+KtxIKQamb/PY0G8Gj/GrP6aT FrMYWlmovL9TxurvKeKNZnQ= X-Google-Smtp-Source: ANB0VdaJDoXVZtelMVWUvHRrxQvGHLYeOajLlC224ubYixe55f1FgQOS4sFEbP/uhfcKbfGVDLtxcQ== X-Received: by 2002:a62:51c6:: with SMTP id f189-v6mr8084215pfb.7.1537750040893; Sun, 23 Sep 2018 17:47:20 -0700 (PDT) Received: from localhost.localdomain (109-252-91-213.nat.spd-mgts.ru. [109.252.91.213]) by smtp.gmail.com with ESMTPSA id 82-v6sm5121839pfr.115.2018.09.23.17.47.15 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 23 Sep 2018 17:47:20 -0700 (PDT) From: Dmitry Osipenko To: Thierry Reding , Jonathan Hunter , Joerg Roedel , Rob Herring , Robin Murphy Cc: iommu@lists.linux-foundation.org, devicetree@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 14/20] iommu/tegra: gart: Fix NULL pointer dereference Date: Mon, 24 Sep 2018 03:41:47 +0300 Message-Id: <20180924004153.8232-15-digetx@gmail.com> X-Mailer: git-send-email 2.19.0 In-Reply-To: <20180924004153.8232-1-digetx@gmail.com> References: <20180924004153.8232-1-digetx@gmail.com> MIME-Version: 1.0 Sender: linux-tegra-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org Fix NULL pointer dereference on IOMMU domain destruction that happens because clients list is being iterated unsafely and its elements are getting deleted during the iteration. Signed-off-by: Dmitry Osipenko Acked-by: Thierry Reding --- drivers/iommu/tegra-gart.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/iommu/tegra-gart.c b/drivers/iommu/tegra-gart.c index e6fe139576c3..1d45b023adea 100644 --- a/drivers/iommu/tegra-gart.c +++ b/drivers/iommu/tegra-gart.c @@ -258,9 +258,9 @@ static void gart_iommu_domain_free(struct iommu_domain *domain) if (gart) { spin_lock(&gart->client_lock); if (!list_empty(&gart->client)) { - struct gart_client *c; + struct gart_client *c, *tmp; - list_for_each_entry(c, &gart->client, list) + list_for_each_entry_safe(c, tmp, &gart->client, list) __gart_iommu_detach_dev(domain, c->dev); } spin_unlock(&gart->client_lock); From patchwork Mon Sep 24 00:41:48 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 973804 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-tegra-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="YSfU9Rqf"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 42JQXP20J9z9s4s for ; Mon, 24 Sep 2018 10:47:33 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727692AbeIXGrE (ORCPT ); Mon, 24 Sep 2018 02:47:04 -0400 Received: from mail-pf1-f194.google.com ([209.85.210.194]:44598 "EHLO mail-pf1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725742AbeIXGrD (ORCPT ); Mon, 24 Sep 2018 02:47:03 -0400 Received: by mail-pf1-f194.google.com with SMTP id k21-v6so8295238pff.11; Sun, 23 Sep 2018 17:47:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=tJd5qCvwZt+FEMthacrCaTfBiAsBAEj0Nbh8yr7YEp0=; b=YSfU9RqfhF+bLKXSTHxWKI8itgJv7xvcOAFMdX/rGWCccKbwzTm0nHkMaY9yUSZGAx RxU9xLsNiQkV5HGvYT2jd+KECQ0OHE8Cdjv5lqWD8NZczrfIvL5np5suat2eE+HSK6gd 3Xsj1Rj6QJUK/PbDwO2d4Inn3z8RXdATYwnyEdRPpdzK0DvxhkcTXVzlLydPE3e84Lmh kZG9HTkD/P3ZFOVG4mTXX6uD31N88mtmbVhFL//7KWUxZvP76Z+ZHN3zDafZC3DQ0tfP 1RlQov2Vrf98y1HSAZcDQtzoqCxDcS+Iz6p4OoY/rxAA2/98P5aOZpezuVtAIPo+dxQu UgEg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=tJd5qCvwZt+FEMthacrCaTfBiAsBAEj0Nbh8yr7YEp0=; b=X6I64Iwdyu1cyyGSevVINi0w+/BLM3eu9pcU4bG4LZd9PiudXQQ7gKwLxlZ+cIwEts MkNUrIQXJiYD9hb62iVufrXn8GfCTpH/oExNUpVn0tB8/nMcXSBsCXoj8R2dmUzgRfg1 9mVjOsAVGEwXzU/KZr+UlAEd1GYR83dVkQYojuVyi16VM8ROGg6u76rB5F2mOi/0hBH0 PnWKk+Xo/GyyEyGfKNGIkwa60xLL4YjO5cpJ72Mbdm2nnBdiA4HO7/0CScaALAeaVuII 2dw6xDWZ9xKXjHYBp0SQgYLxphFRbnVTbOo8DQtJcIkxaZvir1T7zsgRddahHGzU97Pk vwFA== X-Gm-Message-State: ABuFfoiFN9Z/9bvb75uI5dA3HtIp3GI2E1mELVKBPJgauvA/ZOw1hwa/ f7jjzQdsVOUPi5dLHqP4v+o= X-Google-Smtp-Source: ACcGV62eFxL2pNEF6V7WFdDnmEgNe2WHtdkiir9/urY7x3zlSRyk2uRGf/3JwirkNaTQ4nXeky55KA== X-Received: by 2002:a63:9857:: with SMTP id l23-v6mr7508168pgo.321.1537750046763; Sun, 23 Sep 2018 17:47:26 -0700 (PDT) Received: from localhost.localdomain (109-252-91-213.nat.spd-mgts.ru. [109.252.91.213]) by smtp.gmail.com with ESMTPSA id 82-v6sm5121839pfr.115.2018.09.23.17.47.21 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 23 Sep 2018 17:47:26 -0700 (PDT) From: Dmitry Osipenko To: Thierry Reding , Jonathan Hunter , Joerg Roedel , Rob Herring , Robin Murphy Cc: iommu@lists.linux-foundation.org, devicetree@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 15/20] iommu/tegra: gart: Allow only one active domain at a time Date: Mon, 24 Sep 2018 03:41:48 +0300 Message-Id: <20180924004153.8232-16-digetx@gmail.com> X-Mailer: git-send-email 2.19.0 In-Reply-To: <20180924004153.8232-1-digetx@gmail.com> References: <20180924004153.8232-1-digetx@gmail.com> MIME-Version: 1.0 Sender: linux-tegra-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org GART has a single address space that is shared by all devices, hence only one domain could be active at a time. Signed-off-by: Dmitry Osipenko Acked-by: Thierry Reding --- drivers/iommu/tegra-gart.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/drivers/iommu/tegra-gart.c b/drivers/iommu/tegra-gart.c index 1d45b023adea..9f7d3afb686f 100644 --- a/drivers/iommu/tegra-gart.c +++ b/drivers/iommu/tegra-gart.c @@ -55,6 +55,7 @@ struct gart_device { spinlock_t pte_lock; /* for pagetable */ struct list_head client; spinlock_t client_lock; /* for client list */ + struct iommu_domain *active_domain; /* current active domain */ struct device *dev; struct iommu_device iommu; /* IOMMU Core handle */ @@ -184,6 +185,12 @@ static int gart_iommu_attach_dev(struct iommu_domain *domain, goto fail; } } + if (gart->active_domain && gart->active_domain != domain) { + dev_err(gart->dev, "Only one domain can be active at a time\n"); + err = -EINVAL; + goto fail; + } + gart->active_domain = domain; list_add(&client->list, &gart->client); spin_unlock(&gart->client_lock); dev_dbg(gart->dev, "Attached %s\n", dev_name(dev)); @@ -206,6 +213,8 @@ static void __gart_iommu_detach_dev(struct iommu_domain *domain, if (c->dev == dev) { list_del(&c->list); devm_kfree(gart->dev, c); + if (list_empty(&gart->client)) + gart->active_domain = NULL; dev_dbg(gart->dev, "Detached %s\n", dev_name(dev)); return; } From patchwork Mon Sep 24 00:41:49 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 973807 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-tegra-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="dEMm1bC1"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 42JQXW0j2Xz9s3C for ; Mon, 24 Sep 2018 10:47:39 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727738AbeIXGrK (ORCPT ); Mon, 24 Sep 2018 02:47:10 -0400 Received: from mail-pl1-f194.google.com ([209.85.214.194]:40833 "EHLO mail-pl1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725742AbeIXGrJ (ORCPT ); Mon, 24 Sep 2018 02:47:09 -0400 Received: by mail-pl1-f194.google.com with SMTP id s17-v6so8333099plp.7; Sun, 23 Sep 2018 17:47:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=gGEUS43rmrDiePYKKFPE6JQ30QeCTnyz4CZGEBeeyW8=; b=dEMm1bC1EDeogca6Q9IuTBmu3wdpu2dM7p8bHgze2Hc3bJ/mv176X6swM+K6TYbyHt 4sxHN38Yn0XaFRPrIQVcGty95Dpx7xRE0pjhk8loJoih+T5dQFKaaSLcTsnSs6U12dMc otG0u3Gm0+3GbzJx8hHVWDL78BqPY0xUMsC5EKLhOO+ossJmrzTQ2cpuv2aO5reWaRlB SZV5Sw43TjJTc6zVpiX03AW3Jagc/H/n0NXC8kEutlb3DFhqvkWXGbwgyIU9gom4BsF0 SVQcwTx6b0br4Hjv01wVCLd5R2T+eF6MkmZFws1qepbiwok4FQzGR75iYULm6ooj2NRa 2BBA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=gGEUS43rmrDiePYKKFPE6JQ30QeCTnyz4CZGEBeeyW8=; b=BBYkoq7odSNHym2gpmJ+hZK5WqlE9odq26BH2037swkZBuMlVk0o0QPN9PMYBmpgkT XOm7krRvgOPYw2ETGPrik/efOWewbb2l7kdUg58ODl/TQZv3D9Eol5gpwRRGFmPdaxf7 xRabp2CdTBtmlBZsSAnvQF1qSoCtM/cf6hRuUFBeR8cZOyjFECKXUoFagyRDlYc/fwDR /qTEVzorH1C72yhotle8hlb9jJLT45s3WeLOYDAetSuffeia3nNm5VjbhhfGhjE8Aus8 IT9EPF7qBD6MDb2iLgcbw++W8/QkogjPP5eOnSDiF+sXKBLXsJnQ+px2ujCGwMpt/fuz 0JiQ== X-Gm-Message-State: ABuFfohIqTjCY3UHIKN1RlYIaN0cQprq3Kmjg6MaIggtt+z9C2CFU8jD 6vZ7FivtR1hFEToOGnlfRZg= X-Google-Smtp-Source: ACcGV60eAMashiv6PbvM7zY1Nadtu5u31QnrMn4kLUcf6GlleVKGQuDdh3Tftr59zO540ZEMR/82ag== X-Received: by 2002:a17:902:4001:: with SMTP id b1-v6mr8318366pld.312.1537750052671; Sun, 23 Sep 2018 17:47:32 -0700 (PDT) Received: from localhost.localdomain (109-252-91-213.nat.spd-mgts.ru. [109.252.91.213]) by smtp.gmail.com with ESMTPSA id 82-v6sm5121839pfr.115.2018.09.23.17.47.27 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 23 Sep 2018 17:47:32 -0700 (PDT) From: Dmitry Osipenko To: Thierry Reding , Jonathan Hunter , Joerg Roedel , Rob Herring , Robin Murphy Cc: iommu@lists.linux-foundation.org, devicetree@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 16/20] iommu/tegra: gart: Don't use managed resources Date: Mon, 24 Sep 2018 03:41:49 +0300 Message-Id: <20180924004153.8232-17-digetx@gmail.com> X-Mailer: git-send-email 2.19.0 In-Reply-To: <20180924004153.8232-1-digetx@gmail.com> References: <20180924004153.8232-1-digetx@gmail.com> MIME-Version: 1.0 Sender: linux-tegra-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org GART is a part of the Memory Controller driver that is always built-in, hence there is no benefit from the use of managed resources. Signed-off-by: Dmitry Osipenko --- drivers/iommu/tegra-gart.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/drivers/iommu/tegra-gart.c b/drivers/iommu/tegra-gart.c index 9f7d3afb686f..d019ae8ecfc9 100644 --- a/drivers/iommu/tegra-gart.c +++ b/drivers/iommu/tegra-gart.c @@ -171,7 +171,7 @@ static int gart_iommu_attach_dev(struct iommu_domain *domain, struct gart_client *client, *c; int err = 0; - client = devm_kzalloc(gart->dev, sizeof(*c), GFP_KERNEL); + client = kzalloc(sizeof(*c), GFP_KERNEL); if (!client) return -ENOMEM; client->dev = dev; @@ -197,7 +197,7 @@ static int gart_iommu_attach_dev(struct iommu_domain *domain, return 0; fail: - devm_kfree(gart->dev, client); + kfree(client); spin_unlock(&gart->client_lock); return err; } @@ -212,7 +212,7 @@ static void __gart_iommu_detach_dev(struct iommu_domain *domain, list_for_each_entry(c, &gart->client, list) { if (c->dev == dev) { list_del(&c->list); - devm_kfree(gart->dev, c); + kfree(c); if (list_empty(&gart->client)) gart->active_domain = NULL; dev_dbg(gart->dev, "Detached %s\n", dev_name(dev)); @@ -459,7 +459,7 @@ struct gart_device *tegra_gart_probe(struct device *dev, return ERR_PTR(-ENXIO); } - gart = devm_kzalloc(dev, sizeof(*gart), GFP_KERNEL); + gart = kzalloc(sizeof(*gart), GFP_KERNEL); if (!gart) { dev_err(dev, "failed to allocate gart_device\n"); return ERR_PTR(-ENOMEM); @@ -468,7 +468,7 @@ struct gart_device *tegra_gart_probe(struct device *dev, ret = iommu_device_sysfs_add(&gart->iommu, dev, NULL, "gart"); if (ret) { dev_err(dev, "Failed to register IOMMU in sysfs\n"); - return ERR_PTR(ret); + goto free_gart; } iommu_device_set_ops(&gart->iommu, &gart_iommu_ops); @@ -506,6 +506,8 @@ struct gart_device *tegra_gart_probe(struct device *dev, iommu_device_unregister(&gart->iommu); remove_sysfs: iommu_device_sysfs_remove(&gart->iommu); +free_gart: + kfree(gart); return ERR_PTR(ret); } From patchwork Mon Sep 24 00:41:50 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 973808 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-tegra-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="DdwMsmrd"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 42JQXd2jVJz9sBZ for ; Mon, 24 Sep 2018 10:47:45 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727770AbeIXGrP (ORCPT ); Mon, 24 Sep 2018 02:47:15 -0400 Received: from mail-pl1-f194.google.com ([209.85.214.194]:33435 "EHLO mail-pl1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725742AbeIXGrP (ORCPT ); Mon, 24 Sep 2018 02:47:15 -0400 Received: by mail-pl1-f194.google.com with SMTP id b97-v6so8365091plb.0; Sun, 23 Sep 2018 17:47:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=GjyPpVgh8JPgBd4foNBHdpus9o2eboUImRoamRxidwU=; b=DdwMsmrdPo2mImFkM+pIOgT4eHJyfCOCc3dQqpZ5HXCp+WajAGUJYiI/Z9VjcfQoRF bYyTk7v6nEUmX5CXFgAj7Xnk4hC4KDn0HKGGNARaW1dJvHXcQHIHpKWfVW5fOfYkTptr xnEvYu4s616d2s+DUi8rLKG1GjV+i2SaOVeqbr+MZ4+680+P32GJEErXdDGi/+R8V0Kf zRTWNKMHuoEFVG/NK40fxYtkIPENS15y8tr7UMmQM/nPLyJWUuUmBhklZhrdGf8wt6rj vWpFQ8sdba1J7rBWLCHzi4w5kyNGChFYTyPMTUo4iqqJ0A/sV0w6D/YElq+7u0ylPdGf dAOg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=GjyPpVgh8JPgBd4foNBHdpus9o2eboUImRoamRxidwU=; b=jZbabWY6FsPkjArFjjqCaxtDXrh1zKOGapWEnujZc/7DsQWaT4+1iiL0LKHhbMwus4 GZFfP1VRVB2zRbGquUptrEqDkG1Sv6cu8NO4UbNCxy1zGuUWl53EfjF2OxxeXPT1d2PR QoLYNviYkNBWx4/uiA3GmktsnWvJGv09oztC9m/eAZ7LYo2XLmYYem7VQZIYSC0Qegsa DZx1x/Ti7MrBHplyVPHTXGLvZ875/f1BVrWvaEfF3dsyUJ0xVG0NgxvhkXCoWBkWAsxZ vvDSpJzER2NWh8kbAgoScJlc1YV39Fhvq/Yv6bmoqRSov0XZRuV7nU2JKybj/b/7sWEB KNLw== X-Gm-Message-State: ABuFfogB5WU0JePvJ6CVCKjNTSs0rTXtbq/Asv4GZt4MXyhnSdZ21/38 qpPKIawbORpTTPjPbJUeyCY= X-Google-Smtp-Source: ACcGV63pA+LdvVp0aBymEcQwTRRVszD2ZENhIA+tuesPYKPyudoQQuQdmqNTsTGK3bwYgPkdCMTKBg== X-Received: by 2002:a17:902:7109:: with SMTP id a9-v6mr4680072pll.310.1537750058576; Sun, 23 Sep 2018 17:47:38 -0700 (PDT) Received: from localhost.localdomain (109-252-91-213.nat.spd-mgts.ru. [109.252.91.213]) by smtp.gmail.com with ESMTPSA id 82-v6sm5121839pfr.115.2018.09.23.17.47.33 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 23 Sep 2018 17:47:38 -0700 (PDT) From: Dmitry Osipenko To: Thierry Reding , Jonathan Hunter , Joerg Roedel , Rob Herring , Robin Murphy Cc: iommu@lists.linux-foundation.org, devicetree@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 17/20] iommu/tegra: gart: Prepend error/debug messages with "GART:" Date: Mon, 24 Sep 2018 03:41:50 +0300 Message-Id: <20180924004153.8232-18-digetx@gmail.com> X-Mailer: git-send-email 2.19.0 In-Reply-To: <20180924004153.8232-1-digetx@gmail.com> References: <20180924004153.8232-1-digetx@gmail.com> MIME-Version: 1.0 Sender: linux-tegra-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org GART became a part of Memory Controller, hence now the drivers device is Memory Controller and not GART. As a result all printed messages are prepended with the "tegra-mc 7000f000.memory-controller:", so let's prepend GART's messages with "GART:" in order to differentiate them from the MC. Signed-off-by: Dmitry Osipenko --- drivers/iommu/tegra-gart.c | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/drivers/iommu/tegra-gart.c b/drivers/iommu/tegra-gart.c index d019ae8ecfc9..284cddf90888 100644 --- a/drivers/iommu/tegra-gart.c +++ b/drivers/iommu/tegra-gart.c @@ -96,7 +96,7 @@ static inline void gart_set_pte(struct gart_device *gart, writel(offs, gart->regs + GART_ENTRY_ADDR); writel(pte, gart->regs + GART_ENTRY_DATA); - dev_dbg(gart->dev, "%s %08lx:%08x\n", + dev_dbg(gart->dev, "GART: %s %08lx:%08x\n", pte ? "map" : "unmap", offs, pte & GART_PAGE_MASK); } @@ -134,7 +134,7 @@ static void gart_dump_table(struct gart_device *gart) pte = gart_read_pte(gart, iova); - dev_dbg(gart->dev, "%s %08lx:%08lx\n", + dev_dbg(gart->dev, "GART: %s %08lx:%08lx\n", (GART_ENTRY_PHYS_ADDR_VALID & pte) ? "v" : " ", iova, pte & GART_PAGE_MASK); } @@ -179,21 +179,22 @@ static int gart_iommu_attach_dev(struct iommu_domain *domain, spin_lock(&gart->client_lock); list_for_each_entry(c, &gart->client, list) { if (c->dev == dev) { - dev_err(gart->dev, - "%s is already attached\n", dev_name(dev)); + dev_err(gart->dev, "GART: %s is already attached\n", + dev_name(dev)); err = -EINVAL; goto fail; } } if (gart->active_domain && gart->active_domain != domain) { - dev_err(gart->dev, "Only one domain can be active at a time\n"); + dev_err(gart->dev, + "GART: Only one domain can be active at a time\n"); err = -EINVAL; goto fail; } gart->active_domain = domain; list_add(&client->list, &gart->client); spin_unlock(&gart->client_lock); - dev_dbg(gart->dev, "Attached %s\n", dev_name(dev)); + dev_dbg(gart->dev, "GART: Attached %s\n", dev_name(dev)); return 0; fail: @@ -215,12 +216,14 @@ static void __gart_iommu_detach_dev(struct iommu_domain *domain, kfree(c); if (list_empty(&gart->client)) gart->active_domain = NULL; - dev_dbg(gart->dev, "Detached %s\n", dev_name(dev)); + dev_dbg(gart->dev, "GART: Detached %s\n", + dev_name(dev)); return; } } - dev_err(gart->dev, "Couldn't find %s to detach\n", dev_name(dev)); + dev_err(gart->dev, "GART: Couldn't find %s to detach\n", + dev_name(dev)); } static void gart_iommu_detach_dev(struct iommu_domain *domain, @@ -293,7 +296,7 @@ static int gart_iommu_map(struct iommu_domain *domain, unsigned long iova, spin_lock_irqsave(&gart->pte_lock, flags); pfn = __phys_to_pfn(pa); if (!pfn_valid(pfn)) { - dev_err(gart->dev, "Invalid page: %pa\n", &pa); + dev_err(gart->dev, "GART: Invalid page: %pa\n", &pa); spin_unlock_irqrestore(&gart->pte_lock, flags); return -EINVAL; } @@ -301,7 +304,7 @@ static int gart_iommu_map(struct iommu_domain *domain, unsigned long iova, pte = gart_read_pte(gart, iova); if (pte & GART_ENTRY_PHYS_ADDR_VALID) { spin_unlock_irqrestore(&gart->pte_lock, flags); - dev_err(gart->dev, "Page entry is in-use\n"); + dev_err(gart->dev, "GART: Page entry is in-use\n"); return -EBUSY; } } @@ -344,7 +347,7 @@ static phys_addr_t gart_iommu_iova_to_phys(struct iommu_domain *domain, pa = (pte & GART_PAGE_MASK); if (!pfn_valid(__phys_to_pfn(pa))) { - dev_err(gart->dev, "No entry for %08llx:%pa\n", + dev_err(gart->dev, "GART: No entry for %08llx:%pa\n", (unsigned long long)iova, &pa); gart_dump_table(gart); return -EINVAL; @@ -455,19 +458,17 @@ struct gart_device *tegra_gart_probe(struct device *dev, res_remap = platform_get_resource(to_platform_device(dev), IORESOURCE_MEM, 1); if (!res_remap) { - dev_err(dev, "GART memory aperture expected\n"); + dev_err(dev, "GART: Memory aperture resource unavailable\n"); return ERR_PTR(-ENXIO); } gart = kzalloc(sizeof(*gart), GFP_KERNEL); - if (!gart) { - dev_err(dev, "failed to allocate gart_device\n"); + if (!gart) return ERR_PTR(-ENOMEM); - } ret = iommu_device_sysfs_add(&gart->iommu, dev, NULL, "gart"); if (ret) { - dev_err(dev, "Failed to register IOMMU in sysfs\n"); + dev_err(dev, "GART: Failed to register IOMMU sysfs\n"); goto free_gart; } @@ -476,7 +477,7 @@ struct gart_device *tegra_gart_probe(struct device *dev, ret = iommu_device_register(&gart->iommu); if (ret) { - dev_err(dev, "Failed to register IOMMU\n"); + dev_err(dev, "GART: Failed to register IOMMU\n"); goto remove_sysfs; } @@ -491,7 +492,6 @@ struct gart_device *tegra_gart_probe(struct device *dev, gart->savedata = vmalloc(array_size(sizeof(u32), gart->page_count)); if (!gart->savedata) { - dev_err(dev, "failed to allocate context save area\n"); ret = -ENOMEM; goto unregister_iommu; } From patchwork Mon Sep 24 00:41:51 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 973809 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-tegra-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="L2ASgkeH"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 42JQXl1qy4z9s4s for ; Mon, 24 Sep 2018 10:47:51 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727832AbeIXGrW (ORCPT ); Mon, 24 Sep 2018 02:47:22 -0400 Received: from mail-pg1-f193.google.com ([209.85.215.193]:38402 "EHLO mail-pg1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725742AbeIXGrV (ORCPT ); Mon, 24 Sep 2018 02:47:21 -0400 Received: by mail-pg1-f193.google.com with SMTP id r77-v6so3288018pgr.5; Sun, 23 Sep 2018 17:47:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=GNFyc2oqPrDinMLJ7sRVVOcDAa0uc5ygovDje1DARpA=; b=L2ASgkeHbXUVXLNvx2BTumGucvec9M3oCi/94OTlG6ZBE9x8Ui3Zmkv/YXKgT2zrYi TNbxxib8aSJDoccSzN8h7jLkVzg6/AUTzc4BJoFeHvJs0CoSByExqqF7tXkFI5/0uoub 4/eiYJ7WIkmkOPAYTIUZqGOtVmxvpfJaR/hgN73Ngn9cD3GyxKQBkEhKMxD9+piVUySb oUgjJcSWl9hwLr8mHcwk0ADHHyWzZhcoIiQg6Zw9rcBMYiMYj5zNUhE+1V8NLYAx8T25 GQW1B9wWZ2+0tktcQcDRWLZ+lpyq0zWNK1cKHdcJkh9Oum6K4tf/bY32bU3MiJBcneVr dcOQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=GNFyc2oqPrDinMLJ7sRVVOcDAa0uc5ygovDje1DARpA=; b=pygrEMxG99wHyK2wKKGQkLNgzem/9ypG3j0MeQ+mwui25X6E3jjorZH4qkYuQSBDI4 SmA7UWA0YHIx9Xci4/PSFg1LESKctPBoQxfbvZWl6w0pDGGMACDt0Qkh/GvornuND7jN eS3uOOauvkXFhdOuM0sCMxJKHUkp9gwJMQIMer/FsA5Nqupj96K3uaL/KY8YKET6ZHZd otY6aLF+ZwAFt5R58cII4YycY4AMHUQwKDpD/oatpn48qyC24A1CLlo7Q2VE/RNTrrFn I838XpKmTultnlXSA4fOfg6BSrTRYh68vJcLBopxU/lWV2AKK6qAE3F8KZsZ0HgcUjot Eppw== X-Gm-Message-State: ABuFfohKq3i781vVVm3cYXjDQWaqfX5IwUvdcrQAbKga2NvP1mFoQaku GM2CKM/oqNUSciVPaQvUeic= X-Google-Smtp-Source: ACcGV620eGTU7vKcubt/6jFsduT386tOcDoqVWJt31hEl2SdnBC98fBYs7LCl4HS6EnFk5HEq6PrMw== X-Received: by 2002:a63:a54f:: with SMTP id r15-v6mr7335727pgu.336.1537750064482; Sun, 23 Sep 2018 17:47:44 -0700 (PDT) Received: from localhost.localdomain (109-252-91-213.nat.spd-mgts.ru. [109.252.91.213]) by smtp.gmail.com with ESMTPSA id 82-v6sm5121839pfr.115.2018.09.23.17.47.39 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 23 Sep 2018 17:47:44 -0700 (PDT) From: Dmitry Osipenko To: Thierry Reding , Jonathan Hunter , Joerg Roedel , Rob Herring , Robin Murphy Cc: iommu@lists.linux-foundation.org, devicetree@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 18/20] iommu/tegra: gart: Don't detach devices from inactive domains Date: Mon, 24 Sep 2018 03:41:51 +0300 Message-Id: <20180924004153.8232-19-digetx@gmail.com> X-Mailer: git-send-email 2.19.0 In-Reply-To: <20180924004153.8232-1-digetx@gmail.com> References: <20180924004153.8232-1-digetx@gmail.com> MIME-Version: 1.0 Sender: linux-tegra-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org There could be unlimited number of allocated domains, but only one domain can be active at a time. Hence devices must be detached only from the active domain. Signed-off-by: Dmitry Osipenko --- drivers/iommu/tegra-gart.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/drivers/iommu/tegra-gart.c b/drivers/iommu/tegra-gart.c index 284cddf90888..306e9644a676 100644 --- a/drivers/iommu/tegra-gart.c +++ b/drivers/iommu/tegra-gart.c @@ -167,7 +167,7 @@ static int gart_iommu_attach_dev(struct iommu_domain *domain, struct device *dev) { struct gart_domain *gart_domain = to_gart_domain(domain); - struct gart_device *gart = gart_domain->gart; + struct gart_device *gart = gart_handle; struct gart_client *client, *c; int err = 0; @@ -192,6 +192,7 @@ static int gart_iommu_attach_dev(struct iommu_domain *domain, goto fail; } gart->active_domain = domain; + gart_domain->gart = gart; list_add(&client->list, &gart->client); spin_unlock(&gart->client_lock); dev_dbg(gart->dev, "GART: Attached %s\n", dev_name(dev)); @@ -214,8 +215,10 @@ static void __gart_iommu_detach_dev(struct iommu_domain *domain, if (c->dev == dev) { list_del(&c->list); kfree(c); - if (list_empty(&gart->client)) + if (list_empty(&gart->client)) { gart->active_domain = NULL; + gart_domain->gart = NULL; + } dev_dbg(gart->dev, "GART: Detached %s\n", dev_name(dev)); return; @@ -253,7 +256,6 @@ static struct iommu_domain *gart_iommu_domain_alloc(unsigned type) if (!gart_domain) return NULL; - gart_domain->gart = gart; gart_domain->domain.geometry.aperture_start = gart->iovmm_base; gart_domain->domain.geometry.aperture_end = gart->iovmm_base + gart->page_count * GART_PAGE_SIZE - 1; From patchwork Mon Sep 24 00:41:52 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 973810 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-tegra-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="lBD6tasj"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 42JQXt1F2tz9s3C for ; Mon, 24 Sep 2018 10:47:58 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727873AbeIXGr2 (ORCPT ); Mon, 24 Sep 2018 02:47:28 -0400 Received: from mail-pg1-f193.google.com ([209.85.215.193]:35567 "EHLO mail-pg1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725742AbeIXGr1 (ORCPT ); Mon, 24 Sep 2018 02:47:27 -0400 Received: by mail-pg1-f193.google.com with SMTP id v133-v6so885923pgb.2; Sun, 23 Sep 2018 17:47:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=d2SGkbZ8YT7pMwS2UGx9FqS5wN8kjnSBETrmXZxFwEQ=; b=lBD6tasjuBQmCufXPoHGehNbdZUhuHhbYrzp3VDMc2FbCIIYHvmqO6hI3RKnGkptEo 9TTNDg78kxmmPxMo3H4JpnBbVgUP6V83TytvzMGzpq9OAu99LpHWJm6dJoyPy24ZGHnD TOyC7lA+LzNQ5lAi2B6GyPdzuVHfbTUOBlsyFNjzwA5X88z7y4GBfSqNzUdLGyVXlXU1 g+FFA/TuA6pwRkDJxcGfTtRxI8QKgtq9LcAI9wRnqRQlFN3/dKqyXy1iy2d6AdT3PO6e EOOlC+lZ8RJhqGFKEe3i8rHZ8cTgoBSYNv66XPyxsUdNmfUvsMZE28ZBjBjl1W1Pb6pS 6pyA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=d2SGkbZ8YT7pMwS2UGx9FqS5wN8kjnSBETrmXZxFwEQ=; b=G3n/5Ji0L9cOykSOwFGt/dVzOeCEFVPNOZMGmYoMNeOPl4zuxr3tcAofhw1YtvieIS KXU3C1W378+NAPx45uFdX3oXRU2kY6jKZINDOdxQntf+78u/8ZMPct2bbt3lyB3ZOClM qvgGF1Ri58WVfqNlqMgARvFDmdFUTwheIoJiN4T9+ZPZE5fJ1XRStI5WNDcSwrManQ8H pUNl84+lFl+0rAsEf5N/tUmFniTc7B4zVMAXm2KP+XCpRoHCAXm7shdI5CSx6lyAycxs XtXt5kQP1hb63k73r9J4yMCIf5qgCOETiA3FtxMYaMSfbxwkC+ukIN2FhWs1DcCWtk5Q 8oxg== X-Gm-Message-State: APzg51BKsr8NlPT5SAUefsXXeCeiNBRAhIA+xmsZrY4efGiSAFR6qn6/ mBPgCUev1Yh5WYBVPdByc3A= X-Google-Smtp-Source: ANB0VdbC5oSxDcekj9tyxiOWS8awGUWppXsqUz+lB/CcRjYYOv52UY9mDVo+tY7j7OotZ/m3svta4Q== X-Received: by 2002:aa7:881a:: with SMTP id c26-v6mr8010533pfo.82.1537750070484; Sun, 23 Sep 2018 17:47:50 -0700 (PDT) Received: from localhost.localdomain (109-252-91-213.nat.spd-mgts.ru. [109.252.91.213]) by smtp.gmail.com with ESMTPSA id 82-v6sm5121839pfr.115.2018.09.23.17.47.44 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 23 Sep 2018 17:47:49 -0700 (PDT) From: Dmitry Osipenko To: Thierry Reding , Jonathan Hunter , Joerg Roedel , Rob Herring , Robin Murphy Cc: iommu@lists.linux-foundation.org, devicetree@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 19/20] iommu/tegra: gart: Simplify clients-tracking code Date: Mon, 24 Sep 2018 03:41:52 +0300 Message-Id: <20180924004153.8232-20-digetx@gmail.com> X-Mailer: git-send-email 2.19.0 In-Reply-To: <20180924004153.8232-1-digetx@gmail.com> References: <20180924004153.8232-1-digetx@gmail.com> MIME-Version: 1.0 Sender: linux-tegra-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org GART is a simple IOMMU provider that has single address space. There is no need to setup global clients list and manage it for tracking of the active domain, hence lot's of code could be safely removed and replaced with a simpler alternative. Signed-off-by: Dmitry Osipenko --- drivers/iommu/tegra-gart.c | 157 +++++++++---------------------------- 1 file changed, 39 insertions(+), 118 deletions(-) diff --git a/drivers/iommu/tegra-gart.c b/drivers/iommu/tegra-gart.c index 306e9644a676..7182445c3b76 100644 --- a/drivers/iommu/tegra-gart.c +++ b/drivers/iommu/tegra-gart.c @@ -19,7 +19,6 @@ #include #include -#include #include #include #include @@ -42,30 +41,20 @@ #define GART_PAGE_MASK \ (~(GART_PAGE_SIZE - 1) & ~GART_ENTRY_PHYS_ADDR_VALID) -struct gart_client { - struct device *dev; - struct list_head list; -}; - struct gart_device { void __iomem *regs; u32 *savedata; u32 page_count; /* total remappable size */ dma_addr_t iovmm_base; /* offset to vmm_area */ spinlock_t pte_lock; /* for pagetable */ - struct list_head client; - spinlock_t client_lock; /* for client list */ + spinlock_t dom_lock; /* for active domain */ + unsigned int active_devices; /* number of active devices */ struct iommu_domain *active_domain; /* current active domain */ struct device *dev; struct iommu_device iommu; /* IOMMU Core handle */ }; -struct gart_domain { - struct iommu_domain domain; /* generic domain handle */ - struct gart_device *gart; /* link to gart device */ -}; - static struct gart_device *gart_handle; /* unique for a system */ static bool gart_debug; @@ -73,11 +62,6 @@ static bool gart_debug; #define GART_PTE(_pfn) \ (GART_ENTRY_PHYS_ADDR_VALID | ((_pfn) << PAGE_SHIFT)) -static struct gart_domain *to_gart_domain(struct iommu_domain *dom) -{ - return container_of(dom, struct gart_domain, domain); -} - /* * Any interaction between any block on PPSB and a block on APB or AHB * must have these read-back to ensure the APB/AHB bus transaction is @@ -166,128 +150,69 @@ static inline bool gart_iova_range_valid(struct gart_device *gart, static int gart_iommu_attach_dev(struct iommu_domain *domain, struct device *dev) { - struct gart_domain *gart_domain = to_gart_domain(domain); struct gart_device *gart = gart_handle; - struct gart_client *client, *c; - int err = 0; - - client = kzalloc(sizeof(*c), GFP_KERNEL); - if (!client) - return -ENOMEM; - client->dev = dev; - - spin_lock(&gart->client_lock); - list_for_each_entry(c, &gart->client, list) { - if (c->dev == dev) { - dev_err(gart->dev, "GART: %s is already attached\n", - dev_name(dev)); - err = -EINVAL; - goto fail; - } - } - if (gart->active_domain && gart->active_domain != domain) { - dev_err(gart->dev, - "GART: Only one domain can be active at a time\n"); - err = -EINVAL; - goto fail; - } - gart->active_domain = domain; - gart_domain->gart = gart; - list_add(&client->list, &gart->client); - spin_unlock(&gart->client_lock); - dev_dbg(gart->dev, "GART: Attached %s\n", dev_name(dev)); - return 0; + int ret = 0; -fail: - kfree(client); - spin_unlock(&gart->client_lock); - return err; -} + spin_lock(&gart->dom_lock); -static void __gart_iommu_detach_dev(struct iommu_domain *domain, - struct device *dev) -{ - struct gart_domain *gart_domain = to_gart_domain(domain); - struct gart_device *gart = gart_domain->gart; - struct gart_client *c; - - list_for_each_entry(c, &gart->client, list) { - if (c->dev == dev) { - list_del(&c->list); - kfree(c); - if (list_empty(&gart->client)) { - gart->active_domain = NULL; - gart_domain->gart = NULL; - } - dev_dbg(gart->dev, "GART: Detached %s\n", - dev_name(dev)); - return; - } + if (gart->active_domain && gart->active_domain != domain) { + ret = -EBUSY; + } else if (dev->archdata.iommu != domain) { + dev->archdata.iommu = domain; + gart->active_domain = domain; + gart->active_devices++; } - dev_err(gart->dev, "GART: Couldn't find %s to detach\n", - dev_name(dev)); + spin_unlock(&gart->dom_lock); + + return ret; } static void gart_iommu_detach_dev(struct iommu_domain *domain, struct device *dev) { - struct gart_domain *gart_domain = to_gart_domain(domain); - struct gart_device *gart = gart_domain->gart; + struct gart_device *gart = gart_handle; + + spin_lock(&gart->dom_lock); - spin_lock(&gart->client_lock); - __gart_iommu_detach_dev(domain, dev); - spin_unlock(&gart->client_lock); + if (dev->archdata.iommu == domain) { + dev->archdata.iommu = NULL; + + if (--gart->active_devices == 0) + gart->active_domain = NULL; + } + + spin_unlock(&gart->dom_lock); } static struct iommu_domain *gart_iommu_domain_alloc(unsigned type) { - struct gart_domain *gart_domain; - struct gart_device *gart; + struct gart_device *gart = gart_handle; + struct iommu_domain *domain; if (type != IOMMU_DOMAIN_UNMANAGED) return NULL; - gart = gart_handle; - if (!gart) - return NULL; - - gart_domain = kzalloc(sizeof(*gart_domain), GFP_KERNEL); - if (!gart_domain) - return NULL; - - gart_domain->domain.geometry.aperture_start = gart->iovmm_base; - gart_domain->domain.geometry.aperture_end = gart->iovmm_base + + domain = kzalloc(sizeof(*domain), GFP_KERNEL); + if (domain) { + domain->geometry.aperture_start = gart->iovmm_base; + domain->geometry.aperture_end = gart->iovmm_base + gart->page_count * GART_PAGE_SIZE - 1; - gart_domain->domain.geometry.force_aperture = true; + domain->geometry.force_aperture = true; + } - return &gart_domain->domain; + return domain; } static void gart_iommu_domain_free(struct iommu_domain *domain) { - struct gart_domain *gart_domain = to_gart_domain(domain); - struct gart_device *gart = gart_domain->gart; - - if (gart) { - spin_lock(&gart->client_lock); - if (!list_empty(&gart->client)) { - struct gart_client *c, *tmp; - - list_for_each_entry_safe(c, tmp, &gart->client, list) - __gart_iommu_detach_dev(domain, c->dev); - } - spin_unlock(&gart->client_lock); - } - - kfree(gart_domain); + kfree(domain); } static int gart_iommu_map(struct iommu_domain *domain, unsigned long iova, phys_addr_t pa, size_t bytes, int prot) { - struct gart_domain *gart_domain = to_gart_domain(domain); - struct gart_device *gart = gart_domain->gart; + struct gart_device *gart = gart_handle; unsigned long flags; unsigned long pfn; unsigned long pte; @@ -318,8 +243,7 @@ static int gart_iommu_map(struct iommu_domain *domain, unsigned long iova, static size_t gart_iommu_unmap(struct iommu_domain *domain, unsigned long iova, size_t bytes) { - struct gart_domain *gart_domain = to_gart_domain(domain); - struct gart_device *gart = gart_domain->gart; + struct gart_device *gart = gart_handle; unsigned long flags; if (!gart_iova_range_valid(gart, iova, bytes)) @@ -334,8 +258,7 @@ static size_t gart_iommu_unmap(struct iommu_domain *domain, unsigned long iova, static phys_addr_t gart_iommu_iova_to_phys(struct iommu_domain *domain, dma_addr_t iova) { - struct gart_domain *gart_domain = to_gart_domain(domain); - struct gart_device *gart = gart_domain->gart; + struct gart_device *gart = gart_handle; unsigned long pte; phys_addr_t pa; unsigned long flags; @@ -394,8 +317,7 @@ static int gart_iommu_of_xlate(struct device *dev, static void gart_iommu_sync(struct iommu_domain *domain) { - struct gart_domain *gart_domain = to_gart_domain(domain); - struct gart_device *gart = gart_domain->gart; + struct gart_device *gart = gart_handle; FLUSH_GART_REGS(gart); } @@ -486,8 +408,7 @@ struct gart_device *tegra_gart_probe(struct device *dev, gart->dev = dev; gart_regs = mc->regs + GART_REG_BASE; spin_lock_init(&gart->pte_lock); - spin_lock_init(&gart->client_lock); - INIT_LIST_HEAD(&gart->client); + spin_lock_init(&gart->dom_lock); gart->regs = gart_regs; gart->iovmm_base = (dma_addr_t)res_remap->start; gart->page_count = (resource_size(res_remap) >> GART_PAGE_SHIFT); From patchwork Mon Sep 24 00:41:53 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 973811 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-tegra-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="ZMnNXAUr"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 42JQXv62CCz9sB4 for ; Mon, 24 Sep 2018 10:47:59 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727052AbeIXGre (ORCPT ); Mon, 24 Sep 2018 02:47:34 -0400 Received: from mail-pg1-f195.google.com ([209.85.215.195]:46165 "EHLO mail-pg1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725742AbeIXGre (ORCPT ); Mon, 24 Sep 2018 02:47:34 -0400 Received: by mail-pg1-f195.google.com with SMTP id b129-v6so8396431pga.13; Sun, 23 Sep 2018 17:47:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=QB9iNKSsdzM8PtTjPBfA13KNVYjzka54By1g/98TA/I=; b=ZMnNXAUrBdSI/UY03ZgIPPjED4I/7NubPug5WlL0mQrlpoB8s0Pw6Gi0hmtO0jIXo7 viNRDDUlTi1XSqkCA4Rm5jSK7mi7sjD29L85t2QNHSgcRSkRXDYmdKc7Wfl2F1k3q0EH +pmdGcT+Q3I7nX6tRgR7AVZFsIxk2AcDraRrxd3qYHOScJ+cjTz8XoYj+5YqnefM0phj SS5suyvSVPhx5cJZyiSKi+5Iqd1X8bLKhB9KjTuZauQsei8QiJVB4f7c76FfG6hMxrW/ Xxu3EUIZCaJTR3N+dLcFPnTiy+tCR9Tq4P65zOR/JwGd4onwL0I1qYrFuKElQM5jArfQ d4XQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=QB9iNKSsdzM8PtTjPBfA13KNVYjzka54By1g/98TA/I=; b=pJ+QVF+4pleNO0GG6wJiGL/8rVc5zPEfzCt/FFmD/hPCU1SxCJez2yDjwkIDHbbDE1 ENC2C21p/Oe/NZeey50UTyLcBfHJcK3Jk9kpCatard9gnIGHNIcDtLIaMk+dFVwZiaV/ s6pBFHUeEsttbKMV16Cwlq6DR9aCFGOf4TcNIg6SHAEqDd+72tcIvklsvQCRksqZDp8A 6AinWnNE+PyvD19hMu5tmRF9xzsOhpuc9XxTJ4Rbk7m6Rsw6dNdsdqQ7TYwOC/rHBPO/ BHjDn7dfuFBeOf+VCtCmmQHGmA4bpdYGjRqEtyLSc2RdV+NxkrUd6jRZVXZa3oJQqF2R CvOg== X-Gm-Message-State: ABuFfohCUsjC42J4ZMYFYatUqa4lC5Hs/4O4kyGaSOmeMUPGuw+oiV4v r6Uhff4fAHuZXg5nr0r6KNI= X-Google-Smtp-Source: ACcGV61XyWp8yaHT0xtAFH4JUv1ZxDPZ0ckEIqFYxhpNmLtZsBxpA9zviDAZ4F8DahM+Hb/7OvOhqw== X-Received: by 2002:a63:d109:: with SMTP id k9-v6mr7481503pgg.49.1537750076686; Sun, 23 Sep 2018 17:47:56 -0700 (PDT) Received: from localhost.localdomain (109-252-91-213.nat.spd-mgts.ru. [109.252.91.213]) by smtp.gmail.com with ESMTPSA id 82-v6sm5121839pfr.115.2018.09.23.17.47.50 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 23 Sep 2018 17:47:56 -0700 (PDT) From: Dmitry Osipenko To: Thierry Reding , Jonathan Hunter , Joerg Roedel , Rob Herring , Robin Murphy Cc: iommu@lists.linux-foundation.org, devicetree@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 20/20] iommu/tegra: gart: Perform code refactoring Date: Mon, 24 Sep 2018 03:41:53 +0300 Message-Id: <20180924004153.8232-21-digetx@gmail.com> X-Mailer: git-send-email 2.19.0 In-Reply-To: <20180924004153.8232-1-digetx@gmail.com> References: <20180924004153.8232-1-digetx@gmail.com> MIME-Version: 1.0 Sender: linux-tegra-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org Perform a major code cleanup to make it more readable and as a result easier to maintain. I removed some redundant safety-checks in the code and some debug code that isn't actually very useful for debugging, like enormous pagetable dump on each fault. The majority of the changes are code reshuffling, variables/whitespaces clean up and removal of debug messages that duplicate messages of the IOMMU-core. Signed-off-by: Dmitry Osipenko --- drivers/iommu/tegra-gart.c | 215 +++++++++++++++---------------------- 1 file changed, 84 insertions(+), 131 deletions(-) diff --git a/drivers/iommu/tegra-gart.c b/drivers/iommu/tegra-gart.c index 7182445c3b76..a36d0c568536 100644 --- a/drivers/iommu/tegra-gart.c +++ b/drivers/iommu/tegra-gart.c @@ -34,63 +34,56 @@ #define GART_CONFIG (0x24 - GART_REG_BASE) #define GART_ENTRY_ADDR (0x28 - GART_REG_BASE) #define GART_ENTRY_DATA (0x2c - GART_REG_BASE) -#define GART_ENTRY_PHYS_ADDR_VALID (1 << 31) + +#define GART_ENTRY_PHYS_ADDR_VALID BIT(31) #define GART_PAGE_SHIFT 12 #define GART_PAGE_SIZE (1 << GART_PAGE_SHIFT) -#define GART_PAGE_MASK \ - (~(GART_PAGE_SIZE - 1) & ~GART_ENTRY_PHYS_ADDR_VALID) +#define GART_PAGE_MASK GENMASK(30, GART_PAGE_SHIFT) struct gart_device { void __iomem *regs; u32 *savedata; - u32 page_count; /* total remappable size */ - dma_addr_t iovmm_base; /* offset to vmm_area */ + unsigned long iovmm_base; /* offset to vmm_area start */ + unsigned long iovmm_end; /* offset to vmm_area end */ spinlock_t pte_lock; /* for pagetable */ spinlock_t dom_lock; /* for active domain */ unsigned int active_devices; /* number of active devices */ struct iommu_domain *active_domain; /* current active domain */ - struct device *dev; - struct iommu_device iommu; /* IOMMU Core handle */ + struct device *dev; }; static struct gart_device *gart_handle; /* unique for a system */ static bool gart_debug; -#define GART_PTE(_pfn) \ - (GART_ENTRY_PHYS_ADDR_VALID | ((_pfn) << PAGE_SHIFT)) - /* * Any interaction between any block on PPSB and a block on APB or AHB * must have these read-back to ensure the APB/AHB bus transaction is * complete before initiating activity on the PPSB block. */ -#define FLUSH_GART_REGS(gart) ((void)readl((gart)->regs + GART_CONFIG)) +#define FLUSH_GART_REGS(gart) readl_relaxed((gart)->regs + GART_CONFIG) #define for_each_gart_pte(gart, iova) \ for (iova = gart->iovmm_base; \ - iova < gart->iovmm_base + GART_PAGE_SIZE * gart->page_count; \ + iova < gart->iovmm_end; \ iova += GART_PAGE_SIZE) static inline void gart_set_pte(struct gart_device *gart, - unsigned long offs, u32 pte) + unsigned long iova, phys_addr_t pte) { - writel(offs, gart->regs + GART_ENTRY_ADDR); - writel(pte, gart->regs + GART_ENTRY_DATA); - - dev_dbg(gart->dev, "GART: %s %08lx:%08x\n", - pte ? "map" : "unmap", offs, pte & GART_PAGE_MASK); + writel_relaxed(iova, gart->regs + GART_ENTRY_ADDR); + writel_relaxed(pte, gart->regs + GART_ENTRY_DATA); } static inline unsigned long gart_read_pte(struct gart_device *gart, - unsigned long offs) + unsigned long iova) { unsigned long pte; - writel(offs, gart->regs + GART_ENTRY_ADDR); - pte = readl(gart->regs + GART_ENTRY_DATA); + writel_relaxed(iova, gart->regs + GART_ENTRY_ADDR); + pte = readl_relaxed(gart->regs + GART_ENTRY_DATA); return pte; } @@ -102,49 +95,20 @@ static void do_gart_setup(struct gart_device *gart, const u32 *data) for_each_gart_pte(gart, iova) gart_set_pte(gart, iova, data ? *(data++) : 0); - writel(1, gart->regs + GART_CONFIG); + writel_relaxed(1, gart->regs + GART_CONFIG); FLUSH_GART_REGS(gart); } -#ifdef DEBUG -static void gart_dump_table(struct gart_device *gart) +static inline bool gart_iova_range_invalid(struct gart_device *gart, + unsigned long iova, size_t bytes) { - unsigned long iova; - unsigned long flags; - - spin_lock_irqsave(&gart->pte_lock, flags); - for_each_gart_pte(gart, iova) { - unsigned long pte; - - pte = gart_read_pte(gart, iova); - - dev_dbg(gart->dev, "GART: %s %08lx:%08lx\n", - (GART_ENTRY_PHYS_ADDR_VALID & pte) ? "v" : " ", - iova, pte & GART_PAGE_MASK); - } - spin_unlock_irqrestore(&gart->pte_lock, flags); + return unlikely(iova < gart->iovmm_base || bytes != GART_PAGE_SIZE || + iova + bytes > gart->iovmm_end); } -#else -static inline void gart_dump_table(struct gart_device *gart) -{ -} -#endif -static inline bool gart_iova_range_valid(struct gart_device *gart, - unsigned long iova, size_t bytes) +static inline bool gart_pte_valid(struct gart_device *gart, unsigned long iova) { - unsigned long iova_start, iova_end, gart_start, gart_end; - - iova_start = iova; - iova_end = iova_start + bytes - 1; - gart_start = gart->iovmm_base; - gart_end = gart_start + gart->page_count * GART_PAGE_SIZE - 1; - - if (iova_start < gart_start) - return false; - if (iova_end > gart_end) - return false; - return true; + return !!(gart_read_pte(gart, iova) & GART_ENTRY_PHYS_ADDR_VALID); } static int gart_iommu_attach_dev(struct iommu_domain *domain, @@ -187,7 +151,6 @@ static void gart_iommu_detach_dev(struct iommu_domain *domain, static struct iommu_domain *gart_iommu_domain_alloc(unsigned type) { - struct gart_device *gart = gart_handle; struct iommu_domain *domain; if (type != IOMMU_DOMAIN_UNMANAGED) @@ -195,9 +158,8 @@ static struct iommu_domain *gart_iommu_domain_alloc(unsigned type) domain = kzalloc(sizeof(*domain), GFP_KERNEL); if (domain) { - domain->geometry.aperture_start = gart->iovmm_base; - domain->geometry.aperture_end = gart->iovmm_base + - gart->page_count * GART_PAGE_SIZE - 1; + domain->geometry.aperture_start = gart_handle->iovmm_base; + domain->geometry.aperture_end = gart_handle->iovmm_end - 1; domain->geometry.force_aperture = true; } @@ -209,34 +171,44 @@ static void gart_iommu_domain_free(struct iommu_domain *domain) kfree(domain); } +static int __gart_iommu_map(struct gart_device *gart, unsigned long iova, + phys_addr_t pa) +{ + if (unlikely(gart_debug && gart_pte_valid(gart, iova))) { + dev_WARN(gart->dev, "GART: Page entry is in-use\n"); + return -EINVAL; + } + + gart_set_pte(gart, iova, GART_ENTRY_PHYS_ADDR_VALID | pa); + + return 0; +} + static int gart_iommu_map(struct iommu_domain *domain, unsigned long iova, phys_addr_t pa, size_t bytes, int prot) { struct gart_device *gart = gart_handle; - unsigned long flags; - unsigned long pfn; - unsigned long pte; + int ret; - if (!gart_iova_range_valid(gart, iova, bytes)) + if (gart_iova_range_invalid(gart, iova, bytes)) return -EINVAL; - spin_lock_irqsave(&gart->pte_lock, flags); - pfn = __phys_to_pfn(pa); - if (!pfn_valid(pfn)) { - dev_err(gart->dev, "GART: Invalid page: %pa\n", &pa); - spin_unlock_irqrestore(&gart->pte_lock, flags); + spin_lock(&gart->pte_lock); + ret = __gart_iommu_map(gart, iova, pa); + spin_unlock(&gart->pte_lock); + + return ret; +} + +static int __gart_iommu_unmap(struct gart_device *gart, unsigned long iova) +{ + if (unlikely(gart_debug && !gart_pte_valid(gart, iova))) { + dev_WARN(gart->dev, "GART: Page entry is invalid\n"); return -EINVAL; } - if (gart_debug) { - pte = gart_read_pte(gart, iova); - if (pte & GART_ENTRY_PHYS_ADDR_VALID) { - spin_unlock_irqrestore(&gart->pte_lock, flags); - dev_err(gart->dev, "GART: Page entry is in-use\n"); - return -EBUSY; - } - } - gart_set_pte(gart, iova, GART_PTE(pfn)); - spin_unlock_irqrestore(&gart->pte_lock, flags); + + gart_set_pte(gart, iova, 0); + return 0; } @@ -244,15 +216,16 @@ static size_t gart_iommu_unmap(struct iommu_domain *domain, unsigned long iova, size_t bytes) { struct gart_device *gart = gart_handle; - unsigned long flags; + int err; - if (!gart_iova_range_valid(gart, iova, bytes)) + if (gart_iova_range_invalid(gart, iova, bytes)) return 0; - spin_lock_irqsave(&gart->pte_lock, flags); - gart_set_pte(gart, iova, 0); - spin_unlock_irqrestore(&gart->pte_lock, flags); - return bytes; + spin_lock(&gart->pte_lock); + err = __gart_iommu_unmap(gart, iova); + spin_unlock(&gart->pte_lock); + + return err ? 0 : bytes; } static phys_addr_t gart_iommu_iova_to_phys(struct iommu_domain *domain, @@ -260,24 +233,15 @@ static phys_addr_t gart_iommu_iova_to_phys(struct iommu_domain *domain, { struct gart_device *gart = gart_handle; unsigned long pte; - phys_addr_t pa; - unsigned long flags; - if (!gart_iova_range_valid(gart, iova, 0)) + if (gart_iova_range_invalid(gart, iova, SZ_4K)) return -EINVAL; - spin_lock_irqsave(&gart->pte_lock, flags); + spin_lock(&gart->pte_lock); pte = gart_read_pte(gart, iova); - spin_unlock_irqrestore(&gart->pte_lock, flags); + spin_unlock(&gart->pte_lock); - pa = (pte & GART_PAGE_MASK); - if (!pfn_valid(__phys_to_pfn(pa))) { - dev_err(gart->dev, "GART: No entry for %08llx:%pa\n", - (unsigned long long)iova, &pa); - gart_dump_table(gart); - return -EINVAL; - } - return pa; + return pte & GART_PAGE_MASK; } static bool gart_iommu_capable(enum iommu_cap cap) @@ -342,24 +306,19 @@ static const struct iommu_ops gart_iommu_ops = { int tegra_gart_suspend(struct gart_device *gart) { - unsigned long iova; u32 *data = gart->savedata; - unsigned long flags; + unsigned long iova; - spin_lock_irqsave(&gart->pte_lock, flags); for_each_gart_pte(gart, iova) *(data++) = gart_read_pte(gart, iova); - spin_unlock_irqrestore(&gart->pte_lock, flags); + return 0; } int tegra_gart_resume(struct gart_device *gart) { - unsigned long flags; - - spin_lock_irqsave(&gart->pte_lock, flags); do_gart_setup(gart, gart->savedata); - spin_unlock_irqrestore(&gart->pte_lock, flags); + return 0; } @@ -368,8 +327,7 @@ struct gart_device *tegra_gart_probe(struct device *dev, struct tegra_mc *mc) { struct gart_device *gart; - struct resource *res_remap; - void __iomem *gart_regs; + struct resource *res; int ret; BUILD_BUG_ON(PAGE_SHIFT != GART_PAGE_SHIFT); @@ -379,9 +337,8 @@ struct gart_device *tegra_gart_probe(struct device *dev, return NULL; /* the GART memory aperture is required */ - res_remap = platform_get_resource(to_platform_device(dev), - IORESOURCE_MEM, 1); - if (!res_remap) { + res = platform_get_resource(to_platform_device(dev), IORESOURCE_MEM, 1); + if (!res) { dev_err(dev, "GART: Memory aperture resource unavailable\n"); return ERR_PTR(-ENXIO); } @@ -390,39 +347,35 @@ struct gart_device *tegra_gart_probe(struct device *dev, if (!gart) return ERR_PTR(-ENOMEM); + gart_handle = gart; + + gart->dev = dev; + gart->regs = mc->regs + GART_REG_BASE; + gart->iovmm_base = res->start; + gart->iovmm_end = res->start + resource_size(res); + spin_lock_init(&gart->pte_lock); + spin_lock_init(&gart->dom_lock); + + do_gart_setup(gart, NULL); + ret = iommu_device_sysfs_add(&gart->iommu, dev, NULL, "gart"); - if (ret) { - dev_err(dev, "GART: Failed to register IOMMU sysfs\n"); + if (ret) goto free_gart; - } iommu_device_set_ops(&gart->iommu, &gart_iommu_ops); iommu_device_set_fwnode(&gart->iommu, dev->fwnode); ret = iommu_device_register(&gart->iommu); - if (ret) { - dev_err(dev, "GART: Failed to register IOMMU\n"); + if (ret) goto remove_sysfs; - } - gart->dev = dev; - gart_regs = mc->regs + GART_REG_BASE; - spin_lock_init(&gart->pte_lock); - spin_lock_init(&gart->dom_lock); - gart->regs = gart_regs; - gart->iovmm_base = (dma_addr_t)res_remap->start; - gart->page_count = (resource_size(res_remap) >> GART_PAGE_SHIFT); - - gart->savedata = vmalloc(array_size(sizeof(u32), gart->page_count)); + gart->savedata = vmalloc(resource_size(res) / GART_PAGE_SIZE * + sizeof(u32)); if (!gart->savedata) { ret = -ENOMEM; goto unregister_iommu; } - do_gart_setup(gart, NULL); - - gart_handle = gart; - return gart; unregister_iommu: