Re: [PATCH] serial: qcom: add support for GENI serial driver.

2021-09-05 Thread Ramon Fried
On Sat, Aug 28, 2021 at 1:05 PM Дмитрий Санковский  wrote:
>
> From 7e77653742d9b6767ad1967dda2556f802ee9d60 Mon Sep 17 00:00:00 2001
> From: Dzmitry Sankouski 
> Date: Fri, 27 Aug 2021 17:47:22 +0300
> Subject: [PATCH] serial: qcom: add support for GENI serial driver.
>
> Generic Interface (GENI) Serial Engine (SE) based uart
> can be found on newer qualcomm SOCs, starting from SDM845.
> Tested on Samsung SM-G9600(starqltechn)
> by chain-loading u-boot with stock bootloader.
>
> Signed-off-by: Dzmitry Sankouski 
> ---
>  MAINTAINERS   |   1 +
>  .../serial/msm-geni-serial.txt|   6 +
>  drivers/serial/Kconfig|  17 +
>  drivers/serial/Makefile   |   1 +
>  drivers/serial/serial_msm_geni.c  | 605 ++
>  5 files changed, 630 insertions(+)
>  create mode 100644 doc/device-tree-bindings/serial/msm-geni-serial.txt
>  create mode 100644 drivers/serial/serial_msm_geni.c
>
> diff --git a/MAINTAINERS b/MAINTAINERS
> index 776ff703b9..52ddc99cda 100644
> --- a/MAINTAINERS
> +++ b/MAINTAINERS
> @@ -390,6 +390,7 @@ F: drivers/gpio/msm_gpio.c
>  F: drivers/mmc/msm_sdhci.c
>  F: drivers/phy/msm8916-usbh-phy.c
>  F: drivers/serial/serial_msm.c
> +F: drivers/serial/serial_msm_geni.c
>  F: drivers/smem/msm_smem.c
>  F: drivers/usb/host/ehci-msm.c
>
> diff --git a/doc/device-tree-bindings/serial/msm-geni-serial.txt 
> b/doc/device-tree-bindings/serial/msm-geni-serial.txt
> new file mode 100644
> index 00..9eadc2561b
> --- /dev/null
> +++ b/doc/device-tree-bindings/serial/msm-geni-serial.txt
> @@ -0,0 +1,6 @@
> +Qualcomm GENI UART
> +
> +Required properties:
> +- compatible: must be "qcom,msm-geni-uart"
> +- reg: start address and size of the registers
> +- clock: interface clock (must accept baudrate as a frequency)
> diff --git a/drivers/serial/Kconfig b/drivers/serial/Kconfig
> index 93348c0929..b420a5720d 100644
> --- a/drivers/serial/Kconfig
> +++ b/drivers/serial/Kconfig
> @@ -278,6 +278,14 @@ config DEBUG_UART_S5P
>will need to provide parameters to make this work. The driver will
>be available until the real driver-model serial is running.
>
> +config DEBUG_UART_MSM_GENI
> + bool "Qualcomm snapdragon"
> + depends on ARCH_SNAPDRAGON
> + help
> +  Select this to enable a debug UART using the serial_msm driver. You
> +  will need to provide parameters to make this work. The driver will
> +  be available until the real driver-model serial is running.
> +
>  config DEBUG_UART_MESON
>   bool "Amlogic Meson"
>   depends on MESON_SERIAL
> @@ -783,6 +791,15 @@ config MSM_SERIAL
>for example APQ8016 and MSM8916.
>Single baudrate is supported in current implementation (115200).
>
> +config MSM_GENI_SERIAL
> + bool "Qualcomm on-chip GENI UART"
> + help
> +  Support UART based on Generic Interface (GENI) Serial Engine (SE), used on 
> Qualcomm Snapdragon SoCs.
> +  Should support all qualcomm SOCs with Qualcomm Universal Peripheral (QUP) 
> Wrapper cores,
> +  i.e. newer ones, starting from SDM845.
> +  Driver works in FIFO mode.
> +  Multiple baudrates supported.
> +
>  config OCTEON_SERIAL_BOOTCMD
>   bool "MIPS Octeon PCI remote bootcmd input"
>   depends on ARCH_OCTEON
> diff --git a/drivers/serial/Makefile b/drivers/serial/Makefile
> index 3cbea8156f..d44caf4ea2 100644
> --- a/drivers/serial/Makefile
> +++ b/drivers/serial/Makefile
> @@ -62,6 +62,7 @@ obj-$(CONFIG_PIC32_SERIAL) += serial_pic32.o
>  obj-$(CONFIG_BCM283X_MU_SERIAL) += serial_bcm283x_mu.o
>  obj-$(CONFIG_BCM283X_PL011_SERIAL) += serial_bcm283x_pl011.o
>  obj-$(CONFIG_MSM_SERIAL) += serial_msm.o
> +obj-$(CONFIG_MSM_GENI_SERIAL) += serial_msm_geni.o
>  obj-$(CONFIG_MVEBU_A3700_UART) += serial_mvebu_a3700.o
>  obj-$(CONFIG_MPC8XX_CONS) += serial_mpc8xx.o
>  obj-$(CONFIG_NULLDEV_SERIAL) += serial_nulldev.o
> diff --git a/drivers/serial/serial_msm_geni.c 
> b/drivers/serial/serial_msm_geni.c
> new file mode 100644
> index 00..f3c6c329d3
> --- /dev/null
> +++ b/drivers/serial/serial_msm_geni.c
> @@ -0,0 +1,605 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * Qualcomm GENI serial engine UART driver
> + *
> + * (C) Copyright 2021 Dzmitry Sankouski 
> + *
> + * Based on Linux driver.
> + */
> +
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +
> +#define UART_OVERSAMPLING (32)
> +#define STALE_TIMEOUT (160)
> +#define SE_UART_RX_STALE_CNT (0x294)
> +#define S_GENI_CMD_ABORT (BIT(1))
> +
&

[PATCH] serial: qcom: add support for GENI serial driver.

2021-08-28 Thread Дмитрий Санковский
>From 7e77653742d9b6767ad1967dda2556f802ee9d60 Mon Sep 17 00:00:00 2001
From: Dzmitry Sankouski 
Date: Fri, 27 Aug 2021 17:47:22 +0300
Subject: [PATCH] serial: qcom: add support for GENI serial driver.

Generic Interface (GENI) Serial Engine (SE) based uart
can be found on newer qualcomm SOCs, starting from SDM845.
Tested on Samsung SM-G9600(starqltechn)
by chain-loading u-boot with stock bootloader.

Signed-off-by: Dzmitry Sankouski 
---
 MAINTAINERS   |   1 +
 .../serial/msm-geni-serial.txt|   6 +
 drivers/serial/Kconfig|  17 +
 drivers/serial/Makefile   |   1 +
 drivers/serial/serial_msm_geni.c  | 605 ++
 5 files changed, 630 insertions(+)
 create mode 100644 doc/device-tree-bindings/serial/msm-geni-serial.txt
 create mode 100644 drivers/serial/serial_msm_geni.c

diff --git a/MAINTAINERS b/MAINTAINERS
index 776ff703b9..52ddc99cda 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -390,6 +390,7 @@ F: drivers/gpio/msm_gpio.c
 F: drivers/mmc/msm_sdhci.c
 F: drivers/phy/msm8916-usbh-phy.c
 F: drivers/serial/serial_msm.c
+F: drivers/serial/serial_msm_geni.c
 F: drivers/smem/msm_smem.c
 F: drivers/usb/host/ehci-msm.c

diff --git a/doc/device-tree-bindings/serial/msm-geni-serial.txt
b/doc/device-tree-bindings/serial/msm-geni-serial.txt
new file mode 100644
index 00..9eadc2561b
--- /dev/null
+++ b/doc/device-tree-bindings/serial/msm-geni-serial.txt
@@ -0,0 +1,6 @@
+Qualcomm GENI UART
+
+Required properties:
+- compatible: must be "qcom,msm-geni-uart"
+- reg: start address and size of the registers
+- clock: interface clock (must accept baudrate as a frequency)
diff --git a/drivers/serial/Kconfig b/drivers/serial/Kconfig
index 93348c0929..b420a5720d 100644
--- a/drivers/serial/Kconfig
+++ b/drivers/serial/Kconfig
@@ -278,6 +278,14 @@ config DEBUG_UART_S5P
   will need to provide parameters to make this work. The driver will
   be available until the real driver-model serial is running.

+config DEBUG_UART_MSM_GENI
+ bool "Qualcomm snapdragon"
+ depends on ARCH_SNAPDRAGON
+ help
+  Select this to enable a debug UART using the serial_msm driver. You
+  will need to provide parameters to make this work. The driver will
+  be available until the real driver-model serial is running.
+
 config DEBUG_UART_MESON
  bool "Amlogic Meson"
  depends on MESON_SERIAL
@@ -783,6 +791,15 @@ config MSM_SERIAL
   for example APQ8016 and MSM8916.
   Single baudrate is supported in current implementation (115200).

+config MSM_GENI_SERIAL
+ bool "Qualcomm on-chip GENI UART"
+ help
+  Support UART based on Generic Interface (GENI) Serial Engine (SE), used
on Qualcomm Snapdragon SoCs.
+  Should support all qualcomm SOCs with Qualcomm Universal Peripheral
(QUP) Wrapper cores,
+  i.e. newer ones, starting from SDM845.
+  Driver works in FIFO mode.
+  Multiple baudrates supported.
+
 config OCTEON_SERIAL_BOOTCMD
  bool "MIPS Octeon PCI remote bootcmd input"
  depends on ARCH_OCTEON
diff --git a/drivers/serial/Makefile b/drivers/serial/Makefile
index 3cbea8156f..d44caf4ea2 100644
--- a/drivers/serial/Makefile
+++ b/drivers/serial/Makefile
@@ -62,6 +62,7 @@ obj-$(CONFIG_PIC32_SERIAL) += serial_pic32.o
 obj-$(CONFIG_BCM283X_MU_SERIAL) += serial_bcm283x_mu.o
 obj-$(CONFIG_BCM283X_PL011_SERIAL) += serial_bcm283x_pl011.o
 obj-$(CONFIG_MSM_SERIAL) += serial_msm.o
+obj-$(CONFIG_MSM_GENI_SERIAL) += serial_msm_geni.o
 obj-$(CONFIG_MVEBU_A3700_UART) += serial_mvebu_a3700.o
 obj-$(CONFIG_MPC8XX_CONS) += serial_mpc8xx.o
 obj-$(CONFIG_NULLDEV_SERIAL) += serial_nulldev.o
diff --git a/drivers/serial/serial_msm_geni.c
b/drivers/serial/serial_msm_geni.c
new file mode 100644
index 00..f3c6c329d3
--- /dev/null
+++ b/drivers/serial/serial_msm_geni.c
@@ -0,0 +1,605 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Qualcomm GENI serial engine UART driver
+ *
+ * (C) Copyright 2021 Dzmitry Sankouski 
+ *
+ * Based on Linux driver.
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#define UART_OVERSAMPLING (32)
+#define STALE_TIMEOUT (160)
+#define SE_UART_RX_STALE_CNT (0x294)
+#define S_GENI_CMD_ABORT (BIT(1))
+
+#define SE_GENI_S_CMD_CTRL_REG (0x634)
+#define SE_GENI_M_CMD_CTRL_REG (0x604)
+
+/* GENI_M_CMD_CTRL_REG */
+#define M_GENI_CMD_CANCEL BIT(2)
+#define M_GENI_CMD_ABORT BIT(1)
+#define M_GENI_DISABLE BIT(0)
+
+/* GENI_S_CMD0 fields */
+#define S_OPCODE_MSK GENMASK(31, 27)
+#define S_OPCODE_SHFT 27
+#define S_PARAMS_MSK GENMASK(26, 0)
+
+/* GENI_STATUS fields */
+#define M_GENI_CMD_ACTIVE BIT(0)
+#define S_GENI_CMD_ACTIVE BIT(12)
+#define S_CMD_DONE_EN (BIT(0))
+#define M_CMD_DONE_EN (BIT(0))
+
+#define USEC_PER_SEC 100L
+
+#define SE_GENI_STATUS 0x40
+#define GENI_SER_M_CLK_CFG (0x48)
+#define GENI_SER_S_CLK_CFG (0x4C)
+#define SE_GENI_M_CMD0 0x600
+#define SE_GENI_M_IRQ_CLEAR