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

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
 }
 

Reply via email to