summaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-layerscape/ppa.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/mach-layerscape/ppa.c')
-rw-r--r--arch/arm/mach-layerscape/ppa.c33
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;
}