162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci
362306a36Sopenharmony_ci/*
462306a36Sopenharmony_ci * Linux-specific definitions for managing interactions with Microsoft's
562306a36Sopenharmony_ci * Hyper-V hypervisor. The definitions in this file are specific to
662306a36Sopenharmony_ci * the ARM64 architecture.  See include/asm-generic/mshyperv.h for
762306a36Sopenharmony_ci * definitions are that architecture independent.
862306a36Sopenharmony_ci *
962306a36Sopenharmony_ci * Definitions that are specified in the Hyper-V Top Level Functional
1062306a36Sopenharmony_ci * Spec (TLFS) should not go in this file, but should instead go in
1162306a36Sopenharmony_ci * hyperv-tlfs.h.
1262306a36Sopenharmony_ci *
1362306a36Sopenharmony_ci * Copyright (C) 2021, Microsoft, Inc.
1462306a36Sopenharmony_ci *
1562306a36Sopenharmony_ci * Author : Michael Kelley <mikelley@microsoft.com>
1662306a36Sopenharmony_ci */
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci#ifndef _ASM_MSHYPERV_H
1962306a36Sopenharmony_ci#define _ASM_MSHYPERV_H
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci#include <linux/types.h>
2262306a36Sopenharmony_ci#include <linux/arm-smccc.h>
2362306a36Sopenharmony_ci#include <asm/hyperv-tlfs.h>
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci/*
2662306a36Sopenharmony_ci * Declare calls to get and set Hyper-V VP register values on ARM64, which
2762306a36Sopenharmony_ci * requires a hypercall.
2862306a36Sopenharmony_ci */
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_civoid hv_set_vpreg(u32 reg, u64 value);
3162306a36Sopenharmony_ciu64 hv_get_vpreg(u32 reg);
3262306a36Sopenharmony_civoid hv_get_vpreg_128(u32 reg, struct hv_get_vp_registers_output *result);
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_cistatic inline void hv_set_register(unsigned int reg, u64 value)
3562306a36Sopenharmony_ci{
3662306a36Sopenharmony_ci	hv_set_vpreg(reg, value);
3762306a36Sopenharmony_ci}
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_cistatic inline u64 hv_get_register(unsigned int reg)
4062306a36Sopenharmony_ci{
4162306a36Sopenharmony_ci	return hv_get_vpreg(reg);
4262306a36Sopenharmony_ci}
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci/* SMCCC hypercall parameters */
4562306a36Sopenharmony_ci#define HV_SMCCC_FUNC_NUMBER	1
4662306a36Sopenharmony_ci#define HV_FUNC_ID	ARM_SMCCC_CALL_VAL(			\
4762306a36Sopenharmony_ci				ARM_SMCCC_STD_CALL,		\
4862306a36Sopenharmony_ci				ARM_SMCCC_SMC_64,		\
4962306a36Sopenharmony_ci				ARM_SMCCC_OWNER_VENDOR_HYP,	\
5062306a36Sopenharmony_ci				HV_SMCCC_FUNC_NUMBER)
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ci#include <asm-generic/mshyperv.h>
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ci#endif
55