Received: by 2002:a25:1104:0:0:0:0:0 with SMTP id 4csp93342ybr; Fri, 22 May 2020 01:42:59 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxEwIPlbFcTQ0Sqrb0MYSUaskA4GRb3A3XkN7Vf2q8O8wDJYzI0CHByZREU8QRbX0iSajvF X-Received: by 2002:a50:fd0c:: with SMTP id i12mr2094710eds.48.1590136979794; Fri, 22 May 2020 01:42:59 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1590136979; cv=none; d=google.com; s=arc-20160816; b=PLMkxEqN/cMEDfNEjsTrbTFjofualn+3xFCngtPhoSt1Kzbrb2LJ2UJTGDZuK/sN7y gkxWWn6fwmHv7+trYPa1gxg0MPUS1Tul7VA1OYnzvP1xnkb9mNjhcADcKhyHsjPJJUdU AVTqrQAmHcVty4/RtKx1pQtsDreKTG/mmp19g69QSvpoZ5EJ/KmfVQPkjMSioo9tLp0x O6WGWPASoTgTCudlaJCp71/zo+1h0w04SKxTULomDYrdopUWywO1KT4HTwOzp25xSSk0 iRDUD/+qqUvX+NKO4LmMGIVflVLKPhfs05G2WErGNEDjRr9IlvmO7f0vXc3E4f63bL5H LBow== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from; bh=pAVrNJfsyJf/dPU8UnXJgXiULEtxdvcKSU7mcAEmBAc=; b=HdngsXPEM8tyWuBXEPwx3r9sz9fnMW4HiD7AvbGC+CmPchNBL3Uyw66IVlOQthjmpS yAG3ib19rrokpEb2G8XSJXzGmaAmtlf74PgSxD5sXMLrDp7yyBRjZG6aJUR6EHVSlxqv LfokPWY2rdwaJCpQmyqdLmMeUr+6vX8oUQiXX+YvZ61X4Sc0JcuuqE6mmtD1obAX8Oml 4ElrVFiurRP2VevK9p8uIHggrwmuEbatseAGnHIeR5xrhO8ALKJnohv9XBYc1fqgGLlS wq6il/4P92I8jE96Ty1JI5RlFGO+mAvz2wbR0goaNDop3wS1YURWBceOoW+p9truUJND /OKw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id h14si4694739eji.323.2020.05.22.01.42.36; Fri, 22 May 2020 01:42:59 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729884AbgEVIi1 (ORCPT + 99 others); Fri, 22 May 2020 04:38:27 -0400 Received: from foss.arm.com ([217.140.110.172]:59426 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729072AbgEVIiZ (ORCPT ); Fri, 22 May 2020 04:38:25 -0400 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id DBDC555D; Fri, 22 May 2020 01:38:24 -0700 (PDT) Received: from entos-d05.shanghai.arm.com (entos-d05.shanghai.arm.com [10.169.40.35]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id BCC243F52E; Fri, 22 May 2020 01:38:18 -0700 (PDT) From: Jianyong Wu To: netdev@vger.kernel.org, yangbo.lu@nxp.com, john.stultz@linaro.org, tglx@linutronix.de, pbonzini@redhat.com, sean.j.christopherson@intel.com, maz@kernel.org, richardcochran@gmail.com, Mark.Rutland@arm.com, will@kernel.org, suzuki.poulose@arm.com, steven.price@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@arm.com, Kaly.Xin@arm.com, justin.he@arm.com, Wei.Chen@arm.com, jianyong.wu@arm.com, nd@arm.com Subject: [RFC PATCH v12 07/11] psci: Add hypercall service for kvm ptp. Date: Fri, 22 May 2020 16:37:20 +0800 Message-Id: <20200522083724.38182-8-jianyong.wu@arm.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200522083724.38182-1-jianyong.wu@arm.com> References: <20200522083724.38182-1-jianyong.wu@arm.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org ptp_kvm modules will get this service through smccc call. The service offers real time and counter cycle of host for guest. Also let caller determine which cycle of virtual counter or physical counter to return. Signed-off-by: Jianyong Wu --- include/linux/arm-smccc.h | 14 ++++++++++++ virt/kvm/Kconfig | 4 ++++ virt/kvm/arm/hypercalls.c | 47 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 65 insertions(+) diff --git a/include/linux/arm-smccc.h b/include/linux/arm-smccc.h index bdc0124a064a..badadc390809 100644 --- a/include/linux/arm-smccc.h +++ b/include/linux/arm-smccc.h @@ -94,6 +94,8 @@ /* KVM "vendor specific" services */ #define ARM_SMCCC_KVM_FUNC_FEATURES 0 +#define ARM_SMCCC_KVM_FUNC_KVM_PTP 1 +#define ARM_SMCCC_KVM_FUNC_KVM_PTP_PHY 2 #define ARM_SMCCC_KVM_FUNC_FEATURES_2 127 #define ARM_SMCCC_KVM_NUM_FUNCS 128 @@ -103,6 +105,18 @@ ARM_SMCCC_OWNER_VENDOR_HYP, \ ARM_SMCCC_KVM_FUNC_FEATURES) +#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_FUNC_KVM_PTP) + +#define ARM_SMCCC_VENDOR_HYP_KVM_PTP_PHY_FUNC_ID \ + ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \ + ARM_SMCCC_SMC_32, \ + ARM_SMCCC_OWNER_VENDOR_HYP, \ + ARM_SMCCC_KVM_FUNC_KVM_PTP_PHY) + #ifndef __ASSEMBLY__ #include diff --git a/virt/kvm/Kconfig b/virt/kvm/Kconfig index aad9284c043a..bf820811e815 100644 --- a/virt/kvm/Kconfig +++ b/virt/kvm/Kconfig @@ -60,3 +60,7 @@ config HAVE_KVM_VCPU_RUN_PID_CHANGE config HAVE_KVM_NO_POLL bool + +config ARM64_KVM_PTP_HOST + def_bool y + depends on ARM64 && KVM diff --git a/virt/kvm/arm/hypercalls.c b/virt/kvm/arm/hypercalls.c index db6dce3d0e23..c964122f8dae 100644 --- a/virt/kvm/arm/hypercalls.c +++ b/virt/kvm/arm/hypercalls.c @@ -3,6 +3,7 @@ #include #include +#include #include @@ -11,6 +12,10 @@ int kvm_hvc_call_handler(struct kvm_vcpu *vcpu) { +#ifdef CONFIG_ARM64_KVM_PTP_HOST + struct system_time_snapshot systime_snapshot; + u64 cycles; +#endif u32 func_id = smccc_get_function(vcpu); u32 val[4] = {SMCCC_RET_NOT_SUPPORTED}; u32 feature; @@ -70,7 +75,49 @@ int kvm_hvc_call_handler(struct kvm_vcpu *vcpu) break; case ARM_SMCCC_VENDOR_HYP_KVM_FEATURES_FUNC_ID: val[0] = BIT(ARM_SMCCC_KVM_FUNC_FEATURES); + +#ifdef CONFIG_ARM64_KVM_PTP_HOST + val[0] |= BIT(ARM_SMCCC_KVM_FUNC_KVM_PTP); +#endif break; + +#ifdef CONFIG_ARM64_KVM_PTP_HOST + /* + * This serves virtual kvm_ptp. + * Four 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: + /* + * system time and counter value must captured in the same + * time to keep consistency and precision. + */ + ktime_get_snapshot(&systime_snapshot); + if (systime_snapshot.cs_id != CSID_ARM_ARCH_COUNTER) + break; + val[0] = upper_32_bits(systime_snapshot.real); + val[1] = lower_32_bits(systime_snapshot.real); + /* + * which of virtual counter or physical counter being + * asked for is decided by the first argument. + */ + feature = smccc_get_arg1(vcpu); + switch (feature) { + case ARM_SMCCC_VENDOR_HYP_KVM_PTP_PHY_FUNC_ID: + cycles = systime_snapshot.cycles; + break; + default: + cycles = systime_snapshot.cycles - + vcpu_vtimer(vcpu)->cntvoff; + } + val[2] = upper_32_bits(cycles); + val[3] = lower_32_bits(cycles); + break; +#endif + default: return kvm_psci_call(vcpu); } -- 2.17.1