mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-15 01:17:39 +00:00
3d186cf3f3
A secure monitor that runs before U-Boot, and hence causes U-Boot to run in non-secure world, must implement a few operations that U-Boot otherwise implements when running in secure world. Fix U-Boot to skip these operations when running in non-secure world. In particular: - The secure monitor must provide the LP0 resume code and own LP0 configuration in order to maintain security, so must initialize all the PMC scratch registers used by the boot ROM during LP0 resume. Consequently, U-Boot should not attempt to clear those registers, since the register accesses will fail or cause an error. - The secure monitor owns system security, and so is responsible for configuring security-related items such as the VPR. Signed-off-by: Stephen Warren <swarren@nvidia.com> Signed-off-by: Tom Warren <twarren@nvidia.com>
57 lines
1.1 KiB
C
57 lines
1.1 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
/*
|
|
* Copyright (c) 2014-2015, NVIDIA CORPORATION. All rights reserved.
|
|
*/
|
|
|
|
/* Tegra vpr routines */
|
|
|
|
#include <common.h>
|
|
#include <asm/io.h>
|
|
#include <asm/arch/tegra.h>
|
|
#include <asm/arch/mc.h>
|
|
#include <asm/arch-tegra/ap.h>
|
|
|
|
#include <fdt_support.h>
|
|
|
|
static bool _configured;
|
|
|
|
void tegra_gpu_config(void)
|
|
{
|
|
struct mc_ctlr *mc = (struct mc_ctlr *)NV_PA_MC_BASE;
|
|
|
|
#if defined(CONFIG_TEGRA_SUPPORT_NON_SECURE)
|
|
if (!tegra_cpu_is_non_secure())
|
|
#endif
|
|
{
|
|
/* Turn VPR off */
|
|
writel(0, &mc->mc_video_protect_size_mb);
|
|
writel(TEGRA_MC_VIDEO_PROTECT_REG_WRITE_ACCESS_DISABLED,
|
|
&mc->mc_video_protect_reg_ctrl);
|
|
/* read back to ensure the write went through */
|
|
readl(&mc->mc_video_protect_reg_ctrl);
|
|
}
|
|
|
|
debug("configured VPR\n");
|
|
|
|
_configured = true;
|
|
}
|
|
|
|
#if defined(CONFIG_OF_LIBFDT)
|
|
|
|
int tegra_gpu_enable_node(void *blob, const char *compat)
|
|
{
|
|
int offset;
|
|
|
|
if (!_configured)
|
|
return 0;
|
|
|
|
offset = fdt_node_offset_by_compatible(blob, -1, compat);
|
|
while (offset != -FDT_ERR_NOTFOUND) {
|
|
fdt_status_okay(blob, offset);
|
|
offset = fdt_node_offset_by_compatible(blob, offset, compat);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
#endif
|