From mboxrd@z Thu Jan 1 00:00:00 1970 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 kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id C4CBDC77B7C for ; Tue, 24 Jun 2025 15:49:14 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 5A0456B00BA; Tue, 24 Jun 2025 11:49:14 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 529196B00BD; Tue, 24 Jun 2025 11:49:14 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 4181B6B00BE; Tue, 24 Jun 2025 11:49:14 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0013.hostedemail.com [216.40.44.13]) by kanga.kvack.org (Postfix) with ESMTP id 2F9CA6B00BA for ; Tue, 24 Jun 2025 11:49:14 -0400 (EDT) Received: from smtpin22.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay06.hostedemail.com (Postfix) with ESMTP id D5CCC104B54 for ; Tue, 24 Jun 2025 15:49:13 +0000 (UTC) X-FDA: 83590728186.22.B0BFFE4 Received: from frasgout.his.huawei.com (frasgout.his.huawei.com [185.176.79.56]) by imf08.hostedemail.com (Postfix) with ESMTP id E82B4160013 for ; Tue, 24 Jun 2025 15:49:11 +0000 (UTC) Authentication-Results: imf08.hostedemail.com; dkim=none; spf=pass (imf08.hostedemail.com: domain of jonathan.cameron@huawei.com designates 185.176.79.56 as permitted sender) smtp.mailfrom=jonathan.cameron@huawei.com; dmarc=pass (policy=quarantine) header.from=huawei.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1750780152; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=ca3UcDl1zOIo+8XtbXTq634i3NsU5jZbqdlOm4MtkTc=; b=UitJKunvBo9KrLPoSpfQnDdhprNQqTglqHzfFo68gVr5/SfJE/JwgRMhipBdnKbdozCUkY ZETwnD7lOAW5Ul4ilQGMpwB/DVwb9iAopBGnVhoR7iK4MnfVLX9VG8awgc3GGfcITjrUWy XQlYSfSkJiWVwf3j2Jop0PT7kMInkgA= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1750780152; a=rsa-sha256; cv=none; b=6XAYraRURlhFUC8lb05Xv1qn20osnQsBjqeFjqo7N2gWNyV39KkO3gRxu2MWEp3lzTLvxD vUQCpuHcxzYeD66HCIyAxPETWxDs7QO8A8pP4F9pG35cAeDphNYHqf92fHd3OfUpZdmIIw gFisTYzUjcmMOiS8SUZWSpfKEkC1FJM= ARC-Authentication-Results: i=1; imf08.hostedemail.com; dkim=none; spf=pass (imf08.hostedemail.com: domain of jonathan.cameron@huawei.com designates 185.176.79.56 as permitted sender) smtp.mailfrom=jonathan.cameron@huawei.com; dmarc=pass (policy=quarantine) header.from=huawei.com Received: from mail.maildlp.com (unknown [172.18.186.216]) by frasgout.his.huawei.com (SkyGuard) with ESMTP id 4bRTlG0cDmz6J6l2; Tue, 24 Jun 2025 23:44:10 +0800 (CST) Received: from frapeml500008.china.huawei.com (unknown [7.182.85.71]) by mail.maildlp.com (Postfix) with ESMTPS id C993C1402EA; Tue, 24 Jun 2025 23:49:09 +0800 (CST) Received: from SecurePC-101-06.china.huawei.com (10.122.19.247) by frapeml500008.china.huawei.com (7.182.85.71) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2507.39; Tue, 24 Jun 2025 17:49:08 +0200 From: Jonathan Cameron To: Catalin Marinas , , , , , , , , Will Deacon , Dan Williams , Davidlohr Bueso CC: Yicong Yang , , Yushan Wang , Lorenzo Pieralisi , Mark Rutland , Dave Hansen , Thomas Gleixner , Ingo Molnar , Borislav Petkov , , H Peter Anvin , Andy Lutomirski , Peter Zijlstra Subject: [PATCH v2 2/8] generic: Support ARCH_HAS_CPU_CACHE_INVALIDATE_MEMREGION Date: Tue, 24 Jun 2025 16:47:58 +0100 Message-ID: <20250624154805.66985-3-Jonathan.Cameron@huawei.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250624154805.66985-1-Jonathan.Cameron@huawei.com> References: <20250624154805.66985-1-Jonathan.Cameron@huawei.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-Originating-IP: [10.122.19.247] X-ClientProxiedBy: lhrpeml500004.china.huawei.com (7.191.163.9) To frapeml500008.china.huawei.com (7.182.85.71) X-Rspamd-Queue-Id: E82B4160013 X-Rspam-User: X-Rspamd-Server: rspam06 X-Stat-Signature: 4b3anz3n8m5ozsjq3m681h656z863ogy X-HE-Tag: 1750780151-822146 X-HE-Meta: U2FsdGVkX188ic5oUOnIRK1hrWxJSaLnXfeHRzrC6zVE2LW4WMNJ7dFWVWH38FWNL8a+iFYOkY6ynYG7MP0pg2n7DlXkZ5NL5ooKK8Ngk0gnjfeozy/U7Fxy/+1qpj6AOqCmKyXXUIpmTOI4hPhlyw5ssod2rysKAMVIt/i8xrmrWLaY9c3LU3yyJPEj+wAvQcVNvjPgtJCJyqheRevxTpeHquW8k+CtlQVF7iTX4SZ436R1V0/VBEyWpVP8XbgUkgrr6SCsMFy7CcTikEjdBy/lf7sVsb/idxlxDYHUYnelHBx98vao91C0MCKDj9lfUQ/PhqvbOKZcoz111AJSXxjvHQFV+Et9kN6rjfQq+D1PxIkJdt0FY/iz02rm4+X/gI+bug3TNtnVjeHkmdF1kv229zcFbLsmea+KoiuTi6+Bt1N6hhPRKqmtBwerM3h5WMilqpLZysG1eZH0PaJmgoTPG2ot1mzAbFbVYFbHtLXCxKC8WTX3jqfOffjES6ANbANHjvbwankOY6nJByq6/no9WFkNjo6hY1rImlLM7qbkyC6FAfEQLeue+vbLn7vLoCSawDogNHGXMUAIuKuGb4x2cWqVQSQ21lCZMlpqRdK2aZUes1JwXHSheic8O2wtAVWNE5+5hFQl8+ZQjLw/jn4WumHMlqKcc8UgdcExjeXGRP1RPZLpOcEw6/SEQhD98k+qlRXO/wFbZFsr4R63aHLxJktpG9F5nRRYLzwqanV3jc7kpxVuNzPytmpZBrx4J1rq8QCYDSZAYdTnY8u2A4g7gSCTzIePeg+a2YPVHtx8Z9Ol6pBIZR6XagrBLitx0zYqgLyBtyWgRSBHxH6qTDo/71FYNPouJ/7qO9LY1XpWccaqeS3UqejhkNGcd0rnhLejW+DOQ+kZ821xl7XCiXxP4ET3aGvTNEUF29LmDVqJgoscYzWMo3sygymPUyMCTsNL8i1IV/Z1trxJfMi wfs9kWlC wHN9rWMyAsolpx3DwK1uMGbbR6d4cBkYqjOJDlGBp1c50fUxKgNM8KMXA7eU0hsoZJ2fMHqauShULt6UJsY2SUGuhnOKfLbkjuVwAORqz9uvIbAi/GfUS64oxFQHRc9mbmGuy+46UYNNqo5bdsHTpGN0I+Wg/L5pB4gXibSRl7YJgntfk2F4Flj0jqYqsij4tlpKMQQPhZzILIS1BTIG1yme4xAfpv3OFxTNRnuh5XKA7xERi1Exr3ffngl2/frKziq80opVl8OsOvlg35q+jth13HVbAsWOb06nNmcZQjXWplg4Yi2qk+98oFR+VvzZlfo+TNZKRZ2FABW8= X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: From: Yicong Yang ARCH_HAS_CPU_CACHE_INVALIDATE_MEMREGION provides the mechanism for invalidate certain memory regions in a cache-incoherent manner. Currently is used by NVIDMM adn CXL memory. This is mainly done by the system component and is implementation define per spec. Provides a method for the platforms register their own invalidate method and implement ARCH_HAS_CPU_CACHE_INVALIDATE_MEMREGION. Architectures can opt in for this support via CONFIG_GENERIC_CPU_CACHE_INVALIDATE_MEMREGION. Signed-off-by: Yicong Yang Signed-off-by: Jonathan Cameron --- drivers/base/Kconfig | 3 +++ drivers/base/Makefile | 1 + drivers/base/cache.c | 46 ++++++++++++++++++++++++++++++++ include/asm-generic/cacheflush.h | 12 +++++++++ 4 files changed, 62 insertions(+) diff --git a/drivers/base/Kconfig b/drivers/base/Kconfig index 064eb52ff7e2..cc6df87a0a96 100644 --- a/drivers/base/Kconfig +++ b/drivers/base/Kconfig @@ -181,6 +181,9 @@ config SYS_HYPERVISOR bool default n +config GENERIC_CPU_CACHE_INVALIDATE_MEMREGION + bool + config GENERIC_CPU_DEVICES bool default n diff --git a/drivers/base/Makefile b/drivers/base/Makefile index 8074a10183dc..0fbfa4300b98 100644 --- a/drivers/base/Makefile +++ b/drivers/base/Makefile @@ -26,6 +26,7 @@ obj-$(CONFIG_DEV_COREDUMP) += devcoredump.o obj-$(CONFIG_GENERIC_MSI_IRQ) += platform-msi.o obj-$(CONFIG_GENERIC_ARCH_TOPOLOGY) += arch_topology.o obj-$(CONFIG_GENERIC_ARCH_NUMA) += arch_numa.o +obj-$(CONFIG_GENERIC_CPU_CACHE_INVALIDATE_MEMREGION) += cache.o obj-$(CONFIG_ACPI) += physical_location.o obj-y += test/ diff --git a/drivers/base/cache.c b/drivers/base/cache.c new file mode 100644 index 000000000000..8d351657bbef --- /dev/null +++ b/drivers/base/cache.c @@ -0,0 +1,46 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Generic support for CPU Cache Invalidate Memregion + */ + +#include +#include +#include + + +static const struct system_cache_flush_method *scfm_data; +DEFINE_SPINLOCK(scfm_lock); + +void generic_set_sys_cache_flush_method(const struct system_cache_flush_method *method) +{ + guard(spinlock_irqsave)(&scfm_lock); + if (scfm_data || !method || !method->invalidate_memregion) + return; + + scfm_data = method; +} +EXPORT_SYMBOL_GPL(generic_set_sys_cache_flush_method); + +void generic_clr_sys_cache_flush_method(const struct system_cache_flush_method *method) +{ + guard(spinlock_irqsave)(&scfm_lock); + if (scfm_data && scfm_data == method) + scfm_data = NULL; +} + +int cpu_cache_invalidate_memregion(int res_desc, phys_addr_t start, size_t len) +{ + guard(spinlock_irqsave)(&scfm_lock); + if (!scfm_data) + return -EOPNOTSUPP; + + return scfm_data->invalidate_memregion(res_desc, start, len); +} +EXPORT_SYMBOL_NS_GPL(cpu_cache_invalidate_memregion, "DEVMEM"); + +bool cpu_cache_has_invalidate_memregion(void) +{ + guard(spinlock_irqsave)(&scfm_lock); + return !!scfm_data; +} +EXPORT_SYMBOL_NS_GPL(cpu_cache_has_invalidate_memregion, "DEVMEM"); diff --git a/include/asm-generic/cacheflush.h b/include/asm-generic/cacheflush.h index 7ee8a179d103..87e64295561e 100644 --- a/include/asm-generic/cacheflush.h +++ b/include/asm-generic/cacheflush.h @@ -124,4 +124,16 @@ static inline void flush_cache_vunmap(unsigned long start, unsigned long end) } while (0) #endif +#ifdef CONFIG_GENERIC_CPU_CACHE_INVALIDATE_MEMREGION + +struct system_cache_flush_method { + int (*invalidate_memregion)(int res_desc, + phys_addr_t start, size_t len); +}; + +void generic_set_sys_cache_flush_method(const struct system_cache_flush_method *method); +void generic_clr_sys_cache_flush_method(const struct system_cache_flush_method *method); + +#endif /* CONFIG_GENERIC_CPU_CACHE_INVALIDATE_MEMREGION */ + #endif /* _ASM_GENERIC_CACHEFLUSH_H */ -- 2.48.1