Link: https://lore.kernel.org/r/20260217200002.683975158@linuxfoundation.org Tested-by: Florian Fainelli <florian.fainelli@broadcom.com> Tested-by: Takeshi Ogasawara <takeshi.ogasawara@futuring-girl.com> Tested-by: Peter Schneider <pschneider1968@googlemail.com> Tested-by: Jon Hunter <jonathanh@nvidia.com> Tested-by: Salvatore Bonaccorso <carnil@debian.org> Tested-by: Brett A C Sheffield <bacs@librecast.net> Tested-by: Mark Brown <broonie@kernel.org> Tested-by: Luna Jernberg <droidbittin@gmail.com> Tested-by: Ronald Warsow <rwarsow@gmx.de> Tested-by: Justin M. Forbes <jforbes@fedoraproject.org> Tested-by: Ron Economos <re@w6rz.net> Tested-by: Miguel Ojeda <ojeda@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
71 lines
1.6 KiB
C
71 lines
1.6 KiB
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
/*
|
|
* Copyright (C) 2024 ARM Ltd.
|
|
*/
|
|
|
|
#ifndef __ASM_RSI_H_
|
|
#define __ASM_RSI_H_
|
|
|
|
#include <linux/errno.h>
|
|
#include <linux/jump_label.h>
|
|
#include <asm/rsi_cmds.h>
|
|
|
|
#define RSI_PDEV_NAME "arm-cca-dev"
|
|
|
|
DECLARE_STATIC_KEY_FALSE(rsi_present);
|
|
|
|
void __init arm64_rsi_init(void);
|
|
|
|
bool arm64_rsi_is_protected(phys_addr_t base, size_t size);
|
|
|
|
static inline bool is_realm_world(void)
|
|
{
|
|
return static_branch_unlikely(&rsi_present);
|
|
}
|
|
|
|
static inline int rsi_set_memory_range(phys_addr_t start, phys_addr_t end,
|
|
enum ripas state, unsigned long flags)
|
|
{
|
|
unsigned long ret;
|
|
phys_addr_t top;
|
|
|
|
while (start != end) {
|
|
ret = rsi_set_addr_range_state(start, end, state, flags, &top);
|
|
if (ret || top < start || top > end)
|
|
return -EINVAL;
|
|
start = top;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
/*
|
|
* Convert the specified range to RAM. Do not use this if you rely on the
|
|
* contents of a page that may already be in RAM state.
|
|
*/
|
|
static inline int rsi_set_memory_range_protected(phys_addr_t start,
|
|
phys_addr_t end)
|
|
{
|
|
return rsi_set_memory_range(start, end, RSI_RIPAS_RAM,
|
|
RSI_CHANGE_DESTROYED);
|
|
}
|
|
|
|
/*
|
|
* Convert the specified range to RAM. Do not convert any pages that may have
|
|
* been DESTROYED, without our permission.
|
|
*/
|
|
static inline int rsi_set_memory_range_protected_safe(phys_addr_t start,
|
|
phys_addr_t end)
|
|
{
|
|
return rsi_set_memory_range(start, end, RSI_RIPAS_RAM,
|
|
RSI_NO_CHANGE_DESTROYED);
|
|
}
|
|
|
|
static inline int rsi_set_memory_range_shared(phys_addr_t start,
|
|
phys_addr_t end)
|
|
{
|
|
return rsi_set_memory_range(start, end, RSI_RIPAS_EMPTY,
|
|
RSI_CHANGE_DESTROYED);
|
|
}
|
|
#endif /* __ASM_RSI_H_ */
|