Changeset View
Changeset View
Standalone View
Standalone View
head/sys/mips/mips/tick.c
Show First 20 Lines • Show All 45 Lines • ▼ Show 20 Lines | |||||
#include <sys/timeet.h> | #include <sys/timeet.h> | ||||
#include <sys/timetc.h> | #include <sys/timetc.h> | ||||
#include <machine/hwfunc.h> | #include <machine/hwfunc.h> | ||||
#include <machine/clock.h> | #include <machine/clock.h> | ||||
#include <machine/locore.h> | #include <machine/locore.h> | ||||
#include <machine/md_var.h> | #include <machine/md_var.h> | ||||
#ifdef MIPS_INTRNG | |||||
#include <machine/intr.h> | |||||
#endif | |||||
uint64_t counter_freq; | uint64_t counter_freq; | ||||
struct timecounter *platform_timecounter; | struct timecounter *platform_timecounter; | ||||
static DPCPU_DEFINE(uint32_t, cycles_per_tick); | static DPCPU_DEFINE(uint32_t, cycles_per_tick); | ||||
static uint32_t cycles_per_usec; | static uint32_t cycles_per_usec; | ||||
static DPCPU_DEFINE(volatile uint32_t, counter_upper); | static DPCPU_DEFINE(volatile uint32_t, counter_upper); | ||||
▲ Show 20 Lines • Show All 257 Lines • ▼ Show 20 Lines | clock_identify(driver_t * drv, device_t parent) | ||||
BUS_ADD_CHILD(parent, 0, "clock", 0); | BUS_ADD_CHILD(parent, 0, "clock", 0); | ||||
} | } | ||||
static int | static int | ||||
clock_attach(device_t dev) | clock_attach(device_t dev) | ||||
{ | { | ||||
struct clock_softc *sc; | struct clock_softc *sc; | ||||
#ifndef MIPS_INTRNG | |||||
int error; | int error; | ||||
#endif | |||||
if (device_get_unit(dev) != 0) | if (device_get_unit(dev) != 0) | ||||
panic("can't attach more clocks"); | panic("can't attach more clocks"); | ||||
softc = sc = device_get_softc(dev); | softc = sc = device_get_softc(dev); | ||||
#ifdef MIPS_INTRNG | |||||
cpu_establish_hardintr("clock", clock_intr, NULL, sc, 5, INTR_TYPE_CLK, | |||||
NULL); | |||||
#else | |||||
sc->intr_rid = 0; | sc->intr_rid = 0; | ||||
sc->intr_res = bus_alloc_resource(dev, | sc->intr_res = bus_alloc_resource(dev, | ||||
SYS_RES_IRQ, &sc->intr_rid, 5, 5, 1, RF_ACTIVE); | SYS_RES_IRQ, &sc->intr_rid, 5, 5, 1, RF_ACTIVE); | ||||
if (sc->intr_res == NULL) { | if (sc->intr_res == NULL) { | ||||
device_printf(dev, "failed to allocate irq\n"); | device_printf(dev, "failed to allocate irq\n"); | ||||
return (ENXIO); | return (ENXIO); | ||||
} | } | ||||
error = bus_setup_intr(dev, sc->intr_res, INTR_TYPE_CLK, | error = bus_setup_intr(dev, sc->intr_res, INTR_TYPE_CLK, | ||||
clock_intr, NULL, sc, &sc->intr_handler); | clock_intr, NULL, sc, &sc->intr_handler); | ||||
if (error != 0) { | if (error != 0) { | ||||
device_printf(dev, "bus_setup_intr returned %d\n", error); | device_printf(dev, "bus_setup_intr returned %d\n", error); | ||||
return (error); | return (error); | ||||
} | } | ||||
#endif | |||||
sc->tc.tc_get_timecount = counter_get_timecount; | sc->tc.tc_get_timecount = counter_get_timecount; | ||||
sc->tc.tc_counter_mask = 0xffffffff; | sc->tc.tc_counter_mask = 0xffffffff; | ||||
sc->tc.tc_frequency = counter_freq; | sc->tc.tc_frequency = counter_freq; | ||||
sc->tc.tc_name = "MIPS32"; | sc->tc.tc_name = "MIPS32"; | ||||
sc->tc.tc_quality = 800; | sc->tc.tc_quality = 800; | ||||
sc->tc.tc_priv = sc; | sc->tc.tc_priv = sc; | ||||
tc_init(&sc->tc); | tc_init(&sc->tc); | ||||
Show All 34 Lines |