Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2)  *  Copyright (C) 2001 Andrea Arcangeli <andrea@suse.de> SuSE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3)  *  Copyright 2003 Andi Kleen, SuSE Labs.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5)  *  Thanks to hpa@transmeta.com for some useful hint.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6)  *  Special thanks to Ingo Molnar for his early experience with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7)  *  a different vsyscall implementation for Linux/IA32 and for the name.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <linux/time.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <linux/timekeeper_internal.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <asm/vvar.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) void update_vsyscall_tz(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) 	if (unlikely(vvar_data == NULL))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) 	vvar_data->tz_minuteswest = sys_tz.tz_minuteswest;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) 	vvar_data->tz_dsttime = sys_tz.tz_dsttime;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) void update_vsyscall(struct timekeeper *tk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) 	struct vvar_data *vdata = vvar_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) 	if (unlikely(vdata == NULL))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) 	vvar_write_begin(vdata);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) 	vdata->vclock_mode = tk->tkr_mono.clock->archdata.vclock_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) 	vdata->clock.cycle_last = tk->tkr_mono.cycle_last;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) 	vdata->clock.mask = tk->tkr_mono.mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) 	vdata->clock.mult = tk->tkr_mono.mult;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) 	vdata->clock.shift = tk->tkr_mono.shift;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) 	vdata->wall_time_sec = tk->xtime_sec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) 	vdata->wall_time_snsec = tk->tkr_mono.xtime_nsec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) 	vdata->monotonic_time_sec = tk->xtime_sec +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) 				    tk->wall_to_monotonic.tv_sec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) 	vdata->monotonic_time_snsec = tk->tkr_mono.xtime_nsec +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) 				      (tk->wall_to_monotonic.tv_nsec <<
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) 				       tk->tkr_mono.shift);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) 	while (vdata->monotonic_time_snsec >=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) 	       (((u64)NSEC_PER_SEC) << tk->tkr_mono.shift)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) 		vdata->monotonic_time_snsec -=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) 				((u64)NSEC_PER_SEC) << tk->tkr_mono.shift;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) 		vdata->monotonic_time_sec++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) 	vdata->wall_time_coarse_sec = tk->xtime_sec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) 	vdata->wall_time_coarse_nsec =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) 			(long)(tk->tkr_mono.xtime_nsec >> tk->tkr_mono.shift);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) 	vdata->monotonic_time_coarse_sec =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) 		vdata->wall_time_coarse_sec + tk->wall_to_monotonic.tv_sec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) 	vdata->monotonic_time_coarse_nsec =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) 		vdata->wall_time_coarse_nsec + tk->wall_to_monotonic.tv_nsec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) 	while (vdata->monotonic_time_coarse_nsec >= NSEC_PER_SEC) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) 		vdata->monotonic_time_coarse_nsec -= NSEC_PER_SEC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) 		vdata->monotonic_time_coarse_sec++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) 	vvar_write_end(vdata);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) }