Lines Matching full:st

98 static int vmclock_get_crosststamp(struct vmclock_state *st,  in vmclock_get_crosststamp()  argument
116 seq = le32_to_cpu(st->clk->seq_count) & ~1ULL; in vmclock_get_crosststamp()
124 if (st->clk->clock_status == VMCLOCK_STATUS_UNRELIABLE) in vmclock_get_crosststamp()
130 * same counter as st->cs_id, in which case all three times in vmclock_get_crosststamp()
140 if (sts->pre_sts.cs_id == st->cs_id) { in vmclock_get_crosststamp()
143 } else if (sts->pre_sts.hw_csid == st->cs_id && in vmclock_get_crosststamp()
155 delta = cycle - le64_to_cpu(st->clk->counter_value); in vmclock_get_crosststamp()
158 le64_to_cpu(st->clk->counter_period_frac_sec), in vmclock_get_crosststamp()
159 st->clk->counter_period_shift, in vmclock_get_crosststamp()
160 le64_to_cpu(st->clk->time_frac_sec)); in vmclock_get_crosststamp()
162 tspec->tv_sec += le64_to_cpu(st->clk->time_sec); in vmclock_get_crosststamp()
164 if (!tai_adjust(st->clk, &tspec->tv_sec)) in vmclock_get_crosststamp()
172 if (seq == le32_to_cpu(st->clk->seq_count)) in vmclock_get_crosststamp()
181 system_counter->cs_id = st->cs_id; in vmclock_get_crosststamp()
193 static int vmclock_get_crosststamp_kvmclock(struct vmclock_state *st, in vmclock_get_crosststamp_kvmclock() argument
207 ret = vmclock_get_crosststamp(st, sts, system_counter, tspec); in vmclock_get_crosststamp_kvmclock()
236 struct vmclock_state *st = ctx; in ptp_vmclock_get_time_fn() local
241 if (READ_ONCE(st->sys_cs_id) == CSID_X86_KVM_CLK) in ptp_vmclock_get_time_fn()
242 ret = vmclock_get_crosststamp_kvmclock(st, NULL, system_counter, in ptp_vmclock_get_time_fn()
246 ret = vmclock_get_crosststamp(st, NULL, system_counter, &tspec); in ptp_vmclock_get_time_fn()
257 struct vmclock_state *st = container_of(ptp, struct vmclock_state, in ptp_vmclock_getcrosststamp() local
259 int ret = get_device_system_crosststamp(ptp_vmclock_get_time_fn, st, in ptp_vmclock_getcrosststamp()
274 WRITE_ONCE(st->sys_cs_id, systime_snapshot.cs_id); in ptp_vmclock_getcrosststamp()
276 st, NULL, xtstamp); in ptp_vmclock_getcrosststamp()
306 struct vmclock_state *st = container_of(ptp, struct vmclock_state, in ptp_vmclock_gettimex() local
309 return vmclock_get_crosststamp(st, sts, NULL, ts); in ptp_vmclock_gettimex()
333 struct vmclock_state *st) in vmclock_ptp_register() argument
338 st->clk->counter_id == VMCLOCK_COUNTER_ARM_VCNT) { in vmclock_ptp_register()
342 st->clk->counter_id == VMCLOCK_COUNTER_X86_TSC) { in vmclock_ptp_register()
349 if (!tai_adjust(st->clk, NULL)) { in vmclock_ptp_register()
354 st->sys_cs_id = cs_id; in vmclock_ptp_register()
355 st->cs_id = cs_id; in vmclock_ptp_register()
356 st->ptp_clock_info = ptp_vmclock_info; in vmclock_ptp_register()
357 strscpy(st->ptp_clock_info.name, st->name); in vmclock_ptp_register()
359 return ptp_clock_register(&st->ptp_clock_info, dev); in vmclock_ptp_register()
363 struct vmclock_state *st; member
370 struct vmclock_state *st = fst->st; in vmclock_miscdev_mmap() local
385 st->res.start >> PAGE_SHIFT, PAGE_SIZE, in vmclock_miscdev_mmap()
397 struct vmclock_state *st = fst->st; in vmclock_miscdev_read() local
410 seq = le32_to_cpu(st->clk->seq_count) & ~1U; in vmclock_miscdev_read()
414 if (copy_to_user(buf, ((char *)st->clk) + *ppos, count)) in vmclock_miscdev_read()
419 if (seq == le32_to_cpu(st->clk->seq_count)) { in vmclock_miscdev_read()
441 struct vmclock_state *st = fst->st; in vmclock_miscdev_poll() local
448 if (!(le64_to_cpu(st->clk->flags) & VMCLOCK_FLAG_NOTIFICATION_PRESENT)) in vmclock_miscdev_poll()
451 poll_wait(fp, &st->disrupt_wait, wait); in vmclock_miscdev_poll()
453 seq = le32_to_cpu(st->clk->seq_count); in vmclock_miscdev_poll()
462 struct vmclock_state *st = container_of(fp->private_data, in vmclock_miscdev_open() local
469 fst->st = st; in vmclock_miscdev_open()
497 struct vmclock_state *st = data; in vmclock_acpi_resources() local
505 if (resource_type(&st->res) == IORESOURCE_MEM) in vmclock_acpi_resources()
512 resource_size(res) < sizeof(st->clk)) in vmclock_acpi_resources()
515 st->res = *res; in vmclock_acpi_resources()
527 struct vmclock_state *st = device->driver_data; in vmclock_acpi_notification_handler() local
529 wake_up_interruptible(&st->disrupt_wait); in vmclock_acpi_notification_handler()
556 static int vmclock_probe_acpi(struct device *dev, struct vmclock_state *st) in vmclock_probe_acpi() argument
570 vmclock_acpi_resources, st); in vmclock_probe_acpi()
571 if (ACPI_FAILURE(status) || resource_type(&st->res) != IORESOURCE_MEM) { in vmclock_probe_acpi()
582 struct vmclock_state *st = _st; in vmclock_of_irq_handler() local
584 wake_up_interruptible(&st->disrupt_wait); in vmclock_of_irq_handler()
588 static int vmclock_probe_dt(struct device *dev, struct vmclock_state *st) in vmclock_probe_dt() argument
597 st->res = *res; in vmclock_probe_dt()
616 struct vmclock_state *st) in vmclock_setup_notification() argument
619 if (!(le64_to_cpu(st->clk->flags) & VMCLOCK_FLAG_NOTIFICATION_PRESENT)) in vmclock_setup_notification()
632 struct vmclock_state *st = dev->driver_data; in vmclock_remove() local
634 if (!st) { in vmclock_remove()
646 if (st->ptp_clock) in vmclock_remove()
647 ptp_clock_unregister(st->ptp_clock); in vmclock_remove()
649 if (st->miscdev.minor != MISC_DYNAMIC_MINOR) in vmclock_remove()
650 misc_deregister(&st->miscdev); in vmclock_remove()
657 struct vmclock_state *st = data; in vmclock_put_idx() local
659 ida_free(&vmclock_ida, st->index); in vmclock_put_idx()
665 struct vmclock_state *st; in vmclock_probe() local
668 st = devm_kzalloc(dev, sizeof(*st), GFP_KERNEL); in vmclock_probe()
669 if (!st) in vmclock_probe()
674 ret = vmclock_probe_acpi(dev, st); in vmclock_probe()
677 ret = vmclock_probe_dt(dev, st); in vmclock_probe()
684 if (resource_size(&st->res) < VMCLOCK_MIN_SIZE) { in vmclock_probe()
686 resource_size(&st->res)); in vmclock_probe()
689 st->clk = devm_memremap(dev, st->res.start, resource_size(&st->res), in vmclock_probe()
691 if (IS_ERR(st->clk)) { in vmclock_probe()
692 ret = PTR_ERR(st->clk); in vmclock_probe()
694 st->clk = NULL; in vmclock_probe()
698 if (le32_to_cpu(st->clk->magic) != VMCLOCK_MAGIC || in vmclock_probe()
699 le32_to_cpu(st->clk->size) > resource_size(&st->res) || in vmclock_probe()
700 le16_to_cpu(st->clk->version) != 1) { in vmclock_probe()
709 st->index = ret; in vmclock_probe()
710 ret = devm_add_action_or_reset(&pdev->dev, vmclock_put_idx, st); in vmclock_probe()
714 st->name = devm_kasprintf(&pdev->dev, GFP_KERNEL, "vmclock%d", st->index); in vmclock_probe()
715 if (!st->name) in vmclock_probe()
718 st->miscdev.minor = MISC_DYNAMIC_MINOR; in vmclock_probe()
720 init_waitqueue_head(&st->disrupt_wait); in vmclock_probe()
721 dev->driver_data = st; in vmclock_probe()
727 ret = vmclock_setup_notification(dev, st); in vmclock_probe()
737 if (le32_to_cpu(st->clk->size) >= PAGE_SIZE) { in vmclock_probe()
738 st->miscdev.fops = &vmclock_miscdev_fops; in vmclock_probe()
739 st->miscdev.name = st->name; in vmclock_probe()
741 ret = misc_register(&st->miscdev); in vmclock_probe()
747 if (VMCLOCK_FIELD_PRESENT(st->clk, time_frac_sec)) { in vmclock_probe()
749 st->ptp_clock = vmclock_ptp_register(dev, st); in vmclock_probe()
750 if (IS_ERR(st->ptp_clock)) { in vmclock_probe()
751 ret = PTR_ERR(st->ptp_clock); in vmclock_probe()
752 st->ptp_clock = NULL; in vmclock_probe()
757 if (!st->miscdev.minor && !st->ptp_clock) { in vmclock_probe()
763 dev_info(dev, "%s: registered %s%s%s\n", st->name, in vmclock_probe()
764 st->miscdev.minor ? "miscdev" : "", in vmclock_probe()
765 (st->miscdev.minor && st->ptp_clock) ? ", " : "", in vmclock_probe()
766 st->ptp_clock ? "PTP" : ""); in vmclock_probe()