Beispiel #1
0
void main(unsigned long bist)
{
    w83627hf_set_clksel_48(DUMMY_DEV);
    winbond_enable_serial(SERIAL_DEV, CONFIG_TTYS0_BASE);

    console_init();
    enable_smbus();
    report_bist_failure(bist);
    dump_spd_registers();
    sdram_set_registers();
    sdram_set_spd_registers();
    sdram_enable();
}
Beispiel #2
0
void cache_as_ram_main(unsigned long bist, unsigned long cpu_init_detectedx)
{
	struct sys_info *sysinfo = &sysinfo_car;
	static const u8 spd_addr[] = {RC00, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0, };
	u32 bsp_apicid = 0, val;
	msr_t msr;

	timestamp_init(timestamp_get());
	timestamp_add_now(TS_START_ROMSTAGE);

	if (!cpu_init_detectedx && boot_cpu()) {
		/* Nothing special needs to be done to find bus 0 */
		/* Allow the HT devices to be found */
		/* mov bsp to bus 0xff when > 8 nodes */
		set_bsp_node_CHtExtNodeCfgEn();
		enumerate_ht_chain();

		/*enable port80 decoding and southbridge poweron init */
		sb_Poweron_Init();
	}

	post_code(0x30);

	if (bist == 0) {
		bsp_apicid = init_cpus(cpu_init_detectedx, sysinfo); /* mmconf is inited in init_cpus */
		/* All cores run this but the BSP(node0,core0) is the only core that returns. */
	}

	post_code(0x32);

	enable_rs780_dev8();
	sb800_clk_output_48Mhz();

	w83627hf_set_clksel_48(CLK_DEV);
	winbond_enable_serial(SERIAL_DEV, CONFIG_TTYS0_BASE);

	console_init();
	printk(BIOS_DEBUG, "\n");

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

	/* Load MPB */
	val = cpuid_eax(1);
	printk(BIOS_DEBUG, "BSP Family_Model: %08x\n", val);
	printk(BIOS_DEBUG, "*sysinfo range: [%p,%p]\n",sysinfo,sysinfo+1);
	printk(BIOS_DEBUG, "bsp_apicid = %02x\n", bsp_apicid);
	printk(BIOS_DEBUG, "cpu_init_detectedx = %08lx\n", cpu_init_detectedx);

	/* Setup sysinfo defaults */
	set_sysinfo_in_ram(0);

	update_microcode(val);

	post_code(0x33);

	cpuSetAMDMSR(0);
	post_code(0x34);

	amd_ht_init(sysinfo);
	post_code(0x35);

	/* Setup nodes PCI space and start core 0 AP init. */
	finalize_node_setup(sysinfo);

	/* Setup any mainboard PCI settings etc. */
	setup_mb_resource_map();
	post_code(0x36);

	/* wait for all the APs core0 started by finalize_node_setup. */
	/* FIXME: A bunch of cores are going to start output to serial at once.
	   It would be nice to fixup prink spinlocks for ROM XIP mode.
	   I think it could be done by putting the spinlock flag in the cache
	   of the BSP located right after sysinfo.
	 */
	wait_all_core0_started();

#if CONFIG_LOGICAL_CPUS
	/* Core0 on each node is configured. Now setup any additional cores. */
	printk(BIOS_DEBUG, "start_other_cores()\n");
	start_other_cores(bsp_apicid);
	post_code(0x37);
	wait_all_other_cores_started(bsp_apicid);
#endif

	post_code(0x38);

	/* run _early_setup before soft-reset. */
	rs780_early_setup();

#if CONFIG_SET_FIDVID
	msr = rdmsr(0xc0010071);
	printk(BIOS_DEBUG, "\nBegin FIDVID MSR 0xc0010071 0x%08x 0x%08x\n", msr.hi, msr.lo);
	post_code(0x39);

	if (!warm_reset_detect(0)) {			/* BSP is node 0 */
		init_fidvid_bsp(bsp_apicid, sysinfo->nodes);
	} else {
		init_fidvid_stage2(bsp_apicid, 0);	/* BSP is node 0 */
	}

	post_code(0x3A);

	/* show final fid and vid */
	msr = rdmsr(0xc0010071);
	printk(BIOS_DEBUG, "End FIDVIDMSR 0xc0010071 0x%08x 0x%08x\n", msr.hi, msr.lo);
#endif

	rs780_htinit();

	/* Reset for HT, FIDVID, PLL and errata changes to take affect. */
	if (!warm_reset_detect(0)) {
		printk(BIOS_INFO, "...WARM RESET...\n\n\n");
		soft_reset();
		die("After soft_reset_x - shouldn't see this message!!!\n");
	}

	post_code(0x3B);

	/* It's the time to set ctrl in sysinfo now; */
	printk(BIOS_DEBUG, "fill_mem_ctrl()\n");
	fill_mem_ctrl(sysinfo->nodes, sysinfo->ctrl, spd_addr);

	post_code(0x40);

	timestamp_add_now(TS_BEFORE_INITRAM);
	printk(BIOS_DEBUG, "raminit_amdmct()\n");
	raminit_amdmct(sysinfo);
	timestamp_add_now(TS_AFTER_INITRAM);

	cbmem_initialize_empty();
	post_code(0x41);

	amdmct_cbmem_store_info(sysinfo);

	rs780_before_pci_init();

	post_code(0x42);
	post_cache_as_ram();	/* BSP switch stack to ram, copy then execute LB. */
	post_code(0x43);	/* Should never see this post code. */
}
Beispiel #3
0
void cache_as_ram_main(unsigned long bist, unsigned long cpu_init_detectedx)
{
    struct sys_info *sysinfo = &sysinfo_car;
    u32 bsp_apicid = 0, val, wants_reset;
    msr_t msr;

    if (!cpu_init_detectedx && boot_cpu()) {
        /* Nothing special needs to be done to find bus 0 */
        /* Allow the HT devices to be found */
        set_bsp_node_CHtExtNodeCfgEn();
        enumerate_ht_chain();
        sio_setup();
    }

    post_code(0x30);

    if (bist == 0)
        bsp_apicid = init_cpus(cpu_init_detectedx, sysinfo);

    post_code(0x32);

    w83627hf_set_clksel_48(DUMMY_DEV);
    w83627hf_enable_serial(SERIAL_DEV, CONFIG_TTYS0_BASE);

    console_init();
    write_GPIO();
    printk(BIOS_DEBUG, "\n");

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

    val = cpuid_eax(1);
    printk(BIOS_DEBUG, "BSP Family_Model: %08x \n", val);
    printk(BIOS_DEBUG, "*sysinfo range: [%p,%p]\n",sysinfo,sysinfo+1);
    printk(BIOS_DEBUG, "bsp_apicid = %02x \n", bsp_apicid);
    printk(BIOS_DEBUG, "cpu_init_detectedx = %08lx \n", cpu_init_detectedx);

    /* Setup sysinfo defaults */
    set_sysinfo_in_ram(0);

#if CONFIG_UPDATE_CPU_MICROCODE
    update_microcode(val);
#endif
    post_code(0x33);

    cpuSetAMDMSR();
    post_code(0x34);

    amd_ht_init(sysinfo);
    post_code(0x35);

    /* Setup nodes PCI space and start core 0 AP init. */
    finalize_node_setup(sysinfo);

    /* Setup any mainboard PCI settings etc. */
    setup_mb_resource_map();
    post_code(0x36);

    /* wait for all the APs core0 started by finalize_node_setup. */
    /* FIXME: A bunch of cores are going to start output to serial at once.
     * It would be nice to fixup prink spinlocks for ROM XIP mode.
     * I think it could be done by putting the spinlock flag in the cache
     * of the BSP located right after sysinfo.
     */

    wait_all_core0_started();
#if CONFIG_LOGICAL_CPUS
    /* Core0 on each node is configured. Now setup any additional cores. */
    printk(BIOS_DEBUG, "start_other_cores()\n");
    start_other_cores();
    post_code(0x37);
    wait_all_other_cores_started(bsp_apicid);
#endif

    post_code(0x38);

#if CONFIG_SET_FIDVID
    msr = rdmsr(0xc0010071);
    printk(BIOS_DEBUG, "\nBegin FIDVID MSR 0xc0010071 0x%08x 0x%08x \n", msr.hi, msr.lo);

    /* FIXME: The sb fid change may survive the warm reset and only
     * need to be done once.*/

    enable_fid_change_on_sb(sysinfo->sbbusn, sysinfo->sbdn);
    post_code(0x39);

    if (!warm_reset_detect(0)) {      // BSP is node 0
        init_fidvid_bsp(bsp_apicid, sysinfo->nodes);
    } else {
        init_fidvid_stage2(bsp_apicid, 0);  // BSP is node 0
    }

    post_code(0x3A);

    /* show final fid and vid */
    msr=rdmsr(0xc0010071);
    printk(BIOS_DEBUG, "End FIDVIDMSR 0xc0010071 0x%08x 0x%08x \n", msr.hi, msr.lo);
#endif

    init_timer(); // Need to use TMICT to synconize FID/VID

    wants_reset = mcp55_early_setup_x();

    /* Reset for HT, FIDVID, PLL and errata changes to take affect. */
    if (!warm_reset_detect(0)) {
        print_info("...WARM RESET...\n\n\n");
        soft_reset();
        die("After soft_reset_x - shouldn't see this message!!!\n");
    }

    if (wants_reset)
        printk(BIOS_DEBUG, "mcp55_early_setup_x wanted additional reset!\n");

    post_code(0x3B);

    /* It's the time to set ctrl in sysinfo now; */
    printk(BIOS_DEBUG, "fill_mem_ctrl()\n");
    fill_mem_ctrl(sysinfo->nodes, sysinfo->ctrl, spd_addr);

    post_code(0x3D);

//printk(BIOS_DEBUG, "enable_smbus()\n");
//        enable_smbus(); /* enable in sio_setup */

    post_code(0x40);

    printk(BIOS_DEBUG, "raminit_amdmct()\n");
    raminit_amdmct(sysinfo);
    post_code(0x41);

    post_cache_as_ram();  // BSP switch stack to ram, copy then execute LB.
    post_code(0x42);  // Should never see this post code.
}
Beispiel #4
0
void cache_as_ram_main(unsigned long bist, unsigned long cpu_init_detectedx)
{
/* The SPD is being read from the CPU1 (marked CPU2 on the board) and we
   don't know how to switch the SMBus to decode the CPU0 SPDs. So, The
   memory on each CPU must be an exact match.
 */
	static const uint16_t spd_addr[] = {
		// Node 0
		RC0 | DIMM0, RC0 | DIMM2,
		RC0 | DIMM4, RC0 | DIMM6,
		RC0 | DIMM1, RC0 | DIMM3,
		RC0 | DIMM5, RC0 | DIMM7,
		// Node 1
		RC1 | DIMM0, RC1 | DIMM2,
		RC1 | DIMM4, RC1 | DIMM6,
		RC1 | DIMM1, RC1 | DIMM3,
		RC1 | DIMM5, RC1 | DIMM7,
	};

	struct sys_info *sysinfo = &sysinfo_car;
	int needs_reset = 0;
	unsigned bsp_apicid = 0;

	if (!cpu_init_detectedx && boot_cpu()) {
		/* Nothing special needs to be done to find bus 0 */
		/* Allow the HT devices to be found */
		enumerate_ht_chain();
		sio_setup();
	}

	if (bist == 0)
		bsp_apicid = init_cpus(cpu_init_detectedx, sysinfo);

	w83627hf_set_clksel_48(DUMMY_DEV);
	winbond_enable_serial(SERIAL_DEV, CONFIG_TTYS0_BASE);

	console_init();

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

	printk(BIOS_DEBUG, "*sysinfo range: [%p,%p]\n",sysinfo,sysinfo+1);

	setup_mb_resource_map();

	printk(BIOS_DEBUG, "bsp_apicid=%02x\n", bsp_apicid);

	set_sysinfo_in_ram(0);	// in BSP so could hold all ap until sysinfo is in ram
#if CONFIG_DEBUG_SMBUS
	dump_smbus_registers();
#endif
	setup_coherent_ht_domain();	// routing table and start other core0

	wait_all_core0_started();
#if CONFIG_LOGICAL_CPUS
	// It is said that we should start core1 after all core0 launched
	/* becase optimize_link_coherent_ht is moved out from setup_coherent_ht_domain,
	 * So here need to make sure last core0 is started, esp for two way system,
	 * (there may be apic id conflicts in that case)
	 */
	start_other_cores();
	wait_all_other_cores_started(bsp_apicid);
#endif

	/* it will set up chains and store link pair for optimization later */
	ht_setup_chains_x(sysinfo);	// it will init sblnk and sbbusn, nodes, sbdn

#if CONFIG_SET_FIDVID
	{
		msr_t msr;
		msr = rdmsr(0xc0010042);
		printk(BIOS_DEBUG, "begin msr fid, vid %08x%08x\n", msr.hi, msr.lo);
	}
	enable_fid_change();
	enable_fid_change_on_sb(sysinfo->sbbusn, sysinfo->sbdn);
	init_fidvid_bsp(bsp_apicid);
	// show final fid and vid
	{
		msr_t msr;
		msr = rdmsr(0xc0010042);
		printk(BIOS_DEBUG, "end   msr fid, vid %08x%08x\n", msr.hi, msr.lo);
	}
#endif

	init_timer(); /* Need to use TMICT to synchronize FID/VID. */

	needs_reset |= optimize_link_coherent_ht();
	needs_reset |= optimize_link_incoherent_ht(sysinfo);
	needs_reset |= mcp55_early_setup_x();

	// fidvid change will issue one LDTSTOP and the HT change will be effective too
	if (needs_reset) {
		printk(BIOS_INFO, "ht reset -\n");
		soft_reset();
	}

	allow_all_aps_stop(bsp_apicid);

	//It's the time to set ctrl in sysinfo now;
	fill_mem_ctrl(sysinfo->nodes, sysinfo->ctrl, spd_addr);

	enable_smbus();		/* enable in sio_setup */

	/* all ap stopped? */

	sdram_initialize(sysinfo->nodes, sysinfo->ctrl, sysinfo);

	post_cache_as_ram();	// bsp swtich stack to RAM and copy sysinfo RAM now
}