| /* |
| * This file is part of the coreboot project. |
| * |
| * Copyright (C) 2004 Stefan Reinauer |
| * Copyright (C) 2018 Patrick Rudolph <siro@das-labor.org> |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License as published by |
| * the Free Software Foundation; version 2 of the License. |
| * |
| * This program is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| * GNU General Public License for more details. |
| */ |
| |
| #include <arch/cpu.h> |
| #include <arch/romstage.h> |
| #include <stdint.h> |
| #include <cbmem.h> |
| #include <console/console.h> |
| #include <timestamp.h> |
| #include <southbridge/intel/i82801ix/i82801ix.h> |
| #include <program_loading.h> |
| #include <device/pci_ops.h> |
| |
| #define D0F0_PCIEXBAR_LO 0x60 |
| |
| static void mainboard_machine_check(void) |
| { |
| /* Check that MCFG is active. If it's not qemu was started for machine PC */ |
| if (!CONFIG(BOOTBLOCK_CONSOLE) && |
| (pci_read_config32(PCI_DEV(0, 0, 0), D0F0_PCIEXBAR_LO) != |
| (CONFIG_MMCONF_BASE_ADDRESS | 1))) |
| die("You must run qemu for machine Q35 (-M q35)"); |
| } |
| |
| asmlinkage void car_stage_entry(void) |
| { |
| struct postcar_frame pcf; |
| i82801ix_early_init(); |
| console_init(); |
| |
| mainboard_machine_check(); |
| |
| cbmem_recovery(0); |
| |
| timestamp_add_now(TS_START_ROMSTAGE); |
| |
| if (postcar_frame_init(&pcf, 0)) |
| die("Unable to initialize postcar frame.\n"); |
| |
| /** |
| * Run postcar to tear down CAR and load relocatable ramstage. |
| * There's no CAR on qemu, but for educational purposes and |
| * testing the postcar stage is used on qemu, too. |
| */ |
| |
| run_postcar_phase(&pcf); |
| } |