ArmPlatformPkg: Support different PL011 reg offset
authorJun Nie <jun.nie@linaro.org>
Fri, 7 Jul 2017 09:18:45 +0000 (17:18 +0800)
committerLeif Lindholm <leif.lindholm@linaro.org>
Mon, 17 Jul 2017 16:27:27 +0000 (17:27 +0100)
ZTE/SanChip version pl011 has different reg offset and bit offset
for some registers.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Jun Nie <jun.nie@linaro.org>
Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>
ArmPlatformPkg/ArmPlatformPkg.dec
ArmPlatformPkg/Drivers/PL011Uart/PL011Uart.inf
ArmPlatformPkg/Include/Drivers/PL011Uart.h

index d756fd2..b8a6b13 100644 (file)
@@ -97,6 +97,7 @@
   gArmPlatformTokenSpaceGuid.PL011UartInteger|0|UINT32|0x00000020\r
   gArmPlatformTokenSpaceGuid.PL011UartFractional|0|UINT32|0x0000002D\r
   gArmPlatformTokenSpaceGuid.PL011UartInterrupt|0x00000000|UINT32|0x0000002F\r
+  gArmPlatformTokenSpaceGuid.PL011UartRegOffsetVariant|0|UINT8|0x0000003E\r
 \r
   ## PL011 Serial Debug UART\r
   gArmPlatformTokenSpaceGuid.PcdSerialDbgRegisterBase|0x00000000|UINT64|0x00000030\r
index 0154f3b..3fd4602 100644 (file)
@@ -39,3 +39,4 @@
 \r
   gArmPlatformTokenSpaceGuid.PL011UartInteger\r
   gArmPlatformTokenSpaceGuid.PL011UartFractional\r
+  gArmPlatformTokenSpaceGuid.PL011UartRegOffsetVariant\r
index d5e88e8..4957dbf 100644 (file)
 #include <Uefi.h>\r
 #include <Protocol/SerialIo.h>\r
 \r
+#define PL011_VARIANT_ZTE 1\r
+\r
 // PL011 Registers\r
+#if FixedPcdGet8 (PL011UartRegOffsetVariant) == PL011_VARIANT_ZTE\r
+#define UARTDR                    0x004\r
+#define UARTRSR                   0x010\r
+#define UARTECR                   0x010\r
+#define UARTFR                    0x014\r
+#define UARTIBRD                  0x024\r
+#define UARTFBRD                  0x028\r
+#define UARTLCR_H                 0x030\r
+#define UARTCR                    0x034\r
+#define UARTIFLS                  0x038\r
+#define UARTIMSC                  0x040\r
+#define UARTRIS                   0x044\r
+#define UARTMIS                   0x048\r
+#define UARTICR                   0x04c\r
+#define UARTDMACR                 0x050\r
+#else\r
 #define UARTDR                    0x000\r
 #define UARTRSR                   0x004\r
 #define UARTECR                   0x004\r
@@ -34,6 +52,7 @@
 #define UARTMIS                   0x040\r
 #define UARTICR                   0x044\r
 #define UARTDMACR                 0x048\r
+#endif\r
 \r
 #define UARTPID0                  0xFE0\r
 #define UARTPID1                  0xFE4\r
 #define UART_STATUS_ERROR_MASK    0x0F\r
 \r
 // Flag reg bits\r
+#if FixedPcdGet8 (PL011UartRegOffsetVariant) == PL011_VARIANT_ZTE\r
+#define PL011_UARTFR_RI           (1 << 0)  // Ring indicator\r
+#define PL011_UARTFR_TXFE         (1 << 7)  // Transmit FIFO empty\r
+#define PL011_UARTFR_RXFF         (1 << 6)  // Receive  FIFO full\r
+#define PL011_UARTFR_TXFF         (1 << 5)  // Transmit FIFO full\r
+#define PL011_UARTFR_RXFE         (1 << 4)  // Receive  FIFO empty\r
+#define PL011_UARTFR_BUSY         (1 << 8)  // UART busy\r
+#define PL011_UARTFR_DCD          (1 << 2)  // Data carrier detect\r
+#define PL011_UARTFR_DSR          (1 << 3)  // Data set ready\r
+#define PL011_UARTFR_CTS          (1 << 1)  // Clear to send\r
+#else\r
 #define PL011_UARTFR_RI           (1 << 8)  // Ring indicator\r
 #define PL011_UARTFR_TXFE         (1 << 7)  // Transmit FIFO empty\r
 #define PL011_UARTFR_RXFF         (1 << 6)  // Receive  FIFO full\r
@@ -56,6 +86,7 @@
 #define PL011_UARTFR_DCD          (1 << 2)  // Data carrier detect\r
 #define PL011_UARTFR_DSR          (1 << 1)  // Data set ready\r
 #define PL011_UARTFR_CTS          (1 << 0)  // Clear to send\r
+#endif\r
 \r
 // Flag reg bits - alternative names\r
 #define UART_TX_EMPTY_FLAG_MASK   PL011_UARTFR_TXFE\r