Re: [PATCH] serial: qcom: add support for GENI serial driver.
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.
>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