* [PATCH] Platform/ARM/SgiPkg: Add support for HDLCD
@ 2018-12-06 12:42 Vijayenthiran Subramaniam
2018-12-06 17:07 ` Ard Biesheuvel
0 siblings, 1 reply; 3+ messages in thread
From: Vijayenthiran Subramaniam @ 2018-12-06 12:42 UTC (permalink / raw)
To: edk2-devel, ard.biesheuvel, leif.lindholm
Cc: thomas.abraham, Girish.Pathak, Vijayenthiran Subramaniam
Add HDLCD platform library for SGI platform that implements platform
callbacks for the Arm HDLCD driver.
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Vijayenthiran Subramaniam <vijayenthiran.subramaniam@arm.com>
---
Platform/ARM/SgiPkg/SgiPlatform.dsc | 6 +
Platform/ARM/SgiPkg/SgiPlatform.fdf | 6 +
Platform/ARM/SgiPkg/Library/HdLcdArmSgiLib/HdLcdArmSgiLib.inf | 37 +++
Platform/ARM/SgiPkg/Include/SgiPlatform.h | 4 +
Platform/ARM/SgiPkg/Library/HdLcdArmSgiLib/HdLcdArmSgi.c | 262 ++++++++++++++++++++
Platform/ARM/SgiPkg/Library/PlatformLib/PlatformLibMem.c | 8 +-
6 files changed, 322 insertions(+), 1 deletion(-)
diff --git a/Platform/ARM/SgiPkg/SgiPlatform.dsc b/Platform/ARM/SgiPkg/SgiPlatform.dsc
index 0c794c6b299d..7995c7d132d6 100644
--- a/Platform/ARM/SgiPkg/SgiPlatform.dsc
+++ b/Platform/ARM/SgiPkg/SgiPlatform.dsc
@@ -37,6 +37,8 @@ [LibraryClasses.common]
ArmPlatformLib|Platform/ARM/SgiPkg/Library/PlatformLib/PlatformLib.inf
BasePathLib|ShellPkg/Library/UefiShellLib/UefiShellLib.inf
EfiResetSystemLib|ArmPkg/Library/ArmPsciResetSystemLib/ArmPsciResetSystemLib.inf
+ LcdHwLib|ArmPlatformPkg/Library/HdLcd/HdLcd.inf
+ LcdPlatformLib|Platform/ARM/SgiPkg/Library/HdLcdArmSgiLib/HdLcdArmSgiLib.inf
NorFlashPlatformLib|Platform/ARM/SgiPkg/Library/NorFlashLib/NorFlashLib.inf
HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf
TimerLib|ArmPkg/Library/ArmArchTimerLib/ArmArchTimerLib.inf
@@ -155,6 +157,9 @@ [PcdsFixedAtBuild.common]
gArmPlatformTokenSpaceGuid.PL011UartInteger|4
gArmPlatformTokenSpaceGuid.PL011UartFractional|0
+ ## PL370 - HDLCD1
+ gArmPlatformTokenSpaceGuid.PcdArmHdLcdBase|0x7FF60000
+
## PL011 - Serial Debug UART
gArmPlatformTokenSpaceGuid.PcdSerialDbgRegisterBase|0x7FF80000
gArmPlatformTokenSpaceGuid.PcdSerialDbgUartClkInHz|7372800
@@ -235,6 +240,7 @@ [Components.common]
ArmPkg/Drivers/ArmGic/ArmGicDxe.inf
ArmPkg/Drivers/TimerDxe/TimerDxe.inf
ArmPkg/Drivers/GenericWatchdogDxe/GenericWatchdogDxe.inf
+ ArmPlatformPkg/Drivers/LcdGraphicsOutputDxe/LcdGraphicsOutputDxe.inf
ArmPlatformPkg/Drivers/NorFlashDxe/NorFlashDxe.inf
EmbeddedPkg/RealTimeClockRuntimeDxe/RealTimeClockRuntimeDxe.inf
EmbeddedPkg/MetronomeDxe/MetronomeDxe.inf
diff --git a/Platform/ARM/SgiPkg/SgiPlatform.fdf b/Platform/ARM/SgiPkg/SgiPlatform.fdf
index ddf1fda5a16e..80c3412fd4ad 100644
--- a/Platform/ARM/SgiPkg/SgiPlatform.fdf
+++ b/Platform/ARM/SgiPkg/SgiPlatform.fdf
@@ -133,6 +133,9 @@ [FV.FvMain]
#
# Multiple Console IO support
#
+ INF MdeModulePkg/Universal/Console/ConPlatformDxe/ConPlatformDxe.inf
+ INF MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitterDxe.inf
+ INF MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsoleDxe.inf
INF MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf
INF MdeModulePkg/Universal/SerialDxe/SerialDxe.inf
@@ -144,6 +147,9 @@ [FV.FvMain]
INF ArmPlatformPkg/Drivers/NorFlashDxe/NorFlashDxe.inf
INF OvmfPkg/VirtioBlkDxe/VirtioBlk.inf
+ # Graphics Output Protocol
+ INF ArmPlatformPkg/Drivers/LcdGraphicsOutputDxe/LcdGraphicsOutputDxe.inf
+
INF Platform/ARM/Drivers/BootMonFs/BootMonFs.inf
INF MdeModulePkg/Universal/PCD/Dxe/Pcd.inf
diff --git a/Platform/ARM/SgiPkg/Library/HdLcdArmSgiLib/HdLcdArmSgiLib.inf b/Platform/ARM/SgiPkg/Library/HdLcdArmSgiLib/HdLcdArmSgiLib.inf
new file mode 100644
index 000000000000..25efbea5fb83
--- /dev/null
+++ b/Platform/ARM/SgiPkg/Library/HdLcdArmSgiLib/HdLcdArmSgiLib.inf
@@ -0,0 +1,37 @@
+#
+# Copyright (c) 2018, ARM Limited. All rights reserved.
+#
+# 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 = HdLcdArmSgiLib
+ FILE_GUID = 0C77342C-7895-4DE1-A9C8-1DBBFA71AF34
+ MODULE_TYPE = BASE
+ VERSION_STRING = 1.0
+ LIBRARY_CLASS = LcdPlatformLib
+
+[Sources.common]
+ HdLcdArmSgi.c
+
+[Packages]
+ ArmPkg/ArmPkg.dec
+ ArmPlatformPkg/ArmPlatformPkg.dec
+ MdePkg/MdePkg.dec
+ Platform/ARM/SgiPkg/SgiPlatform.dec
+
+[LibraryClasses]
+ BaseLib
+
+[FixedPcd]
+ gArmPlatformTokenSpaceGuid.PcdArmHdLcdBase
+ gArmPlatformTokenSpaceGuid.PcdArmLcdDdrFrameBufferBase
+ gArmPlatformTokenSpaceGuid.PcdArmLcdDdrFrameBufferSize
+ gArmPlatformTokenSpaceGuid.PcdGopPixelFormat
diff --git a/Platform/ARM/SgiPkg/Include/SgiPlatform.h b/Platform/ARM/SgiPkg/Include/SgiPlatform.h
index 550189565752..b9a662ae41a1 100644
--- a/Platform/ARM/SgiPkg/Include/SgiPlatform.h
+++ b/Platform/ARM/SgiPkg/Include/SgiPlatform.h
@@ -56,6 +56,10 @@
#define SGI_SUBSYS_GENERIC_GICR_BASE 0x300C0000
#define SGI_SUBSYS_GENERIC_GIC_SZ SIZE_1MB
+// Expansion AXI - Platform Peripherals - HDLCD1
+#define SGI_EXP_PLAT_PERIPH_HDLCD1_BASE 0x7FF60000
+#define SGI_EXP_PLAT_PERIPH_HDLCD1_SZ SIZE_64KB
+
// Expansion AXI - Platform Peripherals - UART0
#define SGI_EXP_PLAT_PERIPH_UART0_BASE 0x7FF70000
#define SGI_EXP_PLAT_PERIPH_UART0_SZ SIZE_64KB
diff --git a/Platform/ARM/SgiPkg/Library/HdLcdArmSgiLib/HdLcdArmSgi.c b/Platform/ARM/SgiPkg/Library/HdLcdArmSgiLib/HdLcdArmSgi.c
new file mode 100644
index 000000000000..e1793c6d87c9
--- /dev/null
+++ b/Platform/ARM/SgiPkg/Library/HdLcdArmSgiLib/HdLcdArmSgi.c
@@ -0,0 +1,262 @@
+/** @file
+*
+* Copyright (c) 2018, ARM Limited. All rights reserved.
+*
+* 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 <PiDxe.h>
+#include <Library/DebugLib.h>
+#include <Library/LcdPlatformLib.h>
+#include <Library/PcdLib.h>
+#include <Library/UefiBootServicesTableLib.h>
+#include <Protocol/Cpu.h>
+
+typedef struct {
+ UINT32 OscFreq;
+ SCAN_TIMINGS Horizontal;
+ SCAN_TIMINGS Vertical;
+} DISPLAY_MODE;
+
+STATIC DISPLAY_MODE mDisplayModes[] = {
+ {
+ // SVGA : 800 x 600 x 24 bpp.
+ SVGA_OSC_FREQUENCY,
+ {SVGA_H_RES_PIXELS, SVGA_H_SYNC, SVGA_H_BACK_PORCH, SVGA_H_FRONT_PORCH},
+ {SVGA_V_RES_PIXELS, SVGA_V_SYNC, SVGA_V_BACK_PORCH, SVGA_V_FRONT_PORCH}
+ }
+};
+
+STATIC CONST UINT32 mMaxMode = sizeof (mDisplayModes) / sizeof (DISPLAY_MODE);
+
+/** HDLCD platform specific initialization function.
+
+ @param[in] Handle Handle to the LCD device instance.
+
+ @retval EFI_SUCCESS Plaform library initialized successfully.
+ @retval EFI_UNSUPPORTED PcdGopPixelFormat must be
+ PixelRedGreenBlueReserved8BitPerColor OR
+ PixelBlueGreenRedReserved8BitPerColor
+ any other format is not supported.
+ @retval !(EFI_SUCCESS) Other errors.
+**/
+EFI_STATUS
+LcdPlatformInitializeDisplay (
+ IN EFI_HANDLE Handle
+ )
+{
+ (VOID)Handle;
+ EFI_GRAPHICS_PIXEL_FORMAT PixelFormat;
+
+ // PixelBitMask and PixelBltOnly pixel formats are not supported.
+ PixelFormat = FixedPcdGet32 (PcdGopPixelFormat);
+ if (PixelFormat != PixelRedGreenBlueReserved8BitPerColor &&
+ PixelFormat != PixelBlueGreenRedReserved8BitPerColor) {
+
+ ASSERT (PixelFormat == PixelRedGreenBlueReserved8BitPerColor ||
+ PixelFormat == PixelBlueGreenRedReserved8BitPerColor);
+ return EFI_UNSUPPORTED;
+ }
+
+ return EFI_SUCCESS;
+}
+
+/** Allocate VRAM memory in DRAM for the framebuffer
+
+ The allocated address can be used to set the framebuffer.
+
+ @param[out] VramBaseAddress A pointer to the framebuffer address.
+ @param[out] VramSize A pointer to the size of the framebuffer
+ in bytes
+
+ @retval EFI_SUCCESS Framebuffer memory allocated successfully.
+ @retval !(EFI_SUCCESS) Other errors.
+**/
+EFI_STATUS
+LcdPlatformGetVram (
+ OUT EFI_PHYSICAL_ADDRESS *VramBaseAddress,
+ OUT UINTN *VramSize
+ )
+{
+ EFI_STATUS Status;
+ EFI_CPU_ARCH_PROTOCOL *Cpu;
+
+ ASSERT (VramBaseAddress != NULL);
+ ASSERT (VramSize != NULL);
+
+ // Set the VRAM size.
+ *VramSize = (UINTN)FixedPcdGet32 (PcdArmLcdDdrFrameBufferSize);
+
+ // Check if base address is already reserved for the framebuffer.
+ *VramBaseAddress =
+ (EFI_PHYSICAL_ADDRESS)FixedPcdGet64 (PcdArmLcdDdrFrameBufferBase);
+
+ if (*VramBaseAddress == 0) {
+ // If not already reserved, attempt to allocate the VRAM from the DRAM.
+ Status = gBS->AllocatePages (
+ AllocateAnyPages,
+ EfiReservedMemoryType,
+ EFI_SIZE_TO_PAGES (*VramSize),
+ VramBaseAddress);
+ if (EFI_ERROR (Status)) {
+ DEBUG ((DEBUG_ERROR, "HdLcdArmSgi: Failed to allocate memory for"
+ "frame buffer.\n"));
+ ASSERT_EFI_ERROR (Status);
+ return Status;
+ }
+ }
+
+ // Ensure the Cpu architectural protocol is already installed
+ Status = gBS->LocateProtocol (
+ &gEfiCpuArchProtocolGuid,
+ NULL,
+ (VOID **)&Cpu);
+ if (EFI_ERROR (Status)) {
+ ASSERT_EFI_ERROR (Status);
+ gBS->FreePages (*VramBaseAddress, EFI_SIZE_TO_PAGES (*VramSize));
+ return Status;
+ }
+
+ // The VRAM is inside the DRAM, which is cacheable.
+ // Mark the VRAM as write-combining (uncached) and non-executable.
+ Status = Cpu->SetMemoryAttributes (
+ Cpu,
+ *VramBaseAddress,
+ *VramSize,
+ EFI_MEMORY_WC | EFI_MEMORY_XP);
+ if (EFI_ERROR (Status)) {
+ ASSERT_EFI_ERROR (Status);
+ gBS->FreePages (*VramBaseAddress, EFI_SIZE_TO_PAGES (*VramSize));
+ }
+
+ return Status;
+}
+
+/** Return total number of modes supported.
+
+ @retval UINT32 Mode Number.
+**/
+UINT32
+LcdPlatformGetMaxMode (VOID)
+{
+ return mMaxMode;
+}
+
+/** Set the requested display mode.
+
+ @param[in] ModeNumber Mode Number.
+
+ @retval EFI_SUCCESS Mode set successfully.
+ @retval EFI_INVALID_PARAMETER Requested mode not found.
+**/
+EFI_STATUS
+LcdPlatformSetMode (
+ IN UINT32 ModeNumber
+ )
+{
+ if (ModeNumber >= mMaxMode) {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ return EFI_SUCCESS;
+}
+
+/** Return information for the requested mode number.
+
+ @param[in] ModeNumber Mode Number.
+
+ @param[out] Info Pointer for returned mode information
+ (on success).
+
+ @retval EFI_SUCCESS Mode information for the requested mode
+ returned successfully.
+ @retval EFI_INVALID_PARAMETER Requested mode not found.
+**/
+EFI_STATUS
+LcdPlatformQueryMode (
+ IN UINT32 ModeNumber,
+ OUT EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info
+ )
+{
+ if (ModeNumber >= mMaxMode) {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ ASSERT (Info != NULL);
+
+ Info->Version = 0;
+ Info->HorizontalResolution = mDisplayModes[ModeNumber].Horizontal.Resolution;
+ Info->VerticalResolution = mDisplayModes[ModeNumber].Vertical.Resolution;
+ Info->PixelsPerScanLine = mDisplayModes[ModeNumber].Horizontal.Resolution;
+ Info->PixelFormat = FixedPcdGet32 (PcdGopPixelFormat);
+
+ return EFI_SUCCESS;
+}
+
+/** Return display timing information for the requested mode number.
+
+ @param[in] ModeNumber Mode Number.
+
+ @param[out] Horizontal Pointer to horizontal timing parameters.
+ (Resolution, Sync, Back porch, Front porch)
+ @param[out] Vertical Pointer to vertical timing parameters.
+ (Resolution, Sync, Back porch, Front porch)
+
+ @retval EFI_SUCCESS Display timing information for the requested
+ mode returned successfully.
+ @retval EFI_INVALID_PARAMETER Requested mode not found.
+**/
+EFI_STATUS
+LcdPlatformGetTimings (
+ IN UINT32 ModeNumber,
+ OUT SCAN_TIMINGS **Horizontal,
+ OUT SCAN_TIMINGS **Vertical
+ )
+{
+ if (ModeNumber >= mMaxMode) {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ ASSERT (Horizontal != NULL);
+ ASSERT (Vertical != NULL);
+
+ *Horizontal = &mDisplayModes[ModeNumber].Horizontal;
+ *Vertical = &mDisplayModes[ModeNumber].Vertical;
+
+ // Pretend that clock probing and get timings are successful for SGI FVP
+ return EFI_SUCCESS;
+}
+
+/** Return bits per pixel information for a mode number.
+
+ @param[in] ModeNumber Mode Number.
+
+ @param[out] Bpp Pointer to bits per pixel information.
+
+ @retval EFI_SUCCESS Bits per pixel information for the requested
+ mode returned successfully.
+ @retval EFI_INVALID_PARAMETER Requested mode not found.
+**/
+EFI_STATUS
+LcdPlatformGetBpp (
+ IN UINT32 ModeNumber,
+ OUT LCD_BPP *Bpp
+ )
+{
+ if (ModeNumber >= mMaxMode) {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ ASSERT (Bpp != NULL);
+
+ *Bpp = LCD_BITS_PER_PIXEL_24;
+
+ return EFI_SUCCESS;
+}
diff --git a/Platform/ARM/SgiPkg/Library/PlatformLib/PlatformLibMem.c b/Platform/ARM/SgiPkg/Library/PlatformLib/PlatformLibMem.c
index 3314a26e8f41..6ec2e8a7096d 100644
--- a/Platform/ARM/SgiPkg/Library/PlatformLib/PlatformLibMem.c
+++ b/Platform/ARM/SgiPkg/Library/PlatformLib/PlatformLibMem.c
@@ -22,7 +22,7 @@
#include <SgiPlatform.h>
// Total number of descriptors, including the final "end-of-table" descriptor.
-#define MAX_VIRTUAL_MEMORY_MAP_DESCRIPTORS 11
+#define MAX_VIRTUAL_MEMORY_MAP_DESCRIPTORS 12
/**
Returns the Virtual Memory Map of the platform.
@@ -104,6 +104,12 @@ ArmPlatformGetVirtualMemoryMap (
VirtualMemoryTable[Index].Length = SGI_SUBSYS_GENERIC_GIC_SZ;
VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
+ // Expansion AXI - Platform Peripherals - HDLCD1
+ VirtualMemoryTable[++Index].PhysicalBase = SGI_EXP_PLAT_PERIPH_HDLCD1_BASE;
+ VirtualMemoryTable[Index].VirtualBase = SGI_EXP_PLAT_PERIPH_HDLCD1_BASE;
+ VirtualMemoryTable[Index].Length = SGI_EXP_PLAT_PERIPH_HDLCD1_SZ;
+ VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
+
// Expansion AXI - Platform Peripherals - UART1
VirtualMemoryTable[++Index].PhysicalBase = SGI_EXP_PLAT_PERIPH_UART1_BASE;
VirtualMemoryTable[Index].VirtualBase = SGI_EXP_PLAT_PERIPH_UART1_BASE;
--
2.7.4
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH] Platform/ARM/SgiPkg: Add support for HDLCD
2018-12-06 12:42 [PATCH] Platform/ARM/SgiPkg: Add support for HDLCD Vijayenthiran Subramaniam
@ 2018-12-06 17:07 ` Ard Biesheuvel
2018-12-07 6:13 ` Vijayenthiran Subramaniam
0 siblings, 1 reply; 3+ messages in thread
From: Ard Biesheuvel @ 2018-12-06 17:07 UTC (permalink / raw)
To: vijayenthiran.subramaniam
Cc: edk2-devel@lists.01.org, Leif Lindholm,
Thomas Panakamattam Abraham, Girish Pathak
On Thu, 6 Dec 2018 at 13:43, Vijayenthiran Subramaniam
<vijayenthiran.subramaniam@arm.com> wrote:
>
> Add HDLCD platform library for SGI platform that implements platform
> callbacks for the Arm HDLCD driver.
>
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Vijayenthiran Subramaniam <vijayenthiran.subramaniam@arm.com>
> ---
> Platform/ARM/SgiPkg/SgiPlatform.dsc | 6 +
> Platform/ARM/SgiPkg/SgiPlatform.fdf | 6 +
> Platform/ARM/SgiPkg/Library/HdLcdArmSgiLib/HdLcdArmSgiLib.inf | 37 +++
> Platform/ARM/SgiPkg/Include/SgiPlatform.h | 4 +
> Platform/ARM/SgiPkg/Library/HdLcdArmSgiLib/HdLcdArmSgi.c | 262 ++++++++++++++++++++
> Platform/ARM/SgiPkg/Library/PlatformLib/PlatformLibMem.c | 8 +-
> 6 files changed, 322 insertions(+), 1 deletion(-)
>
> diff --git a/Platform/ARM/SgiPkg/SgiPlatform.dsc b/Platform/ARM/SgiPkg/SgiPlatform.dsc
> index 0c794c6b299d..7995c7d132d6 100644
> --- a/Platform/ARM/SgiPkg/SgiPlatform.dsc
> +++ b/Platform/ARM/SgiPkg/SgiPlatform.dsc
> @@ -37,6 +37,8 @@ [LibraryClasses.common]
> ArmPlatformLib|Platform/ARM/SgiPkg/Library/PlatformLib/PlatformLib.inf
> BasePathLib|ShellPkg/Library/UefiShellLib/UefiShellLib.inf
> EfiResetSystemLib|ArmPkg/Library/ArmPsciResetSystemLib/ArmPsciResetSystemLib.inf
> + LcdHwLib|ArmPlatformPkg/Library/HdLcd/HdLcd.inf
> + LcdPlatformLib|Platform/ARM/SgiPkg/Library/HdLcdArmSgiLib/HdLcdArmSgiLib.inf
> NorFlashPlatformLib|Platform/ARM/SgiPkg/Library/NorFlashLib/NorFlashLib.inf
> HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf
> TimerLib|ArmPkg/Library/ArmArchTimerLib/ArmArchTimerLib.inf
> @@ -155,6 +157,9 @@ [PcdsFixedAtBuild.common]
> gArmPlatformTokenSpaceGuid.PL011UartInteger|4
> gArmPlatformTokenSpaceGuid.PL011UartFractional|0
>
> + ## PL370 - HDLCD1
> + gArmPlatformTokenSpaceGuid.PcdArmHdLcdBase|0x7FF60000
> +
> ## PL011 - Serial Debug UART
> gArmPlatformTokenSpaceGuid.PcdSerialDbgRegisterBase|0x7FF80000
> gArmPlatformTokenSpaceGuid.PcdSerialDbgUartClkInHz|7372800
> @@ -235,6 +240,7 @@ [Components.common]
> ArmPkg/Drivers/ArmGic/ArmGicDxe.inf
> ArmPkg/Drivers/TimerDxe/TimerDxe.inf
> ArmPkg/Drivers/GenericWatchdogDxe/GenericWatchdogDxe.inf
> + ArmPlatformPkg/Drivers/LcdGraphicsOutputDxe/LcdGraphicsOutputDxe.inf
> ArmPlatformPkg/Drivers/NorFlashDxe/NorFlashDxe.inf
> EmbeddedPkg/RealTimeClockRuntimeDxe/RealTimeClockRuntimeDxe.inf
> EmbeddedPkg/MetronomeDxe/MetronomeDxe.inf
> diff --git a/Platform/ARM/SgiPkg/SgiPlatform.fdf b/Platform/ARM/SgiPkg/SgiPlatform.fdf
> index ddf1fda5a16e..80c3412fd4ad 100644
> --- a/Platform/ARM/SgiPkg/SgiPlatform.fdf
> +++ b/Platform/ARM/SgiPkg/SgiPlatform.fdf
> @@ -133,6 +133,9 @@ [FV.FvMain]
> #
> # Multiple Console IO support
> #
> + INF MdeModulePkg/Universal/Console/ConPlatformDxe/ConPlatformDxe.inf
> + INF MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitterDxe.inf
> + INF MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsoleDxe.inf
> INF MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf
> INF MdeModulePkg/Universal/SerialDxe/SerialDxe.inf
>
> @@ -144,6 +147,9 @@ [FV.FvMain]
> INF ArmPlatformPkg/Drivers/NorFlashDxe/NorFlashDxe.inf
> INF OvmfPkg/VirtioBlkDxe/VirtioBlk.inf
>
> + # Graphics Output Protocol
> + INF ArmPlatformPkg/Drivers/LcdGraphicsOutputDxe/LcdGraphicsOutputDxe.inf
> +
> INF Platform/ARM/Drivers/BootMonFs/BootMonFs.inf
> INF MdeModulePkg/Universal/PCD/Dxe/Pcd.inf
>
> diff --git a/Platform/ARM/SgiPkg/Library/HdLcdArmSgiLib/HdLcdArmSgiLib.inf b/Platform/ARM/SgiPkg/Library/HdLcdArmSgiLib/HdLcdArmSgiLib.inf
> new file mode 100644
> index 000000000000..25efbea5fb83
> --- /dev/null
> +++ b/Platform/ARM/SgiPkg/Library/HdLcdArmSgiLib/HdLcdArmSgiLib.inf
> @@ -0,0 +1,37 @@
> +#
> +# Copyright (c) 2018, ARM Limited. All rights reserved.
> +#
> +# 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 = HdLcdArmSgiLib
> + FILE_GUID = 0C77342C-7895-4DE1-A9C8-1DBBFA71AF34
> + MODULE_TYPE = BASE
> + VERSION_STRING = 1.0
> + LIBRARY_CLASS = LcdPlatformLib
> +
> +[Sources.common]
> + HdLcdArmSgi.c
> +
> +[Packages]
> + ArmPkg/ArmPkg.dec
> + ArmPlatformPkg/ArmPlatformPkg.dec
> + MdePkg/MdePkg.dec
> + Platform/ARM/SgiPkg/SgiPlatform.dec
> +
> +[LibraryClasses]
> + BaseLib
> +
> +[FixedPcd]
> + gArmPlatformTokenSpaceGuid.PcdArmHdLcdBase
> + gArmPlatformTokenSpaceGuid.PcdArmLcdDdrFrameBufferBase
> + gArmPlatformTokenSpaceGuid.PcdArmLcdDdrFrameBufferSize
> + gArmPlatformTokenSpaceGuid.PcdGopPixelFormat
> diff --git a/Platform/ARM/SgiPkg/Include/SgiPlatform.h b/Platform/ARM/SgiPkg/Include/SgiPlatform.h
> index 550189565752..b9a662ae41a1 100644
> --- a/Platform/ARM/SgiPkg/Include/SgiPlatform.h
> +++ b/Platform/ARM/SgiPkg/Include/SgiPlatform.h
> @@ -56,6 +56,10 @@
> #define SGI_SUBSYS_GENERIC_GICR_BASE 0x300C0000
> #define SGI_SUBSYS_GENERIC_GIC_SZ SIZE_1MB
>
> +// Expansion AXI - Platform Peripherals - HDLCD1
> +#define SGI_EXP_PLAT_PERIPH_HDLCD1_BASE 0x7FF60000
> +#define SGI_EXP_PLAT_PERIPH_HDLCD1_SZ SIZE_64KB
> +
> // Expansion AXI - Platform Peripherals - UART0
> #define SGI_EXP_PLAT_PERIPH_UART0_BASE 0x7FF70000
> #define SGI_EXP_PLAT_PERIPH_UART0_SZ SIZE_64KB
> diff --git a/Platform/ARM/SgiPkg/Library/HdLcdArmSgiLib/HdLcdArmSgi.c b/Platform/ARM/SgiPkg/Library/HdLcdArmSgiLib/HdLcdArmSgi.c
> new file mode 100644
> index 000000000000..e1793c6d87c9
> --- /dev/null
> +++ b/Platform/ARM/SgiPkg/Library/HdLcdArmSgiLib/HdLcdArmSgi.c
> @@ -0,0 +1,262 @@
> +/** @file
> +*
> +* Copyright (c) 2018, ARM Limited. All rights reserved.
> +*
> +* 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 <PiDxe.h>
> +#include <Library/DebugLib.h>
> +#include <Library/LcdPlatformLib.h>
> +#include <Library/PcdLib.h>
> +#include <Library/UefiBootServicesTableLib.h>
> +#include <Protocol/Cpu.h>
> +
> +typedef struct {
> + UINT32 OscFreq;
> + SCAN_TIMINGS Horizontal;
> + SCAN_TIMINGS Vertical;
> +} DISPLAY_MODE;
> +
> +STATIC DISPLAY_MODE mDisplayModes[] = {
> + {
> + // SVGA : 800 x 600 x 24 bpp.
> + SVGA_OSC_FREQUENCY,
> + {SVGA_H_RES_PIXELS, SVGA_H_SYNC, SVGA_H_BACK_PORCH, SVGA_H_FRONT_PORCH},
> + {SVGA_V_RES_PIXELS, SVGA_V_SYNC, SVGA_V_BACK_PORCH, SVGA_V_FRONT_PORCH}
> + }
> +};
> +
> +STATIC CONST UINT32 mMaxMode = sizeof (mDisplayModes) / sizeof (DISPLAY_MODE);
> +
Please use ARARY_SIZE() here
> +/** HDLCD platform specific initialization function.
> +
> + @param[in] Handle Handle to the LCD device instance.
> +
> + @retval EFI_SUCCESS Plaform library initialized successfully.
> + @retval EFI_UNSUPPORTED PcdGopPixelFormat must be
> + PixelRedGreenBlueReserved8BitPerColor OR
> + PixelBlueGreenRedReserved8BitPerColor
> + any other format is not supported.
> + @retval !(EFI_SUCCESS) Other errors.
> +**/
> +EFI_STATUS
> +LcdPlatformInitializeDisplay (
> + IN EFI_HANDLE Handle
> + )
> +{
> + (VOID)Handle;
Drop this please
> + EFI_GRAPHICS_PIXEL_FORMAT PixelFormat;
> +
> + // PixelBitMask and PixelBltOnly pixel formats are not supported.
> + PixelFormat = FixedPcdGet32 (PcdGopPixelFormat);
> + if (PixelFormat != PixelRedGreenBlueReserved8BitPerColor &&
> + PixelFormat != PixelBlueGreenRedReserved8BitPerColor) {
> +
> + ASSERT (PixelFormat == PixelRedGreenBlueReserved8BitPerColor ||
> + PixelFormat == PixelBlueGreenRedReserved8BitPerColor);
> + return EFI_UNSUPPORTED;
> + }
> +
> + return EFI_SUCCESS;
> +}
> +
> +/** Allocate VRAM memory in DRAM for the framebuffer
> +
> + The allocated address can be used to set the framebuffer.
> +
> + @param[out] VramBaseAddress A pointer to the framebuffer address.
> + @param[out] VramSize A pointer to the size of the framebuffer
> + in bytes
> +
> + @retval EFI_SUCCESS Framebuffer memory allocated successfully.
> + @retval !(EFI_SUCCESS) Other errors.
Just say 'other': the boolean negation of EFI_SUCCESS makes no sense here
> +**/
> +EFI_STATUS
> +LcdPlatformGetVram (
> + OUT EFI_PHYSICAL_ADDRESS *VramBaseAddress,
> + OUT UINTN *VramSize
> + )
> +{
> + EFI_STATUS Status;
> + EFI_CPU_ARCH_PROTOCOL *Cpu;
> +
> + ASSERT (VramBaseAddress != NULL);
> + ASSERT (VramSize != NULL);
> +
> + // Set the VRAM size.
> + *VramSize = (UINTN)FixedPcdGet32 (PcdArmLcdDdrFrameBufferSize);
> +
> + // Check if base address is already reserved for the framebuffer.
> + *VramBaseAddress =
> + (EFI_PHYSICAL_ADDRESS)FixedPcdGet64 (PcdArmLcdDdrFrameBufferBase);
> +
> + if (*VramBaseAddress == 0) {
> + // If not already reserved, attempt to allocate the VRAM from the DRAM.
> + Status = gBS->AllocatePages (
> + AllocateAnyPages,
> + EfiReservedMemoryType,
> + EFI_SIZE_TO_PAGES (*VramSize),
> + VramBaseAddress);
> + if (EFI_ERROR (Status)) {
> + DEBUG ((DEBUG_ERROR, "HdLcdArmSgi: Failed to allocate memory for"
> + "frame buffer.\n"));
> + ASSERT_EFI_ERROR (Status);
> + return Status;
> + }
> + }
> +
> + // Ensure the Cpu architectural protocol is already installed
> + Status = gBS->LocateProtocol (
> + &gEfiCpuArchProtocolGuid,
> + NULL,
> + (VOID **)&Cpu);
> + if (EFI_ERROR (Status)) {
> + ASSERT_EFI_ERROR (Status);
> + gBS->FreePages (*VramBaseAddress, EFI_SIZE_TO_PAGES (*VramSize));
> + return Status;
> + }
> +
If you require this protocol, add it to the [depex] section, and drop
the error handling (but leave the ASSERT())
> + // The VRAM is inside the DRAM, which is cacheable.
> + // Mark the VRAM as write-combining (uncached) and non-executable.
> + Status = Cpu->SetMemoryAttributes (
> + Cpu,
> + *VramBaseAddress,
> + *VramSize,
> + EFI_MEMORY_WC | EFI_MEMORY_XP);
> + if (EFI_ERROR (Status)) {
> + ASSERT_EFI_ERROR (Status);
> + gBS->FreePages (*VramBaseAddress, EFI_SIZE_TO_PAGES (*VramSize));
> + }
> +
> + return Status;
> +}
> +
> +/** Return total number of modes supported.
> +
> + @retval UINT32 Mode Number.
> +**/
> +UINT32
> +LcdPlatformGetMaxMode (VOID)
> +{
> + return mMaxMode;
> +}
> +
> +/** Set the requested display mode.
> +
> + @param[in] ModeNumber Mode Number.
> +
> + @retval EFI_SUCCESS Mode set successfully.
> + @retval EFI_INVALID_PARAMETER Requested mode not found.
> +**/
> +EFI_STATUS
> +LcdPlatformSetMode (
> + IN UINT32 ModeNumber
> + )
> +{
> + if (ModeNumber >= mMaxMode) {
> + return EFI_INVALID_PARAMETER;
> + }
> +
> + return EFI_SUCCESS;
> +}
> +
> +/** Return information for the requested mode number.
> +
> + @param[in] ModeNumber Mode Number.
> +
> + @param[out] Info Pointer for returned mode information
> + (on success).
> +
> + @retval EFI_SUCCESS Mode information for the requested mode
> + returned successfully.
> + @retval EFI_INVALID_PARAMETER Requested mode not found.
> +**/
> +EFI_STATUS
> +LcdPlatformQueryMode (
> + IN UINT32 ModeNumber,
> + OUT EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info
> + )
> +{
> + if (ModeNumber >= mMaxMode) {
> + return EFI_INVALID_PARAMETER;
> + }
> +
> + ASSERT (Info != NULL);
> +
> + Info->Version = 0;
> + Info->HorizontalResolution = mDisplayModes[ModeNumber].Horizontal.Resolution;
> + Info->VerticalResolution = mDisplayModes[ModeNumber].Vertical.Resolution;
> + Info->PixelsPerScanLine = mDisplayModes[ModeNumber].Horizontal.Resolution;
> + Info->PixelFormat = FixedPcdGet32 (PcdGopPixelFormat);
> +
> + return EFI_SUCCESS;
> +}
> +
> +/** Return display timing information for the requested mode number.
> +
> + @param[in] ModeNumber Mode Number.
> +
> + @param[out] Horizontal Pointer to horizontal timing parameters.
> + (Resolution, Sync, Back porch, Front porch)
> + @param[out] Vertical Pointer to vertical timing parameters.
> + (Resolution, Sync, Back porch, Front porch)
> +
> + @retval EFI_SUCCESS Display timing information for the requested
> + mode returned successfully.
> + @retval EFI_INVALID_PARAMETER Requested mode not found.
> +**/
> +EFI_STATUS
> +LcdPlatformGetTimings (
> + IN UINT32 ModeNumber,
> + OUT SCAN_TIMINGS **Horizontal,
> + OUT SCAN_TIMINGS **Vertical
> + )
> +{
> + if (ModeNumber >= mMaxMode) {
> + return EFI_INVALID_PARAMETER;
> + }
> +
> + ASSERT (Horizontal != NULL);
> + ASSERT (Vertical != NULL);
> +
> + *Horizontal = &mDisplayModes[ModeNumber].Horizontal;
> + *Vertical = &mDisplayModes[ModeNumber].Vertical;
> +
> + // Pretend that clock probing and get timings are successful for SGI FVP
> + return EFI_SUCCESS;
> +}
> +
> +/** Return bits per pixel information for a mode number.
> +
> + @param[in] ModeNumber Mode Number.
> +
> + @param[out] Bpp Pointer to bits per pixel information.
> +
> + @retval EFI_SUCCESS Bits per pixel information for the requested
> + mode returned successfully.
> + @retval EFI_INVALID_PARAMETER Requested mode not found.
> +**/
> +EFI_STATUS
> +LcdPlatformGetBpp (
> + IN UINT32 ModeNumber,
> + OUT LCD_BPP *Bpp
> + )
> +{
> + if (ModeNumber >= mMaxMode) {
> + return EFI_INVALID_PARAMETER;
> + }
> +
> + ASSERT (Bpp != NULL);
> +
> + *Bpp = LCD_BITS_PER_PIXEL_24;
> +
> + return EFI_SUCCESS;
> +}
> diff --git a/Platform/ARM/SgiPkg/Library/PlatformLib/PlatformLibMem.c b/Platform/ARM/SgiPkg/Library/PlatformLib/PlatformLibMem.c
> index 3314a26e8f41..6ec2e8a7096d 100644
> --- a/Platform/ARM/SgiPkg/Library/PlatformLib/PlatformLibMem.c
> +++ b/Platform/ARM/SgiPkg/Library/PlatformLib/PlatformLibMem.c
> @@ -22,7 +22,7 @@
> #include <SgiPlatform.h>
>
> // Total number of descriptors, including the final "end-of-table" descriptor.
> -#define MAX_VIRTUAL_MEMORY_MAP_DESCRIPTORS 11
> +#define MAX_VIRTUAL_MEMORY_MAP_DESCRIPTORS 12
>
> /**
> Returns the Virtual Memory Map of the platform.
> @@ -104,6 +104,12 @@ ArmPlatformGetVirtualMemoryMap (
> VirtualMemoryTable[Index].Length = SGI_SUBSYS_GENERIC_GIC_SZ;
> VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
>
> + // Expansion AXI - Platform Peripherals - HDLCD1
> + VirtualMemoryTable[++Index].PhysicalBase = SGI_EXP_PLAT_PERIPH_HDLCD1_BASE;
> + VirtualMemoryTable[Index].VirtualBase = SGI_EXP_PLAT_PERIPH_HDLCD1_BASE;
> + VirtualMemoryTable[Index].Length = SGI_EXP_PLAT_PERIPH_HDLCD1_SZ;
> + VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
> +
> // Expansion AXI - Platform Peripherals - UART1
> VirtualMemoryTable[++Index].PhysicalBase = SGI_EXP_PLAT_PERIPH_UART1_BASE;
> VirtualMemoryTable[Index].VirtualBase = SGI_EXP_PLAT_PERIPH_UART1_BASE;
> --
> 2.7.4
>
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] Platform/ARM/SgiPkg: Add support for HDLCD
2018-12-06 17:07 ` Ard Biesheuvel
@ 2018-12-07 6:13 ` Vijayenthiran Subramaniam
0 siblings, 0 replies; 3+ messages in thread
From: Vijayenthiran Subramaniam @ 2018-12-07 6:13 UTC (permalink / raw)
To: Ard Biesheuvel; +Cc: edk2-devel
On Thu, Dec 6, 2018 at 5:08 PM Ard Biesheuvel <ard.biesheuvel@linaro.org> wrote:
>
> On Thu, 6 Dec 2018 at 13:43, Vijayenthiran Subramaniam
> <vijayenthiran.subramaniam@arm.com> wrote:
> >
> > Add HDLCD platform library for SGI platform that implements platform
> > callbacks for the Arm HDLCD driver.
> >
> > Contributed-under: TianoCore Contribution Agreement 1.1
> > Signed-off-by: Vijayenthiran Subramaniam <vijayenthiran.subramaniam@arm.com>
> > ---
> > Platform/ARM/SgiPkg/SgiPlatform.dsc | 6 +
> > Platform/ARM/SgiPkg/SgiPlatform.fdf | 6 +
> > Platform/ARM/SgiPkg/Library/HdLcdArmSgiLib/HdLcdArmSgiLib.inf | 37 +++
> > Platform/ARM/SgiPkg/Include/SgiPlatform.h | 4 +
> > Platform/ARM/SgiPkg/Library/HdLcdArmSgiLib/HdLcdArmSgi.c | 262 ++++++++++++++++++++
> > Platform/ARM/SgiPkg/Library/PlatformLib/PlatformLibMem.c | 8 +-
> > 6 files changed, 322 insertions(+), 1 deletion(-)
> >
> > diff --git a/Platform/ARM/SgiPkg/SgiPlatform.dsc b/Platform/ARM/SgiPkg/SgiPlatform.dsc
> > index 0c794c6b299d..7995c7d132d6 100644
> > --- a/Platform/ARM/SgiPkg/SgiPlatform.dsc
> > +++ b/Platform/ARM/SgiPkg/SgiPlatform.dsc
> > @@ -37,6 +37,8 @@ [LibraryClasses.common]
> > ArmPlatformLib|Platform/ARM/SgiPkg/Library/PlatformLib/PlatformLib.inf
> > BasePathLib|ShellPkg/Library/UefiShellLib/UefiShellLib.inf
> > EfiResetSystemLib|ArmPkg/Library/ArmPsciResetSystemLib/ArmPsciResetSystemLib.inf
> > + LcdHwLib|ArmPlatformPkg/Library/HdLcd/HdLcd.inf
> > + LcdPlatformLib|Platform/ARM/SgiPkg/Library/HdLcdArmSgiLib/HdLcdArmSgiLib.inf
> > NorFlashPlatformLib|Platform/ARM/SgiPkg/Library/NorFlashLib/NorFlashLib.inf
> > HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf
> > TimerLib|ArmPkg/Library/ArmArchTimerLib/ArmArchTimerLib.inf
> > @@ -155,6 +157,9 @@ [PcdsFixedAtBuild.common]
> > gArmPlatformTokenSpaceGuid.PL011UartInteger|4
> > gArmPlatformTokenSpaceGuid.PL011UartFractional|0
> >
> > + ## PL370 - HDLCD1
> > + gArmPlatformTokenSpaceGuid.PcdArmHdLcdBase|0x7FF60000
> > +
> > ## PL011 - Serial Debug UART
> > gArmPlatformTokenSpaceGuid.PcdSerialDbgRegisterBase|0x7FF80000
> > gArmPlatformTokenSpaceGuid.PcdSerialDbgUartClkInHz|7372800
> > @@ -235,6 +240,7 @@ [Components.common]
> > ArmPkg/Drivers/ArmGic/ArmGicDxe.inf
> > ArmPkg/Drivers/TimerDxe/TimerDxe.inf
> > ArmPkg/Drivers/GenericWatchdogDxe/GenericWatchdogDxe.inf
> > + ArmPlatformPkg/Drivers/LcdGraphicsOutputDxe/LcdGraphicsOutputDxe.inf
> > ArmPlatformPkg/Drivers/NorFlashDxe/NorFlashDxe.inf
> > EmbeddedPkg/RealTimeClockRuntimeDxe/RealTimeClockRuntimeDxe.inf
> > EmbeddedPkg/MetronomeDxe/MetronomeDxe.inf
> > diff --git a/Platform/ARM/SgiPkg/SgiPlatform.fdf b/Platform/ARM/SgiPkg/SgiPlatform.fdf
> > index ddf1fda5a16e..80c3412fd4ad 100644
> > --- a/Platform/ARM/SgiPkg/SgiPlatform.fdf
> > +++ b/Platform/ARM/SgiPkg/SgiPlatform.fdf
> > @@ -133,6 +133,9 @@ [FV.FvMain]
> > #
> > # Multiple Console IO support
> > #
> > + INF MdeModulePkg/Universal/Console/ConPlatformDxe/ConPlatformDxe.inf
> > + INF MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitterDxe.inf
> > + INF MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsoleDxe.inf
> > INF MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf
> > INF MdeModulePkg/Universal/SerialDxe/SerialDxe.inf
> >
> > @@ -144,6 +147,9 @@ [FV.FvMain]
> > INF ArmPlatformPkg/Drivers/NorFlashDxe/NorFlashDxe.inf
> > INF OvmfPkg/VirtioBlkDxe/VirtioBlk.inf
> >
> > + # Graphics Output Protocol
> > + INF ArmPlatformPkg/Drivers/LcdGraphicsOutputDxe/LcdGraphicsOutputDxe.inf
> > +
> > INF Platform/ARM/Drivers/BootMonFs/BootMonFs.inf
> > INF MdeModulePkg/Universal/PCD/Dxe/Pcd.inf
> >
> > diff --git a/Platform/ARM/SgiPkg/Library/HdLcdArmSgiLib/HdLcdArmSgiLib.inf b/Platform/ARM/SgiPkg/Library/HdLcdArmSgiLib/HdLcdArmSgiLib.inf
> > new file mode 100644
> > index 000000000000..25efbea5fb83
> > --- /dev/null
> > +++ b/Platform/ARM/SgiPkg/Library/HdLcdArmSgiLib/HdLcdArmSgiLib.inf
> > @@ -0,0 +1,37 @@
> > +#
> > +# Copyright (c) 2018, ARM Limited. All rights reserved.
> > +#
> > +# 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 = HdLcdArmSgiLib
> > + FILE_GUID = 0C77342C-7895-4DE1-A9C8-1DBBFA71AF34
> > + MODULE_TYPE = BASE
> > + VERSION_STRING = 1.0
> > + LIBRARY_CLASS = LcdPlatformLib
> > +
> > +[Sources.common]
> > + HdLcdArmSgi.c
> > +
> > +[Packages]
> > + ArmPkg/ArmPkg.dec
> > + ArmPlatformPkg/ArmPlatformPkg.dec
> > + MdePkg/MdePkg.dec
> > + Platform/ARM/SgiPkg/SgiPlatform.dec
> > +
> > +[LibraryClasses]
> > + BaseLib
> > +
> > +[FixedPcd]
> > + gArmPlatformTokenSpaceGuid.PcdArmHdLcdBase
> > + gArmPlatformTokenSpaceGuid.PcdArmLcdDdrFrameBufferBase
> > + gArmPlatformTokenSpaceGuid.PcdArmLcdDdrFrameBufferSize
> > + gArmPlatformTokenSpaceGuid.PcdGopPixelFormat
> > diff --git a/Platform/ARM/SgiPkg/Include/SgiPlatform.h b/Platform/ARM/SgiPkg/Include/SgiPlatform.h
> > index 550189565752..b9a662ae41a1 100644
> > --- a/Platform/ARM/SgiPkg/Include/SgiPlatform.h
> > +++ b/Platform/ARM/SgiPkg/Include/SgiPlatform.h
> > @@ -56,6 +56,10 @@
> > #define SGI_SUBSYS_GENERIC_GICR_BASE 0x300C0000
> > #define SGI_SUBSYS_GENERIC_GIC_SZ SIZE_1MB
> >
> > +// Expansion AXI - Platform Peripherals - HDLCD1
> > +#define SGI_EXP_PLAT_PERIPH_HDLCD1_BASE 0x7FF60000
> > +#define SGI_EXP_PLAT_PERIPH_HDLCD1_SZ SIZE_64KB
> > +
> > // Expansion AXI - Platform Peripherals - UART0
> > #define SGI_EXP_PLAT_PERIPH_UART0_BASE 0x7FF70000
> > #define SGI_EXP_PLAT_PERIPH_UART0_SZ SIZE_64KB
> > diff --git a/Platform/ARM/SgiPkg/Library/HdLcdArmSgiLib/HdLcdArmSgi.c b/Platform/ARM/SgiPkg/Library/HdLcdArmSgiLib/HdLcdArmSgi.c
> > new file mode 100644
> > index 000000000000..e1793c6d87c9
> > --- /dev/null
> > +++ b/Platform/ARM/SgiPkg/Library/HdLcdArmSgiLib/HdLcdArmSgi.c
> > @@ -0,0 +1,262 @@
> > +/** @file
> > +*
> > +* Copyright (c) 2018, ARM Limited. All rights reserved.
> > +*
> > +* 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 <PiDxe.h>
> > +#include <Library/DebugLib.h>
> > +#include <Library/LcdPlatformLib.h>
> > +#include <Library/PcdLib.h>
> > +#include <Library/UefiBootServicesTableLib.h>
> > +#include <Protocol/Cpu.h>
> > +
> > +typedef struct {
> > + UINT32 OscFreq;
> > + SCAN_TIMINGS Horizontal;
> > + SCAN_TIMINGS Vertical;
> > +} DISPLAY_MODE;
> > +
> > +STATIC DISPLAY_MODE mDisplayModes[] = {
> > + {
> > + // SVGA : 800 x 600 x 24 bpp.
> > + SVGA_OSC_FREQUENCY,
> > + {SVGA_H_RES_PIXELS, SVGA_H_SYNC, SVGA_H_BACK_PORCH, SVGA_H_FRONT_PORCH},
> > + {SVGA_V_RES_PIXELS, SVGA_V_SYNC, SVGA_V_BACK_PORCH, SVGA_V_FRONT_PORCH}
> > + }
> > +};
> > +
> > +STATIC CONST UINT32 mMaxMode = sizeof (mDisplayModes) / sizeof (DISPLAY_MODE);
> > +
>
> Please use ARARY_SIZE() here
>
> > +/** HDLCD platform specific initialization function.
> > +
> > + @param[in] Handle Handle to the LCD device instance.
> > +
> > + @retval EFI_SUCCESS Plaform library initialized successfully.
> > + @retval EFI_UNSUPPORTED PcdGopPixelFormat must be
> > + PixelRedGreenBlueReserved8BitPerColor OR
> > + PixelBlueGreenRedReserved8BitPerColor
> > + any other format is not supported.
> > + @retval !(EFI_SUCCESS) Other errors.
> > +**/
> > +EFI_STATUS
> > +LcdPlatformInitializeDisplay (
> > + IN EFI_HANDLE Handle
> > + )
> > +{
> > + (VOID)Handle;
>
> Drop this please
>
> > + EFI_GRAPHICS_PIXEL_FORMAT PixelFormat;
> > +
> > + // PixelBitMask and PixelBltOnly pixel formats are not supported.
> > + PixelFormat = FixedPcdGet32 (PcdGopPixelFormat);
> > + if (PixelFormat != PixelRedGreenBlueReserved8BitPerColor &&
> > + PixelFormat != PixelBlueGreenRedReserved8BitPerColor) {
> > +
> > + ASSERT (PixelFormat == PixelRedGreenBlueReserved8BitPerColor ||
> > + PixelFormat == PixelBlueGreenRedReserved8BitPerColor);
> > + return EFI_UNSUPPORTED;
> > + }
> > +
> > + return EFI_SUCCESS;
> > +}
> > +
> > +/** Allocate VRAM memory in DRAM for the framebuffer
> > +
> > + The allocated address can be used to set the framebuffer.
> > +
> > + @param[out] VramBaseAddress A pointer to the framebuffer address.
> > + @param[out] VramSize A pointer to the size of the framebuffer
> > + in bytes
> > +
> > + @retval EFI_SUCCESS Framebuffer memory allocated successfully.
> > + @retval !(EFI_SUCCESS) Other errors.
>
> Just say 'other': the boolean negation of EFI_SUCCESS makes no sense here
>
> > +**/
> > +EFI_STATUS
> > +LcdPlatformGetVram (
> > + OUT EFI_PHYSICAL_ADDRESS *VramBaseAddress,
> > + OUT UINTN *VramSize
> > + )
> > +{
> > + EFI_STATUS Status;
> > + EFI_CPU_ARCH_PROTOCOL *Cpu;
> > +
> > + ASSERT (VramBaseAddress != NULL);
> > + ASSERT (VramSize != NULL);
> > +
> > + // Set the VRAM size.
> > + *VramSize = (UINTN)FixedPcdGet32 (PcdArmLcdDdrFrameBufferSize);
> > +
> > + // Check if base address is already reserved for the framebuffer.
> > + *VramBaseAddress =
> > + (EFI_PHYSICAL_ADDRESS)FixedPcdGet64 (PcdArmLcdDdrFrameBufferBase);
> > +
> > + if (*VramBaseAddress == 0) {
> > + // If not already reserved, attempt to allocate the VRAM from the DRAM.
> > + Status = gBS->AllocatePages (
> > + AllocateAnyPages,
> > + EfiReservedMemoryType,
> > + EFI_SIZE_TO_PAGES (*VramSize),
> > + VramBaseAddress);
> > + if (EFI_ERROR (Status)) {
> > + DEBUG ((DEBUG_ERROR, "HdLcdArmSgi: Failed to allocate memory for"
> > + "frame buffer.\n"));
> > + ASSERT_EFI_ERROR (Status);
> > + return Status;
> > + }
> > + }
> > +
> > + // Ensure the Cpu architectural protocol is already installed
> > + Status = gBS->LocateProtocol (
> > + &gEfiCpuArchProtocolGuid,
> > + NULL,
> > + (VOID **)&Cpu);
> > + if (EFI_ERROR (Status)) {
> > + ASSERT_EFI_ERROR (Status);
> > + gBS->FreePages (*VramBaseAddress, EFI_SIZE_TO_PAGES (*VramSize));
> > + return Status;
> > + }
> > +
>
> If you require this protocol, add it to the [depex] section, and drop
> the error handling (but leave the ASSERT())
>
> > + // The VRAM is inside the DRAM, which is cacheable.
> > + // Mark the VRAM as write-combining (uncached) and non-executable.
> > + Status = Cpu->SetMemoryAttributes (
> > + Cpu,
> > + *VramBaseAddress,
> > + *VramSize,
> > + EFI_MEMORY_WC | EFI_MEMORY_XP);
> > + if (EFI_ERROR (Status)) {
> > + ASSERT_EFI_ERROR (Status);
> > + gBS->FreePages (*VramBaseAddress, EFI_SIZE_TO_PAGES (*VramSize));
> > + }
> > +
> > + return Status;
> > +}
> > +
> > +/** Return total number of modes supported.
> > +
> > + @retval UINT32 Mode Number.
> > +**/
> > +UINT32
> > +LcdPlatformGetMaxMode (VOID)
> > +{
> > + return mMaxMode;
> > +}
> > +
> > +/** Set the requested display mode.
> > +
> > + @param[in] ModeNumber Mode Number.
> > +
> > + @retval EFI_SUCCESS Mode set successfully.
> > + @retval EFI_INVALID_PARAMETER Requested mode not found.
> > +**/
> > +EFI_STATUS
> > +LcdPlatformSetMode (
> > + IN UINT32 ModeNumber
> > + )
> > +{
> > + if (ModeNumber >= mMaxMode) {
> > + return EFI_INVALID_PARAMETER;
> > + }
> > +
> > + return EFI_SUCCESS;
> > +}
> > +
> > +/** Return information for the requested mode number.
> > +
> > + @param[in] ModeNumber Mode Number.
> > +
> > + @param[out] Info Pointer for returned mode information
> > + (on success).
> > +
> > + @retval EFI_SUCCESS Mode information for the requested mode
> > + returned successfully.
> > + @retval EFI_INVALID_PARAMETER Requested mode not found.
> > +**/
> > +EFI_STATUS
> > +LcdPlatformQueryMode (
> > + IN UINT32 ModeNumber,
> > + OUT EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info
> > + )
> > +{
> > + if (ModeNumber >= mMaxMode) {
> > + return EFI_INVALID_PARAMETER;
> > + }
> > +
> > + ASSERT (Info != NULL);
> > +
> > + Info->Version = 0;
> > + Info->HorizontalResolution = mDisplayModes[ModeNumber].Horizontal.Resolution;
> > + Info->VerticalResolution = mDisplayModes[ModeNumber].Vertical.Resolution;
> > + Info->PixelsPerScanLine = mDisplayModes[ModeNumber].Horizontal.Resolution;
> > + Info->PixelFormat = FixedPcdGet32 (PcdGopPixelFormat);
> > +
> > + return EFI_SUCCESS;
> > +}
> > +
> > +/** Return display timing information for the requested mode number.
> > +
> > + @param[in] ModeNumber Mode Number.
> > +
> > + @param[out] Horizontal Pointer to horizontal timing parameters.
> > + (Resolution, Sync, Back porch, Front porch)
> > + @param[out] Vertical Pointer to vertical timing parameters.
> > + (Resolution, Sync, Back porch, Front porch)
> > +
> > + @retval EFI_SUCCESS Display timing information for the requested
> > + mode returned successfully.
> > + @retval EFI_INVALID_PARAMETER Requested mode not found.
> > +**/
> > +EFI_STATUS
> > +LcdPlatformGetTimings (
> > + IN UINT32 ModeNumber,
> > + OUT SCAN_TIMINGS **Horizontal,
> > + OUT SCAN_TIMINGS **Vertical
> > + )
> > +{
> > + if (ModeNumber >= mMaxMode) {
> > + return EFI_INVALID_PARAMETER;
> > + }
> > +
> > + ASSERT (Horizontal != NULL);
> > + ASSERT (Vertical != NULL);
> > +
> > + *Horizontal = &mDisplayModes[ModeNumber].Horizontal;
> > + *Vertical = &mDisplayModes[ModeNumber].Vertical;
> > +
> > + // Pretend that clock probing and get timings are successful for SGI FVP
> > + return EFI_SUCCESS;
> > +}
> > +
> > +/** Return bits per pixel information for a mode number.
> > +
> > + @param[in] ModeNumber Mode Number.
> > +
> > + @param[out] Bpp Pointer to bits per pixel information.
> > +
> > + @retval EFI_SUCCESS Bits per pixel information for the requested
> > + mode returned successfully.
> > + @retval EFI_INVALID_PARAMETER Requested mode not found.
> > +**/
> > +EFI_STATUS
> > +LcdPlatformGetBpp (
> > + IN UINT32 ModeNumber,
> > + OUT LCD_BPP *Bpp
> > + )
> > +{
> > + if (ModeNumber >= mMaxMode) {
> > + return EFI_INVALID_PARAMETER;
> > + }
> > +
> > + ASSERT (Bpp != NULL);
> > +
> > + *Bpp = LCD_BITS_PER_PIXEL_24;
> > +
> > + return EFI_SUCCESS;
> > +}
> > diff --git a/Platform/ARM/SgiPkg/Library/PlatformLib/PlatformLibMem.c b/Platform/ARM/SgiPkg/Library/PlatformLib/PlatformLibMem.c
> > index 3314a26e8f41..6ec2e8a7096d 100644
> > --- a/Platform/ARM/SgiPkg/Library/PlatformLib/PlatformLibMem.c
> > +++ b/Platform/ARM/SgiPkg/Library/PlatformLib/PlatformLibMem.c
> > @@ -22,7 +22,7 @@
> > #include <SgiPlatform.h>
> >
> > // Total number of descriptors, including the final "end-of-table" descriptor.
> > -#define MAX_VIRTUAL_MEMORY_MAP_DESCRIPTORS 11
> > +#define MAX_VIRTUAL_MEMORY_MAP_DESCRIPTORS 12
> >
> > /**
> > Returns the Virtual Memory Map of the platform.
> > @@ -104,6 +104,12 @@ ArmPlatformGetVirtualMemoryMap (
> > VirtualMemoryTable[Index].Length = SGI_SUBSYS_GENERIC_GIC_SZ;
> > VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
> >
> > + // Expansion AXI - Platform Peripherals - HDLCD1
> > + VirtualMemoryTable[++Index].PhysicalBase = SGI_EXP_PLAT_PERIPH_HDLCD1_BASE;
> > + VirtualMemoryTable[Index].VirtualBase = SGI_EXP_PLAT_PERIPH_HDLCD1_BASE;
> > + VirtualMemoryTable[Index].Length = SGI_EXP_PLAT_PERIPH_HDLCD1_SZ;
> > + VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
> > +
> > // Expansion AXI - Platform Peripherals - UART1
> > VirtualMemoryTable[++Index].PhysicalBase = SGI_EXP_PLAT_PERIPH_UART1_BASE;
> > VirtualMemoryTable[Index].VirtualBase = SGI_EXP_PLAT_PERIPH_UART1_BASE;
> > --
> > 2.7.4
> >
> _______________________________________________
> edk2-devel mailing list
> edk2-devel@lists.01.org
> https://lists.01.org/mailman/listinfo/edk2-devel
Thanks for the review Ard. Posted a new patch addressing the comments.
Regards,
Vijay.
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2018-12-07 6:14 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-12-06 12:42 [PATCH] Platform/ARM/SgiPkg: Add support for HDLCD Vijayenthiran Subramaniam
2018-12-06 17:07 ` Ard Biesheuvel
2018-12-07 6:13 ` Vijayenthiran Subramaniam
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox