Received: by 2002:ac0:e34a:0:0:0:0:0 with SMTP id g10csp948447imn; Tue, 26 Jul 2022 13:56:46 -0700 (PDT) X-Google-Smtp-Source: AGRyM1uj6IAOQORneU2eQj6xI5b1rSqAXW2CKRnF2JWOwNZVlVLpFkKEdABd3yy7uh2+FyQJ9Lz/ X-Received: by 2002:a63:8049:0:b0:415:d366:7229 with SMTP id j70-20020a638049000000b00415d3667229mr16721460pgd.137.1658869006065; Tue, 26 Jul 2022 13:56:46 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1658869006; cv=none; d=google.com; s=arc-20160816; b=0d3DOAMbI3ZBH6YvRWM7VSQVPZZLMwU/RCQwXGHHej7AVtq8eceCWyo4ZQrb8zRLU8 1SRFan5Gk8MDRaCiSeOc2vf8Iz1f10f4TpgFQv1+NupYatLrVmq2D+iHKnPt51QE6Wvh 8DdUT6EGQVPsUu0netnIQ86zWw73y02oPrYXJJ9iVFNsgAqHn3kFkNMmJZsUjKaoh4Nd 6PSSLsOM8sasTw+BYj9WJ2K4tJfpGt3+iVK3qz93T3vFK4v1DNMAKRTo4jdhEMXY0KwP uPMvoGMABUCmR3QMNZjNaZyOy/m0P5mOniq9vHn6BazDY6S/zgQUDl0EzT9c9ODH3lQ/ 4h+w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=upg6JemQobvxpbvcYkGZTE7woCjfAjYx23pabDH6S70=; b=PT9jb3SdlpbRRFKY09GemXlZ7tuxoF9c4QikZWFerPY7UXL3VQqO7uGqpP3K0Yv1fj jY4nPTPIEzIma3W4Ra1SB3hVo7dS9rIcP9LneuIlwnkMau1rfCC8dvvj3unMymtzYsbh 7yEYTSBSoJNMVzKZyTkiRq8QpqXzEvCg19IelUWwBxlVBAV+/MH5FnpALgw0QHHbwjQs cnn5zLndjsAMBeIVxk7ADW9a2YllDcTVhXUxTjO4ybsW/0pUkoqDOI9Wz8sGS84/rR+d 7G7SpJlE6VnE3ZXP0uYRi0JYD+LmNP/H+3WZCejHuXE1OmFnP7ke+8Y9+cfXD2YNc3KQ 3iLg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=KY2REAUe; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id c17-20020a056a00249100b0052bee89e85csi11265610pfv.136.2022.07.26.13.56.29; Tue, 26 Jul 2022 13:56:46 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=KY2REAUe; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239835AbiGZUHx (ORCPT + 99 others); Tue, 26 Jul 2022 16:07:53 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:46364 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239721AbiGZUHq (ORCPT ); Tue, 26 Jul 2022 16:07:46 -0400 Received: from mail-ej1-x62f.google.com (mail-ej1-x62f.google.com [IPv6:2a00:1450:4864:20::62f]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C0A1B33A3A for ; Tue, 26 Jul 2022 13:07:44 -0700 (PDT) Received: by mail-ej1-x62f.google.com with SMTP id os14so28119727ejb.4 for ; Tue, 26 Jul 2022 13:07:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=upg6JemQobvxpbvcYkGZTE7woCjfAjYx23pabDH6S70=; b=KY2REAUeTrxKpGxnAFQJ6G5IfIIF7/usG+WAYcQ8mBBct/cgEIHf6gFa/H+I97ylFy hO1ugpx1K4FDC5+1Wl7nAV9YHIQyhQbkcjR2tCZxnHCqEpsNB5uaRlmAx+c3TMVg8gKD WnFmR3DAUnG1WBLjo5jWhavTgSHvkMUmDsVBNnoeG9uK2ncFB5aB70Qh2lk4LzP597mz iTzEPubySBp2IOKJeqrNSb3Ka09PUGVChg3I2f1ahx/QZJjVOoNRruThA0rztxT4Avaz NB89vxSGFOX4UK0OXQ1w8q8f0uCXY0qLSOB+pn5P6EZZfi34THjmmuttz+9Gz2oJtEm+ GQ2A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=upg6JemQobvxpbvcYkGZTE7woCjfAjYx23pabDH6S70=; b=HjOUPyHRwEJD+vo2xFMRzpx3I4U7zWyNOKahVnPTTcGQuMiIkbSjS9Ypgq/T/mknmf fYy7wOTrgZWa7MQfekRRm6ver7SBd3fxiZnf8JCQUI4SLu54g6AtpyipDHR2Yce4JfVx YHZzxiYp5Ut4uWcAuGtWTjRx4CSMErT6GRKivZ6UjhIYMkDhdCqk1MNMIKX1oE/CFZbK b3RDJkM32EUDb0FprQTr5I/I+ufKl1lLOijulFKNzi3qZXE/uK25uiADEWuqXB2zYVaz bHm/1I0646l6qlRJrfDzr5aJacRQDk7+ceu/+lesN+dFNbQ+g5tmkepfPzTXz6ONUgrR 3k9w== X-Gm-Message-State: AJIora9wTmNArIMc/TRd6da1NngLBNw5Su+jeGNz26BeqJ/hcGTLslpl kEZuWaA1HHZ5XWUHV8NRVv0pRA== X-Received: by 2002:a17:907:9620:b0:72b:5822:93d0 with SMTP id gb32-20020a170907962000b0072b582293d0mr15931780ejc.235.1658866063225; Tue, 26 Jul 2022 13:07:43 -0700 (PDT) Received: from localhost ([31.134.121.151]) by smtp.gmail.com with ESMTPSA id ba17-20020a0564021ad100b0043c87da1ab6sm862947edb.48.2022.07.26.13.07.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 26 Jul 2022 13:07:42 -0700 (PDT) From: Sam Protsenko To: Marek Szyprowski , Krzysztof Kozlowski Cc: Joerg Roedel , Will Deacon , Robin Murphy , Janghyuck Kim , Cho KyongHo , Daniel Mentz , David Virag , Sumit Semwal , iommu@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-samsung-soc@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 2/2] iommu/exynos: Implement fault handling on SysMMU v7 Date: Tue, 26 Jul 2022 23:07:39 +0300 Message-Id: <20220726200739.30017-3-semen.protsenko@linaro.org> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220726200739.30017-1-semen.protsenko@linaro.org> References: <20220726200739.30017-1-semen.protsenko@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org SysMMU v7 has a bit different registers for getting the fault info: - there is one single register (MMU_FAULT_VA) to get the fault address - fault access type (R/W) can be read from MMU_FAULT_TRANS_INFO register now - interrupt status register has different bits w.r.t. previous SysMMU versions - VM and non-VM layouts have different register addresses Add correct fault handling implementation for SysMMU v7, according to all mentioned differences. Only VID #0 (default) is handled, as VM domains support is not implemented yet. Signed-off-by: Sam Protsenko --- drivers/iommu/exynos-iommu.c | 48 +++++++++++++++++++++++++++++++++--- 1 file changed, 44 insertions(+), 4 deletions(-) diff --git a/drivers/iommu/exynos-iommu.c b/drivers/iommu/exynos-iommu.c index 766d409e084a..ac47c796741b 100644 --- a/drivers/iommu/exynos-iommu.c +++ b/drivers/iommu/exynos-iommu.c @@ -217,6 +217,13 @@ static const char * const sysmmu_v5_fault_names[] = { "SECURITY PROTECTION" }; +static const char * const sysmmu_v7_fault_names[] = { + "PTW", + "PAGE", + "ACCESS PROTECTION", + "RESERVED" +}; + /* * This structure is attached to dev->iommu->priv of the master device * on device add, contains a list of SYSMMU controllers defined by device tree, @@ -260,6 +267,8 @@ struct sysmmu_variant { u32 flush_end; /* end address of range invalidation */ u32 int_status; /* interrupt status information */ u32 int_clear; /* clear the interrupt */ + u32 fault_va; /* IOVA address that caused fault */ + u32 fault_info; /* fault transaction info */ int (*get_fault_info)(struct sysmmu_drvdata *data, unsigned int itype, struct sysmmu_fault *fault); @@ -337,6 +346,19 @@ static int exynos_sysmmu_v5_get_fault_info(struct sysmmu_drvdata *data, return 0; } +static int exynos_sysmmu_v7_get_fault_info(struct sysmmu_drvdata *data, + unsigned int itype, + struct sysmmu_fault *fault) +{ + u32 info = readl(SYSMMU_REG(data, fault_info)); + + fault->addr = readl(SYSMMU_REG(data, fault_va)); + fault->name = sysmmu_v7_fault_names[itype % 4]; + fault->type = (info & BIT(20)) ? IOMMU_FAULT_WRITE : IOMMU_FAULT_READ; + + return 0; +} + /* SysMMU v1..v3 */ static const struct sysmmu_variant sysmmu_v1_variant = { .flush_all = 0x0c, @@ -348,7 +370,7 @@ static const struct sysmmu_variant sysmmu_v1_variant = { .get_fault_info = exynos_sysmmu_v1_get_fault_info, }; -/* SysMMU v5 and v7 (non-VM capable) */ +/* SysMMU v5 */ static const struct sysmmu_variant sysmmu_v5_variant = { .pt_base = 0x0c, .flush_all = 0x10, @@ -362,7 +384,23 @@ static const struct sysmmu_variant sysmmu_v5_variant = { .get_fault_info = exynos_sysmmu_v5_get_fault_info, }; -/* SysMMU v7: VM capable register set */ +/* SysMMU v7: non-VM capable register layout */ +static const struct sysmmu_variant sysmmu_v7_variant = { + .pt_base = 0x0c, + .flush_all = 0x10, + .flush_entry = 0x14, + .flush_range = 0x18, + .flush_start = 0x20, + .flush_end = 0x24, + .int_status = 0x60, + .int_clear = 0x64, + .fault_va = 0x70, + .fault_info = 0x78, + + .get_fault_info = exynos_sysmmu_v7_get_fault_info, +}; + +/* SysMMU v7: VM capable register layout */ static const struct sysmmu_variant sysmmu_v7_vm_variant = { .pt_base = 0x800c, .flush_all = 0x8010, @@ -372,8 +410,10 @@ static const struct sysmmu_variant sysmmu_v7_vm_variant = { .flush_end = 0x8024, .int_status = 0x60, .int_clear = 0x64, + .fault_va = 0x1000, + .fault_info = 0x1004, - .get_fault_info = exynos_sysmmu_v5_get_fault_info, + .get_fault_info = exynos_sysmmu_v7_get_fault_info, }; static struct exynos_iommu_domain *to_exynos_domain(struct iommu_domain *dom) @@ -496,7 +536,7 @@ static void __sysmmu_get_version(struct sysmmu_drvdata *data) if (data->has_vcr) data->variant = &sysmmu_v7_vm_variant; else - data->variant = &sysmmu_v5_variant; + data->variant = &sysmmu_v7_variant; } __sysmmu_disable_clocks(data); -- 2.30.2