ram: renesas: Add Renesas R-Car Gen4 DBSC5 driver

Add Renesas R-Car Gen4 DBSC5 DRAM controller driver. This driver is currently
capable of bringing LPDDR5 DRAM on Renesas R-Car V4H Whitehawk board. Further
boards can be supported by supplying board specific DRAM configuration data
via dbsc5_get_board_data(). Support for R-Car V4M is not implemented, however
the driver is already mostly prepared to support this SoC.

Signed-off-by: Marek Vasut <marek.vasut+renesas@mailbox.org>
diff --git a/drivers/ram/renesas/dbsc5/qos.c b/drivers/ram/renesas/dbsc5/qos.c
new file mode 100644
index 0000000..56a60b9
--- /dev/null
+++ b/drivers/ram/renesas/dbsc5/qos.c
@@ -0,0 +1,636 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2024 Renesas Electronics Corp.
+ */
+
+#include <asm/io.h>
+#include <dm.h>
+#include <errno.h>
+#include <hang.h>
+#include <linux/sizes.h>
+#include <ram.h>
+#include "dbsc5.h"
+
+/* AXMM */
+#define AXMM_ADSPLCR0				0x4008
+#define AXMM_ADSPLCR1				0x400C
+#define AXMM_ADSPLCR2				0x4010
+#define AXMM_ADSPLCR3				0x4014
+#define AXMM_MMCR				0x4300
+#define AXMM_TR0CR0				0x51000
+#define AXMM_TR1CR0				0x51004
+#define AXMM_TR2CR0				0x51008
+#define AXMM_TR3CR				0x5100C
+#define AXMM_TR3CR0				0x5100C
+#define AXMM_TR0CR1				0x51100
+#define AXMM_TR1CR1				0x51104
+#define AXMM_TR2CR1				0x51108
+#define AXMM_TR3CR1				0x5110C
+#define AXMM_TR0CR2				0x51200
+#define AXMM_TR1CR2				0x51204
+#define AXMM_TR2CR2				0x51208
+#define AXMM_TR3CR2				0x5120C
+
+#define ACTEXT_RT0_R				0xFFC50800
+#define ACTEXT_RT0_W				0xFFC51800
+#define ACTEXT_IR0_R				0xFF890800
+#define ACTEXT_IR0_W				0xFF891800
+#define ACTEXT_IR1_R				0xFF892800
+#define ACTEXT_IR1_W				0xFF893800
+#define SI0_RW_MAX				0xF1201110
+#define SI1_RW_MAX				0xF1202110
+
+/* DBSC */
+#define DBSC_A_CH_OFFSET			0x8000
+#define DBSC_D_CH_OFFSET			0x4000
+
+#define DBSC_SYSCNT0				0x0100
+#define DBSC_SYSCNT1				0x0104
+#define DBSC_FCPRSCTRL				0x0110
+#define DBSC_DBBUS0CNF2				0x0808
+#define DBSC_DBCAM0CNF1				0x0904
+#define DBSC_DBCAM0CNF2				0x0908
+#define DBSC_DBCAM0CNF3				0x090C
+#define DBSC_DBCAMDIS				0x09FC
+#define DBSC_DBSCHCNT0				0x1000
+#define DBSC_DBSCHSZ0				0x1010
+#define DBSC_DBSCHRW0				0x1020
+#define DBSC_SCFCTST2				0x1048
+#define DBSC_DBSCHQOS_0_0			0x1100
+#define DBSC_DBSCHQOS_0_1			0x1104
+#define DBSC_DBSCHQOS_0_2			0x1108
+#define DBSC_DBSCHQOS_0_3			0x110C
+#define DBSC_DBSCHQOS_4_0			0x1140
+#define DBSC_DBSCHQOS_4_1			0x1144
+#define DBSC_DBSCHQOS_4_2			0x1148
+#define DBSC_DBSCHQOS_4_3			0x114C
+#define DBSC_DBSCHQOS_9_0			0x1190
+#define DBSC_DBSCHQOS_9_1			0x1194
+#define DBSC_DBSCHQOS_9_2			0x1198
+#define DBSC_DBSCHQOS_9_3			0x119C
+#define DBSC_DBSCHQOS_12_0			0x11C0
+#define DBSC_DBSCHQOS_12_1			0x11C4
+#define DBSC_DBSCHQOS_12_2			0x11C8
+#define DBSC_DBSCHQOS_12_3			0x11CC
+#define DBSC_DBSCHQOS_13_0			0x11D0
+#define DBSC_DBSCHQOS_13_1			0x11D4
+#define DBSC_DBSCHQOS_13_2			0x11D8
+#define DBSC_DBSCHQOS_13_3			0x11DC
+#define DBSC_DBSCHQOS_14_0			0x11E0
+#define DBSC_DBSCHQOS_14_1			0x11E4
+#define DBSC_DBSCHQOS_14_2			0x11E8
+#define DBSC_DBSCHQOS_14_3			0x11EC
+#define DBSC_DBSCHQOS_15_0			0x11F0
+#define DBSC_DBSCHQOS_15_1			0x11F4
+#define DBSC_DBSCHQOS_15_2			0x11F8
+#define DBSC_DBSCHQOS_15_3			0x11FC
+
+/* CCI */
+#define CCIQOS00				0xC020
+#define CCIQOS01				0xC024
+#define CCIQOS10				0xD000
+#define CCIQOS11				0xD004
+
+/* QOS */
+#define QOS_FIX_QOS_BANK0			0x0
+#define QOS_FIX_QOS_BANK1			0x1000
+#define QOS_BE_QOS_BANK0			0x2000
+#define QOS_BE_QOS_BANK1			0x3000
+#define QOS_SL_INIT				0x8000
+#define QOS_REF_ARS				0x8004
+#define QOS_STATQC				0x8008
+#define QOS_REF_ENBL				0x8044
+#define QOS_BWG					0x804C
+#define QOS_RAS					0x10000
+#define QOS_FSS					0x10048
+#define QOS_RAEN				0x10018
+#define QOS_DANN_LOW				0x10030
+#define QOS_DANN_HIGH				0x10034
+#define QOS_DANT				0x10038
+#define QOS_EMS_LOW				0x10040
+#define QOS_EMS_HIGH				0x10044
+#define QOS_INSFC				0x10050
+#define QOS_EARLYR				0x10060
+#define QOS_RACNT0				0x10080
+#define QOS_STATGEN0				0x10088
+
+#define QOSWT_FIX_QOS_BANK0			0x800
+#define QOSWT_FIX_QOS_BANK1			0x1800
+#define QOSWT_BE_QOS_BANK0			0x2800
+#define QOSWT_BE_QOS_BANK1			0x3800
+#define QOSWT_WTEN				0x8030
+#define QOSWT_WTREF				0x8034
+#define QOSWT_WTSET0				0x8038
+#define QOSWT_WTSET1				0x803C
+
+static const struct {
+	u64	fix;
+	u64	be;
+} g_qosbw_tbl[] = {
+	{ 0x000C04010000FFFF, 0x00200030004FFC01 },
+	{ 0x000C04010000FFFF, 0x00100030004FFC01 },
+	{ 0x000C04010000FFFF, 0x00100030004FFC01 },
+	{ 0x000C04010000FFFF, 0x00200030004FFC01 },
+	{ 0x000C04010000FFFF, 0x00100030004FFC01 },
+	{ 0x000C04010000FFFF, 0x00100030004FFC01 },
+	{ 0x000C04010000FFFF, 0x00100030004FFC01 },
+	{ 0x000C04010000FFFF, 0x00100030004FFC01 },
+	{ 0x000C04010000FFFF, 0x00100030004FFC01 },
+	{ 0x000C04010000FFFF, 0x00200030004FFC01 },
+	{ 0x000C04010000FFFF, 0x0000000000000000 },
+	{ 0x000C04080000FFFF, 0x00200030004FFC01 },
+	{ 0x000C04080000FFFF, 0x00100030004FFC01 },
+	{ 0x000C04080000FFFF, 0x00100030004FFC01 },
+	{ 0x000C04080000FFFF, 0x00100030004FFC01 },
+	{ 0x000C04010000FFFF, 0x00200030004FFC01 },
+	{ 0x000C04080000FFFF, 0x00100030004FFC01 },
+	{ 0x000C04080000FFFF, 0x00100030004FFC01 },
+	{ 0x000C04080000FFFF, 0x00100030004FFC01 },
+	{ 0x000C04080000FFFF, 0x00100030004FFC01 },
+	{ 0x000C04100000FFFF, 0x00100030004FFC01 },
+	{ 0x000C04100000FFFF, 0x00100030004FFC01 },
+	{ 0x000C04100000FFFF, 0x0000000000000000 },
+	{ 0x000C08140000FFFF, 0x00100030004FFC01 },
+	{ 0x000C08140000FFFF, 0x00100030004FFC01 },
+	{ 0x000000000000FFF0, 0x0000000000000000 },
+	{ 0x000C04100000FFFF, 0x00100030004FFC01 },
+	{ 0x000C04100000FFFF, 0x00100030004FFC01 },
+	{ 0x000C04100000FFFF, 0x0000000000000000 },
+	{ 0x000C04080000FFFF, 0x00100030004FFC01 },
+	{ 0x000C08140000FFFF, 0x00100030004FFC01 },
+	{ 0x000000000000FFFF, 0x0000000000000000 },
+	{ 0x000C04080000FFFF, 0x00100030004FFC01 },
+	{ 0x000C04080000FFFF, 0x00100030004FFC01 },
+	{ 0x000C04080000FFFF, 0x00100030004FFC01 },
+	{ 0x000C04080000FFFF, 0x00100030004FFC01 },
+	{ 0x000C04080000FFFF, 0x00100030004FFC01 },
+	{ 0x000C04080000FFFF, 0x00100030004FFC01 },
+	{ 0x001404080000FFFF, 0x00100030004FFC01 },
+	{ 0x001404080000FFFF, 0x00100030004FFC01 },
+	{ 0x000C04010000FFFF, 0x001000F0004FFC01 },
+	{ 0x000C04010000FFFF, 0x001000F0004FFC01 },
+	{ 0x000C04010000FFFF, 0x002000F0004FFC01 },
+	{ 0x000C04010000FFFF, 0x002000F0004FFC01 },
+	{ 0x000000000000FFFF, 0x0000000000000000 },
+	{ 0x000000000000FFFF, 0x0000000000000000 },
+	{ 0x000000000000FFFF, 0x0000000000000000 },
+	{ 0x000000000000FFFF, 0x0000000000000000 },
+	{ 0x000C144F0000FFFF, 0x00100030004FFC01 },
+	{ 0x000C144F0000FFFF, 0x00100030004FFC01 },
+	{ 0x000C144F0000FFFF, 0x00100030004FFC01 },
+	{ 0x000C144F0000FFFF, 0x00100030004FFC01 },
+	{ 0x000C144F0000FFFF, 0x00100030004FFC01 },
+	{ 0x000C144F0000FFFF, 0x00100030004FFC01 },
+	{ 0x000000000000FFFF, 0x0000000000000000 },
+	{ 0x000C144F0000FFFF, 0x00100030004FFC01 },
+	{ 0x000000000000FFFF, 0x0000000000000000 },
+	{ 0x000C144F0000FFFF, 0x00100030004FFC01 },
+	{ 0x000000000000FFFF, 0x0000000000000000 },
+	{ 0x000C144F0000FFFF, 0x00100030004FFC01 },
+	{ 0x000000000000FFFF, 0x0000000000000000 },
+	{ 0x000000000000FFFF, 0x0000000000000000 },
+	{ 0x000C144F0000FFFF, 0x00100030004FFC01 },
+	{ 0x000C144F0000FFFF, 0x00100030004FFC01 },
+	{ 0x000C04200000FFFF, 0x00100030004FFC01 },
+	{ 0x000C04100000FFFF, 0x00100030004FFC01 },
+	{ 0x000C144F0000FFFF, 0x00100030004FFC01 },
+	{ 0x000C144F0000FFFF, 0x00100030004FFC01 },
+	{ 0x000C0C4F0000FFFF, 0x00100030004FFC01 },
+	{ 0x000C0C4F0000FFFF, 0x00100030004FFC01 },
+	{ 0x001404080000FFFF, 0x00100030004FFC01 },
+	{ 0x000C04080000FFFF, 0x00100030004FFC01 },
+	{ 0x000C04080000FFFF, 0x00100030004FFC01 },
+	{ 0x000C04010000FFFF, 0x00100030004FFC01 },
+	{ 0x001424870000FFFF, 0x00100030004FFC01 },
+	{ 0x001424870000FFFF, 0x00100030004FFC01 },
+	{ 0x000C149E0000FFFF, 0x00100030004FFC01 },
+	{ 0x000C149E0000FFFF, 0x00100030004FFC01 },
+	{ 0x000000000000FFFF, 0x0000000000000000 },
+	{ 0x000000000000FFFF, 0x0000000000000000 },
+	{ 0x00140C050000FFFF, 0x00100030004FFC01 },
+	{ 0x0014450E0000FFFF, 0x00100030004FFC01 },
+	{ 0x001424870000FFFF, 0x00100030004FFC01 },
+	{ 0x0014289E0000FFFF, 0x00000000000FFC00 },
+	{ 0x0014289E0000FFFF, 0x00000000000FFC00 },
+	{ 0x0014149E0000FFFF, 0x0000000000000000 },
+	{ 0x000000000000FFFF, 0x0000000000000000 },
+	{ 0x000000000000FFFF, 0x0000000000000000 },
+	{ 0x001004080000FFFF, 0x0000000000000000 },
+	{ 0x001004080000FFFF, 0x0000000000000000 },
+	{ 0x001004080000FFFF, 0x0000000000000000 },
+	{ 0x000C00000000FFFF, 0x001000F0004FFC01 },
+	{ 0x000C00000000FFFF, 0x001000F0004FFC01 },
+	{ 0x000C04080000FFFF, 0x00100030004FFC01 },
+	{ 0x000C04080000FFFF, 0x00100030004FFC01 },
+	{ 0x000000000000FFFF, 0x0000000000000000 },
+	{ 0x000C04080000FFFF, 0x00100030004FFC01 },
+	{ 0x000C04080000FFFF, 0x00100030004FFC01 },
+	{ 0x000C04080000FFFF, 0x00100030004FFC01 },
+	{ 0x000000000000FFFF, 0x0000000000000000 },
+	{ 0x000C04080000FFFF, 0x00100030004FFC01 },
+	{ 0x001404080000FFFF, 0x00100030004FFC01 },
+	{ 0x000C04080000FFFF, 0x00100030004FFC01 },
+	{ 0x000C04080000FFFF, 0x00100030004FFC01 },
+	{ 0x000000000000FFFF, 0x0000000000000000 },
+	{ 0x000000000000FFFF, 0x0000000000000000 },
+	{ 0x000000000000FFFF, 0x0000000000000000 },
+	{ 0x000000000000FFFF, 0x0000000000000000 },
+	{ 0x000000000000FFFF, 0x0000000000000000 },
+	{ 0x000000000000FFFF, 0x0000000000000000 },
+	{ 0x000000000000FFFF, 0x0000000000000000 },
+	{ 0x000000000000FFFF, 0x0000000000000000 },
+	{ 0x000000000000FFFF, 0x0000000000000000 },
+	{ 0x000000000000FFFF, 0x0000000000000000 },
+	{ 0x000C04010000FFFF, 0x001001D0004FFC01 },
+	{ 0x000000000000FFFF, 0x0000000000000000 },
+	{ 0x000C04010000FFFF, 0x001001D0004FFC01 },
+	{ 0x000000000000FFFF, 0x0000000000000000 },
+	{ 0x000C04010000FFFF, 0x001001D0004FFC01 },
+	{ 0x000C04010000FFFF, 0x00100030004FFC01 },
+	{ 0x000C04010000FFFF, 0x00100030004FFC01 },
+	{ 0x000C04010000FFFF, 0x001001D0004FFC01 },
+	{ 0x000C04010000FFFF, 0x00100030004FFC01 },
+	{ 0x000C04010000FFFF, 0x00100030004FFC01 },
+	{ 0x001404010000FFFF, 0x00100030004FFC01 }
+};
+
+static const struct {
+	u64	fix;
+	u64	be;
+} g_qoswt_tbl[] = {
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x000C04050000FFFF, 0x0000000000000000 },
+	{ 0x000C080C0000FFFF, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x000C04050000C001, 0x0000000000000000 },
+	{ 0x000C080C0000C001, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x001424870000C001, 0x0000000000000000 },
+	{ 0x001424870000C001, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x001424870000FFFF, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 },
+	{ 0x0000000000000000, 0x0000000000000000 }
+};
+
+struct renesas_dbsc5_qos_priv {
+	void __iomem		*regs;
+};
+
+static int dbsc5_qos_dbsc_setting(struct udevice *dev)
+{
+	struct renesas_dbsc5_qos_priv *priv = dev_get_priv(dev);
+	void __iomem *regs_dbsc_a, *regs_dbsc_d;
+	unsigned int ch, nch;
+
+	if (IS_ENABLED(CONFIG_R8A779G0) &&
+	    renesas_get_cpu_type() == RENESAS_CPU_TYPE_R8A779G0)
+		nch = 2;
+	else if (IS_ENABLED(CONFIG_R8A779H0) &&
+		 renesas_get_cpu_type() == RENESAS_CPU_TYPE_R8A779H0)
+		nch = 1;
+	else
+		return -EINVAL;
+
+	for (ch = 0; ch < nch; ch++) {
+		regs_dbsc_a = priv->regs + DBSC5_DBSC_A_OFFSET + ch * DBSC_A_CH_OFFSET;
+		regs_dbsc_d = priv->regs + DBSC5_DBSC_D_OFFSET + ch * DBSC_D_CH_OFFSET;
+
+		/* DBSC CAM, Scheduling Setting */
+		writel(0x1234, regs_dbsc_d + DBSC_SYSCNT0);
+		writel(0x1234, regs_dbsc_a + DBSC_SYSCNT0);
+		writel(0x48218, regs_dbsc_a + DBSC_DBCAM0CNF1);
+		writel(0x1C4, regs_dbsc_a + DBSC_DBCAM0CNF2);
+		writel(0x3, regs_dbsc_a + DBSC_DBCAM0CNF3);
+
+		if (IS_ENABLED(CONFIG_R8A779G0) &&
+		    renesas_get_cpu_type() == RENESAS_CPU_TYPE_R8A779G0 &&
+		    (renesas_get_cpu_rev_integer() < 2 ||
+		     (renesas_get_cpu_rev_integer() == 2 &&
+		      renesas_get_cpu_rev_fraction() <= 1))) {
+			/* OTLINT-5579: V4H <= rev2.1 DBSC W/A-3 */
+			writel(0x11, regs_dbsc_a + DBSC_DBCAMDIS);
+		} else {
+			writel(0x10, regs_dbsc_a + DBSC_DBCAMDIS);
+		}
+
+		writel(0xF0037, regs_dbsc_a + DBSC_DBSCHCNT0);
+		writel(0x1, regs_dbsc_a + DBSC_DBSCHSZ0);
+		writel(0xF7311111, regs_dbsc_a + DBSC_DBSCHRW0);
+		writel(0x111F1FFF, regs_dbsc_a + DBSC_SCFCTST2);
+
+		/* OTLINT-5579: V4H DBSC WA3 */
+		writel(0x7, regs_dbsc_a + DBSC_DBBUS0CNF2);
+
+		/* DBSC QoS Setting */
+		writel(0xFFFF, regs_dbsc_a + DBSC_DBSCHQOS_0_0);
+		writel(0x480, regs_dbsc_a + DBSC_DBSCHQOS_0_1);
+		writel(0x300, regs_dbsc_a + DBSC_DBSCHQOS_0_2);
+		writel(0x180, regs_dbsc_a + DBSC_DBSCHQOS_0_3);
+		writel(0x400, regs_dbsc_a + DBSC_DBSCHQOS_4_0);
+		writel(0x300, regs_dbsc_a + DBSC_DBSCHQOS_4_1);
+		writel(0x200, regs_dbsc_a + DBSC_DBSCHQOS_4_2);
+		writel(0x100, regs_dbsc_a + DBSC_DBSCHQOS_4_3);
+		writel(0x300, regs_dbsc_a + DBSC_DBSCHQOS_9_0);
+		writel(0x240, regs_dbsc_a + DBSC_DBSCHQOS_9_1);
+		writel(0x180, regs_dbsc_a + DBSC_DBSCHQOS_9_2);
+		writel(0xC0, regs_dbsc_a + DBSC_DBSCHQOS_9_3);
+		writel(0x40, regs_dbsc_a + DBSC_DBSCHQOS_12_0);
+		writel(0x30, regs_dbsc_a + DBSC_DBSCHQOS_12_1);
+		writel(0x20, regs_dbsc_a + DBSC_DBSCHQOS_12_2);
+		writel(0x10, regs_dbsc_a + DBSC_DBSCHQOS_12_3);
+		writel(0x300, regs_dbsc_a + DBSC_DBSCHQOS_13_0);
+		writel(0x240, regs_dbsc_a + DBSC_DBSCHQOS_13_1);
+		writel(0x180, regs_dbsc_a + DBSC_DBSCHQOS_13_2);
+		writel(0xC0, regs_dbsc_a + DBSC_DBSCHQOS_13_3);
+		writel(0x200, regs_dbsc_a + DBSC_DBSCHQOS_14_0);
+		writel(0x180, regs_dbsc_a + DBSC_DBSCHQOS_14_1);
+		writel(0x100, regs_dbsc_a + DBSC_DBSCHQOS_14_2);
+		writel(0x80, regs_dbsc_a + DBSC_DBSCHQOS_14_3);
+		writel(0x100, regs_dbsc_a + DBSC_DBSCHQOS_15_0);
+		writel(0xC0, regs_dbsc_a + DBSC_DBSCHQOS_15_1);
+		writel(0x80, regs_dbsc_a + DBSC_DBSCHQOS_15_2);
+		writel(0x40, regs_dbsc_a + DBSC_DBSCHQOS_15_3);
+
+		/* Target register is only DBSC0 side. */
+		if (ch == 0)
+			writel(0x1, regs_dbsc_a + DBSC_FCPRSCTRL);
+
+		writel(0x1, regs_dbsc_a + DBSC_SYSCNT1);
+		writel(0x0, regs_dbsc_d + DBSC_SYSCNT0);
+		writel(0x0, regs_dbsc_a + DBSC_SYSCNT0);
+	}
+
+	return 0;
+}
+
+static int dbsc5_qos_settings_init(struct udevice *dev)
+{
+	struct renesas_dbsc5_qos_priv *priv = dev_get_priv(dev);
+	void __iomem *regs_axmm = priv->regs + DBSC5_AXMM_OFFSET;
+	void __iomem *regs_cci = priv->regs + DBSC5_CCI_OFFSET;
+	void __iomem *regs_qos = priv->regs + DBSC5_QOS_OFFSET;
+	int i;
+
+	if (IS_ENABLED(CONFIG_R8A779G0) &&
+	    renesas_get_cpu_type() == RENESAS_CPU_TYPE_R8A779G0) {
+		/* Address Split 2ch */
+		writel(0x0, regs_axmm + AXMM_ADSPLCR0);
+		writel(0xFF1B0C, regs_axmm + AXMM_ADSPLCR1);
+		writel(0x0, regs_axmm + AXMM_ADSPLCR2);
+		writel(0x0, regs_axmm + AXMM_ADSPLCR3);
+
+		writel(0x8000000, regs_cci + CCIQOS00);
+		writel(0x8000000, regs_cci + CCIQOS01);
+
+		if (renesas_get_cpu_rev_integer() >= 2) {
+			writel(0x1, regs_cci + CCIQOS10);
+			writel(0x1, regs_cci + CCIQOS11);
+		} else {
+			writel(0x0, regs_cci + CCIQOS10);
+			writel(0x0, regs_cci + CCIQOS11);
+		}
+
+		/* Resource Alloc setting */
+		writel(0x48, regs_qos + QOS_RAS);
+	} else if (IS_ENABLED(CONFIG_R8A779H0) &&
+	    renesas_get_cpu_type() == RENESAS_CPU_TYPE_R8A779H0) {
+		/* Resource Alloc setting */
+		writel(0x30, regs_qos + QOS_RAS);
+	} else {
+		return -EINVAL;
+	}
+
+	writel(0x2020201, regs_qos + QOS_DANN_LOW);
+	writel(0x4040200, regs_qos + QOS_DANN_HIGH);
+	writel(0x181008, regs_qos + QOS_DANT);
+	writel(0x0, regs_qos + QOS_EMS_LOW);
+	writel(0x0, regs_qos + QOS_EMS_HIGH);
+	writel(0xA, regs_qos + QOS_FSS);
+	writel(0x30F0001, regs_qos + QOS_INSFC);
+	writel(0x0, regs_qos + QOS_EARLYR);
+	writel(0x50003, regs_qos + QOS_RACNT0);
+	writel(0x0, regs_qos + QOS_STATGEN0);
+
+	/* QoS MSTAT setting */
+	writel(0x70120, regs_qos + QOS_SL_INIT);
+	writel(0x11B0000, regs_qos + QOS_REF_ARS);
+	writel(0x12, regs_qos + QOS_REF_ENBL);
+	writel(0x4, regs_qos + QOS_BWG);
+
+	if (IS_ENABLED(CONFIG_R8A779G0) &&
+	    renesas_get_cpu_type() == RENESAS_CPU_TYPE_R8A779G0 &&
+	    (renesas_get_cpu_rev_integer() < 2 ||
+	     (renesas_get_cpu_rev_integer() == 2 &&
+	      renesas_get_cpu_rev_fraction() <= 1))) {
+		/* OTLINT-5579: V4H <= rev2.1 DBSC W/A-3 */
+		writel(0x0, regs_axmm + AXMM_MMCR);
+	} else {
+		writel(0x10000, regs_axmm + AXMM_MMCR);
+	}
+
+	writel(0x3, ACTEXT_RT0_R);
+	writel(0x3, ACTEXT_RT0_W);
+
+	/*
+	 * This may be necessary, but this IP is powered off at this point:
+	 * writel(0x3, ACTEXT_IR0_R);
+	 * writel(0x3, ACTEXT_IR0_W);
+	 * writel(0x3, ACTEXT_IR1_R);
+	 * writel(0x3, ACTEXT_IR1_W);
+	 */
+
+	if (IS_ENABLED(CONFIG_R8A779G0) &&
+	    renesas_get_cpu_type() == RENESAS_CPU_TYPE_R8A779G0) {
+		writel(0x10000, regs_axmm + AXMM_TR3CR);
+
+		if (renesas_get_cpu_rev_integer() >= 2) {
+			/* WA1 patch for IPL CA76 hang-up issue, REL_TRI_DN-7592 */
+			writel(0x38, SI0_RW_MAX);
+			writel(0x38, SI1_RW_MAX);
+		}
+	}
+
+	if (IS_ENABLED(CONFIG_R8A779H0) &&
+	    renesas_get_cpu_type() == RENESAS_CPU_TYPE_R8A779H0) {
+		writel(0x0, regs_axmm + AXMM_TR0CR0);
+		writel(0x0, regs_axmm + AXMM_TR1CR0);
+		writel(0x0, regs_axmm + AXMM_TR2CR0);
+		writel(0x0, regs_axmm + AXMM_TR3CR0);
+		writel(0x70707070, regs_axmm + AXMM_TR0CR1);
+		writel(0x70707070, regs_axmm + AXMM_TR1CR1);
+		writel(0x70707070, regs_axmm + AXMM_TR2CR1);
+		writel(0x70707070, regs_axmm + AXMM_TR3CR1);
+		writel(0x70707070, regs_axmm + AXMM_TR0CR2);
+		writel(0x70707070, regs_axmm + AXMM_TR1CR2);
+		writel(0x70707070, regs_axmm + AXMM_TR2CR2);
+		writel(0x70707070, regs_axmm + AXMM_TR3CR2);
+	}
+
+	for (i = 0U; i < ARRAY_SIZE(g_qosbw_tbl); i++) {
+		writeq(g_qosbw_tbl[i].fix, regs_qos + QOS_FIX_QOS_BANK0 + (i * 8));
+		writeq(g_qosbw_tbl[i].fix, regs_qos + QOS_FIX_QOS_BANK1 + (i * 8));
+		writeq(g_qosbw_tbl[i].be, regs_qos + QOS_BE_QOS_BANK0 + (i * 8));
+		writeq(g_qosbw_tbl[i].be, regs_qos + QOS_BE_QOS_BANK1 + (i * 8));
+	}
+
+	for (i = 0U; i < ARRAY_SIZE(g_qoswt_tbl); i++) {
+		writeq(g_qoswt_tbl[i].fix, regs_qos + QOSWT_FIX_QOS_BANK0 + (i * 8));
+		writeq(g_qoswt_tbl[i].fix, regs_qos + QOSWT_FIX_QOS_BANK1 + (i * 8));
+		writeq(g_qoswt_tbl[i].be, regs_qos + QOSWT_BE_QOS_BANK0 + (i * 8));
+		writeq(g_qoswt_tbl[i].be, regs_qos + QOSWT_BE_QOS_BANK1 + (i * 8));
+	}
+
+	/* QoS SRAM setting */
+	writel(0x1, regs_qos + QOS_RAEN);
+	writel(0x2080208, regs_qos + QOSWT_WTREF);
+	writel(0xD90050F, regs_qos + QOSWT_WTSET0);
+	writel(0xD90050F, regs_qos + QOSWT_WTSET1);
+	writel(0x1, regs_qos + QOSWT_WTEN);
+	writel(0x101, regs_qos + QOS_STATQC);
+
+	return 0;
+}
+
+static int renesas_dbsc5_qos_probe(struct udevice *dev)
+{
+	int ret;
+
+	/* Setting the register of DBSC4 for QoS initialize */
+	ret = dbsc5_qos_dbsc_setting(dev);
+	if (ret)
+		return ret;
+
+	return dbsc5_qos_settings_init(dev);
+}
+
+static int renesas_dbsc5_qos_of_to_plat(struct udevice *dev)
+{
+	struct renesas_dbsc5_qos_priv *priv = dev_get_priv(dev);
+
+	priv->regs = dev_read_addr_ptr(dev);
+	if (!priv->regs)
+		return -EINVAL;
+
+	return 0;
+}
+
+U_BOOT_DRIVER(renesas_dbsc5_qos) = {
+	.name		= "dbsc5_qos",
+	.id		= UCLASS_NOP,
+	.of_to_plat	= renesas_dbsc5_qos_of_to_plat,
+	.probe		= renesas_dbsc5_qos_probe,
+	.priv_auto	= sizeof(struct renesas_dbsc5_qos_priv),
+};