⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gt64120_core.s

📁 MIPS YAMON, a famous monitor inc. source, make file and PDF manuals.
💻 S
📖 第 1 页 / 共 2 页
字号:
	beq	t0, zero, error_sdram	li	v0, ERROR_SDRAM_CASLAT	ori	ACCUM, (GT_SDRAM_B0_CASLAT_2 << GT_SDRAM_B0_CASLAT_SHF)#define DEV_BANKS       s6#define ROWS	        s7#define COLS	        s8	/* s0..s8 used */	/* Number of Rows bits */	li	a0, SPD_ROWS	jal	sys_spd_read	nop	bne	v0, zero, error_sdram	nop	move	ROWS, v1	and	ROWS, SPD_ROWS_A_MSK	srl	ROWS, SPD_ROWS_A_SHF	/* Number of Column bits */	li	a0, SPD_COL	jal	sys_spd_read	nop	bne	v0, zero, error_sdram	nop	move	COLS, v1	and	COLS, COLS, SPD_COL_A_MSK	srl	COLS, SPD_COL_A_SHF	/*  SDRAM device banks.	 *  Note : This is the internal bank count of the SDRAM devices, not to	 *         be confused with the module banks of the SDRAM module.	 */	li	a0, SPD_DEVICE_BANKS	jal	sys_spd_read			nop	bne	v0, zero, error_sdram	nop	move	DEV_BANKS, v1	/* SDRAM device width */	li	a0, SPD_SDRAM_WIDTH	jal	sys_spd_read		nop	bne	v0, zero, error_sdram	nop	and	v1, SPD_SDRAM_WIDTH_W_MSK	srl	v1, SPD_SDRAM_WIDTH_W_SHF	/* Calc SDRAM device size = 	 * dev_width * dev_banks * 2 ^ (rows + columns) 	 */	addu	t0, ROWS, COLS#undef ROWS#undef COLS       /* s0..s6 used */#define DEV_SIZE        s7       /* s0..s7 used */	sll	DEV_SIZE, DEV_BANKS, t0	multu	DEV_SIZE, v1	mflo    DEV_SIZE	/* Setup SDRAM device size (16MBit or 64/128Mbit) */	li	t0, 16 * 1024 * 1024	/* 16 Mbit */	beq	DEV_SIZE, t0, Mbit16	nop	ori	ACCUM, (GT_SDRAM_B0_SIZE_64M << GT_SDRAM_B0_SIZE_SHF)	b	burstlen	nopMbit16:		ori	ACCUM, (GT_SDRAM_B0_SIZE_16M << GT_SDRAM_B0_SIZE_SHF)burstlen:				/* Burst length field : Galileo only supports burstlen = 8 */	li	a0, SPD_BURSTLEN	jal	sys_spd_read	     /* v1 = burstlen byte */	nop	bne	v0, zero, error_sdram	nop	and	t0, v1, SPD_BURSTLEN_8_MSK	beq	t0, zero, error_sdram	li	v0, ERROR_SDRAM_BURSTLEN		ori	ACCUM, (GT_SDRAM_B0_BLEN_8 << GT_SDRAM_B0_BLEN_SHF)	/*  Parity field :	 *  If SDRAM module supports parity, enable parity support.	 *  else if SDRAM module supports ECC, indicate error.	 *  If SDRAM module does not support any of those, disable 	 *  parity support.	 */	/* Determine Parity support */#define PARITY_SUPPORT	s8	/* s0..s8 used */	li	a0, SPD_CONFIG_TYPE	jal	sys_spd_read	    /* v1 = config type byte */	nop	bne	v0, zero, error_sdram	nop	li	t0, SPD_CONFIG_TYPE_PARITY	beq	t0, v1, parity_support	nop	li	t0, SPD_CONFIG_TYPE_ECC	beq	t0, v1, error_sdram	li	v0, ERROR_SDRAM_ERRORCHECK	b	write_banks	move	PARITY_SUPPORT, zeroparity_support:	ori	ACCUM, GT_SDRAM_B0_PAR_BIT	li	PARITY_SUPPORT, 1write_banks:	/* Number of device banks */	li	t0, 2	beq	DEV_BANKS, t0, dev_banks2	li	t0, 4	bne	DEV_BANKS, t0, error_sdram	li	v0, ERROR_SDRAM_DEV_BANKSdev_banks4:		ori	ACCUM, GT_SDRAM_B0_64BITINT_4 << GT_SDRAM_B0_64BITINT_SHF	b	write_bank_parms	nopdev_banks2:				ori	ACCUM, GT_SDRAM_B0_64BITINT_2 << GT_SDRAM_B0_64BITINT_SHFwrite_bank_parms:			move	t0, ACCUM			GT_SW(	ACCUM, GT_SDRAM_B0_OFS, GTBASE )	GT_SW(	t0,    GT_SDRAM_B2_OFS, GTBASE )	/* SDRAM configuration register */	li	ACCUM, GT_SDRAM_CFG_NINTERLEAVE_BIT | GT_SDRAM_CFG_DUPBA_BIT	/*  Set RefIntCnt based on SDRAM module requirements and	 *  the slowest possible bus frequency.	 *  This may later be changed when the bus freq. is known.	 */	/* Determine min refresh rate and type */	li	a0, SPD_RFSH_RT	jal	sys_spd_read	nop	bne	v0, zero, error_sdram	nop	and	v1, SPD_RFSH_RT_RATE_MSK		srl	v1, SPD_RFSH_RT_RATE_SHF		li	t0, SPD_RFSH_RT_RATE_125	/* 125 us */	beq	t0, v1, calc_rfsh_count	li	t0, 125	li	t0, SPD_RFSH_RT_RATE_62_5	/* 62.5 us */	beq	t0, v1, calc_rfsh_count	li	t0, 62		li	t0, SPD_RFSH_RT_RATE_31_3	/* 31.3 us */	beq	t0, v1, calc_rfsh_count	li	t0, 31		li	t0, SPD_RFSH_RT_RATE_15_625	/* 15.625 us */	beq	t0, v1, calc_rfsh_count	li	t0, 15		li	t0, SPD_RFSH_RT_RATE_7_8	/* 7.8 us */	beq	t0, v1, calc_rfsh_count	li	t0, 7		/* assume 3.9us */	li	t0, 3calc_rfsh_count:	/* RefIntCnt = rate (in us) * lowest frequency (in MHz) */		multu	FREQ, t0	mflo 	t0		/* Make sure the result fits in the REFINT field */	li	t1, (GT_SDRAM_CFG_REFINT_MSK >> GT_SDRAM_CFG_REFINT_SHF)	sltu	t2, t1, t0	beq	t2, zero, set_refint	nop	move	t0, t1	/* Set refintcnt = max value */set_refint:			/* Add the result to ACCUM */	sll	t0, GT_SDRAM_CFG_REFINT_SHF	or	ACCUM, t0	/*  Setup RMW bit :	 *  If parity is enabled AND SDRAM module contains SDRAM	 *  device(s) dedicated to parity (as opposed to SDRAM 	 *  modules where parity bit is included in each SDRAM device)	 *  then Enable else Disable.	 */		beq     PARITY_SUPPORT, zero, store_sdram_cfg		/* Read Error Checking RAM width */	li	a0, SPD_EC_SDRAM	jal	sys_spd_read	nop	bne	v0, zero, error_sdram	nop	and	v1, SPD_EC_SDRAM_WIDTH_MSK	beq	v1, zero, store_sdram_cfg	noprmw:		ori	ACCUM, GT_SDRAM_CFG_RMW_BIT	store_sdram_cfg :		/* Ready to store CALC in SDRAM configuration register */	GT_SW(	ACCUM, GT_SDRAM_CFG_OFS, GTBASE )        /**** Setup decoding ****/	/* SCS[1:0] */	move	LO,    zero	add	HI,    LO, BSIZE0	add	REGLO, GTBASE, GT_SCS10LD_OFS	add	REGHI, GTBASE, GT_SCS10HD_OFS	jal	setup_cpu_decode	nop	bne	v0,    zero, error_sdram	nop	/* SCS0 */	add	REGLO, GTBASE, GT_SCS0LD_OFS	add	REGHI, GTBASE, GT_SCS0HD_OFS	jal	setup_dev_decode	nop	/* SCS1 (not used) */	move	HI,    zero	add	REGLO, GTBASE, GT_SCS1LD_OFS	add	REGHI, GTBASE, GT_SCS1HD_OFS	jal	setup_dev_decode	nop	/* SCS[3:2] */	move	LO,    BSIZE0	add	HI,    LO, BSIZE1	add	REGLO, GTBASE, GT_SCS32LD_OFS	add	REGHI, GTBASE, GT_SCS32HD_OFS	jal	setup_cpu_decode	nop	bne	v0,    zero, error_sdram	nop	/* SCS2 */	add	REGLO, GTBASE, GT_SCS2LD_OFS	add	REGHI, GTBASE, GT_SCS2HD_OFS	jal	setup_dev_decode	nop	/* SCS3 (not used) */	move	HI, zero	add	REGLO, GTBASE, GT_SCS3LD_OFS	add	REGHI, GTBASE, GT_SCS3HD_OFS	jal	setup_dev_decode	nop	move	v0, zero	addu	v1, BSIZE0, BSIZE1error_sdram:	jr	RA	nop#undef RA#undef FREQ#undef BSIZE0#undef BSIZE1#undef GTBASE#undef ACCUM#undef DEV_BANKS#undef DEV_SIZE#undef PARITY_SUPPORT	END(gt64120_configure_sdram)		/************************************************************************	 * *                          gt64120_setup_decode *  Description : *  ------------- * *  Setup GT64120 memory decoding (except for SDRAM). * *  Parameters : *  ------------ * *  a0 = PCI memory space base *  a1 = PCI memory space size *  a2 = PCI I/O space base *  a3 = PCI I/O space size *  t0 = CBUS base *  t1 = CBUS size *  t2 = Base address to be used for access to North Bridge registers. * *  Return values : *  --------------- * *  0 :				No error. *  ERROR_NB_DECODE :		Illegal ranges requested. * ************************************************************************/SLEAF(gt64120_setup_decode)#define RA		s0#define PCIMEM_BASE	s1#define PCIMEM_SIZE	s2#define PCIIO_BASE	s3#define PCIIO_SIZE	s4#define CBUS_BASE	s5#define CBUS_SIZE	s6#define GTBASE		s7	move	RA,           ra	move	PCIMEM_BASE,  a0	move	PCIMEM_SIZE,  a1	move	PCIIO_BASE,   a2	move	PCIIO_SIZE,   a3	move	CBUS_BASE,    t0	move	CBUS_SIZE,    t1	move	GTBASE,	      t2	/**** PCI0_MEM0 ****/		/*  Adjust the banksize to that it is contained within 	 *  a 256MB block (addr[31:28] constant).	 */	move	LO, PCIMEM_BASE	srl	t0, LO, 28		/* t0 = LO[31:28]	    */	addu	HI, LO, PCIMEM_SIZE	/* HI address before adjust */	subu	t1, HI, 1	srl	t1, 28			/* t1 = (HI-1)[31:28]  	    */	beq	t0, t1, 1f	nop	/* We crossed a 256MB boundary. Limit HI to boundary address */	addu    t0, 1	sll	HI, t0, 281:	/*  Adjust the banksize so that it allows PCI IO to	 *  be present as a "red page" in the middle.	 */	sltu	t0, PCIIO_BASE, HI	beq	t0, zero, 3f	nop	move	HI, PCIIO_BASE3:	/* Store HI since we will need it for PCI0_MEM1 */	move	t3, HI	/* Setup decode */	add	REGLO, GTBASE, GT_PCI0M0LD_OFS	add	REGHI, GTBASE, GT_PCI0M0HD_OFS	jal	setup_cpu_decode  /* Modifies t0..t2 */	nop	bne	v0,    zero, error_decode	nop	/* Calc whether PCI memory was covered by PCI0_MEM0 */	addu	HI, PCIMEM_BASE, PCIMEM_SIZE	bne	HI, t3, setup_mem1	move	LO, t3	/* We don't need PCI0_MEM1, so disable it */	move	HI, zerosetup_mem1:		/**** PCI0_MEM1 ****/	/* Adjust the bankstart so that it does not interfeer with PCI IO */	add	t1, PCIIO_BASE, PCIIO_SIZE	sltu	t0, LO, t1	beq	t0, zero, 1f	nop	move	LO, t11:	add	REGLO, GTBASE, GT_PCI0M1LD_OFS	add	REGHI, GTBASE, GT_PCI0M1HD_OFS	jal	setup_cpu_decode	nop	bne	v0,    zero, error_decode	nopsetup_io:		/**** PCI0_IO ****/	move	LO, PCIIO_BASE	addu	HI, LO, PCIIO_SIZE	add	REGLO, GTBASE, GT_PCI0IOLD_OFS	add	REGHI, GTBASE, GT_PCI0IOHD_OFS	jal	setup_cpu_decode	nop	bne	v0,    zero, error_decode	nop	/**** PCI1 (not used) ****/	move	HI, zero	add	REGLO, GTBASE, GT_PCI1M0LD_OFS	add	REGHI, GTBASE, GT_PCI1M0HD_OFS	jal	setup_cpu_decode	nop	add	REGLO, GTBASE, GT_PCI1M1LD_OFS	add	REGHI, GTBASE, GT_PCI1M1HD_OFS	jal	setup_cpu_decode	nop	add	REGLO, GTBASE, GT_PCI1IOLD_OFS	add	REGHI, GTBASE, GT_PCI1IOHD_OFS	jal	setup_cpu_decode	nop	/**** CS[2:0] ****/	move	LO, CBUS_BASE	add     HI, LO, CBUS_SIZE	add	REGLO, GTBASE, GT_CS20LD_OFS	add	REGHI, GTBASE, GT_CS20HD_OFS	jal	setup_cpu_decode	nop	bne	v0,    zero, error_decode	nop	/* CS0 */	add	REGLO, GTBASE, GT_CS0LD_OFS	add	REGHI, GTBASE, GT_CS0HD_OFS	jal	setup_dev_decode	nop		/* CS1, CS2 (not used) */	move	HI, zero	add	REGLO, GTBASE, GT_CS1LD_OFS	add	REGHI, GTBASE, GT_CS1HD_OFS	jal	setup_dev_decode	nop	add	REGLO, GTBASE, GT_CS2LD_OFS	add	REGHI, GTBASE, GT_CS2HD_OFS	jal	setup_dev_decode	nop			/**** Done, return to caller ****/done:	move	v0, zeroerror_decode :	jr	RA	nop#undef RA#undef PCIMEM_BASE#undef PCIMEM_SIZE#undef PCIIO_BASE#undef PCIIO_SIZE#undef CBUS_BASE#undef CBUS_SIZE#undef GTBASEEND(gt64120_setup_decode)/************************************************************************	 * *                          gt64120_remap_pci_io *  Description : *  ------------- * *  Remap PCI IO range so that PCI IO range starts at address 0 on *  PCI (NB no longer transparent for PCI IO). * *  Parameters : *  ------------ * *  a0 = Base address to be used for access to North Bridge registers. * *  Return values : *  --------------- * *  None * ************************************************************************/SLEAF(gt64120_remap_pci_io)		sw	zero,  GT_PCI0IORMP_OFS(a0)	jr	ra	nopEND(gt64120_remap_pci_io)/************************************************************************ *  Implementation : Static functions ************************************************************************//*  Functions for setup of GT64120 cpu/device decoder * *  Input parameters : *  ------------------ *  LO    (a0) = lo   address *  HI    (a1) = high address	 *  REGLO (a2) = lo   register *  REGHI (a3) = high register *//************************************************************************	 *                          setup_cpu_decode ************************************************************************/SLEAF(setup_cpu_decode)	/* Check that LO and HI addresses are 2MB aligned (LO[20:0] == 0) */	li	t0, MSK(21)	and	t0, LO	bne	t0, zero, error_cpu_decode	nop	/*  Check that LO and HI are in the same 256 MB block 	 *  ((HI-1)[31:28] == LO[31:28])	 *	 *  Unless HI = 0 indicating that range should be disabled.	 */	beq	HI, zero, 1f	nop        srl	t0, LO, 28	subu	t1, HI, 1	srl	t1, 28	bne	t0, t1, error_cpu_decode	nop1:	b	setup_decode	li	t0, 21error_cpu_decode :	li	v0, ERROR_NB_DECODE		jr      ra	nopEND(setup_cpu_decode)/************************************************************************	 *                          setup_dev_decode ************************************************************************/SLEAF(setup_dev_decode)			b	setup_decode	li	t0, 20END(setup_dev_decode)			/************************************************************************	 *                          setup_decode ************************************************************************/SLEAF(setup_decode)	bne	HI, zero, 1f	nop	li	t1, 0xFFFF	b	2f	move	t2, zero	1:		srlv	t1, LO, t0		subu	t2, HI, 1	srlv	t2, t2, t02:	GT_SW(	t1, 0, REGLO )	GT_SW(	t2, 0, REGHI )	jr	ra	move	v0, zeroEND(setup_decode)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -