static void igd_init(struct device *dev) { if (IS_ENABLED(CONFIG_GOP_SUPPORT)) return; /* IGD needs to be Bus Master */ u32 reg32 = pci_read_config32(dev, PCI_COMMAND); reg32 |= PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY | PCI_COMMAND_IO; pci_write_config32(dev, PCI_COMMAND, reg32); gtt_res = find_resource(dev, PCI_BASE_ADDRESS_0); if (!gtt_res || !gtt_res->base) return; /* Wait for any configured pre-graphics delay */ if (!acpi_is_wakeup_s3()) { #if IS_ENABLED(CONFIG_CHROMEOS) if (developer_mode_enabled() || recovery_mode_enabled() || vboot_wants_oprom()) mdelay(CONFIG_PRE_GRAPHICS_DELAY); #else mdelay(CONFIG_PRE_GRAPHICS_DELAY); #endif } /* Initialize PCI device, load/execute BIOS Option ROM */ pci_dev_init(dev); #if IS_ENABLED(CONFIG_CHROMEOS) if (!gfx_get_init_done() && !acpi_is_wakeup_s3()) { /* * Enable DDI-A if the Option ROM did not execute: * * bit 0: Display detected (RO) * bit 4: DDI A supports 4 lanes and DDI E is not used * bit 7: DDI buffer is idle */ gtt_write(DDI_BUF_CTL_A, DDI_BUF_IS_IDLE | DDI_A_4_LANES | DDI_INIT_DISPLAY_DETECTED); } #endif }
/** * Sets vboot_handoff based on the information in vb2_shared_data */ static void fill_vboot_handoff(struct vboot_handoff *vboot_handoff, struct vb2_shared_data *vb2_sd) { VbSharedDataHeader *vb_sd = (VbSharedDataHeader *)vboot_handoff->shared_data; uint32_t *oflags = &vboot_handoff->init_params.out_flags; vb_sd->flags |= VBSD_BOOT_FIRMWARE_VBOOT2; vboot_handoff->selected_firmware = vb2_sd->fw_slot; vb_sd->firmware_index = vb2_sd->fw_slot; vb_sd->magic = VB_SHARED_DATA_MAGIC; vb_sd->struct_version = VB_SHARED_DATA_VERSION; vb_sd->struct_size = sizeof(VbSharedDataHeader); vb_sd->data_size = VB_SHARED_DATA_MIN_SIZE; vb_sd->data_used = sizeof(VbSharedDataHeader); vb_sd->fw_version_tpm = vb2_sd->fw_version_secdata; if (get_write_protect_state()) vb_sd->flags |= VBSD_BOOT_FIRMWARE_WP_ENABLED; if (get_sw_write_protect_state()) vb_sd->flags |= VBSD_BOOT_FIRMWARE_SW_WP_ENABLED; if (vb2_sd->recovery_reason) { vb_sd->firmware_index = 0xFF; if (vb2_sd->flags & VB2_SD_FLAG_MANUAL_RECOVERY) vb_sd->flags |= VBSD_BOOT_REC_SWITCH_ON; *oflags |= VB_INIT_OUT_ENABLE_RECOVERY; *oflags |= VB_INIT_OUT_CLEAR_RAM; *oflags |= VB_INIT_OUT_ENABLE_DISPLAY; *oflags |= VB_INIT_OUT_ENABLE_USB_STORAGE; } if (vb2_sd->flags & VB2_SD_DEV_MODE_ENABLED) { *oflags |= VB_INIT_OUT_ENABLE_DEVELOPER; *oflags |= VB_INIT_OUT_CLEAR_RAM; *oflags |= VB_INIT_OUT_ENABLE_DISPLAY; *oflags |= VB_INIT_OUT_ENABLE_USB_STORAGE; vb_sd->flags |= VBSD_BOOT_DEV_SWITCH_ON; vb_sd->flags |= VBSD_LF_DEV_SWITCH_ON; } /* TODO: Set these in depthcharge */ if (IS_ENABLED(CONFIG_VIRTUAL_DEV_SWITCH)) vb_sd->flags |= VBSD_HONOR_VIRT_DEV_SWITCH; if (IS_ENABLED(CONFIG_EC_SOFTWARE_SYNC)) vb_sd->flags |= VBSD_EC_SOFTWARE_SYNC; if (!IS_ENABLED(CONFIG_PHYSICAL_REC_SWITCH)) vb_sd->flags |= VBSD_BOOT_REC_SWITCH_VIRTUAL; if (IS_ENABLED(CONFIG_VBOOT_EC_SLOW_UPDATE)) vb_sd->flags |= VBSD_EC_SLOW_UPDATE; if (IS_ENABLED(CONFIG_VBOOT_OPROM_MATTERS)) { vb_sd->flags |= VBSD_OPROM_MATTERS; /* * Inform vboot if the display was enabled by dev/rec * mode or was requested by vboot kernel phase. */ if (*oflags & VB_INIT_OUT_ENABLE_DISPLAY || vboot_wants_oprom()) { vb_sd->flags |= VBSD_OPROM_LOADED; *oflags |= VB_INIT_OUT_ENABLE_DISPLAY; } } /* In vboot1, VBSD_FWB_TRIED is * set only if B is booted as explicitly requested. Therefore, if B is * booted because A was found bad, the flag should not be set. It's * better not to touch it if we can only ambiguously control it. */ /* if (vb2_sd->fw_slot) vb_sd->flags |= VBSD_FWB_TRIED; */ /* copy kernel subkey if it's found */ if (vb2_sd->workbuf_preamble_size) { struct vb2_fw_preamble *fp; uintptr_t dst, src; printk(BIOS_INFO, "Copying FW preamble\n"); fp = (struct vb2_fw_preamble *)((uintptr_t)vb2_sd + vb2_sd->workbuf_preamble_offset); src = (uintptr_t)&fp->kernel_subkey + fp->kernel_subkey.key_offset; dst = (uintptr_t)vb_sd + sizeof(VbSharedDataHeader); assert(dst + fp->kernel_subkey.key_size <= (uintptr_t)vboot_handoff + sizeof(*vboot_handoff)); memcpy((void *)dst, (void *)src, fp->kernel_subkey.key_size); vb_sd->data_used += fp->kernel_subkey.key_size; vb_sd->kernel_subkey.key_offset = dst - (uintptr_t)&vb_sd->kernel_subkey; vb_sd->kernel_subkey.key_size = fp->kernel_subkey.key_size; vb_sd->kernel_subkey.algorithm = fp->kernel_subkey.algorithm; vb_sd->kernel_subkey.key_version = fp->kernel_subkey.key_version; } vb_sd->recovery_reason = vb2_sd->recovery_reason; }