mirror of
https://github.com/Dasharo/skiboot.git
synced 2026-03-06 14:50:44 -08:00
49496485fe
SPDX makes it a simpler diff. I have audited the commit history of each file to ensure that they are exclusively authored by IBM and thus we have the right to relicense. The motivation behind this is twofold: 1) We want to enable experiments with coreboot, which is GPLv2 licensed 2) An upcoming firmware component wants to incorporate code from skiboot and code from the Linux kernel, which is GPLv2 licensed. I have gone through the IBM internal way of gaining approval for this. The following files are not exclusively authored by IBM, so are *not* included in this update (I will be seeking approval from contributors): core/direct-controls.c core/flash.c core/pcie-slot.c external/common/arch_flash_unknown.c external/common/rules.mk external/gard/Makefile external/gard/rules.mk external/opal-prd/Makefile external/pflash/Makefile external/xscom-utils/Makefile hdata/vpd.c hw/dts.c hw/ipmi/ipmi-watchdog.c hw/phb4.c include/cpu.h include/phb4.h include/platform.h libflash/libffs.c libstb/mbedtls/sha512.c libstb/mbedtls/sha512.h platforms/astbmc/barreleye.c platforms/astbmc/garrison.c platforms/astbmc/mihawk.c platforms/astbmc/nicole.c platforms/astbmc/p8dnu.c platforms/astbmc/p8dtu.c platforms/astbmc/p9dsu.c platforms/astbmc/vesnin.c platforms/rhesus/ec/config.h platforms/rhesus/ec/gpio.h platforms/rhesus/gpio.c platforms/rhesus/rhesus.c platforms/astbmc/talos.c platforms/astbmc/romulus.c Signed-off-by: Stewart Smith <stewart@linux.ibm.com> [oliver: fixed up the drift] Signed-off-by: Oliver O'Halloran <oohall@gmail.com>
97 lines
2.1 KiB
C
97 lines
2.1 KiB
C
// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
|
|
/*
|
|
* Timebase helpers.
|
|
*
|
|
* Note: Only use after the TODs are in sync !
|
|
*
|
|
* Copyright 2013-2016 IBM Corp.
|
|
*/
|
|
|
|
#ifndef __TIME_H
|
|
#define __TIME_H
|
|
|
|
#include <time.h>
|
|
|
|
#ifndef __TEST__
|
|
static inline unsigned long mftb(void)
|
|
{
|
|
unsigned long tb;
|
|
|
|
/* We use a memory clobber to avoid this being
|
|
* moved in the instruction stream
|
|
*/
|
|
asm volatile("mftb %0" : "=r"(tb) : : "memory");
|
|
return tb;
|
|
}
|
|
#endif
|
|
|
|
enum tb_cmpval {
|
|
TB_ABEFOREB = -1,
|
|
TB_AEQUALB = 0,
|
|
TB_AAFTERB = 1
|
|
};
|
|
|
|
static inline enum tb_cmpval tb_compare(unsigned long a,
|
|
unsigned long b)
|
|
{
|
|
if (a == b)
|
|
return TB_AEQUALB;
|
|
return ((long)(b - a)) > 0 ? TB_ABEFOREB : TB_AAFTERB;
|
|
}
|
|
|
|
/* Architected timebase */
|
|
extern unsigned long tb_hz;
|
|
|
|
static inline unsigned long secs_to_tb(unsigned long secs)
|
|
{
|
|
return secs * tb_hz;
|
|
}
|
|
|
|
static inline unsigned long tb_to_secs(unsigned long tb)
|
|
{
|
|
return tb / tb_hz;
|
|
}
|
|
|
|
static inline unsigned long tb_remaining_nsecs(unsigned long tb)
|
|
{
|
|
return tb % tb_hz;
|
|
}
|
|
|
|
static inline unsigned long msecs_to_tb(unsigned long msecs)
|
|
{
|
|
return msecs * (tb_hz / 1000);
|
|
}
|
|
|
|
static inline unsigned long tb_to_msecs(unsigned long tb)
|
|
{
|
|
return (tb * 1000) / tb_hz;
|
|
}
|
|
|
|
static inline unsigned long usecs_to_tb(unsigned long usecs)
|
|
{
|
|
return usecs * (tb_hz / 1000000);
|
|
}
|
|
|
|
static inline unsigned long tb_to_usecs(unsigned long tb)
|
|
{
|
|
return (tb * 1000000) / tb_hz;
|
|
}
|
|
|
|
extern unsigned long timespec_to_tb(const struct timespec *ts);
|
|
|
|
/* time_wait - Wait a certain number of TB ticks while polling FSP */
|
|
extern void time_wait(unsigned long duration);
|
|
extern void time_wait_nopoll(unsigned long duration);
|
|
|
|
/* time_wait_ms - Wait a certain number of milliseconds while polling FSP */
|
|
extern void time_wait_ms(unsigned long ms);
|
|
extern void time_wait_ms_nopoll(unsigned long ms);
|
|
|
|
/* time_wait_us - Wait a certain number of microseconds while polling FSP */
|
|
extern void time_wait_us(unsigned long us);
|
|
extern void time_wait_us_nopoll(unsigned long us);
|
|
|
|
/* nanosleep_nopoll - variant for use from hostservices */
|
|
extern int nanosleep_nopoll(const struct timespec *req, struct timespec *rem);
|
|
#endif /* __TIME_H */
|