mail archive of the barebox mailing list
 help / color / mirror / Atom feed
* [PATCH 0/2] MIPS: csrc-r4k: get counter rate from devicetree
@ 2016-07-06 20:38 Antony Pavlov
  2016-07-06 20:38 ` [PATCH 1/2] of: base: import of_get_cpu_node() from linux-v4.7-rc2 Antony Pavlov
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Antony Pavlov @ 2016-07-06 20:38 UTC (permalink / raw)
  To: barebox

At the moment csrc-r4k rate is fixed to 100 MHz.
This is acceptable only for qemu-malta.

This patch introduces a devicetree-based solution
for detecting csrc-r4k counter rate.

The most notable users of this patch are AR9331-based boards.


Antony Pavlov (2):
  of: base: import of_get_cpu_node() from linux-v4.7-rc2
  MIPS: csrc-r4k: get cp0 counter rate from devicetree

 arch/mips/lib/csrc-r4k.c | 24 ++++++++++++--
 drivers/of/base.c        | 86 ++++++++++++++++++++++++++++++++++++++++++++++++
 include/of.h             | 10 ++++++
 3 files changed, 118 insertions(+), 2 deletions(-)

-- 
2.8.1


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH 1/2] of: base: import of_get_cpu_node() from linux-v4.7-rc2
  2016-07-06 20:38 [PATCH 0/2] MIPS: csrc-r4k: get counter rate from devicetree Antony Pavlov
@ 2016-07-06 20:38 ` Antony Pavlov
  2016-07-06 20:38 ` [PATCH 2/2] MIPS: csrc-r4k: get cp0 counter rate from devicetree Antony Pavlov
  2016-07-07  7:30 ` [PATCH 0/2] MIPS: csrc-r4k: get " Sascha Hauer
  2 siblings, 0 replies; 4+ messages in thread
From: Antony Pavlov @ 2016-07-06 20:38 UTC (permalink / raw)
  To: barebox

Signed-off-by: Antony Pavlov <antonynpavlov@gmail.com>
---
 drivers/of/base.c | 86 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 include/of.h      | 10 +++++++
 2 files changed, 96 insertions(+)

diff --git a/drivers/of/base.c b/drivers/of/base.c
index 3099c91..1e6c33d 100644
--- a/drivers/of/base.c
+++ b/drivers/of/base.c
@@ -380,6 +380,92 @@ const void *of_get_property(const struct device_node *np, const char *name,
 }
 EXPORT_SYMBOL(of_get_property);
 
+/*
+ * arch_match_cpu_phys_id - Match the given logical CPU and physical id
+ *
+ * @cpu: logical cpu index of a core/thread
+ * @phys_id: physical identifier of a core/thread
+ *
+ * Returns true if the physical identifier and the logical cpu index
+ * correspond to the same core/thread, false otherwise.
+ */
+static bool arch_match_cpu_phys_id(int cpu, u64 phys_id)
+{
+	return (u32)phys_id == cpu;
+}
+
+/**
+ * Checks if the given "prop_name" property holds the physical id of the
+ * core/thread corresponding to the logical cpu 'cpu'. If 'thread' is not
+ * NULL, local thread number within the core is returned in it.
+ */
+static bool __of_find_n_match_cpu_property(struct device_node *cpun,
+			const char *prop_name, int cpu, unsigned int *thread)
+{
+	const __be32 *cell;
+	int ac, prop_len, tid;
+	u64 hwid;
+
+	ac = of_n_addr_cells(cpun);
+	cell = of_get_property(cpun, prop_name, &prop_len);
+	if (!cell || !ac)
+		return false;
+	prop_len /= sizeof(*cell) * ac;
+	for (tid = 0; tid < prop_len; tid++) {
+		hwid = of_read_number(cell, ac);
+		if (arch_match_cpu_phys_id(cpu, hwid)) {
+			if (thread)
+				*thread = tid;
+			return true;
+		}
+		cell += ac;
+	}
+	return false;
+}
+
+/*
+ * arch_find_n_match_cpu_physical_id - See if the given device node is
+ * for the cpu corresponding to logical cpu 'cpu'.  Return true if so,
+ * else false.  If 'thread' is non-NULL, the local thread number within the
+ * core is returned in it.
+ */
+static bool arch_find_n_match_cpu_physical_id(struct device_node *cpun,
+					      int cpu, unsigned int *thread)
+{
+	return __of_find_n_match_cpu_property(cpun, "reg", cpu, thread);
+}
+
+/**
+ * of_get_cpu_node - Get device node associated with the given logical CPU
+ *
+ * @cpu: CPU number(logical index) for which device node is required
+ * @thread: if not NULL, local thread number within the physical core is
+ *          returned
+ *
+ * The main purpose of this function is to retrieve the device node for the
+ * given logical CPU index. It should be used to initialize the of_node in
+ * cpu device. Once of_node in cpu device is populated, all the further
+ * references can use that instead.
+ *
+ * CPU logical to physical index mapping is architecture specific and is built
+ * before booting secondary cores. This function uses arch_match_cpu_phys_id
+ * which can be overridden by architecture specific implementation.
+ *
+ * Returns a node pointer for the logical cpu with refcount incremented, use
+ * of_node_put() on it when done. Returns NULL if not found.
+ */
+struct device_node *of_get_cpu_node(int cpu, unsigned int *thread)
+{
+	struct device_node *cpun;
+
+	for_each_node_by_type(cpun, "cpu") {
+		if (arch_find_n_match_cpu_physical_id(cpun, cpu, thread))
+			return cpun;
+	}
+	return NULL;
+}
+EXPORT_SYMBOL(of_get_cpu_node);
+
 /** Checks if the given "compat" string matches one of the strings in
  * the device's "compatible" property
  */
diff --git a/include/of.h b/include/of.h
index 8c8f57a..ed6e870 100644
--- a/include/of.h
+++ b/include/of.h
@@ -111,6 +111,7 @@ extern struct property *of_find_property(const struct device_node *np,
 					const char *name, int *lenp);
 extern const void *of_get_property(const struct device_node *np,
 				const char *name, int *lenp);
+extern struct device_node *of_get_cpu_node(int cpu, unsigned int *thread);
 
 extern int of_set_property(struct device_node *node, const char *p,
 			const void *val, int len, int create);
@@ -347,6 +348,12 @@ static inline const void *of_get_property(const struct device_node *np,
 	return NULL;
 }
 
+static inline struct device_node *of_get_cpu_node(int cpu,
+					unsigned int *thread)
+{
+	return NULL;
+}
+
 static inline int of_set_property(struct device_node *node, const char *p,
 			const void *val, int len, int create)
 {
@@ -639,6 +646,9 @@ static inline struct device_node *of_find_node_by_path_or_alias(
 #define for_each_node_by_name(dn, name) \
 	for (dn = of_find_node_by_name(NULL, name); dn; \
 	     dn = of_find_node_by_name(dn, name))
+#define for_each_node_by_type(dn, type) \
+	for (dn = of_find_node_by_type(NULL, type); dn; \
+	     dn = of_find_node_by_type(dn, type))
 #define for_each_node_by_name_from(dn, root, name) \
 	for (dn = of_find_node_by_name(root, name); dn; \
 	     dn = of_find_node_by_name(dn, name))
-- 
2.8.1


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH 2/2] MIPS: csrc-r4k: get cp0 counter rate from devicetree
  2016-07-06 20:38 [PATCH 0/2] MIPS: csrc-r4k: get counter rate from devicetree Antony Pavlov
  2016-07-06 20:38 ` [PATCH 1/2] of: base: import of_get_cpu_node() from linux-v4.7-rc2 Antony Pavlov
@ 2016-07-06 20:38 ` Antony Pavlov
  2016-07-07  7:30 ` [PATCH 0/2] MIPS: csrc-r4k: get " Sascha Hauer
  2 siblings, 0 replies; 4+ messages in thread
From: Antony Pavlov @ 2016-07-06 20:38 UTC (permalink / raw)
  To: barebox

Signed-off-by: Antony Pavlov <antonynpavlov@gmail.com>
---
 arch/mips/lib/csrc-r4k.c | 24 ++++++++++++++++++++++--
 1 file changed, 22 insertions(+), 2 deletions(-)

diff --git a/arch/mips/lib/csrc-r4k.c b/arch/mips/lib/csrc-r4k.c
index 5c3f18f..6f6e18c 100644
--- a/arch/mips/lib/csrc-r4k.c
+++ b/arch/mips/lib/csrc-r4k.c
@@ -21,6 +21,8 @@
  */
 
 #include <init.h>
+#include <of.h>
+#include <linux/clk.h>
 #include <clock.h>
 #include <io.h>
 #include <asm/mipsregs.h>
@@ -37,8 +39,26 @@ static struct clocksource cs = {
 
 static int clocksource_init(void)
 {
-	cs.mult = clocksource_hz2mult(100000000, cs.shift);
+	unsigned int mips_hpt_frequency;
+	struct device_node *np;
+	struct clk *clk;
+
+	/* default rate: 100 MHz */
+	mips_hpt_frequency = 100000000;
+
+	if (IS_ENABLED(CONFIG_OFTREE)) {
+		np = of_get_cpu_node(0, NULL);
+		if (np) {
+			clk = of_clk_get(np, 0);
+			if (!IS_ERR(clk)) {
+				mips_hpt_frequency = clk_get_rate(clk) / 2;
+			}
+		}
+	}
+
+	clocks_calc_mult_shift(&cs.mult, &cs.shift,
+		mips_hpt_frequency, NSEC_PER_SEC, 10);
 
 	return init_clock(&cs);
 }
-core_initcall(clocksource_init);
+postcore_initcall(clocksource_init);
-- 
2.8.1


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH 0/2] MIPS: csrc-r4k: get counter rate from devicetree
  2016-07-06 20:38 [PATCH 0/2] MIPS: csrc-r4k: get counter rate from devicetree Antony Pavlov
  2016-07-06 20:38 ` [PATCH 1/2] of: base: import of_get_cpu_node() from linux-v4.7-rc2 Antony Pavlov
  2016-07-06 20:38 ` [PATCH 2/2] MIPS: csrc-r4k: get cp0 counter rate from devicetree Antony Pavlov
@ 2016-07-07  7:30 ` Sascha Hauer
  2 siblings, 0 replies; 4+ messages in thread
From: Sascha Hauer @ 2016-07-07  7:30 UTC (permalink / raw)
  To: Antony Pavlov; +Cc: barebox

On Wed, Jul 06, 2016 at 11:38:24PM +0300, Antony Pavlov wrote:
> At the moment csrc-r4k rate is fixed to 100 MHz.
> This is acceptable only for qemu-malta.
> 
> This patch introduces a devicetree-based solution
> for detecting csrc-r4k counter rate.
> 
> The most notable users of this patch are AR9331-based boards.
> 
> 
> Antony Pavlov (2):
>   of: base: import of_get_cpu_node() from linux-v4.7-rc2
>   MIPS: csrc-r4k: get cp0 counter rate from devicetree

Applied, thanks

Sascha

> 
>  arch/mips/lib/csrc-r4k.c | 24 ++++++++++++--
>  drivers/of/base.c        | 86 ++++++++++++++++++++++++++++++++++++++++++++++++
>  include/of.h             | 10 ++++++
>  3 files changed, 118 insertions(+), 2 deletions(-)
> 
> -- 
> 2.8.1
> 
> 

-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2016-07-07  7:30 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-07-06 20:38 [PATCH 0/2] MIPS: csrc-r4k: get counter rate from devicetree Antony Pavlov
2016-07-06 20:38 ` [PATCH 1/2] of: base: import of_get_cpu_node() from linux-v4.7-rc2 Antony Pavlov
2016-07-06 20:38 ` [PATCH 2/2] MIPS: csrc-r4k: get cp0 counter rate from devicetree Antony Pavlov
2016-07-07  7:30 ` [PATCH 0/2] MIPS: csrc-r4k: get " Sascha Hauer

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox