|
@@ -1144,6 +1144,20 @@ noinline void __init arc_ioc_setup(void)
|
|
|
{
|
|
|
unsigned int ioc_base, mem_sz;
|
|
|
|
|
|
+ /*
|
|
|
+ * If IOC was already enabled (due to bootloader) it technically needs to
|
|
|
+ * be reconfigured with aperture base,size corresponding to Linux memory map
|
|
|
+ * which will certainly be different than uboot's. But disabling and
|
|
|
+ * reenabling IOC when DMA might be potentially active is tricky business.
|
|
|
+ * To avoid random memory issues later, just panic here and ask user to
|
|
|
+ * upgrade bootloader to one which doesn't enable IOC
|
|
|
+ */
|
|
|
+ if (read_aux_reg(ARC_REG_IO_COH_ENABLE) & ARC_IO_COH_ENABLE_BIT)
|
|
|
+ panic("IOC already enabled, please upgrade bootloader!\n");
|
|
|
+
|
|
|
+ if (!ioc_enable)
|
|
|
+ return;
|
|
|
+
|
|
|
/*
|
|
|
* As for today we don't support both IOC and ZONE_HIGHMEM enabled
|
|
|
* simultaneously. This happens because as of today IOC aperture covers
|
|
@@ -1187,8 +1201,8 @@ noinline void __init arc_ioc_setup(void)
|
|
|
panic("IOC Aperture start must be aligned to the size of the aperture");
|
|
|
|
|
|
write_aux_reg(ARC_REG_IO_COH_AP0_BASE, ioc_base >> 12);
|
|
|
- write_aux_reg(ARC_REG_IO_COH_PARTIAL, 1);
|
|
|
- write_aux_reg(ARC_REG_IO_COH_ENABLE, 1);
|
|
|
+ write_aux_reg(ARC_REG_IO_COH_PARTIAL, ARC_IO_COH_PARTIAL_BIT);
|
|
|
+ write_aux_reg(ARC_REG_IO_COH_ENABLE, ARC_IO_COH_ENABLE_BIT);
|
|
|
|
|
|
/* Re-enable L1 dcache */
|
|
|
__dc_enable();
|
|
@@ -1265,7 +1279,7 @@ void __init arc_cache_init_master(void)
|
|
|
if (is_isa_arcv2() && l2_line_sz && !slc_enable)
|
|
|
arc_slc_disable();
|
|
|
|
|
|
- if (is_isa_arcv2() && ioc_enable)
|
|
|
+ if (is_isa_arcv2() && ioc_exists)
|
|
|
arc_ioc_setup();
|
|
|
|
|
|
if (is_isa_arcv2() && l2_line_sz && slc_enable) {
|