svn commit: r317090 - in head/sys/arm/mv: . armada38x
Zbigniew Bodek
zbb at FreeBSD.org
Tue Apr 18 10:39:15 UTC 2017
Author: zbb
Date: Tue Apr 18 10:39:14 2017
New Revision: 317090
URL: https://svnweb.freebsd.org/changeset/base/317090
Log:
Optimize Armada38x low-level MBUS settings
Add early init handler, which comprises various internal
bus optimisations for Armada 38x SoC's. Magic values used
due to undocumented registers.
Submitted by: Marcin Wojtas <mw at semihalf.com>,
Arnaud Ysmal <arnaud.ysmal at stormshield.eu>
Obtained from: Semihalf, Stormshield
Sponsored by: Stormshield
Differential revision: https://reviews.freebsd.org/D10219
Modified:
head/sys/arm/mv/armada38x/armada38x.c
head/sys/arm/mv/mv_machdep.c
head/sys/arm/mv/mvreg.h
Modified: head/sys/arm/mv/armada38x/armada38x.c
==============================================================================
--- head/sys/arm/mv/armada38x/armada38x.c Tue Apr 18 10:37:08 2017 (r317089)
+++ head/sys/arm/mv/armada38x/armada38x.c Tue Apr 18 10:39:14 2017 (r317090)
@@ -41,6 +41,7 @@ __FBSDID("$FreeBSD$");
int armada38x_open_bootrom_win(void);
int armada38x_scu_enable(void);
int armada38x_win_set_iosync_barrier(void);
+int armada38x_mbus_optimization(void);
uint32_t
get_tclk(void)
@@ -115,6 +116,50 @@ armada38x_open_bootrom_win(void)
}
int
+armada38x_mbus_optimization(void)
+{
+ bus_space_handle_t vaddr_iowind;
+ int rv;
+
+ rv = bus_space_map(fdtbus_bs_tag, (bus_addr_t)MV_MBUS_CTRL_BASE,
+ MV_MBUS_CTRL_REGS_LEN, 0, &vaddr_iowind);
+ if (rv != 0)
+ return (rv);
+
+ /*
+ * MBUS Units Priority Control Register - Prioritize XOR,
+ * PCIe and GbEs (ID=4,6,3,7,8) DRAM access
+ * GbE is High and others are Medium.
+ */
+ bus_space_write_4(fdtbus_bs_tag, vaddr_iowind, 0, 0x19180);
+
+ /*
+ * Fabric Units Priority Control Register -
+ * Prioritize CPUs requests.
+ */
+ bus_space_write_4(fdtbus_bs_tag, vaddr_iowind, 0x4, 0x3000A);
+
+ /*
+ * MBUS Units Prefetch Control Register -
+ * Pre-fetch enable for all IO masters.
+ */
+ bus_space_write_4(fdtbus_bs_tag, vaddr_iowind, 0x8, 0xFFFF);
+
+ /*
+ * Fabric Units Prefetch Control Register -
+ * Enable the CPUs Instruction and Data prefetch.
+ */
+ bus_space_write_4(fdtbus_bs_tag, vaddr_iowind, 0xc, 0x303);
+
+ bus_space_barrier(fdtbus_bs_tag, vaddr_iowind, 0, MV_MBUS_CTRL_REGS_LEN,
+ BUS_SPACE_BARRIER_WRITE);
+
+ bus_space_unmap(fdtbus_bs_tag, vaddr_iowind, MV_MBUS_CTRL_REGS_LEN);
+
+ return (rv);
+}
+
+int
armada38x_scu_enable(void)
{
bus_space_handle_t vaddr_scu;
Modified: head/sys/arm/mv/mv_machdep.c
==============================================================================
--- head/sys/arm/mv/mv_machdep.c Tue Apr 18 10:37:08 2017 (r317089)
+++ head/sys/arm/mv/mv_machdep.c Tue Apr 18 10:39:14 2017 (r317090)
@@ -77,6 +77,7 @@ void armadaxp_l2_init(void);
int armada38x_win_set_iosync_barrier(void);
int armada38x_scu_enable(void);
int armada38x_open_bootrom_win(void);
+int armada38x_mbus_optimization(void);
#endif
#define MPP_PIN_MAX 68
@@ -259,6 +260,8 @@ platform_late_init(void)
/* Set IO Sync Barrier bit for all Mbus devices */
if (armada38x_win_set_iosync_barrier() != 0)
printf("WARNING: could not map CPU Subsystem registers\n");
+ if (armada38x_mbus_optimization() != 0)
+ printf("WARNING: could not enable mbus optimization\n");
if (armada38x_scu_enable() != 0)
printf("WARNING: could not enable SCU\n");
#ifdef SMP
Modified: head/sys/arm/mv/mvreg.h
==============================================================================
--- head/sys/arm/mv/mvreg.h Tue Apr 18 10:37:08 2017 (r317089)
+++ head/sys/arm/mv/mvreg.h Tue Apr 18 10:39:14 2017 (r317090)
@@ -447,4 +447,9 @@
#define CPU_RESET_ASSERT 0x1
#endif
+#if defined(SOC_MV_ARMADA38X)
+#define MV_MBUS_CTRL_BASE (MV_BASE + 0x20420)
+#define MV_MBUS_CTRL_REGS_LEN 0x10
+#endif
+
#endif /* _MVREG_H_ */
More information about the svn-src-all
mailing list