[PATCH] arm: rockchip: add support for the quartz64 board

Michael Riesch michael.riesch at wolfvision.net
Wed Nov 10 02:45:30 PST 2021


The Pine64 Quartz64 board features the Rockchip RK3566, a reduced but
largely identical version of the RK3568.

Two models (A and B) of the Quartz64 board are envisaged, where
this patch targets the already available model A.

Signed-off-by: Michael Riesch <michael.riesch at wolfvision.net>
---
 Documentation/boards/rockchip.rst          | 28 +++++++++++----
 arch/arm/boards/Makefile                   |  1 +
 arch/arm/boards/pine64-quartz64/Makefile   |  3 ++
 arch/arm/boards/pine64-quartz64/board.c    | 40 ++++++++++++++++++++++
 arch/arm/boards/pine64-quartz64/lowlevel.c | 39 +++++++++++++++++++++
 arch/arm/dts/Makefile                      |  1 +
 arch/arm/mach-rockchip/Kconfig             |  6 ++++
 arch/arm/mach-rockchip/rockchip.c          |  2 ++
 images/Makefile.rockchip                   |  7 ++++
 9 files changed, 121 insertions(+), 6 deletions(-)
 create mode 100644 arch/arm/boards/pine64-quartz64/Makefile
 create mode 100644 arch/arm/boards/pine64-quartz64/board.c
 create mode 100644 arch/arm/boards/pine64-quartz64/lowlevel.c

diff --git a/Documentation/boards/rockchip.rst b/Documentation/boards/rockchip.rst
index d52d979cb..68c3e1126 100644
--- a/Documentation/boards/rockchip.rst
+++ b/Documentation/boards/rockchip.rst
@@ -46,19 +46,31 @@ Instructions.
 * Insert SD card and run "dd if=rrboot.bin of=</dev/sdcard> bs=$((0x200)) seek=$((0x40))"
 * SD card is ready
 
-Rockchip RK3568
+Rockchip RK356x
 ===============
 
-RK3568 EVB
-----------
+Barebox features support for the Rockchip RK3566 and RK3568 SoCs, where the
+RK3566 can be considered as reduced but largely identical version of the
+RK3568.
+
+Supported Boards
+----------------
+
+- Rockchip RK3568 EVB
+- Pine64 Quartz64 Model A
+
+The steps described in the following target the RK3568 and the RK3568 EVB but
+generally apply to both SoCs and all boards.
+Differences between the SoCs or boards are outlined where required.
 
 Building
-^^^^^^^^
+--------
 
 The build process needs three binary files which have to be copied from the
 `rkbin https://github.com/rockchip-linux/rkbin` repository to the barebox source tree:
 
 .. code-block:: sh
+
   cp $RKBIN/bin/rk35/rk3568_bl31_v1.24.elf firmware/rk3568-bl31.bin
   cp $RKBIN/bin/rk35/rk3568_bl32_v1.05.bin firmware/rk3568-op-tee.bin
   cp $RKBIN/bin/rk35/rk3568_ddr_1560MHz_v1.08.bin arch/arm/boards/rockchip-rk3568-evb/sdram-init.bin
@@ -72,8 +84,11 @@ With these barebox can be compiled as:
 
 **NOTE** I found the bl32 firmware non working for me as of 7d631e0d5b2d373b54d4533580d08fb9bd2eaad4 in the rkbin repository.
 
+**NOTE** The RK3566 and RK3568 seem to share the bl31 and bl32 firmware files,
+whereas the memory initialization blob is different.
+
 Creating a bootable SD card
-^^^^^^^^^^^^^^^^^^^^^^^^^^^
+---------------------------
 
 A bootable SD card can be created with:
 
@@ -86,7 +101,7 @@ doesn't conflict with the are barebox is written to. Starting the first
 partition at offset 8MiB is a safe bet.
 
 USB bootstrapping
-^^^^^^^^^^^^^^^^^
+-----------------
 
 The RK3568 can be bootstrapped via USB for which the rk-usb-loader tool in the barebox
 repository can be used. The tool takes the same images as written on SD cards:
@@ -99,3 +114,4 @@ Note that the boot order of the RK3568 is not configurable. The SoC will only en
 MaskROM mode when no other bootsource contains a valid bootloader. This means to use USB
 you have to make all other bootsources invalid by removing SD cards and shortcircuiting
 eMMCs. The RK3568 EVB has a pushbutton to disable the eMMC.
+On the Quartz64 boards, remove the eMMC module if present.
diff --git a/arch/arm/boards/Makefile b/arch/arm/boards/Makefile
index a841053c2..b7a72d5ba 100644
--- a/arch/arm/boards/Makefile
+++ b/arch/arm/boards/Makefile
@@ -184,3 +184,4 @@ obj-$(CONFIG_MACH_TQMLS1046A)			+= tqmls1046a/
 obj-$(CONFIG_MACH_MNT_REFORM)			+= mnt-reform/
 obj-$(CONFIG_MACH_SKOV_ARM9CPU)			+= skov-arm9cpu/
 obj-$(CONFIG_MACH_RK3568_EVB)			+= rockchip-rk3568-evb/
+obj-$(CONFIG_MACH_PINE64_QUARTZ64)		+= pine64-quartz64/
diff --git a/arch/arm/boards/pine64-quartz64/Makefile b/arch/arm/boards/pine64-quartz64/Makefile
new file mode 100644
index 000000000..b37b6c870
--- /dev/null
+++ b/arch/arm/boards/pine64-quartz64/Makefile
@@ -0,0 +1,3 @@
+# SPDX-License-Identifier: GPL-2.0-only
+obj-y += board.o
+lwl-y += lowlevel.o
diff --git a/arch/arm/boards/pine64-quartz64/board.c b/arch/arm/boards/pine64-quartz64/board.c
new file mode 100644
index 000000000..db2d921c3
--- /dev/null
+++ b/arch/arm/boards/pine64-quartz64/board.c
@@ -0,0 +1,40 @@
+// SPDX-License-Identifier: GPL-2.0-only
+#include <common.h>
+#include <init.h>
+
+struct quartz64_model {
+	const char *name;
+	const char *shortname;
+};
+
+static int quartz64_probe(struct device_d *dev)
+{
+	struct quartz64_model *model;
+
+	model = device_get_match_data(dev);
+
+	barebox_set_model(model->name);
+	barebox_set_hostname(model->shortname);
+
+	return 0;
+}
+
+static const struct quartz64_model quartz64a = {
+	.name = "Pine64 Quartz64 Model A",
+	.shortname = "quartz64a",
+};
+
+static const struct of_device_id quartz64_of_match[] = {
+	{
+		.compatible = "pine64,quartz64-a",
+		.data = &quartz64a,
+	},
+	{ /* sentinel */ },
+};
+
+static struct driver_d quartz64_board_driver = {
+	.name = "board-quartz64",
+	.probe = quartz64_probe,
+	.of_compatible = quartz64_of_match,
+};
+coredevice_platform_driver(quartz64_board_driver);
diff --git a/arch/arm/boards/pine64-quartz64/lowlevel.c b/arch/arm/boards/pine64-quartz64/lowlevel.c
new file mode 100644
index 000000000..b29588552
--- /dev/null
+++ b/arch/arm/boards/pine64-quartz64/lowlevel.c
@@ -0,0 +1,39 @@
+// SPDX-License-Identifier: GPL-2.0-only
+#include <common.h>
+#include <linux/sizes.h>
+#include <asm/barebox-arm-head.h>
+#include <asm/barebox-arm.h>
+#include <mach/hardware.h>
+#include <mach/atf.h>
+#include <debug_ll.h>
+#include <mach/rockchip.h>
+
+extern char __dtb_rk3566_quartz64_a_start[];
+
+static noinline void start_quartz64(void *fdt)
+{
+	/*
+	 * Image execution starts at 0x0, but this is used for ATF and
+	 * OP-TEE later, so move away from here.
+	 */
+	if (current_el() == 3)
+		relocate_to_adr_full(RK3568_BAREBOX_LOAD_ADDRESS);
+	else
+		relocate_to_current_adr();
+
+	setup_c();
+
+	if (current_el() == 3) {
+		rk3568_lowlevel_init();
+		rk3568_atf_load_bl31(fdt);
+		/* not reached */
+	}
+
+	barebox_arm_entry(RK3568_DRAM_BOTTOM, 0x80000000 - RK3568_DRAM_BOTTOM,
+			  fdt);
+}
+
+ENTRY_FUNCTION(start_quartz64a, r0, r1, r2)
+{
+	start_quartz64(__dtb_rk3566_quartz64_a_start);
+}
diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile
index 88a079497..7da366bda 100644
--- a/arch/arm/dts/Makefile
+++ b/arch/arm/dts/Makefile
@@ -74,6 +74,7 @@ lwl-$(CONFIG_MACH_PHYTEC_SOM_IMX6) += imx6q-phytec-phycard.dtb.o \
 				imx6ull-phytec-phycore-som-emmc.dtb.o
 lwl-$(CONFIG_MACH_PHYTEC_PHYCORE_IMX7) += imx7d-phyboard-zeta.dtb.o
 lwl-$(CONFIG_MACH_PHYTEC_SOM_IMX8MQ) += imx8mq-phytec-phycore-som.dtb.o
+lwl-$(CONFIG_MACH_PINE64_QUARTZ64) += rk3566-quartz64-a.dtb.o
 lwl-$(CONFIG_MACH_PLATHOME_OPENBLOCKS_AX3) += armada-xp-openblocks-ax3-4-bb.dtb.o
 lwl-$(CONFIG_MACH_PLATHOME_OPENBLOCKS_A6) += kirkwood-openblocks_a6-bb.dtb.o
 lwl-$(CONFIG_MACH_PROTONIC_IMX6) += \
diff --git a/arch/arm/mach-rockchip/Kconfig b/arch/arm/mach-rockchip/Kconfig
index 1ad7ccedf..5603fc12c 100644
--- a/arch/arm/mach-rockchip/Kconfig
+++ b/arch/arm/mach-rockchip/Kconfig
@@ -50,6 +50,12 @@ config MACH_RK3568_EVB
 	help
 	  Say Y here if you are using a RK3568 EVB
 
+config MACH_PINE64_QUARTZ64
+	select ARCH_RK3568
+	bool "Pine64 Quartz64"
+	help
+	  Say Y here if you are using a Pine64 Quartz64
+
 comment "select board features:"
 
 config ARCH_RK3568_OPTEE
diff --git a/arch/arm/mach-rockchip/rockchip.c b/arch/arm/mach-rockchip/rockchip.c
index c185b0cc2..698d23e3a 100644
--- a/arch/arm/mach-rockchip/rockchip.c
+++ b/arch/arm/mach-rockchip/rockchip.c
@@ -9,6 +9,8 @@ static int rockchip_init(void)
 		return rk3188_init();
 	if (of_machine_is_compatible("rockchip,rk3288"))
 		return rk3288_init();
+	if (of_machine_is_compatible("rockchip,rk3566"))
+		return rk3568_init();
 	if (of_machine_is_compatible("rockchip,rk3568"))
 		return rk3568_init();
 
diff --git a/images/Makefile.rockchip b/images/Makefile.rockchip
index e64fccec6..19980914b 100644
--- a/images/Makefile.rockchip
+++ b/images/Makefile.rockchip
@@ -13,9 +13,16 @@ image-$(CONFIG_MACH_PHYTEC_SOM_RK3288) += barebox-rk3288-phycore-som.img
 pblb-$(CONFIG_MACH_RK3568_EVB) += start_rk3568_evb
 image-$(CONFIG_MACH_RK3568_EVB) += barebox-rk3568-evb.img
 
+pblb-$(CONFIG_MACH_PINE64_QUARTZ64) += start_quartz64a
+image-$(CONFIG_MACH_PINE64_QUARTZ64) += barebox-quartz64a.img
+
 quiet_cmd_rkimg_image = RK-IMG $@
       cmd_rkimg_image = $(objtree)/scripts/rkimage -o $@ $(word 2,$^) $(word 1,$^)
 
 $(obj)/barebox-rk3568-evb.img: $(obj)/start_rk3568_evb.pblb \
                 $(board)/rockchip-rk3568-evb/sdram-init.bin
 	$(call if_changed,rkimg_image)
+
+$(obj)/barebox-quartz64a.img: $(obj)/start_quartz64a.pblb \
+                $(board)/pine64-quartz64/sdram-init.bin
+	$(call if_changed,rkimg_image)
-- 
2.30.2




More information about the barebox mailing list