master
  1/*-
  2 * SPDX-License-Identifier: BSD-2-Clause
  3 *
  4 * Copyright (c) 2010-2013 Alexander Motin <mav@FreeBSD.org>
  5 * All rights reserved.
  6 *
  7 * Redistribution and use in source and binary forms, with or without
  8 * modification, are permitted provided that the following conditions
  9 * are met:
 10 * 1. Redistributions of source code must retain the above copyright
 11 *    notice, this list of conditions and the following disclaimer,
 12 *    without modification, immediately at the beginning of the file.
 13 * 2. Redistributions in binary form must reproduce the above copyright
 14 *    notice, this list of conditions and the following disclaimer in the
 15 *    documentation and/or other materials provided with the distribution.
 16 *
 17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
 18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 27 */
 28
 29#ifndef _SYS_TIMEEC_H_
 30#define	_SYS_TIMEEC_H_
 31
 32#ifndef _KERNEL
 33#error "no user-serviceable parts inside"
 34#endif
 35
 36#include <sys/lock.h>
 37#include <sys/mutex.h>
 38#include <sys/queue.h>
 39#include <sys/time.h>
 40
 41/*
 42 * `struct eventtimer' is the interface between the hardware which implements
 43 * a event timer and the MI code which uses this to receive time events.
 44 */
 45
 46struct eventtimer;
 47typedef int et_start_t(struct eventtimer *et,
 48    sbintime_t first, sbintime_t period);
 49typedef int et_stop_t(struct eventtimer *et);
 50typedef void et_event_cb_t(struct eventtimer *et, void *arg);
 51typedef int et_deregister_cb_t(struct eventtimer *et, void *arg);
 52
 53struct eventtimer {
 54	SLIST_ENTRY(eventtimer)	et_all;
 55		/* Pointer to the next event timer. */
 56	const char		*et_name;
 57		/* Name of the event timer. */
 58	int			et_flags;
 59		/* Set of capabilities flags: */
 60#define ET_FLAGS_PERIODIC	1
 61#define ET_FLAGS_ONESHOT	2
 62#define ET_FLAGS_PERCPU		4
 63#define ET_FLAGS_C3STOP		8
 64#define ET_FLAGS_POW2DIV	16
 65	int			et_quality;
 66		/*
 67		 * Used to determine if this timecounter is better than
 68		 * another timecounter. Higher means better.
 69		 */
 70	int			et_active;
 71	u_int64_t		et_frequency;
 72		/* Base frequency in Hz. */
 73	sbintime_t		et_min_period;
 74	sbintime_t		et_max_period;
 75	et_start_t		*et_start;
 76	et_stop_t		*et_stop;
 77	et_event_cb_t		*et_event_cb;
 78	et_deregister_cb_t	*et_deregister_cb;
 79	void 			*et_arg;
 80	void			*et_priv;
 81	struct sysctl_oid	*et_sysctl;
 82		/* Pointer to the event timer's private parts. */
 83};
 84
 85extern struct mtx	et_eventtimers_mtx;
 86#define	ET_LOCK()	mtx_lock(&et_eventtimers_mtx)
 87#define	ET_UNLOCK()	mtx_unlock(&et_eventtimers_mtx)
 88
 89/* Driver API */
 90int	et_register(struct eventtimer *et);
 91int	et_deregister(struct eventtimer *et);
 92void	et_change_frequency(struct eventtimer *et, uint64_t newfreq);
 93/* Consumer API  */
 94struct eventtimer *et_find(const char *name, int check, int want);
 95int	et_init(struct eventtimer *et, et_event_cb_t *event,
 96    et_deregister_cb_t *deregister, void *arg);
 97int	et_start(struct eventtimer *et, sbintime_t first, sbintime_t period);
 98int	et_stop(struct eventtimer *et);
 99int	et_ban(struct eventtimer *et);
100int	et_free(struct eventtimer *et);
101
102#ifdef SYSCTL_DECL
103SYSCTL_DECL(_kern_eventtimer);
104#endif
105#endif /* !_SYS_TIMETC_H_ */