From: Russ Anderson <rja@sgi.com>
To: Rene Herman <rene.herman@keyaccess.nl>
Cc: mingo@elte.hu, tglx@linutronix.de, linux-kernel@vger.kernel.org,
Jack Steiner <steiner@sgi.com>
Subject: Re: [patch] x86 BIOS interface for RTC on SGI UV
Date: Wed, 9 Jul 2008 17:09:44 -0500 [thread overview]
Message-ID: <20080709220944.GA18690@sgi.com> (raw)
In-Reply-To: <4875320D.2070306@keyaccess.nl>
On Wed, Jul 09, 2008 at 11:47:57PM +0200, Rene Herman wrote:
> On 09-07-08 23:36, Russ Anderson wrote:
>
> >>... and wouldn't uv_bios_strerror/uv_bios_freq_base be better names?
> >
> >The plan is for both x86 and ia64 versions of uv, with this being
> >the x86 version. The ia64 version has ia64_sal_strerror()
> >and ia64_sal_freq_base(). Hence the x86_bios_* naming convention.
> >I'm not strongly tied to that convention, it just seemed logical.
>
> Ah, I see. Not much of an opinion then. x86_bios sounds a bit generic,
> but whatever...
On ia64, the sal interface is an Intel standard.
On x86, the bios interface is SGI UV specific.
I'll make it uv_bios_* .
> >Here is the updated patch.
>
> [ ... ]
>
> >+enum {
> >+ BIOS_STATUS_SUCCESS = 0,
> >+ BIOS_STATUS_UNIMPLEMENTED = -1,
> >+ BIOS_STATUS_EINVAL = -2,
> >+ BIOS_STATUS_ERROR = -3
> >+};
>
> [ .. ]
>
> >+extern long
> >+x86_bios_freq_base(unsigned long which, unsigned long *ticks_per_second,
> >+ unsigned long *drift_info);
>
> >+static __init void uv_rtc_init(void)
> >+{
> >+ unsigned long status, ticks_per_sec, drift;
>
> *status* should remain a long :-)
Ouch. Thanks.
---------------------------------------------------------------------
[patch] x86 BIOS interface for RTC on SGI UV
Real-time code needs to know the number of cycles per second
on SGI UV. The information is provided via a run time BIOS
call. This patch provides the linux side of that interface.
This is the first of several run time BIOS calls to be defined
in uv/bios.h and bios_uv.c.
Note that BIOS_CALL() is just a stub for now. The bios
side is being worked on.
Signed-off-by: Russ Anderson <rja@sgi.com>
---
arch/x86/kernel/Makefile | 1
arch/x86/kernel/bios_uv.c | 48 +++++++++++++++++++++++++++
arch/x86/kernel/genx2apic_uv_x.c | 24 +++++++++++++
include/asm-x86/uv/bios.h | 68 +++++++++++++++++++++++++++++++++++++++
4 files changed, 141 insertions(+)
Index: linux/include/asm-x86/uv/bios.h
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ linux/include/asm-x86/uv/bios.h 2008-07-09 17:01:42.000000000 -0500
@@ -0,0 +1,68 @@
+#ifndef _ASM_X86_BIOS_H
+#define _ASM_X86_BIOS_H
+
+/*
+ * BIOS layer definitions.
+ *
+ * Copyright (c) 2008 Silicon Graphics, Inc. All Rights Reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include <linux/rtc.h>
+
+#define BIOS_FREQ_BASE 0x01000001
+
+enum {
+ BIOS_FREQ_BASE_PLATFORM = 0,
+ BIOS_FREQ_BASE_INTERVAL_TIMER = 1,
+ BIOS_FREQ_BASE_REALTIME_CLOCK = 2
+};
+
+# define BIOS_CALL(result, a0, a1, a2, a3, a4, a5, a6, a7) \
+ do { \
+ /* XXX - the real call goes here */ \
+ result.status = BIOS_STATUS_UNIMPLEMENTED; \
+ result.v0 = 0; \
+ result.v1 = 0; \
+ } while (0)
+
+enum {
+ BIOS_STATUS_SUCCESS = 0,
+ BIOS_STATUS_UNIMPLEMENTED = -1,
+ BIOS_STATUS_EINVAL = -2,
+ BIOS_STATUS_ERROR = -3
+};
+
+struct uv_bios_retval {
+ /*
+ * A zero status value indicates call completed without error.
+ * A negative status value indicates reason of call failure.
+ * A positive status value indicates success but an
+ * informational value should be printed (e.g., "reboot for
+ * change to take effect").
+ */
+ s64 status;
+ u64 v0;
+ u64 v1;
+ u64 v2;
+};
+
+extern long
+uv_bios_freq_base(unsigned long which, unsigned long *ticks_per_second,
+ unsigned long *drift_info);
+extern const char *uv_bios_strerror(long status);
+
+#endif /* _ASM_X86_BIOS_H */
Index: linux/arch/x86/kernel/genx2apic_uv_x.c
===================================================================
--- linux.orig/arch/x86/kernel/genx2apic_uv_x.c 2008-07-09 17:01:25.000000000 -0500
+++ linux/arch/x86/kernel/genx2apic_uv_x.c 2008-07-09 17:01:42.000000000 -0500
@@ -22,6 +22,7 @@
#include <asm/genapic.h>
#include <asm/uv/uv_mmrs.h>
#include <asm/uv/uv_hub.h>
+#include <asm/uv/bios.h>
DEFINE_PER_CPU(struct uv_hub_info_s, __uv_hub_info);
EXPORT_PER_CPU_SYMBOL_GPL(__uv_hub_info);
@@ -38,6 +39,9 @@ EXPORT_SYMBOL_GPL(uv_cpu_to_blade);
short uv_possible_blades;
EXPORT_SYMBOL_GPL(uv_possible_blades);
+unsigned long sn_rtc_cycles_per_second;
+EXPORT_SYMBOL(sn_rtc_cycles_per_second);
+
/* Start with all IRQs pointing to boot CPU. IRQ balancing will shift them. */
static cpumask_t uv_target_cpus(void)
@@ -208,6 +212,24 @@ static __init void get_lowmem_redirect(u
BUG();
}
+static __init void uv_rtc_init(void)
+{
+ unsigned long ticks_per_sec, drift;
+ long status;
+
+ status =
+ uv_bios_freq_base(BIOS_FREQ_BASE_REALTIME_CLOCK, &ticks_per_sec,
+ &drift);
+ if (status != 0 || ticks_per_sec < 100000) {
+ printk(KERN_WARNING
+ "unable to determine platform RTC clock frequency, "
+ "guessing.\n");
+ /* BIOS gives wrong value for clock freq. so guess */
+ sn_rtc_cycles_per_second = 1000000000000UL / 30000UL;
+ } else
+ sn_rtc_cycles_per_second = ticks_per_sec;
+}
+
static __init void uv_system_init(void)
{
union uvh_si_addr_map_config_u m_n_config;
@@ -258,6 +280,8 @@ static __init void uv_system_init(void)
node_id.v = uv_read_local_mmr(UVH_NODE_ID);
gnode_upper = (((unsigned long)node_id.s.node_id) &
~((1 << n_val) - 1)) << m_val;
+
+ uv_rtc_init();
for_each_present_cpu(cpu) {
nid = cpu_to_node(cpu);
Index: linux/arch/x86/kernel/bios_uv.c
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ linux/arch/x86/kernel/bios_uv.c 2008-07-09 17:01:42.000000000 -0500
@@ -0,0 +1,48 @@
+/*
+ * BIOS run time interface routines.
+ *
+ * Copyright (c) 2008 Silicon Graphics, Inc. All Rights Reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include <asm/uv/bios.h>
+
+const char *
+uv_bios_strerror(long status)
+{
+ const char *str;
+ switch (status) {
+ case 0: str = "Call completed without error"; break;
+ case -1: str = "Not implemented"; break;
+ case -2: str = "Invalid argument"; break;
+ case -3: str = "Call completed with error"; break;
+ default: str = "Unknown BIOS status code"; break;
+ }
+ return str;
+}
+
+long
+uv_bios_freq_base(unsigned long which, unsigned long *ticks_per_second,
+ unsigned long *drift_info)
+{
+ struct uv_bios_retval isrv;
+
+ BIOS_CALL(isrv, BIOS_FREQ_BASE, which, 0, 0, 0, 0, 0, 0);
+ *ticks_per_second = isrv.v0;
+ *drift_info = isrv.v1;
+ return isrv.status;
+}
+EXPORT_SYMBOL_GPL(uv_bios_freq_base);
Index: linux/arch/x86/kernel/Makefile
===================================================================
--- linux.orig/arch/x86/kernel/Makefile 2008-07-09 17:01:25.000000000 -0500
+++ linux/arch/x86/kernel/Makefile 2008-07-09 17:01:43.000000000 -0500
@@ -103,6 +103,7 @@ obj-$(CONFIG_OLPC) += olpc.o
# 64 bit specific files
ifeq ($(CONFIG_X86_64),y)
obj-y += genapic_64.o genapic_flat_64.o genx2apic_uv_x.o tlb_uv.o
+ obj-y += bios_uv.o
obj-$(CONFIG_X86_PM_TIMER) += pmtimer_64.o
obj-$(CONFIG_AUDIT) += audit_64.o
--
Russ Anderson, OS RAS/Partitioning Project Lead
SGI - Silicon Graphics Inc rja@sgi.com
next prev parent reply other threads:[~2008-07-09 22:09 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-07-09 20:27 [patch] x86 BIOS interface for RTC on SGI UV Russ Anderson
2008-07-09 20:58 ` Rene Herman
2008-07-09 21:36 ` Russ Anderson
2008-07-09 21:47 ` Rene Herman
2008-07-09 22:09 ` Russ Anderson [this message]
2008-07-09 22:54 ` Rene Herman
2008-07-10 1:44 ` H. Peter Anvin
2008-07-10 14:54 ` Russ Anderson
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=20080709220944.GA18690@sgi.com \
--to=rja@sgi.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=rene.herman@keyaccess.nl \
--cc=steiner@sgi.com \
--cc=tglx@linutronix.de \
/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.