On 18 January 2016 at 11:33, Laszlo Ersek <ler...@redhat.com> wrote:
> On 01/18/16 11:24, Zeng, Star wrote:
>> [...]
>>
>>>>
>>>> The above analysis is very clear, thanks. I am a little concern about if
>>>> the code changes below follow the comments in the code.
>>>>
>>>> In Terminal.c:
>>>>      //
>>>>      // Set the timeout value of serial buffer for
>>>>      // keystroke response performance issue
>>>>      //
>>>> In TerminalConIn.c:
>>>>    //
>>>>    //  if current timeout value for serial device is not identical with
>>>>    //  the value saved in TERMINAL_DEV structure, then recalculate the
>>>>    //  timeout value again and set serial attribute according to this
>>>> value.
>>>>    //
>>
>> Any comments about above concern?
>
> Not really.
>
> I don't know what the purpose of the Timeout calculation is (what is the
> "keystroke response performance issue"?), but in any case, it is a good
> sign that TerminalDxe sets *some* Timeout explicitly.
>
> Plus, it has worked reliably until now, so we shouldn't change the
> Timeout argument.
>

I think "reliably" is a bit generous ;-)  The most common complaint I
get about EDK2 is that it can't handle more than a FIFO's worth of
pasted characters on the serial port.

>>
>>>>
>>>> And I also checked the
>>>> IntelFrameworkModulePkg/Bus/Isa/IsaSerialDxe/Serial.c although ARM
>>>> platforms do not use it, the SERIAL_PORT_DEFAULT_RECEIVE_FIFO_DEPTH
>>>> value is 1. if SetAttributes() is called with ReceiveFifoDepth = 0, then
>>>> SERIAL_PORT_DEFAULT_RECEIVE_FIFO_DEPTH is selected as the description of
>>>> the functions is "A ReceiveFifoDepth value of 0 will use the device's
>>>> default FIFO depth", so what's the device's default FIFO depth?
>>>
>>> Well, that's exactly what SerialDxe delegates to SerialPortLib :)
>>> SerialDxe need not be aware of the device-specific value; the platform
>>> will provide a device-specific library instance.
>>>
>>>> I have a thought that updates SerialDxe to call SerialSetAttributes(with
>>>> 0, 0, 0, DefaultParity, 0 and DefaultStopBits) in SerialDxeInitialize()
>>>> and SerialReset() to get the real default values of the device, then the
>>>> driver can also eliminate the use of PcdUartDefault####.
>>>>
>>>> What's your opinion?
>>>
>>> I don't think this is a good idea -- the UEFI spec is very clear on
>>> this. Under "11.8 Serial I/O Protocol", in the general description part,
>>> you find:
>>>
>>>      The default attributes for all UART-style serial device interfaces
>>>      are: 115,200 baud, a 1 byte receive FIFO, a 1,000,000 microsecond
>>>      timeout per character, no parity, 8 data bits, and 1 stop bit. [...]
>>>
>>> So this is what must be in effect right after initialization, and --
>>> with all likelihood -- after re-set as well.
>>>
>>> If a Serial IO protocol client is not content with these settings, then
>>> it must explicitly change them, with the SetAttributes() call.
>>
>> So TerminalDxe could know it is not content with the settings?
>
> I think so, yes. TerminalDxe knows in advance that it will handle escape
> sequences (= bursts of scan codes). The longest such sequence (3 or 4
> scan codes I guess?) should fit in the receive FIFO.
>
> So TerminalDxe could try to figure out the longest sequence it wishes to
> handle, then configure such a receive FIFO depth with SerialIO.
>
> Or else, what I think would be better, just call SetAttributes() from
> the platform's SerialPortLib instance, with ReceiveFifoDepth=0:
> - in practice, this would restore the previous behavior,
> - I expect that this value should enable the FIFO on most UARTs, with a
>   sufficient depth for the escape sequence processing
>
>> Should platform BDS code to explicitly change them with the
>> SetAttributes() call?
>
> Well, PlatformBDS is the ultimate fallback, always :), but I think
> TerminalDxe has much more business dealing with the Serial IO
> attributes. TerminalDxe already modifies the Timeout attribute, and in
> the end, the FIFO depth too is important to TerminalDxe (for escape seq
> processing). I think it's not a BDS responsibility.
>
> Consider for example
> "MdeModulePkg/Bus/Pci/PciSioSerialDxe/PciSioSerialDxe.inf". This is a
> UEFI driver (unlike SerialDxe, which is a DXE_DRIVER).
>
> If PlatformBDS wanted to control the receive FIFO depth of the SerialIo
> protocol instance procuded by PciSioSerialDxe, then it would have to
> connect PciIo instances (so SerialIo would exist), then set the
> attribute, then connect SerialIo recursively (so that TerminalDxe would
> sit on top). In other words, PlatformBds would have to intrude to the
> UEFI driver model -- a full bottom-up recursive ConnectAll would no
> longer work.
>
> Also, the user could disconnect/reconnect the SerialIo protocol provider
> in the UEFI shell; maybe even unload/reload the driver. So I think
> setting the attributes is the responsibility of the driver that sets
> directly atop.
>
> Thanks
> Laszlo
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to