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
>  }
>

Reply via email to