From nobody Mon Feb 9 02:27:45 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of groups.io designates 66.175.222.12 as permitted sender) client-ip=66.175.222.12; envelope-from=bounce+27952+49525+1787277+3901457@groups.io; helo=web01.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zoho.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+49525+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=hpe.com ARC-Seal: i=1; a=rsa-sha256; t=1572238371; cv=none; d=zoho.com; s=zohoarc; b=UvGWMjSlwgN/Ov9q2hmw4HsLJvVL/3fAITHuJga5CnUh7SoH3xb2/E+CS/T131NXcYA3bSavMRnA6QocXQFeYs/jJbisx7csYv6Sn5HPep7FAq5kbOetCvsN8qYwhQ/t7GlmBMBqeJMxvvYBa7RLSJWJuIqxqwthn7ae4XwtZ7o= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1572238371; h=Cc:Date:From:In-Reply-To:List-Id:List-Unsubscribe:Message-ID:Reply-To:References:Sender:Subject:To; bh=bk3lBfyQ5NhbMEuyXAKhPKYOPWrmrCHkb/QRom2rZ10=; b=mVf6uZncSsFp8e6JFI3pGKcU9hUIqftEhKKlcqjRFd7yR5brEOf45AqHaAU4tOGhYEnfgMJxqnszyhvA2ZE0BfWocuRkPjwzBKC6MYtfOIUqDDQeGoym+PZZZF0Fs+ommbVO6jny9B+JCY8tfFxvKVlONeFpYW0YCl6hr5ypqk8= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=pass; spf=pass (zoho.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+49525+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) header.from= Received: from web01.groups.io (web01.groups.io [66.175.222.12]) by mx.zohomail.com with SMTPS id 1572238371434425.20033017951425; Sun, 27 Oct 2019 21:52:51 -0700 (PDT) Return-Path: X-Received: by 127.0.0.2 with SMTP id zy7BYY1788612xR6G2KdfS7h; Sun, 27 Oct 2019 21:52:50 -0700 X-Received: from mx0a-002e3701.pphosted.com (mx0a-002e3701.pphosted.com [148.163.147.86]) by mx.groups.io with SMTP id smtpd.web12.2368.1572238370066319466 for ; Sun, 27 Oct 2019 21:52:50 -0700 X-Received: from pps.filterd (m0150242.ppops.net [127.0.0.1]) by mx0a-002e3701.pphosted.com (8.16.0.42/8.16.0.42) with SMTP id x9S4psFa023866; Mon, 28 Oct 2019 04:52:49 GMT X-Received: from g4t3425.houston.hpe.com (g4t3425.houston.hpe.com [15.241.140.78]) by mx0a-002e3701.pphosted.com with ESMTP id 2vw02t5a01-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 28 Oct 2019 04:52:49 +0000 X-Received: from g9t2301.houston.hpecorp.net (g9t2301.houston.hpecorp.net [16.220.97.129]) by g4t3425.houston.hpe.com (Postfix) with ESMTP id 00D2AAF; Mon, 28 Oct 2019 04:52:48 +0000 (UTC) X-Received: from UB16Abner.asiapacific.hpqcorp.net (ub16abner.asiapacific.hpqcorp.net [15.119.209.229]) by g9t2301.houston.hpecorp.net (Postfix) with ESMTP id E86F74A; Mon, 28 Oct 2019 04:52:46 +0000 (UTC) From: "Abner Chang" To: devel@edk2.groups.io Cc: abner.chang@hpe.com, Michael D Kinney , Ard Biesheuvel , Leif Lindholm , Gilbert Chen , Palmer Dabbelt Subject: [edk2-devel] [platform/devel-riscv-v2 PATCHv5 09/18] U5SeriesPkg/SerialIoLib: Platform Serial Port library Date: Mon, 28 Oct 2019 12:20:24 +0800 Message-Id: <1572236433-15404-10-git-send-email-abner.chang@hpe.com> In-Reply-To: <1572236433-15404-1-git-send-email-abner.chang@hpe.com> References: <1572236433-15404-1-git-send-email-abner.chang@hpe.com> X-HPE-SCL: -1 Precedence: Bulk List-Unsubscribe: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,abner.chang@hpe.com X-Gm-Message-State: s0OJklxzWyaFtyvAkk8kopjKx1787277AA= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1572238370; bh=lRWT6TKxVTeewafBHcEso/hlURUnFyWj0MoIEALFvJY=; h=Cc:Date:From:Reply-To:Subject:To; b=C4y0N6VY6XkaRpmEd0QNnO5/eRxl2Y+iIVh6LI2lnMxj4XRIgmX6nVDmSwHm+yzn7+z DIoe6bdEnpbdLBuyjVoF8tOes4Gjg56/dxBJSyxSlzeV9a9flLOIHz2Gp05zr+D2GTQrP YMjMI5BZQHaDP3QBJZCuhQ3Q/3kFBVkSeKo= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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 Signed-off-by: Abner Chang --- .../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/SerialI= oLib.inf create mode 100644 Platform/SiFive/U5SeriesPkg/Library/SerialIoLib/SerialP= ortLib.c create mode 100644 Platform/SiFive/U5SeriesPkg/Library/SerialIoLib/U5Seria= lPortLib.uni diff --git a/Platform/SiFive/U5SeriesPkg/Library/SerialIoLib/SerialIoLib.in= f 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 righ= ts reserved.
+# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION =3D 0x0001001b + BASE_NAME =3D U5SerialPortLib + MODULE_UNI_FILE =3D U5SerialPortLib.uni + FILE_GUID =3D FCC4FD2B-2FF6-4FFA-B363-7C1111E5DCE9 + MODULE_TYPE =3D BASE + VERSION_STRING =3D 1.0 + LIBRARY_CLASS =3D SerialPortLib +# +# The following information is for reference only and not required by the = build tools. +# +# VALID_ARCHITECTURES =3D 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 right= s reserved.
+ + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include +#include +#include +#include // Reference to header f= ile in opensbi + +//--------------------------------------------- +// 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 =3D 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_SUC= CESS. + 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_BAU= DRATE) !=3D 0) { + return EFI_DEVICE_ERROR; + } + Initiated =3D 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 devic= e. + 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 =3D=3D NULL || Initiated =3D=3D FALSE) { + return 0; + } + + for(Index =3D 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 re= ad 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 =3D=3D Buffer || Initiated =3D=3D FALSE) { + return 0; + } + + for(Index =3D 0; Index < NumberOfBytes; Index ++) { + Buffer [Index] =3D (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 FALS= E is returned. + + @retval TRUE Data is waiting to be read from the serial devi= ce. + @retval FALSE There is no data waiting to be read from the se= rial device. + +**/ +BOOLEAN +EFIAPI +SerialPortPoll ( + VOID + ) +{ + STATIC volatile UINT32 * const uart =3D (UINT32 *)FixedPcdGet32(PcdU5Uar= tBase); + UINT32 IP; + + if (Initiated =3D=3D FALSE) { + return FALSE; + } + IP =3D MmioRead32 ((UINTN)(uart + UART_REG_IP)); + if(IP & UART_IP_RXWM) { + return TRUE; + } + else { + 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 seria= l device. + @retval RETURN_UNSUPPORTED The serial device does not support this op= eration. + @retval RETURN_DEVICE_ERROR The serial device is not functioning corre= ctly. + +**/ +RETURN_STATUS +EFIAPI +SerialPortSetControl ( + IN UINT32 Control + ) +{ + if (Initiated =3D=3D 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 si= gnals 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 op= eration. + @retval RETURN_DEVICE_ERROR The serial device is not functioning corre= ctly. + +**/ +RETURN_STATUS +EFIAPI +SerialPortGetControl ( + OUT UINT32 *Control + ) +{ + if (Initiated =3D=3D FALSE) { + return EFI_NOT_READY; + } + *Control =3D 0; + return RETURN_SUCCESS; +} + +/** + Sets the baud rate, receive FIFO depth, transmit/receice time out, parit= y, + 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 d= evice's default time + out value. + On output, the value actually set. + @param Parity The type of parity to use on this serial devic= e. A Parity value of + DefaultParity will use the device's default pa= rity value. + On output, the value actually set. + @param DataBits The number of data bits to use on the serial d= evice. 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 ser= ial device. + @retval RETURN_UNSUPPORTED The serial device does not support thi= s operation. + @retval RETURN_INVALID_PARAMETER One or more of the attributes has an u= nsupported value. + @retval RETURN_DEVICE_ERROR The serial device is not functioning c= orrectly. + +**/ +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 =3D=3D FALSE) { + return EFI_NOT_READY; + } + return RETURN_SUCCESS; +} diff --git a/Platform/SiFive/U5SeriesPkg/Library/SerialIoLib/U5SerialPortLi= b.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." + --=20 2.7.4 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#49525): https://edk2.groups.io/g/devel/message/49525 Mute This Topic: https://groups.io/mt/38832096/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-