lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20231231-cpu-cacheinfo-of-v1-1-cd3584d2c7b4@linaro.org>
Date: Sun, 31 Dec 2023 19:30:56 +0200
From: Dmitry Baryshkov <dmitry.baryshkov@...aro.org>
To: Greg Kroah-Hartman <gregkh@...uxfoundation.org>, 
 "Rafael J. Wysocki" <rafael@...nel.org>, 
 Thomas Gleixner <tglx@...utronix.de>, Peter Zijlstra <peterz@...radead.org>, 
 Rob Herring <robh@...nel.org>
Cc: linux-kernel@...r.kernel.org, linux-arm-msm@...r.kernel.org, 
 Dmitry Baryshkov <dmitry.baryshkov@...aro.org>
Subject: [PATCH 1/2] cpu: allow matching cpu_subsys devices against OF
 nodes

Currently cpu_sybsys devices support only ACPI style matching.
Pass DT node pointer to cpu_device_create to support OF style matching
for cpu_subsys devices.

Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@...aro.org>
---
 drivers/base/cacheinfo.c |  6 ++++--
 drivers/base/cpu.c       | 15 ++++++++++++---
 include/linux/cpu.h      |  3 ++-
 3 files changed, 18 insertions(+), 6 deletions(-)

diff --git a/drivers/base/cacheinfo.c b/drivers/base/cacheinfo.c
index f1e79263fe61..a72c69e70fa3 100644
--- a/drivers/base/cacheinfo.c
+++ b/drivers/base/cacheinfo.c
@@ -845,7 +845,7 @@ static int cpu_cache_sysfs_init(unsigned int cpu)
 	if (per_cpu_cacheinfo(cpu) == NULL)
 		return -ENOENT;
 
-	per_cpu_cache_dev(cpu) = cpu_device_create(dev, NULL, NULL, "cache");
+	per_cpu_cache_dev(cpu) = cpu_device_create(dev, NULL, NULL, NULL, "cache");
 	if (IS_ERR(per_cpu_cache_dev(cpu)))
 		return PTR_ERR(per_cpu_cache_dev(cpu));
 
@@ -882,7 +882,9 @@ static int cache_add_dev(unsigned int cpu)
 		if (this_leaf->type == CACHE_TYPE_NOCACHE)
 			break;
 		cache_groups = cache_get_attribute_groups(this_leaf);
-		ci_dev = cpu_device_create(parent, this_leaf, cache_groups,
+		ci_dev = cpu_device_create(parent, this_leaf,
+					   NULL,
+					   cache_groups,
 					   "index%1u", i);
 		if (IS_ERR(ci_dev)) {
 			rc = PTR_ERR(ci_dev);
diff --git a/drivers/base/cpu.c b/drivers/base/cpu.c
index 47de0f140ba6..d7db38fbfc17 100644
--- a/drivers/base/cpu.c
+++ b/drivers/base/cpu.c
@@ -16,6 +16,7 @@
 #include <linux/percpu.h>
 #include <linux/acpi.h>
 #include <linux/of.h>
+#include <linux/of_device.h>
 #include <linux/cpufeature.h>
 #include <linux/tick.h>
 #include <linux/pm_qos.h>
@@ -28,7 +29,11 @@ static DEFINE_PER_CPU(struct device *, cpu_sys_devices);
 
 static int cpu_subsys_match(struct device *dev, struct device_driver *drv)
 {
-	/* ACPI style match is the only one that may succeed. */
+	/* Attempt an OF style match first */
+	if (of_driver_match_device(dev, drv))
+		return 1;
+
+	/* Then try ACPI style match */
 	if (acpi_driver_match_device(dev, drv))
 		return 1;
 
@@ -428,12 +433,14 @@ EXPORT_SYMBOL_GPL(get_cpu_device);
 
 static void device_create_release(struct device *dev)
 {
+	of_node_put(dev->of_node);
 	kfree(dev);
 }
 
-__printf(4, 0)
+__printf(5, 0)
 static struct device *
 __cpu_device_create(struct device *parent, void *drvdata,
+		    struct device_node *np,
 		    const struct attribute_group **groups,
 		    const char *fmt, va_list args)
 {
@@ -447,6 +454,7 @@ __cpu_device_create(struct device *parent, void *drvdata,
 	device_initialize(dev);
 	dev->parent = parent;
 	dev->groups = groups;
+	dev->of_node = of_node_get(np);
 	dev->release = device_create_release;
 	device_set_pm_not_required(dev);
 	dev_set_drvdata(dev, drvdata);
@@ -467,6 +475,7 @@ __cpu_device_create(struct device *parent, void *drvdata,
 }
 
 struct device *cpu_device_create(struct device *parent, void *drvdata,
+				 struct device_node *np,
 				 const struct attribute_group **groups,
 				 const char *fmt, ...)
 {
@@ -474,7 +483,7 @@ struct device *cpu_device_create(struct device *parent, void *drvdata,
 	struct device *dev;
 
 	va_start(vargs, fmt);
-	dev = __cpu_device_create(parent, drvdata, groups, fmt, vargs);
+	dev = __cpu_device_create(parent, drvdata, np, groups, fmt, vargs);
 	va_end(vargs);
 	return dev;
 }
diff --git a/include/linux/cpu.h b/include/linux/cpu.h
index dcb89c987164..6ae291080e4a 100644
--- a/include/linux/cpu.h
+++ b/include/linux/cpu.h
@@ -76,8 +76,9 @@ extern ssize_t cpu_show_spec_rstack_overflow(struct device *dev,
 extern ssize_t cpu_show_gds(struct device *dev,
 			    struct device_attribute *attr, char *buf);
 
-extern __printf(4, 5)
+extern __printf(5, 6)
 struct device *cpu_device_create(struct device *parent, void *drvdata,
+				 struct device_node *np,
 				 const struct attribute_group **groups,
 				 const char *fmt, ...);
 extern bool arch_cpu_is_hotpluggable(int cpu);

-- 
2.39.2


Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ