void * find_and_set_fastboot_cache(void) { struct mrc_data_container *mrc_cache = NULL; if (((mrc_cache = find_current_mrc_cache()) == NULL) || (mrc_cache->mrc_data_size == -1UL)) { printk(BIOS_DEBUG, "FSP MRC cache not present.\n"); return NULL; } printk(BIOS_DEBUG, "FSP MRC cache present at %x.\n", (u32)mrc_cache); printk(BIOS_SPEW, "Saved MRC data:\n"); hexdump32(BIOS_SPEW, (void *)mrc_cache->mrc_data, (mrc_cache->mrc_data_size) / 4); return (void *) mrc_cache->mrc_data; }
static void prepare_mrc_cache(struct pei_data *pei_data) { struct mrc_data_container *mrc_cache; u16 c1, c2, checksum, seed_checksum; // preset just in case there is an error pei_data->mrc_input = NULL; pei_data->mrc_input_len = 0; /* Read scrambler seeds from CMOS */ pei_data->scrambler_seed = cmos_read32(CMOS_OFFSET_MRC_SEED); printk(BIOS_DEBUG, "Read scrambler seed 0x%08x from CMOS 0x%02x\n", pei_data->scrambler_seed, CMOS_OFFSET_MRC_SEED); pei_data->scrambler_seed_s3 = cmos_read32(CMOS_OFFSET_MRC_SEED_S3); printk(BIOS_DEBUG, "Read S3 scrambler seed 0x%08x from CMOS 0x%02x\n", pei_data->scrambler_seed_s3, CMOS_OFFSET_MRC_SEED_S3); /* Compute seed checksum and compare */ c1 = compute_ip_checksum((u8*)&pei_data->scrambler_seed, sizeof(u32)); c2 = compute_ip_checksum((u8*)&pei_data->scrambler_seed_s3, sizeof(u32)); checksum = add_ip_checksums(sizeof(u32), c1, c2); seed_checksum = cmos_read(CMOS_OFFSET_MRC_SEED_CHK); seed_checksum |= cmos_read(CMOS_OFFSET_MRC_SEED_CHK+1) << 8; if (checksum != seed_checksum) { printk(BIOS_ERR, "%s: invalid seed checksum\n", __func__); pei_data->scrambler_seed = 0; pei_data->scrambler_seed_s3 = 0; return; } if ((mrc_cache = find_current_mrc_cache()) == NULL) { /* error message printed in find_current_mrc_cache */ return; } pei_data->mrc_input = mrc_cache->mrc_data; pei_data->mrc_input_len = mrc_cache->mrc_data_size; printk(BIOS_DEBUG, "%s: at %p, size %x checksum %04x\n", __func__, pei_data->mrc_input, pei_data->mrc_input_len, mrc_cache->mrc_checksum); }
static void prepare_mrc_cache(struct pei_data *pei_data) { struct mrc_data_container *mrc_cache; // preset just in case there is an error pei_data->mrc_input = NULL; pei_data->mrc_input_len = 0; if ((mrc_cache = find_current_mrc_cache()) == NULL) { /* error message printed in find_current_mrc_cache */ return; } pei_data->mrc_input = mrc_cache->mrc_data; pei_data->mrc_input_len = mrc_cache->mrc_data_size; printk(BIOS_DEBUG, "%s: at %p, size %x checksum %04x\n", __func__, pei_data->mrc_input, pei_data->mrc_input_len, mrc_cache->mrc_checksum); }