mirror of
https://github.com/CTCaer/hekate
synced 2024-12-22 11:21:23 +00:00
hwinit: add seamless display (L4T Linux/Android)
Initial support is for coreboot based preloading.
This commit is contained in:
parent
345d36287e
commit
28008ac7ac
3 changed files with 26 additions and 5 deletions
|
@ -88,6 +88,7 @@ static void _config_oscillators()
|
||||||
CLOCK(CLK_RST_CONTROLLER_CLK_SYSTEM_RATE) = 2; // Set HCLK div to 1 and PCLK div to 3.
|
CLOCK(CLK_RST_CONTROLLER_CLK_SYSTEM_RATE) = 2; // Set HCLK div to 1 and PCLK div to 3.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// The uart is skipped for Copper, Hoag and Calcio. Used in Icosa, Iowa and Aula.
|
||||||
static void _config_gpios(bool nx_hoag)
|
static void _config_gpios(bool nx_hoag)
|
||||||
{
|
{
|
||||||
// Clamp inputs when tristated.
|
// Clamp inputs when tristated.
|
||||||
|
@ -420,7 +421,7 @@ void hw_init()
|
||||||
bpmp_mmu_enable();
|
bpmp_mmu_enable();
|
||||||
}
|
}
|
||||||
|
|
||||||
void hw_reinit_workaround(bool coreboot, u32 magic)
|
void hw_reinit_workaround(bool coreboot, u32 bl_magic)
|
||||||
{
|
{
|
||||||
// Disable BPMP max clock.
|
// Disable BPMP max clock.
|
||||||
bpmp_clk_rate_set(BPMP_CLK_NORMAL);
|
bpmp_clk_rate_set(BPMP_CLK_NORMAL);
|
||||||
|
@ -462,11 +463,22 @@ void hw_reinit_workaround(bool coreboot, u32 magic)
|
||||||
PMC(APBDEV_PMC_NO_IOPOWER) &= ~(PMC_NO_IOPOWER_SDMMC1_IO_EN);
|
PMC(APBDEV_PMC_NO_IOPOWER) &= ~(PMC_NO_IOPOWER_SDMMC1_IO_EN);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Power off display.
|
// Seamless display or display power off.
|
||||||
|
switch (bl_magic)
|
||||||
|
{
|
||||||
|
case BL_MAGIC_CRBOOT_SLD:;
|
||||||
|
// Set pwm to 0%, switch to gpio mode and restore pwm duty.
|
||||||
|
u32 brightness = display_get_backlight_brightness();
|
||||||
|
display_backlight_brightness(0, 1000);
|
||||||
|
gpio_config(GPIO_PORT_V, GPIO_PIN_0, GPIO_MODE_GPIO);
|
||||||
|
display_backlight_brightness(brightness, 0);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
display_end();
|
display_end();
|
||||||
|
}
|
||||||
|
|
||||||
// Enable clock to USBD and init SDMMC1 to avoid hangs with bad hw inits.
|
// Enable clock to USBD and init SDMMC1 to avoid hangs with bad hw inits.
|
||||||
if (magic == 0xBAADF00D)
|
if (bl_magic == BL_MAGIC_BROKEN_HWI)
|
||||||
{
|
{
|
||||||
CLOCK(CLK_RST_CONTROLLER_CLK_ENB_L_SET) = BIT(CLK_L_USBD);
|
CLOCK(CLK_RST_CONTROLLER_CLK_ENB_L_SET) = BIT(CLK_L_USBD);
|
||||||
sdmmc_init(&sd_sdmmc, SDMMC_1, SDMMC_POWER_3_3, SDMMC_BUS_WIDTH_1, SDHCI_TIMING_SD_ID, 0);
|
sdmmc_init(&sd_sdmmc, SDMMC_1, SDMMC_POWER_3_3, SDMMC_BUS_WIDTH_1, SDHCI_TIMING_SD_ID, 0);
|
||||||
|
|
|
@ -20,6 +20,9 @@
|
||||||
|
|
||||||
#include <utils/types.h>
|
#include <utils/types.h>
|
||||||
|
|
||||||
|
#define BL_MAGIC_CRBOOT_SLD 0x30444C53 // SLD0, seamless display type 0.
|
||||||
|
#define BL_MAGIC_BROKEN_HWI 0xBAADF00D // Broken hwinit.
|
||||||
|
|
||||||
void hw_init();
|
void hw_init();
|
||||||
void hw_reinit_workaround(bool coreboot, u32 magic);
|
void hw_reinit_workaround(bool coreboot, u32 magic);
|
||||||
u32 hw_get_chip_id();
|
u32 hw_get_chip_id();
|
||||||
|
|
|
@ -143,6 +143,7 @@ void check_power_off_from_hos()
|
||||||
#define EXT_PAYLOAD_ADDR 0xC0000000
|
#define EXT_PAYLOAD_ADDR 0xC0000000
|
||||||
#define RCM_PAYLOAD_ADDR (EXT_PAYLOAD_ADDR + ALIGN(PATCHED_RELOC_SZ, 0x10))
|
#define RCM_PAYLOAD_ADDR (EXT_PAYLOAD_ADDR + ALIGN(PATCHED_RELOC_SZ, 0x10))
|
||||||
#define COREBOOT_END_ADDR 0xD0000000
|
#define COREBOOT_END_ADDR 0xD0000000
|
||||||
|
#define COREBOOT_VER_OFF 0x41
|
||||||
#define CBFS_DRAM_EN_ADDR 0x4003e000
|
#define CBFS_DRAM_EN_ADDR 0x4003e000
|
||||||
#define CBFS_DRAM_MAGIC 0x4452414D // "DRAM"
|
#define CBFS_DRAM_MAGIC 0x4452414D // "DRAM"
|
||||||
|
|
||||||
|
@ -268,7 +269,12 @@ int launch_payload(char *path, bool update)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
reloc_patcher(PATCHED_RELOC_ENTRY, EXT_PAYLOAD_ADDR, 0x7000);
|
reloc_patcher(PATCHED_RELOC_ENTRY, EXT_PAYLOAD_ADDR, 0x7000);
|
||||||
hw_reinit_workaround(true, 0);
|
|
||||||
|
// Get coreboot seamless display magic.
|
||||||
|
u32 magic = 0;
|
||||||
|
char *magic_ptr = buf + COREBOOT_VER_OFF;
|
||||||
|
memcpy(&magic, magic_ptr + strlen(magic_ptr) - 4, 4);
|
||||||
|
hw_reinit_workaround(true, magic);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Some cards (Sandisk U1), do not like a fast power cycle. Wait min 100ms.
|
// Some cards (Sandisk U1), do not like a fast power cycle. Wait min 100ms.
|
||||||
|
|
Loading…
Reference in a new issue