19a08862aSNagarathnam Muthusamy /* 29a08862aSNagarathnam Muthusamy * Copyright (c) 2017 Oracle and/or its affiliates. All rights reserved. 39a08862aSNagarathnam Muthusamy */ 49a08862aSNagarathnam Muthusamy 59a08862aSNagarathnam Muthusamy #ifndef _ASM_SPARC_VVAR_DATA_H 69a08862aSNagarathnam Muthusamy #define _ASM_SPARC_VVAR_DATA_H 79a08862aSNagarathnam Muthusamy 89a08862aSNagarathnam Muthusamy #include <asm/clocksource.h> 9*0cd39f46SPeter Zijlstra #include <asm/processor.h> 10*0cd39f46SPeter Zijlstra #include <asm/barrier.h> 119a08862aSNagarathnam Muthusamy #include <linux/time.h> 129a08862aSNagarathnam Muthusamy #include <linux/types.h> 139a08862aSNagarathnam Muthusamy 149a08862aSNagarathnam Muthusamy struct vvar_data { 159a08862aSNagarathnam Muthusamy unsigned int seq; 169a08862aSNagarathnam Muthusamy 179a08862aSNagarathnam Muthusamy int vclock_mode; 189a08862aSNagarathnam Muthusamy struct { /* extract of a clocksource struct */ 199a08862aSNagarathnam Muthusamy u64 cycle_last; 209a08862aSNagarathnam Muthusamy u64 mask; 219a08862aSNagarathnam Muthusamy int mult; 229a08862aSNagarathnam Muthusamy int shift; 239a08862aSNagarathnam Muthusamy } clock; 249a08862aSNagarathnam Muthusamy /* open coded 'struct timespec' */ 259a08862aSNagarathnam Muthusamy u64 wall_time_sec; 269a08862aSNagarathnam Muthusamy u64 wall_time_snsec; 279a08862aSNagarathnam Muthusamy u64 monotonic_time_snsec; 289a08862aSNagarathnam Muthusamy u64 monotonic_time_sec; 299a08862aSNagarathnam Muthusamy u64 monotonic_time_coarse_sec; 309a08862aSNagarathnam Muthusamy u64 monotonic_time_coarse_nsec; 319a08862aSNagarathnam Muthusamy u64 wall_time_coarse_sec; 329a08862aSNagarathnam Muthusamy u64 wall_time_coarse_nsec; 339a08862aSNagarathnam Muthusamy 349a08862aSNagarathnam Muthusamy int tz_minuteswest; 359a08862aSNagarathnam Muthusamy int tz_dsttime; 369a08862aSNagarathnam Muthusamy }; 379a08862aSNagarathnam Muthusamy 389a08862aSNagarathnam Muthusamy extern struct vvar_data *vvar_data; 399a08862aSNagarathnam Muthusamy extern int vdso_fix_stick; 409a08862aSNagarathnam Muthusamy vvar_read_begin(const struct vvar_data * s)419a08862aSNagarathnam Muthusamystatic inline unsigned int vvar_read_begin(const struct vvar_data *s) 429a08862aSNagarathnam Muthusamy { 439a08862aSNagarathnam Muthusamy unsigned int ret; 449a08862aSNagarathnam Muthusamy 459a08862aSNagarathnam Muthusamy repeat: 469a08862aSNagarathnam Muthusamy ret = READ_ONCE(s->seq); 479a08862aSNagarathnam Muthusamy if (unlikely(ret & 1)) { 489a08862aSNagarathnam Muthusamy cpu_relax(); 499a08862aSNagarathnam Muthusamy goto repeat; 509a08862aSNagarathnam Muthusamy } 519a08862aSNagarathnam Muthusamy smp_rmb(); /* Finish all reads before we return seq */ 529a08862aSNagarathnam Muthusamy return ret; 539a08862aSNagarathnam Muthusamy } 549a08862aSNagarathnam Muthusamy vvar_read_retry(const struct vvar_data * s,unsigned int start)559a08862aSNagarathnam Muthusamystatic inline int vvar_read_retry(const struct vvar_data *s, 569a08862aSNagarathnam Muthusamy unsigned int start) 579a08862aSNagarathnam Muthusamy { 589a08862aSNagarathnam Muthusamy smp_rmb(); /* Finish all reads before checking the value of seq */ 599a08862aSNagarathnam Muthusamy return unlikely(s->seq != start); 609a08862aSNagarathnam Muthusamy } 619a08862aSNagarathnam Muthusamy vvar_write_begin(struct vvar_data * s)629a08862aSNagarathnam Muthusamystatic inline void vvar_write_begin(struct vvar_data *s) 639a08862aSNagarathnam Muthusamy { 649a08862aSNagarathnam Muthusamy ++s->seq; 659a08862aSNagarathnam Muthusamy smp_wmb(); /* Makes sure that increment of seq is reflected */ 669a08862aSNagarathnam Muthusamy } 679a08862aSNagarathnam Muthusamy vvar_write_end(struct vvar_data * s)689a08862aSNagarathnam Muthusamystatic inline void vvar_write_end(struct vvar_data *s) 699a08862aSNagarathnam Muthusamy { 709a08862aSNagarathnam Muthusamy smp_wmb(); /* Makes the value of seq current before we increment */ 719a08862aSNagarathnam Muthusamy ++s->seq; 729a08862aSNagarathnam Muthusamy } 739a08862aSNagarathnam Muthusamy 749a08862aSNagarathnam Muthusamy 759a08862aSNagarathnam Muthusamy #endif /* _ASM_SPARC_VVAR_DATA_H */ 76