// Copyright 2016 The Fuchsia Authors
//
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file or at
// https://opensource.org/licenses/MIT

#ifndef ZIRCON_KERNEL_LIB_EFI_INCLUDE_EFI_PROTOCOL_DRIVER_BINDING_H_
#define ZIRCON_KERNEL_LIB_EFI_INCLUDE_EFI_PROTOCOL_DRIVER_BINDING_H_

#include <efi/protocol/device-path.h>
#include <efi/types.h>

#define EFI_DRIVER_BINDING_PROTOCOL_GUID                                           \
  {                                                                                \
    0x18a031ab, 0xb443, 0x4d1a, { 0xa5, 0xc0, 0x0c, 0x09, 0x26, 0x1e, 0x9f, 0x71 } \
  }
extern efi_guid DriverBindingProtocol;

typedef struct efi_driver_binding_protocol {
  efi_status (*Supported)(struct efi_driver_binding_protocol* self, efi_handle controller_handle,
                          efi_device_path_protocol* remaining_path) EFIAPI;

  efi_status (*Start)(struct efi_driver_binding_protocol* self, efi_handle controller_handle,
                      efi_device_path_protocol* remaining_path) EFIAPI;

  efi_status (*Stop)(struct efi_driver_binding_protocol* self, efi_handle controller_handle,
                     size_t num_children, efi_handle* child_handle_buf) EFIAPI;

  uint32_t Version;
  efi_handle ImageHandle;
  efi_handle DriverBindingHandle;
} efi_driver_binding_protocol;

#endif  // ZIRCON_KERNEL_LIB_EFI_INCLUDE_EFI_PROTOCOL_DRIVER_BINDING_H_
