]> git.baikalelectronics.ru Git - arm-tf.git/commitdiff
mediatek: mt8192: add uart save and restore api
authorYuchen Huang <yuchen.huang@mediatek.com>
Sat, 1 Aug 2020 08:23:12 +0000 (16:23 +0800)
committerManish Pandey <manish.pandey2@arm.com>
Mon, 7 Dec 2020 23:30:27 +0000 (23:30 +0000)
When system resume, we want to print log as soon as possible.
So we add uart save and restore api, and they will be called
when systtem suspend and resume.

Change-Id: I83b477fd2b39567c9c6b70534ef186993f7053ae
Signed-off-by: Yuchen Huang <yuchen.huang@mediatek.com>
Signed-off-by: Roger Lu <roger.lu@mediatek.com>
plat/mediatek/common/drivers/uart/uart.c [new file with mode: 0644]
plat/mediatek/mt8183/drivers/uart/uart.c [deleted file]
plat/mediatek/mt8183/drivers/uart/uart.h
plat/mediatek/mt8183/platform.mk
plat/mediatek/mt8192/drivers/uart/uart.h [new file with mode: 0644]
plat/mediatek/mt8192/include/platform_def.h
plat/mediatek/mt8192/platform.mk

diff --git a/plat/mediatek/common/drivers/uart/uart.c b/plat/mediatek/common/drivers/uart/uart.c
new file mode 100644 (file)
index 0000000..b940eb3
--- /dev/null
@@ -0,0 +1,112 @@
+/*
+ * Copyright (c) 2020, MediaTek Inc. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <lib/mmio.h>
+#include <uart.h>
+
+static struct mt_uart uart_save_addr[DRV_SUPPORT_UART_PORTS];
+
+static const uint32_t uart_base_addr[DRV_SUPPORT_UART_PORTS] = {
+       UART0_BASE,
+       UART1_BASE
+};
+
+void mt_uart_restore(void)
+{
+       int uart_idx = UART_PORT0;
+       struct mt_uart *uart;
+       unsigned long base;
+
+       /* Must NOT print any debug log before UART restore */
+       for (uart_idx = UART_PORT0; uart_idx < HW_SUPPORT_UART_PORTS;
+            uart_idx++) {
+
+               uart = &uart_save_addr[uart_idx];
+               base = uart->base;
+
+               mmio_write_32(UART_LCR(base), UART_LCR_MODE_B);
+               mmio_write_32(UART_EFR(base), uart->registers.efr);
+               mmio_write_32(UART_LCR(base), uart->registers.lcr);
+               mmio_write_32(UART_FCR(base), uart->registers.fcr);
+
+               /* baudrate */
+               mmio_write_32(UART_HIGHSPEED(base), uart->registers.highspeed);
+               mmio_write_32(UART_FRACDIV_L(base), uart->registers.fracdiv_l);
+               mmio_write_32(UART_FRACDIV_M(base), uart->registers.fracdiv_m);
+               mmio_write_32(UART_LCR(base),
+                             uart->registers.lcr | UART_LCR_DLAB);
+               mmio_write_32(UART_DLL(base), uart->registers.dll);
+               mmio_write_32(UART_DLH(base), uart->registers.dlh);
+               mmio_write_32(UART_LCR(base), uart->registers.lcr);
+               mmio_write_32(UART_SAMPLE_COUNT(base),
+                             uart->registers.sample_count);
+               mmio_write_32(UART_SAMPLE_POINT(base),
+                             uart->registers.sample_point);
+               mmio_write_32(UART_GUARD(base), uart->registers.guard);
+
+               /* flow control */
+               mmio_write_32(UART_ESCAPE_EN(base), uart->registers.escape_en);
+               mmio_write_32(UART_MCR(base), uart->registers.mcr);
+               mmio_write_32(UART_IER(base), uart->registers.ier);
+               mmio_write_32(UART_SCR(base), uart->registers.scr);
+       }
+}
+
+void mt_uart_save(void)
+{
+       int uart_idx = UART_PORT0;
+       struct mt_uart *uart;
+       unsigned long base;
+
+       for (uart_idx = UART_PORT0; uart_idx < HW_SUPPORT_UART_PORTS;
+            uart_idx++) {
+
+               uart_save_addr[uart_idx].base = uart_base_addr[uart_idx];
+               base = uart_base_addr[uart_idx];
+               uart = &uart_save_addr[uart_idx];
+               uart->registers.lcr = mmio_read_32(UART_LCR(base));
+
+               mmio_write_32(UART_LCR(base), UART_LCR_MODE_B);
+               uart->registers.efr = mmio_read_32(UART_EFR(base));
+               mmio_write_32(UART_LCR(base), uart->registers.lcr);
+               uart->registers.fcr = mmio_read_32(UART_FCR_RD(base));
+
+               /* baudrate */
+               uart->registers.highspeed = mmio_read_32(UART_HIGHSPEED(base));
+               uart->registers.fracdiv_l = mmio_read_32(UART_FRACDIV_L(base));
+               uart->registers.fracdiv_m = mmio_read_32(UART_FRACDIV_M(base));
+               mmio_write_32(UART_LCR(base),
+                             uart->registers.lcr | UART_LCR_DLAB);
+               uart->registers.dll = mmio_read_32(UART_DLL(base));
+               uart->registers.dlh = mmio_read_32(UART_DLH(base));
+               mmio_write_32(UART_LCR(base), uart->registers.lcr);
+               uart->registers.sample_count = mmio_read_32(
+                                               UART_SAMPLE_COUNT(base));
+               uart->registers.sample_point = mmio_read_32(
+                                               UART_SAMPLE_POINT(base));
+               uart->registers.guard = mmio_read_32(UART_GUARD(base));
+
+               /* flow control */
+               uart->registers.escape_en = mmio_read_32(UART_ESCAPE_EN(base));
+               uart->registers.mcr = mmio_read_32(UART_MCR(base));
+               uart->registers.ier = mmio_read_32(UART_IER(base));
+               uart->registers.scr = mmio_read_32(UART_SCR(base));
+       }
+}
+
+void mt_console_uart_cg(int on)
+{
+       if (on == 1) {
+               mmio_write_32(UART_CLOCK_GATE_CLR, UART0_CLOCK_GATE_BIT);
+       } else {
+               mmio_write_32(UART_CLOCK_GATE_SET, UART0_CLOCK_GATE_BIT);
+       }
+}
+
+uint32_t mt_console_uart_cg_status(void)
+{
+       return mmio_read_32(UART_CLOCK_GATE_STA) & UART0_CLOCK_GATE_BIT;
+}
diff --git a/plat/mediatek/mt8183/drivers/uart/uart.c b/plat/mediatek/mt8183/drivers/uart/uart.c
deleted file mode 100644 (file)
index 3c6a980..0000000
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Copyright (c) 2019, ARM Limited and Contributors. All rights reserved.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-#include <lib/mmio.h>
-#include <uart.h>
-
-static struct mt_uart uart_save_addr[DRV_SUPPORT_UART_PORTS];
-
-static const unsigned int uart_base_addr[DRV_SUPPORT_UART_PORTS] = {
-       UART0_BASE,
-       UART1_BASE
-};
-
-void mt_uart_restore(void)
-{
-       int uart_idx = UART_PORT0;
-       struct mt_uart *uart;
-       unsigned long base;
-
-       /* Must NOT print any debug log before UART restore */
-       for (uart_idx = UART_PORT0; uart_idx < HW_SUPPORT_UART_PORTS;
-            uart_idx++) {
-
-               uart = &uart_save_addr[uart_idx];
-               base = uart->base;
-
-               mmio_write_32(UART_LCR(base), UART_LCR_MODE_B);
-               mmio_write_32(UART_EFR(base), uart->registers.efr);
-               mmio_write_32(UART_LCR(base), uart->registers.lcr);
-               mmio_write_32(UART_FCR(base), uart->registers.fcr);
-
-               /* baudrate */
-               mmio_write_32(UART_HIGHSPEED(base), uart->registers.highspeed);
-               mmio_write_32(UART_FRACDIV_L(base), uart->registers.fracdiv_l);
-               mmio_write_32(UART_FRACDIV_M(base), uart->registers.fracdiv_m);
-               mmio_write_32(UART_LCR(base),
-                             uart->registers.lcr | UART_LCR_DLAB);
-               mmio_write_32(UART_DLL(base), uart->registers.dll);
-               mmio_write_32(UART_DLH(base), uart->registers.dlh);
-               mmio_write_32(UART_LCR(base), uart->registers.lcr);
-               mmio_write_32(UART_SAMPLE_COUNT(base),
-                             uart->registers.sample_count);
-               mmio_write_32(UART_SAMPLE_POINT(base),
-                             uart->registers.sample_point);
-               mmio_write_32(UART_GUARD(base), uart->registers.guard);
-
-               /* flow control */
-               mmio_write_32(UART_ESCAPE_EN(base), uart->registers.escape_en);
-               mmio_write_32(UART_MCR(base), uart->registers.mcr);
-               mmio_write_32(UART_IER(base), uart->registers.ier);
-               mmio_write_32(UART_SCR(base), uart->registers.scr);
-       }
-}
-
-void mt_uart_save(void)
-{
-       int uart_idx = UART_PORT0;
-       struct mt_uart *uart;
-       unsigned long base;
-
-       for (uart_idx = UART_PORT0; uart_idx < HW_SUPPORT_UART_PORTS;
-            uart_idx++) {
-
-               uart_save_addr[uart_idx].base = uart_base_addr[uart_idx];
-               base = uart_base_addr[uart_idx];
-               uart = &uart_save_addr[uart_idx];
-               uart->registers.lcr = mmio_read_32(UART_LCR(base));
-
-               mmio_write_32(UART_LCR(base), UART_LCR_MODE_B);
-               uart->registers.efr = mmio_read_32(UART_EFR(base));
-               mmio_write_32(UART_LCR(base), uart->registers.lcr);
-               uart->registers.fcr = mmio_read_32(UART_FCR_RD(base));
-
-               /* baudrate */
-               uart->registers.highspeed = mmio_read_32(UART_HIGHSPEED(base));
-               uart->registers.fracdiv_l = mmio_read_32(UART_FRACDIV_L(base));
-               uart->registers.fracdiv_m = mmio_read_32(UART_FRACDIV_M(base));
-               mmio_write_32(UART_LCR(base),
-                             uart->registers.lcr | UART_LCR_DLAB);
-               uart->registers.dll = mmio_read_32(UART_DLL(base));
-               uart->registers.dlh = mmio_read_32(UART_DLH(base));
-               mmio_write_32(UART_LCR(base), uart->registers.lcr);
-               uart->registers.sample_count = mmio_read_32(
-                                               UART_SAMPLE_COUNT(base));
-               uart->registers.sample_point = mmio_read_32(
-                                               UART_SAMPLE_POINT(base));
-               uart->registers.guard = mmio_read_32(UART_GUARD(base));
-
-               /* flow control */
-               uart->registers.escape_en = mmio_read_32(UART_ESCAPE_EN(base));
-               uart->registers.mcr = mmio_read_32(UART_MCR(base));
-               uart->registers.ier = mmio_read_32(UART_IER(base));
-               uart->registers.scr = mmio_read_32(UART_SCR(base));
-       }
-}
-
-void mt_console_uart_cg(int on)
-{
-       if (on)
-               mmio_write_32(UART_CLOCK_GATE_CLR, UART0_CLOCK_GATE_BIT);
-       else
-               mmio_write_32(UART_CLOCK_GATE_SET, UART0_CLOCK_GATE_BIT);
-}
-
-int mt_console_uart_cg_status(void)
-{
-       return mmio_read_32(UART_CLOCK_GATE_STA) & UART0_CLOCK_GATE_BIT;
-}
index be04c35091e07a081c61a9563baa8594d9241626..062ce3adc33a49e94cb0fa06f8beed81626a5aed 100644 (file)
@@ -95,6 +95,6 @@ struct mt_uart {
 void mt_uart_save(void);
 void mt_uart_restore(void);
 void mt_console_uart_cg(int on);
-int mt_console_uart_cg_status(void);
+uint32_t mt_console_uart_cg_status(void);
 
 #endif /* __UART_H__ */
index f290a4e6d81d7d7ac2ae1c5c0b9cdfe13b2a8f68..07da1afac3954d37ae6facdb70ffa1f6f6b6a75f 100644 (file)
@@ -45,6 +45,7 @@ BL31_SOURCES    += common/desc_image_load.c                              \
                    ${MTK_PLAT}/common/mtk_plat_common.c                  \
                    ${MTK_PLAT}/common/drivers/pmic_wrap/pmic_wrap_init.c \
                    ${MTK_PLAT}/common/drivers/rtc/rtc_common.c           \
+                   ${MTK_PLAT}/common/drivers/uart/uart.c                \
                    ${MTK_PLAT}/common/params_setup.c                     \
                    ${MTK_PLAT_SOC}/aarch64/plat_helpers.S                \
                    ${MTK_PLAT_SOC}/aarch64/platform_common.c             \
@@ -58,7 +59,6 @@ BL31_SOURCES    += common/desc_image_load.c                              \
                    ${MTK_PLAT_SOC}/drivers/spm/spm_pmic_wrap.c           \
                    ${MTK_PLAT_SOC}/drivers/spm/spm_suspend.c             \
                    ${MTK_PLAT_SOC}/drivers/gpio/mtgpio.c                 \
-                   ${MTK_PLAT_SOC}/drivers/uart/uart.c                   \
                    ${MTK_PLAT_SOC}/drivers/timer/mt_timer.c              \
                    ${MTK_PLAT_SOC}/drivers/emi_mpu/emi_mpu.c             \
                    ${MTK_PLAT_SOC}/plat_pm.c                             \
diff --git a/plat/mediatek/mt8192/drivers/uart/uart.h b/plat/mediatek/mt8192/drivers/uart/uart.h
new file mode 100644 (file)
index 0000000..ac8b94d
--- /dev/null
@@ -0,0 +1,100 @@
+/*
+ * Copyright (c) 2020, MediaTek Inc. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef UART_H
+#define UART_H
+
+#include <platform_def.h>
+
+/* UART HW information */
+#define HW_SUPPORT_UART_PORTS  2
+#define DRV_SUPPORT_UART_PORTS 2
+
+/* console UART clock cg */
+#define UART_CLOCK_GATE_SET            (INFRACFG_AO_BASE + 0x80)
+#define UART_CLOCK_GATE_CLR            (INFRACFG_AO_BASE + 0x84)
+#define UART_CLOCK_GATE_STA            (INFRACFG_AO_BASE + 0x90)
+#define UART0_CLOCK_GATE_BIT           (1U<<22)
+#define UART1_CLOCK_GATE_BIT           (1U<<23)
+
+/* UART registers */
+#define UART_RBR(_baseaddr)                    (_baseaddr + 0x0)
+#define UART_THR(_baseaddr)                    (_baseaddr + 0x0)
+#define UART_IER(_baseaddr)                    (_baseaddr + 0x4)
+#define UART_IIR(_baseaddr)                    (_baseaddr + 0x8)
+#define UART_FCR(_baseaddr)                    (_baseaddr + 0x8)
+#define UART_LCR(_baseaddr)                    (_baseaddr + 0xc)
+#define UART_MCR(_baseaddr)                    (_baseaddr + 0x10)
+#define UART_LSR(_baseaddr)                    (_baseaddr + 0x14)
+#define UART_MSR(_baseaddr)                    (_baseaddr + 0x18)
+#define UART_SCR(_baseaddr)                    (_baseaddr + 0x1c)
+#define UART_DLL(_baseaddr)                    (_baseaddr + 0x0)
+#define UART_DLH(_baseaddr)                    (_baseaddr + 0x4)
+#define UART_EFR(_baseaddr)                    (_baseaddr + 0x8)
+#define UART_XON1(_baseaddr)                   (_baseaddr + 0x10)
+#define UART_XON2(_baseaddr)                   (_baseaddr + 0x14)
+#define UART_XOFF1(_baseaddr)                  (_baseaddr + 0x18)
+#define UART_XOFF2(_baseaddr)                  (_baseaddr + 0x1c)
+#define UART_AUTOBAUD(_baseaddr)               (_baseaddr + 0x20)
+#define UART_HIGHSPEED(_baseaddr)              (_baseaddr + 0x24)
+#define UART_SAMPLE_COUNT(_baseaddr)           (_baseaddr + 0x28)
+#define UART_SAMPLE_POINT(_baseaddr)           (_baseaddr + 0x2c)
+#define UART_AUTOBAUD_REG(_baseaddr)           (_baseaddr + 0x30)
+#define UART_RATE_FIX_REG(_baseaddr)           (_baseaddr + 0x34)
+#define UART_AUTO_BAUDSAMPLE(_baseaddr)                (_baseaddr + 0x38)
+#define UART_GUARD(_baseaddr)                  (_baseaddr + 0x3c)
+#define UART_ESCAPE_DAT(_baseaddr)             (_baseaddr + 0x40)
+#define UART_ESCAPE_EN(_baseaddr)              (_baseaddr + 0x44)
+#define UART_SLEEP_EN(_baseaddr)               (_baseaddr + 0x48)
+#define UART_DMA_EN(_baseaddr)                 (_baseaddr + 0x4c)
+#define UART_RXTRI_AD(_baseaddr)               (_baseaddr + 0x50)
+#define UART_FRACDIV_L(_baseaddr)              (_baseaddr + 0x54)
+#define UART_FRACDIV_M(_baseaddr)              (_baseaddr + 0x58)
+#define UART_FCR_RD(_baseaddr)                 (_baseaddr + 0x5C)
+#define UART_USB_RX_SEL(_baseaddr)             (_baseaddr + 0xB0)
+#define UART_SLEEP_REQ(_baseaddr)              (_baseaddr + 0xB4)
+#define UART_SLEEP_ACK(_baseaddr)              (_baseaddr + 0xB8)
+#define UART_SPM_SEL(_baseaddr)                        (_baseaddr + 0xBC)
+#define UART_LCR_DLAB                          0x0080
+#define UART_LCR_MODE_B                                0x00bf
+
+enum uart_port_ID {
+       UART_PORT0 = 0,
+       UART_PORT1
+};
+
+struct mt_uart_register {
+       uint32_t dll;
+       uint32_t dlh;
+       uint32_t ier;
+       uint32_t lcr;
+       uint32_t mcr;
+       uint32_t fcr;
+       uint32_t lsr;
+       uint32_t scr;
+       uint32_t efr;
+       uint32_t highspeed;
+       uint32_t sample_count;
+       uint32_t sample_point;
+       uint32_t fracdiv_l;
+       uint32_t fracdiv_m;
+       uint32_t escape_en;
+       uint32_t guard;
+       uint32_t rx_sel;
+};
+
+struct mt_uart {
+       unsigned long base;
+       struct mt_uart_register registers;
+};
+
+/* external API */
+void mt_uart_save(void);
+void mt_uart_restore(void);
+void mt_console_uart_cg(int on);
+uint32_t mt_console_uart_cg_status(void);
+
+#endif /* __UART_H__ */
index a3ab1a0ca0d4dfae2dcad2eb60168eae3735d948..51cf36136701748aa712f19cce9652044d302986 100644 (file)
@@ -26,6 +26,7 @@
 #define MTK_MCDI_SRAM_BASE      0x11B000
 #define MTK_MCDI_SRAM_MAP_SIZE  0x1000
 
+#define INFRACFG_AO_BASE (IO_PHYS + 0x00001000)
 #define GPIO_BASE        (IO_PHYS + 0x00005000)
 #define SPM_BASE         (IO_PHYS + 0x00006000)
 #define PMIC_WRAP_BASE   (IO_PHYS + 0x00026000)
index 01851effc2c6e5d896dedae3786536bc09fcc727..3e23e05cd739ad1f77482d03b21cc20e44a1d59e 100644 (file)
@@ -14,7 +14,8 @@ PLAT_INCLUDES := -I${MTK_PLAT}/common/                            \
                  -I${MTK_PLAT_SOC}/drivers/mcdi/                  \
                  -I${MTK_PLAT_SOC}/drivers/pmic/                  \
                  -I${MTK_PLAT_SOC}/drivers/spmc/                  \
-                 -I${MTK_PLAT_SOC}/drivers/timer/
+                 -I${MTK_PLAT_SOC}/drivers/timer/                 \
+                 -I${MTK_PLAT_SOC}/drivers/uart/
 
 GICV3_SUPPORT_GIC600        :=      1
 include drivers/arm/gic/v3/gicv3.mk
@@ -35,6 +36,7 @@ BL31_SOURCES    += common/desc_image_load.c                              \
                    lib/cpus/aarch64/cortex_a76.S                         \
                    plat/common/plat_gicv3.c                              \
                    ${MTK_PLAT}/common/drivers/pmic_wrap/pmic_wrap_init_v2.c \
+                   ${MTK_PLAT}/common/drivers/uart/uart.c                \
                    ${MTK_PLAT}/common/mtk_plat_common.c                  \
                    ${MTK_PLAT}/common/params_setup.c                     \
                    ${MTK_PLAT_SOC}/aarch64/platform_common.c             \