static int write_seeds_to_cmos(struct pei_data *pei_data) { u16 c1, c2, checksum; struct udevice *dev; int ret = 0; ret = uclass_get_device(UCLASS_RTC, 0, &dev); if (ret) { debug("Cannot find RTC: err=%d\n", ret); return -ENODEV; } /* Save the MRC seed values to CMOS */ rtc_write32(dev, CMOS_OFFSET_MRC_SEED, pei_data->scrambler_seed); debug("Save scrambler seed 0x%08x to CMOS 0x%02x\n", pei_data->scrambler_seed, CMOS_OFFSET_MRC_SEED); rtc_write32(dev, CMOS_OFFSET_MRC_SEED_S3, pei_data->scrambler_seed_s3); debug("Save s3 scrambler seed 0x%08x to CMOS 0x%02x\n", pei_data->scrambler_seed_s3, CMOS_OFFSET_MRC_SEED_S3); /* Save a simple checksum of the seed values */ 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); rtc_write8(dev, CMOS_OFFSET_MRC_SEED_CHK, checksum & 0xff); rtc_write8(dev, CMOS_OFFSET_MRC_SEED_CHK + 1, (checksum >> 8) & 0xff); return 0; }
int fsp_save_s3_stack(void) { struct udevice *dev; int ret; if (gd->arch.prev_sleep_state == ACPI_S3) return 0; ret = uclass_get_device(UCLASS_RTC, 0, &dev); if (ret) { debug("Cannot find RTC: err=%d\n", ret); return -ENODEV; } /* Save the stack address to CMOS */ ret = rtc_write32(dev, CMOS_FSP_STACK_ADDR, gd->start_addr_sp); if (ret) { debug("Save stack address to CMOS: err=%d\n", ret); return -EIO; } return 0; }