Lines Matching refs:vrtc

76 struct vrtc {  struct
191 static void vrtc_set_reg_c(struct vrtc *vrtc, uint8_t newval);
205 update_enabled(struct vrtc *vrtc) in update_enabled() argument
213 if (!divider_enabled(vrtc->rtcdev.reg_a)) in update_enabled()
216 if (rtc_halted(vrtc)) in update_enabled()
219 if (vrtc->base_rtctime == VRTC_BROKEN_TIME) in update_enabled()
237 vrtc_curtime(struct vrtc *vrtc, time_t *basetime) in vrtc_curtime() argument
242 t = vrtc->base_rtctime; in vrtc_curtime()
243 *basetime = vrtc->base_uptime; in vrtc_curtime()
244 if (update_enabled(vrtc)) { in vrtc_curtime()
246 delta = now - vrtc->base_uptime; in vrtc_curtime()
331 vrtc_freq(struct vrtc *vrtc) in vrtc_freq() argument
361 if (pintr_enabled(vrtc) && divider_enabled(vrtc->rtcdev.reg_a)) { in vrtc_freq()
362 ratesel = vrtc->rtcdev.reg_a & 0xf; in vrtc_freq()
364 } else if (aintr_enabled(vrtc) && update_enabled(vrtc)) in vrtc_freq()
366 else if (uintr_enabled(vrtc) && update_enabled(vrtc)) in vrtc_freq()
393 secs_to_rtc(time_t rtctime, struct vrtc *vrtc, int force_update) in secs_to_rtc() argument
409 if (rtc_halted(vrtc) && !force_update) in secs_to_rtc()
422 rtc = &vrtc->rtcdev; in secs_to_rtc()
461 rtc_to_secs(struct vrtc *vrtc) in rtc_to_secs() argument
468 rtc = &vrtc->rtcdev; in rtc_to_secs()
587 vrtc_time_update(struct vrtc *vrtc, time_t newtime, time_t newbase) in vrtc_time_update() argument
593 rtc = &vrtc->rtcdev; in vrtc_time_update()
598 oldtime = vrtc->base_rtctime; in vrtc_time_update()
603 vrtc->base_uptime, newbase); in vrtc_time_update()
604 vrtc->base_uptime = newbase; in vrtc_time_update()
615 vrtc->base_rtctime = VRTC_BROKEN_TIME; in vrtc_time_update()
622 if (rtc_halted(vrtc)) { in vrtc_time_update()
635 if (aintr_enabled(vrtc) && oldtime != VRTC_BROKEN_TIME) in vrtc_time_update()
636 vrtc->base_rtctime++; in vrtc_time_update()
638 vrtc->base_rtctime = newtime; in vrtc_time_update()
640 if (aintr_enabled(vrtc)) { in vrtc_time_update()
645 secs_to_rtc(vrtc->base_rtctime, vrtc, 0); in vrtc_time_update()
651 vrtc_set_reg_c(vrtc, rtc->reg_c | RTCIR_ALARM); in vrtc_time_update()
654 } while (vrtc->base_rtctime != newtime); in vrtc_time_update()
656 if (uintr_enabled(vrtc)) in vrtc_time_update()
657 vrtc_set_reg_c(vrtc, rtc->reg_c | RTCIR_UPDATE); in vrtc_time_update()
665 struct vrtc *vrtc = arg; in vrtc_periodic_timer() local
667 pthread_mutex_lock(&vrtc->mtx); in vrtc_periodic_timer()
669 if (pintr_enabled(vrtc)) in vrtc_periodic_timer()
670 vrtc_set_reg_c(vrtc, vrtc->rtcdev.reg_c | RTCIR_PERIOD); in vrtc_periodic_timer()
672 pthread_mutex_unlock(&vrtc->mtx); in vrtc_periodic_timer()
678 struct vrtc *vrtc = arg; in vrtc_update_timer() local
682 pthread_mutex_lock(&vrtc->mtx); in vrtc_update_timer()
684 if (aintr_enabled(vrtc) || uintr_enabled(vrtc)) { in vrtc_update_timer()
685 curtime = vrtc_curtime(vrtc, &basetime); in vrtc_update_timer()
686 vrtc_time_update(vrtc, curtime, basetime); in vrtc_update_timer()
689 pthread_mutex_unlock(&vrtc->mtx); in vrtc_update_timer()
693 vrtc_set_reg_c(struct vrtc *vrtc, uint8_t newval) in vrtc_set_reg_c() argument
699 rtc = &vrtc->rtcdev; in vrtc_set_reg_c()
704 if ((aintr_enabled(vrtc) && (newval & RTCIR_ALARM) != 0) || in vrtc_set_reg_c()
705 (pintr_enabled(vrtc) && (newval & RTCIR_PERIOD) != 0) || in vrtc_set_reg_c()
706 (uintr_enabled(vrtc) && (newval & RTCIR_UPDATE) != 0)) { in vrtc_set_reg_c()
722 vm_set_gsi_irq(vrtc->vm, RTC_IRQ, GSI_SET_HIGH); in vrtc_set_reg_c()
725 vm_set_gsi_irq(vrtc->vm, RTC_IRQ, GSI_SET_LOW); in vrtc_set_reg_c()
743 vrtc_set_reg_b(struct vrtc *vrtc, uint8_t newval) in vrtc_set_reg_b() argument
750 rtc = &vrtc->rtcdev; in vrtc_set_reg_b()
752 oldfreq = vrtc_freq(vrtc); in vrtc_set_reg_b()
763 rtctime = rtc_to_secs(vrtc); in vrtc_set_reg_b()
770 if (vrtc->halted_rtctime != VRTC_BROKEN_TIME && in vrtc_set_reg_b()
771 rtctime != vrtc->halted_rtctime) { in vrtc_set_reg_b()
772 send_rtc_chg_event(rtctime, vrtc->halted_rtctime); in vrtc_set_reg_b()
773 vrtc->halted_rtctime = VRTC_BROKEN_TIME; in vrtc_set_reg_b()
777 curtime = vrtc_curtime(vrtc, &basetime); in vrtc_set_reg_b()
778 if (curtime != vrtc->base_rtctime) in vrtc_set_reg_b()
780 vrtc->halted_rtctime = curtime; in vrtc_set_reg_b()
786 secs_to_rtc(curtime, vrtc, 1); in vrtc_set_reg_b()
795 if (vrtc_time_update(vrtc, rtctime, basetime) != 0) in vrtc_set_reg_b()
803 vrtc_set_reg_c(vrtc, vrtc->rtcdev.reg_c); in vrtc_set_reg_b()
808 newfreq = vrtc_freq(vrtc); in vrtc_set_reg_b()
810 if (pintr_enabled(vrtc) && newfreq != oldfreq) { in vrtc_set_reg_b()
812 vrtc_start_timer(&vrtc->periodic_timer, 0, newfreq); in vrtc_set_reg_b()
826 vrtc_set_reg_a(struct vrtc *vrtc, uint8_t newval) in vrtc_set_reg_a() argument
832 oldval = vrtc->rtcdev.reg_a; in vrtc_set_reg_a()
833 oldfreq = vrtc_freq(vrtc); in vrtc_set_reg_a()
837 vrtc->base_rtctime, vrtc->base_uptime); in vrtc_set_reg_a()
845 vrtc->base_uptime = monotonic_time(); in vrtc_set_reg_a()
847 vrtc->base_rtctime, vrtc->base_uptime); in vrtc_set_reg_a()
852 vrtc->rtcdev.reg_a = newval; in vrtc_set_reg_a()
862 newfreq = vrtc_freq(vrtc); in vrtc_set_reg_a()
864 if (pintr_enabled(vrtc) && newfreq != oldfreq) { in vrtc_set_reg_a()
866 vrtc_start_timer(&vrtc->periodic_timer, 0, newfreq); in vrtc_set_reg_a()
873 vrtc_nvram_write(struct vrtc *vrtc, int offset, uint8_t value) in vrtc_nvram_write() argument
887 pthread_mutex_lock(&vrtc->mtx); in vrtc_nvram_write()
888 ptr = (uint8_t *)(&vrtc->rtcdev); in vrtc_nvram_write()
891 pthread_mutex_unlock(&vrtc->mtx); in vrtc_nvram_write()
900 struct vrtc *vrtc = arg; in vrtc_addr_handler() local
910 pthread_mutex_lock(&vrtc->mtx); in vrtc_addr_handler()
911 vrtc->addr = *eax & 0x7f; in vrtc_addr_handler()
912 pthread_mutex_unlock(&vrtc->mtx); in vrtc_addr_handler()
927 struct vrtc *vrtc = arg; in vrtc_data_handler() local
933 rtc = &vrtc->rtcdev; in vrtc_data_handler()
938 pthread_mutex_lock(&vrtc->mtx); in vrtc_data_handler()
939 offset = vrtc->addr; in vrtc_data_handler()
941 pthread_mutex_unlock(&vrtc->mtx); in vrtc_data_handler()
946 curtime = vrtc_curtime(vrtc, &basetime); in vrtc_data_handler()
947 vrtc_time_update(vrtc, curtime, basetime); in vrtc_data_handler()
957 secs_to_rtc(curtime, vrtc, 0); in vrtc_data_handler()
966 *eax = vrtc->rtcdev.reg_c; in vrtc_data_handler()
967 vrtc_set_reg_c(vrtc, 0); in vrtc_data_handler()
976 vrtc_set_reg_a(vrtc, *eax); in vrtc_data_handler()
980 error = vrtc_set_reg_b(vrtc, *eax); in vrtc_data_handler()
1005 if (vrtc_is_time_register(offset) && !rtc_halted(vrtc)) { in vrtc_data_handler()
1007 curtime = rtc_to_secs(vrtc); in vrtc_data_handler()
1008 error = vrtc_time_update(vrtc, curtime, monotonic_time()); in vrtc_data_handler()
1016 send_rtc_chg_event(rtc_to_secs(vrtc), last_time); in vrtc_data_handler()
1021 pthread_mutex_unlock(&vrtc->mtx); in vrtc_data_handler()
1027 vrtc_set_time(struct vrtc *vrtc, time_t secs) in vrtc_set_time() argument
1031 pthread_mutex_lock(&vrtc->mtx); in vrtc_set_time()
1032 error = vrtc_time_update(vrtc, secs, monotonic_time()); in vrtc_set_time()
1033 pthread_mutex_unlock(&vrtc->mtx); in vrtc_set_time()
1048 struct vrtc *vrtc = ctx->vrtc; in vrtc_suspend() local
1049 struct rtcdev *rtc = &vrtc->rtcdev; in vrtc_suspend()
1057 struct vrtc *vrtc; in vrtc_init() local
1064 vrtc = calloc(1, sizeof(struct vrtc)); in vrtc_init()
1065 if (vrtc == NULL) in vrtc_init()
1068 vrtc->vm = ctx; in vrtc_init()
1069 ctx->vrtc = vrtc; in vrtc_init()
1071 pthread_mutex_init(&vrtc->mtx, NULL); in vrtc_init()
1086 if (vrtc_nvram_write(vrtc, RTC_LMEM_LSB, lomem) != 0) { in vrtc_init()
1091 if (vrtc_nvram_write(vrtc, RTC_LMEM_MSB, lomem >> 8) != 0) { in vrtc_init()
1097 if (vrtc_nvram_write(vrtc, RTC_HMEM_LSB, himem) != 0) { in vrtc_init()
1102 if (vrtc_nvram_write(vrtc, RTC_HMEM_SB, himem >> 8) != 0) { in vrtc_init()
1107 if (vrtc_nvram_write(vrtc, RTC_HMEM_MSB, himem >> 16) != 0) { in vrtc_init()
1120 rtc_addr.arg = vrtc; in vrtc_init()
1132 rtc_data.arg = vrtc; in vrtc_init()
1139 rtc = &vrtc->rtcdev; in vrtc_init()
1146 vrtc->addr = RTC_STATUSD; in vrtc_init()
1148 vrtc->halted_rtctime = VRTC_BROKEN_TIME; in vrtc_init()
1155 pthread_mutex_lock(&vrtc->mtx); in vrtc_init()
1156 vrtc->base_rtctime = VRTC_BROKEN_TIME; in vrtc_init()
1157 vrtc_time_update(vrtc, curtime, monotonic_time()); in vrtc_init()
1158 secs_to_rtc(curtime, vrtc, 0); in vrtc_init()
1159 pthread_mutex_unlock(&vrtc->mtx); in vrtc_init()
1162 vrtc->periodic_timer.clockid = CLOCK_MONOTONIC; in vrtc_init()
1163 acrn_timer_init(&vrtc->periodic_timer, vrtc_periodic_timer, vrtc); in vrtc_init()
1166 vrtc->update_timer.clockid = CLOCK_MONOTONIC; in vrtc_init()
1167 acrn_timer_init(&vrtc->update_timer, vrtc_update_timer, vrtc); in vrtc_init()
1168 vrtc_start_timer(&vrtc->update_timer, 1, 0); in vrtc_init()
1173 free(vrtc); in vrtc_init()
1180 struct vrtc *vrtc = ctx->vrtc; in vrtc_deinit() local
1184 acrn_timer_deinit(&vrtc->periodic_timer); in vrtc_deinit()
1185 acrn_timer_deinit(&vrtc->update_timer); in vrtc_deinit()
1199 free(vrtc); in vrtc_deinit()
1200 ctx->vrtc = NULL; in vrtc_deinit()