Changeset View
Changeset View
Standalone View
Standalone View
sys/kern/kern_et.c
Show First 20 Lines • Show All 62 Lines • ▼ Show 20 Lines | if (et->et_quality >= 0 || bootverbose) { | ||||
} else { | } else { | ||||
printf("Event timer \"%s\" " | printf("Event timer \"%s\" " | ||||
"frequency %ju Hz quality %d\n", | "frequency %ju Hz quality %d\n", | ||||
et->et_name, (uintmax_t)et->et_frequency, | et->et_name, (uintmax_t)et->et_frequency, | ||||
et->et_quality); | et->et_quality); | ||||
} | } | ||||
} | } | ||||
KASSERT(et->et_start, ("et_register: timer has no start function")); | KASSERT(et->et_start, ("et_register: timer has no start function")); | ||||
if ((et->et_flags & ET_FLAGS_NMI) != 0) { | |||||
KASSERT(et->et_set_nmi_mode != NULL && et->et_check_nmi != NULL, | |||||
("timer claims to support NMI but does not provide hooks")); | |||||
} | |||||
et->et_sysctl = SYSCTL_ADD_NODE_WITH_LABEL(NULL, | et->et_sysctl = SYSCTL_ADD_NODE_WITH_LABEL(NULL, | ||||
SYSCTL_STATIC_CHILDREN(_kern_eventtimer_et), OID_AUTO, et->et_name, | SYSCTL_STATIC_CHILDREN(_kern_eventtimer_et), OID_AUTO, et->et_name, | ||||
CTLFLAG_RW, 0, "event timer description", "eventtimer"); | CTLFLAG_RW, 0, "event timer description", "eventtimer"); | ||||
SYSCTL_ADD_INT(NULL, SYSCTL_CHILDREN(et->et_sysctl), OID_AUTO, | SYSCTL_ADD_INT(NULL, SYSCTL_CHILDREN(et->et_sysctl), OID_AUTO, | ||||
"flags", CTLFLAG_RD, &(et->et_flags), 0, | "flags", CTLFLAG_RD, &(et->et_flags), 0, | ||||
"Event timer capabilities"); | "Event timer capabilities"); | ||||
SYSCTL_ADD_UQUAD(NULL, SYSCTL_CHILDREN(et->et_sysctl), OID_AUTO, | SYSCTL_ADD_UQUAD(NULL, SYSCTL_CHILDREN(et->et_sysctl), OID_AUTO, | ||||
"frequency", CTLFLAG_RD, &(et->et_frequency), | "frequency", CTLFLAG_RD, &(et->et_frequency), | ||||
▲ Show 20 Lines • Show All 151 Lines • ▼ Show 20 Lines | |||||
et_free(struct eventtimer *et) | et_free(struct eventtimer *et) | ||||
{ | { | ||||
if (!et->et_active) | if (!et->et_active) | ||||
return (ENXIO); | return (ENXIO); | ||||
et->et_active = 0; | et->et_active = 0; | ||||
return (0); | return (0); | ||||
} | |||||
/* Enable or disable Non-Maskable mode of timer interrupt delivery. */ | |||||
int | |||||
et_set_nmi_mode(struct eventtimer *et, boolean_t enable) | |||||
{ | |||||
if (!et->et_active) | |||||
return (ENXIO); | |||||
if ((et->et_flags & ET_FLAGS_NMI) == 0) | |||||
return (ENOTSUP); | |||||
return (et->et_set_nmi_mode(et, enable)); | |||||
} | |||||
int | |||||
et_check_nmi(struct eventtimer *et) | |||||
{ | |||||
if (!et->et_active) | |||||
return (ENXIO); | |||||
if ((et->et_flags & ET_FLAGS_NMI) == 0) | |||||
return (ENOTSUP); | |||||
return (et->et_check_nmi(et)); | |||||
} | } | ||||
/* Report list of supported event timer hardware via sysctl. */ | /* Report list of supported event timer hardware via sysctl. */ | ||||
static int | static int | ||||
sysctl_kern_eventtimer_choice(SYSCTL_HANDLER_ARGS) | sysctl_kern_eventtimer_choice(SYSCTL_HANDLER_ARGS) | ||||
{ | { | ||||
struct sbuf sb; | struct sbuf sb; | ||||
struct eventtimer *et; | struct eventtimer *et; | ||||
Show All 22 Lines |