162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * X86 specific ACPICA environments and implementation
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (C) 2014, Intel Corporation
662306a36Sopenharmony_ci *   Author: Lv Zheng <lv.zheng@intel.com>
762306a36Sopenharmony_ci */
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#ifndef _ASM_X86_ACENV_H
1062306a36Sopenharmony_ci#define _ASM_X86_ACENV_H
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#include <asm/special_insns.h>
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci/* Asm macros */
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci/*
1762306a36Sopenharmony_ci * ACPI_FLUSH_CPU_CACHE() flushes caches on entering sleep states.
1862306a36Sopenharmony_ci * It is required to prevent data loss.
1962306a36Sopenharmony_ci *
2062306a36Sopenharmony_ci * While running inside virtual machine, the kernel can bypass cache flushing.
2162306a36Sopenharmony_ci * Changing sleep state in a virtual machine doesn't affect the host system
2262306a36Sopenharmony_ci * sleep state and cannot lead to data loss.
2362306a36Sopenharmony_ci */
2462306a36Sopenharmony_ci#define ACPI_FLUSH_CPU_CACHE()					\
2562306a36Sopenharmony_cido {								\
2662306a36Sopenharmony_ci	if (!cpu_feature_enabled(X86_FEATURE_HYPERVISOR))	\
2762306a36Sopenharmony_ci		wbinvd();					\
2862306a36Sopenharmony_ci} while (0)
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ciint __acpi_acquire_global_lock(unsigned int *lock);
3162306a36Sopenharmony_ciint __acpi_release_global_lock(unsigned int *lock);
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_ci#define ACPI_ACQUIRE_GLOBAL_LOCK(facs, Acq) \
3462306a36Sopenharmony_ci	((Acq) = __acpi_acquire_global_lock(&facs->global_lock))
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci#define ACPI_RELEASE_GLOBAL_LOCK(facs, Acq) \
3762306a36Sopenharmony_ci	((Acq) = __acpi_release_global_lock(&facs->global_lock))
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci/*
4062306a36Sopenharmony_ci * Math helper asm macros
4162306a36Sopenharmony_ci */
4262306a36Sopenharmony_ci#define ACPI_DIV_64_BY_32(n_hi, n_lo, d32, q32, r32) \
4362306a36Sopenharmony_ci	asm("divl %2;"				     \
4462306a36Sopenharmony_ci	    : "=a"(q32), "=d"(r32)		     \
4562306a36Sopenharmony_ci	    : "r"(d32),				     \
4662306a36Sopenharmony_ci	     "0"(n_lo), "1"(n_hi))
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci#define ACPI_SHIFT_RIGHT_64(n_hi, n_lo) \
4962306a36Sopenharmony_ci	asm("shrl   $1,%2	;"	\
5062306a36Sopenharmony_ci	    "rcrl   $1,%3;"		\
5162306a36Sopenharmony_ci	    : "=r"(n_hi), "=r"(n_lo)	\
5262306a36Sopenharmony_ci	    : "0"(n_hi), "1"(n_lo))
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ci#endif /* _ASM_X86_ACENV_H */
55