@@ -78,6 +78,7 @@ struct cpu {
#define CTL0_EMERGENCY_SIGNAL (63 - 49)
#define CTL0_EXTERNAL_CALL (63 - 50)
#define CTL0_CLOCK_COMPARATOR (63 - 52)
+#define CTL0_CPU_TIMER (63 - 53)
#define CTL0_SERVICE_SIGNAL (63 - 54)
#define CR0_EXTM_MASK 0x0000000000006200UL /* Combined external masks */
@@ -11,9 +11,13 @@
#ifndef _ASMS390X_TIME_H_
#define _ASMS390X_TIME_H_
-#define STCK_SHIFT_US (63 - 51)
+#define S390_CLOCK_SHIFT_US (63 - 51)
+
+#define STCK_SHIFT_US S390_CLOCK_SHIFT_US
#define STCK_MAX ((1UL << 52) - 1)
+#define CPU_TIMER_SHIFT_US S390_CLOCK_SHIFT_US
+
static inline uint64_t get_clock_us(void)
{
uint64_t clk;
@@ -45,4 +49,15 @@ static inline void mdelay(unsigned long ms)
udelay(ms * 1000);
}
+static inline void cpu_timer_set_ms(int64_t timeout_ms)
+{
+ int64_t timer_value = (timeout_ms * 1000) << CPU_TIMER_SHIFT_US;
+
+ asm volatile (
+ "spt %[timer_value]\n"
+ :
+ : [timer_value] "Q" (timer_value)
+ );
+}
+
#endif