From patchwork Mon Oct 14 13:55:20 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Baryshkov X-Patchwork-Id: 13835120 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 97FDAD16275 for ; Mon, 14 Oct 2024 14:23:27 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:Cc:To:In-Reply-To:References :Message-Id:Content-Transfer-Encoding:Content-Type:MIME-Version:Subject:Date: From:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=WOBAB4fCN+OYdhF4Gj278BY1JY5UgUE5qLDzZmKiBEQ=; b=fmd1wJkcMoftuAputr27Uu6OjS Onx0KBZ16PM4WaoPQs79a/w2zu06YrZj3YjdU3txGVto06ulIXXahKcswWUnDw4Z5Cryik0YO8wV6 jelIMi8DPOHvdVegp7i/47+OkdCQuBydxixc5znQe/H9If6oVkv+J0zJdDprbQhgqv6Q/hc0UphMx d2Y33c38pmum4FA7vWjcg9e/eAN/vpsI0xDolzNOaP5L9qW0q4TxlzDJ6jFNgAJpBu/+19CXLBulO QnaZ6zfDPNBs0+EI2TtmT1aM+FFXLGwYMMgtOkWz8VJe7fI8GIBlFoSGofPIrBMfMBz9GbrpP1QaP N6flf4qw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98 #2 (Red Hat Linux)) id 1t0Lyc-00000005SHQ-1fWG; Mon, 14 Oct 2024 14:23:14 +0000 Received: from mail-lj1-x235.google.com ([2a00:1450:4864:20::235]) by bombadil.infradead.org with esmtps (Exim 4.98 #2 (Red Hat Linux)) id 1t0LXk-00000005NCX-21zb for linux-arm-kernel@lists.infradead.org; Mon, 14 Oct 2024 13:55:29 +0000 Received: by mail-lj1-x235.google.com with SMTP id 38308e7fff4ca-2fb3110b964so32611781fa.1 for ; Mon, 14 Oct 2024 06:55:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1728914126; x=1729518926; darn=lists.infradead.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=WOBAB4fCN+OYdhF4Gj278BY1JY5UgUE5qLDzZmKiBEQ=; b=qSbif9wtQzCXAxyk02nto+aXamenf6GsCjJsnFTHhg4t1iXpo+L7Q2igQtjXIVR1ve t6z9Op4Ls9/87Ne+Rk14GYOLQsExLsAClnytXlaEZmJgpUtG7fAc1uB30hROFZ84Riq5 UwF8UW4Dwe36e6bNFoUe3Tl4YlW7jb+Su8HKh42DnGFV4y+H48eBvY9r4M07w7VqjDHK t4Cupb1JkjDX57EcRQHbZVrzOHPo8ANf2jSH8du41F2SdJa5IpbqNAhYuv7D1tgfXVHB NzPa0+aj7B9cSA2+XEh4r+dfS05/BO3LXL/dkB38DV4DkYIru8+b15hLcfbKd64ebXw0 xdUQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1728914126; x=1729518926; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=WOBAB4fCN+OYdhF4Gj278BY1JY5UgUE5qLDzZmKiBEQ=; b=NfpRUJ+vBqbk4l/KxlkwfY35EKMAWycJkc+I7gdn73CYGmZAKJLP9ggGiEQyIJ5LhN kk2A9ensnh9pY6fmstqtZfkhwV2ESHyJV9VCxduRSTh/pZy0GzdEVnT4kze/7hvx3vJs 6gbxuSkneRdJGKjjBPuM7xEwR7opnO7KdyAq4SUkDwyEWjn6VNOxp5J3hFYwT/8V7zsU MfrArPOETQJq+3HmWGm0jVcbc+xbTpwL71qo0ymWipIB4sgcV+KHARlQdztWfJAcdO76 Iy09vp2zfi7jfN2B/nk/1AczI9bAhd0gAcucxhh1QZ4PDSh7WN3ukByyWImUZipT9ObU NhAg== X-Gm-Message-State: AOJu0YzAxVaW9lNZoVoNHhORj4y1wprdgifee95BZKtQx2c1nc62M0k3 s187W6qSKULqTTZR4V8DiO8vI6721zIgYrKSh/FzLJMsrSqMU5OGRlSjtOIOGSKpTDb4lE+uH3H M X-Google-Smtp-Source: AGHT+IHXfxymwMuBTLIPhj1IILaLlqCN68Kc44a6pGyIrVl/vNinMfPWVaScDLDhzz6b1w5Xu/CMGQ== X-Received: by 2002:a05:651c:1509:b0:2fa:bd30:1928 with SMTP id 38308e7fff4ca-2fb3f2d1b11mr26316081fa.32.1728914126119; Mon, 14 Oct 2024 06:55:26 -0700 (PDT) Received: from umbar.lan ([192.130.178.90]) by smtp.gmail.com with ESMTPSA id 38308e7fff4ca-2fb438c06f7sm8039641fa.55.2024.10.14.06.55.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 14 Oct 2024 06:55:25 -0700 (PDT) From: Dmitry Baryshkov Date: Mon, 14 Oct 2024 16:55:20 +0300 Subject: [PATCH v2 1/2] ARM: add CLIDR accessor functions MIME-Version: 1.0 Message-Id: <20241014-armv7-cacheinfo-v2-1-38ab76d2b7fa@linaro.org> References: <20241014-armv7-cacheinfo-v2-0-38ab76d2b7fa@linaro.org> In-Reply-To: <20241014-armv7-cacheinfo-v2-0-38ab76d2b7fa@linaro.org> To: Sudeep Holla , Ard Biesheuvel , Russell King Cc: linux-arm-kernel@lists.infradead.org, linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, Bjorn Andersson , Konrad Dybcio , Arnd Bergmann X-Mailer: b4 0.14.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=1067; i=dmitry.baryshkov@linaro.org; h=from:subject:message-id; bh=OB3yO9FQv0J593fU52zHVnW8M9sIKaaudWV4PCqWeY8=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBnDSLKtlJv5vCrtJr/cNbUxbxVvYF7NDouakMt/ W1CwyiX+LOJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCZw0iygAKCRCLPIo+Aiko 1eKFB/wLj20pVDg44I5tdPc6vbCK41LLd742EI7OeUQjip1Myn2p+pnpfgShdMzFHwpnhcVz+fa Y9D5UQ/73fOaI8EMt/CO//nyZbPZlu9N40Zto9dDrzK+0X726hn/F3prsFNMv006TFfUUzKYSzU 7G7WVg9nkw7wJ9druObfFR8Ph/b5ouw6tq6gXI4w25YtvTtKs+SoMxlYODeBQzKY3yN9T/DiEaX rPj5MwtIYfX/H1HWKuGJ6YyJMq4TSNGBmW9OIOQJnYogypC1bmE8+mgOFi8cFX2ys+jFvJybFtj drlm+eQF1wGx1JzNAnDxx6gtSNqrx/CUJIU4EW/pQZYEIABX X-Developer-Key: i=dmitry.baryshkov@linaro.org; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20241014_065528_560956_D0512C06 X-CRM114-Status: GOOD ( 10.50 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Add functions to read the CLIDR, Cache Level ID Register. Signed-off-by: Dmitry Baryshkov --- arch/arm/include/asm/cachetype.h | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/arch/arm/include/asm/cachetype.h b/arch/arm/include/asm/cachetype.h index b9dbe1d4c8fe..b01c59076b84 100644 --- a/arch/arm/include/asm/cachetype.h +++ b/arch/arm/include/asm/cachetype.h @@ -83,6 +83,14 @@ static inline unsigned int read_ccsidr(void) asm volatile("mrc p15, 1, %0, c0, c0, 0" : "=r" (val)); return val; } + +static inline unsigned int read_clidr(void) +{ + unsigned int val; + + asm volatile("mrc p15, 1, %0, c0, c0, 1" : "=r" (val)); + return val; +} #else /* CONFIG_CPU_V7M */ #include #include "asm/v7m.h" @@ -96,6 +104,11 @@ static inline unsigned int read_ccsidr(void) { return readl(BASEADDR_V7M_SCB + V7M_SCB_CCSIDR); } + +static inline unsigned int read_clidr(void) +{ + return readl(BASEADDR_V7M_SCB + V7M_SCB_CLIDR); +} #endif #endif From patchwork Mon Oct 14 13:55:21 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Baryshkov X-Patchwork-Id: 13835121 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 12910D16268 for ; Mon, 14 Oct 2024 14:24:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:Cc:To:In-Reply-To:References :Message-Id:Content-Transfer-Encoding:Content-Type:MIME-Version:Subject:Date: From:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=910VNT/3al90WIHFmuvF3u7AO/uPrBTduU56Fw5sYjM=; b=Ux1kU6EgScVOWE8a+iulRG6uRn fozcMPeLhHzgGDHol2kpnXlg43sW+K4+fh6HEk0DJClQaDlRUh0eKVMMEQdnFvZswtowNOFoPedbj lqtm/E5f+qUYiecXSNKK/TL/R425G6u4EKU7iP9i0+Enr1NJwBWmbpHAnb836IvEaukW12Drr2m7i fubr8IeGBCcKJ5zcK9uZukO04CJFmn2tc640CjryPxUYH7QQROEjMsZKD+QoSRpxVmAIku0vvr+q6 AifBcshxhoSEJZ5RVbNRuSQfNLFiyEgGeKdM0nIAlNerZVIaS81QZs9p8gTPhdzw5dqi6deJkhySh n2wcj0bw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98 #2 (Red Hat Linux)) id 1t0Lzz-00000005SUm-0PtZ; Mon, 14 Oct 2024 14:24:39 +0000 Received: from mail-lj1-x231.google.com ([2a00:1450:4864:20::231]) by bombadil.infradead.org with esmtps (Exim 4.98 #2 (Red Hat Linux)) id 1t0LXm-00000005NDJ-2fOl for linux-arm-kernel@lists.infradead.org; Mon, 14 Oct 2024 13:55:31 +0000 Received: by mail-lj1-x231.google.com with SMTP id 38308e7fff4ca-2f7657f9f62so40534921fa.3 for ; Mon, 14 Oct 2024 06:55:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1728914129; x=1729518929; darn=lists.infradead.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=910VNT/3al90WIHFmuvF3u7AO/uPrBTduU56Fw5sYjM=; b=amTxmps7eafk/d1WG1Cjct9DlR/BqxHWFvTn3YfzWHSChcIou5QRJHyycYyIqBTai7 LvR0OxEqt63tv5iJiDcl+E2YIXZKQjG5cR3y9IPEVAA/pM87/+1DDaEHIoQV7PxegPNq +vro8edpd0PyM//dugWHUC851QJINyLM5M9XWoQkDXLAXCzQ57XeU5CQpLHVd5gtqaiY jiBjikoXrUMSe74+7jGnEIb06LbrsUzJnzG0La+dUQVdEHIKnMU50hK/tc0wT190jd6G LSQDxNo2sEdPnSOJYvZHhjC0B8WPRNt8fX9lYNlUvHOnS//re5zur4UHZKBQLdOZMMZS /0cw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1728914129; x=1729518929; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=910VNT/3al90WIHFmuvF3u7AO/uPrBTduU56Fw5sYjM=; b=kiw5ypufCU7QTbuqxFHuAnQiLQ24hX9GT3nEFtBgjHatVO8cAlC4/CT/I/TWz+wG// kiuQ3mJtcZAU9ncmysfIt0kSo8DwFRc4s06a665YKlGYqjkhs7G4tfkKwa/LP3krKmUl DXRQzd9YOtbt3WiMLuKTws5TurJdYW/kjN/1ROvQz18B/zg+1kKOARYp/4z+GNB0EtXV k5G0HlfcKrjoi9crvSIosxQbS9HlGCPCc6obwJyoE0NmqXUtR7iCMdXCZTpwl8WOBJ40 KhL9XgiAhi3B7STTWTfLftDUBz3bgfNhwV2vw1wXIxaQf7mimgleADhKcE1roHHe8cMW K0cQ== X-Gm-Message-State: AOJu0Yy6xfh/7TJXdhZvvG/2ezfBqR3Y2HmDnnxbpluXnnpD7L6a/eVR 3RlcB3J0gru0E7sf7nWXB5Ah+f24d9dLaG87G5eDVwJhLdZSEjEdrii1LmlAAGo= X-Google-Smtp-Source: AGHT+IEnxC4Uc6qG1GhsLQY8bUBklQuVIxgJUvUZgodJgeel9W3Lcu6LQ8WPbMv9KY6uPfNfevwmBg== X-Received: by 2002:a05:651c:548:b0:2fa:d345:18b9 with SMTP id 38308e7fff4ca-2fb329b2a01mr53500281fa.38.1728914128643; Mon, 14 Oct 2024 06:55:28 -0700 (PDT) Received: from umbar.lan ([192.130.178.90]) by smtp.gmail.com with ESMTPSA id 38308e7fff4ca-2fb438c06f7sm8039641fa.55.2024.10.14.06.55.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 14 Oct 2024 06:55:27 -0700 (PDT) From: Dmitry Baryshkov Date: Mon, 14 Oct 2024 16:55:21 +0300 Subject: [PATCH v2 2/2] ARM: implement cacheinfo support MIME-Version: 1.0 Message-Id: <20241014-armv7-cacheinfo-v2-2-38ab76d2b7fa@linaro.org> References: <20241014-armv7-cacheinfo-v2-0-38ab76d2b7fa@linaro.org> In-Reply-To: <20241014-armv7-cacheinfo-v2-0-38ab76d2b7fa@linaro.org> To: Sudeep Holla , Ard Biesheuvel , Russell King Cc: linux-arm-kernel@lists.infradead.org, linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, Bjorn Andersson , Konrad Dybcio , Arnd Bergmann X-Mailer: b4 0.14.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=7266; i=dmitry.baryshkov@linaro.org; h=from:subject:message-id; bh=HycFsKS2HqCUNgySmxRekC/7rRVA9x2c5Czo/mq9rYY=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBnDSLK4kchsZSCE/y4fGAlwP0OjdcGOvDRJOlBU W7ERhDdWgKJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCZw0iygAKCRCLPIo+Aiko 1cG9CACIc2ogCdqpBl2gPZOk1bO+V3BvHiJZ7lSdu/hqpl/rvKZxHJgttKgVRf7wsSSiwlA89vt DX+xoh/67Ghx0ydqQhg7rDijvg01PcPD2/zacJg1oGIDED72T2FjIxQS/Lf2oC7dm13XWXBE0Yg Y5mhG3fGdTjP9FTNnyflLSEi7NjBstDYBBmxW7J/s2KPmHOljagK4iusbEijSOXelU7s+W3rTCi 1/dgQVIa492pyLJ+nzho4G3DoLRz4mR6XsZ9rPdEGGu4XmtW5SuU+xo8ry4HdwCF2rkaSvfcTMN ZbPQWEcaQRK17xfHjXywIZMiGX4IMhyMTDYyXG+6Xczck+EK X-Developer-Key: i=dmitry.baryshkov@linaro.org; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20241014_065530_712723_708A7BBC X-CRM114-Status: GOOD ( 22.46 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org On ARMv7 / v7m machines read CTR and CLIDR registers to provide information regarding the cache topology. Earlier machines should describe full cache topology in the device tree. Note, this follows the ARM64 cacheinfo support and provides only minimal support required to bootstrap cache info. All useful properties should be decribed in Device Tree. Signed-off-by: Dmitry Baryshkov --- arch/arm/Kconfig | 1 + arch/arm/include/asm/cache.h | 6 ++ arch/arm/kernel/Makefile | 1 + arch/arm/kernel/cacheinfo.c | 173 +++++++++++++++++++++++++++++++++++++++++++ include/linux/cacheinfo.h | 2 +- 5 files changed, 182 insertions(+), 1 deletion(-) diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 749179a1d162..e790543c3eaf 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig @@ -5,6 +5,7 @@ config ARM select ARCH_32BIT_OFF_T select ARCH_CORRECT_STACKTRACE_ON_KRETPROBE if HAVE_KRETPROBES && FRAME_POINTER && !ARM_UNWIND select ARCH_HAS_BINFMT_FLAT + select ARCH_HAS_CACHE_LINE_SIZE if OF select ARCH_HAS_CPU_CACHE_ALIASING select ARCH_HAS_CPU_FINALIZE_INIT if MMU select ARCH_HAS_CURRENT_STACK_POINTER diff --git a/arch/arm/include/asm/cache.h b/arch/arm/include/asm/cache.h index e3ea34558ada..ecbc100d22a5 100644 --- a/arch/arm/include/asm/cache.h +++ b/arch/arm/include/asm/cache.h @@ -26,4 +26,10 @@ #define __read_mostly __section(".data..read_mostly") +#ifndef __ASSEMBLY__ +#ifdef CONFIG_ARCH_HAS_CACHE_LINE_SIZE +int cache_line_size(void); +#endif +#endif + #endif diff --git a/arch/arm/kernel/Makefile b/arch/arm/kernel/Makefile index aaae31b8c4a5..b3333d070390 100644 --- a/arch/arm/kernel/Makefile +++ b/arch/arm/kernel/Makefile @@ -40,6 +40,7 @@ obj-y += entry-armv.o endif obj-$(CONFIG_MMU) += bugs.o +obj-$(CONFIG_OF) += cacheinfo.o obj-$(CONFIG_CPU_IDLE) += cpuidle.o obj-$(CONFIG_ISA_DMA_API) += dma.o obj-$(CONFIG_FIQ) += fiq.o fiqasm.o diff --git a/arch/arm/kernel/cacheinfo.c b/arch/arm/kernel/cacheinfo.c new file mode 100644 index 000000000000..a8eabcaa18d8 --- /dev/null +++ b/arch/arm/kernel/cacheinfo.c @@ -0,0 +1,173 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * ARM cacheinfo support + * + * Copyright (C) 2023 Linaro Ltd. + * Copyright (C) 2015 ARM Ltd. + * All Rights Reserved + */ + +#include +#include +#include + +#include +#include +#include + +/* Ctypen, bits[3(n - 1) + 2 : 3(n - 1)], for n = 1 to 7 */ +#define CLIDR_CTYPE_SHIFT(level) (3 * (level - 1)) +#define CLIDR_CTYPE_MASK(level) (7 << CLIDR_CTYPE_SHIFT(level)) +#define CLIDR_CTYPE(clidr, level) \ + (((clidr) & CLIDR_CTYPE_MASK(level)) >> CLIDR_CTYPE_SHIFT(level)) + +#define MAX_CACHE_LEVEL 7 /* Max 7 level supported */ + +#define CTR_FORMAT_MASK GENMASK(27, 24) +#define CTR_FORMAT_ARMV6 0 +#define CTR_FORMAT_ARMV7 4 +#define CTR_CWG_MASK GENMASK(27, 24) +#define CTR_DSIZE_LEN_MASK GENMASK(13, 12) +#define CTR_ISIZE_LEN_MASK GENMASK(1, 0) + +/* Also valid for v7m */ +static inline int cache_line_size_cp15(void) +{ + u32 ctr = read_cpuid_cachetype(); + u32 format = FIELD_GET(CTR_FORMAT_MASK, ctr); + + if (format == CTR_FORMAT_ARMV7) { + u32 cwg = FIELD_GET(CTR_CWG_MASK, ctr); + + return cwg ? 4 << cwg : ARCH_DMA_MINALIGN; + } else if (WARN_ON_ONCE(format != CTR_FORMAT_ARMV6)) { + return ARCH_DMA_MINALIGN; + } + + return 8 << max(FIELD_GET(CTR_ISIZE_LEN_MASK, ctr), + FIELD_GET(CTR_DSIZE_LEN_MASK, ctr)); +} + +int cache_line_size(void) +{ + if (coherency_max_size != 0) + return coherency_max_size; + + /* CP15 is optional / implementation defined before ARMv6 */ + if (cpu_architecture() < CPU_ARCH_ARMv6) + return ARCH_DMA_MINALIGN; + + return cache_line_size_cp15(); +} +EXPORT_SYMBOL_GPL(cache_line_size); + +static inline enum cache_type get_cache_type(int level) +{ + u32 clidr; + + if (level > MAX_CACHE_LEVEL) + return CACHE_TYPE_NOCACHE; + + clidr = read_clidr(); + + return CLIDR_CTYPE(clidr, level); +} + +static void ci_leaf_init(struct cacheinfo *this_leaf, + enum cache_type type, unsigned int level) +{ + this_leaf->level = level; + this_leaf->type = type; +} + +static int detect_cache_level(unsigned int *level_p, unsigned int *leaves_p) +{ + unsigned int ctype, level, leaves; + u32 ctr, format; + + /* CLIDR is not present before ARMv7/v7m */ + if (cpu_architecture() < CPU_ARCH_ARMv7) + return -EOPNOTSUPP; + + /* Don't try reading CLIDR if CTR declares old format */ + ctr = read_cpuid_cachetype(); + format = FIELD_GET(CTR_FORMAT_MASK, ctr); + if (format != CTR_FORMAT_ARMV7) + return -EOPNOTSUPP; + + for (level = 1, leaves = 0; level <= MAX_CACHE_LEVEL; level++) { + ctype = get_cache_type(level); + if (ctype == CACHE_TYPE_NOCACHE) { + level--; + break; + } + /* Separate instruction and data caches */ + leaves += (ctype == CACHE_TYPE_SEPARATE) ? 2 : 1; + } + + *level_p = level; + *leaves_p = leaves; + + return 0; +} + +int early_cache_level(unsigned int cpu) +{ + struct cpu_cacheinfo *this_cpu_ci = get_cpu_cacheinfo(cpu); + + return detect_cache_level(&this_cpu_ci->num_levels, &this_cpu_ci->num_leaves); +} + +int init_cache_level(unsigned int cpu) +{ + unsigned int level, leaves; + struct cpu_cacheinfo *this_cpu_ci = get_cpu_cacheinfo(cpu); + int fw_level; + int ret; + + ret = detect_cache_level(&level, &leaves); + if (ret) + return ret; + + fw_level = of_find_last_cache_level(cpu); + + if (level < fw_level) { + /* + * some external caches not specified in CLIDR_EL1 + * the information may be available in the device tree + * only unified external caches are considered here + */ + leaves += (fw_level - level); + level = fw_level; + } + + this_cpu_ci->num_levels = level; + this_cpu_ci->num_leaves = leaves; + return 0; +} + +int populate_cache_leaves(unsigned int cpu) +{ + unsigned int level, idx; + enum cache_type type; + struct cpu_cacheinfo *this_cpu_ci = get_cpu_cacheinfo(cpu); + struct cacheinfo *this_leaf = this_cpu_ci->info_list; + unsigned int arch = cpu_architecture(); + + /* CLIDR is not present before ARMv7/v7m */ + if (arch < CPU_ARCH_ARMv7) + return -EOPNOTSUPP; + + for (idx = 0, level = 1; level <= this_cpu_ci->num_levels && + idx < this_cpu_ci->num_leaves; idx++, level++) { + type = get_cache_type(level); + if (type == CACHE_TYPE_SEPARATE) { + ci_leaf_init(this_leaf++, CACHE_TYPE_DATA, level); + ci_leaf_init(this_leaf++, CACHE_TYPE_INST, level); + } else { + ci_leaf_init(this_leaf++, type, level); + } + } + + return 0; +} diff --git a/include/linux/cacheinfo.h b/include/linux/cacheinfo.h index 108060612bb8..1e7061549fc7 100644 --- a/include/linux/cacheinfo.h +++ b/include/linux/cacheinfo.h @@ -147,7 +147,7 @@ static inline int get_cpu_cacheinfo_id(int cpu, int level) return ci ? ci->id : -1; } -#ifdef CONFIG_ARM64 +#if defined(CONFIG_ARM64) || defined(CONFIG_ARM) #define use_arch_cache_info() (true) #else #define use_arch_cache_info() (false)