xref: /linux/drivers/ptp/ptp_kvm_arm.c (revision 8be98d2f2a0a262f8bf8a0bc1fdf522b3c7aab17)
1*300bb1feSJianyong Wu // SPDX-License-Identifier: GPL-2.0-only
2*300bb1feSJianyong Wu /*
3*300bb1feSJianyong Wu  *  Virtual PTP 1588 clock for use with KVM guests
4*300bb1feSJianyong Wu  *  Copyright (C) 2019 ARM Ltd.
5*300bb1feSJianyong Wu  *  All Rights Reserved
6*300bb1feSJianyong Wu  */
7*300bb1feSJianyong Wu 
8*300bb1feSJianyong Wu #include <linux/arm-smccc.h>
9*300bb1feSJianyong Wu #include <linux/ptp_kvm.h>
10*300bb1feSJianyong Wu 
11*300bb1feSJianyong Wu #include <asm/arch_timer.h>
12*300bb1feSJianyong Wu #include <asm/hypervisor.h>
13*300bb1feSJianyong Wu 
14*300bb1feSJianyong Wu int kvm_arch_ptp_init(void)
15*300bb1feSJianyong Wu {
16*300bb1feSJianyong Wu 	int ret;
17*300bb1feSJianyong Wu 
18*300bb1feSJianyong Wu 	ret = kvm_arm_hyp_service_available(ARM_SMCCC_KVM_FUNC_PTP);
19*300bb1feSJianyong Wu 	if (ret <= 0)
20*300bb1feSJianyong Wu 		return -EOPNOTSUPP;
21*300bb1feSJianyong Wu 
22*300bb1feSJianyong Wu 	return 0;
23*300bb1feSJianyong Wu }
24*300bb1feSJianyong Wu 
25*300bb1feSJianyong Wu int kvm_arch_ptp_get_clock(struct timespec64 *ts)
26*300bb1feSJianyong Wu {
27*300bb1feSJianyong Wu 	return kvm_arch_ptp_get_crosststamp(NULL, ts, NULL);
28*300bb1feSJianyong Wu }
29