X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=MdeModulePkg%2FUniversal%2FDebugPortDxe%2FDebugPort.c;h=a63ef84a3040be8cf60024613b0d26cc177674f0;hb=cfcbb8bc5428cf3d86107913be4e33ee323d13c9;hp=e3e47302a3086df2d1e336a2fe55e179d991854a;hpb=8a7d75b0625cffee0c67b85afe56763f93d86481;p=mirror_edk2.git diff --git a/MdeModulePkg/Universal/DebugPortDxe/DebugPort.c b/MdeModulePkg/Universal/DebugPortDxe/DebugPort.c index e3e47302a3..a63ef84a30 100644 --- a/MdeModulePkg/Universal/DebugPortDxe/DebugPort.c +++ b/MdeModulePkg/Universal/DebugPortDxe/DebugPort.c @@ -1,55 +1,66 @@ -/*++ +/** @file + Top level C file for debugport driver. Contains initialization function. + This driver layers on top of SerialIo. + ALL CODE IN THE SERIALIO STACK MUST BE RE-ENTRANT AND CALLABLE FROM + INTERRUPT CONTEXT -Copyright (c) 2006, Intel Corporation -All rights reserved. This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +Copyright (c) 2006 - 2008, Intel Corporation.
+All rights reserved. This program and the accompanying materials +are licensed and made available under the terms and conditions of the BSD License +which accompanies this distribution. The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php -Module Name: - - DebugPort.c - -Abstract: - - Top level C file for debugport driver. Contains initialization function. - This driver layers on top of SerialIo. - - ALL CODE IN THE SERIALIO STACK MUST BE RE-ENTRANT AND CALLABLE FROM - INTERRUPT CONTEXT. - -Revision History - ---*/ +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +**/ #include "DebugPort.h" // -// Misc. functions local to this module.. +// Globals // -STATIC -VOID -GetDebugPortVariable ( - DEBUGPORT_DEVICE *DebugPortDevice - ) -/*++ +EFI_DRIVER_BINDING_PROTOCOL gDebugPortDriverBinding = { + DebugPortSupported, + DebugPortStart, + DebugPortStop, + DEBUGPORT_DRIVER_VERSION, + NULL, + NULL +}; -Routine Description: - Local worker function to obtain device path information from DebugPort variable. - Records requested settings in DebugPort device structure. - -Arguments: - DEBUGPORT_DEVICE *DebugPortDevice, +DEBUGPORT_DEVICE mDebugPortDevice = { + DEBUGPORT_DEVICE_SIGNATURE, + (EFI_HANDLE) 0, + (EFI_HANDLE) 0, + (VOID *) NULL, + (EFI_DEVICE_PATH_PROTOCOL *) NULL, + { + DebugPortReset, + DebugPortRead, + DebugPortWrite, + DebugPortPoll + }, + (EFI_HANDLE) 0, + (EFI_SERIAL_IO_PROTOCOL *) NULL, + DEBUGPORT_UART_DEFAULT_BAUDRATE, + DEBUGPORT_UART_DEFAULT_FIFO_DEPTH, + DEBUGPORT_UART_DEFAULT_TIMEOUT, + (EFI_PARITY_TYPE) DEBUGPORT_UART_DEFAULT_PARITY, + DEBUGPORT_UART_DEFAULT_DATA_BITS, + (EFI_STOP_BITS_TYPE) DEBUGPORT_UART_DEFAULT_STOP_BITS +}; -Returns: +/** + Local worker function to obtain device path information from DebugPort variable. - Nothing + Records requested settings in DebugPort device structure. ---*/ +**/ +VOID +GetDebugPortVariable ( + VOID + ) { UINTN DataSize; EFI_DEVICE_PATH_PROTOCOL *DevicePath; @@ -62,51 +73,51 @@ Returns: &gEfiDebugPortVariableGuid, NULL, &DataSize, - DebugPortDevice->DebugPortVariable + mDebugPortDevice.DebugPortVariable ); if (Status == EFI_BUFFER_TOO_SMALL) { - if (gDebugPortDevice->DebugPortVariable != NULL) { - FreePool (gDebugPortDevice->DebugPortVariable); + if (mDebugPortDevice.DebugPortVariable != NULL) { + FreePool (mDebugPortDevice.DebugPortVariable); } - DebugPortDevice->DebugPortVariable = AllocatePool (DataSize); - if (DebugPortDevice->DebugPortVariable != NULL) { + mDebugPortDevice.DebugPortVariable = AllocatePool (DataSize); + if (mDebugPortDevice.DebugPortVariable != NULL) { gRT->GetVariable ( (CHAR16 *) EFI_DEBUGPORT_VARIABLE_NAME, &gEfiDebugPortVariableGuid, NULL, &DataSize, - DebugPortDevice->DebugPortVariable + mDebugPortDevice.DebugPortVariable ); - DevicePath = (EFI_DEVICE_PATH_PROTOCOL *) DebugPortDevice->DebugPortVariable; - while (!EfiIsDevicePathEnd (DevicePath) && !EfiIsUartDevicePath (DevicePath)) { - DevicePath = EfiNextDevicePathNode (DevicePath); + DevicePath = (EFI_DEVICE_PATH_PROTOCOL *) mDebugPortDevice.DebugPortVariable; + while (!IsDevicePathEnd (DevicePath) && !IS_UART_DEVICEPATH (DevicePath)) { + DevicePath = NextDevicePathNode (DevicePath); } - if (EfiIsDevicePathEnd (DevicePath)) { - FreePool (gDebugPortDevice->DebugPortVariable); - DebugPortDevice->DebugPortVariable = NULL; + if (IsDevicePathEnd (DevicePath)) { + FreePool (mDebugPortDevice.DebugPortVariable); + mDebugPortDevice.DebugPortVariable = NULL; } else { CopyMem ( - &DebugPortDevice->BaudRate, + &mDebugPortDevice.BaudRate, &((UART_DEVICE_PATH *) DevicePath)->BaudRate, sizeof (((UART_DEVICE_PATH *) DevicePath)->BaudRate) ); - DebugPortDevice->ReceiveFifoDepth = DEBUGPORT_UART_DEFAULT_FIFO_DEPTH; - DebugPortDevice->Timeout = DEBUGPORT_UART_DEFAULT_TIMEOUT; + mDebugPortDevice.ReceiveFifoDepth = DEBUGPORT_UART_DEFAULT_FIFO_DEPTH; + mDebugPortDevice.Timeout = DEBUGPORT_UART_DEFAULT_TIMEOUT; CopyMem ( - &DebugPortDevice->Parity, + &mDebugPortDevice.Parity, &((UART_DEVICE_PATH *) DevicePath)->Parity, sizeof (((UART_DEVICE_PATH *) DevicePath)->Parity) ); CopyMem ( - &DebugPortDevice->DataBits, + &mDebugPortDevice.DataBits, &((UART_DEVICE_PATH *) DevicePath)->DataBits, sizeof (((UART_DEVICE_PATH *) DevicePath)->DataBits) ); CopyMem ( - &DebugPortDevice->StopBits, + &mDebugPortDevice.StopBits, &((UART_DEVICE_PATH *) DevicePath)->StopBits, sizeof (((UART_DEVICE_PATH *) DevicePath)->StopBits) ); @@ -115,50 +126,27 @@ Returns: } } -// -// Globals -// +/** + Debug Port Driver entry point. -EFI_DRIVER_BINDING_PROTOCOL gDebugPortDriverBinding = { - DebugPortSupported, - DebugPortStart, - DebugPortStop, - DEBUGPORT_DRIVER_VERSION, - NULL, - NULL -}; + Reads DebugPort variable to determine what device and settings to use as the + debug port. Binds exclusively to SerialIo. Reverts to defaults if no variable + is found. -DEBUGPORT_DEVICE *gDebugPortDevice; + @param[in] ImageHandle The firmware allocated handle for the EFI image. + @param[in] SystemTable A pointer to the EFI System Table. -// -// implementation code -// + @retval EFI_SUCCESS The entry point is executed successfully. + @retval EFI_OUT_OF_RESOURCES Fails to allocate memory for device. + @retval other Some error occurs when executing this entry point. +**/ EFI_STATUS EFIAPI InitializeDebugPortDriver ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ) -/*++ - -Routine Description: - Driver entry point. Reads DebugPort variable to determine what device and settings - to use as the debug port. Binds exclusively to SerialIo. Reverts to defaults \ - if no variable is found. - - Creates debugport and devicepath protocols on new handle. - -Arguments: - ImageHandle, - SystemTable - -Returns: - - EFI_UNSUPPORTED - EFI_OUT_OF_RESOURCES - ---*/ { EFI_STATUS Status; @@ -174,68 +162,38 @@ Returns: &gDebugPortComponentName2 ); ASSERT_EFI_ERROR (Status); - // - // Allocate and Initialize dev structure - // - gDebugPortDevice = AllocateZeroPool (sizeof (DEBUGPORT_DEVICE)); - if (gDebugPortDevice == NULL) { - return EFI_OUT_OF_RESOURCES; - } - // - // Fill in static and default pieces of device structure first. - // - gDebugPortDevice->Signature = DEBUGPORT_DEVICE_SIGNATURE; - - gDebugPortDevice->DebugPortInterface.Reset = DebugPortReset; - gDebugPortDevice->DebugPortInterface.Read = DebugPortRead; - gDebugPortDevice->DebugPortInterface.Write = DebugPortWrite; - gDebugPortDevice->DebugPortInterface.Poll = DebugPortPoll; - - gDebugPortDevice->BaudRate = DEBUGPORT_UART_DEFAULT_BAUDRATE; - gDebugPortDevice->ReceiveFifoDepth = DEBUGPORT_UART_DEFAULT_FIFO_DEPTH; - gDebugPortDevice->Timeout = DEBUGPORT_UART_DEFAULT_TIMEOUT; - gDebugPortDevice->Parity = (EFI_PARITY_TYPE) DEBUGPORT_UART_DEFAULT_PARITY; - gDebugPortDevice->DataBits = DEBUGPORT_UART_DEFAULT_DATA_BITS; - gDebugPortDevice->StopBits = (EFI_STOP_BITS_TYPE) DEBUGPORT_UART_DEFAULT_STOP_BITS; return EFI_SUCCESS; } -// -// DebugPort driver binding member functions... -// -EFI_STATUS -EFIAPI -DebugPortSupported ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE ControllerHandle, - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath - ) -/*++ -Routine Description: - Checks to see that there's not already a DebugPort interface somewhere. If so, - fail. - +/** + Checks to see if there's not already a DebugPort interface somewhere. + If there's a DEBUGPORT variable, the device path must match exactly. If there's no DEBUGPORT variable, then device path is not checked and does not matter. - Checks to see that there's a serial io interface on the controller handle that can be bound BY_DRIVER | EXCLUSIVE. - If all these tests succeed, then we return EFI_SUCCESS, else, EFI_UNSUPPORTED or other error returned by OpenProtocol. -Arguments: - This - ControllerHandle - RemainingDevicePath - -Returns: - EFI_UNSUPPORTED - EFI_OUT_OF_RESOURCES - EFI_SUCCESS - ---*/ + @param This Protocol instance pointer. + @param ControllerHandle Handle of device to test. + @param RemainingDevicePath Optional parameter use to pick a specific child + device to start. + + @retval EFI_SUCCESS This driver supports this device. + @retval EFI_UNSUPPORTED Debug Port device is not supported. + @retval EFI_OUT_OF_RESOURCES Fails to allocate memory for device. + @retval others Some error occurs. + +**/ +EFI_STATUS +EFIAPI +DebugPortSupported ( + IN EFI_DRIVER_BINDING_PROTOCOL *This, + IN EFI_HANDLE ControllerHandle, + IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath + ) { EFI_STATUS Status; EFI_DEVICE_PATH_PROTOCOL *Dp1; @@ -245,7 +203,8 @@ Returns: EFI_HANDLE TempHandle; // - // Check to see that there's not a debugport protocol already published + // Check to see that there's not a debugport protocol already published, + // since only one standard UART serial port could be supported by this driver. // if (gBS->LocateProtocol (&gEfiDebugPortProtocolGuid, NULL, (VOID **) &DebugPortInterface) != EFI_NOT_FOUND) { return EFI_UNSUPPORTED; @@ -253,16 +212,16 @@ Returns: // // Read DebugPort variable to determine debug port selection and parameters // - GetDebugPortVariable (gDebugPortDevice); + GetDebugPortVariable (); - if (gDebugPortDevice->DebugPortVariable != NULL) { + if (mDebugPortDevice.DebugPortVariable != NULL) { // // There's a DEBUGPORT variable, so do LocateDevicePath and check to see if // the closest matching handle matches the controller handle, and if it does, // check to see that the remaining device path has the DebugPort GUIDed messaging // device path only. Otherwise, it's a mismatch and EFI_UNSUPPORTED is returned. // - Dp1 = DuplicateDevicePath ((EFI_DEVICE_PATH_PROTOCOL *) gDebugPortDevice->DebugPortVariable); + Dp1 = DuplicateDevicePath ((EFI_DEVICE_PATH_PROTOCOL *) mDebugPortDevice.DebugPortVariable); if (Dp1 == NULL) { return EFI_OUT_OF_RESOURCES; } @@ -279,11 +238,15 @@ Returns: Status = EFI_UNSUPPORTED; } - if (Status == EFI_SUCCESS && (Dp2->Type != 3 || Dp2->SubType != 10 || *((UINT16 *) Dp2->Length) != 20)) { + if (Status == EFI_SUCCESS && + (Dp2->Type != MESSAGING_DEVICE_PATH || + Dp2->SubType != MSG_VENDOR_DP || + *((UINT16 *) Dp2->Length) != sizeof (DEBUGPORT_DEVICE_PATH))) { + Status = EFI_UNSUPPORTED; } - if (Status == EFI_SUCCESS && CompareMem (&gEfiDebugPortDevicePathGuid, Dp2 + 1, sizeof (EFI_GUID))) { + if (Status == EFI_SUCCESS && !CompareGuid (&gEfiDebugPortDevicePathGuid, (GUID *) (Dp2 + 1))) { Status = EFI_UNSUPPORTED; } @@ -315,6 +278,20 @@ Returns: return EFI_SUCCESS; } +/** + Binds exclusively to serial io on the controller handle, Produces DebugPort + protocol and DevicePath on new handle. + + @param This Protocol instance pointer. + @param ControllerHandle Handle of device to bind driver to. + @param RemainingDevicePath Optional parameter use to pick a specific child + device to start. + + @retval EFI_SUCCESS This driver is added to ControllerHandle. + @retval EFI_OUT_OF_RESOURCES Fails to allocate memory for device. + @retval others Some error occurs. + +**/ EFI_STATUS EFIAPI DebugPortStart ( @@ -322,21 +299,6 @@ DebugPortStart ( IN EFI_HANDLE ControllerHandle, IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath ) -/*++ - -Routine Description: - Binds exclusively to serial io on the controller handle. Produces DebugPort - protocol and DevicePath on new handle. - -Arguments: - This - ControllerHandle - RemainingDevicePath - -Returns: - EFI_OUT_OF_RESOURCES - EFI_SUCCESS ---*/ { EFI_STATUS Status; DEBUGPORT_DEVICE_PATH DebugPortDP; @@ -346,7 +308,7 @@ Returns: Status = gBS->OpenProtocol ( ControllerHandle, &gEfiSerialIoProtocolGuid, - (VOID **) &gDebugPortDevice->SerialIoBinding, + (VOID **) &mDebugPortDevice.SerialIoBinding, This->DriverBindingHandle, ControllerHandle, EFI_OPEN_PROTOCOL_BY_DRIVER | EFI_OPEN_PROTOCOL_EXCLUSIVE @@ -355,34 +317,34 @@ Returns: return Status; } - gDebugPortDevice->SerialIoDeviceHandle = ControllerHandle; + mDebugPortDevice.SerialIoDeviceHandle = ControllerHandle; // // Initialize the Serial Io interface... // - Status = gDebugPortDevice->SerialIoBinding->SetAttributes ( - gDebugPortDevice->SerialIoBinding, - gDebugPortDevice->BaudRate, - gDebugPortDevice->ReceiveFifoDepth, - gDebugPortDevice->Timeout, - gDebugPortDevice->Parity, - gDebugPortDevice->DataBits, - gDebugPortDevice->StopBits + Status = mDebugPortDevice.SerialIoBinding->SetAttributes ( + mDebugPortDevice.SerialIoBinding, + mDebugPortDevice.BaudRate, + mDebugPortDevice.ReceiveFifoDepth, + mDebugPortDevice.Timeout, + mDebugPortDevice.Parity, + mDebugPortDevice.DataBits, + mDebugPortDevice.StopBits ); if (EFI_ERROR (Status)) { - gDebugPortDevice->BaudRate = 0; - gDebugPortDevice->Parity = DefaultParity; - gDebugPortDevice->DataBits = 0; - gDebugPortDevice->StopBits = DefaultStopBits; - gDebugPortDevice->ReceiveFifoDepth = 0; - Status = gDebugPortDevice->SerialIoBinding->SetAttributes ( - gDebugPortDevice->SerialIoBinding, - gDebugPortDevice->BaudRate, - gDebugPortDevice->ReceiveFifoDepth, - gDebugPortDevice->Timeout, - gDebugPortDevice->Parity, - gDebugPortDevice->DataBits, - gDebugPortDevice->StopBits + mDebugPortDevice.BaudRate = 0; + mDebugPortDevice.Parity = DefaultParity; + mDebugPortDevice.DataBits = 0; + mDebugPortDevice.StopBits = DefaultStopBits; + mDebugPortDevice.ReceiveFifoDepth = 0; + Status = mDebugPortDevice.SerialIoBinding->SetAttributes ( + mDebugPortDevice.SerialIoBinding, + mDebugPortDevice.BaudRate, + mDebugPortDevice.ReceiveFifoDepth, + mDebugPortDevice.Timeout, + mDebugPortDevice.Parity, + mDebugPortDevice.DataBits, + mDebugPortDevice.StopBits ); if (EFI_ERROR (Status)) { gBS->CloseProtocol ( @@ -395,7 +357,7 @@ Returns: } } - gDebugPortDevice->SerialIoBinding->Reset (gDebugPortDevice->SerialIoBinding); + mDebugPortDevice.SerialIoBinding->Reset (mDebugPortDevice.SerialIoBinding); // // Create device path instance for DebugPort @@ -403,7 +365,7 @@ Returns: DebugPortDP.Header.Type = MESSAGING_DEVICE_PATH; DebugPortDP.Header.SubType = MSG_VENDOR_DP; SetDevicePathNodeLength (&(DebugPortDP.Header), sizeof (DebugPortDP)); - CopyMem (&DebugPortDP.Guid, &gEfiDebugPortDevicePathGuid, sizeof (EFI_GUID)); + CopyGuid (&DebugPortDP.Guid, &gEfiDebugPortDevicePathGuid); Dp1 = DevicePathFromHandle (ControllerHandle); if (Dp1 == NULL) { @@ -411,19 +373,19 @@ Returns: SetDevicePathEndNode (Dp1); } - gDebugPortDevice->DebugPortDevicePath = AppendDevicePathNode (Dp1, (EFI_DEVICE_PATH_PROTOCOL *) &DebugPortDP); - if (gDebugPortDevice->DebugPortDevicePath == NULL) { + mDebugPortDevice.DebugPortDevicePath = AppendDevicePathNode (Dp1, (EFI_DEVICE_PATH_PROTOCOL *) &DebugPortDP); + if (mDebugPortDevice.DebugPortDevicePath == NULL) { return EFI_OUT_OF_RESOURCES; } // // Publish DebugPort and Device Path protocols // Status = gBS->InstallMultipleProtocolInterfaces ( - &gDebugPortDevice->DebugPortDeviceHandle, + &mDebugPortDevice.DebugPortDeviceHandle, &gEfiDevicePathProtocolGuid, - gDebugPortDevice->DebugPortDevicePath, + mDebugPortDevice.DebugPortDevicePath, &gEfiDebugPortProtocolGuid, - &gDebugPortDevice->DebugPortInterface, + &mDebugPortDevice.DebugPortInterface, NULL ); @@ -442,9 +404,9 @@ Returns: Status = gBS->OpenProtocol ( ControllerHandle, &gEfiSerialIoProtocolGuid, - (VOID **) &gDebugPortDevice->SerialIoBinding, + (VOID **) &mDebugPortDevice.SerialIoBinding, This->DriverBindingHandle, - gDebugPortDevice->DebugPortDeviceHandle, + mDebugPortDevice.DebugPortDeviceHandle, EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER ); @@ -454,7 +416,7 @@ Returns: BufferSize = 48; DebugPortWrite ( - &gDebugPortDevice->DebugPortInterface, + &mDebugPortDevice.DebugPortInterface, 0, &BufferSize, "DebugPort driver failed to open child controller\n\n" @@ -471,20 +433,35 @@ Returns: } DEBUG_CODE_BEGIN (); - UINTN BufferSize; + UINTN BufferSize; BufferSize = 38; DebugPortWrite ( - &gDebugPortDevice->DebugPortInterface, + &mDebugPortDevice.DebugPortInterface, 0, &BufferSize, "Hello World from the DebugPort driver\n\n" ); + DEBUG_CODE_END (); return EFI_SUCCESS; } +/** + Stop this driver on ControllerHandle by removing Serial IO protocol on + the ControllerHandle. + + @param This Protocol instance pointer. + @param ControllerHandle Handle of device to stop driver on + @param NumberOfChildren Number of Handles in ChildHandleBuffer. If number of + children is zero stop the entire bus driver. + @param ChildHandleBuffer List of Child Handles to Stop. + + @retval EFI_SUCCESS This driver is removed ControllerHandle. + @retval other This driver was not removed from this device. + +**/ EFI_STATUS EFIAPI DebugPortStop ( @@ -493,20 +470,6 @@ DebugPortStop ( IN UINTN NumberOfChildren, IN EFI_HANDLE *ChildHandleBuffer ) -/*++ - -Routine Description: - We're never intending to be stopped via the driver model so this just returns - EFI_UNSUPPORTED - -Arguments: - Per UEFI 2.0 driver model - -Returns: - EFI_UNSUPPORTED - EFI_SUCCESS - ---*/ { EFI_STATUS Status; @@ -521,7 +484,7 @@ Returns: ControllerHandle ); - gDebugPortDevice->SerialIoBinding = NULL; + mDebugPortDevice.SerialIoBinding = NULL; gBS->CloseProtocol ( ControllerHandle, @@ -530,7 +493,7 @@ Returns: ControllerHandle ); - FreePool (gDebugPortDevice->DebugPortDevicePath); + FreePool (mDebugPortDevice.DebugPortDevicePath); return EFI_SUCCESS; } else { @@ -538,10 +501,10 @@ Returns: // Disconnect SerialIo child handle // Status = gBS->CloseProtocol ( - gDebugPortDevice->SerialIoDeviceHandle, + mDebugPortDevice.SerialIoDeviceHandle, &gEfiSerialIoProtocolGuid, This->DriverBindingHandle, - gDebugPortDevice->DebugPortDeviceHandle + mDebugPortDevice.DebugPortDeviceHandle ); if (EFI_ERROR (Status)) { @@ -551,11 +514,11 @@ Returns: // Unpublish our protocols (DevicePath, DebugPort) // Status = gBS->UninstallMultipleProtocolInterfaces ( - gDebugPortDevice->DebugPortDeviceHandle, + mDebugPortDevice.DebugPortDeviceHandle, &gEfiDevicePathProtocolGuid, - gDebugPortDevice->DebugPortDevicePath, + mDebugPortDevice.DebugPortDevicePath, &gEfiDebugPortProtocolGuid, - &gDebugPortDevice->DebugPortInterface, + &mDebugPortDevice.DebugPortInterface, NULL ); @@ -563,44 +526,37 @@ Returns: gBS->OpenProtocol ( ControllerHandle, &gEfiSerialIoProtocolGuid, - (VOID **) &gDebugPortDevice->SerialIoBinding, + (VOID **) &mDebugPortDevice.SerialIoBinding, This->DriverBindingHandle, - gDebugPortDevice->DebugPortDeviceHandle, + mDebugPortDevice.DebugPortDeviceHandle, EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER ); } else { - gDebugPortDevice->DebugPortDeviceHandle = NULL; + mDebugPortDevice.DebugPortDeviceHandle = NULL; } } return Status; } -// -// Debugport protocol member functions -// -EFI_STATUS -EFIAPI -DebugPortReset ( - IN EFI_DEBUGPORT_PROTOCOL *This - ) -/*++ -Routine Description: +/** DebugPort protocol member function. Calls SerialIo:GetControl to flush buffer. We cannot call SerialIo:SetAttributes because it uses pool services, which use locks, which affect TPL, so it's not interrupt context safe or re-entrant. SerialIo:Reset() calls SetAttributes, so it can't be used either. - - The port itself should be fine since it was set up during initialization. - -Arguments: - This -Returns: + The port itself should be fine since it was set up during initialization. - EFI_SUCCESS + @param This Protocol instance pointer. ---*/ + @return EFI_SUCCESS Always. + +**/ +EFI_STATUS +EFIAPI +DebugPortReset ( + IN EFI_DEBUGPORT_PROTOCOL *This + ) { UINTN BufferSize; UINTN BitBucket; @@ -613,6 +569,20 @@ Returns: return EFI_SUCCESS; } +/** + DebugPort protocol member function. Calls SerialIo:Read() after setting + if it's different than the last SerialIo access. + + @param This Pointer to DebugPort protocol. + @param Timeout Timeout value. + @param BufferSize On input, the size of Buffer. + On output, the amount of data actually written. + @param Buffer Pointer to buffer to read. + + @retval EFI_SUCCESS + @retval others + +**/ EFI_STATUS EFIAPI DebugPortRead ( @@ -621,23 +591,6 @@ DebugPortRead ( IN OUT UINTN *BufferSize, IN VOID *Buffer ) -/*++ - -Routine Description: - DebugPort protocol member function. Calls SerialIo:Read() after setting - if it's different than the last SerialIo access. - -Arguments: - IN EFI_DEBUGPORT_PROTOCOL *This - IN UINT32 Timeout, - IN OUT UINTN *BufferSize, - IN VOID *Buffer - -Returns: - - EFI_STATUS - ---*/ { DEBUGPORT_DEVICE *DebugPortDevice; UINTN LocalBufferSize; @@ -647,6 +600,7 @@ Returns: DebugPortDevice = DEBUGPORT_DEVICE_FROM_THIS (This); BufferPtr = Buffer; LocalBufferSize = *BufferSize; + do { Status = DebugPortDevice->SerialIoBinding->Read ( DebugPortDevice->SerialIoBinding, @@ -672,6 +626,21 @@ Returns: return Status; } +/** + DebugPort protocol member function. Calls SerialIo:Write() Writes 8 bytes at + a time and does a GetControl between 8 byte writes to help insure reads are + interspersed This is poor-man's flow control. + + @param This Pointer to DebugPort protocol. + @param Timeout Timeout value. + @param BufferSize On input, the size of Buffer. + On output, the amount of data actually written. + @param Buffer Pointer to buffer to read. + + @retval EFI_SUCCESS The data was written. + @retval others Fails when writting datas to debug port device. + +**/ EFI_STATUS EFIAPI DebugPortWrite ( @@ -680,26 +649,6 @@ DebugPortWrite ( IN OUT UINTN *BufferSize, OUT VOID *Buffer ) -/*++ - -Routine Description: - DebugPort protocol member function. Calls SerialIo:Write() Writes 8 bytes at - a time and does a GetControl between 8 byte writes to help insure reads are - interspersed This is poor-man's flow control.. - -Arguments: - This - Pointer to DebugPort protocol - Timeout - Timeout value - BufferSize - On input, the size of Buffer. - On output, the amount of data actually written. - Buffer - Pointer to buffer to write - -Returns: - EFI_SUCCESS - The data was written. - EFI_DEVICE_ERROR - The device reported an error. - EFI_TIMEOUT - The data write was stopped due to a timeout. - ---*/ { DEBUGPORT_DEVICE *DebugPortDevice; UINTN Position; @@ -731,26 +680,24 @@ Returns: return Status; } +/** + DebugPort protocol member function. Calls SerialIo:Write() after setting + if it's different than the last SerialIo access. + + @param This Pointer to DebugPort protocol. + + @retval EFI_SUCCESS At least 1 character is ready to be read from + the DebugPort interface. + @retval EFI_NOT_READY There are no characters ready to read from the + DebugPort interface + @retval EFI_DEVICE_ERROR A hardware failure occured... (from SerialIo) + +**/ EFI_STATUS EFIAPI DebugPortPoll ( IN EFI_DEBUGPORT_PROTOCOL *This ) -/*++ - -Routine Description: - DebugPort protocol member function. Calls SerialIo:Write() after setting - if it's different than the last SerialIo access. - -Arguments: - IN EFI_DEBUGPORT_PROTOCOL *This - -Returns: - EFI_SUCCESS - At least 1 character is ready to be read from the DebugPort interface - EFI_NOT_READY - There are no characters ready to read from the DebugPort interface - EFI_DEVICE_ERROR - A hardware failure occured... (from SerialIo) - ---*/ { EFI_STATUS Status; UINT32 SerialControl; @@ -764,7 +711,7 @@ Returns: ); if (!EFI_ERROR (Status)) { - if (SerialControl & EFI_SERIAL_INPUT_BUFFER_EMPTY) { + if ((SerialControl & EFI_SERIAL_INPUT_BUFFER_EMPTY) != 0) { Status = EFI_NOT_READY; } else { Status = EFI_SUCCESS; @@ -774,53 +721,33 @@ Returns: return Status; } -EFI_STATUS -EFIAPI -ImageUnloadHandler ( - EFI_HANDLE ImageHandle - ) -/*++ - -Routine Description: +/** Unload function that is registered in the LoadImage protocol. It un-installs protocols produced and deallocates pool used by the driver. Called by the core when unloading the driver. - -Arguments: - EFI_HANDLE ImageHandle -Returns: + @param ImageHandle - EFI_SUCCESS + @retval EFI_SUCCESS Unload Debug Port driver successfully. + @retval EFI_ABORTED Serial IO is still binding. ---*/ +**/ +EFI_STATUS +EFIAPI +ImageUnloadHandler ( + EFI_HANDLE ImageHandle + ) { - EFI_STATUS Status; - - if (gDebugPortDevice->SerialIoBinding != NULL) { + if (mDebugPortDevice.SerialIoBinding != NULL) { return EFI_ABORTED; } - Status = gBS->UninstallMultipleProtocolInterfaces ( - ImageHandle, - &gEfiDriverBindingProtocolGuid, - &gDebugPortDevice->DriverBindingInterface, - &gEfiComponentNameProtocolGuid, - &gDebugPortDevice->ComponentNameInterface, - NULL - ); - - if (EFI_ERROR (Status)) { - return Status; - } // // Clean up allocations // - if (gDebugPortDevice->DebugPortVariable != NULL) { - FreePool (gDebugPortDevice->DebugPortVariable); + if (mDebugPortDevice.DebugPortVariable != NULL) { + FreePool (mDebugPortDevice.DebugPortVariable); } - FreePool (gDebugPortDevice); - return EFI_SUCCESS; }