linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* 2.6.0 incorrect memory sizing (without a full BIOS)..
@ 2003-12-19  5:04 Dave Airlie
  2003-12-19  8:31 ` William Lee Irwin III
  0 siblings, 1 reply; 4+ messages in thread
From: Dave Airlie @ 2003-12-19  5:04 UTC (permalink / raw)
  To: linux-kernel


Hi all,
	I've got an internal development board based on the Intel 815
chipset and the Intel ACSFL mini-BIOS for embedded systems, and then using
grub 0.93 to boot Linux.

under 2.4 my memory is correctly sized at 256MB, but under 2.6 I'm only
seeing 64MB,

2.6 gives:
BIOS-provided physical RAM map:
 BIOS-88: 0000000000000000 - 000000000009f000 (usable)
 BIOS-88: 0000000000100000 - 00000000040ffc00 (usable)
64MB LOWMEM available

2.4 gives:
BIOS-provided physical RAM map:
 BIOS-e820: 0000000000000000 - 00000000000a0000 (usable)
 BIOS-e820: 00000000000e0000 - 0000000000100000 type 5
 BIOS-e820: 0000000000100000 - 000000000ff00000 (usable)
 BIOS-e820: 000000000ff00000 - 0000000010000000 (reserved)
 BIOS-e820: 00000000fec00000 - 00000000fec00400 type 6
 BIOS-e820: 00000000fee00000 - 00000000fee00400 type 7
 BIOS-e820: 00000000fff00000 - 0000000100000000 type 5

So is this 2.6 just being more fussy about the contents of the e820 that
my "BIOS" is supplying and falling back to the old style detection?

Dave.

-- 
David Airlie, Software Engineer
http://www.skynet.ie/~airlied / airlied at skynet.ie
pam_smb / Linux DECstation / Linux VAX / ILUG person


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: 2.6.0 incorrect memory sizing (without a full BIOS)..
  2003-12-19  5:04 2.6.0 incorrect memory sizing (without a full BIOS) Dave Airlie
@ 2003-12-19  8:31 ` William Lee Irwin III
  2003-12-22 17:41   ` Randy.Dunlap
  0 siblings, 1 reply; 4+ messages in thread
From: William Lee Irwin III @ 2003-12-19  8:31 UTC (permalink / raw)
  To: Dave Airlie; +Cc: linux-kernel

On Fri, Dec 19, 2003 at 05:04:25AM +0000, Dave Airlie wrote:
> 	I've got an internal development board based on the Intel 815
> chipset and the Intel ACSFL mini-BIOS for embedded systems, and then using
> grub 0.93 to boot Linux.
> under 2.4 my memory is correctly sized at 256MB, but under 2.6 I'm only
> seeing 64MB,
[... e88/e820 snipped ...]
> So is this 2.6 just being more fussy about the contents of the e820 that
> my "BIOS" is supplying and falling back to the old style detection?

We've had one other report of something like this. I don't see any
obvious reason why setup.S should be failing in 2.6; diff below. It
could be some kind of binutils issue.

Could I get dmesg and .config from 2.4 and 2.5?


-- wli


The relevant code starts around line 293 and is untouched.

--- linux-2.4/arch/i386/boot/setup.S	2003-12-07 06:38:32.000000000 -0800
+++ linux-2.5/arch/i386/boot/setup.S	2003-12-05 18:58:56.000000000 -0800
@@ -44,13 +44,11 @@
  *
  * New A20 code ported from SYSLINUX by H. Peter Anvin. AMD Elan bugfixes
  * by Robert Schwebel, December 2001 <robert@schwebel.de>
- *
+ *    
  * BIOS Enhanced Disk Drive support
  * by Matt Domsch <Matt_Domsch@dell.com> October 2002
  * conformant to T13 Committee www.t13.org
  *   projects 1572D, 1484D, 1386D, 1226DT
- * disk signature read by Matt Domsch <Matt_Domsch@dell.com>
- *	and Andrew Wilks <Andrew_Wilks@dell.com> September 2003
  */
 
 #include <linux/config.h>
@@ -59,7 +57,7 @@
 #include <linux/compile.h>
 #include <asm/boot.h>
 #include <asm/e820.h>
-#include <asm/edd.h>
+#include <asm/edd.h>    
 #include <asm/page.h>
 	
 /* Signature words to ensure LILO loaded us right */
@@ -164,7 +162,7 @@
 					# can be located anywhere in
 					# low memory 0x10000 or higher.
 
-ramdisk_max:	.long __MAXMEM-1	# (Header version 0x0203 or later)
+ramdisk_max:	.long MAXMEM-1		# (Header version 0x0203 or later)
 					# The highest safe address for
 					# the contents of an initrd
 
@@ -215,7 +213,7 @@
 # Part of above routine, this one just prints ascii al
 prtchr:	pushw	%ax
 	pushw	%cx
-	xorb	%bh, %bh
+	movw	$7,%bx
 	movw	$0x01, %cx
 	movb	$0x0e, %ah
 	int	$0x10
@@ -478,6 +476,24 @@
 	movsb
 	popw	%ds
 no_mca:
+#ifdef CONFIG_X86_VOYAGER
+	movb	$0xff, 0x40	# flag on config found
+	movb	$0xc0, %al
+	mov	$0xff, %ah
+	int	$0x15		# put voyager config info at es:di
+	jc	no_voyager
+	movw	$0x40, %si	# place voyager info in apm table
+	cld
+	movw	$7, %cx
+voyager_rep:
+	movb	%es:(%di), %al
+	movb	%al,(%si)
+	incw	%di
+	incw	%si
+	decw	%cx
+	jnz	voyager_rep
+no_voyager:	
+#endif
 # Check for PS/2 pointing device
 	movw	%cs, %ax			# aka SETUPSEG
 	subw	$DELTA_INITSEG, %ax		# aka INITSEG
@@ -490,6 +506,17 @@
 	movw	$0xAA, (0x1ff)			# device present
 no_psmouse:
 
+#if defined(CONFIG_X86_SPEEDSTEP_SMI) || defined(CONFIG_X86_SPEEDSTEP_SMI_MODULE)
+	movl	$0x0000E980, %eax		# IST Support 
+	movl	$0x47534943, %edx		# Request value
+	int	$0x15
+
+	movl	%eax, (96)
+	movl	%ebx, (100)
+	movl	%ecx, (104)
+	movl	%edx, (108)
+#endif
+
 #if defined(CONFIG_APM) || defined(CONFIG_APM_MODULE)
 # Then check for an APM BIOS...
 						# %ds points to the bootsector
@@ -551,25 +578,6 @@
 #endif
 
 #if defined(CONFIG_EDD) || defined(CONFIG_EDD_MODULE)
-# Read the first sector of device 80h and store the 4-byte signature
-	movl	$0xFFFFFFFF, %eax
-	movl	%eax, (DISK80_SIG_BUFFER)	# assume failure
-	movb	$READ_SECTORS, %ah
-	movb	$1, %al				# read 1 sector
-	movb	$0x80, %dl			# from device 80
-	movb	$0, %dh				# at head 0
-	movw	$1, %cx				# cylinder 0, sector 0
-	pushw	%es
-	pushw	%ds
-	popw	%es
-	movw	$EDDBUF, %bx
-	int	$0x13
-	jc	disk_sig_done
-	movl	(EDDBUF+MBR_SIG_OFFSET), %eax
-	movl	%eax, (DISK80_SIG_BUFFER)	# store success
-disk_sig_done:
-	popw	%es
-
 # Do the BIOS Enhanced Disk Drive calls
 # This consists of two calls:
 #    int 13h ah=41h "Check Extensions Present"
@@ -591,13 +599,13 @@
 # A second one-byte buffer, EDDNR, in the empty_zero_page stores
 # the number of BIOS devices which exist, up to EDDMAXNR.
 # In setup.c, copy_edd() stores both empty_zero_page buffers away
-# for later use, as they would get overwritten otherwise.
+# for later use, as they would get overwritten otherwise. 
 # This code is sensitive to the size of the structs in edd.h
-edd_start:
+edd_start:  
 						# %ds points to the bootsector
        						# result buffer for fn48
     	movw	$EDDBUF+EDDEXTSIZE, %si		# in ds:si, fn41 results
-						# kept just before that
+						# kept just before that    
 	movb	$0, (EDDNR)			# zero value at EDDNR
     	movb	$0x80, %dl			# BIOS device 0x80
 
@@ -614,8 +622,8 @@
     	movb	%ah, %ds:-3(%si)		# store version
 	movw	%cx, %ds:-2(%si)		# store extensions
 	incb	(EDDNR)				# note that we stored something
-
-edd_get_device_params:
+        
+edd_get_device_params:  
 	movw	$EDDPARMSIZE, %ds:(%si)		# put size
     	movb	$GETDEVICEPARAMETERS, %ah	# Function 48
 	int	$0x13				# make the call
@@ -629,15 +637,15 @@
         incb	%dl				# increment to next device
        	cmpb	$EDDMAXNR, (EDDNR) 		# Out of space?
 	jb	edd_check_ext			# keep looping
-
-edd_done:
+    
+edd_done:   
 #endif
 
 # Now we want to move to protected mode ...
 	cmpw	$0, %cs:realmode_swtch
 	jz	rmodeswtch_normal
 
-	lcall	%cs:realmode_swtch
+	lcall	*%cs:realmode_swtch
 
 	jmp	rmodeswtch_end
 
@@ -751,8 +759,8 @@
 	movb $0x02, %al			# alternate A20 gate
 	outb %al, $0x92			# this works on SC410/SC520
 a20_elan_wait:
-        call a20_test
-        jz a20_elan_wait
+	call a20_test
+	jz a20_elan_wait
 	jmp a20_done
 #endif
 
@@ -761,6 +769,7 @@
 A20_ENABLE_LOOPS	= 255		# Total loops to try		
 
 
+#ifndef CONFIG_X86_VOYAGER
 a20_try_loop:
 
 	# First, see if we are on a system with no A20 gate.
@@ -779,11 +788,14 @@
 	jnz	a20_done
 
 	# Try enabling A20 through the keyboard controller
+#endif /* CONFIG_X86_VOYAGER */
 a20_kbc:
 	call	empty_8042
 
+#ifndef CONFIG_X86_VOYAGER
 	call	a20_test			# Just in case the BIOS worked
 	jnz	a20_done			# but had a delayed reaction.
+#endif
 
 	movb	$0xD1, %al			# command write
 	outb	%al, $0x64
@@ -793,6 +805,7 @@
 	outb	%al, $0x60
 	call	empty_8042
 
+#ifndef CONFIG_X86_VOYAGER
 	# Wait until a20 really *is* enabled; it can take a fair amount of
 	# time on certain systems; Toshiba Tecras are known to have this
 	# problem.
@@ -840,6 +853,7 @@
 	# If we get here, all is good
 a20_done:
 
+#endif /* CONFIG_X86_VOYAGER */
 # set up gdt and idt
 	lidt	idt_48				# load idt with 0,0
 	xorl	%eax, %eax			# Compute gdt_base
@@ -890,8 +904,11 @@
 	movw	%cs, %si
 	subw	$DELTA_INITSEG, %si
 	shll	$4, %esi			# Convert to 32-bit pointer
+
+# jump to startup_32 in arch/i386/kernel/head.S
+#	
 # NOTE: For high loaded big kernels we need a
-#	jmpi    0x100000,__KERNEL_CS
+#	jmpi    0x100000,__BOOT_CS
 #
 #	but we yet haven't reloaded the CS register, so the default size 
 #	of the target offset still is 16 bit.
@@ -902,7 +919,7 @@
 	.byte 0x66, 0xea			# prefix + jmpi-opcode
 code32:	.long	0x1000				# will be set to 0x100000
 						# for big kernels
-	.word	__KERNEL_CS
+	.word	__BOOT_CS
 
 # Here's a bunch of information about your current kernel..
 kernel_version:	.ascii	UTS_RELEASE
@@ -1006,6 +1023,7 @@
 	.string	"INT15 refuses to access high mem, giving up."
 
 
+#ifndef CONFIG_X86_VOYAGER
 # This routine tests whether or not A20 is enabled.  If so, it
 # exits with zf = 0.
 #
@@ -1036,6 +1054,8 @@
 	popw	%cx
 	ret	
 
+#endif /* CONFIG_X86_VOYAGER */
+
 # This routine checks that the keyboard command queue is empty
 # (after emptying the output buffers)
 #
@@ -1095,9 +1115,20 @@
 	ret
 
 # Descriptor tables
+#
+# NOTE: The intel manual says gdt should be sixteen bytes aligned for
+# efficiency reasons.  However, there are machines which are known not
+# to boot with misaligned GDTs, so alter this at your peril!  If you alter
+# GDT_ENTRY_BOOT_CS (in asm/segment.h) remember to leave at least two
+# empty GDT entries (one for NULL and one reserved).
+#
+# NOTE:	On some CPUs, the GDT must be 8 byte aligned.  This is
+# true for the Voyager Quad CPU card which will not boot without
+# This directive.  16 byte aligment is recommended by intel.
+#
+	.align 16
 gdt:
-	.word	0, 0, 0, 0			# dummy
-	.word	0, 0, 0, 0			# unused
+	.fill GDT_ENTRY_BOOT_CS,8,0
 
 	.word	0xFFFF				# 4Gb - (0x100000*0x1000 = 4Gb)
 	.word	0				# base address = 0
@@ -1110,13 +1141,17 @@
 	.word	0x9200				# data read/write
 	.word	0x00CF				# granularity = 4096, 386
 						#  (+5th nibble of limit)
+gdt_end:
+	.align	4
+	
+	.word	0				# alignment byte
 idt_48:
 	.word	0				# idt limit = 0
 	.word	0, 0				# idt base = 0L
-gdt_48:
-	.word	0x8000				# gdt limit=2048,
-						#  256 GDT entries
 
+	.word	0				# alignment byte
+gdt_48:
+	.word	gdt_end - gdt - 1		# gdt limit
 	.word	0, 0				# gdt base (filled in later)
 
 # Include video setup & detection code

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: 2.6.0 incorrect memory sizing (without a full BIOS)..
  2003-12-19  8:31 ` William Lee Irwin III
@ 2003-12-22 17:41   ` Randy.Dunlap
  2003-12-22 17:56     ` William Lee Irwin III
  0 siblings, 1 reply; 4+ messages in thread
From: Randy.Dunlap @ 2003-12-22 17:41 UTC (permalink / raw)
  To: William Lee Irwin III; +Cc: airlied, linux-kernel

On Fri, 19 Dec 2003 00:31:48 -0800 William Lee Irwin III <wli@holomorphy.com> wrote:

| On Fri, Dec 19, 2003 at 05:04:25AM +0000, Dave Airlie wrote:
| > 	I've got an internal development board based on the Intel 815
| > chipset and the Intel ACSFL mini-BIOS for embedded systems, and then using
| > grub 0.93 to boot Linux.
| > under 2.4 my memory is correctly sized at 256MB, but under 2.6 I'm only
| > seeing 64MB,
| [... e88/e820 snipped ...]
| > So is this 2.6 just being more fussy about the contents of the e820 that
| > my "BIOS" is supplying and falling back to the old style detection?
| 
| We've had one other report of something like this. I don't see any
| obvious reason why setup.S should be failing in 2.6; diff below. It
| could be some kind of binutils issue.
| 
| Could I get dmesg and .config from 2.4 and 2.5?

Did we ever get these message logs and config files?

--
~Randy
MOTD:  Always include version info.

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: 2.6.0 incorrect memory sizing (without a full BIOS)..
  2003-12-22 17:41   ` Randy.Dunlap
@ 2003-12-22 17:56     ` William Lee Irwin III
  0 siblings, 0 replies; 4+ messages in thread
From: William Lee Irwin III @ 2003-12-22 17:56 UTC (permalink / raw)
  To: Randy.Dunlap; +Cc: airlied, linux-kernel

On Fri, 19 Dec 2003 00:31:48 -0800 William Lee Irwin III <wli@holomorphy.com> wrote:
> | Could I get dmesg and .config from 2.4 and 2.5?
> 
On Mon, Dec 22, 2003 at 09:41:10AM -0800, Randy.Dunlap wrote:
> Did we ever get these message logs and config files?

He told me he was imminently leaving for some kind of travel and
wouldn't be back for a few weeks.


-- wli

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2003-12-22 17:56 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2003-12-19  5:04 2.6.0 incorrect memory sizing (without a full BIOS) Dave Airlie
2003-12-19  8:31 ` William Lee Irwin III
2003-12-22 17:41   ` Randy.Dunlap
2003-12-22 17:56     ` William Lee Irwin III

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).