Exemple #1
0
void set_nbmc_enable_bits(device_t nb_dev, u32 reg_pos, u32 mask, u32 val)
{
	u32 reg_old, reg;
	reg = reg_old = nbmc_read_index(nb_dev, reg_pos);
	reg &= ~mask;
	reg |= val;
	if (reg != reg_old) {
		nbmc_write_index(nb_dev, reg_pos, reg);
	}
}
Exemple #2
0
/*****************************************
* Compliant with CIM_33's ATINB_MiscClockCtrl
*****************************************/
void static rs690_config_misc_clk(device_t nb_dev)
{
	u32 reg;
	u16 word;
	/* u8 byte; */
	struct bus pbus; /* fake bus for dev0 fun1 */

	reg = pci_read_config32(nb_dev, 0x4c);
	reg |= 1 << 0;
	pci_write_config32(nb_dev, 0x4c, reg);

	word = pci_cf8_conf1.read16(&pbus, 0, 1, 0xf8);
	word &= 0xf00;
	pci_cf8_conf1.write16(&pbus, 0, 1, 0xf8, word);

	word = pci_cf8_conf1.read16(&pbus, 0, 1, 0xe8);
	word &= ~((1 << 12) | (1 << 13) | (1 << 14));
	word |= 1 << 13;
	pci_cf8_conf1.write16(&pbus, 0, 1, 0xe8, word);

	reg =  pci_cf8_conf1.read32(&pbus, 0, 1, 0x94);
	reg &= ~((1 << 16) | (1 << 24) | (1 << 28));
	pci_cf8_conf1.write32(&pbus, 0, 1, 0x94, reg);

	reg = pci_cf8_conf1.read32(&pbus, 0, 1, 0x8c);
	reg &= ~((1 << 13) | (1 << 14) | (1 << 24) | (1 << 25));
	reg |= 1 << 13;
	pci_cf8_conf1.write32(&pbus, 0, 1, 0x8c, reg);

	reg = pci_cf8_conf1.read32(&pbus, 0, 1, 0xcc);
	reg |= 1 << 24;
	pci_cf8_conf1.write32(&pbus, 0, 1, 0xcc, reg);

	reg = nbmc_read_index(nb_dev, 0x7a);
	reg &= ~0x3f;
	reg |= 1 << 2;
	reg &= ~(1 << 6);
	set_htiu_enable_bits(nb_dev, 0x05, 1 << 11, 1 << 11);
	nbmc_write_index(nb_dev, 0x7a, reg);
	/* Powering Down efuse and strap block clocks after boot-up. GFX Mode. */
	reg = pci_cf8_conf1.read32(&pbus, 0, 1, 0xcc);
	reg &= ~(1 << 23);
	reg |= 1 << 24;
	pci_cf8_conf1.write32(&pbus, 0, 1, 0xcc, reg);
#if 0
	/* Powerdown reference clock to graphics core PLL in northbridge only mode */
	reg = pci_cf8_conf1.read32(&pbus, 0, 1, 0x8c);
	reg |= 1 << 21;
	pci_cf8_conf1.write32(&pbus, 0, 1, 0x8c, reg);

	/* Powering Down efuse and strap block clocks after boot-up. NB Only Mode. */
	reg = pci_cf8_conf1.read32(&pbus, 0, 1, 0xcc);
	reg |= (1 << 23) | (1 << 24);
	pci_cf8_conf1.write32(&pbus, 0, 1, 0xcc, reg);

	/* Powerdown clock to memory controller in northbridge only mode */
	byte = pci_cf8_conf1.read8(&pbus, 0, 1, 0xe4);
	byte |= 1 << 0;
	pci_cf8_conf1.write8(&pbus, 0, 1, 0xe4, reg);

	/* CLKCFG:0xE8 Bit[17] = 0x1 	 Powerdown clock to IOC GFX block in no external graphics mode */
	/* TODO: */
#endif

	reg = pci_read_config32(nb_dev, 0x4c);
	reg &= ~(1 << 0);
	pci_write_config32(nb_dev, 0x4c, reg);

	set_htiu_enable_bits(nb_dev, 0x05, 7 << 8, 7 << 8);
}
Exemple #3
0
/*
 * nb_misc_clock :
 * rs690 misc clock parameters setting
 */
static void nb_misc_clock(void)
{
	pcitag_t clk_dev = _pci_make_tag(0, 0, 1);
	pcitag_t nb_dev = _pci_make_tag(0, 0, 0);
	pcitag_t gfx_dev2 = _pci_make_tag(0, 2, 0);
	u8 rev = get_nb_revision();
	u32 val;

	/* visible CLK func */
	set_nbcfg_enable_bits(nb_dev, 0x4C, 1 << 0, 1 << 0);

	if(ati_nb_cfg.ext_config & EXT_DEBUG_NB_DYNAMIC_CLK){
		/* disable NB dynamic clock to htiu rx */
		set_nbcfg_enable_bits(clk_dev, 0xE8, 0x07 << 12, 1 << 13);
		/* ENABLE : CLKGATE_DIS_GFX_TXCLK & CLKGATE_DIS_GPPSB_CCLK & CLKGATE_DIS_CFG_S1X */
		set_nbcfg_enable_bits(clk_dev, 0x94, (1 << 16) | (1 << 24) | (1 << 28), 0);
		/* ENABEL : CLKDATE_DIS_IOC_CCLK_MST/SLV, enabel clkdate for C/MCLK goto BIF branch  */
		set_nbcfg_enable_bits(clk_dev, 0x8C, (1 << 13) | (1 << 14) | (1 << 24) | (1 << 25), 0);

		if(rev < REV_RS690_A21){
			/* CKLGATE_DIS_IO_CCLK_MST  */
			set_nbcfg_enable_bits(clk_dev, 0x8C, 1 << 13, 1 << 13);
		}
	
		/* Powering Down efuse and strap block clocks in GFX mode as default */
		set_nbcfg_enable_bits(clk_dev, 0xCC, 1 << 24, 1 << 24);
		/* dynamic clock setting for MC and HTIU */
		val = nbmc_read_index(nb_dev, 0x7A);
		val &= 0xffffffc0;
		val |= 1 << 2;
		if(rev >= REV_RS690_A21){
			val &= ~(1 << 6);
			set_htiu_enable_bits(nb_dev, 0x05, 1 << 11, 1 << 11);
		}
		nbmc_write_index(nb_dev, 0x7A, val);

		if(ati_nb_cfg.gfx_config & (GFX_SP_ENABLE | GFX_UMA_ENABLE)){
			/* Powering Down efuse and strap block clocks in GFX mode : PWM???*/
			set_nbcfg_enable_bits(clk_dev, 0xCC, (1 << 23) | (1 << 24), 1 << 24);
		}else{
			/* nb only mode */
			/* Powers down reference clock to graphics core PLL */
			set_nbcfg_enable_bits(clk_dev, 0x8C, 1 << 21, 1 << 21);
			/* Powering Down efuse and strap block clocks after boot-up */
			set_nbcfg_enable_bits(clk_dev, 0xCC, (1 << 23) | (1 << 24), (1 << 23) | (1 << 24));
			/* powerdown clock to MC */
			set_nbcfg_enable_bits(clk_dev, 0xE4, 1 << 0, 1 << 0);
		}

		if(ati_nb_cfg.pcie_gfx_info == 0){
			if(_pci_conf_read(gfx_dev2, 0x00) == 0xffffffff){
				/* Powerdown GFX ports clock when no external GFX detected */
				set_nbcfg_enable_bits(clk_dev, 0xE8, 1 << 17, 1 << 17);
			}
		}
	}

	/* hide CLK func */
	set_nbcfg_enable_bits(nb_dev, 0x4C, 1 << 0, 0 << 0);

	if(rev >= REV_RS690_A21){
		set_htiu_enable_bits(nb_dev, 0x05, (1 << 8) | (1 << 9), (1 << 8) | (1 << 9));
		set_htiu_enable_bits(nb_dev, 0x05, (1 << 10), (1 << 10));
	}
	
	DEBUG_INFO("NB POST STAGE : nb_misc_clock function : should we use PWM for efuse and strap powerdown?\n");

	return;
}