On Wed, Aug 17, 2022 at 09:00:12PM +1000, Jonathan Gray wrote: > On Wed, Aug 17, 2022 at 04:53:20PM +1000, Jonathan Gray wrote: > > > > It seems to me it would be cleaner if the decision of what to use for > > delay could be moved into an md file. > > > > Or abstract it by having a numeric weight like timecounters or driver > > match return numbers. > > diff against your previous, does not change lapic_delay >
I think the combination of diffs is a move in the right direction, so ok mlarkin on these when ready. -ml > diff --git sys/arch/amd64/amd64/machdep.c sys/arch/amd64/amd64/machdep.c > index 932b1dfeb47..c4645b6a6fd 100644 > --- sys/arch/amd64/amd64/machdep.c > +++ sys/arch/amd64/amd64/machdep.c > @@ -2069,3 +2069,13 @@ check_context(const struct reg *regs, struct trapframe > *tf) > > return 0; > } > + > +void > +delay_init(void(*f)(int), int v) > +{ > + static int c = 0; > + if (v > c) { > + delay_func = f; > + c = v; > + } > +} > diff --git sys/arch/amd64/amd64/tsc.c sys/arch/amd64/amd64/tsc.c > index fd38dc6359d..8c839357dd2 100644 > --- sys/arch/amd64/amd64/tsc.c > +++ sys/arch/amd64/amd64/tsc.c > @@ -109,7 +109,7 @@ tsc_identify(struct cpu_info *ci) > > tsc_frequency = tsc_freq_cpuid(ci); > if (tsc_frequency > 0) > - delay_func = tsc_delay; > + delay_init(tsc_delay, 300); > } > > static inline int > diff --git sys/arch/amd64/include/cpu.h sys/arch/amd64/include/cpu.h > index b8db48f2714..a82af172452 100644 > --- sys/arch/amd64/include/cpu.h > +++ sys/arch/amd64/include/cpu.h > @@ -359,6 +359,7 @@ void signotify(struct proc *); > * We need a machine-independent name for this. > */ > extern void (*delay_func)(int); > +void delay_init(void(*)(int), int); > struct timeval; > > #define DELAY(x) (*delay_func)(x) > diff --git sys/arch/i386/i386/machdep.c sys/arch/i386/i386/machdep.c > index e4cb15b4dc1..7da5c26e240 100644 > --- sys/arch/i386/i386/machdep.c > +++ sys/arch/i386/i386/machdep.c > @@ -3996,3 +3996,13 @@ cpu_rnd_messybits(void) > nanotime(&ts); > return (ts.tv_nsec ^ (ts.tv_sec << 20)); > } > + > +void > +delay_init(void(*f)(int), int v) > +{ > + static int c = 0; > + if (v > c) { > + delay_func = f; > + c = v; > + } > +} > diff --git sys/arch/i386/include/cpu.h sys/arch/i386/include/cpu.h > index 5f300710562..211ee475678 100644 > --- sys/arch/i386/include/cpu.h > +++ sys/arch/i386/include/cpu.h > @@ -302,6 +302,7 @@ void signotify(struct proc *); > * We need a machine-independent name for this. > */ > extern void (*delay_func)(int); > +void delay_init(void(*)(int), int); > struct timeval; > > #define DELAY(x) (*delay_func)(x) > diff --git sys/dev/acpi/acpihpet.c sys/dev/acpi/acpihpet.c > index 6dc595e50ab..4332b4dbc0e 100644 > --- sys/dev/acpi/acpihpet.c > +++ sys/dev/acpi/acpihpet.c > @@ -27,8 +27,6 @@ > #include <dev/acpi/acpivar.h> > #include <dev/acpi/acpidev.h> > > -#include "acpitimer.h" > - > int acpihpet_attached; > > int acpihpet_match(struct device *, void *, void *); > @@ -270,15 +268,7 @@ acpihpet_attach(struct device *parent, struct device > *self, void *aux) > hpet_timecounter.tc_name = sc->sc_dev.dv_xname; > tc_init(&hpet_timecounter); > > -#if defined(__amd64__) || defined(__i386__) > - if (delay_func == i8254_delay) > - delay_func = acpihpet_delay; > -#if NACPITIMER > 1 > - extern void acpitimer_delay(int); > - if (delay_func == acpitimer_delay) > - delay_func = acpihpet_delay; > -#endif > -#endif /* defined(__amd64__) || defined(__i386__) */ > + delay_init(acpihpet_delay, 200); > > #if defined(__amd64__) > extern void cpu_recalibrate_tsc(struct timecounter *); > diff --git sys/dev/acpi/acpitimer.c sys/dev/acpi/acpitimer.c > index 0c4c7b71a01..e2757a40f3d 100644 > --- sys/dev/acpi/acpitimer.c > +++ sys/dev/acpi/acpitimer.c > @@ -103,10 +103,8 @@ acpitimerattach(struct device *parent, struct device > *self, void *aux) > acpi_timecounter.tc_name = sc->sc_dev.dv_xname; > tc_init(&acpi_timecounter); > > -#if defined(__amd64__) || defined(__i386__) > - if (delay_func == i8254_delay) > - delay_func = acpitimer_delay; > -#endif > + delay_init(acpitimer_delay, 100); > + > #if defined(__amd64__) > extern void cpu_recalibrate_tsc(struct timecounter *); > cpu_recalibrate_tsc(&acpi_timecounter); > diff --git sys/dev/acpi/files.acpi sys/dev/acpi/files.acpi > index 8ec3ec2f8b3..f97eb6d4e3e 100644 > --- sys/dev/acpi/files.acpi > +++ sys/dev/acpi/files.acpi > @@ -13,7 +13,7 @@ file dev/acpi/acpidebug.c acpi & ddb > # ACPI timer > device acpitimer > attach acpitimer at acpi > -file dev/acpi/acpitimer.c acpitimer needs-flag > +file dev/acpi/acpitimer.c acpitimer > > # AC device > device acpiac > diff --git sys/dev/pv/pvbus.c sys/dev/pv/pvbus.c > index cbe543ac312..ee53afe2138 100644 > --- sys/dev/pv/pvbus.c > +++ sys/dev/pv/pvbus.c > @@ -319,9 +319,8 @@ pvbus_hyperv(struct pvbus_hv *hv) > HYPERV_VERSION_EBX_MINOR_S; > > #if NHYPERV > 0 > - if (hv->hv_features & CPUID_HV_MSR_TIME_REFCNT && > - delay_func == i8254_delay) > - delay_func = hv_delay; > + if (hv->hv_features & CPUID_HV_MSR_TIME_REFCNT) > + delay_init(hv_delay, 250); > #endif > } >