Add hooks for ivybridge boards so they can use CONFIG_BOARD for init. Signed-off-by: Simon Glass <s...@chromium.org> ---
arch/x86/cpu/coreboot/coreboot.c | 2 + arch/x86/cpu/ivybridge/cpu.c | 71 +++++++++++++++++++---- arch/x86/cpu/ivybridge/sdram.c | 13 ++++- arch/x86/cpu/ivybridge/sdram_nop.c | 43 +++++++++++++- arch/x86/cpu/x86_64/cpu.c | 2 + arch/x86/include/asm/arch-ivybridge/sandybridge.h | 7 +++ arch/x86/lib/spl.c | 13 +++++ board/google/chromebook_link/link.c | 2 + board/google/chromebox_panther/panther.c | 2 + 9 files changed, 140 insertions(+), 15 deletions(-) diff --git a/arch/x86/cpu/coreboot/coreboot.c b/arch/x86/cpu/coreboot/coreboot.c index 1b042037bb..609bfcb2da 100644 --- a/arch/x86/cpu/coreboot/coreboot.c +++ b/arch/x86/cpu/coreboot/coreboot.c @@ -29,6 +29,7 @@ int arch_cpu_init(void) return x86_cpu_init_f(); } +#ifndef CONFIG_BOARD_ENABLE int board_early_init_f(void) { return 0; @@ -38,6 +39,7 @@ int print_cpuinfo(void) { return default_print_cpuinfo(); } +#endif static void board_final_cleanup(void) { diff --git a/arch/x86/cpu/ivybridge/cpu.c b/arch/x86/cpu/ivybridge/cpu.c index c4aca08f0d..96e69ef792 100644 --- a/arch/x86/cpu/ivybridge/cpu.c +++ b/arch/x86/cpu/ivybridge/cpu.c @@ -12,6 +12,7 @@ */ #include <common.h> +#include <board.h> #include <dm.h> #include <errno.h> #include <fdtdec.h> @@ -50,10 +51,10 @@ int arch_cpu_init(void) return x86_cpu_init_f(); } -int arch_cpu_init_dm(void) +static int do_arch_cpu_init_dm(void) { struct pci_controller *hose; - struct udevice *bus, *dev; + struct udevice *bus, *lpc_dev; int ret; post_code(0x70); @@ -67,7 +68,7 @@ int arch_cpu_init_dm(void) /* TODO(s...@chromium.org): Get rid of gd->hose */ gd->hose = hose; - ret = uclass_first_device_err(UCLASS_LPC, &dev); + ret = uclass_first_device_err(UCLASS_LPC, &lpc_dev); if (ret) return ret; @@ -83,6 +84,13 @@ int arch_cpu_init_dm(void) return 0; } +#ifndef CONFIG_BOARD_ENABLE +int arch_cpu_init_dm(void) +{ + return do_arch_cpu_init_dm(); +} +#endif + #define PCH_EHCI0_TEMP_BAR0 0xe8000000 #define PCH_EHCI1_TEMP_BAR0 0xe8000400 #define PCH_XHCI_TEMP_BAR0 0xe8001000 @@ -125,12 +133,10 @@ static void enable_usb_bar(struct udevice *bus) pci_bus_write_config(bus, usb3, PCI_COMMAND, cmd, PCI_SIZE_32); } -int print_cpuinfo(void) +static int ivybridge_checkcpu(void) { enum pei_boot_mode_t boot_mode = PEI_BOOT_NONE; - char processor_name[CPU_MAX_NAME_LEN]; struct udevice *dev, *lpc; - const char *name; uint32_t pm1_cnt; uint16_t pm1_sts; int ret; @@ -181,19 +187,62 @@ int print_cpuinfo(void) } gd->arch.pei_boot_mode = boot_mode; - - /* Print processor name */ - name = cpu_get_name(processor_name); - printf("CPU: %s\n", name); - post_code(POST_CPU_INFO); return 0; } +#ifndef CONFIG_BOARD_ENABLE +int print_cpuinfo(void) +{ + return ivybridge_checkcpu(); +} +#endif + void board_debug_uart_init(void) { /* This enables the debug UART */ pci_x86_write_config(NULL, PCH_LPC_DEV, LPC_EN, COMA_LPC_EN, PCI_SIZE_16); } + +static int cpu_x86_ivybridge_phase(struct udevice *dev, + enum board_phase_t phase) +{ + switch (phase) { + case BOARD_F_ARCH_CPU_INIT_DM: + return do_arch_cpu_init_dm(); + case BOARD_F_CHECKCPU: + return ivybridge_checkcpu(); + case BOARD_F_DRAM_INIT: + return ivybridge_dram_init(); + default: + return -ENOSYS; + } + + return 0; +} + +static int cpu_x86_ivybridge_board_probe(struct udevice *dev) +{ + return board_support_phase_mask(dev, + board_phase_mask(BOARD_F_ARCH_CPU_INIT_DM) | + board_phase_mask(BOARD_F_CHECKCPU) | + board_phase_mask(BOARD_F_DRAM_INIT)); +} + +static const struct board_ops cpu_x86_ivybridge_board_ops = { + .phase = cpu_x86_ivybridge_phase, +}; + +U_BOOT_DRIVER(cpu_x86_ivybridge_board_drv) = { + .name = "cpu_x86_ivybridge_board", + .id = UCLASS_BOARD, + .ops = &cpu_x86_ivybridge_board_ops, + .probe = cpu_x86_ivybridge_board_probe, + .flags = DM_FLAG_PRE_RELOC, +}; + +U_BOOT_DEVICE(cpu_x86_ivybridge_board) = { + .name = "cpu_x86_ivybridge_board", +}; diff --git a/arch/x86/cpu/ivybridge/sdram.c b/arch/x86/cpu/ivybridge/sdram.c index 201368c9c7..2484ed4859 100644 --- a/arch/x86/cpu/ivybridge/sdram.c +++ b/arch/x86/cpu/ivybridge/sdram.c @@ -401,7 +401,7 @@ static void rcba_config(void) setbits_le32(RCB_REG(FD), PCH_DISABLE_ALWAYS); } -int dram_init(void) +int ivybridge_dram_init(void) { struct pei_data _pei_data __aligned(8) = { .pei_version = PEI_VERSION, @@ -541,8 +541,8 @@ int dram_init(void) /* S3 resume: don't save scrambler seed or MRC data */ if (pei_data->boot_mode != PEI_BOOT_RESUME) { /* - * This will be copied to SDRAM in reserve_arch(), then written - * to SPI flash in mrccache_save() + * This will be copied to SDRAM in the BOARD_F_RESERVE_ARCH + * call, then written to SPI flash in mrccache_save() */ gd->arch.mrc_output = (char *)pei_data->mrc_output; gd->arch.mrc_output_len = pei_data->mrc_output_len; @@ -559,3 +559,10 @@ int dram_init(void) return 0; } + +#ifndef CONFIG_BOARD_ENABLE +int dram_init(void) +{ + return ivybridge_dram_init(); +} +#endif diff --git a/arch/x86/cpu/ivybridge/sdram_nop.c b/arch/x86/cpu/ivybridge/sdram_nop.c index bd1189e447..641d099bbf 100644 --- a/arch/x86/cpu/ivybridge/sdram_nop.c +++ b/arch/x86/cpu/ivybridge/sdram_nop.c @@ -5,10 +5,11 @@ */ #include <common.h> +#include <asm/arch/sandybridge.h> DECLARE_GLOBAL_DATA_PTR; -int dram_init(void) +int nop_dram_init(void) { gd->ram_size = 1ULL << 31; gd->bd->bi_dram[0].start = 0; @@ -16,3 +17,43 @@ int dram_init(void) return 0; } + +#ifndef CONFIG_BOARD_ENABLE +int dram_init(void) +{ + return nop_dram_init(); +} +#endif + +static int cpu_x86_nop_phase(struct udevice *dev, enum board_phase_t phase) +{ + switch (phase) { + case BOARD_F_DRAM_INIT: + return nop_dram_init(); + default: + return -ENOSYS; + } + + return 0; +} + +static int cpu_x86_nop_board_probe(struct udevice *dev) +{ + return board_support_phase(dev, BOARD_F_DRAM_INIT); +} + +static const struct board_ops cpu_x86_nop_board_ops = { + .phase = cpu_x86_nop_phase, +}; + +U_BOOT_DRIVER(cpu_x86_nop_board_drv) = { + .name = "cpu_x86_nop_board", + .id = UCLASS_BOARD, + .ops = &cpu_x86_nop_board_ops, + .probe = cpu_x86_nop_board_probe, + .flags = DM_FLAG_PRE_RELOC, +}; + +U_BOOT_DEVICE(cpu_x86_nop_board) = { + .name = "cpu_x86_nop_board", +}; diff --git a/arch/x86/cpu/x86_64/cpu.c b/arch/x86/cpu/x86_64/cpu.c index db171f750d..ede46f7957 100644 --- a/arch/x86/cpu/x86_64/cpu.c +++ b/arch/x86/cpu/x86_64/cpu.c @@ -67,7 +67,9 @@ int misc_init_r(void) return 0; } +#ifndef CONFIG_BOARD_ENABLE int print_cpuinfo(void) { return 0; } +#endif diff --git a/arch/x86/include/asm/arch-ivybridge/sandybridge.h b/arch/x86/include/asm/arch-ivybridge/sandybridge.h index 8e0f668f0b..52f4c17620 100644 --- a/arch/x86/include/asm/arch-ivybridge/sandybridge.h +++ b/arch/x86/include/asm/arch-ivybridge/sandybridge.h @@ -113,4 +113,11 @@ */ int bridge_silicon_revision(struct udevice *dev); +/** + * ivybridge_dram_init() - Set up SDRAM + * + * @return 0 if OK, -ve on error + */ +int ivybridge_dram_init(void); + #endif diff --git a/arch/x86/lib/spl.c b/arch/x86/lib/spl.c index fa93d64a7a..a4c1a3ac35 100644 --- a/arch/x86/lib/spl.c +++ b/arch/x86/lib/spl.c @@ -48,6 +48,18 @@ static int x86_spl_init(void) return ret; } preloader_console_init(); +#ifdef CONFIG_BOARD_ENABLE + ret = board_walk_phase(BOARD_F_CHECKCPU); + if (ret) { + debug("%s: BOARD_F_CHECKCPU failed\n", __func__); + return ret; + } + ret = board_walk_phase(BOARD_F_DRAM_INIT); + if (ret) { + debug("%s: BOARD_F_DRAM_INIT failed\n", __func__); + return ret; + } +#else ret = print_cpuinfo(); if (ret) { debug("%s: print_cpuinfo() failed\n", __func__); @@ -58,6 +70,7 @@ static int x86_spl_init(void) debug("%s: dram_init() failed\n", __func__); return ret; } +#endif memset(&__bss_start, 0, (ulong)&__bss_end - (ulong)&__bss_start); /* TODO(s...@chromium.org): Consider calling cpu_init_r() here */ diff --git a/board/google/chromebook_link/link.c b/board/google/chromebook_link/link.c index 42615e1e23..99b1c91edc 100644 --- a/board/google/chromebook_link/link.c +++ b/board/google/chromebook_link/link.c @@ -17,7 +17,9 @@ int arch_early_init_r(void) return 0; } +#ifndef CONFIG_BOARD_ENABLE int board_early_init_f(void) { return 0; } +#endif diff --git a/board/google/chromebox_panther/panther.c b/board/google/chromebox_panther/panther.c index e3baf88783..151cdd719d 100644 --- a/board/google/chromebox_panther/panther.c +++ b/board/google/chromebox_panther/panther.c @@ -12,7 +12,9 @@ int arch_early_init_r(void) return 0; } +#ifndef CONFIG_BOARD_ENABLE int board_early_init_f(void) { return 0; } +#endif -- 2.12.0.367.g23dc2f6d3c-goog _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot