/** @file | |
This file contains the platform independent parts of HdLcd | |
Copyright (c) 2011-2018, ARM Ltd. All rights reserved.<BR> | |
SPDX-License-Identifier: BSD-2-Clause-Patent | |
**/ | |
#include <Library/DebugLib.h> | |
#include <Library/IoLib.h> | |
#include <Library/LcdHwLib.h> | |
#include <Library/LcdPlatformLib.h> | |
#include <Library/MemoryAllocationLib.h> | |
#include <Library/PcdLib.h> | |
#include "HdLcd.h" | |
#define BYTES_PER_PIXEL 4 | |
/** Initialize display. | |
@param[in] VramBaseAddress Address of the framebuffer. | |
@retval EFI_SUCCESS Display initialization successful. | |
**/ | |
EFI_STATUS | |
LcdInitialize ( | |
IN EFI_PHYSICAL_ADDRESS VramBaseAddress | |
) | |
{ | |
// Disable the controller | |
MmioWrite32 (HDLCD_REG_COMMAND, HDLCD_DISABLE); | |
// Disable all interrupts | |
MmioWrite32 (HDLCD_REG_INT_MASK, 0); | |
// Define start of the VRAM. This never changes for any graphics mode | |
MmioWrite32 (HDLCD_REG_FB_BASE, (UINT32)VramBaseAddress); | |
// Setup various registers that never change | |
MmioWrite32 (HDLCD_REG_BUS_OPTIONS, (4 << 8) | HDLCD_BURST_8); | |
MmioWrite32 (HDLCD_REG_POLARITIES, HDLCD_DEFAULT_POLARITIES); | |
MmioWrite32 ( | |
HDLCD_REG_PIXEL_FORMAT, | |
HDLCD_LITTLE_ENDIAN | HDLCD_4BYTES_PER_PIXEL | |
); | |
return EFI_SUCCESS; | |
} | |
/** Set requested mode of the display. | |
@param[in] ModeNumber Display mode number. | |
@retval EFI_SUCCESS Display mode set successfully. | |
@retval !(EFI_SUCCESS) Other errors. | |
**/ | |
EFI_STATUS | |
LcdSetMode ( | |
IN UINT32 ModeNumber | |
) | |
{ | |
EFI_STATUS Status; | |
SCAN_TIMINGS *Horizontal; | |
SCAN_TIMINGS *Vertical; | |
EFI_GRAPHICS_PIXEL_FORMAT PixelFormat; | |
EFI_GRAPHICS_OUTPUT_MODE_INFORMATION ModeInfo; | |
// Set the video mode timings and other relevant information | |
Status = LcdPlatformGetTimings ( | |
ModeNumber, | |
&Horizontal, | |
&Vertical | |
); | |
if (EFI_ERROR (Status)) { | |
ASSERT_EFI_ERROR (Status); | |
return Status; | |
} | |
ASSERT (Horizontal != NULL); | |
ASSERT (Vertical != NULL); | |
// Get the pixel format information. | |
Status = LcdPlatformQueryMode (ModeNumber, &ModeInfo); | |
if (EFI_ERROR (Status)) { | |
ASSERT_EFI_ERROR (Status); | |
return Status; | |
} | |
// By default PcdArmHdLcdSwapBlueRedSelect is set to false | |
// However on the Juno platform HW lines for BLUE and RED are swapped | |
// Therefore PcdArmHdLcdSwapBlueRedSelect is set to TRUE for the Juno platform | |
PixelFormat = FixedPcdGetBool (PcdArmHdLcdSwapBlueRedSelect) | |
? PixelRedGreenBlueReserved8BitPerColor | |
: PixelBlueGreenRedReserved8BitPerColor; | |
if (ModeInfo.PixelFormat == PixelFormat) { | |
MmioWrite32 (HDLCD_REG_RED_SELECT, (8 << 8) | 16); | |
MmioWrite32 (HDLCD_REG_BLUE_SELECT, (8 << 8) | 0); | |
} else { | |
MmioWrite32 (HDLCD_REG_BLUE_SELECT, (8 << 8) | 16); | |
MmioWrite32 (HDLCD_REG_RED_SELECT, (8 << 8) | 0); | |
} | |
MmioWrite32 (HDLCD_REG_GREEN_SELECT, (8 << 8) | 8); | |
// Disable the controller | |
MmioWrite32 (HDLCD_REG_COMMAND, HDLCD_DISABLE); | |
// Update the frame buffer information with the new settings | |
MmioWrite32 ( | |
HDLCD_REG_FB_LINE_LENGTH, | |
Horizontal->Resolution * BYTES_PER_PIXEL | |
); | |
MmioWrite32 ( | |
HDLCD_REG_FB_LINE_PITCH, | |
Horizontal->Resolution * BYTES_PER_PIXEL | |
); | |
MmioWrite32 (HDLCD_REG_FB_LINE_COUNT, Vertical->Resolution - 1); | |
// Set the vertical timing information | |
MmioWrite32 (HDLCD_REG_V_SYNC, Vertical->Sync); | |
MmioWrite32 (HDLCD_REG_V_BACK_PORCH, Vertical->BackPorch); | |
MmioWrite32 (HDLCD_REG_V_DATA, Vertical->Resolution - 1); | |
MmioWrite32 (HDLCD_REG_V_FRONT_PORCH, Vertical->FrontPorch); | |
// Set the horizontal timing information | |
MmioWrite32 (HDLCD_REG_H_SYNC, Horizontal->Sync); | |
MmioWrite32 (HDLCD_REG_H_BACK_PORCH, Horizontal->BackPorch); | |
MmioWrite32 (HDLCD_REG_H_DATA, Horizontal->Resolution - 1); | |
MmioWrite32 (HDLCD_REG_H_FRONT_PORCH, Horizontal->FrontPorch); | |
// Enable the controller | |
MmioWrite32 (HDLCD_REG_COMMAND, HDLCD_ENABLE); | |
return EFI_SUCCESS; | |
} | |
/** De-initializes the display. | |
**/ | |
VOID | |
LcdShutdown ( | |
VOID | |
) | |
{ | |
// Disable the controller | |
MmioWrite32 (HDLCD_REG_COMMAND, HDLCD_DISABLE); | |
} | |
/** Check for presence of HDLCD. | |
@retval EFI_SUCCESS Returns success if platform implements a HDLCD | |
controller. | |
@retval EFI_NOT_FOUND HDLCD display controller not found on the | |
platform. | |
**/ | |
EFI_STATUS | |
LcdIdentify ( | |
VOID | |
) | |
{ | |
if ((MmioRead32 (HDLCD_REG_VERSION) >> 16) == HDLCD_PRODUCT_ID) { | |
return EFI_SUCCESS; | |
} | |
return EFI_NOT_FOUND; | |
} |