On 11/11/2015 04:34 AM, Kinney, Michael D wrote:
Heyi,
All timers in UEFI are the minimum time. So the only way to guarantee that a
FIFO will never overflow is to use flow control.
Setting the poll rate based on FIFO depth and baud rate, data bits, and stop
bits with flow control disabled means it should work most of the time, but
another UEFI event notification function running at the same TPL or higher can
block the Terminal event notification function and input characters could be
lost.
I agree that the current 20ms periodic timer can overflow depending in the FIFO
depth and the baud rate, and that we could reduce data loss in flow control
disabled configurations if this periodic rate was computed instead of using a
hard coded #define. Another constraint is the system timer interrupt rate
provided by the Timer Architectural Protocol. A request for a periodic timer
event that is faster than the current system timer rate will call the event
notification function at the rate of the system timer. So even if you reduce
the periodic timer event time to a computed value, the time between event
notification function calls may not change.
Totally agree. However normally we will have platform configuration
interface for interrupt rate of system timer, like PCD or even driver
override, but I can't find any interface to configure polling rate of
the terminal driver, and I really don't like to override the whole
terminal driver when I only want to change the polling rate :). That's
the reason why I want to make a patch for terminal driver.
In order to prevent overflows, I think the timer rate in 100ns units could be
computed as follows:
Receive FIFO depth * (1 + DataBits + StopBits) * 10,000,000
----------------------------------------------------------------------------------
BaudRate
For example, a 16 byte receive FIFO with 8 data bits and 1 stop bit at 115200
would be:
16 * (1 + 8 + 1) * 10,000,000 / 115200 = 15277
Which is 0.00153 seconds or 1.53 ms.
Can I consider this as your agreement on calculating polling rate in
terminal driver?
After all, really appreciate your detailed answer on this issue.
Heyi
Best regards,
Mike
-----Original Message-----
From: edk2-devel [mailto:[email protected]] On Behalf Of Heyi Guo
Sent: Monday, November 09, 2015 10:23 PM
To: Kinney, Michael D; [email protected]
Cc: Tian, Feng
Subject: Re: [edk2] [RFC] Adaptively set serial terminal input polling interval
Hi Michael,
Yes we can see terminal input truncated when we use copy-paste to input
characters.
I don't quite understand the relationship between SerialInTimeOut and
timer event poll rate; and I don't see the periodic timer rate is to be
updated later; we are using 0.02ms period all over, aren't we?
If the timer event polls the serial device at a fixed rate, how can we
guarantee the FIFO of the device will not overflow during a burst input?
Thanks.
On 11/10/2015 01:25 AM, Kinney, Michael D wrote:
Heyi,
The function TerminalConInTimerHandler () computes a timeout based on the baud
rate, data bits, and stop bits
//
// According to BAUD rate to calculate the timeout value.
//
SerialInTimeOut = (1 + Mode->DataBits + Mode->StopBits) * 2 * 1000000 /
(UINTN) Mode->BaudRate;
The #define is used to set the initial periodic timer rate before the rest of
the information to compute a timeout is known.
Are you observing an issue?
Mike
-----Original Message-----
From: edk2-devel [mailto:[email protected]] On Behalf Of Heyi
Guo
Sent: Monday, November 09, 2015 1:48 AM
To: [email protected]
Cc: Tian, Feng
Subject: [edk2] [RFC] Adaptively set serial terminal input polling interval
Hi All,
In MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf, the
polling interval is fixed by macro:
#define KEYBOARD_TIMER_INTERVAL 200000 // 0.02s
However, this may cause fast input to be truncated on some platform. For
example, we have a serial console with below features:
1. Baud rate: 115200
2. FIFO depth of UART device: 32
If we want to capture all input, we need to poll with the interval of 32
/ (115200 / (8 + 1 + 1)) = 2.8 ms, 8 + 1 + 1 for data bits + start bit +
stop bit.
So, I suppose to use a PCD to set the interval per platform, or
calculate from serial IO protocol IO Mode, which contains FIFO depth and
data bits, etc, and we can use 200000 as the maximum for compatibility,
or default value when fifo depth is 0.
Please let me know your comments.
Thanks.
Heyi
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel