/** @file This file contains the platform independent parts of PL111Lcd Copyright (c) 2011-2018, ARM Ltd. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include #include #include #include #include #include "PL111Lcd.h" /** Check for presence of PL111. @retval EFI_SUCCESS Returns success if platform implements a PL111 controller. @retval EFI_NOT_FOUND PL111 display controller not found the plaform. **/ EFI_STATUS LcdIdentify ( VOID ) { DEBUG ((DEBUG_WARN, "Probing ID registers at 0x%lx for a PL111\n", PL111_REG_CLCD_PERIPH_ID_0)); // Check if this is a PL111 if (MmioRead8 (PL111_REG_CLCD_PERIPH_ID_0) == PL111_CLCD_PERIPH_ID_0 && MmioRead8 (PL111_REG_CLCD_PERIPH_ID_1) == PL111_CLCD_PERIPH_ID_1 && (MmioRead8 (PL111_REG_CLCD_PERIPH_ID_2) & 0xf) == PL111_CLCD_PERIPH_ID_2 && MmioRead8 (PL111_REG_CLCD_PERIPH_ID_3) == PL111_CLCD_PERIPH_ID_3 && MmioRead8 (PL111_REG_CLCD_P_CELL_ID_0) == PL111_CLCD_P_CELL_ID_0 && MmioRead8 (PL111_REG_CLCD_P_CELL_ID_1) == PL111_CLCD_P_CELL_ID_1 && MmioRead8 (PL111_REG_CLCD_P_CELL_ID_2) == PL111_CLCD_P_CELL_ID_2 && MmioRead8 (PL111_REG_CLCD_P_CELL_ID_3) == PL111_CLCD_P_CELL_ID_3) { return EFI_SUCCESS; } return EFI_NOT_FOUND; } /** Initialize display. @param[in] VramBaseAddress Address of the framebuffer. @retval EFI_SUCCESS Initialization of display successful. **/ EFI_STATUS LcdInitialize ( IN EFI_PHYSICAL_ADDRESS VramBaseAddress ) { // Define start of the VRAM. This never changes for any graphics mode MmioWrite32 (PL111_REG_LCD_UP_BASE, (UINT32)VramBaseAddress); MmioWrite32 (PL111_REG_LCD_LP_BASE, 0); // We are not using a double buffer // Disable all interrupts from the PL111 MmioWrite32 (PL111_REG_LCD_IMSC, 0); return EFI_SUCCESS; } /** Set requested mode of the display. @param[in] ModeNumbe Display mode number. @retval EFI_SUCCESS Display mode set successfuly. @retval !(EFI_SUCCESS) Other errors. **/ EFI_STATUS LcdSetMode ( IN UINT32 ModeNumber ) { EFI_STATUS Status; SCAN_TIMINGS *Horizontal; SCAN_TIMINGS *Vertical; UINT32 LcdControl; LCD_BPP LcdBpp; 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); Status = LcdPlatformGetBpp (ModeNumber, &LcdBpp); if (EFI_ERROR (Status)) { ASSERT_EFI_ERROR (Status); return Status; } // Get the pixel format information Status = LcdPlatformQueryMode (ModeNumber, &ModeInfo); if (EFI_ERROR (Status)) { ASSERT_EFI_ERROR (Status); return Status; } // Disable the CLCD_LcdEn bit MmioAnd32 (PL111_REG_LCD_CONTROL, ~PL111_CTRL_LCD_EN); // Set Timings MmioWrite32 ( PL111_REG_LCD_TIMING_0, HOR_AXIS_PANEL ( Horizontal->BackPorch, Horizontal->FrontPorch, Horizontal->Sync, Horizontal->Resolution ) ); MmioWrite32 ( PL111_REG_LCD_TIMING_1, VER_AXIS_PANEL ( Vertical->BackPorch, Vertical->FrontPorch, Vertical->Sync, Vertical->Resolution ) ); MmioWrite32 ( PL111_REG_LCD_TIMING_2, CLK_SIG_POLARITY (Horizontal->Resolution) ); MmioWrite32 (PL111_REG_LCD_TIMING_3, 0); // PL111_REG_LCD_CONTROL LcdControl = PL111_CTRL_LCD_EN | PL111_CTRL_LCD_BPP (LcdBpp) | PL111_CTRL_LCD_TFT | PL111_CTRL_LCD_PWR; if (ModeInfo.PixelFormat == PixelBlueGreenRedReserved8BitPerColor) { LcdControl |= PL111_CTRL_BGR; } MmioWrite32 (PL111_REG_LCD_CONTROL, LcdControl); return EFI_SUCCESS; } /** De-initializes the display. */ VOID LcdShutdown ( VOID ) { // Disable the controller MmioAnd32 (PL111_REG_LCD_CONTROL, ~PL111_CTRL_LCD_EN); }