From 441aa276446141f1b92ed8fb98c9578597487f4d Mon Sep 17 00:00:00 2001 From: Tom Warren Date: Mon, 9 Dec 2013 13:21:52 -0700 Subject: [PATCH] Tegra124: nyan: Disable VPR On Tegra1x4 platforms, certain display-related registers cannot be accessed unless the VPR registers are correctly set up first. This allows the kernel graphics driver to talk to the HW in the same manner on all Tegra SoCs. Change-Id: I96e0c4075709da51be530a473da8d593ca498722 Signed-off-by: Tom Warren Reviewed-on: https://chromium-review.googlesource.com/179327 Reviewed-by: Ronald Minnich --- src/mainboard/google/nyan/mainboard.c | 7 +++ .../nvidia/tegra124/include/soc/addressmap.h | 1 + src/soc/nvidia/tegra124/mc.h | 47 +++++++++++++++++++ 3 files changed, 55 insertions(+) create mode 100644 src/soc/nvidia/tegra124/mc.h diff --git a/src/mainboard/google/nyan/mainboard.c b/src/mainboard/google/nyan/mainboard.c index a9f3fcf2ba..3ee93f6e51 100644 --- a/src/mainboard/google/nyan/mainboard.c +++ b/src/mainboard/google/nyan/mainboard.c @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -211,6 +212,12 @@ static void setup_kernel_info(void) // value defined in BCT. struct tegra_pmc_regs *pmc = (void*)TEGRA_PMC_BASE; writel(0x80080000, &pmc->odmdata); + + // Not strictly info, but kernel graphics driver needs this region locked down + struct tegra_mc_regs *mc = (void *)TEGRA_MC_BASE; + writel(0, &mc->mc_vpr_bom); + writel(0, &mc->mc_vpr_size); + writel(1, &mc->mc_vpr_ctrl); } static void setup_ec_spi(void) diff --git a/src/soc/nvidia/tegra124/include/soc/addressmap.h b/src/soc/nvidia/tegra124/include/soc/addressmap.h index 29598a9765..b3c0b2961d 100644 --- a/src/soc/nvidia/tegra124/include/soc/addressmap.h +++ b/src/soc/nvidia/tegra124/include/soc/addressmap.h @@ -68,6 +68,7 @@ enum { TEGRA_PMC_BASE = TEGRA_APB_MISC_BASE + 0xE400, TEGRA_EMC_BASE = TEGRA_APB_MISC_BASE + 0xF400, TEGRA_FUSE_BASE = TEGRA_APB_MISC_BASE + 0xF800, + TEGRA_MC_BASE = 0x70019000, TEGRA_CSITE_BASE = 0x70040000, TEGRA_SYSCTR0_BASE = 0x700F0000, TEGRA_USBD_BASE = 0x7D000000, diff --git a/src/soc/nvidia/tegra124/mc.h b/src/soc/nvidia/tegra124/mc.h new file mode 100644 index 0000000000..92a38ed95f --- /dev/null +++ b/src/soc/nvidia/tegra124/mc.h @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2010 - 2013, NVIDIA CORPORATION. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef _TEGRA124_MC_H_ +#define _TEGRA124_MC_H_ + +#include + +// Memory Controller registers we need/care about + +struct tegra_mc_regs { + u32 reserved0[4]; + u32 mc_smmu_config; + u32 mc_smmu_tlb_config; + u32 mc_smmu_ptc_config; + u32 mc_smmu_ptb_asid; + u32 mc_smmu_ptb_data; + u32 reserved1[3]; + u32 mc_smmu_tlb_flush; + u32 mc_smmu_ptc_flush; + u32 reserved2[6]; + u32 mc_emem_cfg; + u32 mc_emem_adr_cfg; + u32 mc_emem_adr_cfg_dev0; + u32 mc_emem_adr_cfg_dev1; + u32 reserved3[12]; + u32 mc_emem_arb_reserved[28]; + u32 reserved4[338]; + u32 mc_vpr_bom; + u32 mc_vpr_size; + u32 mc_vpr_ctrl; +}; + +#endif /* _TEGRA124_MC_H_ */