Message ID | 20191015104822.13890-5-jianyong.wu@arm.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Enable ptp_kvm for arm64 | expand |
On 15/10/19 12:48, Jianyong Wu wrote: > diff --git a/drivers/clocksource/arm_arch_timer.c b/drivers/clocksource/arm_arch_timer.c > index 07e57a49d1e8..3597f1f27b10 100644 > --- a/drivers/clocksource/arm_arch_timer.c > +++ b/drivers/clocksource/arm_arch_timer.c > @@ -1634,3 +1634,8 @@ static int __init arch_timer_acpi_init(struct acpi_table_header *table) > } > TIMER_ACPI_DECLARE(arch_timer, ACPI_SIG_GTDT, arch_timer_acpi_init); > #endif > + > +bool is_arm_arch_counter(void *cs) > +{ > + return (struct clocksource *)cs == &clocksource_counter; > +} As Thomas pointed out, any reason to have a void * here? However, since he didn't like modifying the struct, here is an alternative idea: 1) add a "struct clocksource*" argument to ktime_get_snapshot 2) return -ENODEV if the argument is not NULL and is not the current clocksource 3) move the implementation of the hypercall to drivers/clocksource/arm_arch_timer.c, so that it can call ktime_get_snapshot(&systime_snapshot, &clocksource_counter); Paolo
On Wed, 16 Oct 2019, Paolo Bonzini wrote: > On 15/10/19 12:48, Jianyong Wu wrote: > > diff --git a/drivers/clocksource/arm_arch_timer.c b/drivers/clocksource/arm_arch_timer.c > > index 07e57a49d1e8..3597f1f27b10 100644 > > --- a/drivers/clocksource/arm_arch_timer.c > > +++ b/drivers/clocksource/arm_arch_timer.c > > @@ -1634,3 +1634,8 @@ static int __init arch_timer_acpi_init(struct acpi_table_header *table) > > } > > TIMER_ACPI_DECLARE(arch_timer, ACPI_SIG_GTDT, arch_timer_acpi_init); > > #endif > > + > > +bool is_arm_arch_counter(void *cs) > > +{ > > + return (struct clocksource *)cs == &clocksource_counter; > > +} > > As Thomas pointed out, any reason to have a void * here? > > However, since he didn't like modifying the struct, here is an > alternative idea: > > 1) add a "struct clocksource*" argument to ktime_get_snapshot > > 2) return -ENODEV if the argument is not NULL and is not the current > clocksource > > 3) move the implementation of the hypercall to > drivers/clocksource/arm_arch_timer.c, so that it can call > ktime_get_snapshot(&systime_snapshot, &clocksource_counter); And then you implement a gazillion of those functions for every arch/subarch which has a similar requirement. Pointless exercise. Having the ID is trivial enough and the storage space is not really a concern. Thanks, tglx
On 16/10/19 09:31, Thomas Gleixner wrote: >> 3) move the implementation of the hypercall to >> drivers/clocksource/arm_arch_timer.c, so that it can call >> ktime_get_snapshot(&systime_snapshot, &clocksource_counter); > > And then you implement a gazillion of those functions for every > arch/subarch which has a similar requirement. Pointless exercise. > > Having the ID is trivial enough and the storage space is not really a > concern. Ok, good. Paolo
Hi Paolo, > -----Original Message----- > From: Paolo Bonzini <pbonzini@redhat.com> > Sent: Wednesday, October 16, 2019 3:25 PM > To: Jianyong Wu (Arm Technology China) <Jianyong.Wu@arm.com>; > netdev@vger.kernel.org; yangbo.lu@nxp.com; john.stultz@linaro.org; > tglx@linutronix.de; sean.j.christopherson@intel.com; maz@kernel.org; > richardcochran@gmail.com; Mark Rutland <Mark.Rutland@arm.com>; > will@kernel.org; Suzuki Poulose <Suzuki.Poulose@arm.com> > Cc: linux-kernel@vger.kernel.org; linux-arm-kernel@lists.infradead.org; > kvmarm@lists.cs.columbia.edu; kvm@vger.kernel.org; Steve Capper > <Steve.Capper@arm.com>; Kaly Xin (Arm Technology China) > <Kaly.Xin@arm.com>; Justin He (Arm Technology China) > <Justin.He@arm.com>; nd <nd@arm.com> > Subject: Re: [PATCH v5 4/6] psci: Add hvc call service for ptp_kvm. > > On 15/10/19 12:48, Jianyong Wu wrote: > > diff --git a/drivers/clocksource/arm_arch_timer.c > > b/drivers/clocksource/arm_arch_timer.c > > index 07e57a49d1e8..3597f1f27b10 100644 > > --- a/drivers/clocksource/arm_arch_timer.c > > +++ b/drivers/clocksource/arm_arch_timer.c > > @@ -1634,3 +1634,8 @@ static int __init arch_timer_acpi_init(struct > > acpi_table_header *table) } TIMER_ACPI_DECLARE(arch_timer, > > ACPI_SIG_GTDT, arch_timer_acpi_init); #endif > > + > > +bool is_arm_arch_counter(void *cs) > > +{ > > + return (struct clocksource *)cs == &clocksource_counter; } > > As Thomas pointed out, any reason to have a void * here? Need fix. Thanks Jianyong > > However, since he didn't like modifying the struct, here is an alternative idea: > > 1) add a "struct clocksource*" argument to ktime_get_snapshot > > 2) return -ENODEV if the argument is not NULL and is not the current > clocksource > > 3) move the implementation of the hypercall to > drivers/clocksource/arm_arch_timer.c, so that it can call > ktime_get_snapshot(&systime_snapshot, &clocksource_counter); > > Paolo
diff --git a/drivers/clocksource/arm_arch_timer.c b/drivers/clocksource/arm_arch_timer.c index 07e57a49d1e8..3597f1f27b10 100644 --- a/drivers/clocksource/arm_arch_timer.c +++ b/drivers/clocksource/arm_arch_timer.c @@ -1634,3 +1634,8 @@ static int __init arch_timer_acpi_init(struct acpi_table_header *table) } TIMER_ACPI_DECLARE(arch_timer, ACPI_SIG_GTDT, arch_timer_acpi_init); #endif + +bool is_arm_arch_counter(void *cs) +{ + return (struct clocksource *)cs == &clocksource_counter; +} diff --git a/include/clocksource/arm_arch_timer.h b/include/clocksource/arm_arch_timer.h index 1d68d5613dae..5895d10a6148 100644 --- a/include/clocksource/arm_arch_timer.h +++ b/include/clocksource/arm_arch_timer.h @@ -86,6 +86,7 @@ extern u32 arch_timer_get_rate(void); extern u64 (*arch_timer_read_counter)(void); extern struct arch_timer_kvm_info *arch_timer_get_kvm_info(void); extern bool arch_timer_evtstrm_available(void); +extern bool is_arm_arch_counter(void *); #else @@ -104,6 +105,10 @@ static inline bool arch_timer_evtstrm_available(void) return false; } +bool is_arm_arch_counter(void *unuse) +{ + return false; +} #endif #endif diff --git a/include/linux/arm-smccc.h b/include/linux/arm-smccc.h index a6e4d3e3d10a..bc0cdad10f35 100644 --- a/include/linux/arm-smccc.h +++ b/include/linux/arm-smccc.h @@ -94,6 +94,7 @@ /* KVM "vendor specific" services */ #define ARM_SMCCC_KVM_FUNC_FEATURES 0 +#define ARM_SMCCC_KVM_PTP 1 #define ARM_SMCCC_KVM_FUNC_FEATURES_2 127 #define ARM_SMCCC_KVM_NUM_FUNCS 128 @@ -103,6 +104,17 @@ ARM_SMCCC_OWNER_VENDOR_HYP, \ ARM_SMCCC_KVM_FUNC_FEATURES) +/* + * This ID used for virtual ptp kvm clock and it will pass second value + * and nanosecond value of host real time and system counter by vcpu + * register to guest. + */ +#define ARM_SMCCC_VENDOR_HYP_KVM_PTP_FUNC_ID \ + ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \ + ARM_SMCCC_SMC_32, \ + ARM_SMCCC_OWNER_VENDOR_HYP, \ + ARM_SMCCC_KVM_PTP) + #ifndef __ASSEMBLY__ #include <linux/linkage.h> diff --git a/virt/kvm/arm/psci.c b/virt/kvm/arm/psci.c index 0debf49bf259..f0ef388ebbfa 100644 --- a/virt/kvm/arm/psci.c +++ b/virt/kvm/arm/psci.c @@ -392,6 +392,8 @@ int kvm_hvc_call_handler(struct kvm_vcpu *vcpu) u32 func_id = smccc_get_function(vcpu); u32 val[4] = {}; u32 option; + u64 cycles; + struct system_time_snapshot systime_snapshot; val[0] = SMCCC_RET_NOT_SUPPORTED; @@ -431,6 +433,25 @@ int kvm_hvc_call_handler(struct kvm_vcpu *vcpu) case ARM_SMCCC_VENDOR_HYP_KVM_FEATURES_FUNC_ID: val[0] = BIT(ARM_SMCCC_KVM_FUNC_FEATURES); break; + /* + * This will used for virtual ptp kvm clock. three + * values will be passed back. + * reg0 stores high 32-bit host ktime; + * reg1 stores low 32-bit host ktime; + * reg2 stores high 32-bit difference of host cycles and cntvoff; + * reg3 stores low 32-bit difference of host cycles and cntvoff. + */ + case ARM_SMCCC_VENDOR_HYP_KVM_PTP_FUNC_ID: + ktime_get_snapshot(&systime_snapshot); + if (!is_arm_arch_counter(systime_snapshot.sc.cs)) + return kvm_psci_call(vcpu); + val[0] = systime_snapshot.real >> 32; + val[1] = systime_snapshot.real << 32 >> 32; + cycles = systime_snapshot.sc.cycles - + vcpu_vtimer(vcpu)->cntvoff; + val[2] = cycles >> 32; + val[3] = cycles << 32 >> 32; + break; default: return kvm_psci_call(vcpu); }
This patch is the base of ptp_kvm for arm64. ptp_kvm modules will call hvc to get this service. The service offers real time and counter cycle of host for guest. Signed-off-by: Jianyong Wu <jianyong.wu@arm.com> --- drivers/clocksource/arm_arch_timer.c | 5 +++++ include/clocksource/arm_arch_timer.h | 5 +++++ include/linux/arm-smccc.h | 12 ++++++++++++ virt/kvm/arm/psci.c | 21 +++++++++++++++++++++ 4 files changed, 43 insertions(+)