Lines Matching refs:vrtc
58 static time_t vrtc_get_physical_rtc_time(struct acrn_vrtc *vrtc);
256 static time_t rtc_to_secs(const struct acrn_vrtc *vrtc) in rtc_to_secs() argument
260 const struct rtcdev *rtc= &vrtc->rtcdev; in rtc_to_secs()
345 static void secs_to_rtc(time_t rtctime, struct acrn_vrtc *vrtc) in secs_to_rtc() argument
352 rtc = &vrtc->rtcdev; in secs_to_rtc()
395 static time_t vrtc_get_current_time(struct acrn_vrtc *vrtc) in vrtc_get_current_time() argument
401 if (vrtc->base_rtctime > 0) { in vrtc_get_current_time()
402 offset = (cpu_ticks() - vrtc->base_tsc) / (get_tsc_khz() * 1000U); in vrtc_get_current_time()
403 second = vrtc->base_rtctime + vrtc->offset_rtctime + (time_t)offset; in vrtc_get_current_time()
404 if (second < vrtc->last_rtctime) { in vrtc_get_current_time()
405 second = vrtc->last_rtctime; in vrtc_get_current_time()
407 vrtc->last_rtctime = second; in vrtc_get_current_time()
473 static uint8_t vrtc_get_reg_c(struct acrn_vrtc *vrtc) in vrtc_get_reg_c() argument
475 uint8_t ret = vrtc->rtcdev.reg_c; in vrtc_get_reg_c()
476 struct rtcdev *rtc = &vrtc->rtcdev; in vrtc_get_reg_c()
496 vrtc->rtcdev.reg_c = 0; in vrtc_get_reg_c()
500 static void vrtc_set_reg_b(struct acrn_vrtc *vrtc, uint8_t newval) in vrtc_set_reg_b() argument
502 vrtc->rtcdev.reg_b = newval; in vrtc_set_reg_b()
539 struct acrn_vrtc *vrtc = &vcpu->vm->vrtc; in vrtc_read() local
544 offset = vrtc->addr; in vrtc_read()
553 current = vrtc_get_current_time(vrtc); in vrtc_read()
554 secs_to_rtc(current, vrtc); in vrtc_read()
557 pio_req->value = vrtc_get_reg_c(vrtc); in vrtc_read()
559 pio_req->value = *((uint8_t *)&vrtc->rtcdev + offset); in vrtc_read()
617 struct acrn_vrtc *vrtc = &vcpu->vm->vrtc; in vrtc_write() local
624 vrtc->addr = (uint8_t)(value & 0x7FU); in vrtc_write()
627 if (vrtc_is_time_register(vrtc->addr)) { in vrtc_write()
629 cmos_set_reg_val(vcpu->vm->vrtc.addr, (uint8_t)(value & 0xFFU)); in vrtc_write()
633 cmos_set_reg_val(vcpu->vm->vrtc.addr, (uint8_t)(value & 0xFFU)); in vrtc_write()
636 switch (vrtc->addr) { in vrtc_write()
640 RTC_DEBUG("RTC reg_%x set to %#x (ignored)\n", vrtc->addr, value); in vrtc_write()
643 vrtc_set_reg_b(vrtc, value); in vrtc_write()
650 *((uint8_t *)&vrtc->rtcdev + vrtc->addr) = (uint8_t)(value & 0x7FU); in vrtc_write()
651 RTC_DEBUG("RTC alarm reg(%d) set to %#x (ignored)\n", vrtc->addr, value); in vrtc_write()
660 RTC_DEBUG("RTC offset %#x set to %#x\n", vrtc->addr, value); in vrtc_write()
661 *((uint8_t *)&vrtc->rtcdev + vrtc->addr) = (uint8_t)(value & mask); in vrtc_write()
662 current = vrtc_get_current_time(vrtc); in vrtc_write()
663 after = rtc_to_secs(vrtc); in vrtc_write()
665 vrtc->offset_rtctime += after - current; in vrtc_write()
666 vrtc->last_rtctime = VRTC_BROKEN_TIME; in vrtc_write()
668 if (is_postlaunched_vm(vcpu->vm) && vrtc_is_time_register(vrtc->addr)) { in vrtc_write()
685 static time_t vrtc_get_physical_rtc_time(struct acrn_vrtc *vrtc) in vrtc_get_physical_rtc_time() argument
687 struct rtcdev *vrtcdev = &vrtc->rtcdev; in vrtc_get_physical_rtc_time()
698 return rtc_to_secs(vrtc); in vrtc_get_physical_rtc_time()
710 vm->vrtc.base_tsc = cpu_ticks(); in vrtc_update_basetime()
711 vm->vrtc.base_rtctime = physical_time; in vrtc_update_basetime()
712 vm->vrtc.offset_rtctime += offset; in vrtc_update_basetime()
742 static void vrtc_set_basetime(struct acrn_vrtc *vrtc) in vrtc_set_basetime() argument
744 struct rtcdev *vrtcdev = &vrtc->rtcdev; in vrtc_set_basetime()
762 current = rtc_to_secs(vrtc); in vrtc_set_basetime()
764 vrtc->base_rtctime = current; in vrtc_set_basetime()
765 vrtc->last_rtctime = VRTC_BROKEN_TIME; in vrtc_set_basetime()
810 vm->vrtc.addr = 0U; in vrtc_init()
812 vm->vrtc.vm = vm; in vrtc_init()
818 vrtc_set_basetime(&vm->vrtc); in vrtc_init()
819 vm->vrtc.base_tsc = cpu_ticks(); in vrtc_init()