/* SPDX-License-Identifier: GPL-2.0-only */ #include <bootblock_common.h> #include <console/console.h> #include <delay.h> #include <gpio.h> #include "include/ec.h" #include "include/gpio.h" #define ADC_3V_10BIT_GRANULARITY_MAX (3005 / 1023) #define PCB_VER_AD 1 #define MODEL_ID_AD 3 #define DGPU_PRESENT GPP_A20 /* Active low */ #define DGPU_HOLD_RST GPP_B4 /* Active low */ #define DGPU_PWR_EN GPP_B21 /* Active low */ /* TODO/NB: Detection is still unreliable. Is a wait required? */ static void board_detect(void) { printk(BIOS_DEBUG, "Mainboard: Detecting board SKU\n"); uint16_t data_buffer = read_ec_adc_converter(MODEL_ID_AD); printk(BIOS_DEBUG, "BoardId (raw) = 0x%x\n", data_buffer); printk(BIOS_DEBUG, "BoardId: "); /* Board by max millivoltage range (of 10-bit, 3.005 V ADC) */ if (data_buffer <= (1374 / ADC_3V_10BIT_GRANULARITY_MAX)) { printk(BIOS_ERR, "Reserved?\n"); } else if (data_buffer <= (2017 / ADC_3V_10BIT_GRANULARITY_MAX)) { printk(BIOS_DEBUG, "Aspire VN7-792G (Newgate-SLS_dGPU)\n"); printk(BIOS_CRIT, "WARNING: This board is unsupported!\n"); printk(BIOS_CRIT, "Damage may result from programming incorrect GPIO table!\n"); } else if (data_buffer <= (2259 / ADC_3V_10BIT_GRANULARITY_MAX)) { printk(BIOS_DEBUG, "Aspire VN7-592G (Rayleigh-SLS_960M)\n"); printk(BIOS_CRIT, "WARNING: This board is unsupported!\n"); printk(BIOS_CRIT, "Damage may result from programming incorrect GPIO table!\n"); } else { printk(BIOS_DEBUG, "Aspire VN7-572G (Rayleigh-SL_dGPU)\n"); } data_buffer = read_ec_adc_converter(PCB_VER_AD); printk(BIOS_DEBUG, "PCB version (raw) = 0x%x\n", data_buffer); printk(BIOS_DEBUG, "PCB version: "); /* PCB by max millivoltage range (of 10-bit, 3.005 V ADC) */ if (data_buffer <= (2017 / ADC_3V_10BIT_GRANULARITY_MAX)) { printk(BIOS_ERR, "Reserved?\n"); } else if (data_buffer <= (2259 / ADC_3V_10BIT_GRANULARITY_MAX)) { printk(BIOS_DEBUG, "-1\n"); } else if (data_buffer <= (2493 / ADC_3V_10BIT_GRANULARITY_MAX)) { printk(BIOS_DEBUG, "SC\n"); } else if (data_buffer <= (2759 / ADC_3V_10BIT_GRANULARITY_MAX)) { printk(BIOS_DEBUG, "SB\n"); } else { printk(BIOS_DEBUG, "SA\n"); } } static void dgpu_power_on(void) { if (!gpio_get(DGPU_PRESENT)) { printk(BIOS_DEBUG, "dGPU present, enable power...\n"); gpio_set(DGPU_HOLD_RST, 0); // Assert dGPU_HOLD_RST# mdelay(2); gpio_set(DGPU_PWR_EN, 0); // Assert dGPU_PWR_EN# mdelay(7); gpio_set(DGPU_HOLD_RST, 1); // Deassert dGPU_HOLD_RST# mdelay(30); } else { printk(BIOS_DEBUG, "dGPU not present, disable power...\n"); gpio_set(DGPU_HOLD_RST, 0); // Assert dGPU_HOLD_RST# gpio_set(DGPU_PWR_EN, 1); // Deassert dGPU_PWR_EN# } } void bootblock_mainboard_init(void) { /* NB: Relocated from _early_init() so that debug logging works. * However, if we use this to ensure that the user flashed the correct * (future) variant, this must occur before any GPIOs are programmed. */ board_detect(); dgpu_power_on(); } void bootblock_mainboard_early_init(void) { mainboard_config_stage_gpios(); }