From: Ard Biesheuvel <ard.biesheuvel@linaro.org>
To: edk2-devel@lists.01.org, leif.lindholm@linaro.org,
daniel.thompson@linaro.org
Cc: masami.hiramatsu@linaro.org, methavanitpong.pipat@socionext.com,
masahisa.kojima@linaro.org,
Ard Biesheuvel <ard.biesheuvel@linaro.org>
Subject: [PATCH edk2-platforms v4 28/34] Silicon/SynQuacer: implement PEIM that exposes GPIO PPI
Date: Fri, 10 Nov 2017 14:21:21 +0000 [thread overview]
Message-ID: <20171110142127.12018-29-ard.biesheuvel@linaro.org> (raw)
In-Reply-To: <20171110142127.12018-1-ard.biesheuvel@linaro.org>
In order to be able to sample the state of the DIP switches at early
boot on the Developer Box platform, implement the GPIO PPI based on
the GPIO block that is implemented in the SynQuacer SoC.
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
---
Silicon/Socionext/SynQuacer/Drivers/SynQuacerGpioPei/SynQuacerGpioPei.c | 203 ++++++++++++++++++++
Silicon/Socionext/SynQuacer/Drivers/SynQuacerGpioPei/SynQuacerGpioPei.inf | 47 +++++
2 files changed, 250 insertions(+)
diff --git a/Silicon/Socionext/SynQuacer/Drivers/SynQuacerGpioPei/SynQuacerGpioPei.c b/Silicon/Socionext/SynQuacer/Drivers/SynQuacerGpioPei/SynQuacerGpioPei.c
new file mode 100644
index 000000000000..24d08b4e5899
--- /dev/null
+++ b/Silicon/Socionext/SynQuacer/Drivers/SynQuacerGpioPei/SynQuacerGpioPei.c
@@ -0,0 +1,203 @@
+/** @file
+
+ Copyright (c) 2017, Linaro, Ltd. All rights reserved.<BR>
+
+ This program and the accompanying materials
+ are licensed and made available under the terms and conditions of the BSD License
+ which accompanies this distribution. The full text of the license may be found at
+ http://opensource.org/licenses/bsd-license.php
+
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#include <PiPei.h>
+#include <Library/IoLib.h>
+#include <Library/PeiServicesLib.h>
+#include <Platform/MemoryMap.h>
+#include <Ppi/EmbeddedGpio.h>
+
+#define PDR(x) (SYNQUACER_GPIO_BASE + 4 * (GPIO_PIN (x) >> 3))
+#define DDR(x) (SYNQUACER_GPIO_BASE + 0x10 + 4 * (GPIO_PIN (x) >> 3))
+#define PFR(x) (SYNQUACER_GPIO_BASE + 0x20 + 4 * (GPIO_PIN (x) >> 3))
+
+#define GPIO_BIT(x) (1U << (GPIO_PIN (x) % 8))
+
+STATIC CONST UINTN mGpioPinCount = 32;
+
+/**
+
+ Gets the state of a GPIO pin
+
+ @param This Pointer to protocol
+ @param Gpio Which pin to read
+ @param Value State of the pin
+
+ @retval EFI_SUCCESS GPIO state returned in Value
+ @retval EFI_INVALID_PARAMETER Value is NULL
+ @retval EFI_NOT_FOUND Pin does not exit
+
+**/
+STATIC
+EFI_STATUS
+EFIAPI
+GpioGet (
+ IN EMBEDDED_GPIO_PPI *This,
+ IN EMBEDDED_GPIO_PIN Gpio,
+ OUT UINTN *Value
+ )
+{
+ if (Value == NULL) {
+ return EFI_INVALID_PARAMETER;
+ }
+ if (GPIO_PORT (Gpio) > 0 || GPIO_PIN (Gpio) >= mGpioPinCount) {
+ return EFI_NOT_FOUND;
+ }
+
+ *Value = ((MmioRead32 (PDR (GPIO_PIN (Gpio))) & GPIO_BIT (Gpio)) != 0);
+
+ return EFI_SUCCESS;
+}
+
+/**
+
+ Sets the state of a GPIO pin
+
+ @param This Pointer to protocol
+ @param Gpio Which pin to modify
+ @param Mode Mode to set
+
+ @retval EFI_SUCCESS GPIO set as requested
+ @retval EFI_INVALID_PARAMETER Invalid mode
+ @retval EFI_NOT_FOUND Pin does not exit
+
+**/
+STATIC
+EFI_STATUS
+EFIAPI
+GpioSet (
+ IN EMBEDDED_GPIO_PPI *This,
+ IN EMBEDDED_GPIO_PIN Gpio,
+ IN EMBEDDED_GPIO_MODE Mode
+ )
+{
+ if (GPIO_PORT (Gpio) > 0 || GPIO_PIN (Gpio) >= mGpioPinCount) {
+ return EFI_NOT_FOUND;
+ }
+
+ switch (Mode) {
+ case GPIO_MODE_INPUT:
+ MmioAnd32 (DDR (GPIO_PIN (Gpio)), ~GPIO_BIT (Gpio));
+ break;
+
+ case GPIO_MODE_OUTPUT_0:
+ MmioOr32 (DDR (GPIO_PIN (Gpio)), GPIO_BIT (Gpio));
+ MmioAnd32 (PDR (GPIO_PIN (Gpio)), ~GPIO_BIT (Gpio));
+ break;
+
+ case GPIO_MODE_OUTPUT_1:
+ MmioOr32 (DDR (GPIO_PIN (Gpio)), GPIO_BIT (Gpio));
+ MmioOr32 (PDR (GPIO_PIN (Gpio)), GPIO_BIT (Gpio));
+ break;
+
+ default:
+ return EFI_INVALID_PARAMETER;
+ }
+ return EFI_SUCCESS;
+}
+
+
+/**
+
+ Gets the mode (function) of a GPIO pin
+
+ @param This Pointer to protocol
+ @param Gpio Which pin
+ @param Mode Pointer to output mode value
+
+ @retval EFI_SUCCESS Mode value retrieved
+ @retval EFI_INVALID_PARAMETER Mode is NULL
+ @retval EFI_NOT_FOUND Pin does not exit
+
+**/
+STATIC
+EFI_STATUS
+EFIAPI
+GpioGetMode (
+ IN EMBEDDED_GPIO_PPI *This,
+ IN EMBEDDED_GPIO_PIN Gpio,
+ OUT EMBEDDED_GPIO_MODE *Mode
+ )
+{
+ if (Mode == NULL) {
+ return EFI_INVALID_PARAMETER;
+ }
+ if (GPIO_PORT (Gpio) > 0 || GPIO_PIN (Gpio) >= mGpioPinCount) {
+ return EFI_NOT_FOUND;
+ }
+
+ if (!(MmioRead32 (DDR (GPIO_PIN (Gpio))) & GPIO_BIT (Gpio))) {
+ *Mode = GPIO_MODE_INPUT;
+ } else if (!(MmioRead32 (PDR (GPIO_PIN (Gpio))) & GPIO_BIT (Gpio))) {
+ *Mode = GPIO_MODE_OUTPUT_0;
+ } else {
+ *Mode = GPIO_MODE_OUTPUT_1;
+ }
+ return EFI_SUCCESS;
+}
+
+
+/**
+
+ Sets the pull-up / pull-down resistor of a GPIO pin
+
+ @param This Pointer to PPI
+ @param Gpio Port/pin index
+ @param Pull The pullup/pulldown mode to set
+
+ @retval EFI_SUCCESS Mode was set
+ @retval EFI_NOT_FOUND Pin does not exist
+ @retval EFI_UNSUPPORTED Action not supported
+
+**/
+STATIC
+EFI_STATUS
+EFIAPI
+GpioSetPull (
+ IN EMBEDDED_GPIO_PPI *This,
+ IN EMBEDDED_GPIO_PIN Gpio,
+ IN EMBEDDED_GPIO_PULL Pull
+ )
+{
+ if (Pull != GPIO_PULL_NONE) {
+ return EFI_UNSUPPORTED;
+ }
+ if (GPIO_PORT (Gpio) > 0 || GPIO_PIN (Gpio) >= mGpioPinCount) {
+ return EFI_NOT_FOUND;
+ }
+ return EFI_SUCCESS;
+}
+
+STATIC EMBEDDED_GPIO_PPI mGpioPpi = {
+ GpioGet,
+ GpioSet,
+ GpioGetMode,
+ GpioSetPull,
+};
+
+STATIC CONST EFI_PEI_PPI_DESCRIPTOR mEmbeddedGpioPpiDescriptor = {
+ EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST,
+ &gEdkiiEmbeddedGpioPpiGuid,
+ &mGpioPpi
+};
+
+EFI_STATUS
+EFIAPI
+SynQuacerGpioPeiEntryPoint (
+ IN EFI_PEI_FILE_HANDLE FfsHeader,
+ IN CONST EFI_PEI_SERVICES **PeiServices
+ )
+{
+ return PeiServicesInstallPpi (&mEmbeddedGpioPpiDescriptor);
+}
diff --git a/Silicon/Socionext/SynQuacer/Drivers/SynQuacerGpioPei/SynQuacerGpioPei.inf b/Silicon/Socionext/SynQuacer/Drivers/SynQuacerGpioPei/SynQuacerGpioPei.inf
new file mode 100644
index 000000000000..dbb5e9d4c53a
--- /dev/null
+++ b/Silicon/Socionext/SynQuacer/Drivers/SynQuacerGpioPei/SynQuacerGpioPei.inf
@@ -0,0 +1,47 @@
+#/* @file
+#
+# Copyright (c) 2017, Linaro, Ltd. All rights reserved.<BR>
+#
+# This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution. The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+#*/
+
+[Defines]
+ INF_VERSION = 0x0001001A
+ BASE_NAME = SynQuacerGpioPei
+ FILE_GUID = 55a981a5-f371-4ba3-93a5-37fa0ca95089
+ MODULE_TYPE = PEIM
+ VERSION_STRING = 1.0
+ ENTRY_POINT = SynQuacerGpioPeiEntryPoint
+
+#
+# The following information is for reference only and not required by the build tools.
+#
+# VALID_ARCHITECTURES = AARCH64
+#
+#
+
+[Sources]
+ SynQuacerGpioPei.c
+
+[Packages]
+ EmbeddedPkg/EmbeddedPkg.dec
+ MdePkg/MdePkg.dec
+ Silicon/Socionext/SynQuacer/SynQuacer.dec
+
+[LibraryClasses]
+ IoLib
+ PeimEntryPoint
+ PeiServicesLib
+
+[Ppis]
+ gEdkiiEmbeddedGpioPpiGuid ## PRODUCES
+
+[Depex]
+ TRUE
--
2.11.0
next prev parent reply other threads:[~2017-11-10 14:18 UTC|newest]
Thread overview: 53+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-11-10 14:20 [PATCH edk2-platforms v4 00/34] add support for Socionext SynQuacer Ard Biesheuvel
2017-11-10 14:20 ` [PATCH edk2-platforms v4 01/34] Silicon/SynQuacer: add package with platform headers Ard Biesheuvel
2017-11-10 14:20 ` [PATCH edk2-platforms v4 02/34] Silicon/Socionext: add driver for NETSEC network controller Ard Biesheuvel
2017-11-10 14:20 ` [PATCH edk2-platforms v4 03/34] Silicon/Socionext: add PlatformPeilib implementation for SynQuacer Ard Biesheuvel
2017-11-10 14:20 ` [PATCH edk2-platforms v4 04/34] Silicon/SynQuacer: implement a platform DXE driver Ard Biesheuvel
2017-11-10 14:20 ` [PATCH edk2-platforms v4 05/34] Silicon/SynQuacer: add MemoryInitPeiLib implementation Ard Biesheuvel
2017-11-10 14:20 ` [PATCH edk2-platforms v4 06/34] Platform: add support for Socionext SynQuacer eval board Ard Biesheuvel
2017-11-10 14:21 ` [PATCH edk2-platforms v4 07/34] Silicon/SynQuacer: implement PciSegmentLib to support dual RCs Ard Biesheuvel
2017-11-10 14:21 ` [PATCH edk2-platforms v4 08/34] Silicon/SynQuacer: implement PciHostBridgeLib support Ard Biesheuvel
2017-11-10 14:21 ` [PATCH edk2-platforms v4 09/34] Silicon/SynQuacer: implement EFI_CPU_IO2_PROTOCOL Ard Biesheuvel
2017-11-10 14:21 ` [PATCH edk2-platforms v4 10/34] Platform/SynQuacerEvalBoard: add PCI support Ard Biesheuvel
2017-11-10 14:21 ` [PATCH edk2-platforms v4 11/34] Platform/SynQuacerEvalBoard: add NETSEC driver Ard Biesheuvel
2017-11-10 14:21 ` [PATCH edk2-platforms v4 12/34] Silicon/SynQuacer: add device tree support for eval board Ard Biesheuvel
2017-11-10 14:21 ` [PATCH edk2-platforms v4 13/34] Silicon/SynQuacer: add NorFlashPlatformLib implementation Ard Biesheuvel
2017-11-10 14:21 ` [PATCH edk2-platforms v4 14/34] Silicon/Socionext: add driver for SPI NOR flash Ard Biesheuvel
2017-11-17 15:08 ` Leif Lindholm
2017-11-10 14:21 ` [PATCH edk2-platforms v4 15/34] Platform/SynQuacer: incorporate NOR flash and variable drivers Ard Biesheuvel
2017-11-10 14:21 ` [PATCH edk2-platforms v4 16/34] Silicon/SynQuacer: implement PlatformFlashAccessLib Ard Biesheuvel
2017-11-10 14:21 ` [PATCH edk2-platforms v4 17/34] SynQuacer/SynQuacerMemoryInitPeiLib: add capsule support Ard Biesheuvel
2017-11-10 14:21 ` [PATCH edk2-platforms v4 18/34] Socionext/SynQuacerEvalBoard: wire up basic " Ard Biesheuvel
2017-11-10 14:21 ` [PATCH edk2-platforms v4 19/34] Socionext/SynQuacerEvalBoard: switch to execute in place Ard Biesheuvel
2017-11-10 14:21 ` [PATCH edk2-platforms v4 20/34] Platform/SynQuacerEvalBoard: add signed capsule update support Ard Biesheuvel
2017-11-10 14:21 ` [PATCH edk2-platforms v4 21/34] Silicon/SynQuacerPciHostBridgeLib: add workaround to support 32-bit only cards Ard Biesheuvel
2017-11-10 14:21 ` [PATCH edk2-platforms v4 22/34] Platform/Socionext: add support for Socionext Developer Box rev 0.1 Ard Biesheuvel
2017-11-10 14:21 ` [PATCH edk2-platforms v4 23/34] Platform/DeveloperBox: add ConsolePrefDxe driver Ard Biesheuvel
2017-11-10 14:21 ` [PATCH edk2-platforms v4 24/34] Silicon/SynQuacer: add description of GPIO block to device tree Ard Biesheuvel
2017-11-10 14:21 ` [PATCH edk2-platforms v4 25/34] Silicon/SynQuacer: add description of EXIU to the " Ard Biesheuvel
2017-11-10 14:21 ` [PATCH edk2-platforms v4 26/34] Silicon/SynQuacer: add DT description of the SDHCI controller Ard Biesheuvel
2017-11-17 15:16 ` Leif Lindholm
2017-11-17 15:18 ` Ard Biesheuvel
2017-11-10 14:21 ` [PATCH edk2-platforms v4 27/34] Silicon/SynQuacerMemoryInitPeiLib: ignore capsules when clearing NVRAM Ard Biesheuvel
2017-11-17 15:23 ` Leif Lindholm
2017-11-10 14:21 ` Ard Biesheuvel [this message]
2017-11-17 15:46 ` [PATCH edk2-platforms v4 28/34] Silicon/SynQuacer: implement PEIM that exposes GPIO PPI Leif Lindholm
2017-11-10 14:21 ` [PATCH edk2-platforms v4 29/34] Silicon/SynQuacer: implement 'clear NVRAM' feature using a DIP switch Ard Biesheuvel
2017-11-17 15:51 ` Leif Lindholm
2017-11-17 15:53 ` Ard Biesheuvel
2017-11-17 16:10 ` Leif Lindholm
2017-11-17 17:42 ` Ard Biesheuvel
2017-11-23 12:51 ` Leif Lindholm
2017-11-10 14:21 ` [PATCH edk2-platforms v4 30/34] Silicon/NXP: add RTC support library for PCF8563 I2C IP Ard Biesheuvel
2017-11-17 16:39 ` Leif Lindholm
2017-11-17 16:49 ` Ard Biesheuvel
2017-11-10 14:21 ` [PATCH edk2-platforms v4 31/34] Silicon/Socionext: implement I2C master protocol for SynQuacer I2C Ard Biesheuvel
2017-11-17 17:05 ` Leif Lindholm
2017-11-10 14:21 ` [PATCH edk2-platforms v4 32/34] Platform/DeveloperBox: wire up RTC support Ard Biesheuvel
2017-11-10 14:21 ` [PATCH edk2-platforms v4 33/34] Platform/DeveloperBox: add description of power button to DT Ard Biesheuvel
2017-11-17 17:06 ` Leif Lindholm
2017-11-10 14:21 ` [PATCH edk2-platforms v4 34/34] Platform/SynQuacerEvalBoard: add eMMC driver stack Ard Biesheuvel
2017-11-17 17:18 ` Leif Lindholm
2017-11-17 17:25 ` Ard Biesheuvel
2017-11-17 17:33 ` Leif Lindholm
2017-11-17 17:35 ` Ard Biesheuvel
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20171110142127.12018-29-ard.biesheuvel@linaro.org \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox