Heyi,

Yes.  I think computing the poll rate is a good addition to the TerminalDxe 
module.

If any of the information required to compute the rate is not available, then 
the #define default rate can be used.

Do you want to prepare a patch with this enhancement?

Thanks,

Mike

>-----Original Message-----
>From: edk2-devel [mailto:[email protected]] On Behalf Of Heyi Guo
>Sent: Tuesday, November 10, 2015 5:27 PM
>To: Kinney, Michael D; [email protected]
>Cc: Tian, Feng
>Subject: Re: [edk2] [RFC] Adaptively set serial terminal input polling interval
>
>
>
>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
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to