diff options
Diffstat (limited to 'arch/arm/mach-layerscape/ppa.c')
-rw-r--r-- | arch/arm/mach-layerscape/ppa.c | 33 |
1 files changed, 20 insertions, 13 deletions
diff --git a/arch/arm/mach-layerscape/ppa.c b/arch/arm/mach-layerscape/ppa.c index d962fba751..21efaae3ab 100644 --- a/arch/arm/mach-layerscape/ppa.c +++ b/arch/arm/mach-layerscape/ppa.c @@ -4,6 +4,7 @@ #include <common.h> #include <init.h> +#include <mmu.h> #include <firmware.h> #include <memory.h> #include <linux/sizes.h> @@ -13,7 +14,7 @@ #include <asm/system.h> #include <image-fit.h> #include <asm/psci.h> -#include <mach/layerscape.h> +#include <mach/layerscape/layerscape.h> #include <asm/cache.h> int ppa_entry(const void *, u32 *, u32 *); @@ -46,7 +47,7 @@ static int of_psci_do_fixup(struct device_node *root, void *unused) break; } - return of_psci_fixup(root, psci_version); + return of_psci_fixup(root, psci_version, "smc"); } static int ppa_init(void *ppa, size_t ppa_size, void *sec_firmware_addr) @@ -54,17 +55,11 @@ static int ppa_init(void *ppa, size_t ppa_size, void *sec_firmware_addr) int ret; u32 *boot_loc_ptr_l, *boot_loc_ptr_h; struct ccsr_scfg __iomem *scfg = (void *)(LSCH2_SCFG_ADDR); - int el = current_el(); struct fit_handle *fit; void *conf; const void *buf; unsigned long firmware_size; - if (el < 3) { - printf("EL%d, skip ppa init\n", el); - return 0; - } - boot_loc_ptr_l = &scfg->scratchrw[1]; boot_loc_ptr_h = &scfg->scratchrw[0]; @@ -115,9 +110,10 @@ int ls1046a_ppa_init(resource_size_t ppa_start, resource_size_t ppa_size) struct resource *res; void *ppa_fw; size_t ppa_fw_size; + int el = current_el(); int ret; - res = request_sdram_region("ppa", ppa_start, ppa_size); + res = reserve_sdram_region("ppa", ppa_start, ppa_size); if (!res) { pr_err("Cannot request SDRAM region %pa - %pa\n", &ppa_start, &ppa_end); @@ -126,11 +122,22 @@ int ls1046a_ppa_init(resource_size_t ppa_start, resource_size_t ppa_size) get_builtin_firmware(ppa_ls1046a_bin, &ppa_fw, &ppa_fw_size); - ret = ppa_init(ppa_fw, ppa_fw_size, (void *)ppa_start); - if (ret) - return ret; + if (el == 3) { + unsigned long cr; + + asm volatile("mrs %0, sctlr_el3" : "=r" (cr) : : "cc"); + remap_range((void *)ppa_start, ppa_size, MAP_CACHED); + + ret = ppa_init(ppa_fw, ppa_fw_size, (void *)ppa_start); + + asm volatile("msr sctlr_el2, %0" : : "r" (cr) : "cc"); + remap_range((void *)ppa_start, ppa_size, MAP_UNCACHED); + + if (ret) + return ret; + } - of_add_reserve_entry(ppa_start, ppa_end); + of_register_fixup(of_fixup_reserved_memory, res); return 0; } |