diff --git a/sys/conf/files.i386 b/sys/conf/files.i386 index c900da458e79..f89ff33b5709 100644 --- a/sys/conf/files.i386 +++ b/sys/conf/files.i386 @@ -141,6 +141,7 @@ i386/i386/initcpu.c standard i386/i386/machdep.c standard i386/i386/math_emulate.c optional math_emulate i386/i386/mem.c standard +i386/i386/mp_clock.c optional smp i386/i386/mp_machdep.c optional smp i386/i386/mpapic.c optional smp i386/i386/mpboot.s optional smp diff --git a/sys/i386/conf/files.i386 b/sys/i386/conf/files.i386 index c900da458e79..f89ff33b5709 100644 --- a/sys/i386/conf/files.i386 +++ b/sys/i386/conf/files.i386 @@ -141,6 +141,7 @@ i386/i386/initcpu.c standard i386/i386/machdep.c standard i386/i386/math_emulate.c optional math_emulate i386/i386/mem.c standard +i386/i386/mp_clock.c optional smp i386/i386/mp_machdep.c optional smp i386/i386/mpapic.c optional smp i386/i386/mpboot.s optional smp diff --git a/sys/i386/i386/mp_clock.c b/sys/i386/i386/mp_clock.c new file mode 100644 index 000000000000..b60e80db89a8 --- /dev/null +++ b/sys/i386/i386/mp_clock.c @@ -0,0 +1,88 @@ +/* + * ---------------------------------------------------------------------------- + * "THE BEER-WARE LICENSE" (Revision 42): + * wrote this file. As long as you retain this notice you + * can do whatever you want with this stuff. If we meet some day, and you think + * this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp + * ---------------------------------------------------------------------------- + * + * $FreeBSD$ + * + */ + +#include "opt_bus.h" +#include "opt_pci.h" +#include "opt_smp.h" + +#include +#include +#include +#include +#include +#include + +#include +#include + +static unsigned piix_get_timecount(struct timecounter *tc); + +static u_int32_t piix_timecounter_address; + +static struct timecounter piix_timecounter = { + piix_get_timecount, + 0, + 0xffffff, + 14318182/4, + "PIIX" +}; + +SYSCTL_OPAQUE(_debug, OID_AUTO, piix_timecounter, CTLFLAG_RD, + &piix_timecounter, sizeof(piix_timecounter), "S,timecounter", ""); + +static unsigned +piix_get_timecount(struct timecounter *tc) +{ + return (inl(piix_timecounter_address)); +} + +static int +piix_probe (device_t dev) +{ + u_int32_t d; + + switch (pci_get_devid(dev)) { + case 0x71138086: + d = pci_read_config(dev, 0x4, 2); + if (!(d & 1)) + return 0; /* IO space not mapped */ + d = pci_read_config(dev, 0x40, 4); + piix_timecounter_address = (d & 0xffc0) + 8; + init_timecounter(&piix_timecounter); + return (ENXIO); + }; + return (ENXIO); +} + +static int +piix_attach (device_t dev) +{ + + return 0; +} + +static device_method_t piix_methods[] = { + /* Device interface */ + DEVMETHOD(device_probe, piix_probe), + DEVMETHOD(device_attach, piix_attach), + { 0, 0 } +}; + +static driver_t piix_driver = { + "piix", + piix_methods, + 1, +}; + +static devclass_t piix_devclass; + +DRIVER_MODULE(piix, pci, piix_driver, piix_devclass, 0, 0);