On Sat, Jul 09, 2011 at 03:44:50PM -0500, Scott Duplichan wrote:
Kevin O'Connor wrote:
]Some serial ports have slightly different timing. These timing ]variations result in less accurate boot time reporting. So, add a ]calibration mechanism to the tool so that one can determine how much ]time a specific machine's serial port uses.
Hello Kevin,
A while back I noticed both SeaBIOS and coreboot poll for TEMP (line status register bit for transmitter empty) before transmitting a character. An alternative is to poll THRE (transmitter holding register empty) instead.
Polling TEMP forces the code to wait until the final stop bit time period is complete before it can load the next character. It is understandable that on some implementations this will cause one idle bit time to pass before transmission of the next character starts.
When THRE is polled, the code has a period of nearly 10 bit times where the next character can be loaded such that it will transmit without any unneeded idle time between characters.
Thanks Scott, in some of my recent tests I noticed that in the SeaBIOS code as well. I just sent a patch in a separate email. Unfortunately, I didn't see an improvement in the timing accuracy even after I made that change. Maybe I've missed something else.
Here is the result of a transmit test using both methods on ASRock E350M1. The test works by timing a 5 second transmit:
TX baud rate test, TEMP method (SeaBIOS and coreboot) selected Measured Percent Error 110 100 9 300 273 9 600 546 9 1200 1092 9 2400 2185 8 4800 4370 8 9600 8742 8 19200 17484 8 28800 26225 8 38400 34967 8 57600 52451 8 115200 104899 8
I'm seeing something very similar when running timing tests under Linux. I get ~93.9us per char instead of the 86.8us per character at 115200 baud - a difference of 8%. This was under Linux though.
Oddly, under Linux, if I use bigger transmissions (eg, 10K) instead of just 4000 byte transmissions I get much better timings - as little as 88.1us. Maybe Linux is using the fifos when the transmission is large enough.
TX baud rate test, THRE method selected Measured Percent Error 110 110 0 300 300 0 600 600 0 1200 1201 0 2400 2403 0 4800 4807 0 9600 9615 0 19200 19232 0 28800 28848 0 38400 38464 0 57600 57697 0 115200 115394 0
I also noticed coreboot enables the uart fifos. This is not beneficial because the simple polling logic used by coreboot and SeaBIOS cannot utilize the transmit fifo.
Could the fifos being enabled be the cause of the slow down even after the SeaBIOS serial polling fix?
-Kevin