iBoot/include/platform/timer.h

95 lines
2.2 KiB
C

/*
* Copyright (C) 2007-2010 Apple Inc. All rights reserved.
* Copyright (C) 2006 Apple Computer, Inc. All rights reserved.
*
* This document is the property of Apple Inc.
* It is considered confidential and proprietary.
*
* This document may not be reproduced or transmitted in any form,
* in whole or in part, without the express written permission of
* Apple Inc.
*/
#ifndef __PLATFORM_TIMER_H
#define __PLATFORM_TIMER_H
#include <sys/types.h>
__BEGIN_DECLS
/*
* One-time timer initialisation.
*/
int timer_init(u_int32_t timer);
/*
* Returns the current time in ticks.
*/
u_int64_t timer_get_ticks(void);
/*
* Returns the tick rate per second.
*/
u_int32_t timer_get_tick_rate(void);
/*
* Returns the number of microseconds that are equivalent to number of ticks passed in.
*/
utime_t timer_ticks_to_usecs(u_int64_t ticks);
/*
* Returns the number of ticks that are equivalent to number of microseconds passed in.
*/
u_int64_t timer_usecs_to_ticks(utime_t usecs);
/*
* Registers a single callback at (at_ticks).
*
* Passing NULL will delete the current callback.
*/
void timer_deadline_enter(u_int64_t at_ticks, void (* callback)(void));
/*
* Stop all timers; used when shutting down or handing off to another image.
*/
void timer_stop_all(void);
/*
* Return a word containing entropy.
*/
u_int32_t timer_get_entropy(void);
void wdt_enable(void);
void wdt_system_reset(void);
void wdt_chip_reset(void);
/******************************************
Wrapper MACRO for a Register Spin-Loop with Time-Out
*/
#define SPIN_TIMEOUT_WHILE(__expr,__max) \
do { \
bool __tmo = false; \
uint64_t __start = timer_get_ticks(); \
for (;;) { \
if ((timer_get_ticks() - __start) >= __max) \
__tmo = true; \
if (!(__expr)) \
break; \
if (USE_TMO_IN_REGSPIN_LOOP && __tmo) \
panic("%s:%d spin loop has timed out", \
__FILE__, __LINE__); \
} \
} while (0)
// If this is ZERO, there will be no Time-Out nor panic
#define USE_TMO_IN_REGSPIN_LOOP 1
// Standard Timeout is 1 second
#define SPIN_W_TMO_WHILE(__expr) SPIN_TIMEOUT_WHILE(__expr, 1000000)
#define SPIN_W_TMO_UNTIL(__expr) SPIN_W_TMO_WHILE(!(__expr))
__END_DECLS
#endif