/** @file
  Protocol to describe devices that are not on a discoverable bus

  Copyright (c) 2016, Linaro, Ltd. All rights reserved.<BR>

  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.

**/

#ifndef __NON_DISCOVERABLE_DEVICE_H__
#define __NON_DISCOVERABLE_DEVICE_H__

#include <IndustryStandard/Acpi.h>

#define EDKII_NON_DISCOVERABLE_DEVICE_PROTOCOL_GUID \
  { 0x0d51905b, 0xb77e, 0x452a, {0xa2, 0xc0, 0xec, 0xa0, 0xcc, 0x8d, 0x51, 0x4a } }

//
// Protocol interface structure
//
typedef struct _NON_DISCOVERABLE_DEVICE NON_DISCOVERABLE_DEVICE;

//
// Data Types
//
typedef enum {
  NonDiscoverableDeviceDmaTypeCoherent,
  NonDiscoverableDeviceDmaTypeNonCoherent,
  NonDiscoverableDeviceDmaTypeMax,
} NON_DISCOVERABLE_DEVICE_DMA_TYPE;

//
// Function Prototypes
//

/**
  Perform device specific initialization before the device is started

  @param  This          The non-discoverable device protocol pointer

  @retval EFI_SUCCESS   Initialization successful, the device may be used
  @retval Other         Initialization failed, device should not be started
**/
typedef
EFI_STATUS
(EFIAPI *NON_DISCOVERABLE_DEVICE_INIT) (
  IN  NON_DISCOVERABLE_DEVICE       *This
  );

struct _NON_DISCOVERABLE_DEVICE {
  //
  // The type of device
  //
  CONST EFI_GUID                      *Type;
  //
  // Whether this device is DMA coherent
  //
  NON_DISCOVERABLE_DEVICE_DMA_TYPE    DmaType;
  //
  // Initialization function for the device
  //
  NON_DISCOVERABLE_DEVICE_INIT        Initialize;
  //
  // The MMIO and I/O regions owned by the device
  //
  EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR   *Resources;
};

extern EFI_GUID gEdkiiNonDiscoverableDeviceProtocolGuid;

#endif
