Received: by 2002:ac0:de83:0:0:0:0:0 with SMTP id b3csp156088imk; Sat, 2 Jul 2022 14:39:31 -0700 (PDT) X-Google-Smtp-Source: AGRyM1sOdwmTpWuPeraTN9WMxoYwps6i3N0AK66Ezc90YMxzCmIwOPGFH5TZNA74bpDBm6lp3HU9 X-Received: by 2002:a05:6402:51ce:b0:435:c7f8:2a87 with SMTP id r14-20020a05640251ce00b00435c7f82a87mr27665126edd.411.1656797971791; Sat, 02 Jul 2022 14:39:31 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1656797971; cv=none; d=google.com; s=arc-20160816; b=GotN/peDXj6dbCqweK8R9Gqdp/I5uX24YninRttOimG/m9bDThPX6D0lukCBwiNVtu V9nLeRx1Tv2zQ4X69PQGeUdsrAEsqZcoMqz7Srup/SBLRW7FM93aBgp8Y4v2JsCBRz8t 9gTVNx6TrVfQcvzHcT5jTvXbta7cfbzsm5w8r4INNLbFSWsYI/TSWmdCnkGIaFAv0cjz 7p0XeHJEzlg+HBYSm/ijbzKmoLgx7U9GJfXRM2NkkyRe7sYUK8hPY19yOAYCuNDxJJq9 OfOazaXytjzhqy/TWJkwRJpSsPPWw41aZXu3ODkqpq+ooZK/1UC6rZDMhVmQGnNProce 2VCA== 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=fjkLlnpo3rJV91gWG5Ub4TjaCmhb4e/5Gjwv7rGBuNk=; b=iUMW2fVuNc3+XxWifcTrQN53t61ownjHENmYJJs7o41Vn4J6UO+j6QJmACPrV3E/St +lA44IynR9nAjierpBvjpn5TM61SH/kyDAXAmwgfR3AAxIjYTV4zGvGXbwtCp58KUVZ/ 2HUjhGg390oG0N8xsLaAqamadCbIIcP6UnGEZ8apFRT6ncqVsAQQcS7aAxJB2cbhNpIU S4NvXtWYvdT6NiEXGNM0Clb8yBfeyrUnav2qMFiamVHYlOydOM9ASY9s++//qbgFTSeg 1J2Y53CyeQ26UTl0M2HfJ5dvcfOm66nUPGr6PmpLB0dEbXKbe4Y3Uzag5eb1VX6oyxsC SWKQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=BqX0hBiy; 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 dn22-20020a17090794d600b00718d0ab26f9si10329653ejc.715.2022.07.02.14.39.05; Sat, 02 Jul 2022 14:39:31 -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=BqX0hBiy; 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 S230261AbiGBVhi (ORCPT + 99 others); Sat, 2 Jul 2022 17:37:38 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44890 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230044AbiGBVhb (ORCPT ); Sat, 2 Jul 2022 17:37:31 -0400 Received: from mail-ej1-x62e.google.com (mail-ej1-x62e.google.com [IPv6:2a00:1450:4864:20::62e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5D54AB878 for ; Sat, 2 Jul 2022 14:37:30 -0700 (PDT) Received: by mail-ej1-x62e.google.com with SMTP id fw3so10017567ejc.10 for ; Sat, 02 Jul 2022 14:37:30 -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=fjkLlnpo3rJV91gWG5Ub4TjaCmhb4e/5Gjwv7rGBuNk=; b=BqX0hBiyoAeYzJvTN5zLo10CPIik6CQ1uuNpCfO3oq+RooTR3lviNeDHJH/TUUuJKS wUSkXeozyQgNLTM/cvKl2jPJTrzSH0myVq5M75OZivSySF+gkQJ24NlIDVVgrMbqLVGX wkH/4iI0lA4+uHrtf1nuF5wtDyjpFzVf22KES+ZXA7mX/AmqqcIl6kcFyx2NZ2gOLDlt p9mSagqMQh+9sF09gikAhlQeJfk12Cqxl0F9W852boCwBSMqhYRwIUoyGMhDm7HXBKL7 g2SABFfGTM0PskN5Bd0582SNluuYumuv8oc6R2l95M6DBu0m7EL/q/aAicGaXR/wWln5 Y6Bg== 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=fjkLlnpo3rJV91gWG5Ub4TjaCmhb4e/5Gjwv7rGBuNk=; b=eUUa5JnDixqzgboDLgt46Xvpp8iDZT3JmurC2lilnW2XQs5DrS4lQM2VbqvQVYB++s H5rnixScBFgHGTcDFB56cmShUFeKVtdS8xX4W/6ylwpwFGZ63Z+hBxmGRrKPRjqVjYb8 DeCLNRhEFw/ic9Xpi2gGPj3qZhEajAcPmJmZndAJbrW79TNDI4D/LuOUJ3rWKDP1ZOzu khA4nZ1JUDMqBbBZKm3CBajTHY7ZZshmajibd18VewNJEYhfGDn4CGN7U8Y5TQYWyKXE mq4lIpjzdNVBlxxlJdK+660fAFx1STuXqKPr87sBdvQK9LuxUaWZVthJzBtAzf+vIlyy nwxw== X-Gm-Message-State: AJIora/sNXzjppiIWQ8tnoYnKJeq/XBDVT2uPFPLVaa4wMzfKsCj8khE Jnf0kykSL37tQbQ1vZQ6KpAp4w== X-Received: by 2002:a17:906:8a53:b0:72a:8a2d:db61 with SMTP id gx19-20020a1709068a5300b0072a8a2ddb61mr10421953ejc.674.1656797848790; Sat, 02 Jul 2022 14:37:28 -0700 (PDT) Received: from localhost ([31.134.121.151]) by smtp.gmail.com with ESMTPSA id lo17-20020a170906fa1100b0072696b3a327sm9436558ejb.187.2022.07.02.14.37.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 02 Jul 2022 14:37:28 -0700 (PDT) From: Sam Protsenko To: Marek Szyprowski , Krzysztof Kozlowski Cc: Joerg Roedel , Will Deacon , Robin Murphy , Janghyuck Kim , Cho KyongHo , Daniel Mentz , Sumit Semwal , iommu@lists.linux-foundation.org, iommu@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-samsung-soc@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 3/4] iommu/exynos: Use lookup based approach to access v7 registers Date: Sun, 3 Jul 2022 00:37:23 +0300 Message-Id: <20220702213724.3949-4-semen.protsenko@linaro.org> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220702213724.3949-1-semen.protsenko@linaro.org> References: <20220702213724.3949-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,T_SCC_BODY_TEXT_LINE 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 might have different register layouts (VM capable or non-VM capable). Check which layout is implemented in current SysMMU module and prepare the corresponding register table for futher usage. This way is faster and more elegant than checking corresponding condition (if it's VM or non-VM SysMMU) each time before accessing v7 registers. For now the register table contains only most basic registers needed to add the SysMMU v7 support. This patch is based on downstream work of next authors: - Janghyuck Kim - Daniel Mentz Signed-off-by: Sam Protsenko --- drivers/iommu/exynos-iommu.c | 46 ++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/drivers/iommu/exynos-iommu.c b/drivers/iommu/exynos-iommu.c index df6ddbebbe2b..47017e8945c5 100644 --- a/drivers/iommu/exynos-iommu.c +++ b/drivers/iommu/exynos-iommu.c @@ -180,6 +180,47 @@ static u32 lv2ent_offset(sysmmu_iova_t iova) #define has_sysmmu(dev) (dev_iommu_priv_get(dev) != NULL) +#define MMU_REG(data, idx) \ + ((data)->sfrbase + (data)->regs[idx].off) +#define MMU_VM_REG(data, idx, vmid) \ + (MMU_REG(data, idx) + (vmid) * (data)->regs[idx].mult) + +enum { + REG_SET_NON_VM, + REG_SET_VM, + MAX_REG_SET +}; + +enum { + IDX_CTRL_VM, + IDX_CFG_VM, + IDX_FLPT_BASE, + IDX_ALL_INV, + MAX_REG_IDX +}; + +struct sysmmu_vm_reg { + unsigned int off; /* register offset */ + unsigned int mult; /* VM index offset multiplier */ +}; + +static const struct sysmmu_vm_reg sysmmu_regs[MAX_REG_SET][MAX_REG_IDX] = { + /* Default register set (non-VM) */ + { + /* + * SysMMUs without VM support do not have CTRL_VM and CFG_VM + * registers. Setting the offsets to 1 will trigger an unaligned + * access exception. + */ + {0x1}, {0x1}, {0x000c}, {0x0010}, + }, + /* VM capable register set */ + { + {0x8000, 0x1000}, {0x8004, 0x1000}, {0x800c, 0x1000}, + {0x8010, 0x1000}, + }, +}; + static struct device *dma_dev; static struct kmem_cache *lv2table_kmem_cache; static sysmmu_pte_t *zero_lv2_table; @@ -284,6 +325,7 @@ struct sysmmu_drvdata { /* v7 fields */ bool has_vcr; /* virtual machine control register */ + const struct sysmmu_vm_reg *regs; /* register set */ }; static struct exynos_iommu_domain *to_exynos_domain(struct iommu_domain *dom) @@ -407,6 +449,10 @@ static void sysmmu_get_hw_info(struct sysmmu_drvdata *data) __sysmmu_get_version(data); if (MMU_MAJ_VER(data->version) >= 7 && __sysmmu_has_capa1(data)) __sysmmu_get_vcr(data); + if (data->has_vcr) + data->regs = sysmmu_regs[REG_SET_VM]; + else + data->regs = sysmmu_regs[REG_SET_NON_VM]; __sysmmu_disable_clocks(data); } -- 2.30.2