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.
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.
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