void fill_lb_gpios(struct lb_gpios *gpios) { device_t dev = dev_find_slot(0, PCI_DEVFN(0x1f,0)); u16 gpio_base = pci_read_config32(dev, GPIOBASE) & 0xfffe; if (!gpio_base) return; u32 gp_lvl = inl(gpio_base + GP_LVL); gpios->size = sizeof(*gpios) + (GPIO_COUNT * sizeof(struct lb_gpio)); gpios->count = GPIO_COUNT; /* Write Protect: GPIO7 */ gpios->gpios[0].port = 7; gpios->gpios[0].polarity = ACTIVE_LOW; gpios->gpios[0].value = (gp_lvl >> 7) & 1; strncpy((char *)gpios->gpios[0].name,"write protect", GPIO_MAX_NAME_LENGTH); /* Recovery: Virtual switch */ gpios->gpios[1].port = -1; gpios->gpios[1].polarity = ACTIVE_HIGH; gpios->gpios[1].value = get_recovery_mode_switch(); strncpy((char *)gpios->gpios[1].name,"recovery", GPIO_MAX_NAME_LENGTH); /* Developer: Virtual switch */ gpios->gpios[2].port = -1; gpios->gpios[2].polarity = ACTIVE_HIGH; gpios->gpios[2].value = get_developer_mode_switch(); strncpy((char *)gpios->gpios[2].name,"developer", GPIO_MAX_NAME_LENGTH); /* Lid Switch: Virtual switch */ gpios->gpios[3].port = -1; gpios->gpios[3].polarity = ACTIVE_HIGH; gpios->gpios[3].value = 1; /* Hard-code to open */ strncpy((char *)gpios->gpios[3].name,"lid", GPIO_MAX_NAME_LENGTH); /* Power Button: Virtual switch */ gpios->gpios[4].port = -1; gpios->gpios[4].polarity = ACTIVE_HIGH; gpios->gpios[4].value = 0; /* Hard-code to de-asserted */ strncpy((char *)gpios->gpios[4].name,"power", GPIO_MAX_NAME_LENGTH); /* Was VGA Option ROM loaded? */ gpios->gpios[5].port = -1; /* Indicate that this is a pseudo GPIO */ gpios->gpios[5].polarity = ACTIVE_HIGH; gpios->gpios[5].value = gfx_get_init_done(); strncpy((char *)gpios->gpios[5].name,"oprom", GPIO_MAX_NAME_LENGTH); /* EC is in RW mode when it isn't in recovery mode. */ gpios->gpios[6].port = -1; gpios->gpios[6].polarity = ACTIVE_HIGH; gpios->gpios[6].value = !get_recovery_mode_switch(); strncpy((char *)gpios->gpios[6].name,"ec_in_rw", GPIO_MAX_NAME_LENGTH); }
void fill_lb_gpios(struct lb_gpios *gpios) { gpios->size = sizeof(*gpios) + (GPIO_COUNT * sizeof(struct lb_gpio)); gpios->count = GPIO_COUNT; /* Write Protect: GPIO7 */ gpios->gpios[0].port = 7; gpios->gpios[0].polarity = ACTIVE_LOW; gpios->gpios[0].value = !get_write_protect_state(); strncpy((char *)gpios->gpios[0].name,"write protect", GPIO_MAX_NAME_LENGTH); /* Recovery: Virtual switch */ gpios->gpios[1].port = -1; gpios->gpios[1].polarity = ACTIVE_HIGH; gpios->gpios[1].value = get_recovery_mode_switch(); strncpy((char *)gpios->gpios[1].name,"recovery", GPIO_MAX_NAME_LENGTH); /* Developer: Virtual switch */ gpios->gpios[2].port = -1; gpios->gpios[2].polarity = ACTIVE_HIGH; gpios->gpios[2].value = get_developer_mode_switch(); strncpy((char *)gpios->gpios[2].name,"developer", GPIO_MAX_NAME_LENGTH); /* Lid Switch: Virtual switch */ gpios->gpios[3].port = -1; gpios->gpios[3].polarity = ACTIVE_HIGH; gpios->gpios[3].value = get_lid_switch(); strncpy((char *)gpios->gpios[3].name,"lid", GPIO_MAX_NAME_LENGTH); /* Power Button: Virtual switch */ gpios->gpios[4].port = -1; gpios->gpios[4].polarity = ACTIVE_HIGH; gpios->gpios[4].value = 0; /* Hard-code to de-asserted */ strncpy((char *)gpios->gpios[4].name,"power", GPIO_MAX_NAME_LENGTH); /* Was VGA Option ROM loaded? */ gpios->gpios[5].port = -1; /* Indicate that this is a pseudo GPIO */ gpios->gpios[5].polarity = ACTIVE_HIGH; gpios->gpios[5].value = gfx_get_init_done(); strncpy((char *)gpios->gpios[5].name,"oprom", GPIO_MAX_NAME_LENGTH); /* EC is in RW mode when it isn't in recovery mode. */ gpios->gpios[6].port = -1; gpios->gpios[6].polarity = ACTIVE_HIGH; gpios->gpios[6].value = !get_recovery_mode_switch(); strncpy((char *)gpios->gpios[6].name,"ec_in_rw", GPIO_MAX_NAME_LENGTH); }
/* * vb2_check_recovery_request looks up different components to identify if there * is a recovery request and returns appropriate reason code: * 1. Checks if recovery mode is initiated by EC. If yes, returns * VB2_RECOVERY_RO_MANUAL. * 2. Checks if recovery request is present in VBNV and returns the code read * from it. * 3. Checks recovery request in handoff for stages post-cbmem. * 4. For non-CBMEM stages, check if vboot verification is done and look-up * selected region to identify if vboot_refence library has requested recovery * path. If yes, return the reason code from shared data. * 5. If nothing applies, return 0 indicating no recovery request. */ int vboot_check_recovery_request(void) { int reason = 0; /* EC-initiated recovery. */ if (get_recovery_mode_switch()) return VB2_RECOVERY_RO_MANUAL; /* Recovery request in VBNV. */ if ((reason = get_recovery_mode_from_vbnv()) != 0) return reason; /* * Check recovery flag in vboot_handoff for stages post CBMEM coming * online. Since for some stages there is no way to know if cbmem has * already come online, try looking up handoff anyways. If it fails, * flow will fallback to looking up shared data. */ if (cbmem_possibly_online() && ((reason = vboot_handoff_get_recovery_reason()) != 0)) return reason; /* * For stages where CBMEM might not be online, identify if vboot * verification is already complete and no slot was selected * i.e. recovery path was requested. */ if (vboot_possibly_executed() && vb2_logic_executed() && !vb2_is_slot_selected()) return vb2_get_recovery_reason_shared_data(); return 0; }
void fill_lb_gpios(struct lb_gpios *gpios) { int count = 0; /* Write Protect: active low */ gpios->gpios[count].port = WRITE_PROTECT_L; gpios->gpios[count].polarity = ACTIVE_LOW; gpios->gpios[count].value = gpio_get(WRITE_PROTECT_L); strncpy((char *)gpios->gpios[count].name, "write protect", GPIO_MAX_NAME_LENGTH); count++; /* Recovery: active high */ gpios->gpios[count].port = -1; gpios->gpios[count].polarity = ACTIVE_HIGH; gpios->gpios[count].value = get_recovery_mode_switch(); strncpy((char *)gpios->gpios[count].name, "recovery", GPIO_MAX_NAME_LENGTH); count++; /* TODO(adurbin): add lid switch */ /* Power: active low / high depending on board id */ gpios->gpios[count].port = POWER_BUTTON; gpios->gpios[count].polarity = get_pwr_btn_polarity(); gpios->gpios[count].value = -1; strncpy((char *)gpios->gpios[count].name, "power", GPIO_MAX_NAME_LENGTH); count++; /* Developer: virtual GPIO active high */ gpios->gpios[count].port = -1; gpios->gpios[count].polarity = ACTIVE_HIGH; gpios->gpios[count].value = get_developer_mode_switch(); strncpy((char *)gpios->gpios[count].name, "developer", GPIO_MAX_NAME_LENGTH); count++; /* EC in RW: active high */ gpios->gpios[count].port = EC_IN_RW; gpios->gpios[count].polarity = ACTIVE_HIGH; gpios->gpios[count].value = -1; strncpy((char *)gpios->gpios[count].name, "EC in RW", GPIO_MAX_NAME_LENGTH); count++; /* Reset: active low (output) */ gpios->gpios[count].port = AP_SYS_RESET_L; gpios->gpios[count].polarity = ACTIVE_LOW; gpios->gpios[count].value = -1; strncpy((char *)gpios->gpios[count].name, "reset", GPIO_MAX_NAME_LENGTH); count++; gpios->size = sizeof(*gpios) + (count * sizeof(struct lb_gpio)); gpios->count = count; printk(BIOS_ERR, "Added %d GPIOS size %d\n", count, gpios->size); }
void fill_lb_gpios(struct lb_gpios *gpios) { struct lb_gpio chromeos_gpios[] = { {58, ACTIVE_HIGH, 0, "write protect"}, {-1, ACTIVE_HIGH, get_recovery_mode_switch(), "recovery"}, {-1, ACTIVE_HIGH, get_lid_switch(), "lid"}, {-1, ACTIVE_HIGH, 0, "power"}, {-1, ACTIVE_HIGH, gfx_get_init_done(), "oprom"}, }; lb_add_gpios(gpios, chromeos_gpios, ARRAY_SIZE(chromeos_gpios)); }
void fill_lb_gpios(struct lb_gpios *gpios) { struct lb_gpio chromeos_gpios[] = { {GPIO(R1), ACTIVE_LOW, gpio_get(GPIO(R1)), "write protect"}, {-1, ACTIVE_HIGH, get_recovery_mode_switch(), "recovery"}, {GPIO(R4), ACTIVE_HIGH, -1, "lid"}, {GPIO(Q0), ACTIVE_LOW, -1, "power"}, {GPIO(U4), ACTIVE_HIGH, -1, "EC in RW"}, {GPIO(I5), ACTIVE_LOW, -1, "reset"}, }; lb_add_gpios(gpios, chromeos_gpios, ARRAY_SIZE(chromeos_gpios)); }
void fill_lb_gpios(struct lb_gpios *gpios) { struct lb_gpio chromeos_gpios[] = { {GPIO_WP.id, ACTIVE_LOW, !get_write_protect_state(), "write protect"}, {-1, ACTIVE_HIGH, get_recovery_mode_switch(), "recovery"}, {EC_IN_RW.id, ACTIVE_HIGH, -1, "EC in RW"}, {EC_IRQ.id, ACTIVE_LOW, -1, "EC interrupt"}, {CR50_IRQ.id, ACTIVE_HIGH, -1, "TPM interrupt"}, }; lb_add_gpios(gpios, chromeos_gpios, ARRAY_SIZE(chromeos_gpios)); }
void fill_lb_gpios(struct lb_gpios *gpios) { struct lb_gpio chromeos_gpios[] = { {-1, ACTIVE_HIGH, get_write_protect_state(), "write protect"}, {-1, ACTIVE_HIGH, get_recovery_mode_switch(), "recovery"}, {-1, ACTIVE_HIGH, get_lid_switch(), "lid"}, {-1, ACTIVE_HIGH, 0, "power"}, {-1, ACTIVE_HIGH, gfx_get_init_done(), "oprom"}, {GPIO_EC_IN_RW, ACTIVE_HIGH, gpio_get(GPIO_EC_IN_RW), "EC in RW"}, }; lb_add_gpios(gpios, chromeos_gpios, ARRAY_SIZE(chromeos_gpios)); }
void fill_lb_gpios(struct lb_gpios *gpios) { struct lb_gpio chromeos_gpios[] = { {WRITE_PROTECT_L, ACTIVE_LOW, gpio_get(WRITE_PROTECT_L), "write protect"}, {-1, ACTIVE_HIGH, get_recovery_mode_switch(), "recovery"}, {POWER_BUTTON, ACTIVE_LOW, -1, "power"}, {-1, ACTIVE_HIGH, get_developer_mode_switch(), "developer"}, {EC_IN_RW, ACTIVE_HIGH, -1, "EC in RW"}, {AP_SYS_RESET_L, ACTIVE_LOW, -1, "reset"}, }; lb_add_gpios(gpios, chromeos_gpios, ARRAY_SIZE(chromeos_gpios)); }
void fill_lb_gpios(struct lb_gpios *gpios) { struct lb_gpio chromeos_gpios[] = { {GPIO_SPI_WP, ACTIVE_HIGH, get_gpio(GPIO_SPI_WP), "write protect"}, {GPIO_REC_MODE, ACTIVE_LOW, get_recovery_mode_switch(), "recovery"}, {-1, ACTIVE_HIGH, 1, "lid"}, {-1, ACTIVE_HIGH, 0, "power"}, {-1, ACTIVE_HIGH, gfx_get_init_done(), "oprom"}, }; lb_add_gpios(gpios, chromeos_gpios, ARRAY_SIZE(chromeos_gpios)); }
void fill_lb_gpios(struct lb_gpios *gpios) { device_t dev = dev_find_slot(0, PCI_DEVFN(0x1f,0)); u16 gpio_base = pci_read_config32(dev, GPIOBASE) & 0xfffe; //u16 gen_pmcon_1 = pci_read_config32(dev, GEN_PMCON_1); if (!gpio_base) return; u32 gp_lvl2 = inl(gpio_base + 0x38); gpios->size = sizeof(*gpios) + (GPIO_COUNT * sizeof(struct lb_gpio)); gpios->count = GPIO_COUNT; /* Write Protect: GPIO57 = PCH_SPI_WP_D */ gpios->gpios[0].port = 57; gpios->gpios[0].polarity = ACTIVE_HIGH; gpios->gpios[0].value = (gp_lvl2 >> (57 - 32)) & 1; strncpy((char *)gpios->gpios[0].name,"write protect", GPIO_MAX_NAME_LENGTH); /* Recovery: the "switch" comes from the EC */ gpios->gpios[1].port = -1; /* Indicate that this is a pseudo GPIO */ gpios->gpios[1].polarity = ACTIVE_HIGH; gpios->gpios[1].value = get_recovery_mode_switch(); strncpy((char *)gpios->gpios[1].name,"recovery", GPIO_MAX_NAME_LENGTH); /* Lid: the "switch" comes from the EC */ gpios->gpios[2].port = -1; gpios->gpios[2].polarity = ACTIVE_HIGH; gpios->gpios[2].value = get_lid_switch(); strncpy((char *)gpios->gpios[2].name,"lid", GPIO_MAX_NAME_LENGTH); /* Power Button: hard-coded as not pressed; we'll detect later presses * via SMI. */ gpios->gpios[3].port = -1; gpios->gpios[3].polarity = ACTIVE_HIGH; gpios->gpios[3].value = 0; strncpy((char *)gpios->gpios[3].name,"power", GPIO_MAX_NAME_LENGTH); /* Developer: a tricky case on Link, there is no switch */ gpios->gpios[4].port = -1; /* Indicate that this is a pseudo GPIO */ gpios->gpios[4].polarity = ACTIVE_HIGH; gpios->gpios[4].value = get_developer_mode_switch(); strncpy((char *)gpios->gpios[4].name,"developer", GPIO_MAX_NAME_LENGTH); /* Did we load the VGA Option ROM? */ gpios->gpios[5].port = -1; /* Indicate that this is a pseudo GPIO */ gpios->gpios[5].polarity = ACTIVE_HIGH; gpios->gpios[5].value = oprom_is_loaded; strncpy((char *)gpios->gpios[5].name,"oprom", GPIO_MAX_NAME_LENGTH); }
void fill_lb_gpios(struct lb_gpios *gpios) { struct lb_gpio chromeos_gpios[] = { {GPIO_WP.raw, ACTIVE_LOW, gpio_get(GPIO_WP), "write protect"}, /* Note for early development, we want to support both servo * and pushkey recovery buttons in firmware boot stages. */ {GPIO_RECOVERY_PUSHKEY.raw, ACTIVE_LOW, !get_recovery_mode_switch(), "recovery"}, {GPIO_POWER.raw, ACTIVE_LOW, -1, "power"}, {-1, ACTIVE_HIGH, get_developer_mode_switch(), "developer"}, {GPIO_RESET.raw, ACTIVE_HIGH, -1, "reset"}, }; lb_add_gpios(gpios, chromeos_gpios, ARRAY_SIZE(chromeos_gpios)); }
void fill_lb_gpios(struct lb_gpios *gpios) { struct lb_gpio chromeos_gpios[] = { {GPIO_WP.raw, ACTIVE_HIGH, get_write_protect_state(), "write protect"}, {-1, ACTIVE_HIGH, get_recovery_mode_switch(), "recovery"}, {GPIO_BACKLIGHT.raw, ACTIVE_HIGH, -1, "backlight"}, {GPIO_EC_IN_RW.raw, ACTIVE_HIGH, -1, "EC in RW"}, {GPIO_EC_IRQ.raw, ACTIVE_LOW, -1, "EC interrupt"}, {GPIO_RESET.raw, ACTIVE_HIGH, -1, "reset"}, }; lb_add_gpios(gpios, chromeos_gpios, ARRAY_SIZE(chromeos_gpios)); }
/* * This is called in multiple places and has to detect * recovery mode triggered from the EC and via shared * recovery reason set with crossystem. * * If shared recovery reason is set: * - before VbInit then get_recovery_mode_from_vbnv() is true * - after VbInit then vboot_enable_recovery() is true * * Otherwise the mainboard handler for get_recovery_mode_switch() * will detect recovery mode initiated by the EC. */ int recovery_mode_enabled(void) { if (get_recovery_mode_switch()) return 1; #if CONFIG_CHROMEOS if (get_recovery_mode_from_vbnv()) return 1; #endif #if CONFIG_VBOOT_VERIFY_FIRMWARE if (vboot_enable_recovery()) return 1; #endif return 0; }
void fill_lb_gpios(struct lb_gpios *gpios) { int count = 0; /* Write Protect: active low */ gpios->gpios[count].port = EXYNOS5_GPX3; gpios->gpios[count].polarity = ACTIVE_LOW; gpios->gpios[count].value = gpio_get_value(GPIO_X30); // WP_GPIO strncpy((char *)gpios->gpios[count].name, "write protect", GPIO_MAX_NAME_LENGTH); count++; /* Recovery: active low */ gpios->gpios[count].port = -1; gpios->gpios[count].polarity = ACTIVE_HIGH; gpios->gpios[count].value = get_recovery_mode_switch(); strncpy((char *)gpios->gpios[count].name, "recovery", GPIO_MAX_NAME_LENGTH); count++; /* Lid: active high */ gpios->gpios[count].port = EXYNOS5_GPX3; gpios->gpios[count].polarity = ACTIVE_HIGH; gpios->gpios[count].value = gpio_get_value(GPIO_X34); // LID_GPIO strncpy((char *)gpios->gpios[count].name, "lid", GPIO_MAX_NAME_LENGTH); count++; /* Power: virtual GPIO active low */ gpios->gpios[count].port = EXYNOS5_GPX1; gpios->gpios[count].polarity = ACTIVE_LOW; gpios->gpios[count].value = gpio_get_value(GPIO_X12); // POWER_GPIO strncpy((char *)gpios->gpios[count].name, "power", GPIO_MAX_NAME_LENGTH); count++; /* Developer: virtual GPIO active high */ gpios->gpios[count].port = -1; gpios->gpios[count].polarity = ACTIVE_HIGH; gpios->gpios[count].value = get_developer_mode_switch(); strncpy((char *)gpios->gpios[count].name, "developer", GPIO_MAX_NAME_LENGTH); count++; gpios->size = sizeof(*gpios) + (count * sizeof(struct lb_gpio)); gpios->count = count; printk(BIOS_ERR, "Added %d GPIOS size %d\n", count, gpios->size); }
void fill_lb_gpios(struct lb_gpios *gpios) { device_t dev = dev_find_slot(0, PCI_DEVFN(0x1f,0)); u16 gen_pmcon_1 = pci_read_config32(dev, GEN_PMCON_1); gpios->size = sizeof(*gpios) + (GPIO_COUNT * sizeof(struct lb_gpio)); gpios->count = GPIO_COUNT; /* Write Protect: GPIO68 = CHP3_SPI_WP */ gpios->gpios[0].port = GPIO_SPI_WP; gpios->gpios[0].polarity = ACTIVE_HIGH; gpios->gpios[0].value = (pci_read_config32(dev_find_slot(0, PCI_DEVFN(0x1f, 2)), SATA_SP) >> FLAG_SPI_WP) & 1; strncpy((char *)gpios->gpios[0].name,"write protect", GPIO_MAX_NAME_LENGTH); /* Recovery: GPIO42 = CHP3_REC_MODE# */ gpios->gpios[1].port = GPIO_REC_MODE; gpios->gpios[1].polarity = ACTIVE_LOW; gpios->gpios[1].value = !get_recovery_mode_switch(); strncpy((char *)gpios->gpios[1].name,"recovery", GPIO_MAX_NAME_LENGTH); /* Developer: GPIO17 = KBC3_DVP_MODE */ gpios->gpios[2].port = GPIO_DEV_MODE; gpios->gpios[2].polarity = ACTIVE_HIGH; gpios->gpios[2].value = get_developer_mode_switch(); strncpy((char *)gpios->gpios[2].name,"developer", GPIO_MAX_NAME_LENGTH); /* Hard code the lid switch GPIO to open. */ gpios->gpios[3].port = 100; gpios->gpios[3].polarity = ACTIVE_HIGH; gpios->gpios[3].value = 1; strncpy((char *)gpios->gpios[3].name,"lid", GPIO_MAX_NAME_LENGTH); /* Power Button */ gpios->gpios[4].port = 101; gpios->gpios[4].polarity = ACTIVE_LOW; gpios->gpios[4].value = (gen_pmcon_1 >> 9) & 1; strncpy((char *)gpios->gpios[4].name,"power", GPIO_MAX_NAME_LENGTH); /* Did we load the VGA Option ROM? */ gpios->gpios[5].port = -1; /* Indicate that this is a pseudo GPIO */ gpios->gpios[5].polarity = ACTIVE_HIGH; gpios->gpios[5].value = oprom_is_loaded; strncpy((char *)gpios->gpios[5].name,"oprom", GPIO_MAX_NAME_LENGTH); }
void fill_lb_gpios(struct lb_gpios *gpios) { struct lb_gpio *gpio; gpios->size = sizeof(*gpios) + (GPIO_COUNT * sizeof(struct lb_gpio)); gpios->count = GPIO_COUNT; gpio = gpios->gpios; fill_lb_gpio(gpio++, GPIO_SPI_WP, ACTIVE_HIGH, "write protect", 0); fill_lb_gpio(gpio++, GPIO_REC_MODE, ACTIVE_LOW, "recovery", get_recovery_mode_switch()); fill_lb_gpio(gpio++, -1, ACTIVE_HIGH, "developer", get_developer_mode_switch()); fill_lb_gpio(gpio++, -1, ACTIVE_HIGH, "lid", 1); fill_lb_gpio(gpio++, -1, ACTIVE_HIGH, "power", 0); fill_lb_gpio(gpio++, -1, ACTIVE_HIGH, "oprom", gfx_get_init_done()); }
int recovery_mode_enabled(void) { /* * This is called in multiple places and has to detect * recovery mode triggered from the EC and via shared * recovery reason set with crossystem. * * If shared recovery reason is set: * - before VbInit then get_recovery_mode_from_vbnv() is true * - after VbInit then vboot_enable_recovery() is true * * Otherwise the mainboard handler for get_recovery_mode_switch() * will detect recovery mode initiated by the EC. */ return get_recovery_mode_switch() || get_recovery_mode_from_vbnv() || vboot_enable_recovery(); }
void fill_lb_gpios(struct lb_gpios *gpios) { struct lb_gpio *gpio; gpios->size = sizeof(*gpios) + (GPIO_COUNT * sizeof(struct lb_gpio)); gpios->count = GPIO_COUNT; gpio = gpios->gpios; fill_lb_gpio(gpio++, 58, ACTIVE_HIGH, "write protect", 0); fill_lb_gpio(gpio++, -1, ACTIVE_HIGH, "recovery", get_recovery_mode_switch()); fill_lb_gpio(gpio++, -1, ACTIVE_HIGH, "developer", get_developer_mode_switch()); fill_lb_gpio(gpio++, -1, ACTIVE_HIGH, "lid", get_lid_switch()); fill_lb_gpio(gpio++, -1, ACTIVE_HIGH, "power", 0); fill_lb_gpio(gpio++, -1, ACTIVE_HIGH, "oprom", oprom_is_loaded); }
void fill_lb_gpios(struct lb_gpios *gpios) { int count = 0; /* TBD([email protected]): Any analogs for these on Foster-FFD? */ /* Write Protect: active low */ gpios->gpios[count].port = -1; gpios->gpios[count].polarity = ACTIVE_LOW; gpios->gpios[count].value = get_write_protect_state(); strncpy((char *)gpios->gpios[count].name, "write protect", GPIO_MAX_NAME_LENGTH); count++; /* Recovery: active high */ gpios->gpios[count].port = -1; gpios->gpios[count].polarity = ACTIVE_HIGH; gpios->gpios[count].value = get_recovery_mode_switch(); strncpy((char *)gpios->gpios[count].name, "recovery", GPIO_MAX_NAME_LENGTH); count++; /* TODO: Power: active low / high depending on board id */ gpios->gpios[count].port = GPIO(X5); gpios->gpios[count].polarity = ACTIVE_LOW; gpios->gpios[count].value = -1; strncpy((char *)gpios->gpios[count].name, "power", GPIO_MAX_NAME_LENGTH); count++; /* TODO: Reset: active low (output) */ gpios->gpios[count].port = GPIO(I5); gpios->gpios[count].polarity = ACTIVE_LOW; gpios->gpios[count].value = -1; strncpy((char *)gpios->gpios[count].name, "reset", GPIO_MAX_NAME_LENGTH); count++; gpios->size = sizeof(*gpios) + (count * sizeof(struct lb_gpio)); gpios->count = count; printk(BIOS_ERR, "Added %d GPIOS size %d\n", count, gpios->size); }
void fill_lb_gpios(struct lb_gpios *gpios) { struct lb_gpio chromeos_gpios[] = { /* Write Protect: GPIO48 */ {48, ACTIVE_LOW, !get_write_protect_state(), "write protect"}, /* Recovery: GPIO22 */ {22, ACTIVE_LOW, !get_recovery_mode_switch(), "recovery"}, /* Hard code the lid switch GPIO to open. */ {-1, ACTIVE_HIGH, 1, "lid"}, /* Power Button */ {-1, ACTIVE_HIGH, 0, "power"}, /* Did we load the VGA option ROM? */ {-1, ACTIVE_HIGH, gfx_get_init_done(), "oprom"}, }; lb_add_gpios(gpios, chromeos_gpios, ARRAY_SIZE(chromeos_gpios)); }
void fill_lb_gpios(struct lb_gpios *gpios) { struct lb_gpio *start_gpio = gpios->gpios; struct lb_gpio *gpio = start_gpio; fill_lb_gpio(gpio++, -1, ACTIVE_HIGH, "write protect", get_write_protect_state()); fill_lb_gpio(gpio++, -1, ACTIVE_HIGH, "recovery", get_recovery_mode_switch()); fill_lb_gpio(gpio++, -1, ACTIVE_HIGH, "developer", get_developer_mode_switch()); fill_lb_gpio(gpio++, -1, ACTIVE_HIGH, "lid", get_lid_switch()); fill_lb_gpio(gpio++, -1, ACTIVE_HIGH, "power", 0); fill_lb_gpio(gpio++, -1, ACTIVE_HIGH, "oprom", gfx_get_init_done()); fill_lb_gpio(gpio++, GPIO_EC_IN_RW, ACTIVE_HIGH, "EC in RW", gpio_get(GPIO_EC_IN_RW)); gpios->count = gpio - start_gpio; gpios->size = sizeof(*gpios) + (gpios->count * sizeof(*gpio)); }
/* * The Stout EC needs to be reset to RW mode. It is important that * the RTC_PWR_STS is not set until ramstage EC init. */ static void early_ec_init(void) { u8 ec_status = ec_read(EC_STATUS_REG); int rec_mode = get_recovery_mode_switch(); if (((ec_status & 0x3) == EC_IN_RO_MODE) || ((ec_status & 0x3) == EC_IN_RECOVERY_MODE)) { printk(BIOS_DEBUG, "EC Cold Boot Detected\n"); if (!rec_mode) { /* * Tell EC to exit RO mode */ printk(BIOS_DEBUG, "EC will exit RO mode and boot normally\n"); ec_write_cmd(EC_CMD_EXIT_BOOT_BLOCK); die("wait for ec to reset"); } } else { printk(BIOS_DEBUG, "EC Warm Boot Detected\n"); ec_write_cmd(EC_CMD_WARM_RESET); } }
void acpi_create_gnvs(global_nvs_t *gnvs) { /* Disable USB ports in S3 by default */ gnvs->s3u0 = 0; gnvs->s3u1 = 0; /* Disable USB ports in S5 by default */ gnvs->s5u0 = 0; gnvs->s5u1 = 0; #if CONFIG_CHROMEOS gnvs->chromeos.vbt2 = get_recovery_mode_switch() ? ACTIVE_ECFW_RO : ACTIVE_ECFW_RW; #endif acpi_update_thermal_table(gnvs); // the lid is open by default. gnvs->lids = 1; /* XHCI Mode */ gnvs->xhci = XHCI_MODE; }
static void vboot_invoke_wrapper(struct vboot_handoff *vboot_handoff) { VbCommonParams cparams; VbSelectFirmwareParams fparams; struct vboot_context context; uint32_t *iflags; vboot_handoff->selected_firmware = VB_SELECT_FIRMWARE_READONLY; memset(&cparams, 0, sizeof(cparams)); memset(&fparams, 0, sizeof(fparams)); memset(&context, 0, sizeof(context)); iflags = &vboot_handoff->init_params.flags; if (get_developer_mode_switch()) *iflags |= VB_INIT_FLAG_DEV_SWITCH_ON; if (get_recovery_mode_switch()) *iflags |= VB_INIT_FLAG_REC_BUTTON_PRESSED; if (get_write_protect_state()) *iflags |= VB_INIT_FLAG_WP_ENABLED; if (CONFIG_VIRTUAL_DEV_SWITCH) *iflags |= VB_INIT_FLAG_VIRTUAL_DEV_SWITCH; if (CONFIG_EC_SOFTWARE_SYNC) { *iflags |= VB_INIT_FLAG_EC_SOFTWARE_SYNC; *iflags |= VB_INIT_FLAG_VIRTUAL_REC_SWITCH; } context.handoff = vboot_handoff; context.cparams = &cparams; context.fparams = &fparams; cparams.gbb_size = find_fmap_entry("GBB", &cparams.gbb_data); cparams.shared_data_blob = &vboot_handoff->shared_data[0]; cparams.shared_data_size = VB_SHARED_DATA_MIN_SIZE; cparams.caller_context = &context; fparams.verification_size_A = find_fmap_entry("VBLOCK_A", &fparams.verification_block_A); fparams.verification_size_B = find_fmap_entry("VBLOCK_B", &fparams.verification_block_B); context.fw_a_size = find_fmap_entry("FW_MAIN_A", (void **)&context.fw_a); context.fw_b_size = find_fmap_entry("FW_MAIN_B", (void **)&context.fw_b); /* Check all fmap entries. */ if (context.fw_a == NULL || context.fw_b == NULL || fparams.verification_block_A == NULL || fparams.verification_block_B == NULL || cparams.gbb_data == NULL) { printk(BIOS_DEBUG, "Not all fmap entries found for vboot.\n"); return; } /* Initialize callbacks. */ context.read_vbnv = &read_vbnv; context.save_vbnv = &save_vbnv; context.tis_init = &tis_init; context.tis_open = &tis_open; context.tis_close = &tis_close; context.tis_sendrecv = &tis_sendrecv; context.log_msg = &log_msg; context.fatal_error = &fatal_error; vboot_run_stub(&context); }
/** * Verify and select the firmware in the RW image * * TODO: Avoid loading a stage twice (once in hash_body & again in load_stage). * when per-stage verification is ready. */ void verstage_main(void) { struct vb2_context ctx; struct region_device fw_main; int rv; timestamp_add_now(TS_START_VBOOT); /* Set up context and work buffer */ vb2_init_work_context(&ctx); /* Read nvdata from a non-volatile storage. */ read_vbnv(ctx.nvdata); /* Set S3 resume flag if vboot should behave differently when selecting * which slot to boot. This is only relevant to vboot if the platform * does verification of memory init and thus must ensure it resumes with * the same slot that it booted from. */ if (IS_ENABLED(CONFIG_RESUME_PATH_SAME_AS_BOOT) && IS_ENABLED(CONFIG_VBOOT_STARTS_IN_BOOTBLOCK) && vboot_platform_is_resuming()) ctx.flags |= VB2_CONTEXT_S3_RESUME; /* Read secdata from TPM. Initialize TPM if secdata not found. We don't * check the return value here because vb2api_fw_phase1 will catch * invalid secdata and tell us what to do (=reboot). */ timestamp_add_now(TS_START_TPMINIT); antirollback_read_space_firmware(&ctx); timestamp_add_now(TS_END_TPMINIT); if (!IS_ENABLED(CONFIG_VIRTUAL_DEV_SWITCH) && get_developer_mode_switch()) ctx.flags |= VB2_CONTEXT_FORCE_DEVELOPER_MODE; if (get_recovery_mode_switch()) { ctx.flags |= VB2_CONTEXT_FORCE_RECOVERY_MODE; if (IS_ENABLED(CONFIG_VBOOT_DISABLE_DEV_ON_RECOVERY)) ctx.flags |= VB2_DISABLE_DEVELOPER_MODE; } if (IS_ENABLED(CONFIG_WIPEOUT_SUPPORTED) && get_wipeout_mode_switch()) ctx.flags |= VB2_CONTEXT_FORCE_WIPEOUT_MODE; if (IS_ENABLED(CONFIG_LID_SWITCH) && !get_lid_switch()) ctx.flags |= VB2_CONTEXT_NOFAIL_BOOT; /* Do early init (set up secdata and NVRAM, load GBB) */ printk(BIOS_INFO, "Phase 1\n"); rv = vb2api_fw_phase1(&ctx); if (rv) { /* * If vb2api_fw_phase1 fails, check for return value. * If it is set to VB2_ERROR_API_PHASE1_RECOVERY, then continue * into recovery mode. * For any other error code, save context if needed and reboot. */ if (rv == VB2_ERROR_API_PHASE1_RECOVERY) { printk(BIOS_INFO, "Recovery requested (%x)\n", rv); save_if_needed(&ctx); extend_pcrs(&ctx); /* ignore failures */ timestamp_add_now(TS_END_VBOOT); return; } printk(BIOS_INFO, "Reboot reqested (%x)\n", rv); save_if_needed(&ctx); vboot_reboot(); } /* Determine which firmware slot to boot (based on NVRAM) */ printk(BIOS_INFO, "Phase 2\n"); rv = vb2api_fw_phase2(&ctx); if (rv) { printk(BIOS_INFO, "Reboot requested (%x)\n", rv); save_if_needed(&ctx); vboot_reboot(); } /* Try that slot (verify its keyblock and preamble) */ printk(BIOS_INFO, "Phase 3\n"); timestamp_add_now(TS_START_VERIFY_SLOT); rv = vb2api_fw_phase3(&ctx); timestamp_add_now(TS_END_VERIFY_SLOT); if (rv) { printk(BIOS_INFO, "Reboot requested (%x)\n", rv); save_if_needed(&ctx); vboot_reboot(); } printk(BIOS_INFO, "Phase 4\n"); rv = locate_firmware(&ctx, &fw_main); if (rv) die("Failed to read FMAP to locate firmware"); rv = hash_body(&ctx, &fw_main); save_if_needed(&ctx); if (rv) { printk(BIOS_INFO, "Reboot requested (%x)\n", rv); vboot_reboot(); } rv = extend_pcrs(&ctx); if (rv) { printk(BIOS_WARNING, "Failed to extend TPM PCRs (%#x)\n", rv); vb2api_fail(&ctx, VB2_RECOVERY_RO_TPM_U_ERROR, rv); save_if_needed(&ctx); vboot_reboot(); } /* Lock TPM */ rv = antirollback_lock_space_firmware(); if (rv) { printk(BIOS_INFO, "Failed to lock TPM (%x)\n", rv); vb2api_fail(&ctx, VB2_RECOVERY_RO_TPM_L_ERROR, 0); save_if_needed(&ctx); vboot_reboot(); } /* Lock rec hash space if available. */ if (IS_ENABLED(CONFIG_VBOOT_HAS_REC_HASH_SPACE)) { rv = antirollback_lock_space_rec_hash(); if (rv) { printk(BIOS_INFO, "Failed to lock rec hash space(%x)\n", rv); vb2api_fail(&ctx, VB2_RECOVERY_RO_TPM_REC_HASH_L_ERROR, 0); save_if_needed(&ctx); vboot_reboot(); } } printk(BIOS_INFO, "Slot %c is selected\n", is_slot_a(&ctx) ? 'A' : 'B'); vb2_set_selected_region(region_device_region(&fw_main)); timestamp_add_now(TS_END_VBOOT); }
void fill_lb_gpios(struct lb_gpios *gpios) { int count = 0; /* Write Protect: active low */ gpios->gpios[count].port = GPIO(R1); gpios->gpios[count].polarity = ACTIVE_LOW; gpios->gpios[count].value = gpio_get(GPIO(R1)); strncpy((char *)gpios->gpios[count].name, "write protect", GPIO_MAX_NAME_LENGTH); count++; /* Recovery: active high */ gpios->gpios[count].port = -1; gpios->gpios[count].polarity = ACTIVE_HIGH; gpios->gpios[count].value = get_recovery_mode_switch(); strncpy((char *)gpios->gpios[count].name, "recovery", GPIO_MAX_NAME_LENGTH); count++; /* Lid: active high */ gpios->gpios[count].port = GPIO(R4); gpios->gpios[count].polarity = ACTIVE_HIGH; gpios->gpios[count].value = -1; strncpy((char *)gpios->gpios[count].name, "lid", GPIO_MAX_NAME_LENGTH); count++; /* Power: active low */ gpios->gpios[count].port = GPIO(Q0); gpios->gpios[count].polarity = ACTIVE_LOW; gpios->gpios[count].value = -1; strncpy((char *)gpios->gpios[count].name, "power", GPIO_MAX_NAME_LENGTH); count++; /* Developer: virtual GPIO active high */ gpios->gpios[count].port = -1; gpios->gpios[count].polarity = ACTIVE_HIGH; gpios->gpios[count].value = get_developer_mode_switch(); strncpy((char *)gpios->gpios[count].name, "developer", GPIO_MAX_NAME_LENGTH); count++; /* EC in RW: active high */ gpios->gpios[count].port = GPIO(U4); gpios->gpios[count].polarity = ACTIVE_HIGH; gpios->gpios[count].value = -1; strncpy((char *)gpios->gpios[count].name, "EC in RW", GPIO_MAX_NAME_LENGTH); count++; /* Reset: active low (output) */ gpios->gpios[count].port = GPIO(I5); gpios->gpios[count].polarity = ACTIVE_LOW; gpios->gpios[count].value = -1; strncpy((char *)gpios->gpios[count].name, "reset", GPIO_MAX_NAME_LENGTH); count++; gpios->size = sizeof(*gpios) + (count * sizeof(struct lb_gpio)); gpios->count = count; printk(BIOS_ERR, "Added %d GPIOS size %d\n", count, gpios->size); }
void fill_lb_gpios(struct lb_gpios *gpios) { int count = 0; /* Write Protect: active low */ gpios->gpios[count].port = GPIO_WP.raw; gpios->gpios[count].polarity = ACTIVE_LOW; gpios->gpios[count].value = gpio_get(GPIO_WP); strncpy((char *)gpios->gpios[count].name, "write protect", GPIO_MAX_NAME_LENGTH); count++; /* Recovery: active low */ gpios->gpios[count].port = GPIO_RECOVERY.raw; gpios->gpios[count].polarity = ACTIVE_HIGH; gpios->gpios[count].value = get_recovery_mode_switch(); strncpy((char *)gpios->gpios[count].name, "recovery", GPIO_MAX_NAME_LENGTH); count++; /* Lid: active high */ gpios->gpios[count].port = GPIO_LID.raw; gpios->gpios[count].polarity = ACTIVE_HIGH; gpios->gpios[count].value = -1; strncpy((char *)gpios->gpios[count].name, "lid", GPIO_MAX_NAME_LENGTH); count++; /* Power:GPIO active high */ gpios->gpios[count].port = GPIO_POWER.raw; gpios->gpios[count].polarity = board_id() > 1 ? ACTIVE_LOW : ACTIVE_HIGH; gpios->gpios[count].value = -1; strncpy((char *)gpios->gpios[count].name, "power", GPIO_MAX_NAME_LENGTH); count++; /* Developer: GPIO active high */ gpios->gpios[count].port = -1; gpios->gpios[count].polarity = ACTIVE_HIGH; gpios->gpios[count].value = get_developer_mode_switch(); strncpy((char *)gpios->gpios[count].name, "developer", GPIO_MAX_NAME_LENGTH); count++; /* EC in RW: GPIO active high */ gpios->gpios[count].port = GPIO_ECINRW.raw; gpios->gpios[count].polarity = ACTIVE_HIGH; gpios->gpios[count].value = -1; strncpy((char *)gpios->gpios[count].name, "EC in RW", GPIO_MAX_NAME_LENGTH); count++; /* Reset: GPIO active high (output) */ gpios->gpios[count].port = GPIO_RESET.raw; gpios->gpios[count].polarity = ACTIVE_HIGH; gpios->gpios[count].value = -1; strncpy((char *)gpios->gpios[count].name, "reset", GPIO_MAX_NAME_LENGTH); count++; gpios->size = sizeof(*gpios) + (count * sizeof(struct lb_gpio)); gpios->count = count; printk(BIOS_ERR, "Added %d GPIOS size %d\n", count, gpios->size); }
void fill_lb_gpios(struct lb_gpios *gpios) { int count = 0; /* Write protect : active low */ gpios->gpios[count].port = WRITE_PROTECT; gpios->gpios[count].polarity = ACTIVE_LOW; gpios->gpios[count].value = gpio_get(WRITE_PROTECT); strncpy((char *)gpios->gpios[count].name, "write protect", GPIO_MAX_NAME_LENGTH); count++; /* Recovery: active high */ gpios->gpios[count].port = -1; gpios->gpios[count].polarity = ACTIVE_HIGH; gpios->gpios[count].value = get_recovery_mode_switch(); strncpy((char *)gpios->gpios[count].name, "recovery", GPIO_MAX_NAME_LENGTH); count++; /* Lid: active high */ gpios->gpios[count].port = LID; gpios->gpios[count].polarity = ACTIVE_HIGH; gpios->gpios[count].value = -1; strncpy((char *)gpios->gpios[count].name, "lid", GPIO_MAX_NAME_LENGTH); count++; /* Power: active high */ gpios->gpios[count].port = POWER_BUTTON; gpios->gpios[count].polarity = ACTIVE_HIGH; gpios->gpios[count].value = -1; strncpy((char *)gpios->gpios[count].name, "power", GPIO_MAX_NAME_LENGTH); count++; /* Developer: virtual GPIO active high */ gpios->gpios[count].port = -1; gpios->gpios[count].polarity = ACTIVE_HIGH; gpios->gpios[count].value = get_developer_mode_switch(); strncpy((char *)gpios->gpios[count].name, "developer", GPIO_MAX_NAME_LENGTH); count++; /* EC in RW: active high */ gpios->gpios[count].port = EC_IN_RW; gpios->gpios[count].polarity = ACTIVE_HIGH; gpios->gpios[count].value = -1; strncpy((char *)gpios->gpios[count].name, "EC in RW", GPIO_MAX_NAME_LENGTH); count++; /* EC interrupt: GPIO active low */ gpios->gpios[count].port = EC_IRQ; gpios->gpios[count].polarity = ACTIVE_LOW; gpios->gpios[count].value = -1; strncpy((char *)gpios->gpios[count].name, "EC interrupt", GPIO_MAX_NAME_LENGTH); count++; gpios->size = sizeof(*gpios) + (count * sizeof(struct lb_gpio)); gpios->count = count; printk(BIOS_ERR, "Added %d GPIOS size %d\n", count, gpios->size); }