From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-wm1-f45.google.com (mail-wm1-f45.google.com [209.85.128.45]) by mx.groups.io with SMTP id smtpd.web11.13141.1574780033787498925 for ; Tue, 26 Nov 2019 06:53:54 -0800 Authentication-Results: mx.groups.io; dkim=pass header.i=@linaro.org header.s=google header.b=ZyEnTOJH; spf=pass (domain: linaro.org, ip: 209.85.128.45, mailfrom: leif.lindholm@linaro.org) Received: by mail-wm1-f45.google.com with SMTP id l1so3531520wme.2 for ; Tue, 26 Nov 2019 06:53:53 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to:user-agent; bh=W2TvUSgyx0J6YoY/Xo/Wl7eH86j/CtHVQhCexU1phBM=; b=ZyEnTOJHZB2go0wfEk7qQmS3P0zI//LbL80wc0Z0MWZzfp5r65mlqXKCBQQtpSjgge DaFP2gY4csLZBGJ5h21/lj0C7lkTGtiBmWNv/3PCWr701oQXAYTHBe9qBGhYHbf+4zoY oR21tQx4jBvIKKLZJ553GFZQwRtNWt2sBbzKetQK5XUFMcbyewqeq5HzW31MI6pIlpC0 Tv8LVrwzO1f0ZTaZkqrlv5HSEcaJ0h4TlT105f3yh8QtqIrntRq0TSuQj2jvGtZFqLmK EuITOcIfLlnFGZvOHA0icJoe3EFcy4NWDDge1VaQogrD2d6yTws1Sl4DQc3EE4wOi262 vj1w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=W2TvUSgyx0J6YoY/Xo/Wl7eH86j/CtHVQhCexU1phBM=; b=GZgKgpH5veLOPsiu4HYbWeFZTS5J99+yPR3XZA8plPhTa50VBlJby/DGnEdFdjeSvH giiqNSufAynjyJKUA19ShDTpcXhHZROby23cXEotcWR5O1IIUlmWBSvkqRMDWJ8gMiEM +34TCcr6kGgMu7bgGNtbNB2bs6BSBWXqoPm8ygYNvWqaqBgYSsrY/JF0gu/tuisbjofT ncTZJW0jFodn9H8o2YbnowETQB8/bWpCA2NBw/6JQ0qz0z6gSRySWs8NExfq1kBzcZuW wcPWU9jc0S6ZibZNA4P0nnylzIqeW+cwaidvJRdFJoCKOlN8WecA8NsKdNMkHDUHDbte qzwQ== X-Gm-Message-State: APjAAAWEEu0HAZdffLyadv/XmDkB4DwUQNJMO7dVCPuQcLqpinzPNXQK GS6ktuUpCseUVKVBm66DeF8/oA== X-Google-Smtp-Source: APXvYqzn3I+fIg7lD9Yw0armkIopZ6p93/cDOBMGC07YBm+3k076YcfpJYXD0wVjdEv+rLxeW8ezHw== X-Received: by 2002:a7b:c92c:: with SMTP id h12mr4602362wml.106.1574780032265; Tue, 26 Nov 2019 06:53:52 -0800 (PST) Return-Path: Received: from bivouac.eciton.net (bivouac.eciton.net. [2a00:1098:0:86:1000:23:0:2]) by smtp.gmail.com with ESMTPSA id y6sm15376929wrr.19.2019.11.26.06.53.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 26 Nov 2019 06:53:51 -0800 (PST) Date: Tue, 26 Nov 2019 14:53:49 +0000 From: "Leif Lindholm" To: Abner Chang Cc: devel@edk2.groups.io, Michael D Kinney , Ard Biesheuvel , Gilbert Chen , Palmer Dabbelt Subject: Re: [platform/devel-riscv-v2 PATCHv5 09/18] U5SeriesPkg/SerialIoLib: Platform Serial Port library Message-ID: <20191126145349.GZ7359@bivouac.eciton.net> References: <1572228122-13265-1-git-send-email-abner.chang@hpe.com> <1572228122-13265-10-git-send-email-abner.chang@hpe.com> MIME-Version: 1.0 In-Reply-To: <1572228122-13265-10-git-send-email-abner.chang@hpe.com> User-Agent: Mutt/1.10.1 (2018-07-13) Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Mon, Oct 28, 2019 at 10:01:51 +0800, Abner Chang wrote: > Serial Port library for U5 series platform. > > Signed-off-by: Abner Chang > > Cc: Michael D Kinney > Cc: Ard Biesheuvel > Cc: Leif Lindholm > Cc: Gilbert Chen > Cc: Palmer Dabbelt > --- > .../Library/SerialIoLib/SerialIoLib.inf | 38 ++++ > .../Library/SerialIoLib/SerialPortLib.c | 253 +++++++++++++++++++++ > .../Library/SerialIoLib/U5SerialPortLib.uni | 16 ++ > 3 files changed, 307 insertions(+) > create mode 100644 Platform/SiFive/U5SeriesPkg/Library/SerialIoLib/SerialIoLib.inf > create mode 100644 Platform/SiFive/U5SeriesPkg/Library/SerialIoLib/SerialPortLib.c > create mode 100644 Platform/SiFive/U5SeriesPkg/Library/SerialIoLib/U5SerialPortLib.uni > > diff --git a/Platform/SiFive/U5SeriesPkg/Library/SerialIoLib/SerialIoLib.inf b/Platform/SiFive/U5SeriesPkg/Library/SerialIoLib/SerialIoLib.inf > new file mode 100644 > index 0000000..0044f84 > --- /dev/null > +++ b/Platform/SiFive/U5SeriesPkg/Library/SerialIoLib/SerialIoLib.inf > @@ -0,0 +1,38 @@ > +## @file > +# Library instance for SerialIo library class > +# > +# Copyright (c) 2019, Hewlett Packard Enterprise Development LP. All rights reserved.
> +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > + > +[Defines] > + INF_VERSION = 0x0001001b > + BASE_NAME = U5SerialPortLib > + MODULE_UNI_FILE = U5SerialPortLib.uni > + FILE_GUID = FCC4FD2B-2FF6-4FFA-B363-7C1111E5DCE9 > + MODULE_TYPE = BASE > + VERSION_STRING = 1.0 > + LIBRARY_CLASS = SerialPortLib > +# > +# The following information is for reference only and not required by the build tools. > +# > +# VALID_ARCHITECTURES = RISCV64 > +# > +[Packages] > + MdePkg/MdePkg.dec > + RiscVPlatformPkg/RiscVPlatformPkg.dec > + RiscVPkg/RiscVPkg.dec > + Platform/SiFive/U5SeriesPkg/U5SeriesPkg.dec > + > +[LibraryClasses] > + BaseLib > + IoLib > + RiscVOpensbiLib > + > +[FixedPcd] > + gSiFiveU5SeriesPlatformsPkgTokenSpaceGuid.PcdU5UartBase > + > +[Sources] > + SerialPortLib.c > diff --git a/Platform/SiFive/U5SeriesPkg/Library/SerialIoLib/SerialPortLib.c b/Platform/SiFive/U5SeriesPkg/Library/SerialIoLib/SerialPortLib.c > new file mode 100644 > index 0000000..5e06515 > --- /dev/null > +++ b/Platform/SiFive/U5SeriesPkg/Library/SerialIoLib/SerialPortLib.c > @@ -0,0 +1,253 @@ > +/** @file > + UART Serial Port library functions > + > + Copyright (c) 2019, Hewlett Packard Enterprise Development LP. All rights reserved.
> + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#include > +#include > +#include > +#include // Reference to header file in opensbi We need a wrapper header file for this one too (and drop the comment). (Need to wrap also the used macro names Couple of minor style issues below. > + > +//--------------------------------------------- > +// UART Register Offsets > +//--------------------------------------------- > + > +#define UART_REG_IP 5 > +#define UART_IP_RXWM 0x02 > + > +//--------------------------------------------- > +// UART Settings > +//--------------------------------------------- > + > +#define UART_BAUDRATE 115200 > +#define SYS_CLK 100000000 > + > +BOOLEAN Initiated = FALSE; > + > +/** > + Initialize the serial device hardware. > + > + If no initialization is required, then return RETURN_SUCCESS. > + If the serial device was successfuly initialized, then return RETURN_SUCCESS. > + If the serial device could not be initialized, then return RETURN_DEVICE_ERROR. > + > + @retval RETURN_SUCCESS The serial device was initialized. > + @retval RETURN_DEVICE_ERROR The serail device could not be initialized. > + > +**/ > +RETURN_STATUS > +EFIAPI > +SerialPortInitialize ( > + VOID > + ) > +{ > + if (Initiated) { > + return RETURN_SUCCESS; > + } > + if (sifive_uart_init(FixedPcdGet32(PcdU5UartBase), SYS_CLK / 2, UART_BAUDRATE) != 0) { Space before the '(', so: SiFiveUartInit ( > + return EFI_DEVICE_ERROR; > + } > + Initiated = TRUE; > + return RETURN_SUCCESS; > +} > + > +/** > + Write data from buffer to serial device. > + > + Writes NumberOfBytes data bytes from Buffer to the serial device. > + The number of bytes actually written to the serial device is returned. > + If the return value is less than NumberOfBytes, then the write operation failed. > + > + If Buffer is NULL, then ASSERT(). > + > + If NumberOfBytes is zero, then return 0. > + > + @param Buffer Pointer to the data buffer to be written. > + @param NumberOfBytes Number of bytes to written to the serial device. > + > + @retval 0 NumberOfBytes is 0. > + @retval >0 The number of bytes written to the serial device. > + If this value is less than NumberOfBytes, then the write operation failed. > + > +**/ > +UINTN > +EFIAPI > +SerialPortWrite ( > + IN UINT8 *Buffer, > + IN UINTN NumberOfBytes > + ) > +{ > + UINTN Index; > + > + if (Buffer == NULL || Initiated == FALSE) { > + return 0; > + } > + > + for(Index = 0; Index < NumberOfBytes; Index ++) { > + sifive_uart_putc (Buffer [Index]); > + } > + > + return Index; > +} > + > +/** > + Reads data from a serial device into a buffer. > + > + @param Buffer Pointer to the data buffer to store the data read from the serial device. > + @param NumberOfBytes Number of bytes to read from the serial device. > + > + @retval 0 NumberOfBytes is 0. > + @retval >0 The number of bytes read from the serial device. > + If this value is less than NumberOfBytes, then the read operation failed. > + > +**/ > +UINTN > +EFIAPI > +SerialPortRead ( > + OUT UINT8 *Buffer, > + IN UINTN NumberOfBytes > + ) > +{ > + UINTN Index; > + > + if (NULL == Buffer || Initiated == FALSE) { > + return 0; > + } > + > + for(Index = 0; Index < NumberOfBytes; Index ++) { Space before '(; > + Buffer [Index] = (UINT8)sifive_uart_getc (); > + } > + > + return Index; > +} > + > +/** > + Polls a serial device to see if there is any data waiting to be read. > + > + Polls aserial device to see if there is any data waiting to be read. > + If there is data waiting to be read from the serial device, then TRUE is returned. > + If there is no data waiting to be read from the serial device, then FALSE is returned. > + > + @retval TRUE Data is waiting to be read from the serial device. > + @retval FALSE There is no data waiting to be read from the serial device. > + > +**/ > +BOOLEAN > +EFIAPI > +SerialPortPoll ( > + VOID > + ) > +{ > + STATIC volatile UINT32 * const uart = (UINT32 *)FixedPcdGet32(PcdU5UartBase); > + UINT32 IP; > + > + if (Initiated == FALSE) { > + return FALSE; > + } > + IP = MmioRead32 ((UINTN)(uart + UART_REG_IP)); > + if(IP & UART_IP_RXWM) { > + return TRUE; > + } > + else { And else on preceding line. / Leif > + return FALSE; > + } > +} > + > +/** > + Sets the control bits on a serial device. > + > + @param Control Sets the bits of Control that are settable. > + > + @retval RETURN_SUCCESS The new control bits were set on the serial device. > + @retval RETURN_UNSUPPORTED The serial device does not support this operation. > + @retval RETURN_DEVICE_ERROR The serial device is not functioning correctly. > + > +**/ > +RETURN_STATUS > +EFIAPI > +SerialPortSetControl ( > + IN UINT32 Control > + ) > +{ > + if (Initiated == FALSE) { > + return EFI_NOT_READY; > + } > + return RETURN_SUCCESS; > +} > + > +/** > + Retrieve the status of the control bits on a serial device. > + > + @param Control A pointer to return the current control signals from the serial device. > + > + @retval RETURN_SUCCESS The control bits were read from the serial device. > + @retval RETURN_UNSUPPORTED The serial device does not support this operation. > + @retval RETURN_DEVICE_ERROR The serial device is not functioning correctly. > + > +**/ > +RETURN_STATUS > +EFIAPI > +SerialPortGetControl ( > + OUT UINT32 *Control > + ) > +{ > + if (Initiated == FALSE) { > + return EFI_NOT_READY; > + } > + *Control = 0; > + return RETURN_SUCCESS; > +} > + > +/** > + Sets the baud rate, receive FIFO depth, transmit/receice time out, parity, > + data bits, and stop bits on a serial device. > + > + @param BaudRate The requested baud rate. A BaudRate value of 0 will use the > + device's default interface speed. > + On output, the value actually set. > + @param ReveiveFifoDepth The requested depth of the FIFO on the receive side of the > + serial interface. A ReceiveFifoDepth value of 0 will use > + the device's default FIFO depth. > + On output, the value actually set. > + @param Timeout The requested time out for a single character in microseconds. > + This timeout applies to both the transmit and receive side of the > + interface. A Timeout value of 0 will use the device's default time > + out value. > + On output, the value actually set. > + @param Parity The type of parity to use on this serial device. A Parity value of > + DefaultParity will use the device's default parity value. > + On output, the value actually set. > + @param DataBits The number of data bits to use on the serial device. A DataBits > + vaule of 0 will use the device's default data bit setting. > + On output, the value actually set. > + @param StopBits The number of stop bits to use on this serial device. A StopBits > + value of DefaultStopBits will use the device's default number of > + stop bits. > + On output, the value actually set. > + > + @retval RETURN_SUCCESS The new attributes were set on the serial device. > + @retval RETURN_UNSUPPORTED The serial device does not support this operation. > + @retval RETURN_INVALID_PARAMETER One or more of the attributes has an unsupported value. > + @retval RETURN_DEVICE_ERROR The serial device is not functioning correctly. > + > +**/ > +RETURN_STATUS > +EFIAPI > +SerialPortSetAttributes ( > + IN OUT UINT64 *BaudRate, > + IN OUT UINT32 *ReceiveFifoDepth, > + IN OUT UINT32 *Timeout, > + IN OUT EFI_PARITY_TYPE *Parity, > + IN OUT UINT8 *DataBits, > + IN OUT EFI_STOP_BITS_TYPE *StopBits > + ) > +{ > + if (Initiated == FALSE) { > + return EFI_NOT_READY; > + } > + return RETURN_SUCCESS; > +} > diff --git a/Platform/SiFive/U5SeriesPkg/Library/SerialIoLib/U5SerialPortLib.uni b/Platform/SiFive/U5SeriesPkg/Library/SerialIoLib/U5SerialPortLib.uni > new file mode 100644 > index 0000000..49163bd > --- /dev/null > +++ b/Platform/SiFive/U5SeriesPkg/Library/SerialIoLib/U5SerialPortLib.uni > @@ -0,0 +1,16 @@ > +// /** @file > +// Library instance for SerialIo library class > +// > +// Library instance for SerialIO library class. > +// > +// Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.
> +// > +// SPDX-License-Identifier: BSD-2-Clause-Patent > +// > +// **/ > + > + > +#string STR_MODULE_ABSTRACT #language en-US "Library instance for SerialIO library class" > + > +#string STR_MODULE_DESCRIPTION #language en-US "Library instance for SerialIO library class." > + > -- > 2.7.4 >