2001-09-03 22:36:11 +00:00
|
|
|
/*-
|
|
|
|
* Copyright (c) 2001 Jake Burkholder.
|
|
|
|
* All rights reserved.
|
|
|
|
*
|
|
|
|
* Redistribution and use in source and binary forms, with or without
|
|
|
|
* modification, are permitted provided that the following conditions
|
|
|
|
* are met:
|
|
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer.
|
|
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
|
|
* documentation and/or other materials provided with the distribution.
|
|
|
|
*
|
|
|
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
|
|
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
|
|
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
|
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
|
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
|
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
|
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
|
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
|
|
* SUCH DAMAGE.
|
|
|
|
*
|
|
|
|
* $FreeBSD$
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef _MACHINE_VER_H_
|
|
|
|
#define _MACHINE_VER_H_
|
|
|
|
|
|
|
|
#define VER_MANUF_SHIFT (48)
|
|
|
|
#define VER_IMPL_SHIFT (32)
|
|
|
|
#define VER_MASK_SHIFT (24)
|
|
|
|
#define VER_MAXTL_SHIFT (8)
|
|
|
|
#define VER_MAXWIN_SHIFT (0)
|
|
|
|
|
|
|
|
#define VER_MANUF_SIZE (16)
|
|
|
|
#define VER_IMPL_SIZE (16)
|
|
|
|
#define VER_MASK_SIZE (8)
|
|
|
|
#define VER_MAXTL_SIZE (8)
|
|
|
|
#define VER_MAXWIN_SIZE (5)
|
|
|
|
|
- USIII-based machines can consist of CPUs running at different
frequencies (and having different cache sizes) so use the STICK
(System TICK) timer, which was introduced due to this and is
driven by the same frequency across all CPUs, instead of the
TICK timer, whose frequency varies with the CPU clock, to drive
hardclock. We try to use the STICK counter with all CPUs that are
USIII or beyond, even when not necessary due to identical CPUs,
as we can can also avoid the workaround for the BlackBird erratum
#1 there. Unfortunately, using the STICK counter currently causes
a hang with USIIIi MP machines for reasons unknown, so we still
use the TICK timer there (which is okay as they can only consist
of identical CPUs).
- Given that we only (try to) synchronize the (S)TICK timers of APs
with the BSP during startup, we could end up spinning forever in
DELAY(9) if that function is migrated to another CPU while we're
spinning due to clock drift afterwards, so pin to the CPU in order
to avoid migration. Unfortunately, pinning doesn't work at the
point DELAY(9) is required by the low-level console drivers, yet,
so switch to a function pointer, which is updated accordingly, for
implementing DELAY(9). For USIII and beyond, this would also allow
to easily use the STICK counter instead of the TICK one here,
there's no benefit in doing so however.
While at it, use cpu_spinwait(9) for spinning in the delay-
functions. This currently is a NOP though.
- Don't set the TICK timer of the BSP to 0 during at startup as
there's no need to do so.
- Implement cpu_est_clockrate().
- Unfortunately, USIIIi-based machines don't provide a timecounter
device besides the STICK and TICK counters (well, in theory the
Tomatillo bridges have a performance counter that can be (ab)used
as timecounter by configuring it to count bus cycles, though unlike
the performance counter of Schizo bridges, the Tomatillo one is
broken and counts Sun knows what in this mode). This means that
we've to use a (S)TICK counter for timecounting, which has the old
problem of not being in sync across CPUs, so provide an additional
timecounter function which binds itself to the BSP but has an
adequate low priority.
2008-09-03 17:39:19 +00:00
|
|
|
#ifndef LOCORE
|
|
|
|
|
2001-09-03 22:36:11 +00:00
|
|
|
#define VER_MANUF_MASK (((1L<<VER_MANUF_SIZE)-1)<<VER_MANUF_SHIFT)
|
|
|
|
#define VER_IMPL_MASK (((1L<<VER_IMPL_SIZE)-1)<<VER_IMPL_SHIFT)
|
|
|
|
#define VER_MASK_MASK (((1L<<VER_MASK_SIZE)-1)<<VER_MASK_SHIFT)
|
|
|
|
#define VER_MAXTL_MASK (((1L<<VER_MAXTL_SIZE)-1)<<VER_MAXTL_SHIFT)
|
|
|
|
#define VER_MAXWIN_MASK (((1L<<VER_MAXWIN_SIZE)-1)<<VER_MAXWIN_SHIFT)
|
|
|
|
|
|
|
|
#define VER_MANUF(ver) \
|
|
|
|
(((ver) & VER_MANUF_MASK) >> VER_MANUF_SHIFT)
|
|
|
|
#define VER_IMPL(ver) \
|
|
|
|
(((ver) & VER_IMPL_MASK) >> VER_IMPL_SHIFT)
|
|
|
|
#define VER_MASK(ver) \
|
|
|
|
(((ver) & VER_MASK_MASK) >> VER_MASK_SHIFT)
|
|
|
|
#define VER_MAXTL(ver) \
|
|
|
|
(((ver) & VER_MAXTL_MASK) >> VER_MAXTL_SHIFT)
|
|
|
|
#define VER_MAXWIN(ver) \
|
|
|
|
(((ver) & VER_MAXWIN_MASK) >> VER_MAXWIN_SHIFT)
|
|
|
|
|
2002-02-13 15:47:12 +00:00
|
|
|
extern int cpu_impl;
|
2002-11-07 16:07:46 +00:00
|
|
|
extern char sparc64_model[];
|
2002-02-13 15:47:12 +00:00
|
|
|
|
- USIII-based machines can consist of CPUs running at different
frequencies (and having different cache sizes) so use the STICK
(System TICK) timer, which was introduced due to this and is
driven by the same frequency across all CPUs, instead of the
TICK timer, whose frequency varies with the CPU clock, to drive
hardclock. We try to use the STICK counter with all CPUs that are
USIII or beyond, even when not necessary due to identical CPUs,
as we can can also avoid the workaround for the BlackBird erratum
#1 there. Unfortunately, using the STICK counter currently causes
a hang with USIIIi MP machines for reasons unknown, so we still
use the TICK timer there (which is okay as they can only consist
of identical CPUs).
- Given that we only (try to) synchronize the (S)TICK timers of APs
with the BSP during startup, we could end up spinning forever in
DELAY(9) if that function is migrated to another CPU while we're
spinning due to clock drift afterwards, so pin to the CPU in order
to avoid migration. Unfortunately, pinning doesn't work at the
point DELAY(9) is required by the low-level console drivers, yet,
so switch to a function pointer, which is updated accordingly, for
implementing DELAY(9). For USIII and beyond, this would also allow
to easily use the STICK counter instead of the TICK one here,
there's no benefit in doing so however.
While at it, use cpu_spinwait(9) for spinning in the delay-
functions. This currently is a NOP though.
- Don't set the TICK timer of the BSP to 0 during at startup as
there's no need to do so.
- Implement cpu_est_clockrate().
- Unfortunately, USIIIi-based machines don't provide a timecounter
device besides the STICK and TICK counters (well, in theory the
Tomatillo bridges have a performance counter that can be (ab)used
as timecounter by configuring it to count bus cycles, though unlike
the performance counter of Schizo bridges, the Tomatillo one is
broken and counts Sun knows what in this mode). This means that
we've to use a (S)TICK counter for timecounting, which has the old
problem of not being in sync across CPUs, so provide an additional
timecounter function which binds itself to the BSP but has an
adequate low priority.
2008-09-03 17:39:19 +00:00
|
|
|
#endif /* !LOCORE */
|
|
|
|
|
2002-02-13 15:47:12 +00:00
|
|
|
/* Known implementations. */
|
2007-05-20 13:47:36 +00:00
|
|
|
#define CPU_IMPL_SPARC64 0x01
|
|
|
|
#define CPU_IMPL_ULTRASPARCI 0x10
|
|
|
|
#define CPU_IMPL_ULTRASPARCII 0x11
|
|
|
|
#define CPU_IMPL_ULTRASPARCIIi 0x12
|
|
|
|
#define CPU_IMPL_ULTRASPARCIIe 0x13
|
|
|
|
#define CPU_IMPL_ULTRASPARCIII 0x14
|
|
|
|
#define CPU_IMPL_ULTRASPARCIIIp 0x15
|
|
|
|
#define CPU_IMPL_ULTRASPARCIIIi 0x16
|
|
|
|
#define CPU_IMPL_ULTRASPARCIV 0x18
|
|
|
|
#define CPU_IMPL_ULTRASPARCIVp 0x19
|
|
|
|
#define CPU_IMPL_ULTRASPARCIIIip 0x22
|
2002-02-13 15:47:12 +00:00
|
|
|
|
2001-09-03 22:36:11 +00:00
|
|
|
#endif /* !_MACHINE_VER_H_ */
|