예제 #1
0
static inline void chromeos_init(int prev_sleep_state)
{
#if CONFIG_CHROMEOS
	/* Normalize the sleep state to what init_chromeos() wants for S3: 2. */
	init_chromeos(prev_sleep_state == 3 ? 2 : 0);
#endif
}
예제 #2
0
파일: romstage.c 프로젝트: rprstop/coreboot
void romstage_common(const struct romstage_params *params)
{
	int boot_mode;
	int wake_from_s3;
	struct romstage_handoff *handoff;

#if CONFIG_COLLECT_TIMESTAMPS
	uint64_t start_romstage_time;
	uint64_t before_dram_time;
	uint64_t after_dram_time;
	uint64_t base_time =
		(uint64_t)pci_read_config32(PCI_DEV(0, 0x1f, 2), 0xd0) << 32 ||
		pci_read_config32(PCI_DEV(0, 0x00, 0), 0xdc);
#endif

#if CONFIG_COLLECT_TIMESTAMPS
	start_romstage_time = timestamp_get();
#endif

	if (params->bist == 0)
		enable_lapic();

	wake_from_s3 = early_pch_init(params->gpio_map, params->rcba_config);

#if CONFIG_EC_GOOGLE_CHROMEEC
	/* Ensure the EC is in the right mode for recovery */
	google_chromeec_early_init();
#endif

	/* Halt if there was a built in self test failure */
	report_bist_failure(params->bist);

	/* Perform some early chipset initialization required
	 * before RAM initialization can work
	 */
	haswell_early_initialization(HASWELL_MOBILE);
	printk(BIOS_DEBUG, "Back from haswell_early_initialization()\n");

	if (wake_from_s3) {
#if CONFIG_HAVE_ACPI_RESUME
		printk(BIOS_DEBUG, "Resume from S3 detected.\n");
#else
		printk(BIOS_DEBUG, "Resume from S3 detected, but disabled.\n");
		wake_from_s3 = 0;
#endif
	}

	/* There are hard coded assumptions of 2 meaning s3 wake. Normalize
	 * the users of the 2 literal here based off wake_from_s3. */
	boot_mode = wake_from_s3 ? 2 : 0;

	/* Prepare USB controller early in S3 resume */
	if (wake_from_s3)
		enable_usb_bar();

	post_code(0x3a);
	params->pei_data->boot_mode = boot_mode;
#if CONFIG_COLLECT_TIMESTAMPS
	before_dram_time = timestamp_get();
#endif

	report_platform_info();

	if (params->copy_spd != NULL)
		params->copy_spd(params->pei_data);

	sdram_initialize(params->pei_data);

#if CONFIG_COLLECT_TIMESTAMPS
	after_dram_time = timestamp_get();
#endif
	post_code(0x3b);

	intel_early_me_status();

	quick_ram_check();
	post_code(0x3e);

	if (!wake_from_s3) {
		cbmem_initialize_empty();
		/* Save data returned from MRC on non-S3 resumes. */
		save_mrc_data(params->pei_data);
	} else if (cbmem_initialize()) {
	#if CONFIG_HAVE_ACPI_RESUME
		/* Failed S3 resume, reset to come up cleanly */
		reset_system();
	#endif
	}

	handoff = romstage_handoff_find_or_add();
	if (handoff != NULL)
		handoff->s3_resume = wake_from_s3;
	else
		printk(BIOS_DEBUG, "Romstage handoff structure not added!\n");

	post_code(0x3f);
#if CONFIG_CHROMEOS
	init_chromeos(boot_mode);
#endif
#if CONFIG_COLLECT_TIMESTAMPS
	timestamp_init(base_time);
	timestamp_add(TS_START_ROMSTAGE, start_romstage_time );
	timestamp_add(TS_BEFORE_INITRAM, before_dram_time );
	timestamp_add(TS_AFTER_INITRAM, after_dram_time );
	timestamp_add_now(TS_END_ROMSTAGE);
#endif
}
예제 #3
0
void main(unsigned long bist)
{
	int boot_mode = 0;
	int cbmem_was_initted;

	struct pei_data pei_data = {
		.pei_version = PEI_VERSION,
		.mchbar = (uintptr_t)DEFAULT_MCHBAR,
		.dmibar = (uintptr_t)DEFAULT_DMIBAR,
		.epbar = DEFAULT_EPBAR,
		.pciexbar = CONFIG_MMCONF_BASE_ADDRESS,
		.smbusbar = SMBUS_IO_BASE,
		.wdbbar = 0x4000000,
		.wdbsize = 0x1000,
		.hpet_address = CONFIG_HPET_ADDRESS,
		.rcba = (uintptr_t)DEFAULT_RCBABASE,
		.pmbase = DEFAULT_PMBASE,
		.gpiobase = DEFAULT_GPIOBASE,
		.thermalbase = 0xfed08000,
		.system_type = 0, // 0 Mobile, 1 Desktop/Server
		.tseg_size = CONFIG_SMM_TSEG_SIZE,
		.spd_addresses = { 0xA0, 0x00,0xA4,0x00 },
		.ts_addresses = { 0x00, 0x00, 0x00, 0x00 },
		.ec_present = 1,
		// 0 = leave channel enabled
		// 1 = disable dimm 0 on channel
		// 2 = disable dimm 1 on channel
		// 3 = disable dimm 0+1 on channel
		.dimm_channel0_disabled = 2,
		.dimm_channel1_disabled = 2,
		.max_ddr3_freq = 1600,
		.usb_port_config = {
			/* Empty and onboard Ports 0-7, set to un-used pin OC3 */
			{ 0, 3, 0x0000 }, /* P0: Empty */
			{ 1, 0, 0x0040 }, /* P1: Left USB 1  (OC0) */
			{ 1, 1, 0x0040 }, /* P2: Left USB 2  (OC1) */
			{ 1, 1, 0x0040 }, /* P3: Left USB 3  (OC1) */
			{ 0, 3, 0x0000 }, /* P4: Empty */
			{ 0, 3, 0x0000 }, /* P5: Empty */
			{ 0, 3, 0x0000 }, /* P6: Empty */
			{ 0, 3, 0x0000 }, /* P7: Empty */
			/* Empty and onboard Ports 8-13, set to un-used pin OC4 */
			{ 1, 4, 0x0040 }, /* P8: MiniPCIe (WLAN) (no OC) */
			{ 0, 4, 0x0000 }, /* P9: Empty */
			{ 1, 4, 0x0040 }, /* P10: Camera (no OC) */
			{ 0, 4, 0x0000 }, /* P11: Empty */
			{ 0, 4, 0x0000 }, /* P12: Empty */
			{ 0, 4, 0x0000 }, /* P13: Empty */
		},
	};

	timestamp_init(get_initial_timestamp());
	timestamp_add_now(TS_START_ROMSTAGE);

	if (bist == 0)
		enable_lapic();

	pch_enable_lpc();

	/* Enable GPIOs */
	pci_write_config32(PCH_LPC_DEV, GPIO_BASE, DEFAULT_GPIOBASE|1);
	pci_write_config8(PCH_LPC_DEV, GPIO_CNTL, 0x10);
	setup_pch_gpios(&parrot_gpio_map);

	/* Initialize console device(s) */
	console_init();

	/* Halt if there was a built in self test failure */
	report_bist_failure(bist);

	if (MCHBAR16(SSKPD) == 0xCAFE) {
		printk(BIOS_DEBUG, "soft reset detected\n");
		boot_mode = 1;

		/* System is not happy after keyboard reset... */
		printk(BIOS_DEBUG, "Issuing CF9 warm reset\n");
		outb(0x6, 0xcf9);
		halt();
	}

	/* Perform some early chipset initialization required
	 * before RAM initialization can work
	 */
	sandybridge_early_initialization(SANDYBRIDGE_MOBILE);
	printk(BIOS_DEBUG, "Back from sandybridge_early_initialization()\n");

	boot_mode = southbridge_detect_s3_resume() ? 2 : 0;

	post_code(0x38);
	/* Enable SPD ROMs and DDR-III DRAM */
	enable_smbus();

	/* Prepare USB controller early in S3 resume */
	if (boot_mode == 2)
		enable_usb_bar();

	post_code(0x39);

	post_code(0x3a);
	pei_data.boot_mode = boot_mode;
	timestamp_add_now(TS_BEFORE_INITRAM);
	sdram_initialize(&pei_data);

	timestamp_add_now(TS_AFTER_INITRAM);
	post_code(0x3c);

	rcba_config();
	post_code(0x3d);

	quick_ram_check();
	post_code(0x3e);

	cbmem_was_initted = !cbmem_recovery(boot_mode==2);
	if (boot_mode!=2)
		save_mrc_data(&pei_data);

	if (boot_mode==2 && !cbmem_was_initted) {
		/* Failed S3 resume, reset to come up cleanly */
		outb(0x6, 0xcf9);
		halt();
	}
	northbridge_romstage_finalize(boot_mode==2);

	post_code(0x3f);
#if CONFIG_CHROMEOS
	init_chromeos(boot_mode);
#endif
	timestamp_add_now(TS_END_ROMSTAGE);
}
예제 #4
0
void main(unsigned long bist)
{
    int boot_mode = 0;
    int cbmem_was_initted;

    struct pei_data pei_data = {
        .pei_version = PEI_VERSION,
        .mchbar = (uintptr_t)DEFAULT_MCHBAR,
        .dmibar = (uintptr_t)DEFAULT_DMIBAR,
        .epbar = DEFAULT_EPBAR,
        .pciexbar = CONFIG_MMCONF_BASE_ADDRESS,
        .smbusbar = SMBUS_IO_BASE,
        .wdbbar = 0x4000000,
        .wdbsize = 0x1000,
        .hpet_address = CONFIG_HPET_ADDRESS,
        .rcba = (uintptr_t)DEFAULT_RCBABASE,
        .pmbase = DEFAULT_PMBASE,
        .gpiobase = DEFAULT_GPIOBASE,
        .thermalbase = 0xfed08000,
        .system_type = 0, // 0 Mobile, 1 Desktop/Server
        .tseg_size = CONFIG_SMM_TSEG_SIZE,
        .spd_addresses = { 0xa0, 0x00,0xa4,0x00 },
        .ts_addresses = { 0x00, 0x00, 0x00, 0x00 },
        .ec_present = 0,
        // 0 = leave channel enabled
        // 1 = disable dimm 0 on channel
        // 2 = disable dimm 1 on channel
        // 3 = disable dimm 0+1 on channel
        .dimm_channel0_disabled = 2,
        .dimm_channel1_disabled = 2,
        .max_ddr3_freq = 1333,
        .usb_port_config = {
            { 1, 0, 0x0080 }, /* P0: Front port  (OC0) */
            { 1, 1, 0x0040 }, /* P1: Back port   (OC1) */
            { 1, 0, 0x0040 }, /* P2: MINIPCIE1   (no OC) */
            { 1, 0, 0x0040 }, /* P3: MMC         (no OC) */
            { 1, 2, 0x0080 }, /* P4: Front port  (OC2) */
            { 0, 0, 0x0000 }, /* P5: Empty */
            { 0, 0, 0x0000 }, /* P6: Empty */
            { 0, 0, 0x0000 }, /* P7: Empty */
            { 1, 4, 0x0040 }, /* P8: Back port   (OC4) */
            { 1, 4, 0x0040 }, /* P9: MINIPCIE3   (no OC) */
            { 1, 4, 0x0040 }, /* P10: BLUETOOTH  (no OC) */
            { 0, 4, 0x0000 }, /* P11: Empty */
            { 1, 6, 0x0040 }, /* P12: Back port  (OC6) */
            { 1, 5, 0x0040 }, /* P13: Back port  (OC5) */
        },
    };

    timestamp_init(get_initial_timestamp());
    timestamp_add_now(TS_START_ROMSTAGE);

    if (bist == 0)
        enable_lapic();

    pch_enable_lpc();

    /* Enable GPIOs */
    pci_write_config32(PCH_LPC_DEV, GPIO_BASE, DEFAULT_GPIOBASE|1);
    pci_write_config8(PCH_LPC_DEV, GPIO_CNTL, 0x10);
    setup_pch_gpios(&stumpy_gpio_map);
    setup_sio_gpios();

    /* Early SuperIO setup */
    it8772f_ac_resume_southbridge(DUMMY_DEV);
    ite_kill_watchdog(GPIO_DEV);
    ite_enable_serial(SERIAL_DEV, CONFIG_TTYS0_BASE);
    console_init();

    init_bootmode_straps();

    /* Halt if there was a built in self test failure */
    report_bist_failure(bist);

    if (MCHBAR16(SSKPD) == 0xCAFE) {
        printk(BIOS_DEBUG, "soft reset detected\n");
        boot_mode = 1;

        /* System is not happy after keyboard reset... */
        printk(BIOS_DEBUG, "Issuing CF9 warm reset\n");
        outb(0x6, 0xcf9);
        halt();
    }

    /* Perform some early chipset initialization required
     * before RAM initialization can work
     */
    sandybridge_early_initialization(SANDYBRIDGE_MOBILE);
    printk(BIOS_DEBUG, "Back from sandybridge_early_initialization()\n");

    boot_mode = southbridge_detect_s3_resume() ? 2 : 0;

    post_code(0x38);
    /* Enable SPD ROMs and DDR-III DRAM */
    enable_smbus();

    /* Prepare USB controller early in S3 resume */
    if (boot_mode == 2) {
        /*
         * For Stumpy the back USB ports are reset on resume
         * so default to resetting the controller to make the
         * kernel happy.  There is a CMOS flag to disable the
         * controller reset in case the kernel can tolerate
         * the device power loss better in the future.
         */
        u8 magic = cmos_read(CMOS_USB_RESET_DISABLE);

        if (magic == USB_RESET_DISABLE_MAGIC) {
            printk(BIOS_DEBUG, "USB Controller Reset Disabled\n");
            enable_usb_bar();
        } else {
            printk(BIOS_DEBUG, "USB Controller Reset Enabled\n");
        }
    } else {
        /* Ensure USB reset on resume is enabled at boot */
        cmos_write(0, CMOS_USB_RESET_DISABLE);
    }

    post_code(0x39);
    pei_data.boot_mode = boot_mode;
    timestamp_add_now(TS_BEFORE_INITRAM);
    sdram_initialize(&pei_data);

    timestamp_add_now(TS_AFTER_INITRAM);
    post_code(0x3a);
    /* Perform some initialization that must run before stage2 */
    early_pch_init();
    post_code(0x3b);

    rcba_config();
    post_code(0x3c);

    quick_ram_check();
    post_code(0x3e);

    cbmem_was_initted = !cbmem_recovery(boot_mode==2);
    if (boot_mode!=2)
        save_mrc_data(&pei_data);

    if (boot_mode==2 && !cbmem_was_initted) {
        /* Failed S3 resume, reset to come up cleanly */
        outb(0x6, 0xcf9);
        halt();
    }
    northbridge_romstage_finalize(boot_mode==2);

    post_code(0x3f);
#if CONFIG_CHROMEOS
    init_chromeos(boot_mode);
#endif
    timestamp_add_now(TS_END_ROMSTAGE);
}