aboutsummaryrefslogtreecommitdiff
path: root/hw
diff options
context:
space:
mode:
authorNicholas Piggin <npiggin@gmail.com>2021-12-20 22:22:47 +1000
committerCédric Le Goater <clg@kaod.org>2022-01-03 16:12:45 +0100
commit0475a94b2faa9685eb8f4314e9a0d0e42771ea57 (patch)
tree5eb5beabf235911ed4c0d2856ac5ccd24428dc55 /hw
parenta6816a42c1f40481c998177b2b88329984ed25b2 (diff)
downloadskiboot-0475a94b2faa9685eb8f4314e9a0d0e42771ea57.zip
skiboot-0475a94b2faa9685eb8f4314e9a0d0e42771ea57.tar.gz
skiboot-0475a94b2faa9685eb8f4314e9a0d0e42771ea57.tar.bz2
SBE: create processor-independent timer APIs
Rather than have code call processor-specific SBE routines depending on version, hide those details in SBE APIs. Signed-off-by: Nicholas Piggin <npiggin@gmail.com> [ clg: Fixed run-timer test ] Signed-off-by: Cédric Le Goater <clg@kaod.org>
Diffstat (limited to 'hw')
-rw-r--r--hw/Makefile.inc2
-rw-r--r--hw/sbe-p8.c9
-rw-r--r--hw/sbe-p9.c9
-rw-r--r--hw/sbe.c31
4 files changed, 36 insertions, 15 deletions
diff --git a/hw/Makefile.inc b/hw/Makefile.inc
index e273e89..a6732b7 100644
--- a/hw/Makefile.inc
+++ b/hw/Makefile.inc
@@ -1,6 +1,6 @@
# -*-Makefile-*-
SUBDIRS += hw
-HW_OBJS = xscom.o chiptod.o lpc.o lpc-uart.o psi.o
+HW_OBJS = xscom.o chiptod.o lpc.o lpc-uart.o psi.o sbe.o
HW_OBJS += homer.o slw.o occ.o fsi-master.o centaur.o imc.o
HW_OBJS += nx.o nx-rng.o nx-crypto.o nx-compress.o nx-842.o nx-gzip.o
HW_OBJS += sfc-ctrl.o fake-rtc.o bt.o p8-i2c.o prd.o
diff --git a/hw/sbe-p8.c b/hw/sbe-p8.c
index 73fa5f1..70edec6 100644
--- a/hw/sbe-p8.c
+++ b/hw/sbe-p8.c
@@ -6,13 +6,13 @@
*/
#include <device.h>
+#include <sbe.h>
#include <sbe-p8.h>
#include <skiboot.h>
#include <timebase.h>
#include <xscom.h>
/* SLW timer related stuff */
-static bool sbe_has_timer;
static uint64_t sbe_timer_inc;
static uint64_t sbe_timer_target;
static uint32_t sbe_timer_chip;
@@ -65,7 +65,7 @@ void p8_sbe_update_timer_expiry(uint64_t new_target)
uint64_t count, gen, gen2, req, now;
int64_t rc;
- if (!sbe_has_timer || new_target == sbe_timer_target)
+ if (new_target == sbe_timer_target)
return;
sbe_timer_target = new_target;
@@ -162,11 +162,6 @@ void p8_sbe_update_timer_expiry(uint64_t new_target)
prlog(PR_TRACE, "SLW: gen: %llx\n", gen);
}
-bool p8_sbe_timer_ok(void)
-{
- return sbe_has_timer;
-}
-
void p8_sbe_init_timer(void)
{
struct dt_node *np;
diff --git a/hw/sbe-p9.c b/hw/sbe-p9.c
index 898a1fb..3b0f8b0 100644
--- a/hw/sbe-p9.c
+++ b/hw/sbe-p9.c
@@ -41,6 +41,7 @@
#include <lock.h>
#include <opal.h>
#include <opal-dump.h>
+#include <sbe.h>
#include <sbe-p9.h>
#include <skiboot.h>
#include <timebase.h>
@@ -73,7 +74,6 @@ struct p9_sbe {
static int sbe_default_chip_id = -1;
/* Is SBE timer running? */
-static bool sbe_has_timer = false;
static bool sbe_timer_in_progress = false;
static bool has_new_target = false;
@@ -843,7 +843,7 @@ static void p9_sbe_timer_schedule(void)
*/
void p9_sbe_update_timer_expiry(uint64_t new_target)
{
- if (!sbe_has_timer || new_target == sbe_timer_target)
+ if (new_target == sbe_timer_target)
return;
lock(&sbe_timer_lock);
@@ -874,11 +874,6 @@ static void p9_sbe_timer_init(void)
prlog(PR_INFO, "Timer facility on chip %x\n", sbe_default_chip_id);
}
-bool p9_sbe_timer_ok(void)
-{
- return sbe_has_timer;
-}
-
static void p9_sbe_stash_chipop_resp(struct p9_sbe_msg *msg)
{
int rc = p9_sbe_get_primary_rc(msg->resp);
diff --git a/hw/sbe.c b/hw/sbe.c
new file mode 100644
index 0000000..991485e
--- /dev/null
+++ b/hw/sbe.c
@@ -0,0 +1,31 @@
+// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
+
+/*
+ * SBE communication driver (common code)
+ */
+
+#define pr_fmt(fmt) "SBE: " fmt
+
+#include <sbe.h>
+#include <sbe-p8.h>
+#include <sbe-p9.h>
+#include <skiboot.h>
+#include <stdbool.h>
+
+bool sbe_has_timer = false;
+
+void sbe_update_timer_expiry(uint64_t target)
+{
+ assert(sbe_timer_ok);
+
+ if (proc_gen == proc_gen_p9 || proc_gen == proc_gen_p10)
+ p9_sbe_update_timer_expiry(target);
+
+ if (proc_gen == proc_gen_p8)
+ p8_sbe_update_timer_expiry(target);
+}
+
+bool sbe_timer_ok(void)
+{
+ return sbe_has_timer;
+}