X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=arch%2Fx86%2Fcpu%2Fqueensbay%2Ftnc.c;h=0c02a44f63f673ce3475019f7a6508d3ce475288;hb=a69fdc7787bfa2f27eed74c2ee58c28ce932d502;hp=8b9815fa00574f10cac1d017a322529610b335c4;hpb=b2e02d28653edac48d6def9791f2fa0ebc491498;p=platform%2Fkernel%2Fu-boot.git diff --git a/arch/x86/cpu/queensbay/tnc.c b/arch/x86/cpu/queensbay/tnc.c index 8b9815f..0c02a44 100644 --- a/arch/x86/cpu/queensbay/tnc.c +++ b/arch/x86/cpu/queensbay/tnc.c @@ -6,43 +6,98 @@ #include #include +#include +#include #include -#include +#include +#include +#include #include +static void unprotect_spi_flash(void) +{ + u32 bc; + + bc = x86_pci_read_config32(TNC_LPC, 0xd8); + bc |= 0x1; /* unprotect the flash */ + x86_pci_write_config32(TNC_LPC, 0xd8, bc); +} + +static void __maybe_unused disable_igd(void) +{ + u32 gc; + + gc = x86_pci_read_config32(TNC_IGD, IGD_GC); + gc &= ~GMS_MASK; + gc |= VGA_DISABLE; + x86_pci_write_config32(TNC_IGD, IGD_GC, gc); +} + int arch_cpu_init(void) { + int ret; + post_code(POST_CPU_INIT); #ifdef CONFIG_SYS_X86_TSC_TIMER timer_set_base(rdtsc()); #endif - return x86_cpu_init_f(); + ret = x86_cpu_init_f(); + if (ret) + return ret; + + return 0; } -int print_cpuinfo(void) +int arch_early_init_r(void) { - post_code(POST_CPU_INFO); - return default_print_cpuinfo(); +#ifdef CONFIG_DISABLE_IGD + disable_igd(); +#endif + + return 0; } -void reset_cpu(ulong addr) +void cpu_irq_init(void) { - /* cold reset */ - outb(0x06, PORT_RESET); + struct tnc_rcba *rcba; + u32 base; + + base = x86_pci_read_config32(TNC_LPC, LPC_RCBA); + base &= ~MEM_BAR_EN; + rcba = (struct tnc_rcba *)base; + + /* Make sure all internal PCI devices are using INTA */ + writel(INTA, &rcba->d02ip); + writel(INTA, &rcba->d03ip); + writel(INTA, &rcba->d27ip); + writel(INTA, &rcba->d31ip); + writel(INTA, &rcba->d23ip); + writel(INTA, &rcba->d24ip); + writel(INTA, &rcba->d25ip); + writel(INTA, &rcba->d26ip); + + /* + * Route TunnelCreek PCI device interrupt pin to PIRQ + * + * Since PCIe downstream ports received INTx are routed to PIRQ + * A/B/C/D directly and not configurable, we have to route PCIe + * root ports' INTx to PIRQ A/B/C/D as well. For other devices + * on TunneCreek, route them to PIRQ E/F/G/H. + */ + writew(PIRQE, &rcba->d02ir); + writew(PIRQF, &rcba->d03ir); + writew(PIRQG, &rcba->d27ir); + writew(PIRQH, &rcba->d31ir); + writew(PIRQA, &rcba->d23ir); + writew(PIRQB, &rcba->d24ir); + writew(PIRQC, &rcba->d25ir); + writew(PIRQD, &rcba->d26ir); } -void board_final_cleanup(void) +int arch_misc_init(void) { - u32 status; - - /* call into FspNotify */ - debug("Calling into FSP (notify phase INIT_PHASE_BOOT): "); - status = fsp_notify(NULL, INIT_PHASE_BOOT); - if (status != FSP_SUCCESS) - debug("fail, error code %x\n", status); - else - debug("OK\n"); + unprotect_spi_flash(); - return; + return pirq_init(); }