all platforms: separate cpu_initclocks() from cpu_startclock()
authorcheloha <cheloha@openbsd.org>
Wed, 23 Aug 2023 01:55:45 +0000 (01:55 +0000)
committercheloha <cheloha@openbsd.org>
Wed, 23 Aug 2023 01:55:45 +0000 (01:55 +0000)
commit11d1f9b2143325c151ff5de652177687515961c9
tree24f49e3cfd106b17234056e2587f4d34298d978e
parent9cd62917ab6617d55cfc87af69b835e445674ccd
all platforms: separate cpu_initclocks() from cpu_startclock()

To give the primary CPU an opportunity to perform clock interrupt
preparation in a machine-independent manner we need to separate the
"initialization" parts of cpu_initclocks() from the "start the clock
interrupt" parts.  Currently, cpu_initclocks() does everything all at
once, so there is no space for this MI setup.

Many platforms have more-or-less already done this separation by
implementing a separate routine named "cpu_startclock()".  This patch
promotes cpu_startclock() from de facto standard to mandatory API.

- Prototype cpu_startclock() in sys/systm.h alongside cpu_initclocks().
  The separation of responsibility between the two routines is a bit
  fuzzy but the basic guidelines are as follows:

  + cpu_initclocks() must initialize hz, stathz, and profhz, and call
    clockintr_init().

  + cpu_startclock() must call clockintr_cpu_init() and start the clock
    interrupt cycle on the calling CPU.

  These guidelines will shift in the future, but that's the way things
  stand as of *this* commit.

- In initclocks(): first call cpu_initclocks(), then do MI setup, and
  last call cpu_startclock().

- On platforms where cpu_startclock() already exists: don't call
  cpu_startclock() from cpu_initclocks() anymore.

- On platforms where cpu_startclock() doesn't yet exist: implement it.
  Usually this is as simple as dividing cpu_initclocks() in two.

Tested on amd64 (i8254, lapic), arm64, i386 (i8254, lapic), macppc,
mips64/octeon, and sparc64.  Tested on arm/armv7 (agtimer(4)) by
phessler@ and jmatthew@.  Tested on m88k/luna88k by aoyama@.  Tested
on powerpc64 by gkoehler@ and mlarkin@.  Tested on riscv64 by
jmatthew@.

Thread: https://marc.info/?l=openbsd-tech&m=169195251322149&w=2
32 files changed:
sys/arch/alpha/alpha/clock.c
sys/arch/amd64/amd64/lapic.c
sys/arch/amd64/amd64/machdep.c
sys/arch/amd64/include/cpu.h
sys/arch/amd64/isa/clock.c
sys/arch/arm/cortex/agtimer.c
sys/arch/arm/cortex/amptimer.c
sys/arch/arm/include/cpu.h
sys/arch/arm64/dev/agtimer.c
sys/arch/arm64/include/cpu.h
sys/arch/armv7/omap/dmtimer.c
sys/arch/armv7/omap/gptimer.c
sys/arch/armv7/sunxi/sxitimer.c
sys/arch/hppa/dev/clock.c
sys/arch/hppa/include/cpu.h
sys/arch/i386/i386/lapic.c
sys/arch/i386/i386/machdep.c
sys/arch/i386/include/cpu.h
sys/arch/i386/isa/clock.c
sys/arch/luna88k/luna88k/clock.c
sys/arch/macppc/macppc/clock.c
sys/arch/mips64/include/cpu.h
sys/arch/mips64/mips64/clock.c
sys/arch/mips64/mips64/mips64_machdep.c
sys/arch/powerpc64/include/cpu.h
sys/arch/powerpc64/powerpc64/clock.c
sys/arch/riscv64/include/cpu.h
sys/arch/riscv64/riscv64/clock.c
sys/arch/sh/sh/clock.c
sys/arch/sparc64/sparc64/clock.c
sys/kern/kern_clock.c
sys/sys/systm.h