Home | History | Annotate | Download | only in CpuIo2Dxe
      1 /** @file
      2   Internal include file for the CPU I/O 2 Protocol.
      3 
      4 Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>
      5 This program and the accompanying materials
      6 are licensed and made available under the terms and conditions of the BSD License
      7 which accompanies this distribution.  The full text of the license may be found at
      8 http://opensource.org/licenses/bsd-license.php
      9 
     10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     12 
     13 **/
     14 
     15 #ifndef _CPU_IO2_DXE_H_
     16 #define _CPU_IO2_DXE_H_
     17 
     18 #include <PiDxe.h>
     19 
     20 #include <Protocol/CpuIo2.h>
     21 
     22 #include <Library/BaseLib.h>
     23 #include <Library/DebugLib.h>
     24 #include <Library/IoLib.h>
     25 #include <Library/UefiBootServicesTableLib.h>
     26 
     27 #define MAX_IO_PORT_ADDRESS   0xFFFF
     28 
     29 /**
     30   Reads memory-mapped registers.
     31 
     32   The I/O operations are carried out exactly as requested. The caller is responsible
     33   for satisfying any alignment and I/O width restrictions that a PI System on a
     34   platform might require. For example on some platforms, width requests of
     35   EfiCpuIoWidthUint64 do not work. Misaligned buffers, on the other hand, will
     36   be handled by the driver.
     37 
     38   If Width is EfiCpuIoWidthUint8, EfiCpuIoWidthUint16, EfiCpuIoWidthUint32,
     39   or EfiCpuIoWidthUint64, then both Address and Buffer are incremented for
     40   each of the Count operations that is performed.
     41 
     42   If Width is EfiCpuIoWidthFifoUint8, EfiCpuIoWidthFifoUint16,
     43   EfiCpuIoWidthFifoUint32, or EfiCpuIoWidthFifoUint64, then only Buffer is
     44   incremented for each of the Count operations that is performed. The read or
     45   write operation is performed Count times on the same Address.
     46 
     47   If Width is EfiCpuIoWidthFillUint8, EfiCpuIoWidthFillUint16,
     48   EfiCpuIoWidthFillUint32, or EfiCpuIoWidthFillUint64, then only Address is
     49   incremented for each of the Count operations that is performed. The read or
     50   write operation is performed Count times from the first element of Buffer.
     51 
     52   @param[in]  This     A pointer to the EFI_CPU_IO2_PROTOCOL instance.
     53   @param[in]  Width    Signifies the width of the I/O or Memory operation.
     54   @param[in]  Address  The base address of the I/O operation.
     55   @param[in]  Count    The number of I/O operations to perform. The number of
     56                        bytes moved is Width size * Count, starting at Address.
     57   @param[out] Buffer   For read operations, the destination buffer to store the results.
     58                        For write operations, the source buffer from which to write data.
     59 
     60   @retval EFI_SUCCESS            The data was read from or written to the PI system.
     61   @retval EFI_INVALID_PARAMETER  Width is invalid for this PI system.
     62   @retval EFI_INVALID_PARAMETER  Buffer is NULL.
     63   @retval EFI_UNSUPPORTED        The Buffer is not aligned for the given Width.
     64   @retval EFI_UNSUPPORTED        The address range specified by Address, Width,
     65                                  and Count is not valid for this PI system.
     66 
     67 **/
     68 EFI_STATUS
     69 EFIAPI
     70 CpuMemoryServiceRead (
     71   IN  EFI_CPU_IO2_PROTOCOL       *This,
     72   IN  EFI_CPU_IO_PROTOCOL_WIDTH  Width,
     73   IN  UINT64                     Address,
     74   IN  UINTN                      Count,
     75   OUT VOID                       *Buffer
     76   );
     77 
     78 /**
     79   Writes memory-mapped registers.
     80 
     81   The I/O operations are carried out exactly as requested. The caller is responsible
     82   for satisfying any alignment and I/O width restrictions that a PI System on a
     83   platform might require. For example on some platforms, width requests of
     84   EfiCpuIoWidthUint64 do not work. Misaligned buffers, on the other hand, will
     85   be handled by the driver.
     86 
     87   If Width is EfiCpuIoWidthUint8, EfiCpuIoWidthUint16, EfiCpuIoWidthUint32,
     88   or EfiCpuIoWidthUint64, then both Address and Buffer are incremented for
     89   each of the Count operations that is performed.
     90 
     91   If Width is EfiCpuIoWidthFifoUint8, EfiCpuIoWidthFifoUint16,
     92   EfiCpuIoWidthFifoUint32, or EfiCpuIoWidthFifoUint64, then only Buffer is
     93   incremented for each of the Count operations that is performed. The read or
     94   write operation is performed Count times on the same Address.
     95 
     96   If Width is EfiCpuIoWidthFillUint8, EfiCpuIoWidthFillUint16,
     97   EfiCpuIoWidthFillUint32, or EfiCpuIoWidthFillUint64, then only Address is
     98   incremented for each of the Count operations that is performed. The read or
     99   write operation is performed Count times from the first element of Buffer.
    100 
    101   @param[in]  This     A pointer to the EFI_CPU_IO2_PROTOCOL instance.
    102   @param[in]  Width    Signifies the width of the I/O or Memory operation.
    103   @param[in]  Address  The base address of the I/O operation.
    104   @param[in]  Count    The number of I/O operations to perform. The number of
    105                        bytes moved is Width size * Count, starting at Address.
    106   @param[in]  Buffer   For read operations, the destination buffer to store the results.
    107                        For write operations, the source buffer from which to write data.
    108 
    109   @retval EFI_SUCCESS            The data was read from or written to the PI system.
    110   @retval EFI_INVALID_PARAMETER  Width is invalid for this PI system.
    111   @retval EFI_INVALID_PARAMETER  Buffer is NULL.
    112   @retval EFI_UNSUPPORTED        The Buffer is not aligned for the given Width.
    113   @retval EFI_UNSUPPORTED        The address range specified by Address, Width,
    114                                  and Count is not valid for this PI system.
    115 
    116 **/
    117 EFI_STATUS
    118 EFIAPI
    119 CpuMemoryServiceWrite (
    120   IN EFI_CPU_IO2_PROTOCOL       *This,
    121   IN EFI_CPU_IO_PROTOCOL_WIDTH  Width,
    122   IN UINT64                     Address,
    123   IN UINTN                      Count,
    124   IN VOID                       *Buffer
    125   );
    126 
    127 /**
    128   Reads I/O registers.
    129 
    130   The I/O operations are carried out exactly as requested. The caller is responsible
    131   for satisfying any alignment and I/O width restrictions that a PI System on a
    132   platform might require. For example on some platforms, width requests of
    133   EfiCpuIoWidthUint64 do not work. Misaligned buffers, on the other hand, will
    134   be handled by the driver.
    135 
    136   If Width is EfiCpuIoWidthUint8, EfiCpuIoWidthUint16, EfiCpuIoWidthUint32,
    137   or EfiCpuIoWidthUint64, then both Address and Buffer are incremented for
    138   each of the Count operations that is performed.
    139 
    140   If Width is EfiCpuIoWidthFifoUint8, EfiCpuIoWidthFifoUint16,
    141   EfiCpuIoWidthFifoUint32, or EfiCpuIoWidthFifoUint64, then only Buffer is
    142   incremented for each of the Count operations that is performed. The read or
    143   write operation is performed Count times on the same Address.
    144 
    145   If Width is EfiCpuIoWidthFillUint8, EfiCpuIoWidthFillUint16,
    146   EfiCpuIoWidthFillUint32, or EfiCpuIoWidthFillUint64, then only Address is
    147   incremented for each of the Count operations that is performed. The read or
    148   write operation is performed Count times from the first element of Buffer.
    149 
    150   @param[in]  This     A pointer to the EFI_CPU_IO2_PROTOCOL instance.
    151   @param[in]  Width    Signifies the width of the I/O or Memory operation.
    152   @param[in]  Address  The base address of the I/O operation.
    153   @param[in]  Count    The number of I/O operations to perform. The number of
    154                        bytes moved is Width size * Count, starting at Address.
    155   @param[out] Buffer   For read operations, the destination buffer to store the results.
    156                        For write operations, the source buffer from which to write data.
    157 
    158   @retval EFI_SUCCESS            The data was read from or written to the PI system.
    159   @retval EFI_INVALID_PARAMETER  Width is invalid for this PI system.
    160   @retval EFI_INVALID_PARAMETER  Buffer is NULL.
    161   @retval EFI_UNSUPPORTED        The Buffer is not aligned for the given Width.
    162   @retval EFI_UNSUPPORTED        The address range specified by Address, Width,
    163                                  and Count is not valid for this PI system.
    164 
    165 **/
    166 EFI_STATUS
    167 EFIAPI
    168 CpuIoServiceRead (
    169   IN  EFI_CPU_IO2_PROTOCOL       *This,
    170   IN  EFI_CPU_IO_PROTOCOL_WIDTH  Width,
    171   IN  UINT64                     Address,
    172   IN  UINTN                      Count,
    173   OUT VOID                       *Buffer
    174   );
    175 
    176 /**
    177   Write I/O registers.
    178 
    179   The I/O operations are carried out exactly as requested. The caller is responsible
    180   for satisfying any alignment and I/O width restrictions that a PI System on a
    181   platform might require. For example on some platforms, width requests of
    182   EfiCpuIoWidthUint64 do not work. Misaligned buffers, on the other hand, will
    183   be handled by the driver.
    184 
    185   If Width is EfiCpuIoWidthUint8, EfiCpuIoWidthUint16, EfiCpuIoWidthUint32,
    186   or EfiCpuIoWidthUint64, then both Address and Buffer are incremented for
    187   each of the Count operations that is performed.
    188 
    189   If Width is EfiCpuIoWidthFifoUint8, EfiCpuIoWidthFifoUint16,
    190   EfiCpuIoWidthFifoUint32, or EfiCpuIoWidthFifoUint64, then only Buffer is
    191   incremented for each of the Count operations that is performed. The read or
    192   write operation is performed Count times on the same Address.
    193 
    194   If Width is EfiCpuIoWidthFillUint8, EfiCpuIoWidthFillUint16,
    195   EfiCpuIoWidthFillUint32, or EfiCpuIoWidthFillUint64, then only Address is
    196   incremented for each of the Count operations that is performed. The read or
    197   write operation is performed Count times from the first element of Buffer.
    198 
    199   @param[in]  This     A pointer to the EFI_CPU_IO2_PROTOCOL instance.
    200   @param[in]  Width    Signifies the width of the I/O or Memory operation.
    201   @param[in]  Address  The base address of the I/O operation.
    202   @param[in]  Count    The number of I/O operations to perform. The number of
    203                        bytes moved is Width size * Count, starting at Address.
    204   @param[in]  Buffer   For read operations, the destination buffer to store the results.
    205                        For write operations, the source buffer from which to write data.
    206 
    207   @retval EFI_SUCCESS            The data was read from or written to the PI system.
    208   @retval EFI_INVALID_PARAMETER  Width is invalid for this PI system.
    209   @retval EFI_INVALID_PARAMETER  Buffer is NULL.
    210   @retval EFI_UNSUPPORTED        The Buffer is not aligned for the given Width.
    211   @retval EFI_UNSUPPORTED        The address range specified by Address, Width,
    212                                  and Count is not valid for this PI system.
    213 
    214 **/
    215 EFI_STATUS
    216 EFIAPI
    217 CpuIoServiceWrite (
    218   IN EFI_CPU_IO2_PROTOCOL       *This,
    219   IN EFI_CPU_IO_PROTOCOL_WIDTH  Width,
    220   IN UINT64                     Address,
    221   IN UINTN                      Count,
    222   IN VOID                       *Buffer
    223   );
    224 
    225 #endif
    226