[coreboot] porting Coreboot to a new motherboard....

ali hagigat hagigatali at gmail.com
Tue Feb 14 18:48:48 CET 2012


I have initialized Intel 82815 SDRAM controller but for a special type
of RAM without reading SPD registers. I know that DRP register is :
0xCC. I added the code to Coreboot.

I tested much and concluded that RAM has a problem in a way as you
guys told me before. When i change the hardwaremain() , even adding
some code which are bypassed, the results of the post code numbers
become different!

I do not know what to do! c_start.S is OK and it is executed and the
program starts executing hardwaremain() but adding code to the
hardwaremain() any where seems to disorder printed post code values.

Is there any interrupt or timer set immediately after hardwaremain()?

I checked coreboot_ram in build/. The assembly code of hardwaremian() seems OK.


void sdram_enable(void)
{
	asm("pushal");
	asm("push %eax");
	asm("push %ebx");
	asm("push %ecx");
	asm("push %edx");
	asm("push %esi");
	asm("push %edi");
	asm("push %esp");
	asm("push %ebp");
	asm("pushfl");
	asm("jmp  firstlbl");
	asm("mov  %ax, %ax");
	asm("nop");

/* Cache disable */
asm("firstlbl:");
	asm("mov  %cr0, %eax");
	asm("and  $0x9fffffff, %eax");
	asm("or   $0x40000000, %eax");
	asm("mov  %eax, %cr0");


/* Configure the RAM command. */

	asm("mov	$0x0cf8, %dx");
	asm("mov	$0x80000050, %eax"); 			
	asm("out	%eax, %dx");	
	
	asm("movw $0x0CFC, %dx");
	asm("in %dx, %eax");

	asm("and $0x1fffffff, %eax");
	asm("or $0x05000000, %eax");

	asm("movw	$0x0CFC, %dx");
	asm("out	%eax, %dx");

//general initialization


//50-53**************************
	asm("mov	  $0x0cf8, %dx");
	asm("mov   $0x80000050, %eax"); 			
	asm("out   %eax, %dx");
	
	asm("mov $0x0cfc, %dx");
	asm("in %dx, %eax");

//Res mask
	asm("and $0x0000F823, %eax");

//Bios => cas 2clk
	asm("or $0x2fcc0140, %eax");

	asm("mov  $0x0cfc, %dx");
	asm("out %eax, %dx");

//70,72-73**************************
	asm("mov	  $0x0cf8, %dx");
	asm("mov   $0x80000070, %eax"); 			
	asm("out   %eax, %dx");	

	asm("mov   $0x0cfc, %dx");
	asm("movb   $0xc0, %al");
	asm("out   %al, %dx");

	asm("mov $0x0cfe, %dx");
	asm("inw %dx, %ax");

//Res mask
	asm("and $0x7704, %ax");
//Bios
	asm("or $0x0012, %ax");

	asm("mov  $0x0cfe, %dx");
	asm("out %ax, %dx");


//92-93****************************
	asm("mov	$0x0cf8, %dx");
	asm("mov   $0x80000090, %eax"); 			
	asm("out   %eax, %dx");	

	asm("mov   $0x0cfe, %dx");
	asm("movw   $0xff5c, %ax");
	asm("out   %ax, %dx");


//#94-95*****************************
	asm("mov	  $0x0cf8, %dx");
	asm("mov   $0x80000094, %eax"); 			
	asm("out   %eax, %dx");	

	asm("mov $0x0cfe, %dx");
	asm("inw %dx, %ax");

//#Res mask
	asm("and $0xffc0, %ax");
//#Bios
	asm("or $0x001c, %ax");

	asm("mov  $0x0cfe, %dx");
	asm("out %ax, %dx");

//#98-9B*****************************
	asm("mov	  $0x0cf8, %dx");
	asm("mov   $0x80000098, %eax"); 			
	asm("out   %eax, %dx");

	asm("movw $0x0cfc, %dx");
	asm("in %dx, %eax");

//#Res mask
	asm("and $0x7F887F88, %eax");
//#Bios
	asm("or $0x80238023, %eax");

	asm("movw  $0x0cfc, %dx");
	asm("out %eax, %dx");

//#9c-9f***************************
	asm("mov	  $0x0cf8, %dx");
	asm("mov   $0x8000009c, %eax"); 			
	asm("out   %eax, %dx");	
	asm("	movw $0x0CFC, %dx");
	asm("in %dx, %eax");

//#Res mask
	asm("and $0xFFFF7FFF, %eax");
//#Bios
	asm("or $0x00008000, %eax");

	asm("movw  $0x0CFC, %dx");
	asm("out %eax, %dx");

//#2c-2f***************************
	asm("mov	  $0x0cf8, %dx");
	asm("mov   $0x8000002c, %eax"); 			
	asm("out   %eax, %dx");	
	
	asm("mov   $0x0cfc, %dx");
	asm("mov   $0x80271043, %eax");
	asm("out   %eax, %dx");

//58-5b**************************
	asm("mov	  $0x0cf8, %dx");
	asm("mov   $0x80000058, %eax"); 			
	asm("out   %eax, %dx");
	
	asm("mov $0x0cfc, %dx");
	asm("in %dx, %eax");

	asm("and $0xcccccf7f, %eax");
	asm("or $0x33333000, %eax");

	asm("mov  $0x0cfc, %dx");
	asm("out %eax, %dx");


//5c-5f**************************
	asm("mov	  $0x0cf8, %dx");
	asm("mov   $0x8000005c, %eax"); 			
	asm("out   %eax, %dx");
	
	asm("mov $0x0cfc, %dx");
	asm("in %dx, %eax");

	asm("and $0xcccccccc, %eax");
	asm("or  $0x33333333, %eax");

	asm("mov  $0x0cfc, %dx");
	asm("out %eax, %dx");

//#;--------------------------------------------------
//#NOP /* 1. Apply NOP. */


	//#display 1

	asm("mov   $1, %al");
	asm("out   %al, $0x80");

//#%%%%%%%%%%%%%%%%%%%%

	asm("mov	  $0x0cf8, %dx");
	asm("mov   $0x80000050, %eax"); 			
	asm("out   %eax, %dx");	

	asm("mov $0x0cfc, %dx");
	asm("in %dx, %eax");

//#Res mask
	asm("and $0x0000F823, %eax");

//#Bios => cas 2clk
	asm("or $0x8fcc0140, %eax");

	asm("mov  $0x0cfc, %dx");
	asm("out %eax, %dx");

//#%%%%%%%%%%%%%%%%%%%%%%

	asm("mov   $0x00000000, %ebx");
	asm("mov   (%ebx), %eax");

	asm("mov   $0x08000000, %ebx");
	asm("mov   (%ebx), %eax");

	asm("mov   $0x10000000, %ebx");
	asm("mov   (%ebx), %eax");

	asm("mov   $0x18000000, %ebx");
	asm("mov   (%ebx), %eax");


//#%%%%%%%%%%%%%%%%%%%%%

	asm("mov     $1, %di");
asm("delay11:");
	asm("mov     $200000, %ecx");
asm("delay1:");
	asm("dec     %ecx");
	asm("jnz     delay1");
	asm("dec     %di");
	asm("jnz     delay11");


//#;--------------------------------------------------
//#precharge	/* 2. Precharge all. Wait tRP. */

	//#display 2

	asm("mov   $2, %al");
	asm("out   %al, $0x80");

//#%%%%%%%%%%%%%%%%%%%%%%

	asm("mov	  $0x0cf8, %dx");
	asm("mov   $0x80000050, %eax"); 			
	asm("out   %eax, %dx");	

	asm("mov $0x0cfc, %dx");
	asm("in %dx, %eax");

//#Res mask
	asm("and $0x0000F823, %eax");
//#Bios => cas 2clk
	asm("or $0xafcc0140, %eax");
	asm("mov  $0x0cfc, %dx");
	asm("out %eax, %dx");

//#%%%%%%%%%%%%%%%%%%%%%%

	asm("mov   $0x00000000, %ebx");
	asm("mov   %ds:(%ebx), %eax");

	asm("mov   $0x08000000, %ebx");
	asm("mov   %ds:(%ebx), %eax");

	asm("mov   $0x10000000, %ebx");
	asm("mov   %ds:(%ebx), %eax");

	asm("mov   $0x18000000, %ebx");
	asm("mov   %ds:(%ebx), %eax");

//#%%%%%%%%%%%%%%%%%%%%%%%

	asm("mov   $10, %di");
asm("delay21:");
	asm("mov   $1000, %ecx");
asm("delay2:");
	asm("dec   %ecx");
	asm("jnz   delay2");
	asm("dec   %di");
	asm("jnz   delay21 ");

//#;--------------------------------------------------
//#CBR cycle	/* 3. Perform 8 refresh cycles. Wait tRC each time. */

	//#display 3

	asm("mov   $3, %al");
	asm("out   %al, $0x80");

//#%%%%%%%%%%%%%%%%%%%%%%

	asm("mov   $8, %esi");
asm("refreshcycle:");
	asm("mov	  $0x0cf8, %dx");
	asm("mov   $0x80000050, %eax"); 			
	asm("out   %eax, %dx");	


	asm("mov $0x0cfc, %dx");
	asm("in %dx, %eax");

//#Res mask
	asm("and $0x0000F823, %eax");

//#Bios => cas 2clk
	asm("or $0xefcc0140, %eax");

	asm("mov  $0x0cfc, %dx");
	asm("out %eax, %dx");
//#%%%%%%%%%%%%%%%%%%%%%%%

	asm("mov   $0x00000000, %ebx");
	asm("mov   %ds:(%ebx), %eax");

	asm("mov   $0x08000000, %ebx");
	asm("mov   %ds:(%ebx), %eax");

	asm("mov   $0x10000000, %ebx");
	asm("mov   %ds:(%ebx), %eax");

	asm("mov   $0x18000000, %ebx");
	asm("mov   %ds:(%ebx), %eax");

//#%%%%%%%%%%%%%%%%%%%%%%%

	asm("mov   $10, %di");
asm("delay31:");
	asm("mov   $1000, %ecx");
asm("delay3:");
	asm("dec   %ecx");
	asm("jnz   delay3");
	asm("dec   %di");
	asm("jnz   delay31");

	asm("dec   %esi");
	asm("jnz   refreshcycle");

//#;--------------------------------------------------
//#mode register set	/* 4. Mode register set. Wait two memory cycles. */

	//#display 4

	asm("mov   $4, %al");
	asm("out   %al, $0x80");

//#%%%%%%%%%%%%%%%%%%%%%%%%%

	asm("mov	  $0x0cf8, %dx");
	asm("mov   $0x80000050, %eax"); 			
	asm("out   %eax, %dx");	

	asm("mov $0x0cfc, %dx");
	asm("in %dx, %eax");

//#Res mask
	asm("and $0x0000F823, %eax");
//#Bios => cas 2clk
	asm("or $0xcfcc0140, %eax");

	asm("mov  $0x0cfc, %dx");
	asm("out %eax, %dx");

//#%%%%%%%%%%%%%%%%%%%%%%%%

//#1d0 =>150 => 03a
//#650 => 650 => 0ca

	asm("mov   $0x0000003a, %ebx");
	asm("mov   %ds:(%ebx), %eax");

	asm("mov   $0x0800003a, %ebx");
	asm("mov   %ds:(%ebx), %eax");

	asm("mov   $0x100000ca, %ebx");
	asm("mov   %ds:(%ebx), %eax");

	asm("mov   $0x180000ca, %ebx");
	asm("mov   %ds:(%ebx), %eax");

//#%%%%%%%%%%%%%%%%%%%%%%%%%%%

	asm("mov   $10, %di");
asm("delay41:");
	asm("mov   $1000, %ecx");
asm("delay4:");
	asm("dec     %ecx");
	asm("jnz     delay4");
	asm("dec     %di");
	asm("jnz     delay41");

//#;--------------------------------------------------
//#normal operation	/* 5. Normal operation (enables refresh at 15.6usec). */

	//#display 5

	asm("mov   $5, %al");
	asm("out   %al, $0x80");

//#%%%%%%%%%%%%%%%%%%%%%%%%%%

	asm("mov	  $0x0cf8, %dx");
	asm("mov   $0x80000050, %eax"); 			
	asm("out   %eax, %dx");	
	
	asm("mov $0x0cfc, %dx");
	asm("in %dx, %eax");

//#Res mask
	asm("and $0x0000F823, %eax");
//#Bios => cas 2clk
	asm("or $0x2fcc0140, %eax");

	asm("mov  $0x0cfc, %dx");
	asm("out %eax, %dx");

//#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

	asm("mov   $0x00000000, %ebx");
	asm("mov   %ds:(%ebx), %eax");

	asm("mov   $0x08000000, %ebx");
	asm("mov   %ds:(%ebx), %eax");

	asm("mov   $0x10000000, %ebx");
	asm("mov   %ds:(%ebx), %eax");

	asm("mov   $0x18000000, %ebx");
	asm("mov   %ds:(%ebx), %eax");

//#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

	asm("mov   $10, %di");
asm("delay51:");
	asm("mov   $1000, %ecx");
asm("delay5:");
	asm("dec     %ecx");
	asm("jnz     delay5");
	asm("dec     %di");
	asm("jnz     delay51");

//#;--------------------------------------------------
	asm("mov   $10, %al");
	asm("out   %al, $0x80");
//#;--------------------------------------------------
	
	asm("mov $0xffff, %cx");
asm("delayea1:");
	asm("dec %cx");
	asm("jnz delayea1");

	//asm("mov  %cr0, %eax");
	//asm("and  $0x9fffffff, %eax");
	//asm("mov  %eax, %cr0");


	asm("popfl");
	asm("pop %ebp");
	asm("pop %esp");
	asm("pop %edi");
	asm("pop %esi");
	asm("pop %edx");
	asm("pop %ecx");
	asm("pop %ebx");
	asm("pop %eax");
	asm("popal");
}




More information about the coreboot mailing list