All of lore.kernel.org
 help / color / mirror / Atom feed
From: Suraj Jitindar Singh <sjitindarsingh@gmail.com>
To: kvm@vger.kernel.org
Cc: sjitindarsingh@gmail.com, pbonzini@redhat.com,
	rkrcmar@redhat.com, kvm-ppc@vger.kernel.org, lvivier@redhat.com,
	thuth@redhat.com, drjones@redhat.com
Subject: [kvm-unit-tests PATCH V3 4/5] lib/powerpc: Implement generic sleep function for use in unit tests
Date: Tue, 16 Aug 2016 17:18:14 +1000	[thread overview]
Message-ID: <1471331895-29887-4-git-send-email-sjitindarsingh@gmail.com> (raw)
In-Reply-To: <1471331895-29887-1-git-send-email-sjitindarsingh@gmail.com>

It would be nice if we had a generic sleep function which could be used
in unit tests, add one.

Add the variable tb_hz used to store the time base frequency which is read
from the device tree on setup.

Add functions msleep, usleep and sleep in processor.c to sleep for a given
number of milliseconds, microseconds and time base ticks respectively.

Signed-off-by: Suraj Jitindar Singh <sjitindarsingh@gmail.com>
---

Change Log:

V2 -> V3:
	- Add patch to series

Signed-off-by: Suraj Jitindar Singh <sjitindarsingh@gmail.com>
---
 lib/powerpc/asm/processor.h | 19 +++++++++++++++++++
 lib/powerpc/asm/setup.h     |  2 ++
 lib/powerpc/processor.c     | 13 +++++++++++++
 lib/powerpc/setup.c         | 12 ++++++++++++
 4 files changed, 46 insertions(+)

diff --git a/lib/powerpc/asm/processor.h b/lib/powerpc/asm/processor.h
index 09692bd..9554e08 100644
--- a/lib/powerpc/asm/processor.h
+++ b/lib/powerpc/asm/processor.h
@@ -1,11 +1,30 @@
 #ifndef _ASMPOWERPC_PROCESSOR_H_
 #define _ASMPOWERPC_PROCESSOR_H_
 
+#include <libcflat.h>
 #include <asm/ptrace.h>
 
+#define cpu_relax() asm volatile ("" : : : "memory")
+
 #ifndef __ASSEMBLY__
 void handle_exception(int trap, void (*func)(struct pt_regs *, void *), void *);
 void do_handle_exception(struct pt_regs *regs);
 #endif /* __ASSEMBLY__ */
 
+static inline uint64_t get_tb(void)
+{
+	uint64_t tb;
+	asm volatile ("mfspr %[tb],268" : [tb] "=r" (tb));
+	return tb;
+}
+
+extern void delay(uint64_t cycles);
+extern void udelay(uint64_t us);
+
+static inline void mdelay(uint64_t ms)
+{
+	while (ms--)
+		udelay(1000);
+}
+
 #endif /* _ASMPOWERPC_PROCESSOR_H_ */
diff --git a/lib/powerpc/asm/setup.h b/lib/powerpc/asm/setup.h
index b1e1e5a..23b4156 100644
--- a/lib/powerpc/asm/setup.h
+++ b/lib/powerpc/asm/setup.h
@@ -11,6 +11,8 @@
 extern u32 cpus[NR_CPUS];
 extern int nr_cpus;
 
+extern uint64_t tb_hz;
+
 #define NR_MEM_REGIONS		8
 #define MR_F_PRIMARY		(1U << 0)
 struct mem_region {
diff --git a/lib/powerpc/processor.c b/lib/powerpc/processor.c
index a78bc3c..c84bae5 100644
--- a/lib/powerpc/processor.c
+++ b/lib/powerpc/processor.c
@@ -5,6 +5,7 @@
 #include <libcflat.h>
 #include <asm/processor.h>
 #include <asm/ptrace.h>
+#include <asm/setup.h>
 
 static struct {
 	void (*func)(struct pt_regs *, void *data);
@@ -36,3 +37,15 @@ void do_handle_exception(struct pt_regs *regs)
 	printf("unhandled cpu exception 0x%lx\n", regs->trap);
 	abort();
 }
+
+void delay(uint64_t cycles)
+{
+	uint64_t start = get_tb();
+	while((get_tb() - start) < cycles)
+		cpu_relax();
+}
+
+void udelay(uint64_t us)
+{
+	delay((us * tb_hz) / 1000000);
+}
diff --git a/lib/powerpc/setup.c b/lib/powerpc/setup.c
index e3d2afa..e7fa525 100644
--- a/lib/powerpc/setup.c
+++ b/lib/powerpc/setup.c
@@ -24,6 +24,7 @@ extern void setup_args_progname(const char *args);
 
 u32 cpus[NR_CPUS] = { [0 ... NR_CPUS-1] = (~0U) };
 int nr_cpus;
+uint64_t tb_hz;
 
 struct mem_region mem_regions[NR_MEM_REGIONS];
 phys_addr_t __physical_start, __physical_end;
@@ -51,6 +52,17 @@ static void cpu_set(int fdtnode, u32 regval, void *info)
 	}
 	cpus[cpu] = regval;
 
+	/* set timebase frequency */
+	if (!tb_hz) {
+		const struct fdt_property *prop;
+		u32 *data;
+		prop = fdt_get_property(dt_fdt(), fdtnode,
+					"timebase-frequency", NULL);
+		assert(prop != NULL);
+		data = (u32 *)prop->data;
+		tb_hz = fdt32_to_cpu(*data);
+	}
+
 	/* set exception stack address for this CPU (in SPGR0) */
 
 	asm volatile ("mtsprg0 %[addr]" ::
-- 
2.5.5


WARNING: multiple messages have this Message-ID (diff)
From: Suraj Jitindar Singh <sjitindarsingh@gmail.com>
To: kvm@vger.kernel.org
Cc: sjitindarsingh@gmail.com, pbonzini@redhat.com,
	rkrcmar@redhat.com, kvm-ppc@vger.kernel.org, lvivier@redhat.com,
	thuth@redhat.com, drjones@redhat.com
Subject: [kvm-unit-tests PATCH V3 4/5] lib/powerpc: Implement generic sleep function for use in unit tests
Date: Tue, 16 Aug 2016 07:18:14 +0000	[thread overview]
Message-ID: <1471331895-29887-4-git-send-email-sjitindarsingh@gmail.com> (raw)
In-Reply-To: <1471331895-29887-1-git-send-email-sjitindarsingh@gmail.com>

It would be nice if we had a generic sleep function which could be used
in unit tests, add one.

Add the variable tb_hz used to store the time base frequency which is read
from the device tree on setup.

Add functions msleep, usleep and sleep in processor.c to sleep for a given
number of milliseconds, microseconds and time base ticks respectively.

Signed-off-by: Suraj Jitindar Singh <sjitindarsingh@gmail.com>
---

Change Log:

V2 -> V3:
	- Add patch to series

Signed-off-by: Suraj Jitindar Singh <sjitindarsingh@gmail.com>
---
 lib/powerpc/asm/processor.h | 19 +++++++++++++++++++
 lib/powerpc/asm/setup.h     |  2 ++
 lib/powerpc/processor.c     | 13 +++++++++++++
 lib/powerpc/setup.c         | 12 ++++++++++++
 4 files changed, 46 insertions(+)

diff --git a/lib/powerpc/asm/processor.h b/lib/powerpc/asm/processor.h
index 09692bd..9554e08 100644
--- a/lib/powerpc/asm/processor.h
+++ b/lib/powerpc/asm/processor.h
@@ -1,11 +1,30 @@
 #ifndef _ASMPOWERPC_PROCESSOR_H_
 #define _ASMPOWERPC_PROCESSOR_H_
 
+#include <libcflat.h>
 #include <asm/ptrace.h>
 
+#define cpu_relax() asm volatile ("" : : : "memory")
+
 #ifndef __ASSEMBLY__
 void handle_exception(int trap, void (*func)(struct pt_regs *, void *), void *);
 void do_handle_exception(struct pt_regs *regs);
 #endif /* __ASSEMBLY__ */
 
+static inline uint64_t get_tb(void)
+{
+	uint64_t tb;
+	asm volatile ("mfspr %[tb],268" : [tb] "=r" (tb));
+	return tb;
+}
+
+extern void delay(uint64_t cycles);
+extern void udelay(uint64_t us);
+
+static inline void mdelay(uint64_t ms)
+{
+	while (ms--)
+		udelay(1000);
+}
+
 #endif /* _ASMPOWERPC_PROCESSOR_H_ */
diff --git a/lib/powerpc/asm/setup.h b/lib/powerpc/asm/setup.h
index b1e1e5a..23b4156 100644
--- a/lib/powerpc/asm/setup.h
+++ b/lib/powerpc/asm/setup.h
@@ -11,6 +11,8 @@
 extern u32 cpus[NR_CPUS];
 extern int nr_cpus;
 
+extern uint64_t tb_hz;
+
 #define NR_MEM_REGIONS		8
 #define MR_F_PRIMARY		(1U << 0)
 struct mem_region {
diff --git a/lib/powerpc/processor.c b/lib/powerpc/processor.c
index a78bc3c..c84bae5 100644
--- a/lib/powerpc/processor.c
+++ b/lib/powerpc/processor.c
@@ -5,6 +5,7 @@
 #include <libcflat.h>
 #include <asm/processor.h>
 #include <asm/ptrace.h>
+#include <asm/setup.h>
 
 static struct {
 	void (*func)(struct pt_regs *, void *data);
@@ -36,3 +37,15 @@ void do_handle_exception(struct pt_regs *regs)
 	printf("unhandled cpu exception 0x%lx\n", regs->trap);
 	abort();
 }
+
+void delay(uint64_t cycles)
+{
+	uint64_t start = get_tb();
+	while((get_tb() - start) < cycles)
+		cpu_relax();
+}
+
+void udelay(uint64_t us)
+{
+	delay((us * tb_hz) / 1000000);
+}
diff --git a/lib/powerpc/setup.c b/lib/powerpc/setup.c
index e3d2afa..e7fa525 100644
--- a/lib/powerpc/setup.c
+++ b/lib/powerpc/setup.c
@@ -24,6 +24,7 @@ extern void setup_args_progname(const char *args);
 
 u32 cpus[NR_CPUS] = { [0 ... NR_CPUS-1] = (~0U) };
 int nr_cpus;
+uint64_t tb_hz;
 
 struct mem_region mem_regions[NR_MEM_REGIONS];
 phys_addr_t __physical_start, __physical_end;
@@ -51,6 +52,17 @@ static void cpu_set(int fdtnode, u32 regval, void *info)
 	}
 	cpus[cpu] = regval;
 
+	/* set timebase frequency */
+	if (!tb_hz) {
+		const struct fdt_property *prop;
+		u32 *data;
+		prop = fdt_get_property(dt_fdt(), fdtnode,
+					"timebase-frequency", NULL);
+		assert(prop != NULL);
+		data = (u32 *)prop->data;
+		tb_hz = fdt32_to_cpu(*data);
+	}
+
 	/* set exception stack address for this CPU (in SPGR0) */
 
 	asm volatile ("mtsprg0 %[addr]" ::
-- 
2.5.5


  parent reply	other threads:[~2016-08-16  7:18 UTC|newest]

Thread overview: 36+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-08-16  7:18 [kvm-unit-tests PATCH V3 1/5] scripts/runtime: Add ability to mark test as don't run by default Suraj Jitindar Singh
2016-08-16  7:18 ` Suraj Jitindar Singh
2016-08-16  7:18 ` [kvm-unit-tests PATCH V3 2/5] lib/powerpc: Add generic decrementer exception handler Suraj Jitindar Singh
2016-08-16  7:18   ` Suraj Jitindar Singh
2016-08-16 12:05   ` Andrew Jones
2016-08-16 12:05     ` Andrew Jones
2016-08-16  7:18 ` [kvm-unit-tests PATCH V3 3/5] lib/powerpc: Add function to start secondary threads Suraj Jitindar Singh
2016-08-16  7:18   ` Suraj Jitindar Singh
2016-08-16 12:27   ` Andrew Jones
2016-08-16 12:27     ` Andrew Jones
2016-08-17  4:18     ` Suraj Jitindar Singh
2016-08-17  4:18       ` Suraj Jitindar Singh
2016-08-16  7:18 ` Suraj Jitindar Singh [this message]
2016-08-16  7:18   ` [kvm-unit-tests PATCH V3 4/5] lib/powerpc: Implement generic sleep function for use in unit tests Suraj Jitindar Singh
2016-08-16 12:41   ` Andrew Jones
2016-08-16 12:41     ` [kvm-unit-tests PATCH V3 4/5] lib/powerpc: Implement generic sleep function for use in unit test Andrew Jones
2016-08-17  4:57     ` [kvm-unit-tests PATCH V3 4/5] lib/powerpc: Implement generic sleep function for use in unit tests Suraj Jitindar Singh
2016-08-17  4:57       ` [kvm-unit-tests PATCH V3 4/5] lib/powerpc: Implement generic sleep function for use in unit test Suraj Jitindar Singh
2016-08-16 12:54   ` [kvm-unit-tests PATCH V3 4/5] lib/powerpc: Implement generic sleep function for use in unit tests Thomas Huth
2016-08-16 12:54     ` [kvm-unit-tests PATCH V3 4/5] lib/powerpc: Implement generic sleep function for use in unit test Thomas Huth
2016-08-17  5:02     ` [kvm-unit-tests PATCH V3 4/5] lib/powerpc: Implement generic sleep function for use in unit tests Suraj Jitindar Singh
2016-08-17  5:02       ` [kvm-unit-tests PATCH V3 4/5] lib/powerpc: Implement generic sleep function for use in unit test Suraj Jitindar Singh
2016-08-16  7:18 ` [kvm-unit-tests PATCH V3 5/5] powerpc/tm: Add a test for H_CEDE while tm suspended Suraj Jitindar Singh
2016-08-16  7:18   ` Suraj Jitindar Singh
2016-08-16 12:57   ` Andrew Jones
2016-08-16 12:57     ` Andrew Jones
2016-08-17  6:07     ` Suraj Jitindar Singh
2016-08-17  6:07       ` Suraj Jitindar Singh
2016-08-16 12:00 ` [kvm-unit-tests PATCH V3 1/5] scripts/runtime: Add ability to mark test as don't run by default Andrew Jones
2016-08-16 12:00   ` Andrew Jones
2016-08-16 16:03   ` Radim Krčmář
2016-08-16 16:03     ` Radim Krčmář
2016-08-17  3:35     ` Suraj Jitindar Singh
2016-08-17  3:35       ` Suraj Jitindar Singh
2016-08-17  3:14   ` Suraj Jitindar Singh
2016-08-17  3:14     ` Suraj Jitindar Singh

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1471331895-29887-4-git-send-email-sjitindarsingh@gmail.com \
    --to=sjitindarsingh@gmail.com \
    --cc=drjones@redhat.com \
    --cc=kvm-ppc@vger.kernel.org \
    --cc=kvm@vger.kernel.org \
    --cc=lvivier@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=rkrcmar@redhat.com \
    --cc=thuth@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.