/*++

  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
                                                                                   

  SPDX-License-Identifier: BSD-2-Clause-Patent

                                                                                   


**/

#ifndef __MMIO_DEVICE_H__
#define __MMIO_DEVICE_H__

//
// Protocol to define for the MMIO device
//
typedef struct {
  //
  // Address of a GUID
  //
  EFI_GUID *Guid;

  //
  // Context for the protocol
  //
  VOID *Context;
} EFI_MMIO_DEVICE_PROTOCOL_ITEM;


typedef struct _EFI_MMIO_DEVICE_PROTOCOL  EFI_MMIO_DEVICE_PROTOCOL;

//
//  The MMIO device protocol defines a memory mapped I/O device
//  for use by the system.
//
struct _EFI_MMIO_DEVICE_PROTOCOL {
  //
  // Pointer to an ACPI_EXTENDED_HID_DEVICE_PATH structure
  // containing HID/HidStr and CID/CidStr values.
  //
  // See the note below associated with the UnitIdentification
  // field.
  //
  CONST ACPI_EXTENDED_HID_DEVICE_PATH *AcpiPath;

  //
  // Allow the use of a shared template for the AcpiPath.
  //
  // If this value is non-zero UID value then the AcpiPath must
  // be a template which contains only the HID/HidStr and CID/CidStr
  // values.  The UID/UidStr values in the AcpiPath must be zero!
  //
  // If this value is zero then the AcpiPath is not shared and
  // must contain either a non-zero UID value or a UidStr value.
  //
  UINT32 UnitIdentification;

  //
  // Hardware revision - ACPI _HRV value
  //
  UINT32 HardwareRevision;

  //
  // Pointer to a data structure containing the controller
  // resources and configuration.  At a minimum this points
  // to an EFI_PHYSICAL_ADDRESS for the base address of the
  // MMIO device.
  //
  CONST VOID *DriverResources;

  //
  // Number of protocols in the array
  //
  UINTN ProtocolCount;

  //
  // List of protocols to define
  //
  CONST EFI_MMIO_DEVICE_PROTOCOL_ITEM *ProtocolArray;
};

extern EFI_GUID gEfiMmioDeviceProtocolGuid;

#endif  //  __MMIO_DEVICE_H__
