* AMD SC410 boot problems with recent kernels @ 2001-12-21 21:26 Robert Schwebel 2001-12-21 22:09 ` H. Peter Anvin 2002-01-01 12:30 ` [PATCH][RFC] AMD Elan patch Robert Schwebel 0 siblings, 2 replies; 55+ messages in thread From: Robert Schwebel @ 2001-12-21 21:26 UTC (permalink / raw) To: Linux Kernel List; +Cc: H. Peter Anvin, linux-embedded, rkaiser [-- Attachment #1: Type: TEXT/PLAIN, Size: 1872 bytes --] Hi, As I reported some days ago in http://marc.theaimsgroup.com/?l=linux-kernel&m=100876129529834&q=raw there are boot problems with new kernels on AMD SC410 processors. Symptom is that the machine reboots right in the middle of the initialisation of the serial port (indeed, right in the middle of a printk message). In the meantime I've tracked down the problem, but cannot fully find the origin. Here are some facts: - The problem came in in 2.4.15. Linus has merged in some changes to the boot code by H. Peter Anvin (which basically are a Good Thing(TM)). They affect arch/i386/boot/setup.S. - I could narrow it down to the A20 gate routines. My machine's BIOS doesn't seem to have the appropiate routine, so the algorithm falls back to using the keyboard controller method (which was also used in the old code). - The problem seems to come from the code that waits for A20 gate to be _really_ enabled (shortly after a20_kbc:). Attached is a experimental patch which demonstrates the problem: in line 687 you can change with a jump to "old_wait" or "new_wait" which routine shall be used. With the old one the machine starts, with the new one it reboots. I must say I do not really understand what the problem is. First I thought that maybe the loop counter overruns, but it doesn't seem to happen. I have written the counter value to a port with LEDs and it seems to contain "1" when the waiting loop detects the successful A20 switch. Any idea would be helpful... Robert -- +--------------------------------------------------------+ | Dipl.-Ing. Robert Schwebel | http://www.pengutronix.de | | Pengutronix - Linux Solutions for Science and Industry | | Braunschweiger Str. 79, 31134 Hildesheim, Germany | | Phone: +49-5121-28619-0 | Fax: +49-5121-28619-4 | +--------------------------------------------------------+ [-- Attachment #2: Type: TEXT/PLAIN, Size: 2529 bytes --] --- setup-2.4.15.S Fri Nov 9 22:58:02 2001 +++ setup.S Fri Dec 21 21:49:50 2001 @@ -684,6 +684,62 @@ outb %al, $0x60 call empty_8042 + jmp new_wait + +# ----- old wait routine ----- + +old_wait: + +# 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. The memory location used here (0x200) is the int 0x80 +# vector, which should be safe to use. + + + pushw %dx + pushw %cx + xorw %dx,%dx + xorw %cx,%cx + + xorw %ax, %ax # segment 0x0000 + movw %ax, %fs + decw %ax # segment 0xffff (HMA) + movw %ax, %gs +a20_wait_old: + incw %cx + jnz goon + incw %dx +goon: + incw %ax # unused memory location <0xfff0 + movw %ax, %fs:(0x200) # we use the "int 0x80" vector + cmpw %gs:(0x210), %ax # and its corresponding HMA addr + je a20_wait_old # loop until no longer aliased + + pushw %ax + + movb $0xa5,%al # select PAMR... + outb %al,$0x22 # ... via CSCIR + movb $0xff,%al # all lines are output + outb %al,$0x23 # ... on CSCDR + + movb $0xa9,%al # select PADR... + outb %al,$0x22 # ... via CSCIR + movb %ch,%al # + outb %al,$0x23 + + popw %ax + + + + popw %cx + popw %dx + + jmp rs_wait_done + +# ----- new wait routine ----- + +new_wait: + # 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. @@ -694,6 +750,10 @@ jnz a20_done loop a20_kbc_wait_loop +rs_wait_done: + +# ----- end of wait ----- + # Final attempt: use "configuration port A" a20_fast: inb $0x92, %al # Configuration Port A @@ -909,12 +969,12 @@ pushw %cx pushw %ax xorw %cx, %cx - movw %cx, %fs # Low memory + movw %cx, %fs # Low memory (segment 0x0000) decw %cx - movw %cx, %gs # High memory area + movw %cx, %gs # High memory area (segment 0xffff) movw $A20_TEST_LOOPS, %cx - movw %fs:(A20_TEST_ADDR), %ax - pushw %ax + movw %fs:(A20_TEST_ADDR), %ax # put content of test address... + pushw %ax # ... on stack a20_test_wait: incw %ax movw %ax, %fs:(A20_TEST_ADDR) ^ permalink raw reply [flat|nested] 55+ messages in thread
* Re: AMD SC410 boot problems with recent kernels 2001-12-21 21:26 AMD SC410 boot problems with recent kernels Robert Schwebel @ 2001-12-21 22:09 ` H. Peter Anvin 2001-12-22 16:13 ` Robert Schwebel 2002-01-01 12:30 ` [PATCH][RFC] AMD Elan patch Robert Schwebel 1 sibling, 1 reply; 55+ messages in thread From: H. Peter Anvin @ 2001-12-21 22:09 UTC (permalink / raw) To: robert; +Cc: Linux Kernel List, linux-embedded, rkaiser Robert Schwebel wrote: > Hi, > > As I reported some days ago in > > http://marc.theaimsgroup.com/?l=linux-kernel&m=100876129529834&q=raw > > there are boot problems with new kernels on AMD SC410 processors. "On one particular SC410 board." > Symptom > is that the machine reboots right in the middle of the initialisation of > the serial port (indeed, right in the middle of a printk message). > > In the meantime I've tracked down the problem, but cannot fully find the > origin. Here are some facts: > > - The problem came in in 2.4.15. Linus has merged in some changes to > the boot code by H. Peter Anvin (which basically are a Good Thing(TM)). > They affect arch/i386/boot/setup.S. > > - I could narrow it down to the A20 gate routines. My machine's BIOS > doesn't seem to have the appropiate routine, so the algorithm falls > back to using the keyboard controller method (which was also used > in the old code). > > - The problem seems to come from the code that waits for A20 gate to > be _really_ enabled (shortly after a20_kbc:). > > Attached is a experimental patch which demonstrates the problem: in line > 687 you can change with a jump to "old_wait" or "new_wait" which routine > shall be used. With the old one the machine starts, with the new one it > reboots. > > I must say I do not really understand what the problem is. First I thought > that maybe the loop counter overruns, but it doesn't seem to happen. I > have written the counter value to a port with LEDs and it seems to contain > "1" when the waiting loop detects the successful A20 switch. > > Any idea would be helpful... > The loop counter you're outputting is the 2nd byte of the loop counter, which really isn't interesting; what probably makes more sense to output is the value of %dx in your code. I would like to suggest making the following changes and try them out: a) Change A20_TEST_LOOPS to something like 32768 in the new kernel code. b) Add a "call delay" between the movw and the cmpw in your old_loop and see if it suddenly breaks; c) Check what your %dx value is (if it's nonzero, there might be an issue.) d) Once again, please complain to your motherboard/BIOS vendor and tell them to implement int 15h, ax=2401h. e) Add a strictly serializing instruction sequence, such as: pushw %dx smsw %dx lmsw %dx popw %dx ... where the "call delay" call is in a20_test. -hpa ^ permalink raw reply [flat|nested] 55+ messages in thread
* Re: AMD SC410 boot problems with recent kernels 2001-12-21 22:09 ` H. Peter Anvin @ 2001-12-22 16:13 ` Robert Schwebel 2001-12-23 1:44 ` H. Peter Anvin 0 siblings, 1 reply; 55+ messages in thread From: Robert Schwebel @ 2001-12-22 16:13 UTC (permalink / raw) To: Linux Kernel List; +Cc: linux-embedded, rkaiser On Fri, 21 Dec 2001, H. Peter Anvin wrote: > > there are boot problems with new kernels on AMD SC410 processors. > > "On one particular SC410 board." Ok, but it's one of the most widespread embedded x86 boards in Europe. > The loop counter you're outputting is the 2nd byte of the loop counter, > which really isn't interesting; This was just from the last test: the result was %ch=0 and %cl=1. > what probably makes more sense to output is the value of %dx in your > code. %dx? Do you mean %cx or do I not understand the code? ;) > I would like to suggest making the following changes and try them out: > > a) Change A20_TEST_LOOPS to something like 32768 in the new kernel code. Still reboots. > b) Add a "call delay" between the movw and the cmpw in your old_loop > and see if it suddenly breaks; No, it still works. > c) Check what your %dx value is (if it's nonzero, there might be an > issue.) I assume you mean in my old_wait code, at the lines where I give out the stuff to the LED ports? Neither %dl nor %dh has something different from 0 here. How could something come into %dx here? > d) Once again, please complain to your motherboard/BIOS vendor and tell > them to implement int 15h, ax=2401h. I'll do that, but this won't help for the hundrets of boards which are still out there and worked fine with the previous code... > e) Add a strictly serializing instruction sequence, such as: > > pushw %dx > smsw %dx > lmsw %dx > popw %dx > > ... where the "call delay" call is in a20_test. Hope I understand you correctly - I'm not an assembler wizzard yet ;) Is this correct: ----------8<---------- a20_test: pushw %cx pushw %ax xorw %cx, %cx movw %cx, %fs # Low memory (segment 0x0000) decw %cx movw %cx, %gs # High memory area (segment 0xffff) movw $A20_TEST_LOOPS, %cx movw %fs:(A20_TEST_ADDR), %ax # put content of test address... pushw %ax # ... on stack a20_test_wait: incw %ax movw %ax, %fs:(A20_TEST_ADDR) pushw %dx smsw %dx call delay # Serialize and make delay constant lmsw %dx popw %dx cmpw %gs:(A20_TEST_ADDR+0x10), %ax loope a20_test_wait popw %fs:(A20_TEST_ADDR) popw %ax popw %cx ret ---------->8---------- Still reboots with this code. Robert -- +--------------------------------------------------------+ | Dipl.-Ing. Robert Schwebel | http://www.pengutronix.de | | Pengutronix - Linux Solutions for Science and Industry | | Braunschweiger Str. 79, 31134 Hildesheim, Germany | | Phone: +49-5121-28619-0 | Fax: +49-5121-28619-4 | +--------------------------------------------------------+ ^ permalink raw reply [flat|nested] 55+ messages in thread
* Re: AMD SC410 boot problems with recent kernels 2001-12-22 16:13 ` Robert Schwebel @ 2001-12-23 1:44 ` H. Peter Anvin 2001-12-23 9:45 ` Robert Schwebel 0 siblings, 1 reply; 55+ messages in thread From: H. Peter Anvin @ 2001-12-23 1:44 UTC (permalink / raw) To: linux-kernel Followup to: <Pine.LNX.4.33.0112221520300.10528-100000@callisto.local> By author: Robert Schwebel <robert@schwebel.de> In newsgroup: linux.dev.kernel > > > what probably makes more sense to output is the value of %dx in your > > code. > > %dx? Do you mean %cx or do I not understand the code? ;) > I mean %dx -- you'd built a 32-bit counter into %dx:%cx. > > I would like to suggest making the following changes and try them out: > > > > a) Change A20_TEST_LOOPS to something like 32768 in the new kernel code. > > Still reboots. > > > b) Add a "call delay" between the movw and the cmpw in your old_loop > > and see if it suddenly breaks; > > No, it still works. > > > c) Check what your %dx value is (if it's nonzero, there might be an > > issue.) > > I assume you mean in my old_wait code, at the lines where I give out the > stuff to the LED ports? Neither %dl nor %dh has something different from > 0 here. How could something come into %dx here? It's part of the counter. This seems to be *your* code, since there is nothing even closely similar in any previous kernel, so I don't know what you're trying to do here... > > d) Once again, please complain to your motherboard/BIOS vendor and tell > > them to implement int 15h, ax=2401h. > > I'll do that, but this won't help for the hundrets of boards which are > still out there and worked fine with the previous code... Doesn't change the fact that the board is still broken, and they didn't provide the BIOS routine to compensate. At that point, the fact that the old code worked by accident is unfortunately irrelevant; especially since you obviously have a workaround that you can use. > > e) Add a strictly serializing instruction sequence, such as: > > > > pushw %dx > > smsw %dx > > lmsw %dx > > popw %dx > > > > ... where the "call delay" call is in a20_test. > > Hope I understand you correctly - I'm not an assembler wizzard yet ;) Is > this correct: > No, but the sequence in verbatim either before or after the call delay. -hpa -- <hpa@transmeta.com> at work, <hpa@zytor.com> in private! "Unix gives you enough rope to shoot yourself in the foot." http://www.zytor.com/~hpa/puzzle.txt <amsp@zytor.com> ^ permalink raw reply [flat|nested] 55+ messages in thread
* Re: AMD SC410 boot problems with recent kernels 2001-12-23 1:44 ` H. Peter Anvin @ 2001-12-23 9:45 ` Robert Schwebel 2001-12-23 10:19 ` H. Peter Anvin 2001-12-23 13:16 ` Christer Weinigel 0 siblings, 2 replies; 55+ messages in thread From: Robert Schwebel @ 2001-12-23 9:45 UTC (permalink / raw) To: Linux Kernel List; +Cc: rkaiser, linux-embedded On 22 Dec 2001, H. Peter Anvin wrote: > I mean %dx -- you'd built a 32-bit counter into %dx:%cx. Ok - didn't know this. Sorry for confusion - it's the first time I'm digging deeper into x86 assembler stuff. My conclusion is that %dx:%cx is 0000:0001 after the old wait routine. > It's part of the counter. This seems to be *your* code, since there > is nothing even closely similar in any previous kernel, so I don't > know what you're trying to do here... See above - the code after a20_wait_old just outputs stuff to an 8 bit dioport with LEDs attached. > Doesn't change the fact that the board is still broken, and they > didn't provide the BIOS routine to compensate. Hmm, I still don't understand this. Ok, the BIOS does not have the routine, but this is rather common on embedded boards which do not have a full featured BIOS. I mean - the procedure used by your code is to use BIOS, then KBC and then 'fast' method one after the other until everything fails. So it should be ok if KBC method worked, shouldn't it? I mean - not taking into accout that due to some strange reasons the KBC method does _not_ work correctly at the moment, but that's another question. > At that point, the fact that the old code worked by accident is > unfortunately irrelevant; especially since you obviously have a > workaround that you can use. Could you elaborate why you think that the old code worked only by accident? [please be patient - I'm no native speaker and it may be that I do sometimes not understand everything correctly. I'm trying hard.] As I said above: before I do not understand _why_ the new code breaks it's rather difficult to draw conclusions. If the board is really _broken_ I have no problem with the fact that in the future the manufacturer has either to supply a correct BIOS or a workaround patch has to be used. If it's only uggly that there's no BIOS routine it would IMHO be better to find a way to make it work again. There are fixes for other uggly architectures in the code as well, see the Toshiba Laptop reference. If the board may be PC compatible, Linux should IMHO boot without further changes. Are there other x86 boards where the BIOS doesn't provide the routine and where the KBC method actually _works_? Would be interesting; I'm not sure that much people have tested this yet, as most "normal" motherboards today have full featured BIOSes. So any comments from embedded people using the mechanimsm on other boards (SC410 or something different) would be helpful. > No, but the sequence in verbatim either before or after the call > delay. Now, I've tried these variants in the section after a20_test_wait: ----------8<---------- call delay # Serialize and make delay constant pushw %dx smsw %dx lmsw %dx popw %dx ---------->8---------- pushw %dx smsw %dx lmsw %dx popw %dx call delay # Serialize and make delay constant ----------8<---------- Still no change -> reboots. Robert -- +--------------------------------------------------------+ | Dipl.-Ing. Robert Schwebel | http://www.pengutronix.de | | Pengutronix - Linux Solutions for Science and Industry | | Braunschweiger Str. 79, 31134 Hildesheim, Germany | | Phone: +49-5121-28619-0 | Fax: +49-5121-28619-4 | +--------------------------------------------------------+ ^ permalink raw reply [flat|nested] 55+ messages in thread
* Re: AMD SC410 boot problems with recent kernels 2001-12-23 9:45 ` Robert Schwebel @ 2001-12-23 10:19 ` H. Peter Anvin 2001-12-23 13:16 ` Christer Weinigel 1 sibling, 0 replies; 55+ messages in thread From: H. Peter Anvin @ 2001-12-23 10:19 UTC (permalink / raw) To: linux-kernel Followup to: <Pine.LNX.4.33.0112231009500.10528-100000@callisto.local> By author: Robert Schwebel <robert@schwebel.de> In newsgroup: linux.dev.kernel > > Could you elaborate why you think that the old code worked only by > accident? [please be patient - I'm no native speaker and it may be that I > do sometimes not understand everything correctly. I'm trying hard.] As I > said above: before I do not understand _why_ the new code breaks it's > rather difficult to draw conclusions. > > If the board is really _broken_ I have no problem with the fact that in > the future the manufacturer has either to supply a correct BIOS or a > workaround patch has to be used. If it's only uggly that there's no BIOS > routine it would IMHO be better to find a way to make it work again. There > are fixes for other uggly architectures in the code as well, see the > Toshiba Laptop reference. If the board may be PC compatible, Linux should > IMHO boot without further changes. > The weird part about your board is that the code clearly *works*, or your kernel wouldn't boot at all. It somehow poisons the system, though, and that's utterly bizarre. I don't think this is debuggable without access to hardware (and maybe not even then.) -hpa -- <hpa@transmeta.com> at work, <hpa@zytor.com> in private! "Unix gives you enough rope to shoot yourself in the foot." http://www.zytor.com/~hpa/puzzle.txt <amsp@zytor.com> ^ permalink raw reply [flat|nested] 55+ messages in thread
* Re: AMD SC410 boot problems with recent kernels 2001-12-23 9:45 ` Robert Schwebel 2001-12-23 10:19 ` H. Peter Anvin @ 2001-12-23 13:16 ` Christer Weinigel 2001-12-23 20:02 ` H. Peter Anvin 1 sibling, 1 reply; 55+ messages in thread From: Christer Weinigel @ 2001-12-23 13:16 UTC (permalink / raw) To: hpa; +Cc: linux-kernel hpa wrote: >> If the board is really _broken_ I have no problem with the fact that in >> the future the manufacturer has either to supply a correct BIOS or a >> workaround patch has to be used. If it's only uggly that there's no BIOS >> routine it would IMHO be better to find a way to make it work again. There >> are fixes for other uggly architectures in the code as well, see the >> Toshiba Laptop reference. If the board may be PC compatible, Linux should >> IMHO boot without further changes. It is an embedded board with a _mostly_ PC compatible CPU, but it has a few strange bugs/features that have to be worked around. For example look a the fix for the timer and serial port in: http://www.uwsg.iu.edu/hypermail/linux/kernel/0004.2/0667.html Especially the serial fix is (IMHO) too ugly to live in the standard kernel. I'd also suggest that you change the whole gate A20-mess to: inb $0xee, %al this will enable A20 propagation on the SC410 and always works, the disadvantage is that it won't work on a normal PC anymore. >The weird part about your board is that the code clearly *works*, or >your kernel wouldn't boot at all. It somehow poisons the system, >though, and that's utterly bizarre. > >I don't think this is debuggable without access to hardware (and maybe >not even then.) It has been a few years since I was working on an Elan SC400 board, but if I remember correctly, the Elan CPU has some configuration registers located at some I/O ports that on a normal PC are either "safe" or used for something else. Additionally, since there normally isn't a keyboard controller on the SC410, accesss to port 0x60 and 0x64 trap into SMI mode, doing I/O to those ports could mess up a badly written BIOS. My belief is that the SC410 based boards are so strange that one has to have a custom kernel anyways, so asking why it isn't 100% PC compatible and trying to fix that is rather pointless. /Christer -- "Just how much can I get away with and still go to heaven?" ^ permalink raw reply [flat|nested] 55+ messages in thread
* Re: AMD SC410 boot problems with recent kernels 2001-12-23 13:16 ` Christer Weinigel @ 2001-12-23 20:02 ` H. Peter Anvin 2001-12-30 22:02 ` Robert Schwebel 0 siblings, 1 reply; 55+ messages in thread From: H. Peter Anvin @ 2001-12-23 20:02 UTC (permalink / raw) To: linux-kernel Followup to: <20011223131658.3944A36FA8@hog.ctrl-c.liu.se> By author: wingel@hog.ctrl-c.liu.se (Christer Weinigel) In newsgroup: linux.dev.kernel > > It is an embedded board with a _mostly_ PC compatible CPU, but it > has a few strange bugs/features that have to be worked around. For > example look a the fix for the timer and serial port in: > > http://www.uwsg.iu.edu/hypermail/linux/kernel/0004.2/0667.html > > Especially the serial fix is (IMHO) too ugly to live in the standard > kernel. > #ifdef CONFIG_SC410 time? > My belief is that the SC410 based boards are so strange that one has > to have a custom kernel anyways, so asking why it isn't 100% PC > compatible and trying to fix that is rather pointless. Thanks for confirming my suspicion. -hpa -- <hpa@transmeta.com> at work, <hpa@zytor.com> in private! "Unix gives you enough rope to shoot yourself in the foot." http://www.zytor.com/~hpa/puzzle.txt <amsp@zytor.com> ^ permalink raw reply [flat|nested] 55+ messages in thread
* Re: AMD SC410 boot problems with recent kernels 2001-12-23 20:02 ` H. Peter Anvin @ 2001-12-30 22:02 ` Robert Schwebel 2001-12-30 23:15 ` H. Peter Anvin 0 siblings, 1 reply; 55+ messages in thread From: Robert Schwebel @ 2001-12-30 22:02 UTC (permalink / raw) To: H. Peter Anvin; +Cc: Linux Kernel List On 23 Dec 2001, H. Peter Anvin wrote: > #ifdef CONFIG_SC410 time? What would be the best place to include this into the kernel config scheme? Make an option, e.g. 'AMD Elan SC410 support' in "Processor type and features"? I'll make an update for my SC410 patchlet on http://www.schwebel.de/software/dnp/index_en.html during the next days, to add the fix for the serial port bug and the A20 problem. Do these problems (A20, serial port, timer) only exist on AMD's SC410 chips or are they also present on the SC520s? Robert -- +--------------------------------------------------------+ | Dipl.-Ing. Robert Schwebel | http://www.pengutronix.de | | Pengutronix - Linux Solutions for Science and Industry | | Braunschweiger Str. 79, 31134 Hildesheim, Germany | | Phone: +49-5121-28619-0 | Fax: +49-5121-28619-4 | +--------------------------------------------------------+ ^ permalink raw reply [flat|nested] 55+ messages in thread
* Re: AMD SC410 boot problems with recent kernels 2001-12-30 22:02 ` Robert Schwebel @ 2001-12-30 23:15 ` H. Peter Anvin 0 siblings, 0 replies; 55+ messages in thread From: H. Peter Anvin @ 2001-12-30 23:15 UTC (permalink / raw) To: robert; +Cc: Linux Kernel List Robert Schwebel wrote: > On 23 Dec 2001, H. Peter Anvin wrote: > >>#ifdef CONFIG_SC410 time? >> > > What would be the best place to include this into the kernel config > scheme? Make an option, e.g. 'AMD Elan SC410 support' in "Processor type > and features"? > All of this is really a chipset issue, not a processor issue; I think it should go in the same place as "Toshiba laptop support" and such... > I'll make an update for my SC410 patchlet on > > http://www.schwebel.de/software/dnp/index_en.html > > during the next days, to add the fix for the serial port bug and the A20 > problem. > > Do these problems (A20, serial port, timer) only exist on AMD's SC410 > chips or are they also present on the SC520s? Don't know. Perhaps someone at AMD can say? -hpa ^ permalink raw reply [flat|nested] 55+ messages in thread
* [PATCH][RFC] AMD Elan patch 2001-12-21 21:26 AMD SC410 boot problems with recent kernels Robert Schwebel 2001-12-21 22:09 ` H. Peter Anvin @ 2002-01-01 12:30 ` Robert Schwebel 2002-01-01 21:49 ` H. Peter Anvin ` (4 more replies) 1 sibling, 5 replies; 55+ messages in thread From: Robert Schwebel @ 2002-01-01 12:30 UTC (permalink / raw) To: Linux Kernel List Cc: H. Peter Anvin, Christer Weinigel, Jason Sodergren, Anders Larsen, rkaiser, Theodore Ts'o Hi, the following patch for linux-2.4.17 fixes problems with the AMD Elan CPUs which are popular x86 devices for embedded applications. Content of the patch: --------------------- 1. add a new processor type "Elan" in "Processor type and features", with CONFIG_MELAN, is introduced 2. fix the A20 code which was broken since the cleanup in 2.4.17 3. correct the ioport resource registration for Elans (standard kernel reserves ports which are special function registers on Elans) 4. fix UART transmit bug 5. fix timer 0 frequency to correct the clock Details: -------- 1. As discussed on LKML the Elan processors have some "features" which need to be fixed but should not live in a standard kernel. Therefore, we propose a new configuration option CONFIG_MELAN. Ideas for better places for this option in the configuration tree are welcome. 2. In 2.4.15 H. Peter Anvin ported the A20 gate code from syslinux to the kernel, which is much more sophisticated than the code we had before. This leads to the Elan processors not booting any more (they did before without any problem, but that was more luck than intention). If you try to boot kernels newer than 2.4.14 the system reboots right in the middle of the initialisation sequence. As the Elans don't have a keyboard controller a special A20 gate sequence is added according to the config option introduced in 1. 3. Due to the fact that the ports of the PIC of the original PC are mirrored to several adresses Linux normally reserves the areas 0x20..0x3f and 0xa0..0xbf for pic1 and pic2, although the PICs use only the first two adresses of each block. This part of the patch uses only the "real" adresses, (0x20,0x21 / 0xa0,0xa1) as the Elan processors have special function registers in these blocks for the integrated peripherals. 4. The on-chip serial interface has a bug: the UART_LSR_THRE bit is delayed one bit clock after the interrupt line is asserted, i.e. if the serial port is running at 1200 bps, and the tranmitter becomes empty and causes an interupt, the interrupt is signalled about a millisecond (1/1200second) _before_ the THRE bit is set. This means that when the interrupt handler is entered after the interrupt, the THRE bit is still clear, the handler believes that there is nothing to be done and returns. 5. A normal PC has a basic frequency for the system timer 0 of 1.19318 MHz, whereas the Elans have 1.1892 MHz due to the fact that all clocks are derived from a single oscillator. Without the patch the clock is wrong. Credits: -------- - Anders Larsen <anders@alarsen.net> First attempt of a patch for the Elan series http://www.uwsg.iu.edu/hypermail/linux/kernel/0004.2/0667.html - Jason Sodergren <jason@mugwump.taiga.com> Clock patch - Christer Weinigel <wingel@hog.ctrl-c.liu.se> Serial interface patch, A20 patch - H. Peter Anvin <hpa@zytor.com> Discussions and ideas about the A20 stuff Patch: ------ The latest version of this patch can always be found on http://www.pengutronix.de/software/elan_en.html The following code is version 2.4.17.2 of the patch. Suggestions for further improvement are welcome. ----------8<----------8<----------8<----------8<----------8<---------- diff -urN -X kernel-patches/dontdiff linux-2.4.17/Documentation/Configure.help linux-2.4.17-rs/Documentation/Configure.help --- linux-2.4.17/Documentation/Configure.help Fri Dec 21 18:41:53 2001 +++ linux-2.4.17-rs/Documentation/Configure.help Mon Dec 31 17:12:58 2001 @@ -3813,6 +3813,7 @@ - "Pentium-4" for the Intel Pentium 4. - "K6" for the AMD K6, K6-II and K6-III (aka K6-3D). - "Athlon" for the AMD K7 family (Athlon/Duron/Thunderbird). + - "Elan" for the AMD Elan family (Elan SC400/SC410). - "Crusoe" for the Transmeta Crusoe series. - "Winchip-C6" for original IDT Winchip. - "Winchip-2" for IDT Winchip 2. diff -urN -X kernel-patches/dontdiff linux-2.4.17/arch/i386/boot/setup.S linux-2.4.17-rs/arch/i386/boot/setup.S --- linux-2.4.17/arch/i386/boot/setup.S Fri Nov 9 22:58:02 2001 +++ linux-2.4.17-rs/arch/i386/boot/setup.S Mon Dec 31 17:20:17 2001 @@ -42,6 +42,9 @@ * if CX/DX have been changed in the e801 call and if so use AX/BX . * Michael Miller, April 2001 <michaelm@mjmm.org> * + * New A20 code ported from SYSLINUX by H. Peter Anvin. AMD Elan bugfixes + * by Robert Schwebel, December 2001 <robert@schwebel.de> + * */ #include <linux/config.h> @@ -646,7 +649,14 @@ # # Enable A20. This is at the very best an annoying procedure. # A20 code ported from SYSLINUX 1.52-1.63 by H. Peter Anvin. +# AMD Elan bug fix by Robert Schwebel. # + +#if defined(CONFIG_MELAN) + inb $0xee, %al # reading 0xee enables A20 + jmp a20_done +#endif + A20_TEST_LOOPS = 32 # Iterations per wait A20_ENABLE_LOOPS = 255 # Total loops to try diff -urN -X kernel-patches/dontdiff linux-2.4.17/arch/i386/config.in linux-2.4.17-rs/arch/i386/config.in --- linux-2.4.17/arch/i386/config.in Fri Dec 21 18:41:53 2001 +++ linux-2.4.17-rs/arch/i386/config.in Mon Dec 31 15:22:06 2001 @@ -37,6 +37,7 @@ Pentium-4 CONFIG_MPENTIUM4 \ K6/K6-II/K6-III CONFIG_MK6 \ Athlon/Duron/K7 CONFIG_MK7 \ + Elan CONFIG_MELAN \ Crusoe CONFIG_MCRUSOE \ Winchip-C6 CONFIG_MWINCHIPC6 \ Winchip-2 CONFIG_MWINCHIP2 \ @@ -125,6 +126,11 @@ define_bool CONFIG_X86_USE_3DNOW y define_bool CONFIG_X86_PGE y define_bool CONFIG_X86_USE_PPRO_CHECKSUM y +fi +if [ "$CONFIG_MELAN" = "y" ]; then + define_int CONFIG_X86_L1_CACHE_SHIFT 4 + define_bool CONFIG_X86_USE_STRING_486 y + define_bool CONFIG_X86_ALIGNMENT_16 y fi if [ "$CONFIG_MCYRIXIII" = "y" ]; then define_int CONFIG_X86_L1_CACHE_SHIFT 5 diff -urN -X kernel-patches/dontdiff linux-2.4.17/arch/i386/kernel/setup.c linux-2.4.17-rs/arch/i386/kernel/setup.c --- linux-2.4.17/arch/i386/kernel/setup.c Fri Dec 21 18:41:53 2001 +++ linux-2.4.17-rs/arch/i386/kernel/setup.c Mon Dec 31 18:46:15 2001 @@ -329,6 +329,10 @@ { "dma2", 0xc0, 0xdf, IORESOURCE_BUSY }, { "fpu", 0xf0, 0xff, IORESOURCE_BUSY } }; +#ifdef CONFIG_ELAN +standard_io_resources[1] = { "pic1", 0x20, 0x21, IORESOURCE_BUSY }; +standard_io_resources[5] = { "pic2", 0xa0, 0xa1, IORESOURCE_BUSY }; +#endif #define STANDARD_IO_RESOURCES (sizeof(standard_io_resources)/sizeof(struct resource)) diff -urN -X kernel-patches/dontdiff linux-2.4.17/drivers/char/serial.c linux-2.4.17-rs/drivers/char/serial.c --- linux-2.4.17/drivers/char/serial.c Fri Dec 21 18:41:54 2001 +++ linux-2.4.17-rs/drivers/char/serial.c Mon Dec 31 17:53:45 2001 @@ -57,6 +57,9 @@ * 10/00: add in optional software flow control for serial console. * Kanoj Sarcar <kanoj@sgi.com> (Modified by Theodore Ts'o) * + * 12/01: Fix for AMD Elan bug in transmit irq routine, by + * Christer Weinigel <wingel@hog.ctrl-c.liu.se>, + * Robert Schwebel <robert@schwebel.de> */ static char *serial_version = "5.05c"; @@ -853,7 +856,7 @@ if (!info) { info = IRQ_ports[irq]; if (pass_counter++ > RS_ISR_PASS_LIMIT) { -#if 0 +#ifdef SERIAL_DEBUG_INTR printk("rs loop break\n"); #endif break; /* Prevent infinite loops */ @@ -886,6 +889,9 @@ int first_multi = 0; struct rs_multiport_struct *multi; #endif +#ifdef CONFIG_MELAN + int iir; +#endif #ifdef SERIAL_DEBUG_INTR printk("rs_interrupt_single(%d)...", irq); @@ -900,7 +906,9 @@ if (multi->port_monitor) first_multi = inb(multi->port_monitor); #endif - +#ifdef CONFIG_MELAN + iir = serial_in(info, UART_IIR); +#endif do { status = serial_inp(info, UART_LSR); #ifdef SERIAL_DEBUG_INTR @@ -909,10 +917,24 @@ if (status & UART_LSR_DR) receive_chars(info, &status, regs); check_modem_status(info); + +#ifdef CONFIG_M_ELAN + /* + * There is a bug in the UART on the AMD Elan SC4x0 + * embedded processor series; the THRE bit of the line + * status register seems to be delayed one bit clock after + * the interrupt is generated, so kludge this if the + * IIR indicates a Transmit Holding Register Interrupt + * + */ + if (status & UART_LSR_THRE || (iir & UART_IIR_ID) == UART_IIR_THRI) + transmit_chars(info, 0); +#else if (status & UART_LSR_THRE) transmit_chars(info, 0); +#endif if (pass_counter++ > RS_ISR_PASS_LIMIT) { -#if 0 +#ifdef SERIAL_DEBUG_INTR printk("rs_single loop break.\n"); #endif break; diff -urN -X kernel-patches/dontdiff linux-2.4.17/include/asm-i386/timex.h linux-2.4.17-rs/include/asm-i386/timex.h --- linux-2.4.17/include/asm-i386/timex.h Thu Nov 22 20:46:18 2001 +++ linux-2.4.17-rs/include/asm-i386/timex.h Mon Dec 31 16:08:55 2001 @@ -9,7 +9,12 @@ #include <linux/config.h> #include <asm/msr.h> -#define CLOCK_TICK_RATE 1193180 /* Underlying HZ */ +#ifdef CONFIG_MELAN +# define CLOCK_TICK_RATE 1189200 /* AMD Elan has different frequency! */ +#else +# define CLOCK_TICK_RATE 1193180 /* Underlying HZ */ +#endif + #define CLOCK_TICK_FACTOR 20 /* Factor of both 1000000 and CLOCK_TICK_RATE */ #define FINETUNE ((((((long)LATCH * HZ - CLOCK_TICK_RATE) << SHIFT_HZ) * \ (1000000/CLOCK_TICK_FACTOR) / (CLOCK_TICK_RATE/CLOCK_TICK_FACTOR)) \ ----------8<----------8<----------8<----------8<----------8<---------- Robert -- +--------------------------------------------------------+ | Dipl.-Ing. Robert Schwebel | http://www.pengutronix.de | | Pengutronix - Linux Solutions for Science and Industry | | Braunschweiger Str. 79, 31134 Hildesheim, Germany | | Phone: +49-5121-28619-0 | Fax: +49-5121-28619-4 | +--------------------------------------------------------+ ^ permalink raw reply [flat|nested] 55+ messages in thread
* Re: [PATCH][RFC] AMD Elan patch 2002-01-01 12:30 ` [PATCH][RFC] AMD Elan patch Robert Schwebel @ 2002-01-01 21:49 ` H. Peter Anvin 2002-01-01 23:27 ` Robert Schwebel 2002-01-02 0:06 ` Christer Weinigel 2002-01-02 15:54 ` Robert Schwebel ` (3 subsequent siblings) 4 siblings, 2 replies; 55+ messages in thread From: H. Peter Anvin @ 2002-01-01 21:49 UTC (permalink / raw) To: robert Cc: Linux Kernel List, Christer Weinigel, Jason Sodergren, Anders Larsen, rkaiser, Theodore Ts'o Robert Schwebel wrote: > diff -urN -X kernel-patches/dontdiff linux-2.4.17/arch/i386/boot/setup.S linux-2.4.17-rs/arch/i386/boot/setup.S > --- linux-2.4.17/arch/i386/boot/setup.S Fri Nov 9 22:58:02 2001 > +++ linux-2.4.17-rs/arch/i386/boot/setup.S Mon Dec 31 17:20:17 2001 > @@ -42,6 +42,9 @@ > * if CX/DX have been changed in the e801 call and if so use AX/BX . > * Michael Miller, April 2001 <michaelm@mjmm.org> > * > + * New A20 code ported from SYSLINUX by H. Peter Anvin. AMD Elan bugfixes > + * by Robert Schwebel, December 2001 <robert@schwebel.de> > + * > */ > > #include <linux/config.h> > @@ -646,7 +649,14 @@ > # > # Enable A20. This is at the very best an annoying procedure. > # A20 code ported from SYSLINUX 1.52-1.63 by H. Peter Anvin. > +# AMD Elan bug fix by Robert Schwebel. > # > + > +#if defined(CONFIG_MELAN) > + inb $0xee, %al # reading 0xee enables A20 > + jmp a20_done > +#endif > + > Do you have documentation which verifies that A20 is enabled by the time the IN instruction returns? If not, you probably don't want to jump to a20_done, but rather fall into a loop like the following: #if defined(CONFIG_MELAN) inb $0xee, %al a20_elan_wait: call a20_test jz a20_elan_wait jmp a20_done #endif Furthermore, I would still like to argue that this does not belong into "processor type and features", because all of these are *chipset* issues; in fact, in this particular case you're more than anything working around a BIOS bug (not having INT 15h AX=2401h do the right thing). I'm also very uncomfortable with putting this where you do; I think it should be put before a20_kbc instead. If the BIOS is implemented correctly, it should be used. -hpa ^ permalink raw reply [flat|nested] 55+ messages in thread
* Re: [PATCH][RFC] AMD Elan patch 2002-01-01 21:49 ` H. Peter Anvin @ 2002-01-01 23:27 ` Robert Schwebel 2002-01-01 23:38 ` H. Peter Anvin 2002-01-02 0:06 ` Christer Weinigel 1 sibling, 1 reply; 55+ messages in thread From: Robert Schwebel @ 2002-01-01 23:27 UTC (permalink / raw) To: H. Peter Anvin Cc: Linux Kernel List, Christer Weinigel, Jason Sodergren, Anders Larsen, rkaiser On Tue, 1 Jan 2002, H. Peter Anvin wrote: > Do you have documentation which verifies that A20 is enabled by the > time the IN instruction returns? The manual says: ----------8<---------- Alternate Gate A20 Control Register (Port 00EEh) A special 8-bit read/write control register provides a fast and reliable way to control the CPU A20 signal. A dummy read of this register returns a value of FFh and forces the CPU A20 to propagate to the core logic, while a dummy write to this register will cause the CPU A20 signal to be forced Low as long as no other A20 gate control sources are forcing the CPU A20 signal to propagate. ---------->8---------- But neither this nor the register description ("Alternate GateA20 Control This register can be used to cause the same type of masking of the CPU A20 signal that was historically performed by an external SCP (System Control Processor) in a PC/AT Compatible system, but much faster.") says something about _how_ fast it is done. > If not, you probably don't want to jump to a20_done, but rather fall > into a loop like the following: > > #if defined(CONFIG_MELAN) > inb $0xee, %al > a20_elan_wait: > call a20_test > jz a20_elan_wait > jmp a20_done > #endif Sounds good, I'll integrate it. > Furthermore, I would still like to argue that this does not belong > into "processor type and features", because all of these are *chipset* > issues; Hmm, there is no special section for chipset issues, the only ones I could find are "Toshiba Laptop support" and "Dell Laptop Support" (also in "Processor type and features"). Other chipset bugfix options are in the IDE driver section, but this doesn't apply here. So the options would be - add something like "Elan Support" in "Processor type and features" - add a new section for general chipset fixes What do you think? > I'm also very uncomfortable with putting this where you do; I think it > should be put before a20_kbc instead. If the BIOS is implemented > correctly, it should be used. ACK, I'll have a look at it tomorow. Robert -- +--------------------------------------------------------+ | Dipl.-Ing. Robert Schwebel | http://www.pengutronix.de | | Pengutronix - Linux Solutions for Science and Industry | | Braunschweiger Str. 79, 31134 Hildesheim, Germany | | Phone: +49-5121-28619-0 | Fax: +49-5121-28619-4 | +--------------------------------------------------------+ ^ permalink raw reply [flat|nested] 55+ messages in thread
* Re: [PATCH][RFC] AMD Elan patch 2002-01-01 23:27 ` Robert Schwebel @ 2002-01-01 23:38 ` H. Peter Anvin 2002-01-02 0:05 ` Dave Jones 2002-01-02 1:07 ` [RFC] Embedded X86 systems Was: " Christer Weinigel 0 siblings, 2 replies; 55+ messages in thread From: H. Peter Anvin @ 2002-01-01 23:38 UTC (permalink / raw) To: robert Cc: Linux Kernel List, Christer Weinigel, Jason Sodergren, Anders Larsen, rkaiser Robert Schwebel wrote: > > ----------8<---------- > Alternate Gate A20 Control Register (Port 00EEh) A special 8-bit > read/write control register provides a fast and reliable way to control > the CPU A20 signal. A dummy read of this register returns a value of FFh > and forces the CPU A20 to propagate to the core logic, while a dummy write > to this register will cause the CPU A20 signal to be forced Low as long as > no other A20 gate control sources are forcing the CPU A20 signal to > propagate. > ---------->8---------- > > But neither this nor the register description ("Alternate GateA20 Control > This register can be used to cause the same type of masking of the CPU A20 > signal that was historically performed by an external SCP (System Control > Processor) in a PC/AT Compatible system, but much faster.") says something > about _how_ fast it is done. > Right, so you need the explicit synchronization. Do you happen to know if there is an easy and safe way to detect an Elan at runtime? If so, it might make more sense to make this a runtime decision instead. > > Hmm, there is no special section for chipset issues, the only ones I could > find are "Toshiba Laptop support" and "Dell Laptop Support" (also in > "Processor type and features"). Other chipset bugfix options are in the > IDE driver section, but this doesn't apply here. So the options would be > > - add something like "Elan Support" in "Processor type and features" > - add a new section for general chipset fixes > > What do you think? > "Processor type and features" is good enough for now, I think. It's not a very large section. -hpa ^ permalink raw reply [flat|nested] 55+ messages in thread
* Re: [PATCH][RFC] AMD Elan patch 2002-01-01 23:38 ` H. Peter Anvin @ 2002-01-02 0:05 ` Dave Jones 2002-01-02 0:45 ` H. Peter Anvin 2002-01-02 13:49 ` Robert Schwebel 2002-01-02 1:07 ` [RFC] Embedded X86 systems Was: " Christer Weinigel 1 sibling, 2 replies; 55+ messages in thread From: Dave Jones @ 2002-01-02 0:05 UTC (permalink / raw) To: H. Peter Anvin Cc: robert, Linux Kernel List, Christer Weinigel, Jason Sodergren, Anders Larsen, rkaiser On Tue, 1 Jan 2002, H. Peter Anvin wrote: > Do you happen to know if there is an easy and safe way to detect an Elan > at runtime? If so, it might make more sense to make this a runtime > decision instead. Family 4 Model 10 or so my information tells me. Unless there are also others with the same name and different cpuid info. Dave. -- | Dave Jones. http://www.codemonkey.org.uk | SuSE Labs ^ permalink raw reply [flat|nested] 55+ messages in thread
* Re: [PATCH][RFC] AMD Elan patch 2002-01-02 0:05 ` Dave Jones @ 2002-01-02 0:45 ` H. Peter Anvin 2002-01-02 13:49 ` Robert Schwebel 1 sibling, 0 replies; 55+ messages in thread From: H. Peter Anvin @ 2002-01-02 0:45 UTC (permalink / raw) To: Dave Jones Cc: robert, Linux Kernel List, Christer Weinigel, Jason Sodergren, Anders Larsen, rkaiser Dave Jones wrote: > On Tue, 1 Jan 2002, H. Peter Anvin wrote: > > >>Do you happen to know if there is an easy and safe way to detect an Elan >>at runtime? If so, it might make more sense to make this a runtime >>decision instead. >> > > Family 4 Model 10 or so my information tells me. > Unless there are also others with the same name and different cpuid info. > That identifies the CPU core, but not the chipset -- and it's quite likely the CPU core will pop up in other uses. Not trustworthy. -hpa ^ permalink raw reply [flat|nested] 55+ messages in thread
* Re: [PATCH][RFC] AMD Elan patch 2002-01-02 0:05 ` Dave Jones 2002-01-02 0:45 ` H. Peter Anvin @ 2002-01-02 13:49 ` Robert Schwebel 2002-01-02 14:03 ` Dave Jones 2002-01-02 16:06 ` Alan Cox 1 sibling, 2 replies; 55+ messages in thread From: Robert Schwebel @ 2002-01-02 13:49 UTC (permalink / raw) To: Dave Jones Cc: H. Peter Anvin, Linux Kernel List, Christer Weinigel, Jason Sodergren, Anders Larsen, rkaiser On Wed, 2 Jan 2002, Dave Jones wrote: > Family 4 Model 10 or so my information tells me. Unless there are also > others with the same name and different cpuid info. That's what /proc/cpuinfo says. Is there an instance where one can find the "official" families and model numbers? Something like a standard? The only thing I've found on the net is this: http://grafi.ii.pw.edu.pl/gbm/x86/cpuid.html#AuthenticAMD Which doesn't list the ELANs. I couldn't also find something on AMD's page. Robert -- +--------------------------------------------------------+ | Dipl.-Ing. Robert Schwebel | http://www.pengutronix.de | | Pengutronix - Linux Solutions for Science and Industry | | Braunschweiger Str. 79, 31134 Hildesheim, Germany | | Phone: +49-5121-28619-0 | Fax: +49-5121-28619-4 | +--------------------------------------------------------+ ^ permalink raw reply [flat|nested] 55+ messages in thread
* Re: [PATCH][RFC] AMD Elan patch 2002-01-02 13:49 ` Robert Schwebel @ 2002-01-02 14:03 ` Dave Jones 2002-01-02 16:10 ` Alan Cox 2002-01-02 16:06 ` Alan Cox 1 sibling, 1 reply; 55+ messages in thread From: Dave Jones @ 2002-01-02 14:03 UTC (permalink / raw) To: Robert Schwebel Cc: H. Peter Anvin, Linux Kernel List, Christer Weinigel, Jason Sodergren, Anders Larsen, rkaiser > > Family 4 Model 10 or so my information tells me. Unless there are also > > others with the same name and different cpuid info. > That's what /proc/cpuinfo says. Is there an instance where one can find > the "official" families and model numbers? Something like a standard? x86info is the closest thing to a complete list, but as hpa pointed out, the problem identifying the cpu is easy, identifying the chipset is the hard part. -- | Dave Jones. http://www.codemonkey.org.uk | SuSE Labs ^ permalink raw reply [flat|nested] 55+ messages in thread
* Re: [PATCH][RFC] AMD Elan patch 2002-01-02 14:03 ` Dave Jones @ 2002-01-02 16:10 ` Alan Cox 2002-01-02 22:40 ` H. Peter Anvin 0 siblings, 1 reply; 55+ messages in thread From: Alan Cox @ 2002-01-02 16:10 UTC (permalink / raw) To: Dave Jones Cc: Robert Schwebel, H. Peter Anvin, Linux Kernel List, Christer Weinigel, Jason Sodergren, Anders Larsen, rkaiser > x86info is the closest thing to a complete list, but as hpa pointed out, > the problem identifying the cpu is easy, identifying the chipset is the > hard part. I can guarantee 100% correct chipset identification. If you meet an ELAN410 it is the chipset too. The ISA and VLB come directly off the CPU ^ permalink raw reply [flat|nested] 55+ messages in thread
* Re: [PATCH][RFC] AMD Elan patch 2002-01-02 16:10 ` Alan Cox @ 2002-01-02 22:40 ` H. Peter Anvin 2002-01-02 23:10 ` Alan Cox 2002-01-03 8:52 ` Robert Schwebel 0 siblings, 2 replies; 55+ messages in thread From: H. Peter Anvin @ 2002-01-02 22:40 UTC (permalink / raw) To: Alan Cox Cc: Dave Jones, Robert Schwebel, Linux Kernel List, Christer Weinigel, Jason Sodergren, Anders Larsen, rkaiser Alan Cox wrote: >>x86info is the closest thing to a complete list, but as hpa pointed out, >>the problem identifying the cpu is easy, identifying the chipset is the >>hard part. >> > > I can guarantee 100% correct chipset identification. If you meet an ELAN410 > it is the chipset too. The ISA and VLB come directly off the CPU > That's not the problem, really... the problems is that CPUID identifies the CPU core, and embedded CPU cores tend to be used and reused many times -- in fact, AMD are quite good at that. -hpa ^ permalink raw reply [flat|nested] 55+ messages in thread
* Re: [PATCH][RFC] AMD Elan patch 2002-01-02 22:40 ` H. Peter Anvin @ 2002-01-02 23:10 ` Alan Cox 2002-01-02 23:02 ` H. Peter Anvin 2002-01-02 23:56 ` Robert Kaiser 2002-01-03 8:52 ` Robert Schwebel 1 sibling, 2 replies; 55+ messages in thread From: Alan Cox @ 2002-01-02 23:10 UTC (permalink / raw) To: H. Peter Anvin Cc: Alan Cox, Dave Jones, Robert Schwebel, Linux Kernel List, Christer Weinigel, Jason Sodergren, Anders Larsen, rkaiser > That's not the problem, really... the problems is that CPUID identifies > the CPU core, and embedded CPU cores tend to be used and reused many > times -- in fact, AMD are quite good at that. The 400/410 this isnt a problem for. Its discontinued and the 5x0 detect differently (and actually have working serial ports I believe). So its an end of life core ^ permalink raw reply [flat|nested] 55+ messages in thread
* Re: [PATCH][RFC] AMD Elan patch 2002-01-02 23:10 ` Alan Cox @ 2002-01-02 23:02 ` H. Peter Anvin 2002-01-02 23:50 ` Alan Cox 2002-01-03 9:04 ` Robert Schwebel 2002-01-02 23:56 ` Robert Kaiser 1 sibling, 2 replies; 55+ messages in thread From: H. Peter Anvin @ 2002-01-02 23:02 UTC (permalink / raw) To: Alan Cox Cc: Dave Jones, Robert Schwebel, Linux Kernel List, Christer Weinigel, Jason Sodergren, Anders Larsen, rkaiser Alan Cox wrote: > > The 400/410 this isnt a problem for. Its discontinued and the 5x0 detect > differently (and actually have working serial ports I believe). So its > an end of life core > It's end of lifed in this particular product, does that mean the core itself won't find itself embedded in something? ... -hpa ^ permalink raw reply [flat|nested] 55+ messages in thread
* Re: [PATCH][RFC] AMD Elan patch 2002-01-02 23:02 ` H. Peter Anvin @ 2002-01-02 23:50 ` Alan Cox 2002-01-03 9:04 ` Robert Schwebel 1 sibling, 0 replies; 55+ messages in thread From: Alan Cox @ 2002-01-02 23:50 UTC (permalink / raw) To: H. Peter Anvin Cc: Alan Cox, Dave Jones, Robert Schwebel, Linux Kernel List, Christer Weinigel, Jason Sodergren, Anders Larsen, rkaiser > It's end of lifed in this particular product, does that mean the core > itself won't find itself embedded in something? ... I think we can be confident of that yes ^ permalink raw reply [flat|nested] 55+ messages in thread
* Re: [PATCH][RFC] AMD Elan patch 2002-01-02 23:02 ` H. Peter Anvin 2002-01-02 23:50 ` Alan Cox @ 2002-01-03 9:04 ` Robert Schwebel 1 sibling, 0 replies; 55+ messages in thread From: Robert Schwebel @ 2002-01-03 9:04 UTC (permalink / raw) To: H. Peter Anvin Cc: Alan Cox, Dave Jones, Linux Kernel List, Christer Weinigel, Jason Sodergren, Anders Larsen, rkaiser On Wed, 2 Jan 2002, H. Peter Anvin wrote: > It's end of lifed in this particular product, does that mean the core > itself won't find itself embedded in something? ... The probability is rather low, as the 486 cores are definitely a dying species. AMD is, as many other manufacturers, going the 586 way on it's embedded roadmaps, as modern embedded 586 cores have the same low power requirements and there are designs available which have all the advantages of the [34]86s but a more modern core and stuff like PCI interfaces. But nevertheless, relying on assumptions is no good design, so we should stay with the current solution. If somebody adds stuff for the SC520 it should be no problem to add something for differentiation. Robert -- +--------------------------------------------------------+ | Dipl.-Ing. Robert Schwebel | http://www.pengutronix.de | | Pengutronix - Linux Solutions for Science and Industry | | Braunschweiger Str. 79, 31134 Hildesheim, Germany | | Phone: +49-5121-28619-0 | Fax: +49-5121-28619-4 | +--------------------------------------------------------+ ^ permalink raw reply [flat|nested] 55+ messages in thread
* Re: [PATCH][RFC] AMD Elan patch 2002-01-02 23:10 ` Alan Cox 2002-01-02 23:02 ` H. Peter Anvin @ 2002-01-02 23:56 ` Robert Kaiser 2002-01-03 0:10 ` Alan Cox 1 sibling, 1 reply; 55+ messages in thread From: Robert Kaiser @ 2002-01-02 23:56 UTC (permalink / raw) To: Alan Cox Cc: H. Peter Anvin, Dave Jones, Robert Schwebel, Linux Kernel List, Christer Weinigel, Jason Sodergren, Anders Larsen, rkaiser On Wed, 2 Jan 2002, Alan Cox wrote: > The 400/410 this isnt a problem for. Its discontinued and the 5x0 detect > differently (and actually have working serial ports I believe). ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ This part is not true AFAIK. I understand they "ported" that incompatibility from the 4x0 to the 520. > So its an end of life core Yes, but is that an excuse for Linux to not support it ? I mean, Linux still does support the 386 ... Rob ---------------------------------------------------------------- Robert Kaiser email: rkaiser@sysgo.de SYSGO RTS GmbH Am Pfaffenstein 14 D-55270 Klein-Winternheim / Germany fax: (49) 6136 9948-10 ^ permalink raw reply [flat|nested] 55+ messages in thread
* Re: [PATCH][RFC] AMD Elan patch 2002-01-02 23:56 ` Robert Kaiser @ 2002-01-03 0:10 ` Alan Cox 0 siblings, 0 replies; 55+ messages in thread From: Alan Cox @ 2002-01-03 0:10 UTC (permalink / raw) To: Robert Kaiser Cc: Alan Cox, H. Peter Anvin, Dave Jones, Robert Schwebel, Linux Kernel List, Christer Weinigel, Jason Sodergren, Anders Larsen, rkaiser > > differently (and actually have working serial ports I believe). > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ > This part is not true AFAIK. I understand they "ported" that > incompatibility from the 4x0 to the 520. Groan. Has anyone got a spare daisycutter .. > > So its an end of life core > > Yes, but is that an excuse for Linux to not support it ? I mean, > Linux still does support the 386 ... I meant that as in "so it wont be appearing in any new form" not that we should not support it. ^ permalink raw reply [flat|nested] 55+ messages in thread
* Re: [PATCH][RFC] AMD Elan patch 2002-01-02 22:40 ` H. Peter Anvin 2002-01-02 23:10 ` Alan Cox @ 2002-01-03 8:52 ` Robert Schwebel 1 sibling, 0 replies; 55+ messages in thread From: Robert Schwebel @ 2002-01-03 8:52 UTC (permalink / raw) To: H. Peter Anvin Cc: Alan Cox, Dave Jones, Linux Kernel List, Christer Weinigel, Jason Sodergren, Anders Larsen, rkaiser On Wed, 2 Jan 2002, H. Peter Anvin wrote: > That's not the problem, really... the problems is that CPUID identifies > the CPU core, and embedded CPU cores tend to be used and reused many > times -- in fact, AMD are quite good at that. Sounds reasonably. I think we should stay with the configuration option at the moment. Robert -- +--------------------------------------------------------+ | Dipl.-Ing. Robert Schwebel | http://www.pengutronix.de | | Pengutronix - Linux Solutions for Science and Industry | | Braunschweiger Str. 79, 31134 Hildesheim, Germany | | Phone: +49-5121-28619-0 | Fax: +49-5121-28619-4 | +--------------------------------------------------------+ ^ permalink raw reply [flat|nested] 55+ messages in thread
* Re: [PATCH][RFC] AMD Elan patch 2002-01-02 13:49 ` Robert Schwebel 2002-01-02 14:03 ` Dave Jones @ 2002-01-02 16:06 ` Alan Cox 2002-01-02 16:56 ` Robert Schwebel 1 sibling, 1 reply; 55+ messages in thread From: Alan Cox @ 2002-01-02 16:06 UTC (permalink / raw) To: robert Cc: Dave Jones, H. Peter Anvin, Linux Kernel List, Christer Weinigel, Jason Sodergren, Anders Larsen, rkaiser > Which doesn't list the ELANs. I couldn't also find something on AMD's > page. The Elan 410 docs are on the AMD site. Look under embedded processors ^ permalink raw reply [flat|nested] 55+ messages in thread
* Re: [PATCH][RFC] AMD Elan patch 2002-01-02 16:06 ` Alan Cox @ 2002-01-02 16:56 ` Robert Schwebel 2002-01-02 17:26 ` Robert Schwebel 0 siblings, 1 reply; 55+ messages in thread From: Robert Schwebel @ 2002-01-02 16:56 UTC (permalink / raw) To: Alan Cox Cc: Dave Jones, H. Peter Anvin, Linux Kernel List, Christer Weinigel, Jason Sodergren, Anders Larsen, rkaiser On Wed, 2 Jan 2002, Alan Cox wrote: > The Elan 410 docs are on the AMD site. Look under embedded processors I've already searched through all manuals I could find on the AMD site (http://www.amd.com/epd/processors/4.32bitcont/13.lan4xxfam/23.lansc410/index.html) but couldn't find anything related to the CPUID command... Robert -- +--------------------------------------------------------+ | Dipl.-Ing. Robert Schwebel | http://www.pengutronix.de | | Pengutronix - Linux Solutions for Science and Industry | | Braunschweiger Str. 79, 31134 Hildesheim, Germany | | Phone: +49-5121-28619-0 | Fax: +49-5121-28619-4 | +--------------------------------------------------------+ ^ permalink raw reply [flat|nested] 55+ messages in thread
* Re: [PATCH][RFC] AMD Elan patch 2002-01-02 16:56 ` Robert Schwebel @ 2002-01-02 17:26 ` Robert Schwebel 2002-01-02 23:06 ` Peter Wächtler 0 siblings, 1 reply; 55+ messages in thread From: Robert Schwebel @ 2002-01-02 17:26 UTC (permalink / raw) To: Alan Cox Cc: Dave Jones, H. Peter Anvin, Linux Kernel List, Christer Weinigel, Jason Sodergren, Anders Larsen, rkaiser On Wed, 2 Jan 2002, Robert Schwebel wrote: > I've already searched through all manuals I could find on the AMD site > (http://www.amd.com/epd/processors/4.32bitcont/13.lan4xxfam/23.lansc410/index.html) > but couldn't find anything related to the CPUID command... Aaargh, does anyone have a brown paper bag for me? The infomration is in the User Manual. Model 0ah means "enhanced Am486 SX1 write back mode" Family 04h means "Am486 CPU" Which IMHO doesn't say that this combination means _exactly_ the SC410. Robert -- +--------------------------------------------------------+ | Dipl.-Ing. Robert Schwebel | http://www.pengutronix.de | | Pengutronix - Linux Solutions for Science and Industry | | Braunschweiger Str. 79, 31134 Hildesheim, Germany | | Phone: +49-5121-28619-0 | Fax: +49-5121-28619-4 | +--------------------------------------------------------+ ^ permalink raw reply [flat|nested] 55+ messages in thread
* Re: [PATCH][RFC] AMD Elan patch 2002-01-02 17:26 ` Robert Schwebel @ 2002-01-02 23:06 ` Peter Wächtler 2002-01-02 23:21 ` H. Peter Anvin 0 siblings, 1 reply; 55+ messages in thread From: Peter Wächtler @ 2002-01-02 23:06 UTC (permalink / raw) To: robert Cc: Alan Cox, Dave Jones, H. Peter Anvin, Linux Kernel List, Christer Weinigel, Jason Sodergren, Anders Larsen, rkaiser Robert Schwebel schrieb: > > On Wed, 2 Jan 2002, Robert Schwebel wrote: > > I've already searched through all manuals I could find on the AMD site > > (http://www.amd.com/epd/processors/4.32bitcont/13.lan4xxfam/23.lansc410/index.html) > > but couldn't find anything related to the CPUID command... > > Aaargh, does anyone have a brown paper bag for me? The infomration is in > the User Manual. > > Model 0ah means "enhanced Am486 SX1 write back mode" > Family 04h means "Am486 CPU" > > Which IMHO doesn't say that this combination means _exactly_ the SC410. > IIRC the difference between SC410 and SC400 is an embedded PCMCIA controller and perhaps a LCD controller. The CPU core should be the same. ^ permalink raw reply [flat|nested] 55+ messages in thread
* Re: [PATCH][RFC] AMD Elan patch 2002-01-02 23:06 ` Peter Wächtler @ 2002-01-02 23:21 ` H. Peter Anvin 0 siblings, 0 replies; 55+ messages in thread From: H. Peter Anvin @ 2002-01-02 23:21 UTC (permalink / raw) To: Peter Wächtler Cc: robert, Alan Cox, Dave Jones, Linux Kernel List, Christer Weinigel, Jason Sodergren, Anders Larsen, rkaiser Peter Wächtler wrote: >> >>Model 0ah means "enhanced Am486 SX1 write back mode" >>Family 04h means "Am486 CPU" >> >>Which IMHO doesn't say that this combination means _exactly_ the SC410. >> > IIRC the difference between SC410 and SC400 is an embedded PCMCIA controller > and perhaps a LCD controller. > The CPU core should be the same. > The problem is that we're talking about problems in the chipset portion. -hpa ^ permalink raw reply [flat|nested] 55+ messages in thread
* Re: [RFC] Embedded X86 systems Was: [PATCH][RFC] AMD Elan patch 2002-01-01 23:38 ` H. Peter Anvin 2002-01-02 0:05 ` Dave Jones @ 2002-01-02 1:07 ` Christer Weinigel 2002-01-02 8:45 ` Alan Cox 1 sibling, 1 reply; 55+ messages in thread From: Christer Weinigel @ 2002-01-02 1:07 UTC (permalink / raw) To: hpa; +Cc: robert, linux-kernel, jason, anders, rkaiser H. Peter Anvin wrote: > Robert Schwebel wrote: > > Hmm, there is no special section for chipset issues, the only ones I could > > find are "Toshiba Laptop support" and "Dell Laptop Support" (also in > > "Processor type and features"). Other chipset bugfix options are in the > > IDE driver section, but this doesn't apply here. So the options would be > > > > - add something like "Elan Support" in "Processor type and features" > > - add a new section for general chipset fixes > > "Processor type and features" is good enough for now, I think. It's not > a very large section. I belive that we're going to see a lot more x86-based embedded systems in the future, some that won't even have a normal PC BIOS. So I think that we ought to do something like the m68k and arm architectures where it's possible to have different setup code for different CPUs, chipsets and specific board designs. I've been working with three different NatSemi Geode based designs lately (two really PC compatible, one requiring special boot code) and I think it would be good to come up with some guidelines for where to put these config options and how to name them. The different x86 embedded CPUs I've been working with are the AMD Elan SC410, Cyrix MediaGX/National Semiconducgtor Geode with the Cx5530 companion chip, National SC2200 (basically a Geode + Cx5530 on a chip) and ZF Embedded. All of these have some quirks or features that could use some configuration options. Some CPUs/Chipsets/Design choices will stop the kernel from working properly on a normal PC, e.g. an Elan enabled kernel will have the wrong clock, while some other options such as the National SC2200 only have some extra chipset features that can be safely detected and ignored when not present. Right now I'm working on a Natsemi SC2200 design and this is how I feel the support for this design should be split up: Processor family: Maybe add a CONFIG_GEODE option since all Geode CPUs have a cache line size of 16 bytes, so CONFIG_X86_L1_CACHE_SHIFT should be 4. How important is the cache line size for the performance of the kernel, does it really make a difference, if it doesn't the generic M586 option is enough. Chipset: There is the basic Cx5530 chipset, which could have support in the Linux kernel (IDE, graphics and sound). "IA on a chip" SCx200 which is an integrated Geode + Cx5530, so most of the the 5530 options would apply here. Additionally there is a built in watchdog timer in the CPU, some GPIO lines, and a high precision timer that could be used instead of the TSC to get a good time of day reading. There are three different SCx200 variants, some features are common for all chips, some are specific for a variant, such as the video input port and graphics overlay/genlock. Board design: There are a lot of different designs based on the Geode family CPUs and chipsets, and they are all different. Some are mostly PC compatible and some are wholly customised, the IRQ routing can be unique for each board and GPIOs can have multiplexed functions, so that if one isn't careful, it's possible to configure the TFT screen outputs as an parallell port instead and possibly fry the screen. Firmware, BIOS or boot loader: Right now the design I'm working on uses an Insyde BIOS which is a rather normal PC BIOS, but I'm looking at the possibility of doing my own bootloader in the future, to lose the licence fees and to implement some features such as a serial or network console. This means that right now the board looks and boots like a PC but in the future there might be no BIOS functions available at all. So, does anyone have any ideas on how to organize the configuration options? How should they be named? The choices I've made so far are: I've added a config option (near CONFIG_VISWS) for the chipset: bool 'National Geode SCx200 support' CONFIG_ARCH_SCx200 and right after it have an option to do board-specific initialization: mainmenu_option next_comment comment 'NatSemi SCx200 implementations' bool ' My little design' CONFIG_SCx200_MY_LITTLE_DESIGN For the generic SCx200 features, I've added drivers in the respective directories such as a watchdog driver in drivers/char: dep_tristate ' NatSemi SCx200 Watchdog' CONFIG_SCx200_WATCHDOG \ $CONFIG_ARCH_SCx200 Does this organization look good? Any suggestions on what to call a config option that changes the setup code to work with a custom bootloader or board: bool ' Normal PC BIOS support' CONFIG_SETUP_PC_BIOS bool ' Ericsson eBox boot protocol' CONFIG_SETUP_EB100 bool ' Magic GRUB variant as BIOS' CONFIG_SETUP_MAGIC_GRUB_VARIANT /Christer (being a wee bit to verbose again) -- "Just how much can I get away with and still go to heaven?" ^ permalink raw reply [flat|nested] 55+ messages in thread
* Re: [RFC] Embedded X86 systems Was: [PATCH][RFC] AMD Elan patch 2002-01-02 1:07 ` [RFC] Embedded X86 systems Was: " Christer Weinigel @ 2002-01-02 8:45 ` Alan Cox 2002-01-02 9:05 ` Christer Weinigel 2002-01-05 12:23 ` Eric W. Biederman 0 siblings, 2 replies; 55+ messages in thread From: Alan Cox @ 2002-01-02 8:45 UTC (permalink / raw) To: wingel; +Cc: hpa, robert, linux-kernel, jason, anders, rkaiser > There is the basic Cx5530 chipset, which could have support in the > Linux kernel (IDE, graphics and sound). It already does. Has done for ages. The non SB emulation mode of the audio is not supported but that I don't think matters. > for all chips, some are specific for a variant, such as the video > input port and graphics overlay/genlock. X11 In general if we want to support lots of weird crap then the ARM folks have a very nice model and a lot of weird crap to have developed their ideas against. Personal preference Type of system (PC, Embedded) then for PC leave as is, for embedded Board type (blah, blah , blah) Firmware (PC BIOS, LinuxBIOS, RedBoot) ^ permalink raw reply [flat|nested] 55+ messages in thread
* Re: [RFC] Embedded X86 systems Was: [PATCH][RFC] AMD Elan patch 2002-01-02 8:45 ` Alan Cox @ 2002-01-02 9:05 ` Christer Weinigel 2002-01-02 9:18 ` Alan Cox 2002-01-05 12:23 ` Eric W. Biederman 1 sibling, 1 reply; 55+ messages in thread From: Christer Weinigel @ 2002-01-02 9:05 UTC (permalink / raw) To: alan; +Cc: hpa, robert, linux-kernel, jason, anders, rkaiser Alan Cox wrote: > > There is the basic Cx5530 chipset, which could have support in the > > Linux kernel (IDE, graphics and sound). > > It already does. Has done for ages. The non SB emulation mode of the audio > is not supported but that I don't think matters. I think that only the Cx550 IDE stuff is in the main kernel though, the Cx5530 audio is a separate patch. Also, the PCI IDs have change for the SCx200, so the IDE driver needs to be updated. I have a patch for this and it seems to work, but I want to test it a bit more first. > In general if we want to support lots of weird crap then the ARM folks have > a very nice model and a lot of weird crap to have developed their ideas > against. Personal preference > > Type of system (PC, Embedded) > > then for PC leave as is, for embedded > > Board type (blah, blah , blah) > Firmware (PC BIOS, LinuxBIOS, RedBoot) Sounds good. /Christer -- "Just how much can I get away with and still go to heaven?" ^ permalink raw reply [flat|nested] 55+ messages in thread
* Re: [RFC] Embedded X86 systems Was: [PATCH][RFC] AMD Elan patch 2002-01-02 9:05 ` Christer Weinigel @ 2002-01-02 9:18 ` Alan Cox 0 siblings, 0 replies; 55+ messages in thread From: Alan Cox @ 2002-01-02 9:18 UTC (permalink / raw) To: wingel; +Cc: alan, hpa, robert, linux-kernel, jason, anders, rkaiser > I think that only the Cx550 IDE stuff is in the main kernel though, > the Cx5530 audio is a separate patch. Also, the PCI IDs have change The 5530 audio is emulated SB16 by the BIOS firmware. There is a hideous native mode driver but it was too disgusting to even consider a merge and needs bios stuff that pretty much no real world 5530 based device has. > for the SCx200, so the IDE driver needs to be updated. I have a patch > for this and it seems to work, but I want to test it a bit more first. Ok ^ permalink raw reply [flat|nested] 55+ messages in thread
* Re: [RFC] Embedded X86 systems Was: [PATCH][RFC] AMD Elan patch 2002-01-02 8:45 ` Alan Cox 2002-01-02 9:05 ` Christer Weinigel @ 2002-01-05 12:23 ` Eric W. Biederman 1 sibling, 0 replies; 55+ messages in thread From: Eric W. Biederman @ 2002-01-05 12:23 UTC (permalink / raw) To: Alan Cox; +Cc: wingel, hpa, robert, linux-kernel, jason, anders, rkaiser Alan Cox <alan@lxorguk.ukuu.org.uk> writes: > > There is the basic Cx5530 chipset, which could have support in the > > Linux kernel (IDE, graphics and sound). > > It already does. Has done for ages. The non SB emulation mode of the audio > is not supported but that I don't think matters. > > > for all chips, some are specific for a variant, such as the video > > input port and graphics overlay/genlock. > > X11 > > In general if we want to support lots of weird crap then the ARM folks have > a very nice model and a lot of weird crap to have developed their ideas > against. Personal preference > > Type of system (PC, Embedded) > > then for PC leave as is, for embedded > > Board type (blah, blah , blah) > Firmware (PC BIOS, LinuxBIOS, RedBoot) A couple of thoughts on this. With LinuxBIOS it is one of my design goals that you not need to know the board type. Plus I frequently run kernels that allow me to boot with either LinuxBIOS or a PC BIOS, as that makes reverse engineering easier. Further in cases where we actually control the firmware (LinuxBIOS, RedBoot?) it makes sense to have the firmware pass us configuration values for places where it deviates from the norm. This doesn't incur any extra firmware overhead as firmware is already board specific, and with flash chips it is easy enough to update. The linux kernel then would just need to handle a new configuration option. For the truly weird, horrible or expedient cases we probably want to have the choice be Type of system (PC, Dedicated). I believe dedicated describes the category better. Embedded refers to computers in small hidden places. Where dedicated just means a computer setup that doesn't need to handle the general case. That plus I have trouble seeing a SGI workstation, or a 512 node cluster running LinuxBIOS as an embedded system :) Having Board type under dedicated/embedded sounds quite reasonable. And for weird things like LinuxBIOS it probably makes sense to at least develop their support under something like dedicated. And only if it becomes more general purpose move it out of there. I'm thinking this through carefully as I'm getting close to doing figuring out what I need to do to get LinuxBIOS support into the kernel. The structure is finally starting to look good enough that this is reasonable. Eric ^ permalink raw reply [flat|nested] 55+ messages in thread
* Re: [PATCH][RFC] AMD Elan patch 2002-01-01 21:49 ` H. Peter Anvin 2002-01-01 23:27 ` Robert Schwebel @ 2002-01-02 0:06 ` Christer Weinigel 2002-01-02 0:48 ` H. Peter Anvin 2002-01-02 13:55 ` Robert Schwebel 1 sibling, 2 replies; 55+ messages in thread From: Christer Weinigel @ 2002-01-02 0:06 UTC (permalink / raw) To: hpa; +Cc: robert, linux-kernel, jason, anders, rkaiser, tytso > H. Peter Anvin wrote: > Do you have documentation which verifies that A20 is enabled by the time > the IN instruction returns? >From the manual for the SC410 (found on AMD's homepage): Alternate Gate A20 Control Register (Port 00EEh) A special 8-bit read/write control register provides a fast and reliable way to control the CPU A20 signal. A dummy read of this register returns a value of FFh and forces the CPU A20 to propagate to the core logic, while a dummy write to this register will cause the CPU A20 signal to be forced Low as long as no other A20 gate control sources are forcing the CPU A20 signal to propagate. I think it's safe to assume that it takes effect immediately. > Furthermore, I would still like to argue that this does not belong into > "processor type and features", because all of these are *chipset* > issues; in fact, in this particular case you're more than anything > working around a BIOS bug (not having INT 15h AX=2401h do the right thing). I agree that it might be better to have a chipset option similar to CONFIG_VISWS: bool 'SGI Visual Workstation support' CONFIG_VISWS ... bool 'AMD Elan SC4x0 support' CONFIG_ELAN_SC4x0 if [ "$CONFIG_ELAN_SC4x0" != "n" ]; then bool ' Use "inb 0xee" to control A20' CONFIG_ELAN_SC4x0_A20 fi > I'm also very uncomfortable with putting this where you do; I think it > should be put before a20_kbc instead. If the BIOS is implemented > correctly, it should be used. I disagree, the Elan SC410 is an embedded CPU, it's used in systems that might not even have a BIOS (such as the Ericsson eBox that I've been working with). Since there has to be a config option for this CPU (the clock frequency selection) and a SC410-enabled kernel won't work properly on a normal PC anyway, why not modify the boot sequence so that it _always_ works on this CPU. /Christer -- "Just how much can I get away with and still go to heaven?" ^ permalink raw reply [flat|nested] 55+ messages in thread
* Re: [PATCH][RFC] AMD Elan patch 2002-01-02 0:06 ` Christer Weinigel @ 2002-01-02 0:48 ` H. Peter Anvin 2002-01-02 1:10 ` Christer Weinigel 2002-01-02 13:55 ` Robert Schwebel 1 sibling, 1 reply; 55+ messages in thread From: H. Peter Anvin @ 2002-01-02 0:48 UTC (permalink / raw) To: wingel; +Cc: robert, linux-kernel, jason, anders, rkaiser, tytso Christer Weinigel wrote: > > Alternate Gate A20 Control Register (Port 00EEh) A special 8-bit > read/write control register provides a fast and reliable way to > control the CPU A20 signal. A dummy read of this register returns > a value of FFh and forces the CPU A20 to propagate to the core > logic, while a dummy write to this register will cause the CPU A20 > signal to be forced Low as long as no other A20 gate control > sources are forcing the CPU A20 signal to propagate. > > I think it's safe to assume that it takes effect immediately. > What leads you to that conclusion? There is nothing in the above paragraph that would lead you to believe that. > >>I'm also very uncomfortable with putting this where you do; I think it >>should be put before a20_kbc instead. If the BIOS is implemented >>correctly, it should be used. >> > > I disagree, the Elan SC410 is an embedded CPU, it's used in systems > that might not even have a BIOS (such as the Ericsson eBox that I've > been working with). Since there has to be a config option for this > CPU (the clock frequency selection) and a SC410-enabled kernel won't > work properly on a normal PC anyway, why not modify the boot sequence > so that it _always_ works on this CPU. > If used sans BIOS you need *massive* modifications to the setup anyway, and you're talking a completely custom kernel. The reason to use the BIOS first is to give the platform vendor a hook to deal with platform-specific issues, and God knows there are plenty of those when it comes to A20. (The fact that the BIOSes on the boards we have discussed haven't provided such a hook is a bug in itself.) -hpa ^ permalink raw reply [flat|nested] 55+ messages in thread
* Re: [PATCH][RFC] AMD Elan patch 2002-01-02 0:48 ` H. Peter Anvin @ 2002-01-02 1:10 ` Christer Weinigel 2002-01-02 13:58 ` Robert Schwebel 0 siblings, 1 reply; 55+ messages in thread From: Christer Weinigel @ 2002-01-02 1:10 UTC (permalink / raw) To: hpa; +Cc: robert, linux-kernel, jason, anders, rkaiser, tytso H. Peter Anvin wrote: > The reason to use the BIOS first is to give the platform vendor a > hook to deal with platform-specific issues, and God knows there are > plenty of those when it comes to A20. Well, the Elan SC4x0 doesn't have a lot of issues, everything having to do with A20 is on the chip itself, so it would take a really brain damaged design to mess this up. :-) /Christer -- "Just how much can I get away with and still go to heaven?" ^ permalink raw reply [flat|nested] 55+ messages in thread
* Re: [PATCH][RFC] AMD Elan patch 2002-01-02 1:10 ` Christer Weinigel @ 2002-01-02 13:58 ` Robert Schwebel 2002-01-02 20:47 ` Christer Weinigel 0 siblings, 1 reply; 55+ messages in thread From: Robert Schwebel @ 2002-01-02 13:58 UTC (permalink / raw) To: wingel; +Cc: hpa, Linux Kernel List, jason, anders, rkaiser On Wed, 2 Jan 2002, Christer Weinigel wrote: > Well, the Elan SC4x0 doesn't have a lot of issues, everything having > to do with A20 is on the chip itself, so it would take a really brain > damaged design to mess this up. :-) True, but does "Family 4, Model 10" always mean "Elan SC410"? An official source from AMD would be great here. Is anybody from AMD on the list or does anybody have the address of a contact person? Robert -- +--------------------------------------------------------+ | Dipl.-Ing. Robert Schwebel | http://www.pengutronix.de | | Pengutronix - Linux Solutions for Science and Industry | | Braunschweiger Str. 79, 31134 Hildesheim, Germany | | Phone: +49-5121-28619-0 | Fax: +49-5121-28619-4 | +--------------------------------------------------------+ ^ permalink raw reply [flat|nested] 55+ messages in thread
* Re: [PATCH][RFC] AMD Elan patch 2002-01-02 13:58 ` Robert Schwebel @ 2002-01-02 20:47 ` Christer Weinigel 0 siblings, 0 replies; 55+ messages in thread From: Christer Weinigel @ 2002-01-02 20:47 UTC (permalink / raw) To: robert; +Cc: hpa, linux-kernel, jason, anders, rkaiser Robert Schwebel wrote: > True, but does "Family 4, Model 10" always mean "Elan SC410"? An official > source from AMD would be great here. Is anybody from AMD on the list or > does anybody have the address of a contact person? It seems as if "Family 4, Model 10" isn't enought, but the Users Manual describes how to detect an Elan SC4x0 Processor: 3.6 CPU CORE IDENTIFICATION USING THE CPUID INSTRUCTION The ElanSC400 and ElanSC410 microcontrollers are the first members of a new family of embedded devices. The CPUID instruction can be used to identify a processor as belonging to this family. The Am486 CPU core in the ElanSC400 and ElanSC410 microcontrollers is the first CPU AMD has made with a write-back cache and no FPU, so these tests should be sufficient to uniquely identify the family. Using the CPUID instruction the microcontroller can be done with the following steps, as shown in the code sample in Section 3.6.3: * Make sure the manufacturer name is "AuthenticAMD". * Make sure the device is described as a 486 SX1 with a write-back cache. If it passes all the tests it must be an ElanSC400 microcontroller or derivative. If it's worth it or not, I don't know, I'm just curious, it has been years since I did anything with the Elan processor for real. :-) /Christer -- "Just how much can I get away with and still go to heaven?" ^ permalink raw reply [flat|nested] 55+ messages in thread
* Re: [PATCH][RFC] AMD Elan patch 2002-01-02 0:06 ` Christer Weinigel 2002-01-02 0:48 ` H. Peter Anvin @ 2002-01-02 13:55 ` Robert Schwebel 1 sibling, 0 replies; 55+ messages in thread From: Robert Schwebel @ 2002-01-02 13:55 UTC (permalink / raw) To: wingel; +Cc: hpa, Linux Kernel List, jason, anders, rkaiser On Wed, 2 Jan 2002, Christer Weinigel wrote: > > I'm also very uncomfortable with putting this where you do; I think it > > should be put before a20_kbc instead. If the BIOS is implemented > > correctly, it should be used. > > I disagree, the Elan SC410 is an embedded CPU, it's used in systems > that might not even have a BIOS (such as the Ericsson eBox that I've > been working with). Agreed. I think the CPU type is meant for "physical" CPU families, and the Elan family is one, similar to "K6/K6-II/K6-III", "Athlon/Duron/K7" etc. At the moment I don't change the category, let's hear what the maintainers say once we've discussed the other bits and pieces. Robert -- +--------------------------------------------------------+ | Dipl.-Ing. Robert Schwebel | http://www.pengutronix.de | | Pengutronix - Linux Solutions for Science and Industry | | Braunschweiger Str. 79, 31134 Hildesheim, Germany | | Phone: +49-5121-28619-0 | Fax: +49-5121-28619-4 | +--------------------------------------------------------+ ^ permalink raw reply [flat|nested] 55+ messages in thread
* Re: [PATCH][RFC] AMD Elan patch 2002-01-01 12:30 ` [PATCH][RFC] AMD Elan patch Robert Schwebel 2002-01-01 21:49 ` H. Peter Anvin @ 2002-01-02 15:54 ` Robert Schwebel 2002-01-11 9:38 ` [PATCH] " Robert Schwebel ` (2 subsequent siblings) 4 siblings, 0 replies; 55+ messages in thread From: Robert Schwebel @ 2002-01-02 15:54 UTC (permalink / raw) To: Linux Kernel List Cc: H. Peter Anvin, Christer Weinigel, Jason Sodergren, Anders Larsen, rkaiser Hi, Version 2.4.17.3 of the AMD Elan patch is on http://www.pengutronix.de/software/elan_en.html Changelog: ---------- 01/02/2002 Robert Schwebel <robert@schwebel.de> - Revision 2.4.17.3 released. - Loop inserted to check if A20 gate was _really_ activated. H. Peter Anvin <hpa@zytor.com> - We are currently unsure which would be the best position for the Elan patch in the kernel configuration tree. Has to be discussed with maintainers. Robert -- +--------------------------------------------------------+ | Dipl.-Ing. Robert Schwebel | http://www.pengutronix.de | | Pengutronix - Linux Solutions for Science and Industry | | Braunschweiger Str. 79, 31134 Hildesheim, Germany | | Phone: +49-5121-28619-0 | Fax: +49-5121-28619-4 | +--------------------------------------------------------+ ^ permalink raw reply [flat|nested] 55+ messages in thread
* [PATCH] AMD Elan patch 2002-01-01 12:30 ` [PATCH][RFC] AMD Elan patch Robert Schwebel 2002-01-01 21:49 ` H. Peter Anvin 2002-01-02 15:54 ` Robert Schwebel @ 2002-01-11 9:38 ` Robert Schwebel 2002-01-21 7:28 ` New version of " Robert Schwebel 2002-01-23 10:28 ` [PATCH] " Robert Schwebel 2002-01-22 14:47 ` [PATCH][RFC] " Robert Schwebel 2002-01-22 22:55 ` New version of AMD Elan patch available Robert Schwebel 4 siblings, 2 replies; 55+ messages in thread From: Robert Schwebel @ 2002-01-11 9:38 UTC (permalink / raw) To: marcelo; +Cc: Linux Kernel List Hello Marcelo, Here's the latest version of the AMD Elan patch. It was discussed on LKML, and as nobody seems to have objections any more I would like to ask you to apply it. Description: The following patch for linux-2.4.18-pre3 fixes problems with the AMD Elan CPUs which are popular x86 devices for embedded applications. Content of the patch: --------------------- 1. add a new processor type "Elan" in "Processor type and features", with CONFIG_MELAN, is introduced 2. fix the A20 code which was broken since the cleanup in 2.4.15 3. correct the ioport resource registration for Elans (standard kernel reserves ports which are special function registers on Elans) 4. fix UART transmit bug 5. fix timer 0 frequency to correct the clock Details: -------- 1. As discussed on LKML the Elan processors have some "features" which need to be fixed but should not live in a standard kernel. Therefore, we propose a new configuration option CONFIG_MELAN. Ideas for better places for this option in the configuration tree are welcome. 2. In 2.4.15 H. Peter Anvin ported the A20 gate code from syslinux to the kernel, which is much more sophisticated than the code we had before. This leads to the Elan processors not booting any more (they did before without any problem, but that was more luck than intention). If you try to boot kernels newer than 2.4.14 the system reboots right in the middle of the initialisation sequence. As the Elans don't have a keyboard controller a special A20 gate sequence is added according to the config option introduced in 1. 3. Due to the fact that the ports of the PIC of the original PC are mirrored to several adresses Linux normally reserves the areas 0x20..0x3f and 0xa0..0xbf for pic1 and pic2, although the PICs use only the first two adresses of each block. This part of the patch uses only the "real" adresses, (0x20,0x21 / 0xa0,0xa1) as the Elan processors have special function registers in these blocks for the integrated peripherals. 4. The on-chip serial interface has a bug: the UART_LSR_THRE bit is delayed one bit clock after the interrupt line is asserted, i.e. if the serial port is running at 1200 bps, and the tranmitter becomes empty and causes an interupt, the interrupt is signalled about a millisecond (1/1200second) _before_ the THRE bit is set. This means that when the interrupt handler is entered after the interrupt, the THRE bit is still clear, the handler believes that there is nothing to be done and returns. 5. A normal PC has a basic frequency for the system timer 0 of 1.19318 MHz, whereas the Elans have 1.1892 MHz due to the fact that all clocks are derived from a single oscillator. Without the patch the clock is wrong. Credits: -------- - Anders Larsen <anders@alarsen.net> First attempt of a patch for the Elan series http://www.uwsg.iu.edu/hypermail/linux/kernel/0004.2/0667.html - Jason Sodergren <jason@mugwump.taiga.com> Clock patch - Christer Weinigel <wingel@hog.ctrl-c.liu.se> Serial interface patch, A20 patch - H. Peter Anvin <hpa@zytor.com> Discussions and ideas about the A20 stuff Patch: ------ The latest version of this patch can always be found on http://www.pengutronix.de/software/elan_en.html The following code is version 2.4.18-pre3.1 of the patch. Suggestions for further improvement are welcome. ----------8<----------8<----------8<----------8<----------8<---------- diff -urN -X kernel-patches/dontdiff linux-2.4.18-pre3/CREDITS linux-2.4.18-pre3-elan/CREDITS --- linux-2.4.18-pre3/CREDITS Fri Jan 11 08:27:41 2002 +++ linux-2.4.18-pre3-elan/CREDITS Fri Jan 11 08:42:38 2002 @@ -2652,6 +2652,16 @@ S: Oldenburg S: Germany +N: Robert Schwebel +E: robert@schwebel.de +W: http://www.schwebel.de +D: Embedded hacker and book author, +D: AMD Elan support for Linux +S: Pengutronix +S: Braunschweiger Strasse 79 +S: 31134 Hildesheim +S: Germany + N: Darren Senn E: sinster@darkwater.com D: Whatever I notice needs doing (so far: itimers, /proc) diff -urN -X kernel-patches/dontdiff linux-2.4.18-pre3/Documentation/Configure.help linux-2.4.18-pre3-elan/Documentation/Configure.help --- linux-2.4.18-pre3/Documentation/Configure.help Fri Jan 11 08:27:41 2002 +++ linux-2.4.18-pre3-elan/Documentation/Configure.help Fri Jan 11 08:34:57 2002 @@ -3813,6 +3813,7 @@ - "Pentium-4" for the Intel Pentium 4. - "K6" for the AMD K6, K6-II and K6-III (aka K6-3D). - "Athlon" for the AMD K7 family (Athlon/Duron/Thunderbird). + - "Elan" for the AMD Elan family (Elan SC400/SC410). - "Crusoe" for the Transmeta Crusoe series. - "Winchip-C6" for original IDT Winchip. - "Winchip-2" for IDT Winchip 2. diff -urN -X kernel-patches/dontdiff linux-2.4.18-pre3/arch/i386/boot/setup.S linux-2.4.18-pre3-elan/arch/i386/boot/setup.S --- linux-2.4.18-pre3/arch/i386/boot/setup.S Fri Jan 11 08:27:42 2002 +++ linux-2.4.18-pre3-elan/arch/i386/boot/setup.S Fri Jan 11 08:34:57 2002 @@ -42,6 +42,9 @@ * if CX/DX have been changed in the e801 call and if so use AX/BX . * Michael Miller, April 2001 <michaelm@mjmm.org> * + * New A20 code ported from SYSLINUX by H. Peter Anvin. AMD Elan bugfixes + * by Robert Schwebel, December 2001 <robert@schwebel.de> + * */ #include <linux/config.h> @@ -651,7 +654,17 @@ # # Enable A20. This is at the very best an annoying procedure. # A20 code ported from SYSLINUX 1.52-1.63 by H. Peter Anvin. +# AMD Elan bug fix by Robert Schwebel. # + +#if defined(CONFIG_MELAN) + inb $0xee, %al # reading 0xee enables A20 +a20_elan_wait: + call a20_test + jz a20_elan_wait + jmp a20_done +#endif + A20_TEST_LOOPS = 32 # Iterations per wait A20_ENABLE_LOOPS = 255 # Total loops to try diff -urN -X kernel-patches/dontdiff linux-2.4.18-pre3/arch/i386/config.in linux-2.4.18-pre3-elan/arch/i386/config.in --- linux-2.4.18-pre3/arch/i386/config.in Fri Dec 21 18:41:53 2001 +++ linux-2.4.18-pre3-elan/arch/i386/config.in Fri Jan 11 08:34:57 2002 @@ -37,6 +37,7 @@ Pentium-4 CONFIG_MPENTIUM4 \ K6/K6-II/K6-III CONFIG_MK6 \ Athlon/Duron/K7 CONFIG_MK7 \ + Elan CONFIG_MELAN \ Crusoe CONFIG_MCRUSOE \ Winchip-C6 CONFIG_MWINCHIPC6 \ Winchip-2 CONFIG_MWINCHIP2 \ @@ -125,6 +126,11 @@ define_bool CONFIG_X86_USE_3DNOW y define_bool CONFIG_X86_PGE y define_bool CONFIG_X86_USE_PPRO_CHECKSUM y +fi +if [ "$CONFIG_MELAN" = "y" ]; then + define_int CONFIG_X86_L1_CACHE_SHIFT 4 + define_bool CONFIG_X86_USE_STRING_486 y + define_bool CONFIG_X86_ALIGNMENT_16 y fi if [ "$CONFIG_MCYRIXIII" = "y" ]; then define_int CONFIG_X86_L1_CACHE_SHIFT 5 diff -urN -X kernel-patches/dontdiff linux-2.4.18-pre3/arch/i386/kernel/setup.c linux-2.4.18-pre3-elan/arch/i386/kernel/setup.c --- linux-2.4.18-pre3/arch/i386/kernel/setup.c Fri Jan 11 08:27:42 2002 +++ linux-2.4.18-pre3-elan/arch/i386/kernel/setup.c Fri Jan 11 08:34:57 2002 @@ -329,6 +329,10 @@ { "dma2", 0xc0, 0xdf, IORESOURCE_BUSY }, { "fpu", 0xf0, 0xff, IORESOURCE_BUSY } }; +#ifdef CONFIG_ELAN +standard_io_resources[1] = { "pic1", 0x20, 0x21, IORESOURCE_BUSY }; +standard_io_resources[5] = { "pic2", 0xa0, 0xa1, IORESOURCE_BUSY }; +#endif #define STANDARD_IO_RESOURCES (sizeof(standard_io_resources)/sizeof(struct resource)) diff -urN -X kernel-patches/dontdiff linux-2.4.18-pre3/drivers/char/serial.c linux-2.4.18-pre3-elan/drivers/char/serial.c --- linux-2.4.18-pre3/drivers/char/serial.c Fri Jan 11 08:27:47 2002 +++ linux-2.4.18-pre3-elan/drivers/char/serial.c Fri Jan 11 08:34:57 2002 @@ -57,6 +57,9 @@ * 10/00: add in optional software flow control for serial console. * Kanoj Sarcar <kanoj@sgi.com> (Modified by Theodore Ts'o) * + * 12/01: Fix for AMD Elan bug in transmit irq routine, by + * Christer Weinigel <wingel@hog.ctrl-c.liu.se>, + * Robert Schwebel <robert@schwebel.de> */ static char *serial_version = "5.05c"; @@ -853,7 +856,7 @@ if (!info) { info = IRQ_ports[irq]; if (pass_counter++ > RS_ISR_PASS_LIMIT) { -#if 0 +#ifdef SERIAL_DEBUG_INTR printk("rs loop break\n"); #endif break; /* Prevent infinite loops */ @@ -886,6 +889,9 @@ int first_multi = 0; struct rs_multiport_struct *multi; #endif +#ifdef CONFIG_MELAN + int iir; +#endif #ifdef SERIAL_DEBUG_INTR printk("rs_interrupt_single(%d)...", irq); @@ -900,7 +906,9 @@ if (multi->port_monitor) first_multi = inb(multi->port_monitor); #endif - +#ifdef CONFIG_MELAN + iir = serial_in(info, UART_IIR); +#endif do { status = serial_inp(info, UART_LSR); #ifdef SERIAL_DEBUG_INTR @@ -909,10 +917,24 @@ if (status & UART_LSR_DR) receive_chars(info, &status, regs); check_modem_status(info); + +#ifdef CONFIG_M_ELAN + /* + * There is a bug in the UART on the AMD Elan SC4x0 + * embedded processor series; the THRE bit of the line + * status register seems to be delayed one bit clock after + * the interrupt is generated, so kludge this if the + * IIR indicates a Transmit Holding Register Interrupt + * + */ + if (status & UART_LSR_THRE || (iir & UART_IIR_ID) == UART_IIR_THRI) + transmit_chars(info, 0); +#else if (status & UART_LSR_THRE) transmit_chars(info, 0); +#endif if (pass_counter++ > RS_ISR_PASS_LIMIT) { -#if 0 +#ifdef SERIAL_DEBUG_INTR printk("rs_single loop break.\n"); #endif break; diff -urN -X kernel-patches/dontdiff linux-2.4.18-pre3/include/asm-i386/timex.h linux-2.4.18-pre3-elan/include/asm-i386/timex.h --- linux-2.4.18-pre3/include/asm-i386/timex.h Thu Nov 22 20:46:18 2001 +++ linux-2.4.18-pre3-elan/include/asm-i386/timex.h Fri Jan 11 08:47:57 2002 @@ -9,7 +9,12 @@ #include <linux/config.h> #include <asm/msr.h> -#define CLOCK_TICK_RATE 1193180 /* Underlying HZ */ +#ifdef CONFIG_MELAN +# define CLOCK_TICK_RATE 1189200 /* AMD Elan has different frequency! */ +#else +# define CLOCK_TICK_RATE 1193180 /* Underlying HZ */ +#endif + #define CLOCK_TICK_FACTOR 20 /* Factor of both 1000000 and CLOCK_TICK_RATE */ #define FINETUNE ((((((long)LATCH * HZ - CLOCK_TICK_RATE) << SHIFT_HZ) * \ (1000000/CLOCK_TICK_FACTOR) / (CLOCK_TICK_RATE/CLOCK_TICK_FACTOR)) \ ----------8<----------8<----------8<----------8<----------8<---------- Robert -- +--------------------------------------------------------+ | Dipl.-Ing. Robert Schwebel | http://www.pengutronix.de | | Pengutronix - Linux Solutions for Science and Industry | | Braunschweiger Str. 79, 31134 Hildesheim, Germany | | Phone: +49-5121-28619-0 | Fax: +49-5121-28619-4 | +--------------------------------------------------------+ ^ permalink raw reply [flat|nested] 55+ messages in thread
* New version of AMD Elan patch 2002-01-11 9:38 ` [PATCH] " Robert Schwebel @ 2002-01-21 7:28 ` Robert Schwebel 2002-01-21 20:44 ` Marcelo Tosatti 2002-01-24 8:09 ` Robert Schwebel 2002-01-23 10:28 ` [PATCH] " Robert Schwebel 1 sibling, 2 replies; 55+ messages in thread From: Robert Schwebel @ 2002-01-21 7:28 UTC (permalink / raw) To: marcelo, Alan Cox; +Cc: Linux Kernel List Hi Marcelo and Alan, Here's a new version of the AMD Elan patch, against 2.4.18-pre4. Please apply. Description: The following patch for linux-2.4.18-pre3 fixes problems with the AMD Elan CPUs which are popular x86 devices for embedded applications. Content of the patch: --------------------- 1. add a new processor type "Elan" in "Processor type and features", with CONFIG_MELAN, is introduced 2. fix the A20 code which was broken since the cleanup in 2.4.15 3. correct the ioport resource registration for Elans (standard kernel reserves ports which are special function registers on Elans) 4. fix UART transmit bug 5. fix timer 0 frequency to correct the clock Details: -------- 1. As discussed on LKML the Elan processors have some "features" which need to be fixed but should not live in a standard kernel. Therefore, we propose a new configuration option CONFIG_MELAN. Ideas for better places for this option in the configuration tree are welcome. 2. In 2.4.15 H. Peter Anvin ported the A20 gate code from syslinux to the kernel, which is much more sophisticated than the code we had before. This leads to the Elan processors not booting any more (they did before without any problem, but that was more luck than intention). If you try to boot kernels newer than 2.4.14 the system reboots right in the middle of the initialisation sequence. As the Elans don't have a keyboard controller a special A20 gate sequence is added according to the config option introduced in 1. 3. Due to the fact that the ports of the PIC of the original PC are mirrored to several adresses Linux normally reserves the areas 0x20..0x3f and 0xa0..0xbf for pic1 and pic2, although the PICs use only the first two adresses of each block. This part of the patch uses only the "real" adresses, (0x20,0x21 / 0xa0,0xa1) as the Elan processors have special function registers in these blocks for the integrated peripherals. 4. The on-chip serial interface has a bug: the UART_LSR_THRE bit is delayed one bit clock after the interrupt line is asserted, i.e. if the serial port is running at 1200 bps, and the tranmitter becomes empty and causes an interupt, the interrupt is signalled about a millisecond (1/1200second) _before_ the THRE bit is set. This means that when the interrupt handler is entered after the interrupt, the THRE bit is still clear, the handler believes that there is nothing to be done and returns. 5. A normal PC has a basic frequency for the system timer 0 of 1.19318 MHz, whereas the Elans have 1.1892 MHz due to the fact that all clocks are derived from a single oscillator. Without the patch the clock is wrong. Credits: -------- - Anders Larsen <anders@alarsen.net> First attempt of a patch for the Elan series http://www.uwsg.iu.edu/hypermail/linux/kernel/0004.2/0667.html - Jason Sodergren <jason@mugwump.taiga.com> Clock patch - Christer Weinigel <wingel@hog.ctrl-c.liu.se> Serial interface patch, A20 patch - H. Peter Anvin <hpa@zytor.com> Discussions and ideas about the A20 stuff - Juergen Beisert <jbeisert@eurodsn.de> Tests on SC520, suggestions for boot sequence changes, RS232 Patch: ------ The latest version of this patch can always be found on http://www.pengutronix.de/software/elan_en.html The following code is version 2.4.18-pre4.1 of the patch. Suggestions for further improvement are welcome. ----------8<----------8<----------8<----------8<----------8<---------- diff -urN -X kernel-patches/dontdiff linux-2.4.18-pre4/CREDITS linux-2.4.18-pre4-elan/CREDITS --- linux-2.4.18-pre4/CREDITS Sun Jan 20 20:39:06 2002 +++ linux-2.4.18-pre4-elan/CREDITS Sun Jan 20 21:35:37 2002 @@ -2659,6 +2659,16 @@ S: Oldenburg S: Germany +N: Robert Schwebel +E: robert@schwebel.de +W: http://www.schwebel.de +D: Embedded hacker and book author, +D: AMD Elan support for Linux +S: Pengutronix +S: Braunschweiger Strasse 79 +S: 31134 Hildesheim +S: Germany + N: Darren Senn E: sinster@darkwater.com D: Whatever I notice needs doing (so far: itimers, /proc) diff -urN -X kernel-patches/dontdiff linux-2.4.18-pre4/Documentation/Configure.help linux-2.4.18-pre4-elan/Documentation/Configure.help --- linux-2.4.18-pre4/Documentation/Configure.help Sun Jan 20 20:39:06 2002 +++ linux-2.4.18-pre4-elan/Documentation/Configure.help Sun Jan 20 21:35:38 2002 @@ -3813,6 +3813,7 @@ - "Pentium-4" for the Intel Pentium 4. - "K6" for the AMD K6, K6-II and K6-III (aka K6-3D). - "Athlon" for the AMD K7 family (Athlon/Duron/Thunderbird). + - "Elan" for the AMD Elan family (Elan SC400/SC410). - "Crusoe" for the Transmeta Crusoe series. - "Winchip-C6" for original IDT Winchip. - "Winchip-2" for IDT Winchip 2. diff -urN -X kernel-patches/dontdiff linux-2.4.18-pre4/arch/i386/boot/setup.S linux-2.4.18-pre4-elan/arch/i386/boot/setup.S --- linux-2.4.18-pre4/arch/i386/boot/setup.S Sun Jan 20 20:39:07 2002 +++ linux-2.4.18-pre4-elan/arch/i386/boot/setup.S Mon Jan 21 07:44:20 2002 @@ -42,6 +42,9 @@ * if CX/DX have been changed in the e801 call and if so use AX/BX . * Michael Miller, April 2001 <michaelm@mjmm.org> * + * New A20 code ported from SYSLINUX by H. Peter Anvin. AMD Elan bugfixes + * by Robert Schwebel, December 2001 <robert@schwebel.de> + * */ #include <linux/config.h> @@ -651,7 +654,18 @@ # # Enable A20. This is at the very best an annoying procedure. # A20 code ported from SYSLINUX 1.52-1.63 by H. Peter Anvin. +# AMD Elan bug fix by Robert Schwebel. # + +#if defined(CONFIG_MELAN) + movb $0x02, %al # alternate A20 gate + outb %al, $0x92 # this works on SC410/SC520 +a20_elan_wait: + call a20_test + jz a20_elan_wait + jmp a20_done +#endif + A20_TEST_LOOPS = 32 # Iterations per wait A20_ENABLE_LOOPS = 255 # Total loops to try diff -urN -X kernel-patches/dontdiff linux-2.4.18-pre4/arch/i386/config.in linux-2.4.18-pre4-elan/arch/i386/config.in --- linux-2.4.18-pre4/arch/i386/config.in Fri Dec 21 18:41:53 2001 +++ linux-2.4.18-pre4-elan/arch/i386/config.in Sun Jan 20 21:35:38 2002 @@ -37,6 +37,7 @@ Pentium-4 CONFIG_MPENTIUM4 \ K6/K6-II/K6-III CONFIG_MK6 \ Athlon/Duron/K7 CONFIG_MK7 \ + Elan CONFIG_MELAN \ Crusoe CONFIG_MCRUSOE \ Winchip-C6 CONFIG_MWINCHIPC6 \ Winchip-2 CONFIG_MWINCHIP2 \ @@ -125,6 +126,11 @@ define_bool CONFIG_X86_USE_3DNOW y define_bool CONFIG_X86_PGE y define_bool CONFIG_X86_USE_PPRO_CHECKSUM y +fi +if [ "$CONFIG_MELAN" = "y" ]; then + define_int CONFIG_X86_L1_CACHE_SHIFT 4 + define_bool CONFIG_X86_USE_STRING_486 y + define_bool CONFIG_X86_ALIGNMENT_16 y fi if [ "$CONFIG_MCYRIXIII" = "y" ]; then define_int CONFIG_X86_L1_CACHE_SHIFT 5 diff -urN -X kernel-patches/dontdiff linux-2.4.18-pre4/arch/i386/kernel/setup.c linux-2.4.18-pre4-elan/arch/i386/kernel/setup.c --- linux-2.4.18-pre4/arch/i386/kernel/setup.c Sun Jan 20 20:39:07 2002 +++ linux-2.4.18-pre4-elan/arch/i386/kernel/setup.c Sun Jan 20 21:35:38 2002 @@ -329,6 +329,10 @@ { "dma2", 0xc0, 0xdf, IORESOURCE_BUSY }, { "fpu", 0xf0, 0xff, IORESOURCE_BUSY } }; +#ifdef CONFIG_ELAN +standard_io_resources[1] = { "pic1", 0x20, 0x21, IORESOURCE_BUSY }; +standard_io_resources[5] = { "pic2", 0xa0, 0xa1, IORESOURCE_BUSY }; +#endif #define STANDARD_IO_RESOURCES (sizeof(standard_io_resources)/sizeof(struct resource)) diff -urN -X kernel-patches/dontdiff linux-2.4.18-pre4/drivers/char/serial.c linux-2.4.18-pre4-elan/drivers/char/serial.c --- linux-2.4.18-pre4/drivers/char/serial.c Sun Jan 20 20:39:13 2002 +++ linux-2.4.18-pre4-elan/drivers/char/serial.c Sun Jan 20 21:35:38 2002 @@ -57,6 +57,9 @@ * 10/00: add in optional software flow control for serial console. * Kanoj Sarcar <kanoj@sgi.com> (Modified by Theodore Ts'o) * + * 12/01: Fix for AMD Elan bug in transmit irq routine, by + * Christer Weinigel <wingel@hog.ctrl-c.liu.se>, + * Robert Schwebel <robert@schwebel.de> */ static char *serial_version = "5.05c"; @@ -853,7 +856,7 @@ if (!info) { info = IRQ_ports[irq]; if (pass_counter++ > RS_ISR_PASS_LIMIT) { -#if 0 +#ifdef SERIAL_DEBUG_INTR printk("rs loop break\n"); #endif break; /* Prevent infinite loops */ @@ -886,6 +889,9 @@ int first_multi = 0; struct rs_multiport_struct *multi; #endif +#ifdef CONFIG_MELAN + int iir; +#endif #ifdef SERIAL_DEBUG_INTR printk("rs_interrupt_single(%d)...", irq); @@ -900,7 +906,9 @@ if (multi->port_monitor) first_multi = inb(multi->port_monitor); #endif - +#ifdef CONFIG_MELAN + iir = serial_in(info, UART_IIR); +#endif do { status = serial_inp(info, UART_LSR); #ifdef SERIAL_DEBUG_INTR @@ -909,10 +917,24 @@ if (status & UART_LSR_DR) receive_chars(info, &status, regs); check_modem_status(info); + +#ifdef CONFIG_M_ELAN + /* + * There is a bug in the UART on the AMD Elan SC4x0 + * embedded processor series; the THRE bit of the line + * status register seems to be delayed one bit clock after + * the interrupt is generated, so kludge this if the + * IIR indicates a Transmit Holding Register Interrupt + * + */ + if (status & UART_LSR_THRE || (iir & UART_IIR_ID) == UART_IIR_THRI) + transmit_chars(info, 0); +#else if (status & UART_LSR_THRE) transmit_chars(info, 0); +#endif if (pass_counter++ > RS_ISR_PASS_LIMIT) { -#if 0 +#ifdef SERIAL_DEBUG_INTR printk("rs_single loop break.\n"); #endif break; diff -urN -X kernel-patches/dontdiff linux-2.4.18-pre4/include/asm-i386/timex.h linux-2.4.18-pre4-elan/include/asm-i386/timex.h --- linux-2.4.18-pre4/include/asm-i386/timex.h Thu Nov 22 20:46:18 2001 +++ linux-2.4.18-pre4-elan/include/asm-i386/timex.h Sun Jan 20 21:41:35 2002 @@ -9,7 +9,12 @@ #include <linux/config.h> #include <asm/msr.h> -#define CLOCK_TICK_RATE 1193180 /* Underlying HZ */ +#ifdef CONFIG_MELAN +# define CLOCK_TICK_RATE 1189200 /* AMD Elan has different frequency! */ +#else +# define CLOCK_TICK_RATE 1193180 /* Underlying HZ */ +#endif + #define CLOCK_TICK_FACTOR 20 /* Factor of both 1000000 and CLOCK_TICK_RATE */ #define FINETUNE ((((((long)LATCH * HZ - CLOCK_TICK_RATE) << SHIFT_HZ) * \ (1000000/CLOCK_TICK_FACTOR) / (CLOCK_TICK_RATE/CLOCK_TICK_FACTOR)) \ ----------8<----------8<----------8<----------8<----------8<---------- Robert -- +--------------------------------------------------------+ | Dipl.-Ing. Robert Schwebel | http://www.pengutronix.de | | Pengutronix - Linux Solutions for Science and Industry | | Braunschweiger Str. 79, 31134 Hildesheim, Germany | | Phone: +49-5121-28619-0 | Fax: +49-5121-28619-4 | +--------------------------------------------------------+ ^ permalink raw reply [flat|nested] 55+ messages in thread
* Re: New version of AMD Elan patch 2002-01-21 7:28 ` New version of " Robert Schwebel @ 2002-01-21 20:44 ` Marcelo Tosatti 2002-01-24 8:09 ` Robert Schwebel 1 sibling, 0 replies; 55+ messages in thread From: Marcelo Tosatti @ 2002-01-21 20:44 UTC (permalink / raw) To: Robert Schwebel; +Cc: Alan Cox, Linux Kernel List Applied. On Mon, 21 Jan 2002, Robert Schwebel wrote: > Hi Marcelo and Alan, > > Here's a new version of the AMD Elan patch, against 2.4.18-pre4. Please > apply. ^ permalink raw reply [flat|nested] 55+ messages in thread
* Re: New version of AMD Elan patch 2002-01-21 7:28 ` New version of " Robert Schwebel 2002-01-21 20:44 ` Marcelo Tosatti @ 2002-01-24 8:09 ` Robert Schwebel 2002-01-24 8:39 ` Robert Schwebel 1 sibling, 1 reply; 55+ messages in thread From: Robert Schwebel @ 2002-01-24 8:09 UTC (permalink / raw) To: marcelo; +Cc: Linux Kernel List Hi Marcelo, thanks for applying the Elan patch. Unfortunately, I've discovered a typo, patch below. For the list: the remaining stuff against -pre7 is as usual on http://www.pengutronix.de/software/elan_en.wml Changelog: 01/24/2002 Robert Schwebel <robert@schwebel.de> - Revision 2.4.18-pre7.1 released. - Marcelo has integrated everything but the serial driver stuff into the latest pre-patch. I'll have to send the rest to tytso... - striped out the applied stuff - typo in arch/i386/kernel/setup.c Robert ----------8<---------- diff -urN -X kernel-patches/dontdiff linux-2.4.18-pre7/arch/i386/kernel/setup.c linux-2.4.18-pre7-elan/arch/i386/kernel/setup.c --- linux-2.4.18-pre7/arch/i386/kernel/setup.c Thu Jan 24 07:36:14 2002 +++ linux-2.4.18-pre7-elan/arch/i386/kernel/setup.c Thu Jan 24 08:51:01 2002 @@ -329,7 +329,7 @@ { "dma2", 0xc0, 0xdf, IORESOURCE_BUSY }, { "fpu", 0xf0, 0xff, IORESOURCE_BUSY } }; -#ifdef CONFIG_ELAN +#ifdef CONFIG_MELAN standard_io_resources[1] = { "pic1", 0x20, 0x21, IORESOURCE_BUSY }; standard_io_resources[5] = { "pic2", 0xa0, 0xa1, IORESOURCE_BUSY }; #endif ----------8<---------- -- +--------------------------------------------------------+ | Dipl.-Ing. Robert Schwebel | http://www.pengutronix.de | | Pengutronix - Linux Solutions for Science and Industry | | Braunschweiger Str. 79, 31134 Hildesheim, Germany | | Phone: +49-5121-28619-0 | Fax: +49-5121-28619-4 | +--------------------------------------------------------+ ^ permalink raw reply [flat|nested] 55+ messages in thread
* Re: New version of AMD Elan patch 2002-01-24 8:09 ` Robert Schwebel @ 2002-01-24 8:39 ` Robert Schwebel 0 siblings, 0 replies; 55+ messages in thread From: Robert Schwebel @ 2002-01-24 8:39 UTC (permalink / raw) To: Linux Kernel List On Thu, 24 Jan 2002, Robert Schwebel wrote: > For the list: the remaining stuff against -pre7 is as usual on > > http://www.pengutronix.de/software/elan_en.wml Oops, should be http://www.pengutronix.de/software/elan_en.html Robert -- +--------------------------------------------------------+ | Dipl.-Ing. Robert Schwebel | http://www.pengutronix.de | | Pengutronix - Linux Solutions for Science and Industry | | Braunschweiger Str. 79, 31134 Hildesheim, Germany | | Phone: +49-5121-28619-0 | Fax: +49-5121-28619-4 | +--------------------------------------------------------+ ^ permalink raw reply [flat|nested] 55+ messages in thread
* [PATCH] AMD Elan patch 2002-01-11 9:38 ` [PATCH] " Robert Schwebel 2002-01-21 7:28 ` New version of " Robert Schwebel @ 2002-01-23 10:28 ` Robert Schwebel 2002-01-23 21:30 ` Marcelo Tosatti 1 sibling, 1 reply; 55+ messages in thread From: Robert Schwebel @ 2002-01-23 10:28 UTC (permalink / raw) To: marcelo; +Cc: Linux Kernel List Hi Marcelo, the changelog for -pre5 has my AMD Elan fixes included, but unfortunately you seem to have forgotten to apply the patch... Here is the most recent version, against 2.4.18-pre6. Please note that the CPU frequency driver is not included in this patch (it will be ported to the cpufreq interface first), so this is purely bug fixing stuff. Changelog as always on http://www.pengutronix.de/software/elan_en.html ----------8<----------8<----------8<----------8<---------- diff -urN -X kernel-patches/dontdiff linux-2.4.18-pre6/CREDITS linux-2.4.18-pre6-elan/CREDITS --- linux-2.4.18-pre6/CREDITS Wed Jan 23 07:51:48 2002 +++ linux-2.4.18-pre6-elan/CREDITS Wed Jan 23 09:58:10 2002 @@ -2653,6 +2653,16 @@ S: Oldenburg S: Germany +N: Robert Schwebel +E: robert@schwebel.de +W: http://www.schwebel.de +D: Embedded hacker and book author, +D: AMD Elan support for Linux +S: Pengutronix +S: Braunschweiger Strasse 79 +S: 31134 Hildesheim +S: Germany + N: Darren Senn E: sinster@darkwater.com D: Whatever I notice needs doing (so far: itimers, /proc) diff -urN -X kernel-patches/dontdiff linux-2.4.18-pre6/Documentation/Configure.help linux-2.4.18-pre6-elan/Documentation/Configure.help --- linux-2.4.18-pre6/Documentation/Configure.help Wed Jan 23 07:51:48 2002 +++ linux-2.4.18-pre6-elan/Documentation/Configure.help Wed Jan 23 10:02:51 2002 @@ -3813,6 +3829,7 @@ - "Pentium-4" for the Intel Pentium 4. - "K6" for the AMD K6, K6-II and K6-III (aka K6-3D). - "Athlon" for the AMD K7 family (Athlon/Duron/Thunderbird). + - "Elan" for the AMD Elan family (Elan SC400/SC410). - "Crusoe" for the Transmeta Crusoe series. - "Winchip-C6" for original IDT Winchip. - "Winchip-2" for IDT Winchip 2. diff -urN -X kernel-patches/dontdiff linux-2.4.18-pre6/arch/i386/boot/setup.S linux-2.4.18-pre6-elan/arch/i386/boot/setup.S --- linux-2.4.18-pre6/arch/i386/boot/setup.S Wed Jan 23 07:51:49 2002 +++ linux-2.4.18-pre6-elan/arch/i386/boot/setup.S Wed Jan 23 10:02:51 2002 @@ -42,6 +42,9 @@ * if CX/DX have been changed in the e801 call and if so use AX/BX . * Michael Miller, April 2001 <michaelm@mjmm.org> * + * New A20 code ported from SYSLINUX by H. Peter Anvin. AMD Elan bugfixes + * by Robert Schwebel, December 2001 <robert@schwebel.de> + * */ #include <linux/config.h> @@ -651,7 +654,18 @@ # # Enable A20. This is at the very best an annoying procedure. # A20 code ported from SYSLINUX 1.52-1.63 by H. Peter Anvin. +# AMD Elan bug fix by Robert Schwebel. # + +#if defined(CONFIG_MELAN) + movb $0x02, %al # alternate A20 gate + outb %al, $0x92 # this works on SC410/SC520 +a20_elan_wait: + call a20_test + jz a20_elan_wait + jmp a20_done +#endif + A20_TEST_LOOPS = 32 # Iterations per wait A20_ENABLE_LOOPS = 255 # Total loops to try diff -urN -X kernel-patches/dontdiff linux-2.4.18-pre6/arch/i386/config.in linux-2.4.18-pre6-elan/arch/i386/config.in --- linux-2.4.18-pre6/arch/i386/config.in Fri Dec 21 18:41:53 2001 +++ linux-2.4.18-pre6-elan/arch/i386/config.in Wed Jan 23 10:02:51 2002 @@ -37,6 +37,7 @@ Pentium-4 CONFIG_MPENTIUM4 \ K6/K6-II/K6-III CONFIG_MK6 \ Athlon/Duron/K7 CONFIG_MK7 \ + Elan CONFIG_MELAN \ Crusoe CONFIG_MCRUSOE \ Winchip-C6 CONFIG_MWINCHIPC6 \ Winchip-2 CONFIG_MWINCHIP2 \ @@ -125,6 +126,11 @@ define_bool CONFIG_X86_USE_3DNOW y define_bool CONFIG_X86_PGE y define_bool CONFIG_X86_USE_PPRO_CHECKSUM y +fi +if [ "$CONFIG_MELAN" = "y" ]; then + define_int CONFIG_X86_L1_CACHE_SHIFT 4 + define_bool CONFIG_X86_USE_STRING_486 y + define_bool CONFIG_X86_ALIGNMENT_16 y fi if [ "$CONFIG_MCYRIXIII" = "y" ]; then define_int CONFIG_X86_L1_CACHE_SHIFT 5 diff -urN -X kernel-patches/dontdiff linux-2.4.18-pre6/arch/i386/kernel/setup.c linux-2.4.18-pre6-elan/arch/i386/kernel/setup.c --- linux-2.4.18-pre6/arch/i386/kernel/setup.c Wed Jan 23 07:51:50 2002 +++ linux-2.4.18-pre6-elan/arch/i386/kernel/setup.c Wed Jan 23 10:02:51 2002 @@ -329,6 +329,10 @@ { "dma2", 0xc0, 0xdf, IORESOURCE_BUSY }, { "fpu", 0xf0, 0xff, IORESOURCE_BUSY } }; +#ifdef CONFIG_ELAN +standard_io_resources[1] = { "pic1", 0x20, 0x21, IORESOURCE_BUSY }; +standard_io_resources[5] = { "pic2", 0xa0, 0xa1, IORESOURCE_BUSY }; +#endif #define STANDARD_IO_RESOURCES (sizeof(standard_io_resources)/sizeof(struct resource)) diff -urN -X kernel-patches/dontdiff linux-2.4.18-pre6/drivers/char/serial.c linux-2.4.18-pre6-elan/drivers/char/serial.c --- linux-2.4.18-pre6/drivers/char/serial.c Wed Jan 23 07:52:03 2002 +++ linux-2.4.18-pre6-elan/drivers/char/serial.c Wed Jan 23 10:02:51 2002 @@ -57,6 +57,10 @@ * 10/00: add in optional software flow control for serial console. * Kanoj Sarcar <kanoj@sgi.com> (Modified by Theodore Ts'o) * + * 12/01: Fix for AMD Elan bug in transmit irq routine, by + * Christer Weinigel <wingel@hog.ctrl-c.liu.se>, + * Robert Schwebel <robert@schwebel.de> + * Juergen Beisert <jbeisert@eurodsn.de> */ static char *serial_version = "5.05c"; @@ -802,6 +806,7 @@ static void rs_interrupt(int irq, void *dev_id, struct pt_regs * regs) { int status; + int iir; struct async_struct * info; int pass_counter = 0; struct async_struct *end_mark = 0; @@ -825,12 +830,24 @@ #endif do { - if (!info->tty || - (serial_in(info, UART_IIR) & UART_IIR_NO_INT)) { - if (!end_mark) - end_mark = info; + + /* + * It seems to be important in a SC520 systems to read + * the UART_IIR register only once per loop. But I think + * this small correction does not disturb the normal + * implementation. + */ + + /* Something to test? */ + /* Or is this UART the source of the interrupt? */ + + if (!info->tty || + ((iir=serial_inp(info, UART_IIR)) & 0x01)) { + if (!end_mark) /* last reached? */ + end_mark = info; /* ..yes, leave loop */ goto next; - } + } + #ifdef SERIAL_DEBUG_INTR printk("IIR = %x...", serial_in(info, UART_IIR)); #endif @@ -839,6 +856,24 @@ info->last_active = jiffies; status = serial_inp(info, UART_LSR); + +#ifdef CONFIG_MELAN + + /* + * There is a bug (misfeature?) in the UART on the AMD Elan + * SC4x0 and SC520 embedded processor series; the THRE bit of + * the line status register seems to be delayed one bit + * clock after the interrupt is generated, so kludge this + * if the IIR indicates a Transmit Holding Register Interrupt + */ + if ((iir & UART_IIR_ID) == UART_IIR_THRI) { + status |= UART_LSR_THRE; +#ifdef SERIAL_DEBUG_INTR + printk("|%x", status); +#endif + } +#endif /* CONFIG_MELAN */ + #ifdef SERIAL_DEBUG_INTR printk("status = %x...", status); #endif @@ -853,7 +888,7 @@ if (!info) { info = IRQ_ports[irq]; if (pass_counter++ > RS_ISR_PASS_LIMIT) { -#if 0 +#ifdef SERIAL_DEBUG_INTR printk("rs loop break\n"); #endif break; /* Prevent infinite loops */ @@ -886,6 +921,9 @@ int first_multi = 0; struct rs_multiport_struct *multi; #endif +#ifdef CONFIG_MELAN + int iir; +#endif #ifdef SERIAL_DEBUG_INTR printk("rs_interrupt_single(%d)...", irq); @@ -900,7 +938,9 @@ if (multi->port_monitor) first_multi = inb(multi->port_monitor); #endif - +#ifdef CONFIG_MELAN + iir = serial_in(info, UART_IIR); +#endif do { status = serial_inp(info, UART_LSR); #ifdef SERIAL_DEBUG_INTR @@ -909,10 +949,25 @@ if (status & UART_LSR_DR) receive_chars(info, &status, regs); check_modem_status(info); + +#ifdef CONFIG_MELAN + + /* + * There is a bug (misfeature?) in the UART on the AMD Elan + * SC4x0 and SC520 embedded processor series; the THRE bit of + * the line status register seems to be delayed one bit + * clock after the interrupt is generated, so kludge this + * if the IIR indicates a Transmit Holding Register Interrupt + */ + + if ((iir & UART_IIR_ID) == UART_IIR_THRI) + status |= UART_LSR_THRE; +#endif if (status & UART_LSR_THRE) transmit_chars(info, 0); + if (pass_counter++ > RS_ISR_PASS_LIMIT) { -#if 0 +#ifdef SERIAL_DEBUG_INTR printk("rs_single loop break.\n"); #endif break; @@ -920,7 +975,7 @@ #ifdef SERIAL_DEBUG_INTR printk("IIR = %x...", serial_in(info, UART_IIR)); #endif - } while (!(serial_in(info, UART_IIR) & UART_IIR_NO_INT)); + } while (!((iir = serial_in(info, UART_IIR)) & UART_IIR_NO_INT)); info->last_active = jiffies; #ifdef CONFIG_SERIAL_MULTIPORT if (multi->port_monitor) diff -urN -X kernel-patches/dontdiff linux-2.4.18-pre6/include/asm-i386/timex.h linux-2.4.18-pre6-elan/include/asm-i386/timex.h --- linux-2.4.18-pre6/include/asm-i386/timex.h Thu Nov 22 20:46:18 2001 +++ linux-2.4.18-pre6-elan/include/asm-i386/timex.h Wed Jan 23 10:02:51 2002 @@ -9,7 +9,12 @@ #include <linux/config.h> #include <asm/msr.h> -#define CLOCK_TICK_RATE 1193180 /* Underlying HZ */ +#ifdef CONFIG_MELAN +# define CLOCK_TICK_RATE 1189200 /* AMD Elan has different frequency! */ +#else +# define CLOCK_TICK_RATE 1193180 /* Underlying HZ */ +#endif + #define CLOCK_TICK_FACTOR 20 /* Factor of both 1000000 and CLOCK_TICK_RATE */ #define FINETUNE ((((((long)LATCH * HZ - CLOCK_TICK_RATE) << SHIFT_HZ) * \ (1000000/CLOCK_TICK_FACTOR) / (CLOCK_TICK_RATE/CLOCK_TICK_FACTOR)) \ ----------8<----------8<----------8<----------8<---------- Robert -- +--------------------------------------------------------+ | Dipl.-Ing. Robert Schwebel | http://www.pengutronix.de | | Pengutronix - Linux Solutions for Science and Industry | | Braunschweiger Str. 79, 31134 Hildesheim, Germany | | Phone: +49-5121-28619-0 | Fax: +49-5121-28619-4 | +--------------------------------------------------------+ ^ permalink raw reply [flat|nested] 55+ messages in thread
* Re: [PATCH] AMD Elan patch 2002-01-23 10:28 ` [PATCH] " Robert Schwebel @ 2002-01-23 21:30 ` Marcelo Tosatti 0 siblings, 0 replies; 55+ messages in thread From: Marcelo Tosatti @ 2002-01-23 21:30 UTC (permalink / raw) To: Robert Schwebel; +Cc: Linux Kernel List On Wed, 23 Jan 2002, Robert Schwebel wrote: > Hi Marcelo, > > the changelog for -pre5 has my AMD Elan fixes included, but unfortunately > you seem to have forgotten to apply the patch... I have not applied the serial.c hunk since it breaks compilation without CONFIG_MELAN. Please fix that and resend me a patch to serial.c only. Thanks ^ permalink raw reply [flat|nested] 55+ messages in thread
* Re: [PATCH][RFC] AMD Elan patch 2002-01-01 12:30 ` [PATCH][RFC] AMD Elan patch Robert Schwebel ` (2 preceding siblings ...) 2002-01-11 9:38 ` [PATCH] " Robert Schwebel @ 2002-01-22 14:47 ` Robert Schwebel 2002-01-22 18:01 ` Dave Jones 2002-01-22 22:55 ` New version of AMD Elan patch available Robert Schwebel 4 siblings, 1 reply; 55+ messages in thread From: Robert Schwebel @ 2002-01-22 14:47 UTC (permalink / raw) To: Linux Kernel List Hi, [please send answers also per mail] I've uploaded a new version of the patch (2.4.18-pre4.2) which basically includes a change to the serial port code by Juergen Beisert. This patch should fix problems with systems that use interrupt sharing UARTs. Latest stuff is as usual on http://www.pengutronix.de/software/elan_en.html Please test this extensively and report about your success. I have another patch from Sven Geggus in the pipeline which makes it possible to change the CPU's clock frequency on the fly. I would like to integrate it but do not have a more-than-33-MHz Elan system available for testing. If someone has a contact to a hardware supplyer who wants to send me a board please tell me - SSV seems not to be cooperative here. Other stuff waiting for integration: - watchdog driver - support for systems with external timer 0 clock source - CS8900 bug ("transmission underflow") Robert -- +--------------------------------------------------------+ | Dipl.-Ing. Robert Schwebel | http://www.pengutronix.de | | Pengutronix - Linux Solutions for Science and Industry | | Braunschweiger Str. 79, 31134 Hildesheim, Germany | | Phone: +49-5121-28619-0 | Fax: +49-5121-28619-4 | +--------------------------------------------------------+ ^ permalink raw reply [flat|nested] 55+ messages in thread
* Re: [PATCH][RFC] AMD Elan patch 2002-01-22 14:47 ` [PATCH][RFC] " Robert Schwebel @ 2002-01-22 18:01 ` Dave Jones 0 siblings, 0 replies; 55+ messages in thread From: Dave Jones @ 2002-01-22 18:01 UTC (permalink / raw) To: Robert Schwebel; +Cc: Linux Kernel List On Tue, Jan 22, 2002 at 03:47:32PM +0100, Robert Schwebel wrote: > > I have another patch from Sven Geggus in the pipeline which makes it > possible to change the CPU's clock frequency on the fly. It would probably be a good idea to make this fit the cpufreq API that Russell King, myself and a few others created. It's in the ARM Linux CVS with the modulename cpufreq. -- | Dave Jones. http://www.codemonkey.org.uk | SuSE Labs ^ permalink raw reply [flat|nested] 55+ messages in thread
* New version of AMD Elan patch available 2002-01-01 12:30 ` [PATCH][RFC] AMD Elan patch Robert Schwebel ` (3 preceding siblings ...) 2002-01-22 14:47 ` [PATCH][RFC] " Robert Schwebel @ 2002-01-22 22:55 ` Robert Schwebel 2002-02-01 22:01 ` Robert Schwebel 4 siblings, 1 reply; 55+ messages in thread From: Robert Schwebel @ 2002-01-22 22:55 UTC (permalink / raw) To: Linux Kernel List; +Cc: linux-embedded Hi, [please send comments per mail] today it's quick-release-time. There's another version of the AMD Elan patch available which adds Sven Geggus' driver for changing the CPU frequency. See the latest patch on http://www.pengutronix.de/software/elan_en.html Please note that this is a very first and experimental version of this driver. The API will most likely change to the cpufreq API from the ARM architecture (Dave, I'll have a look at it tomorrow). Robert -- +--------------------------------------------------------+ | Dipl.-Ing. Robert Schwebel | http://www.pengutronix.de | | Pengutronix - Linux Solutions for Science and Industry | | Braunschweiger Str. 79, 31134 Hildesheim, Germany | | Phone: +49-5121-28619-0 | Fax: +49-5121-28619-4 | +--------------------------------------------------------+ ^ permalink raw reply [flat|nested] 55+ messages in thread
* New version of AMD Elan patch available 2002-01-22 22:55 ` New version of AMD Elan patch available Robert Schwebel @ 2002-02-01 22:01 ` Robert Schwebel 0 siblings, 0 replies; 55+ messages in thread From: Robert Schwebel @ 2002-02-01 22:01 UTC (permalink / raw) To: Linux Kernel List; +Cc: linux-embedded, Arnd Bergmann Here is another bugfix release of the AMD Elan patch. Changelog included, the patch is as usual on http://www.pengutronix.de/software/elan_en.html ----------8<----------8<----------8<----------8<---------- 02/01/2002 Robert Schwebel <robert@schwebel.de> - Revision 2.4.18-pre7.2 released. - Bugfix in serial.c; the problem occured if CONFIG_ELAN was not activated. Thanks to Arnd Bergmann <abe@ist1.de> ----------8<----------8<----------8<----------8<---------- Robert -- +--------------------------------------------------------+ | Dipl.-Ing. Robert Schwebel | http://www.pengutronix.de | | Pengutronix - Linux Solutions for Science and Industry | | Braunschweiger Str. 79, 31134 Hildesheim, Germany | | Phone: +49-5121-28619-0 | Fax: +49-5121-28619-4 | +--------------------------------------------------------+ ^ permalink raw reply [flat|nested] 55+ messages in thread
end of thread, other threads:[~2002-02-01 22:03 UTC | newest] Thread overview: 55+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2001-12-21 21:26 AMD SC410 boot problems with recent kernels Robert Schwebel 2001-12-21 22:09 ` H. Peter Anvin 2001-12-22 16:13 ` Robert Schwebel 2001-12-23 1:44 ` H. Peter Anvin 2001-12-23 9:45 ` Robert Schwebel 2001-12-23 10:19 ` H. Peter Anvin 2001-12-23 13:16 ` Christer Weinigel 2001-12-23 20:02 ` H. Peter Anvin 2001-12-30 22:02 ` Robert Schwebel 2001-12-30 23:15 ` H. Peter Anvin 2002-01-01 12:30 ` [PATCH][RFC] AMD Elan patch Robert Schwebel 2002-01-01 21:49 ` H. Peter Anvin 2002-01-01 23:27 ` Robert Schwebel 2002-01-01 23:38 ` H. Peter Anvin 2002-01-02 0:05 ` Dave Jones 2002-01-02 0:45 ` H. Peter Anvin 2002-01-02 13:49 ` Robert Schwebel 2002-01-02 14:03 ` Dave Jones 2002-01-02 16:10 ` Alan Cox 2002-01-02 22:40 ` H. Peter Anvin 2002-01-02 23:10 ` Alan Cox 2002-01-02 23:02 ` H. Peter Anvin 2002-01-02 23:50 ` Alan Cox 2002-01-03 9:04 ` Robert Schwebel 2002-01-02 23:56 ` Robert Kaiser 2002-01-03 0:10 ` Alan Cox 2002-01-03 8:52 ` Robert Schwebel 2002-01-02 16:06 ` Alan Cox 2002-01-02 16:56 ` Robert Schwebel 2002-01-02 17:26 ` Robert Schwebel 2002-01-02 23:06 ` Peter Wächtler 2002-01-02 23:21 ` H. Peter Anvin 2002-01-02 1:07 ` [RFC] Embedded X86 systems Was: " Christer Weinigel 2002-01-02 8:45 ` Alan Cox 2002-01-02 9:05 ` Christer Weinigel 2002-01-02 9:18 ` Alan Cox 2002-01-05 12:23 ` Eric W. Biederman 2002-01-02 0:06 ` Christer Weinigel 2002-01-02 0:48 ` H. Peter Anvin 2002-01-02 1:10 ` Christer Weinigel 2002-01-02 13:58 ` Robert Schwebel 2002-01-02 20:47 ` Christer Weinigel 2002-01-02 13:55 ` Robert Schwebel 2002-01-02 15:54 ` Robert Schwebel 2002-01-11 9:38 ` [PATCH] " Robert Schwebel 2002-01-21 7:28 ` New version of " Robert Schwebel 2002-01-21 20:44 ` Marcelo Tosatti 2002-01-24 8:09 ` Robert Schwebel 2002-01-24 8:39 ` Robert Schwebel 2002-01-23 10:28 ` [PATCH] " Robert Schwebel 2002-01-23 21:30 ` Marcelo Tosatti 2002-01-22 14:47 ` [PATCH][RFC] " Robert Schwebel 2002-01-22 18:01 ` Dave Jones 2002-01-22 22:55 ` New version of AMD Elan patch available Robert Schwebel 2002-02-01 22:01 ` Robert Schwebel
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox