summaryrefslogtreecommitdiffstats
path: root/arch/arm
diff options
context:
space:
mode:
authorAhmad Fatoum <a.fatoum@pengutronix.de>2020-07-01 11:11:18 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2020-07-14 20:32:56 +0200
commit7208a44d8bc6058a120d49b7061e2b9f9c0502c8 (patch)
treedfdcb07b61c530220a10035fd693f3aa670f9bd3 /arch/arm
parent3c7606dde3793b7f13c82924caa85ad24423f91f (diff)
downloadbarebox-7208a44d8bc6058a120d49b7061e2b9f9c0502c8.tar.gz
barebox-7208a44d8bc6058a120d49b7061e2b9f9c0502c8.tar.xz
ARM: at91: sama5d2: read back memory size from DDRAM controller
We hard code memory size at three places: - In the configuration we use to initialize the DDRAM controller - In the minimal available size passed from PBL to barebox proper - In the device tree memory node override Remove the two latter ones and replace them with code that reads the size back from controller. Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de> Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'arch/arm')
-rw-r--r--arch/arm/boards/sama5d27-giantboard/lowlevel.c2
-rw-r--r--arch/arm/boards/sama5d27-som1/lowlevel.c2
-rw-r--r--arch/arm/dts/at91-sama5d27_giantboard.dts4
-rw-r--r--arch/arm/dts/at91-sama5d27_som1_ek.dts4
-rw-r--r--arch/arm/dts/sama5d2.dtsi2
-rw-r--r--arch/arm/mach-at91/Kconfig4
-rw-r--r--arch/arm/mach-at91/Makefile1
-rw-r--r--arch/arm/mach-at91/ddramc.c57
-rw-r--r--arch/arm/mach-at91/include/mach/ddramc.h2
9 files changed, 68 insertions, 10 deletions
diff --git a/arch/arm/boards/sama5d27-giantboard/lowlevel.c b/arch/arm/boards/sama5d27-giantboard/lowlevel.c
index a30441d7cc..0bb3a7289c 100644
--- a/arch/arm/boards/sama5d27-giantboard/lowlevel.c
+++ b/arch/arm/boards/sama5d27-giantboard/lowlevel.c
@@ -36,5 +36,5 @@ ENTRY_FUNCTION(start_sama5d27_giantboard, r0, r1, r2)
fdt = __dtb_z_at91_sama5d27_giantboard_start + get_runtime_offset();
- barebox_arm_entry(SAMA5_DDRCS, SZ_128M, fdt);
+ sama5d2_barebox_entry(fdt);
}
diff --git a/arch/arm/boards/sama5d27-som1/lowlevel.c b/arch/arm/boards/sama5d27-som1/lowlevel.c
index 012f21614c..792e065076 100644
--- a/arch/arm/boards/sama5d27-som1/lowlevel.c
+++ b/arch/arm/boards/sama5d27-som1/lowlevel.c
@@ -69,5 +69,5 @@ SAMA5_ENTRY_FUNCTION(start_sama5d27_som1_ek, r4)
fdt = __dtb_z_at91_sama5d27_som1_ek_start + get_runtime_offset();
ek_turn_led(RGB_LED_GREEN);
- barebox_arm_entry(SAMA5_DDRCS, SZ_128M, fdt);
+ sama5d2_barebox_entry(fdt);
}
diff --git a/arch/arm/dts/at91-sama5d27_giantboard.dts b/arch/arm/dts/at91-sama5d27_giantboard.dts
index 7e48fa18ae..6ba094c3da 100644
--- a/arch/arm/dts/at91-sama5d27_giantboard.dts
+++ b/arch/arm/dts/at91-sama5d27_giantboard.dts
@@ -38,10 +38,6 @@
linux,default-trigger = "mmc0";
};
};
-
- memory {
- reg = <0x20000000 0x8000000>;
- };
};
&slow_xtal {
diff --git a/arch/arm/dts/at91-sama5d27_som1_ek.dts b/arch/arm/dts/at91-sama5d27_som1_ek.dts
index cd038dc7c1..b9042d1131 100644
--- a/arch/arm/dts/at91-sama5d27_som1_ek.dts
+++ b/arch/arm/dts/at91-sama5d27_som1_ek.dts
@@ -13,10 +13,6 @@
device-path = &barebox_env;
};
};
-
- memory {
- reg = <0x20000000 0x8000000>;
- };
};
&qspi1 {
diff --git a/arch/arm/dts/sama5d2.dtsi b/arch/arm/dts/sama5d2.dtsi
index fadcc83815..c9af5f2f7a 100644
--- a/arch/arm/dts/sama5d2.dtsi
+++ b/arch/arm/dts/sama5d2.dtsi
@@ -7,6 +7,8 @@
};
};
+/delete-node/ &{/memory};
+
&sdmmc0 {
assigned-clock-parents = <&pmc PMC_TYPE_CORE PMC_UTMI>;
};
diff --git a/arch/arm/mach-at91/Kconfig b/arch/arm/mach-at91/Kconfig
index f388d00b8f..8584dcd979 100644
--- a/arch/arm/mach-at91/Kconfig
+++ b/arch/arm/mach-at91/Kconfig
@@ -40,6 +40,9 @@ config HAVE_AT91_I2S_MUX_CLK
config HAVE_AT91_SAM9X60_PLL
bool
+config HAVE_AT91_DDRAMC
+ bool
+
config AT91_MCI_PBL
bool
depends on MCI_ATMEL_SDHCI_PBL
@@ -87,6 +90,7 @@ config SOC_SAMA5D2
select PINCTRL_AT91PIO4
select HAS_MACB
select HAVE_MACH_ARM_HEAD
+ select HAVE_AT91_DDRAMC
config SOC_SAMA5D3
bool
diff --git a/arch/arm/mach-at91/Makefile b/arch/arm/mach-at91/Makefile
index 31a91b967e..3b9f60a95a 100644
--- a/arch/arm/mach-at91/Makefile
+++ b/arch/arm/mach-at91/Makefile
@@ -12,6 +12,7 @@ obj-$(CONFIG_AT91_BOOTSTRAP) += bootstrap.o
obj-y += at91sam9_reset.o
obj-y += at91sam9g45_reset.o
+obj-pbl-$(CONFIG_HAVE_AT91_DDRAMC) += ddramc.o
pbl-$(CONFIG_AT91_MCI_PBL) += xload-mmc.o
obj-$(CONFIG_AT91SAM9_SMC) += sam9_smc.o
diff --git a/arch/arm/mach-at91/ddramc.c b/arch/arm/mach-at91/ddramc.c
new file mode 100644
index 0000000000..6dac794689
--- /dev/null
+++ b/arch/arm/mach-at91/ddramc.c
@@ -0,0 +1,57 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (c) 2020 Ahmad Fatoum <a.fatoum@pengutronix.de>
+ */
+
+#include <common.h>
+#include <init.h>
+#include <mach/ddramc.h>
+#include <mach/hardware.h>
+#include <asm/barebox-arm.h>
+#include <mach/at91_ddrsdrc.h>
+#include <asm/memory.h>
+#include <pbl.h>
+#include <io.h>
+
+static unsigned sama5_ramsize(void __iomem *base)
+{
+ return at91_get_ddram_size(base, true);
+}
+
+void __noreturn sama5d2_barebox_entry(void *boarddata)
+{
+ barebox_arm_entry(SAMA5_DDRCS, sama5_ramsize(SAMA5D2_BASE_MPDDRC),
+ boarddata);
+}
+
+static int sama5_ddr_probe(struct device_d *dev)
+{
+ struct resource *iores;
+ void __iomem *base;
+
+ iores = dev_request_mem_resource(dev, 0);
+ if (IS_ERR(iores))
+ return PTR_ERR(iores);
+ base = IOMEM(iores->start);
+
+ arm_add_mem_device("ram0", SAMA5_DDRCS, sama5_ramsize(base));
+
+ return 0;
+}
+
+static struct of_device_id sama5_ddr_dt_ids[] = {
+ { .compatible = "atmel,sama5d3-ddramc" },
+ { /* sentinel */ }
+};
+
+static struct driver_d sama5_ddr_driver = {
+ .name = "sama5-ddramc",
+ .probe = sama5_ddr_probe,
+ .of_compatible = sama5_ddr_dt_ids,
+};
+
+static int sama5_ddr_init(void)
+{
+ return platform_driver_register(&sama5_ddr_driver);
+}
+mem_initcall(sama5_ddr_init);
diff --git a/arch/arm/mach-at91/include/mach/ddramc.h b/arch/arm/mach-at91/include/mach/ddramc.h
index 0b33afc213..cd85bb6eab 100644
--- a/arch/arm/mach-at91/include/mach/ddramc.h
+++ b/arch/arm/mach-at91/include/mach/ddramc.h
@@ -32,5 +32,7 @@ void at91_lpddr1_sdram_initialize(void __iomem *base_address,
void __iomem *ram_address,
struct at91_ddramc_register *ddramc_config);
+void __noreturn sama5d2_barebox_entry(void *boarddata);
+
#endif /* #ifndef __DDRAMC_H__ */