]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Bus/Pci/PciSioSerialDxe/Serial.c
MdeModulePkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / MdeModulePkg / Bus / Pci / PciSioSerialDxe / Serial.c
index e8cefecd8d2d810dc740565ef1d659d4f53d5291..82db93a8b117845b40ac5294ea013add82bc350f 100644 (file)
@@ -1,14 +1,8 @@
 /** @file\r
   Serial driver for PCI or SIO UARTS.\r
 \r
-Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.<BR>\r
-This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution.  The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
@@ -94,7 +88,7 @@ SERIAL_DEV  gSerialDevTemplate = {
   Check the device path node whether it's the Flow Control node or not.\r
 \r
   @param[in] FlowControl    The device path node to be checked.\r
-  \r
+\r
   @retval TRUE              It's the Flow Control node.\r
   @retval FALSE             It's not.\r
 \r
@@ -114,9 +108,9 @@ IsUartFlowControlDevicePathNode (
 /**\r
   The user Entry Point for module PciSioSerial. The user code starts with this function.\r
 \r
-  @param[in] ImageHandle    The firmware allocated handle for the EFI image.  \r
+  @param[in] ImageHandle    The firmware allocated handle for the EFI image.\r
   @param[in] SystemTable    A pointer to the EFI System Table.\r
-  \r
+\r
   @retval EFI_SUCCESS       The entry point is executed successfully.\r
   @retval other             Some error occurs when executing this entry point.\r
 \r
@@ -396,7 +390,7 @@ SerialControllerDriverSupported (
   if (EFI_ERROR (Status)) {\r
     Status = IsPciSerialController (Controller);\r
   }\r
-  return Status;  \r
+  return Status;\r
 }\r
 \r
 /**\r
@@ -473,7 +467,7 @@ CreateSerialDevice (
   // For PCI serial device, use the information from PCD\r
   //\r
   if (PciSerialParameter != NULL) {\r
-    BarIndex = (PciSerialParameter->BarIndex == PCI_BAR_ALL) ? 0 : PciSerialParameter->BarIndex;\r
+    BarIndex = (PciSerialParameter->BarIndex == MAX_UINT8) ? 0 : PciSerialParameter->BarIndex;\r
     Offset = PciSerialParameter->Offset;\r
     if (PciSerialParameter->RegisterStride != 0) {\r
       SerialDevice->RegisterStride = PciSerialParameter->RegisterStride;\r
@@ -863,65 +857,73 @@ SerialControllerDriverStart (
   ControllerNumber = 0;\r
   ContainsControllerNode = FALSE;\r
   SerialDevices = GetChildSerialDevices (Controller, IoProtocolGuid, &SerialDeviceCount);\r
-  //\r
-  // If the SerialIo instance specified by RemainingDevicePath is already created,\r
-  // update the attributes/control.\r
-  //\r
-  if ((SerialDeviceCount != 0) && (RemainingDevicePath != NULL)) {\r
-    Uart = (UART_DEVICE_PATH *) SkipControllerDevicePathNode (RemainingDevicePath, &ContainsControllerNode, &ControllerNumber);\r
-    for (Index = 0; Index < SerialDeviceCount; Index++) {\r
-      ASSERT ((SerialDevices != NULL) && (SerialDevices[Index] != NULL));\r
-      if ((!SerialDevices[Index]->ContainsControllerNode && !ContainsControllerNode) ||\r
-          (SerialDevices[Index]->ContainsControllerNode && ContainsControllerNode && SerialDevices[Index]->Instance == ControllerNumber)\r
-          ) {\r
-        SerialIo = &SerialDevices[Index]->SerialIo;\r
-        Status = EFI_INVALID_PARAMETER;\r
-        //\r
-        // Pass NULL ActualBaudRate to VerifyUartParameters to disallow baudrate degrade.\r
-        // DriverBindingStart() shouldn't create a handle with different UART device path.\r
-        //\r
-        if (VerifyUartParameters (SerialDevices[Index]->ClockRate, Uart->BaudRate, Uart->DataBits,\r
-                                  (EFI_PARITY_TYPE) Uart->Parity, (EFI_STOP_BITS_TYPE) Uart->StopBits, NULL, NULL)) {\r
-          Status = SerialIo->SetAttributes (\r
-                               SerialIo,\r
-                               Uart->BaudRate,\r
-                               SerialIo->Mode->ReceiveFifoDepth,\r
-                               SerialIo->Mode->Timeout,\r
-                               (EFI_PARITY_TYPE) Uart->Parity,\r
-                               Uart->DataBits,\r
-                               (EFI_STOP_BITS_TYPE) Uart->StopBits\r
-                               );\r
-        }\r
-        FlowControl = (UART_FLOW_CONTROL_DEVICE_PATH *) NextDevicePathNode (Uart);\r
-        if (!EFI_ERROR (Status) && IsUartFlowControlDevicePathNode (FlowControl)) {\r
-          Status = SerialIo->GetControl (SerialIo, &Control);\r
-          if (!EFI_ERROR (Status)) {\r
-            if (ReadUnaligned32 (&FlowControl->FlowControlMap) == UART_FLOW_CONTROL_HARDWARE) {\r
-              Control |= EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE;\r
-            } else {\r
-              Control &= ~EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE;\r
+\r
+  if (SerialDeviceCount != 0) {\r
+    if (RemainingDevicePath == NULL) {\r
+      //\r
+      // If the SerialIo instance is already created, NULL as RemainingDevicePath is treated\r
+      // as to create the same SerialIo instance.\r
+      //\r
+      return EFI_SUCCESS;\r
+    } else {\r
+      //\r
+      // Update the attributes/control of the SerialIo instance specified by RemainingDevicePath.\r
+      //\r
+      Uart = (UART_DEVICE_PATH *) SkipControllerDevicePathNode (RemainingDevicePath, &ContainsControllerNode, &ControllerNumber);\r
+      for (Index = 0; Index < SerialDeviceCount; Index++) {\r
+        ASSERT ((SerialDevices != NULL) && (SerialDevices[Index] != NULL));\r
+        if ((!SerialDevices[Index]->ContainsControllerNode && !ContainsControllerNode) ||\r
+            (SerialDevices[Index]->ContainsControllerNode && ContainsControllerNode && SerialDevices[Index]->Instance == ControllerNumber)\r
+            ) {\r
+          SerialIo = &SerialDevices[Index]->SerialIo;\r
+          Status = EFI_INVALID_PARAMETER;\r
+          //\r
+          // Pass NULL ActualBaudRate to VerifyUartParameters to disallow baudrate degrade.\r
+          // DriverBindingStart() shouldn't create a handle with different UART device path.\r
+          //\r
+          if (VerifyUartParameters (SerialDevices[Index]->ClockRate, Uart->BaudRate, Uart->DataBits,\r
+                                    (EFI_PARITY_TYPE) Uart->Parity, (EFI_STOP_BITS_TYPE) Uart->StopBits, NULL, NULL)) {\r
+            Status = SerialIo->SetAttributes (\r
+                                 SerialIo,\r
+                                 Uart->BaudRate,\r
+                                 SerialIo->Mode->ReceiveFifoDepth,\r
+                                 SerialIo->Mode->Timeout,\r
+                                 (EFI_PARITY_TYPE) Uart->Parity,\r
+                                 Uart->DataBits,\r
+                                 (EFI_STOP_BITS_TYPE) Uart->StopBits\r
+                                 );\r
+          }\r
+          FlowControl = (UART_FLOW_CONTROL_DEVICE_PATH *) NextDevicePathNode (Uart);\r
+          if (!EFI_ERROR (Status) && IsUartFlowControlDevicePathNode (FlowControl)) {\r
+            Status = SerialIo->GetControl (SerialIo, &Control);\r
+            if (!EFI_ERROR (Status)) {\r
+              if (ReadUnaligned32 (&FlowControl->FlowControlMap) == UART_FLOW_CONTROL_HARDWARE) {\r
+                Control |= EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE;\r
+              } else {\r
+                Control &= ~EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE;\r
+              }\r
+              //\r
+              // Clear the bits that are not allowed to pass to SetControl\r
+              //\r
+              Control &= (EFI_SERIAL_REQUEST_TO_SEND | EFI_SERIAL_DATA_TERMINAL_READY |\r
+                          EFI_SERIAL_HARDWARE_LOOPBACK_ENABLE | EFI_SERIAL_SOFTWARE_LOOPBACK_ENABLE |\r
+                          EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE);\r
+              Status = SerialIo->SetControl (SerialIo, Control);\r
             }\r
-            //\r
-            // Clear the bits that are not allowed to pass to SetControl\r
-            //\r
-            Control &= (EFI_SERIAL_REQUEST_TO_SEND | EFI_SERIAL_DATA_TERMINAL_READY |\r
-                        EFI_SERIAL_HARDWARE_LOOPBACK_ENABLE | EFI_SERIAL_SOFTWARE_LOOPBACK_ENABLE |\r
-                        EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE);\r
-            Status = SerialIo->SetControl (SerialIo, Control);\r
           }\r
+          break;\r
         }\r
-        break;\r
       }\r
-    }\r
-    if (Index != SerialDeviceCount) {\r
-      //\r
-      // Directly return if the SerialIo instance specified by RemainingDevicePath is found and updated.\r
-      // Otherwise continue to create the instance specified by RemainingDevicePath.\r
-      //\r
-      if (SerialDevices != NULL) {\r
-        FreePool (SerialDevices);\r
+      if (Index != SerialDeviceCount) {\r
+        //\r
+        // Directly return if the SerialIo instance specified by RemainingDevicePath is found and updated.\r
+        // Otherwise continue to create the instance specified by RemainingDevicePath.\r
+        //\r
+        if (SerialDevices != NULL) {\r
+          FreePool (SerialDevices);\r
+        }\r
+        return Status;\r
       }\r
-      return Status;\r
     }\r
   }\r
 \r
@@ -982,7 +984,7 @@ SerialControllerDriverStart (
             &Supports\r
             );\r
           if (!EFI_ERROR (Status)) {\r
-            Supports &= EFI_PCI_IO_ATTRIBUTE_IO | EFI_PCI_IO_ATTRIBUTE_MEMORY;\r
+            Supports &= (UINT64)(EFI_PCI_IO_ATTRIBUTE_IO | EFI_PCI_IO_ATTRIBUTE_MEMORY);\r
             Status = ParentIo.PciIo->Attributes (\r
               ParentIo.PciIo,\r
               EfiPciIoAttributeOperationEnable,\r