| /* SPDX-License-Identifier: GPL-2.0-only */ |
| /* |
| * Clock utilities for s390 |
| * |
| * Authors: |
| * Thomas Huth <thuth@redhat.com> |
| * |
| * Copied from the s390/intercept test by: |
| * Pierre Morel <pmorel@linux.ibm.com> |
| */ |
| #ifndef ASM_S390X_TIME_H |
| #define ASM_S390X_TIME_H |
| |
| #define STCK_SHIFT_US (63 - 51) |
| #define STCK_MAX ((1UL << 52) - 1) |
| |
| static inline uint64_t get_clock_us(void) |
| { |
| uint64_t clk; |
| |
| asm volatile(" stck %0 " : : "Q"(clk) : "memory"); |
| |
| return clk >> STCK_SHIFT_US; |
| } |
| |
| static inline uint64_t get_clock_ms(void) |
| { |
| return get_clock_us() / 1000; |
| } |
| |
| static inline void udelay(unsigned long us) |
| { |
| unsigned long startclk = get_clock_us(); |
| unsigned long c; |
| |
| do { |
| c = get_clock_us(); |
| if (c < startclk) |
| c += STCK_MAX; |
| } while (c < startclk + us); |
| } |
| |
| static inline void mdelay(unsigned long ms) |
| { |
| udelay(ms * 1000); |
| } |
| |
| #endif |