1fb0b259e4e440577dcd6ba6722c252d90605b3e9vanjeff/** @file
2fb0b259e4e440577dcd6ba6722c252d90605b3e9vanjeff  Definitions and prototypes for DebugPort driver.
3c1f23d63363d36947e76df61320bdd2e5e233946qhuang
454d5bb7d16536cab30d782825b0d342f4e02ab4cRuiyu NiCopyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR>
5e5eed7d3641d71d7ea539e5379ea9c6a5cd97004hhtianThis program and the accompanying materials
6fb0b259e4e440577dcd6ba6722c252d90605b3e9vanjeffare licensed and made available under the terms and conditions of the BSD License
7fb0b259e4e440577dcd6ba6722c252d90605b3e9vanjeffwhich accompanies this distribution.  The full text of the license may be found at
8fb0b259e4e440577dcd6ba6722c252d90605b3e9vanjeffhttp://opensource.org/licenses/bsd-license.php
9c1f23d63363d36947e76df61320bdd2e5e233946qhuang
10fb0b259e4e440577dcd6ba6722c252d90605b3e9vanjeffTHE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11fb0b259e4e440577dcd6ba6722c252d90605b3e9vanjeffWITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12c1f23d63363d36947e76df61320bdd2e5e233946qhuang
13fb0b259e4e440577dcd6ba6722c252d90605b3e9vanjeff**/
14c1f23d63363d36947e76df61320bdd2e5e233946qhuang
15c1f23d63363d36947e76df61320bdd2e5e233946qhuang#ifndef __DEBUGPORT_H__
16c1f23d63363d36947e76df61320bdd2e5e233946qhuang#define __DEBUGPORT_H__
17c1f23d63363d36947e76df61320bdd2e5e233946qhuang
18ed7748fe4a5575adea8055c6da5948fbee65fd7avanjeff
19c1f23d63363d36947e76df61320bdd2e5e233946qhuang#include <Uefi.h>
20ed7748fe4a5575adea8055c6da5948fbee65fd7avanjeff
21c1f23d63363d36947e76df61320bdd2e5e233946qhuang#include <Protocol/DevicePath.h>
22c1f23d63363d36947e76df61320bdd2e5e233946qhuang#include <Protocol/ComponentName.h>
23c1f23d63363d36947e76df61320bdd2e5e233946qhuang#include <Protocol/DriverBinding.h>
24c1f23d63363d36947e76df61320bdd2e5e233946qhuang#include <Protocol/SerialIo.h>
25c1f23d63363d36947e76df61320bdd2e5e233946qhuang#include <Protocol/DebugPort.h>
26ed7748fe4a5575adea8055c6da5948fbee65fd7avanjeff
27c1f23d63363d36947e76df61320bdd2e5e233946qhuang#include <Library/DebugLib.h>
28c1f23d63363d36947e76df61320bdd2e5e233946qhuang#include <Library/UefiDriverEntryPoint.h>
29c1f23d63363d36947e76df61320bdd2e5e233946qhuang#include <Library/UefiLib.h>
30c1f23d63363d36947e76df61320bdd2e5e233946qhuang#include <Library/BaseMemoryLib.h>
31c1f23d63363d36947e76df61320bdd2e5e233946qhuang#include <Library/MemoryAllocationLib.h>
32c1f23d63363d36947e76df61320bdd2e5e233946qhuang#include <Library/UefiBootServicesTableLib.h>
33c1f23d63363d36947e76df61320bdd2e5e233946qhuang#include <Library/UefiRuntimeServicesTableLib.h>
34c1f23d63363d36947e76df61320bdd2e5e233946qhuang#include <Library/DevicePathLib.h>
35c1f23d63363d36947e76df61320bdd2e5e233946qhuang
36c1f23d63363d36947e76df61320bdd2e5e233946qhuang//
37c1f23d63363d36947e76df61320bdd2e5e233946qhuang// Driver Binding Externs
38c1f23d63363d36947e76df61320bdd2e5e233946qhuang//
3919f97f7e860b65f638777845b65b458659c7eb66qhuangextern EFI_DRIVER_BINDING_PROTOCOL  gDebugPortDriverBinding;
4019f97f7e860b65f638777845b65b458659c7eb66qhuangextern EFI_COMPONENT_NAME_PROTOCOL  gDebugPortComponentName;
4119f97f7e860b65f638777845b65b458659c7eb66qhuangextern EFI_COMPONENT_NAME2_PROTOCOL gDebugPortComponentName2;
42c1f23d63363d36947e76df61320bdd2e5e233946qhuang
43c1f23d63363d36947e76df61320bdd2e5e233946qhuang//
44c1f23d63363d36947e76df61320bdd2e5e233946qhuang// local type definitions
45c1f23d63363d36947e76df61320bdd2e5e233946qhuang//
46f3f2e05db8c89628498ec4efdb16184747824c63qhuang#define DEBUGPORT_DEVICE_SIGNATURE  SIGNATURE_32 ('D', 'B', 'G', 'P')
47c1f23d63363d36947e76df61320bdd2e5e233946qhuang
48c1f23d63363d36947e76df61320bdd2e5e233946qhuang//
49c1f23d63363d36947e76df61320bdd2e5e233946qhuang// Device structure used by driver
50c1f23d63363d36947e76df61320bdd2e5e233946qhuang//
51c1f23d63363d36947e76df61320bdd2e5e233946qhuangtypedef struct {
52c1f23d63363d36947e76df61320bdd2e5e233946qhuang  UINT32                      Signature;
53c1f23d63363d36947e76df61320bdd2e5e233946qhuang  EFI_HANDLE                  DriverBindingHandle;
54c1f23d63363d36947e76df61320bdd2e5e233946qhuang  EFI_HANDLE                  DebugPortDeviceHandle;
55c1f23d63363d36947e76df61320bdd2e5e233946qhuang
56c1f23d63363d36947e76df61320bdd2e5e233946qhuang  EFI_DEVICE_PATH_PROTOCOL    *DebugPortDevicePath;
57c1f23d63363d36947e76df61320bdd2e5e233946qhuang  EFI_DEBUGPORT_PROTOCOL      DebugPortInterface;
58c1f23d63363d36947e76df61320bdd2e5e233946qhuang
59c1f23d63363d36947e76df61320bdd2e5e233946qhuang  EFI_HANDLE                  SerialIoDeviceHandle;
60c1f23d63363d36947e76df61320bdd2e5e233946qhuang  EFI_SERIAL_IO_PROTOCOL      *SerialIoBinding;
61c1f23d63363d36947e76df61320bdd2e5e233946qhuang  UINT64                      BaudRate;
62c1f23d63363d36947e76df61320bdd2e5e233946qhuang  UINT32                      ReceiveFifoDepth;
63c1f23d63363d36947e76df61320bdd2e5e233946qhuang  UINT32                      Timeout;
64c1f23d63363d36947e76df61320bdd2e5e233946qhuang  EFI_PARITY_TYPE             Parity;
65c1f23d63363d36947e76df61320bdd2e5e233946qhuang  UINT8                       DataBits;
66c1f23d63363d36947e76df61320bdd2e5e233946qhuang  EFI_STOP_BITS_TYPE          StopBits;
67c1f23d63363d36947e76df61320bdd2e5e233946qhuang} DEBUGPORT_DEVICE;
68c1f23d63363d36947e76df61320bdd2e5e233946qhuang
69c1f23d63363d36947e76df61320bdd2e5e233946qhuang#define DEBUGPORT_DEVICE_FROM_THIS(a)     CR (a, DEBUGPORT_DEVICE, DebugPortInterface, DEBUGPORT_DEVICE_SIGNATURE)
70c1f23d63363d36947e76df61320bdd2e5e233946qhuang
71c1f23d63363d36947e76df61320bdd2e5e233946qhuang#define EFI_ACPI_PC_COMPORT_HID           EISA_PNP_ID (0x0500)
72c1f23d63363d36947e76df61320bdd2e5e233946qhuang#define EFI_ACPI_16550UART_HID            EISA_PNP_ID (0x0501)
73c1f23d63363d36947e76df61320bdd2e5e233946qhuang
74c1f23d63363d36947e76df61320bdd2e5e233946qhuang#define DEBUGPORT_UART_DEFAULT_BAUDRATE   115200
75c1f23d63363d36947e76df61320bdd2e5e233946qhuang#define DEBUGPORT_UART_DEFAULT_PARITY     0
76c1f23d63363d36947e76df61320bdd2e5e233946qhuang#define DEBUGPORT_UART_DEFAULT_FIFO_DEPTH 16
772d285faad8505a22d923935b6f00eebeba5b4172vanjeff#define DEBUGPORT_UART_DEFAULT_TIMEOUT    50000 ///< 5 ms
78c1f23d63363d36947e76df61320bdd2e5e233946qhuang#define DEBUGPORT_UART_DEFAULT_DATA_BITS  8
79c1f23d63363d36947e76df61320bdd2e5e233946qhuang#define DEBUGPORT_UART_DEFAULT_STOP_BITS  1
80c1f23d63363d36947e76df61320bdd2e5e233946qhuang
81c1f23d63363d36947e76df61320bdd2e5e233946qhuang#define DEBUGPORT_DRIVER_VERSION          1
82c1f23d63363d36947e76df61320bdd2e5e233946qhuang
8349c8b87c66e8034d935ed11673dd8a230e43440avanjeff#define IS_UART_DEVICEPATH(dp)           (DevicePathType (dp) == MESSAGING_DEVICE_PATH && DevicePathSubType (dp) == MSG_UART_DP)
84c1f23d63363d36947e76df61320bdd2e5e233946qhuang
8549c8b87c66e8034d935ed11673dd8a230e43440avanjeff/**
867601dbe7c5ed94c859600649fc316918bb3572b3gikidy  Debug Port Driver entry point.
8749c8b87c66e8034d935ed11673dd8a230e43440avanjeff
8849c8b87c66e8034d935ed11673dd8a230e43440avanjeff  Reads DebugPort variable to determine what device and settings to use as the
8949c8b87c66e8034d935ed11673dd8a230e43440avanjeff  debug port.  Binds exclusively to SerialIo. Reverts to defaults if no variable
9049c8b87c66e8034d935ed11673dd8a230e43440avanjeff  is found.
9149c8b87c66e8034d935ed11673dd8a230e43440avanjeff
9249c8b87c66e8034d935ed11673dd8a230e43440avanjeff  @param[in] ImageHandle       The firmware allocated handle for the EFI image.
9349c8b87c66e8034d935ed11673dd8a230e43440avanjeff  @param[in] SystemTable       A pointer to the EFI System Table.
9449c8b87c66e8034d935ed11673dd8a230e43440avanjeff
9549c8b87c66e8034d935ed11673dd8a230e43440avanjeff  @retval EFI_SUCCESS          The entry point is executed successfully.
9649c8b87c66e8034d935ed11673dd8a230e43440avanjeff  @retval EFI_OUT_OF_RESOURCES Fails to allocate memory for device.
9749c8b87c66e8034d935ed11673dd8a230e43440avanjeff  @retval other                Some error occurs when executing this entry point.
9849c8b87c66e8034d935ed11673dd8a230e43440avanjeff
9949c8b87c66e8034d935ed11673dd8a230e43440avanjeff**/
100c1f23d63363d36947e76df61320bdd2e5e233946qhuangEFI_STATUS
10149c8b87c66e8034d935ed11673dd8a230e43440avanjeffEFIAPI
10249c8b87c66e8034d935ed11673dd8a230e43440avanjeffInitializeDebugPortDriver (
103c1f23d63363d36947e76df61320bdd2e5e233946qhuang  IN EFI_HANDLE                     ImageHandle,
104c1f23d63363d36947e76df61320bdd2e5e233946qhuang  IN EFI_SYSTEM_TABLE               *SystemTable
105ed66e1bc0d2be0a185fc47adab4930c3b7e2767fvanjeff  );
106c1f23d63363d36947e76df61320bdd2e5e233946qhuang
10749c8b87c66e8034d935ed11673dd8a230e43440avanjeff/**
10849c8b87c66e8034d935ed11673dd8a230e43440avanjeff  Checks to see if there's not already a DebugPort interface somewhere.
10949c8b87c66e8034d935ed11673dd8a230e43440avanjeff
11049c8b87c66e8034d935ed11673dd8a230e43440avanjeff  If there's a DEBUGPORT variable, the device path must match exactly.  If there's
11149c8b87c66e8034d935ed11673dd8a230e43440avanjeff  no DEBUGPORT variable, then device path is not checked and does not matter.
11249c8b87c66e8034d935ed11673dd8a230e43440avanjeff  Checks to see that there's a serial io interface on the controller handle
11349c8b87c66e8034d935ed11673dd8a230e43440avanjeff  that can be bound BY_DRIVER | EXCLUSIVE.
11449c8b87c66e8034d935ed11673dd8a230e43440avanjeff  If all these tests succeed, then we return EFI_SUCCESS, else, EFI_UNSUPPORTED
11549c8b87c66e8034d935ed11673dd8a230e43440avanjeff  or other error returned by OpenProtocol.
11649c8b87c66e8034d935ed11673dd8a230e43440avanjeff
11749c8b87c66e8034d935ed11673dd8a230e43440avanjeff  @param  This                 Protocol instance pointer.
11849c8b87c66e8034d935ed11673dd8a230e43440avanjeff  @param  ControllerHandle     Handle of device to test.
11949c8b87c66e8034d935ed11673dd8a230e43440avanjeff  @param  RemainingDevicePath  Optional parameter use to pick a specific child
12049c8b87c66e8034d935ed11673dd8a230e43440avanjeff                               device to start.
12149c8b87c66e8034d935ed11673dd8a230e43440avanjeff
12249c8b87c66e8034d935ed11673dd8a230e43440avanjeff  @retval EFI_SUCCESS          This driver supports this device.
12349c8b87c66e8034d935ed11673dd8a230e43440avanjeff  @retval EFI_UNSUPPORTED      Debug Port device is not supported.
12449c8b87c66e8034d935ed11673dd8a230e43440avanjeff  @retval EFI_OUT_OF_RESOURCES Fails to allocate memory for device.
12549c8b87c66e8034d935ed11673dd8a230e43440avanjeff  @retval others               Some error occurs.
12649c8b87c66e8034d935ed11673dd8a230e43440avanjeff
12749c8b87c66e8034d935ed11673dd8a230e43440avanjeff**/
128c1f23d63363d36947e76df61320bdd2e5e233946qhuangEFI_STATUS
129c1f23d63363d36947e76df61320bdd2e5e233946qhuangEFIAPI
130c1f23d63363d36947e76df61320bdd2e5e233946qhuangDebugPortSupported (
131c1f23d63363d36947e76df61320bdd2e5e233946qhuang  IN EFI_DRIVER_BINDING_PROTOCOL    *This,
132c1f23d63363d36947e76df61320bdd2e5e233946qhuang  IN EFI_HANDLE                     Controller,
133c1f23d63363d36947e76df61320bdd2e5e233946qhuang  IN EFI_DEVICE_PATH_PROTOCOL       *RemainingDevicePath
134ed66e1bc0d2be0a185fc47adab4930c3b7e2767fvanjeff  );
135c1f23d63363d36947e76df61320bdd2e5e233946qhuang
13649c8b87c66e8034d935ed11673dd8a230e43440avanjeff/**
13749c8b87c66e8034d935ed11673dd8a230e43440avanjeff  Binds exclusively to serial io on the controller handle, Produces DebugPort
13849c8b87c66e8034d935ed11673dd8a230e43440avanjeff  protocol and DevicePath on new handle.
13949c8b87c66e8034d935ed11673dd8a230e43440avanjeff
14049c8b87c66e8034d935ed11673dd8a230e43440avanjeff  @param  This                 Protocol instance pointer.
14149c8b87c66e8034d935ed11673dd8a230e43440avanjeff  @param  ControllerHandle     Handle of device to bind driver to.
14249c8b87c66e8034d935ed11673dd8a230e43440avanjeff  @param  RemainingDevicePath  Optional parameter use to pick a specific child
14349c8b87c66e8034d935ed11673dd8a230e43440avanjeff                               device to start.
14449c8b87c66e8034d935ed11673dd8a230e43440avanjeff
14549c8b87c66e8034d935ed11673dd8a230e43440avanjeff  @retval EFI_SUCCESS          This driver is added to ControllerHandle.
14649c8b87c66e8034d935ed11673dd8a230e43440avanjeff  @retval EFI_OUT_OF_RESOURCES Fails to allocate memory for device.
14749c8b87c66e8034d935ed11673dd8a230e43440avanjeff  @retval others               Some error occurs.
14849c8b87c66e8034d935ed11673dd8a230e43440avanjeff
14949c8b87c66e8034d935ed11673dd8a230e43440avanjeff**/
150c1f23d63363d36947e76df61320bdd2e5e233946qhuangEFI_STATUS
151c1f23d63363d36947e76df61320bdd2e5e233946qhuangEFIAPI
152c1f23d63363d36947e76df61320bdd2e5e233946qhuangDebugPortStart (
153c1f23d63363d36947e76df61320bdd2e5e233946qhuang  IN EFI_DRIVER_BINDING_PROTOCOL    *This,
154c1f23d63363d36947e76df61320bdd2e5e233946qhuang  IN EFI_HANDLE                     Controller,
155c1f23d63363d36947e76df61320bdd2e5e233946qhuang  IN EFI_DEVICE_PATH_PROTOCOL       *RemainingDevicePath
156ed66e1bc0d2be0a185fc47adab4930c3b7e2767fvanjeff  );
157c1f23d63363d36947e76df61320bdd2e5e233946qhuang
15849c8b87c66e8034d935ed11673dd8a230e43440avanjeff/**
15949c8b87c66e8034d935ed11673dd8a230e43440avanjeff  Stop this driver on ControllerHandle by removing Serial IO protocol on
16049c8b87c66e8034d935ed11673dd8a230e43440avanjeff  the ControllerHandle.
16149c8b87c66e8034d935ed11673dd8a230e43440avanjeff
16249c8b87c66e8034d935ed11673dd8a230e43440avanjeff  @param  This              Protocol instance pointer.
16349c8b87c66e8034d935ed11673dd8a230e43440avanjeff  @param  ControllerHandle  Handle of device to stop driver on
16449c8b87c66e8034d935ed11673dd8a230e43440avanjeff  @param  NumberOfChildren  Number of Handles in ChildHandleBuffer. If number of
16549c8b87c66e8034d935ed11673dd8a230e43440avanjeff                            children is zero stop the entire bus driver.
16649c8b87c66e8034d935ed11673dd8a230e43440avanjeff  @param  ChildHandleBuffer List of Child Handles to Stop.
16749c8b87c66e8034d935ed11673dd8a230e43440avanjeff
16849c8b87c66e8034d935ed11673dd8a230e43440avanjeff  @retval EFI_SUCCESS       This driver is removed ControllerHandle.
16949c8b87c66e8034d935ed11673dd8a230e43440avanjeff  @retval other             This driver was not removed from this device.
17049c8b87c66e8034d935ed11673dd8a230e43440avanjeff
17149c8b87c66e8034d935ed11673dd8a230e43440avanjeff**/
172c1f23d63363d36947e76df61320bdd2e5e233946qhuangEFI_STATUS
173c1f23d63363d36947e76df61320bdd2e5e233946qhuangEFIAPI
174c1f23d63363d36947e76df61320bdd2e5e233946qhuangDebugPortStop (
175c1f23d63363d36947e76df61320bdd2e5e233946qhuang  IN  EFI_DRIVER_BINDING_PROTOCOL    *This,
176c1f23d63363d36947e76df61320bdd2e5e233946qhuang  IN  EFI_HANDLE                     Controller,
177c1f23d63363d36947e76df61320bdd2e5e233946qhuang  IN  UINTN                          NumberOfChildren,
178c1f23d63363d36947e76df61320bdd2e5e233946qhuang  IN  EFI_HANDLE                     *ChildHandleBuffer
179ed66e1bc0d2be0a185fc47adab4930c3b7e2767fvanjeff  );
180c1f23d63363d36947e76df61320bdd2e5e233946qhuang
181c1f23d63363d36947e76df61320bdd2e5e233946qhuang//
182c1f23d63363d36947e76df61320bdd2e5e233946qhuang// EFI Component Name Functions
183c1f23d63363d36947e76df61320bdd2e5e233946qhuang//
18419f97f7e860b65f638777845b65b458659c7eb66qhuang/**
18519f97f7e860b65f638777845b65b458659c7eb66qhuang  Retrieves a Unicode string that is the user readable name of the driver.
18619f97f7e860b65f638777845b65b458659c7eb66qhuang
18719f97f7e860b65f638777845b65b458659c7eb66qhuang  This function retrieves the user readable name of a driver in the form of a
18819f97f7e860b65f638777845b65b458659c7eb66qhuang  Unicode string. If the driver specified by This has a user readable name in
18919f97f7e860b65f638777845b65b458659c7eb66qhuang  the language specified by Language, then a pointer to the driver name is
19019f97f7e860b65f638777845b65b458659c7eb66qhuang  returned in DriverName, and EFI_SUCCESS is returned. If the driver specified
19119f97f7e860b65f638777845b65b458659c7eb66qhuang  by This does not support the language specified by Language,
19219f97f7e860b65f638777845b65b458659c7eb66qhuang  then EFI_UNSUPPORTED is returned.
19319f97f7e860b65f638777845b65b458659c7eb66qhuang
19419f97f7e860b65f638777845b65b458659c7eb66qhuang  @param  This[in]              A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or
19519f97f7e860b65f638777845b65b458659c7eb66qhuang                                EFI_COMPONENT_NAME_PROTOCOL instance.
19619f97f7e860b65f638777845b65b458659c7eb66qhuang
19719f97f7e860b65f638777845b65b458659c7eb66qhuang  @param  Language[in]          A pointer to a Null-terminated ASCII string
19819f97f7e860b65f638777845b65b458659c7eb66qhuang                                array indicating the language. This is the
19919f97f7e860b65f638777845b65b458659c7eb66qhuang                                language of the driver name that the caller is
20019f97f7e860b65f638777845b65b458659c7eb66qhuang                                requesting, and it must match one of the
20119f97f7e860b65f638777845b65b458659c7eb66qhuang                                languages specified in SupportedLanguages. The
20219f97f7e860b65f638777845b65b458659c7eb66qhuang                                number of languages supported by a driver is up
20319f97f7e860b65f638777845b65b458659c7eb66qhuang                                to the driver writer. Language is specified
2040254efc01e461445240512ae1a1c2fc48ed2f70egikidy                                in RFC 4646 or ISO 639-2 language code format.
20519f97f7e860b65f638777845b65b458659c7eb66qhuang
20619f97f7e860b65f638777845b65b458659c7eb66qhuang  @param  DriverName[out]       A pointer to the Unicode string to return.
20719f97f7e860b65f638777845b65b458659c7eb66qhuang                                This Unicode string is the name of the
20819f97f7e860b65f638777845b65b458659c7eb66qhuang                                driver specified by This in the language
20919f97f7e860b65f638777845b65b458659c7eb66qhuang                                specified by Language.
21019f97f7e860b65f638777845b65b458659c7eb66qhuang
21119f97f7e860b65f638777845b65b458659c7eb66qhuang  @retval EFI_SUCCESS           The Unicode string for the Driver specified by
21219f97f7e860b65f638777845b65b458659c7eb66qhuang                                This and the language specified by Language was
21319f97f7e860b65f638777845b65b458659c7eb66qhuang                                returned in DriverName.
21419f97f7e860b65f638777845b65b458659c7eb66qhuang
21519f97f7e860b65f638777845b65b458659c7eb66qhuang  @retval EFI_INVALID_PARAMETER Language is NULL.
21619f97f7e860b65f638777845b65b458659c7eb66qhuang
21719f97f7e860b65f638777845b65b458659c7eb66qhuang  @retval EFI_INVALID_PARAMETER DriverName is NULL.
21819f97f7e860b65f638777845b65b458659c7eb66qhuang
21919f97f7e860b65f638777845b65b458659c7eb66qhuang  @retval EFI_UNSUPPORTED       The driver specified by This does not support
22019f97f7e860b65f638777845b65b458659c7eb66qhuang                                the language specified by Language.
22119f97f7e860b65f638777845b65b458659c7eb66qhuang
22219f97f7e860b65f638777845b65b458659c7eb66qhuang**/
223c1f23d63363d36947e76df61320bdd2e5e233946qhuangEFI_STATUS
224c1f23d63363d36947e76df61320bdd2e5e233946qhuangEFIAPI
225c1f23d63363d36947e76df61320bdd2e5e233946qhuangDebugPortComponentNameGetDriverName (
22619f97f7e860b65f638777845b65b458659c7eb66qhuang  IN  EFI_COMPONENT_NAME_PROTOCOL  *This,
22719f97f7e860b65f638777845b65b458659c7eb66qhuang  IN  CHAR8                        *Language,
22819f97f7e860b65f638777845b65b458659c7eb66qhuang  OUT CHAR16                       **DriverName
22919f97f7e860b65f638777845b65b458659c7eb66qhuang  );
23019f97f7e860b65f638777845b65b458659c7eb66qhuang
23119f97f7e860b65f638777845b65b458659c7eb66qhuang
23219f97f7e860b65f638777845b65b458659c7eb66qhuang/**
23319f97f7e860b65f638777845b65b458659c7eb66qhuang  Retrieves a Unicode string that is the user readable name of the controller
23419f97f7e860b65f638777845b65b458659c7eb66qhuang  that is being managed by a driver.
23519f97f7e860b65f638777845b65b458659c7eb66qhuang
23619f97f7e860b65f638777845b65b458659c7eb66qhuang  This function retrieves the user readable name of the controller specified by
23719f97f7e860b65f638777845b65b458659c7eb66qhuang  ControllerHandle and ChildHandle in the form of a Unicode string. If the
23819f97f7e860b65f638777845b65b458659c7eb66qhuang  driver specified by This has a user readable name in the language specified by
23919f97f7e860b65f638777845b65b458659c7eb66qhuang  Language, then a pointer to the controller name is returned in ControllerName,
24019f97f7e860b65f638777845b65b458659c7eb66qhuang  and EFI_SUCCESS is returned.  If the driver specified by This is not currently
24119f97f7e860b65f638777845b65b458659c7eb66qhuang  managing the controller specified by ControllerHandle and ChildHandle,
24219f97f7e860b65f638777845b65b458659c7eb66qhuang  then EFI_UNSUPPORTED is returned.  If the driver specified by This does not
24319f97f7e860b65f638777845b65b458659c7eb66qhuang  support the language specified by Language, then EFI_UNSUPPORTED is returned.
24419f97f7e860b65f638777845b65b458659c7eb66qhuang
24519f97f7e860b65f638777845b65b458659c7eb66qhuang  @param  This[in]              A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or
24619f97f7e860b65f638777845b65b458659c7eb66qhuang                                EFI_COMPONENT_NAME_PROTOCOL instance.
247c1f23d63363d36947e76df61320bdd2e5e233946qhuang
24819f97f7e860b65f638777845b65b458659c7eb66qhuang  @param  ControllerHandle[in]  The handle of a controller that the driver
24919f97f7e860b65f638777845b65b458659c7eb66qhuang                                specified by This is managing.  This handle
25019f97f7e860b65f638777845b65b458659c7eb66qhuang                                specifies the controller whose name is to be
25119f97f7e860b65f638777845b65b458659c7eb66qhuang                                returned.
25219f97f7e860b65f638777845b65b458659c7eb66qhuang
25319f97f7e860b65f638777845b65b458659c7eb66qhuang  @param  ChildHandle[in]       The handle of the child controller to retrieve
25419f97f7e860b65f638777845b65b458659c7eb66qhuang                                the name of.  This is an optional parameter that
25519f97f7e860b65f638777845b65b458659c7eb66qhuang                                may be NULL.  It will be NULL for device
25619f97f7e860b65f638777845b65b458659c7eb66qhuang                                drivers.  It will also be NULL for a bus drivers
25719f97f7e860b65f638777845b65b458659c7eb66qhuang                                that wish to retrieve the name of the bus
25819f97f7e860b65f638777845b65b458659c7eb66qhuang                                controller.  It will not be NULL for a bus
25919f97f7e860b65f638777845b65b458659c7eb66qhuang                                driver that wishes to retrieve the name of a
26019f97f7e860b65f638777845b65b458659c7eb66qhuang                                child controller.
26119f97f7e860b65f638777845b65b458659c7eb66qhuang
26219f97f7e860b65f638777845b65b458659c7eb66qhuang  @param  Language[in]          A pointer to a Null-terminated ASCII string
26319f97f7e860b65f638777845b65b458659c7eb66qhuang                                array indicating the language.  This is the
26419f97f7e860b65f638777845b65b458659c7eb66qhuang                                language of the driver name that the caller is
26519f97f7e860b65f638777845b65b458659c7eb66qhuang                                requesting, and it must match one of the
26619f97f7e860b65f638777845b65b458659c7eb66qhuang                                languages specified in SupportedLanguages. The
26719f97f7e860b65f638777845b65b458659c7eb66qhuang                                number of languages supported by a driver is up
26819f97f7e860b65f638777845b65b458659c7eb66qhuang                                to the driver writer. Language is specified in
2690254efc01e461445240512ae1a1c2fc48ed2f70egikidy                                RFC 4646 or ISO 639-2 language code format.
27019f97f7e860b65f638777845b65b458659c7eb66qhuang
27119f97f7e860b65f638777845b65b458659c7eb66qhuang  @param  ControllerName[out]   A pointer to the Unicode string to return.
27219f97f7e860b65f638777845b65b458659c7eb66qhuang                                This Unicode string is the name of the
27319f97f7e860b65f638777845b65b458659c7eb66qhuang                                controller specified by ControllerHandle and
27419f97f7e860b65f638777845b65b458659c7eb66qhuang                                ChildHandle in the language specified by
27519f97f7e860b65f638777845b65b458659c7eb66qhuang                                Language from the point of view of the driver
27619f97f7e860b65f638777845b65b458659c7eb66qhuang                                specified by This.
27719f97f7e860b65f638777845b65b458659c7eb66qhuang
27819f97f7e860b65f638777845b65b458659c7eb66qhuang  @retval EFI_SUCCESS           The Unicode string for the user readable name in
27919f97f7e860b65f638777845b65b458659c7eb66qhuang                                the language specified by Language for the
28019f97f7e860b65f638777845b65b458659c7eb66qhuang                                driver specified by This was returned in
28119f97f7e860b65f638777845b65b458659c7eb66qhuang                                DriverName.
28219f97f7e860b65f638777845b65b458659c7eb66qhuang
283284ee2e829ab2453293b7dc4539727ad6c047163niruiyu  @retval EFI_INVALID_PARAMETER ControllerHandle is NULL.
28419f97f7e860b65f638777845b65b458659c7eb66qhuang
28519f97f7e860b65f638777845b65b458659c7eb66qhuang  @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid
28619f97f7e860b65f638777845b65b458659c7eb66qhuang                                EFI_HANDLE.
28719f97f7e860b65f638777845b65b458659c7eb66qhuang
28819f97f7e860b65f638777845b65b458659c7eb66qhuang  @retval EFI_INVALID_PARAMETER Language is NULL.
28919f97f7e860b65f638777845b65b458659c7eb66qhuang
29019f97f7e860b65f638777845b65b458659c7eb66qhuang  @retval EFI_INVALID_PARAMETER ControllerName is NULL.
29119f97f7e860b65f638777845b65b458659c7eb66qhuang
29219f97f7e860b65f638777845b65b458659c7eb66qhuang  @retval EFI_UNSUPPORTED       The driver specified by This is not currently
29319f97f7e860b65f638777845b65b458659c7eb66qhuang                                managing the controller specified by
29419f97f7e860b65f638777845b65b458659c7eb66qhuang                                ControllerHandle and ChildHandle.
29519f97f7e860b65f638777845b65b458659c7eb66qhuang
29619f97f7e860b65f638777845b65b458659c7eb66qhuang  @retval EFI_UNSUPPORTED       The driver specified by This does not support
29719f97f7e860b65f638777845b65b458659c7eb66qhuang                                the language specified by Language.
29819f97f7e860b65f638777845b65b458659c7eb66qhuang
29919f97f7e860b65f638777845b65b458659c7eb66qhuang**/
300c1f23d63363d36947e76df61320bdd2e5e233946qhuangEFI_STATUS
301c1f23d63363d36947e76df61320bdd2e5e233946qhuangEFIAPI
302c1f23d63363d36947e76df61320bdd2e5e233946qhuangDebugPortComponentNameGetControllerName (
30319f97f7e860b65f638777845b65b458659c7eb66qhuang  IN  EFI_COMPONENT_NAME_PROTOCOL                     *This,
30419f97f7e860b65f638777845b65b458659c7eb66qhuang  IN  EFI_HANDLE                                      ControllerHandle,
30519f97f7e860b65f638777845b65b458659c7eb66qhuang  IN  EFI_HANDLE                                      ChildHandle        OPTIONAL,
30619f97f7e860b65f638777845b65b458659c7eb66qhuang  IN  CHAR8                                           *Language,
30719f97f7e860b65f638777845b65b458659c7eb66qhuang  OUT CHAR16                                          **ControllerName
30819f97f7e860b65f638777845b65b458659c7eb66qhuang  );
30919f97f7e860b65f638777845b65b458659c7eb66qhuang
310c1f23d63363d36947e76df61320bdd2e5e233946qhuang
31149c8b87c66e8034d935ed11673dd8a230e43440avanjeff/**
31249c8b87c66e8034d935ed11673dd8a230e43440avanjeff  DebugPort protocol member function.  Calls SerialIo:GetControl to flush buffer.
31349c8b87c66e8034d935ed11673dd8a230e43440avanjeff  We cannot call SerialIo:SetAttributes because it uses pool services, which use
31449c8b87c66e8034d935ed11673dd8a230e43440avanjeff  locks, which affect TPL, so it's not interrupt context safe or re-entrant.
31549c8b87c66e8034d935ed11673dd8a230e43440avanjeff  SerialIo:Reset() calls SetAttributes, so it can't be used either.
31649c8b87c66e8034d935ed11673dd8a230e43440avanjeff
31749c8b87c66e8034d935ed11673dd8a230e43440avanjeff  The port itself should be fine since it was set up during initialization.
31849c8b87c66e8034d935ed11673dd8a230e43440avanjeff
31949c8b87c66e8034d935ed11673dd8a230e43440avanjeff  @param  This              Protocol instance pointer.
32049c8b87c66e8034d935ed11673dd8a230e43440avanjeff
32149c8b87c66e8034d935ed11673dd8a230e43440avanjeff  @return EFI_SUCCESS       Always.
32249c8b87c66e8034d935ed11673dd8a230e43440avanjeff
32349c8b87c66e8034d935ed11673dd8a230e43440avanjeff**/
324c1f23d63363d36947e76df61320bdd2e5e233946qhuangEFI_STATUS
325c1f23d63363d36947e76df61320bdd2e5e233946qhuangEFIAPI
326c1f23d63363d36947e76df61320bdd2e5e233946qhuangDebugPortReset (
327c1f23d63363d36947e76df61320bdd2e5e233946qhuang  IN EFI_DEBUGPORT_PROTOCOL         *This
328ed66e1bc0d2be0a185fc47adab4930c3b7e2767fvanjeff  );
329c1f23d63363d36947e76df61320bdd2e5e233946qhuang
33049c8b87c66e8034d935ed11673dd8a230e43440avanjeff/**
33149c8b87c66e8034d935ed11673dd8a230e43440avanjeff  DebugPort protocol member function.  Calls SerialIo:Read() after setting
33249c8b87c66e8034d935ed11673dd8a230e43440avanjeff  if it's different than the last SerialIo access.
33349c8b87c66e8034d935ed11673dd8a230e43440avanjeff
33449c8b87c66e8034d935ed11673dd8a230e43440avanjeff  @param  This                Pointer to DebugPort protocol.
33549c8b87c66e8034d935ed11673dd8a230e43440avanjeff  @param  Timeout             Timeout value.
33649c8b87c66e8034d935ed11673dd8a230e43440avanjeff  @param  BufferSize          On input, the size of Buffer.
33749c8b87c66e8034d935ed11673dd8a230e43440avanjeff                              On output, the amount of data actually written.
33849c8b87c66e8034d935ed11673dd8a230e43440avanjeff  @param  Buffer              Pointer to buffer to read.
33949c8b87c66e8034d935ed11673dd8a230e43440avanjeff
34049c8b87c66e8034d935ed11673dd8a230e43440avanjeff  @retval EFI_SUCCESS
34149c8b87c66e8034d935ed11673dd8a230e43440avanjeff  @retval others
34249c8b87c66e8034d935ed11673dd8a230e43440avanjeff
34349c8b87c66e8034d935ed11673dd8a230e43440avanjeff**/
344c1f23d63363d36947e76df61320bdd2e5e233946qhuangEFI_STATUS
345c1f23d63363d36947e76df61320bdd2e5e233946qhuangEFIAPI
346c1f23d63363d36947e76df61320bdd2e5e233946qhuangDebugPortRead (
347c1f23d63363d36947e76df61320bdd2e5e233946qhuang  IN EFI_DEBUGPORT_PROTOCOL         *This,
348c1f23d63363d36947e76df61320bdd2e5e233946qhuang  IN UINT32                         Timeout,
349c1f23d63363d36947e76df61320bdd2e5e233946qhuang  IN OUT UINTN                      *BufferSize,
350c1f23d63363d36947e76df61320bdd2e5e233946qhuang  IN VOID                           *Buffer
351ed66e1bc0d2be0a185fc47adab4930c3b7e2767fvanjeff  );
352c1f23d63363d36947e76df61320bdd2e5e233946qhuang
35349c8b87c66e8034d935ed11673dd8a230e43440avanjeff/**
35449c8b87c66e8034d935ed11673dd8a230e43440avanjeff  DebugPort protocol member function.  Calls SerialIo:Write() Writes 8 bytes at
35549c8b87c66e8034d935ed11673dd8a230e43440avanjeff  a time and does a GetControl between 8 byte writes to help insure reads are
35649c8b87c66e8034d935ed11673dd8a230e43440avanjeff  interspersed This is poor-man's flow control.
35749c8b87c66e8034d935ed11673dd8a230e43440avanjeff
35849c8b87c66e8034d935ed11673dd8a230e43440avanjeff  @param  This                Pointer to DebugPort protocol.
35949c8b87c66e8034d935ed11673dd8a230e43440avanjeff  @param  Timeout             Timeout value.
36049c8b87c66e8034d935ed11673dd8a230e43440avanjeff  @param  BufferSize          On input, the size of Buffer.
36149c8b87c66e8034d935ed11673dd8a230e43440avanjeff                              On output, the amount of data actually written.
36249c8b87c66e8034d935ed11673dd8a230e43440avanjeff  @param  Buffer              Pointer to buffer to read.
36349c8b87c66e8034d935ed11673dd8a230e43440avanjeff
36449c8b87c66e8034d935ed11673dd8a230e43440avanjeff  @retval EFI_SUCCESS         The data was written.
36549c8b87c66e8034d935ed11673dd8a230e43440avanjeff  @retval others              Fails when writting datas to debug port device.
36649c8b87c66e8034d935ed11673dd8a230e43440avanjeff
36749c8b87c66e8034d935ed11673dd8a230e43440avanjeff**/
368c1f23d63363d36947e76df61320bdd2e5e233946qhuangEFI_STATUS
369c1f23d63363d36947e76df61320bdd2e5e233946qhuangEFIAPI
370c1f23d63363d36947e76df61320bdd2e5e233946qhuangDebugPortWrite (
371c1f23d63363d36947e76df61320bdd2e5e233946qhuang  IN EFI_DEBUGPORT_PROTOCOL         *This,
372c1f23d63363d36947e76df61320bdd2e5e233946qhuang  IN UINT32                         Timeout,
373c1f23d63363d36947e76df61320bdd2e5e233946qhuang  IN OUT UINTN                      *BufferSize,
374c1f23d63363d36947e76df61320bdd2e5e233946qhuang  OUT VOID                          *Buffer
375ed66e1bc0d2be0a185fc47adab4930c3b7e2767fvanjeff  );
376c1f23d63363d36947e76df61320bdd2e5e233946qhuang
37749c8b87c66e8034d935ed11673dd8a230e43440avanjeff/**
37849c8b87c66e8034d935ed11673dd8a230e43440avanjeff  DebugPort protocol member function.  Calls SerialIo:Write() after setting
37949c8b87c66e8034d935ed11673dd8a230e43440avanjeff  if it's different than the last SerialIo access.
38049c8b87c66e8034d935ed11673dd8a230e43440avanjeff
38149c8b87c66e8034d935ed11673dd8a230e43440avanjeff  @param  This                Pointer to DebugPort protocol.
38249c8b87c66e8034d935ed11673dd8a230e43440avanjeff
38349c8b87c66e8034d935ed11673dd8a230e43440avanjeff  @retval EFI_SUCCESS         At least 1 character is ready to be read from
38449c8b87c66e8034d935ed11673dd8a230e43440avanjeff                              the DebugPort interface.
38549c8b87c66e8034d935ed11673dd8a230e43440avanjeff  @retval EFI_NOT_READY       There are no characters ready to read from the
38649c8b87c66e8034d935ed11673dd8a230e43440avanjeff                              DebugPort interface
38749c8b87c66e8034d935ed11673dd8a230e43440avanjeff  @retval EFI_DEVICE_ERROR    A hardware failure occured... (from SerialIo)
38849c8b87c66e8034d935ed11673dd8a230e43440avanjeff
38949c8b87c66e8034d935ed11673dd8a230e43440avanjeff**/
390c1f23d63363d36947e76df61320bdd2e5e233946qhuangEFI_STATUS
391c1f23d63363d36947e76df61320bdd2e5e233946qhuangEFIAPI
392c1f23d63363d36947e76df61320bdd2e5e233946qhuangDebugPortPoll (
393c1f23d63363d36947e76df61320bdd2e5e233946qhuang  IN EFI_DEBUGPORT_PROTOCOL         *This
394ed66e1bc0d2be0a185fc47adab4930c3b7e2767fvanjeff  );
395c1f23d63363d36947e76df61320bdd2e5e233946qhuang
396c1f23d63363d36947e76df61320bdd2e5e233946qhuang#endif
397