/** @file
  EFI Bluetooth Configuration Protocol as defined in UEFI 2.7.
  This protocol abstracts user interface configuration for Bluetooth device.

  Copyright (c) 2015 - 2018, Intel Corporation. All rights reserved.<BR>
  SPDX-License-Identifier: BSD-2-Clause-Patent

  @par Revision Reference:
  This Protocol is introduced in UEFI Specification 2.7

**/

#pragma once

#include <IndustryStandard/Bluetooth.h>

#define EFI_BLUETOOTH_CONFIG_PROTOCOL_GUID \
  { \
    0x62960cf3, 0x40ff, 0x4263, { 0xa7, 0x7c, 0xdf, 0xde, 0xbd, 0x19, 0x1b, 0x4b } \
  }

typedef struct _EFI_BLUETOOTH_CONFIG_PROTOCOL EFI_BLUETOOTH_CONFIG_PROTOCOL;

typedef UINT32 EFI_BLUETOOTH_CONFIG_REMOTE_DEVICE_STATE_TYPE;
#define EFI_BLUETOOTH_CONFIG_REMOTE_DEVICE_STATE_CONNECTED  0x1
#define EFI_BLUETOOTH_CONFIG_REMOTE_DEVICE_STATE_PAIRED     0x2

///
/// EFI_BLUETOOTH_SCAN_CALLBACK_INFORMATION
///
typedef struct {
  ///
  /// 48bit Bluetooth device address.
  ///
  BLUETOOTH_ADDRESS            BDAddr;
  ///
  /// State of the remote deive
  ///
  UINT8                        RemoteDeviceState;
  ///
  /// Bluetooth ClassOfDevice. See Bluetooth specification for detail.
  ///
  BLUETOOTH_CLASS_OF_DEVICE    ClassOfDevice;
  ///
  /// Remote device name
  ///
  UINT8                        RemoteDeviceName[BLUETOOTH_HCI_COMMAND_LOCAL_READABLE_NAME_MAX_SIZE];
} EFI_BLUETOOTH_SCAN_CALLBACK_INFORMATION;

///
/// EFI_BLUETOOTH_CONFIG_DATA_TYPE
///
typedef enum {
  ///
  /// Local/Remote Bluetooth device name. Data structure is zero terminated CHAR8[].
  ///
  EfiBluetoothConfigDataTypeDeviceName,
  ///
  /// Local/Remote Bluetooth device ClassOfDevice. Data structure is BLUETOOTH_CLASS_OF_DEVICE.
  ///
  EfiBluetoothConfigDataTypeClassOfDevice,
  ///
  /// Remote Bluetooth device state. Data structure is EFI_BLUETOOTH_CONFIG_REMOTE_DEVICE_STATE_TYPE.
  ///
  EfiBluetoothConfigDataTypeRemoteDeviceState, /* Relevant for LE*/
  ///
  /// Local/Remote Bluetooth device SDP information. Data structure is UINT8[].
  ///
  EfiBluetoothConfigDataTypeSdpInfo,
  ///
  /// Local Bluetooth device address. Data structure is BLUETOOTH_ADDRESS.
  ///
  EfiBluetoothConfigDataTypeBDADDR, /* Relevant for LE*/
  ///
  /// Local Bluetooth discoverable state. Data structure is UINT8. (Page scan and/or Inquiry scan)
  ///
  EfiBluetoothConfigDataTypeDiscoverable, /* Relevant for LE*/
  ///
  /// Local Bluetooth controller stored paired device list. Data structure is BLUETOOTH_ADDRESS[].
  ///
  EfiBluetoothConfigDataTypeControllerStoredPairedDeviceList,
  ///
  /// Local available device list. Data structure is BLUETOOTH_ADDRESS[].
  ///
  EfiBluetoothConfigDataTypeAvailableDeviceList,
  EfiBluetoothConfigDataTypeRandomAddress, /* Relevant for LE*/
  EfiBluetoothConfigDataTypeRSSI,          /* Relevant for LE*/
  ///
  /// Advertisement report. Data structure is UNIT8[].
  ///
  EfiBluetoothConfigDataTypeAdvertisementData, /* Relevant for LE*/
  EfiBluetoothConfigDataTypeIoCapability,      /* Relevant for LE*/
  EfiBluetoothConfigDataTypeOOBDataFlag,       /* Relevant for LE*/
  ///
  /// KeyType of Authentication Requirements flag of local
  /// device as UINT8, indicating requested security properties.
  /// See Bluetooth specification 3.H.3.5.1. BIT0: MITM, BIT1:SC.
  ///
  EfiBluetoothConfigDataTypeKeyType,    /* Relevant for LE*/
  EfiBluetoothConfigDataTypeEncKeySize, /* Relevant for LE*/
  EfiBluetoothConfigDataTypeMax,
} EFI_BLUETOOTH_CONFIG_DATA_TYPE;

///
/// EFI_BLUETOOTH_PIN_CALLBACK_TYPE.
///
typedef enum {
  ///
  /// For SSP - passkey entry. Input buffer is Passkey (4 bytes). No output buffer.
  /// See Bluetooth HCI command for detail.
  ///
  EfiBluetoothCallbackTypeUserPasskeyNotification,
  ///
  /// For SSP - just work and numeric comparison. Input buffer is numeric value (4 bytes).
  /// Output buffer is BOOLEAN (1 byte). See Bluetooth HCI command for detail.
  ///
  EfiBluetoothCallbackTypeUserConfirmationRequest,
  ///
  /// For SSP - OOB. See Bluetooth HCI command for detail.
  ///
  EfiBluetoothCallbackTypeOOBDataRequest,
  ///
  /// For legacy paring. No input buffer. Output buffer is PIN code( <= 16 bytes).
  /// See Bluetooth HCI command for detail.
  ///
  EfiBluetoothCallbackTypePinCodeRequest,
  EfiBluetoothCallbackTypeMax
} EFI_BLUETOOTH_PIN_CALLBACK_TYPE;

///
/// EFI_BLUETOOTH_CONNECT_COMPLETE_CALLBACK_TYPE.
///
typedef enum {
  ///
  /// This callback is called when Bluetooth receive Disconnection_Complete event. Input buffer is Event
  /// Parameters of Disconnection_Complete Event defined in Bluetooth specification.
  ///
  EfiBluetoothConnCallbackTypeDisconnected,
  ///
  /// This callback is called when Bluetooth receive Connection_Complete event. Input buffer is Event
  /// Parameters of Connection_Complete Event defined in Bluetooth specification.
  ///
  EfiBluetoothConnCallbackTypeConnected,
  ///
  /// This callback is called when Bluetooth receive Authentication_Complete event. Input buffer is Event
  /// Parameters of Authentication_Complete Event defined in Bluetooth specification.
  ///
  EfiBluetoothConnCallbackTypeAuthenticated,
  ///
  /// This callback is called when Bluetooth receive Encryption_Change event. Input buffer is Event
  /// Parameters of Encryption_Change Event defined in Bluetooth specification.
  ///
  EfiBluetoothConnCallbackTypeEncrypted
} EFI_BLUETOOTH_CONNECT_COMPLETE_CALLBACK_TYPE;

/**
  Initialize Bluetooth host controller and local device.

  @param  This          Pointer to the EFI_BLUETOOTH_CONFIG_PROTOCOL instance.

  @retval EFI_SUCCESS           The Bluetooth host controller and local device is initialized successfully.
  @retval EFI_DEVICE_ERROR      A hardware error occurred trying to initialize the Bluetooth host controller
                                and local device.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_BLUETOOTH_CONFIG_INIT)(
  IN EFI_BLUETOOTH_CONFIG_PROTOCOL  *This
  );

/**
  Callback function, it is called if a Bluetooth device is found during scan process.

  @param  This            Pointer to the EFI_BLUETOOTH_CONFIG_PROTOCOL instance.
  @param  Context         Context passed from scan request.
  @param  CallbackInfo    Data related to scan result. NULL CallbackInfo means scan complete.

  @retval EFI_SUCCESS       The callback function complete successfully.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_BLUETOOTH_CONFIG_SCAN_CALLBACK_FUNCTION)(
  IN EFI_BLUETOOTH_CONFIG_PROTOCOL            *This,
  IN VOID                                     *Context,
  IN EFI_BLUETOOTH_SCAN_CALLBACK_INFORMATION  *CallbackInfo
  );

/**
  Scan Bluetooth device.

  @param  This          Pointer to the EFI_BLUETOOTH_CONFIG_PROTOCOL instance.
  @param  ReScan        If TRUE, a new scan request is submitted no matter there is scan result before.
                        If FALSE and there is scan result, the previous scan result is returned and no scan request
                        is submitted.
  @param  ScanType      Bluetooth scan type, Inquiry and/or Page. See Bluetooth specification for detail.
  @param  Callback      The callback function. This function is called if a Bluetooth device is found during scan
                        process.
  @param  Context       Data passed into Callback function. This is optional parameter and may be NULL.

  @retval EFI_SUCCESS           The Bluetooth scan request is submitted.
  @retval EFI_DEVICE_ERROR      A hardware error occurred trying to scan the Bluetooth device.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_BLUETOOTH_CONFIG_SCAN)(
  IN EFI_BLUETOOTH_CONFIG_PROTOCOL                  *This,
  IN BOOLEAN                                        ReScan,
  IN UINT8                                          ScanType,
  IN EFI_BLUETOOTH_CONFIG_SCAN_CALLBACK_FUNCTION    Callback,
  IN VOID                                           *Context
  );

/**
  Connect a Bluetooth device.

  @param  This          Pointer to the EFI_BLUETOOTH_CONFIG_PROTOCOL instance.
  @param  BD_ADDR       The address of Bluetooth device to be connected.

  @retval EFI_SUCCESS           The Bluetooth device is connected successfully.
  @retval EFI_ALREADY_STARTED   The Bluetooth device is already connected.
  @retval EFI_NOT_FOUND         The Bluetooth device is not found.
  @retval EFI_DEVICE_ERROR      A hardware error occurred trying to connect the Bluetooth device.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_BLUETOOTH_CONFIG_CONNECT)(
  IN EFI_BLUETOOTH_CONFIG_PROTOCOL                  *This,
  IN BLUETOOTH_ADDRESS                              *BD_ADDR
  );

/**
  Disconnect a Bluetooth device.

  @param  This          Pointer to the EFI_BLUETOOTH_CONFIG_PROTOCOL instance.
  @param  BD_ADDR       The address of Bluetooth device to be connected.
  @param  Reason        Bluetooth disconnect reason. See Bluetooth specification for detail.

  @retval EFI_SUCCESS           The Bluetooth device is disconnected successfully.
  @retval EFI_NOT_STARTED       The Bluetooth device is not connected.
  @retval EFI_NOT_FOUND         The Bluetooth device is not found.
  @retval EFI_DEVICE_ERROR      A hardware error occurred trying to disconnect the Bluetooth device.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_BLUETOOTH_CONFIG_DISCONNECT)(
  IN EFI_BLUETOOTH_CONFIG_PROTOCOL                  *This,
  IN BLUETOOTH_ADDRESS                              *BD_ADDR,
  IN UINT8                                          Reason
  );

/**
  Get Bluetooth configuration data.

  @param  This          Pointer to the EFI_BLUETOOTH_CONFIG_PROTOCOL instance.
  @param  DataType      Configuration data type.
  @param  DataSize      On input, indicates the size, in bytes, of the data buffer specified by Data.
                        On output, indicates the amount of data actually returned.
  @param  Data          A pointer to the buffer of data that will be returned.

  @retval EFI_SUCCESS           The Bluetooth configuration data is returned successfully.
  @retval EFI_INVALID_PARAMETER One or more of the following conditions is TRUE:
                                - DataSize is NULL.
                                - *DataSize is not 0 and Data is NULL.
  @retval EFI_UNSUPPORTED       The DataType is unsupported.
  @retval EFI_NOT_FOUND         The DataType is not found.
  @retval EFI_BUFFER_TOO_SMALL  The buffer is too small to hold the buffer.
                                *DataSize has been updated with the size needed to complete the request.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_BLUETOOTH_CONFIG_GET_DATA)(
  IN EFI_BLUETOOTH_CONFIG_PROTOCOL                  *This,
  IN EFI_BLUETOOTH_CONFIG_DATA_TYPE                 DataType,
  IN OUT UINTN                                      *DataSize,
  IN OUT VOID                                       *Data
  );

/**
  Set Bluetooth configuration data.

  @param  This          Pointer to the EFI_BLUETOOTH_CONFIG_PROTOCOL instance.
  @param  DataType      Configuration data type.
  @param  DataSize      Indicates the size, in bytes, of the data buffer specified by Data.
  @param  Data          A pointer to the buffer of data that will be set.

  @retval EFI_SUCCESS           The Bluetooth configuration data is set successfully.
  @retval EFI_INVALID_PARAMETER One or more of the following conditions is TRUE:
                                - DataSize is 0.
                                - Data is NULL.
  @retval EFI_UNSUPPORTED       The DataType is unsupported.
  @retval EFI_BUFFER_TOO_SMALL  Cannot set configuration data.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_BLUETOOTH_CONFIG_SET_DATA)(
  IN EFI_BLUETOOTH_CONFIG_PROTOCOL                  *This,
  IN EFI_BLUETOOTH_CONFIG_DATA_TYPE                 DataType,
  IN UINTN                                          DataSize,
  IN VOID                                           *Data
  );

/**
  Get remove Bluetooth device configuration data.

  @param  This          Pointer to the EFI_BLUETOOTH_CONFIG_PROTOCOL instance.
  @param  DataType      Configuration data type.
  @param  BDAddr        Remote Bluetooth device address.
  @param  DataSize      On input, indicates the size, in bytes, of the data buffer specified by Data.
                        On output, indicates the amount of data actually returned.
  @param  Data          A pointer to the buffer of data that will be returned.

  @retval EFI_SUCCESS           The remote Bluetooth device configuration data is returned successfully.
  @retval EFI_INVALID_PARAMETER One or more of the following conditions is TRUE:
                                - DataSize is NULL.
                                - *DataSize is not 0 and Data is NULL.
  @retval EFI_UNSUPPORTED       The DataType is unsupported.
  @retval EFI_NOT_FOUND         The DataType is not found.
  @retval EFI_BUFFER_TOO_SMALL  The buffer is too small to hold the buffer.
                                *DataSize has been updated with the size needed to complete the request.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_BLUETOOTH_CONFIG_GET_REMOTE_DATA)(
  IN EFI_BLUETOOTH_CONFIG_PROTOCOL                  *This,
  IN EFI_BLUETOOTH_CONFIG_DATA_TYPE                 DataType,
  IN BLUETOOTH_ADDRESS                              *BDAddr,
  IN OUT UINTN                                      *DataSize,
  IN OUT VOID                                       *Data
  );

/**
  The callback function for PIN code.

  @param  This                Pointer to the EFI_BLUETOOTH_CONFIG_PROTOCOL instance.
  @param  Context             Context passed from registration.
  @param  CallbackType        Callback type in EFI_BLUETOOTH_PIN_CALLBACK_TYPE.
  @param  InputBuffer         A pointer to the buffer of data that is input from callback caller.
  @param  InputBufferSize     Indicates the size, in bytes, of the data buffer specified by InputBuffer.
  @param  OutputBuffer        A pointer to the buffer of data that will be output from callback callee.
                              Callee allocates this buffer by using EFI Boot Service AllocatePool().
  @param  OutputBufferSize    Indicates the size, in bytes, of the data buffer specified by OutputBuffer.

  @retval EFI_SUCCESS   The callback function complete successfully.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_BLUETOOTH_CONFIG_REGISTER_PIN_CALLBACK_FUNCTION)(
  IN EFI_BLUETOOTH_CONFIG_PROTOCOL                        *This,
  IN VOID                                                 *Context,
  IN EFI_BLUETOOTH_PIN_CALLBACK_TYPE                      CallbackType,
  IN VOID                                                 *InputBuffer,
  IN UINTN                                                InputBufferSize,
  OUT VOID                                                **OutputBuffer,
  OUT UINTN                                               *OutputBufferSize
  );

/**
  Register PIN callback function.

  @param  This          Pointer to the EFI_BLUETOOTH_CONFIG_PROTOCOL instance.
  @param  Callback      The callback function. NULL means unregister.
  @param  Context       Data passed into Callback function. This is optional parameter and may be NULL.

  @retval EFI_SUCCESS   The PIN callback function is registered successfully.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_BLUETOOTH_CONFIG_REGISTER_PIN_CALLBACK)(
  IN EFI_BLUETOOTH_CONFIG_PROTOCOL                        *This,
  IN EFI_BLUETOOTH_CONFIG_REGISTER_PIN_CALLBACK_FUNCTION  Callback,
  IN VOID                                                 *Context
  );

/**
  The callback function to get link key.

  @param  This                Pointer to the EFI_BLUETOOTH_CONFIG_PROTOCOL instance.
  @param  Context             Context passed from registration.
  @param  BDAddr              A pointer to Bluetooth device address.
  @param  LinkKey             A pointer to the buffer of link key.

  @retval EFI_SUCCESS   The callback function complete successfully.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_BLUETOOTH_CONFIG_REGISTER_GET_LINK_KEY_CALLBACK_FUNCTION)(
  IN EFI_BLUETOOTH_CONFIG_PROTOCOL        *This,
  IN VOID                                 *Context,
  IN BLUETOOTH_ADDRESS                    *BDAddr,
  OUT UINT8                               LinkKey[BLUETOOTH_HCI_LINK_KEY_SIZE]
  );

/**
  Register get link key callback function.

  @param  This          Pointer to the EFI_BLUETOOTH_CONFIG_PROTOCOL instance.
  @param  Callback      The callback function. NULL means unregister.
  @param  Context       Data passed into Callback function. This is optional parameter and may be NULL.

  @retval EFI_SUCCESS   The link key callback function is registered successfully.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_BLUETOOTH_CONFIG_REGISTER_GET_LINK_KEY_CALLBACK)(
  IN EFI_BLUETOOTH_CONFIG_PROTOCOL                                  *This,
  IN EFI_BLUETOOTH_CONFIG_REGISTER_GET_LINK_KEY_CALLBACK_FUNCTION   Callback,
  IN VOID                                                           *Context
  );

/**
  The callback function to set link key.

  @param  This                Pointer to the EFI_BLUETOOTH_CONFIG_PROTOCOL instance.
  @param  Context             Context passed from registration.
  @param  BDAddr              A pointer to Bluetooth device address.
  @param  LinkKey             A pointer to the buffer of link key.

  @retval EFI_SUCCESS   The callback function complete successfully.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_BLUETOOTH_CONFIG_REGISTER_SET_LINK_KEY_CALLBACK_FUNCTION)(
  IN EFI_BLUETOOTH_CONFIG_PROTOCOL        *This,
  IN VOID                                 *Context,
  IN BLUETOOTH_ADDRESS                    *BDAddr,
  IN UINT8                                LinkKey[BLUETOOTH_HCI_LINK_KEY_SIZE]
  );

/**
  Register set link key callback function.

  @param  This          Pointer to the EFI_BLUETOOTH_CONFIG_PROTOCOL instance.
  @param  Callback      The callback function. NULL means unregister.
  @param  Context       Data passed into Callback function. This is optional parameter and may be NULL.

  @retval EFI_SUCCESS   The link key callback function is registered successfully.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_BLUETOOTH_CONFIG_REGISTER_SET_LINK_KEY_CALLBACK)(
  IN EFI_BLUETOOTH_CONFIG_PROTOCOL                                  *This,
  IN EFI_BLUETOOTH_CONFIG_REGISTER_SET_LINK_KEY_CALLBACK_FUNCTION   Callback,
  IN VOID                                                           *Context
  );

/**
  The callback function. It is called after connect completed.

  @param  This                Pointer to the EFI_BLUETOOTH_CONFIG_PROTOCOL instance.
  @param  Context             Context passed from registration.
  @param  CallbackType        Callback type in EFI_BLUETOOTH_CONNECT_COMPLETE_CALLBACK_TYPE.
  @param  BDAddr              A pointer to Bluetooth device address.
  @param  InputBuffer         A pointer to the buffer of data that is input from callback caller.
  @param  InputBufferSize     Indicates the size, in bytes, of the data buffer specified by InputBuffer.

  @retval EFI_SUCCESS   The callback function complete successfully.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_BLUETOOTH_CONFIG_REGISTER_CONNECT_COMPLETE_CALLBACK_FUNCTION)(
  IN EFI_BLUETOOTH_CONFIG_PROTOCOL                  *This,
  IN VOID                                           *Context,
  IN EFI_BLUETOOTH_CONNECT_COMPLETE_CALLBACK_TYPE   CallbackType,
  IN BLUETOOTH_ADDRESS                              *BDAddr,
  IN VOID                                           *InputBuffer,
  IN UINTN                                          InputBufferSize
  );

/**
  Register link connect complete callback function.

  @param  This          Pointer to the EFI_BLUETOOTH_CONFIG_PROTOCOL instance.
  @param  Callback      The callback function. NULL means unregister.
  @param  Context       Data passed into Callback function. This is optional parameter and may be NULL.

  @retval EFI_SUCCESS   The link connect complete callback function is registered successfully.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_BLUETOOTH_CONFIG_REGISTER_CONNECT_COMPLETE_CALLBACK)(
  IN EFI_BLUETOOTH_CONFIG_PROTOCOL                                      *This,
  IN EFI_BLUETOOTH_CONFIG_REGISTER_CONNECT_COMPLETE_CALLBACK_FUNCTION   Callback,
  IN VOID                                                               *Context
  );

///
/// This protocol abstracts user interface configuration for Bluetooth device.
///
struct _EFI_BLUETOOTH_CONFIG_PROTOCOL {
  EFI_BLUETOOTH_CONFIG_INIT                                  Init;
  EFI_BLUETOOTH_CONFIG_SCAN                                  Scan;
  EFI_BLUETOOTH_CONFIG_CONNECT                               Connect;
  EFI_BLUETOOTH_CONFIG_DISCONNECT                            Disconnect;
  EFI_BLUETOOTH_CONFIG_GET_DATA                              GetData;
  EFI_BLUETOOTH_CONFIG_SET_DATA                              SetData;
  EFI_BLUETOOTH_CONFIG_GET_REMOTE_DATA                       GetRemoteData;
  EFI_BLUETOOTH_CONFIG_REGISTER_PIN_CALLBACK                 RegisterPinCallback;
  EFI_BLUETOOTH_CONFIG_REGISTER_GET_LINK_KEY_CALLBACK        RegisterGetLinkKeyCallback;
  EFI_BLUETOOTH_CONFIG_REGISTER_SET_LINK_KEY_CALLBACK        RegisterSetLinkKeyCallback;
  EFI_BLUETOOTH_CONFIG_REGISTER_CONNECT_COMPLETE_CALLBACK    RegisterLinkConnectCompleteCallback;
};

extern EFI_GUID  gEfiBluetoothConfigProtocolGuid;
