From patchwork Tue Feb 20 22:57:36 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Baryshkov X-Patchwork-Id: 774318 Received: from mail-lj1-f180.google.com (mail-lj1-f180.google.com [209.85.208.180]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 237EB154C08 for ; Tue, 20 Feb 2024 22:57:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.180 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1708469863; cv=none; b=sN1DWPbZiltkd6j5khSPt4xYKk2fcdYXYZHSVpcUEOy9JkX9jIuvzaqK+Xpvon2cvVH4X+9sDEgYp7UM46dq26Wg/taVbQnGPy9R7ZvonQ8E3XFoNUXYn1iW1adzZQ15rNFxSAHBRyM+hXFYh397JxoyTuRQ6Ahg13PLm0gk8iQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1708469863; c=relaxed/simple; bh=t8WE1+fA8j81+AJkUCcorxLRWwscCfXSF46thI/6wwA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=g5iSNyrIkXEE3pX3KPU9kwrmwZm5gQAw3qEK5lF4K9Kim51orZ85i6sUF9AD5932pJ2GrQ9pLZbTix5W521rVm9STM/AHvynMxWSW+LJGhsHoZ04h5o39ppPpiWUDJGXPCmkSfXtw4hLrV/ETf7z3EZ1gG/WZYyFWQGiQyGVFm4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=jK/haAh6; arc=none smtp.client-ip=209.85.208.180 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="jK/haAh6" Received: by mail-lj1-f180.google.com with SMTP id 38308e7fff4ca-2d204e102a9so77365011fa.0 for ; Tue, 20 Feb 2024 14:57:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1708469859; x=1709074659; darn=vger.kernel.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=5dsfoDrDqhFi2M0qRhXB0Rpx7fbnSThvVod9k+rsj1w=; b=jK/haAh6rfzaf88iFiEvId2m3RCUc5pg3j5MCA6uSsGSb5OEt8R63cIkoClQU+sRY4 +RUN5uJufjn/8E0gSjzifnXabwktlQe5DvoGp3oZxJYFbf7pdXlez4Yqcu9sPf9uI8G/ 09UWBsSzhh7OYJ36IdU6TEAQ1wFE+tkjUUBnwsTVhKZpH5F57wq6HelLl67aj5OEK09W WQsU0YjnLqiVvTz35WZ3X/C2h1mjMJdXdvZ8QDkfH7/NVReafvGSjAgPZgyazNBzvO/s abVr4GBPJ/nQKuoIE7fV4fRDPGH9R9xOL/HP2tQTIlmM5reVibKy0tnTUcbxWATADC0s xx7w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1708469859; x=1709074659; 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=5dsfoDrDqhFi2M0qRhXB0Rpx7fbnSThvVod9k+rsj1w=; b=Lsy1/IiiI56iPltGggN8HbdMlZdoBmTAsFo3xsJuYmj4HSQDs/sIxmH/EOthOTqyDe nNpWjzMMdq41ynIy2YV+Zq+L8V9tV/c3W7is+aSxLaFqXC5IWiFD26/lg+y3hvaVUGjR u7Fz1M2xoITdm3T87bCAIMMnrt9bPs7zezPXRj5DVTjqOpUUWy2Mz1S9MNZGaLsJGFoY L/6o+0PSg1ucpa4QxrM6qxLEcbw22i85bCB99tm+TF7FQKeZ5I4q+Fjj71tgK1ADeY3K 9BU/advqWmISgMJRPPXnljwf9BeWVgrDN+P/bHsbg55q9EF+NOlah0B+/kVFr+TjAOf4 deOQ== X-Forwarded-Encrypted: i=1; AJvYcCViO26Wl1zTCW0QkAjvpyNFATMdBIYW2CbuFUpyPlTtry1NqXABQ8jV8EmTrZaW8i26hmVpe69oBXQYTvPsYqVx4CQqHf00rLWXOBtNlA== X-Gm-Message-State: AOJu0YzqcTypUvx3/SqxMvaBrv2jyH0AeFDOy0Wi+o1/7XG9hdW46/rj rY0ar2637xyJtxbMy+pv78FMWihIfBs5LtjK8HAVolpxviW3JbesZ4nyhukMtWJnfDGJJDCdRDr w X-Google-Smtp-Source: AGHT+IHyLvSv3R1ZfAIiRwhujC/7SqVIDqdpklKlQWTaD8iLqVdQ1gPbc+GsMOY2PtIW2Ox0PmMmvg== X-Received: by 2002:a2e:a545:0:b0:2d2:3e75:32e8 with SMTP id e5-20020a2ea545000000b002d23e7532e8mr4077614ljn.13.1708469858968; Tue, 20 Feb 2024 14:57:38 -0800 (PST) Received: from umbar.lan ([192.130.178.91]) by smtp.gmail.com with ESMTPSA id q8-20020a2e9688000000b002d24de76dffsm277990lji.100.2024.02.20.14.57.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 20 Feb 2024 14:57:38 -0800 (PST) From: Dmitry Baryshkov Date: Wed, 21 Feb 2024 00:57:36 +0200 Subject: [PATCH RESEND 1/2] ARM: add CLIDR accessor functions Precedence: bulk X-Mailing-List: linux-arm-msm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20240221-armv7-cacheinfo-v1-1-69dbd7f20d04@linaro.org> References: <20240221-armv7-cacheinfo-v1-0-69dbd7f20d04@linaro.org> In-Reply-To: <20240221-armv7-cacheinfo-v1-0-69dbd7f20d04@linaro.org> To: Russell King Cc: linux-arm-kernel@lists.infradead.org, linux-arm-msm@vger.kernel.org, Dmitry Baryshkov X-Mailer: b4 0.13.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=1067; i=dmitry.baryshkov@linaro.org; h=from:subject:message-id; bh=t8WE1+fA8j81+AJkUCcorxLRWwscCfXSF46thI/6wwA=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBl1S5hrQqywysV90XIPIec3CzG65DMLy1p1IZ+m JFGMLPt8OqJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCZdUuYQAKCRCLPIo+Aiko 1XyUB/9fcr+ssXTBs0xyFgXSZLdfnWArU07R1WxcaKc4SGofjSH2cU7fgWJwOGtBujY1BR4/vke PATVIYgVKhIeevkl1BYO3nLjBrdCu7imAIvQfHCpSUcXFWg8gQDSbdSYfUmg5Q/BarV2+iVbDtn LgI6C5uwkFcFs4ibvOs2cZkc4O7sDKs0FJMC/EALdDkk4gFsgCBw3ClMxjiIE+/LhN4/Ms2pKPq Jlno4AT2Kas5CQkPzVTfQ1J8lmW68w3prLGHjdxAoKez9nb505CK9gG/9zg8F6Qgw/aomGZfm44 l4DRFDlJRGpqEhTAcZB7j0+nyrsavOxMDJPkBwGybdtAx9s5 X-Developer-Key: i=dmitry.baryshkov@linaro.org; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A 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 e8c30430be33..90203a6d7270 100644 --- a/arch/arm/include/asm/cachetype.h +++ b/arch/arm/include/asm/cachetype.h @@ -81,6 +81,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" @@ -94,6 +102,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 Tue Feb 20 22:57:37 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Baryshkov X-Patchwork-Id: 774610 Received: from mail-lj1-f180.google.com (mail-lj1-f180.google.com [209.85.208.180]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 260EC153BF6 for ; Tue, 20 Feb 2024 22:57:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.180 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1708469864; cv=none; b=Xg+UZrlz0VFFT3lVZKDutohpmeKi062Qfjlph+w8MOfbCZmSs6UPXUxGB+Z+nYCKueIcmkJfMkEWJcF82b6Wl1U+IAuCZdyv7nw9E2dnY2x878l9SpVdYeQW9x4HMn48H3iAjvwMn08h4lsolWt1h9yLUZamYf3SBhiqW2pYjW8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1708469864; c=relaxed/simple; bh=znYqH4KKX5PqF5T6XnwgCw2bHRlbEzXsyiPDt8vHcKg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=b7fJ17/MQPBNpvL4r2bLGVZFCLpCkHXOGGt3ZgV9spH8KtiJiAE3CDcOr3sd2oEUDZEKgG0GBsh1pvEisGtWVsrnvBDvFmzq2pCjKG2OtnhcJO5UMrOxoOMaAOYMMJj+lsbAtsAMtyG3qIe9jlMGH9aBOGrgJVcIQ2hKVQJrOzw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=KNeC55mJ; arc=none smtp.client-ip=209.85.208.180 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="KNeC55mJ" Received: by mail-lj1-f180.google.com with SMTP id 38308e7fff4ca-2d2505352e6so10176371fa.3 for ; Tue, 20 Feb 2024 14:57:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1708469860; x=1709074660; darn=vger.kernel.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=AycSOZZElt80+nGkUPVSHZn5jQIyWVlzHRqHfSaFet8=; b=KNeC55mJiZhTnbUdQV9vjuVILTxQEQCOYmbMZI6nQZyyrA4+nfeyWeccDpTJcUgu7/ hzn53DCh5AWu1ZUG8tsfkZ8FZ4FZrbr3d2vyG/DNC3G6en+eo63YgvZYf0ogjPrqdy0o 3NRDL6+sThRKMPOg7KGiqeTRpc9zclax9W9bMvaCT8iHw9HOMEBGr/z3txIr5qg3lMDs kx2o8WdPXSDhpTaLpL6oI3Vchg4fLids6vVcBXAoW7uXP+pzsFcP/xt0MjYCW9egEbdq p+/sJ7GqZl9oHBvkUatANgjBU0jagvFpoTOaBoCBLJ2aw/9BohHdWNje+1Xw9hJaX+NT D5wg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1708469860; x=1709074660; 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=AycSOZZElt80+nGkUPVSHZn5jQIyWVlzHRqHfSaFet8=; b=CF14hEsBpBFND9NpOqmx6/Lmx+4QlYWEWaHdhyxTdhBd17Fm1x9+D6lke5CtzPFf9k 3WuU+G5VDtnnlB2HS36rlW1rwBptgeKaqD0FM/Lehb8OLFl0XDIUBPjWhJ/FN5Ddd31y XYsAHVsJaf6c2d+c07qJnpUTvEkoli65Tr/WpGIr04GWpTJEb6PuGXW1FQUW+xAnlJxj GhJHY+gvJAUIfJJuF2CviF8XpCj5oqkptBFWubM66gxLOffLe5McDiBifM8adyRADCwT coG5p7iQ/sukGjX/E+ONlP6VT/hKoNljymRMcLDx+8tmaNsAUfouEzyZBZv6iSP7GWnj 3XPg== X-Forwarded-Encrypted: i=1; AJvYcCXoFhsyCjI7D6tuoxl0IeBnoiY2jT3KZO/N9xEzGbQD6T3FHGY58lnV3DW9caIdl1zDYHwZcoM8B4yMfcrCMpSAjtz0JKYqV5Y7Nsofaw== X-Gm-Message-State: AOJu0Yxd+I+hayuAdc2sGTu9ekptqV3QgbtsaTY8bJmlXjypyEupau+K LhDjNFfweqErFd5lbvEmkby/tKFfRjb9M8Nhqf37P7MsECXAI3ODExCj5swE0gJFyMHbLdTIiWW j X-Google-Smtp-Source: AGHT+IHBCq0/5GF/mwezuBx5TnS+uOE9hdW//tO0VhHT/8WFv5KmFg6mip6f4whXUgDOaqB6Q/Y5hw== X-Received: by 2002:a2e:8782:0:b0:2d2:4637:63f with SMTP id n2-20020a2e8782000000b002d24637063fmr2090357lji.45.1708469860050; Tue, 20 Feb 2024 14:57:40 -0800 (PST) Received: from umbar.lan ([192.130.178.91]) by smtp.gmail.com with ESMTPSA id q8-20020a2e9688000000b002d24de76dffsm277990lji.100.2024.02.20.14.57.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 20 Feb 2024 14:57:39 -0800 (PST) From: Dmitry Baryshkov Date: Wed, 21 Feb 2024 00:57:37 +0200 Subject: [PATCH RESEND 2/2] ARM: implement cacheinfo support Precedence: bulk X-Mailing-List: linux-arm-msm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20240221-armv7-cacheinfo-v1-2-69dbd7f20d04@linaro.org> References: <20240221-armv7-cacheinfo-v1-0-69dbd7f20d04@linaro.org> In-Reply-To: <20240221-armv7-cacheinfo-v1-0-69dbd7f20d04@linaro.org> To: Russell King Cc: linux-arm-kernel@lists.infradead.org, linux-arm-msm@vger.kernel.org, Dmitry Baryshkov X-Mailer: b4 0.13.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=6946; i=dmitry.baryshkov@linaro.org; h=from:subject:message-id; bh=znYqH4KKX5PqF5T6XnwgCw2bHRlbEzXsyiPDt8vHcKg=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBl1S5hwYCth0hBera7/JSOcwFboMaVGKIed56og /AfC53i4xCJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCZdUuYQAKCRCLPIo+Aiko 1W96CACrFLlalqgyVcuIrd9YS9M0OUZch03Ifg7KgjMsW/CbExCdMNhz9hKoTBf+heLUA3/5A8Y 5T6ovlcsLrH1KQ7T+LBahjkFV6Wjsg8qdcFAFtkJeEB084XXnDiZ3/6newjl9QfG4IU9jypKFrC /1Ln4wKwqg5RFqKO5l/B7Zu0ggOLKyoHk1MdoLCPVwWkwL6PeAg53rehdv8XQHxfspBZ/tszDic kT8Xk1OeOoARYyMuLRAYT5F4oZ7yKlTWZuRbI3MXb6JWYnTHjBPxccNFm9yeD4p5UYihNHjkn3m LIRA7DHzOfwTvsbRe5TWGrzuiD/SQ8S3++WcMHDGIVEA/30V X-Developer-Key: i=dmitry.baryshkov@linaro.org; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A 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 | 164 +++++++++++++++++++++++++++++++++++++++++++ include/linux/cacheinfo.h | 2 +- 5 files changed, 173 insertions(+), 1 deletion(-) diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 8f47d6762ea4..cb293ddae6bb 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_FINALIZE_INIT if MMU select ARCH_HAS_CURRENT_STACK_POINTER select ARCH_HAS_DEBUG_VIRTUAL if MMU 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 771264d4726a..b39c38ee9fdb 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..878ff4d10139 --- /dev/null +++ b/arch/arm/kernel/cacheinfo.c @@ -0,0 +1,164 @@ +// 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_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 == 4) { + u32 cwg = FIELD_GET(CTR_CWG_MASK, ctr); + + return cwg ? 4 << cwg : ARCH_DMA_MINALIGN; + } else if (WARN_ON_ONCE(format != 0)) { + 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; + + /* CLIDR is not present before ARMv7/v7m */ + if (cpu_architecture() < CPU_ARCH_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 d504eb4b49ab..cb1222b8bbc8 100644 --- a/include/linux/cacheinfo.h +++ b/include/linux/cacheinfo.h @@ -132,7 +132,7 @@ static inline int get_cpu_cacheinfo_id(int cpu, int level) return -1; } -#ifdef CONFIG_ARM64 +#if defined(CONFIG_ARM64) || defined(CONFIG_ARM) #define use_arch_cache_info() (true) #else #define use_arch_cache_info() (false)