void broadwell_run_reference_code(void) { int ret, dummy; struct pei_data pei_data; pei_wrapper_entry_t entry; memset(&pei_data, 0, sizeof(pei_data)); mainboard_fill_pei_data(&pei_data); broadwell_fill_pei_data(&pei_data); pei_data.boot_mode = acpi_is_wakeup_s3() ? SLEEP_STATE_S3 : 0; pei_data.saved_data = (void *) &dummy; entry = load_reference_code(); if (entry == NULL) { printk(BIOS_ERR, "Reference code not found\n"); return; } /* Call into reference code. */ ret = entry(&pei_data); if (ret != 0) { printk(BIOS_ERR, "Reference code returned %d\n", ret); return; } }
static pei_wrapper_entry_t load_reference_code(void) { struct prog prog = { .name = CONFIG_CBFS_PREFIX "/refcode", }; struct rmod_stage_load refcode = { .cbmem_id = CBMEM_ID_REFCODE, .prog = &prog, }; if (acpi_is_wakeup_s3()) { return load_refcode_from_cache(); } if (load_refcode_from_vboot(&refcode) || load_refcode_from_cbfs(&refcode)) return NULL; /* Cache loaded reference code. */ cache_refcode(&refcode); return prog_entry(&prog); } void broadwell_run_reference_code(void) { int ret, dummy; struct pei_data pei_data; pei_wrapper_entry_t entry; memset(&pei_data, 0, sizeof(pei_data)); mainboard_fill_pei_data(&pei_data); broadwell_fill_pei_data(&pei_data); pei_data.boot_mode = acpi_slp_type; pei_data.saved_data = (void *) &dummy; entry = load_reference_code(); if (entry == NULL) { printk(BIOS_ERR, "Reference code not found\n"); return; } /* Call into reference code. */ ret = entry(&pei_data); if (ret != 0) { printk(BIOS_ERR, "Reference code returned %d\n", ret); return; } }
int dram_init(void) { struct pei_data _pei_data __aligned(8); struct pei_data *pei_data = &_pei_data; struct udevice *dev, *me_dev, *pch_dev; struct chipset_power_state ps; const void *spd_data; int ret, size; memset(pei_data, '\0', sizeof(struct pei_data)); /* Print ME state before MRC */ ret = syscon_get_by_driver_data(X86_SYSCON_ME, &me_dev); if (ret) return ret; intel_me_status(me_dev); /* Save ME HSIO version */ ret = uclass_first_device(UCLASS_PCH, &pch_dev); if (ret) return ret; if (!pch_dev) return -ENODEV; power_state_get(pch_dev, &ps); intel_me_hsio_version(me_dev, &ps.hsio_version, &ps.hsio_checksum); broadwell_fill_pei_data(pei_data); mainboard_fill_pei_data(pei_data); ret = uclass_first_device(UCLASS_NORTHBRIDGE, &dev); if (ret) return ret; if (!dev) return -ENODEV; size = 256; ret = mrc_locate_spd(dev, size, &spd_data); if (ret) return ret; memcpy(pei_data->spd_data[0][0], spd_data, size); memcpy(pei_data->spd_data[1][0], spd_data, size); ret = prepare_mrc_cache(pei_data); if (ret) debug("prepare_mrc_cache failed: %d\n", ret); debug("PEI version %#x\n", pei_data->pei_version); ret = mrc_common_init(dev, pei_data, true); if (ret) return ret; debug("Memory init done\n"); ret = sdram_find(dev); if (ret) return ret; gd->ram_size = gd->arch.meminfo.total_32bit_memory; debug("RAM size %llx\n", (unsigned long long)gd->ram_size); debug("MRC output data length %#x at %p\n", pei_data->data_to_save_size, pei_data->data_to_save); /* S3 resume: don't save scrambler seed or MRC data */ if (pei_data->boot_mode != SLEEP_STATE_S3) { /* * This will be copied to SDRAM in reserve_arch(), then written * to SPI flash in mrccache_save() */ gd->arch.mrc_output = (char *)pei_data->data_to_save; gd->arch.mrc_output_len = pei_data->data_to_save_size; } gd->arch.pei_meminfo = pei_data->meminfo; return 0; }