176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** @file
276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  CPU Architectural Protocol as defined in PI spec Volume 2 DXE
376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  This code abstracts the DXE core from processor implementation details.
576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  Copyright (c) 2006 - 2008, Intel Corporation
776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  All rights reserved. This program and the accompanying materials
876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  are licensed and made available under the terms and conditions of the BSD License
976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  which accompanies this distribution.  The full text of the license may be found at
1076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  http://opensource.org/licenses/bsd-license.php
1176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
1276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
1376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
1476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
1576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman**/
1676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
1776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#ifndef __ARCH_PROTOCOL_CPU_H__
1876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define __ARCH_PROTOCOL_CPU_H__
1976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
2076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <gpxe/efi/Protocol/DebugSupport.h>
2176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
2276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EFI_CPU_ARCH_PROTOCOL_GUID \
2376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  { 0x26baccb1, 0x6f42, 0x11d4, {0xbc, 0xe7, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81 } }
2476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
2576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct _EFI_CPU_ARCH_PROTOCOL   EFI_CPU_ARCH_PROTOCOL;
2676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
2776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef enum {
2876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  EfiCpuFlushTypeWriteBackInvalidate,
2976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  EfiCpuFlushTypeWriteBack,
3076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  EfiCpuFlushTypeInvalidate,
3176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  EfiCpuMaxFlushType
3276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} EFI_CPU_FLUSH_TYPE;
3376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
3476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef enum {
3576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  EfiCpuInit,
3676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  EfiCpuMaxInitType
3776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} EFI_CPU_INIT_TYPE;
3876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
3976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/**
4076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  EFI_CPU_INTERRUPT_HANDLER that is called when a processor interrupt occurs.
4176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
4276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @param  InterruptType    Defines the type of interrupt or exception that
4376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                           occurred on the processor.This parameter is processor architecture specific.
4476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @param  SystemContext    A pointer to the processor context when
4576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                           the interrupt occurred on the processor.
4676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
4776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @return None
4876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
4976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman**/
5076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef
5176d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanVOID
5276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman(EFIAPI *EFI_CPU_INTERRUPT_HANDLER)(
5376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  IN CONST  EFI_EXCEPTION_TYPE  InterruptType,
5476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  IN CONST  EFI_SYSTEM_CONTEXT  SystemContext
5576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  );
5676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
5776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/**
5876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  This function flushes the range of addresses from Start to Start+Length
5976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  from the processor's data cache. If Start is not aligned to a cache line
6076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  boundary, then the bytes before Start to the preceding cache line boundary
6176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  are also flushed. If Start+Length is not aligned to a cache line boundary,
6276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  then the bytes past Start+Length to the end of the next cache line boundary
6376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  are also flushed. The FlushType of EfiCpuFlushTypeWriteBackInvalidate must be
6476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  supported. If the data cache is fully coherent with all DMA operations, then
6576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  this function can just return EFI_SUCCESS. If the processor does not support
6676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  flushing a range of the data cache, then the entire data cache can be flushed.
6776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
6876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @param  This             The EFI_CPU_ARCH_PROTOCOL instance.
6976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @param  Start            The beginning physical address to flush from the processor's data
7076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                           cache.
7176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @param  Length           The number of bytes to flush from the processor's data cache. This
7276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                           function may flush more bytes than Length specifies depending upon
7376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                           the granularity of the flush operation that the processor supports.
7476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @param  FlushType        Specifies the type of flush operation to perform.
7576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
7676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @retval EFI_SUCCESS           The address range from Start to Start+Length was flushed from
7776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                                the processor's data cache.
7876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @retval EFI_UNSUPPORTEDT      The processor does not support the cache flush type specified
7976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                                by FlushType.
8076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @retval EFI_DEVICE_ERROR      The address range from Start to Start+Length could not be flushed
8176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                                from the processor's data cache.
8276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
8376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman**/
8476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef
8576d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanEFI_STATUS
8676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman(EFIAPI *EFI_CPU_FLUSH_DATA_CACHE)(
8776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  IN EFI_CPU_ARCH_PROTOCOL              *This,
8876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  IN EFI_PHYSICAL_ADDRESS               Start,
8976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  IN UINT64                             Length,
9076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  IN EFI_CPU_FLUSH_TYPE                 FlushType
9176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  );
9276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
9376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
9476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/**
9576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  This function enables interrupt processing by the processor.
9676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
9776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @param  This             The EFI_CPU_ARCH_PROTOCOL instance.
9876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
9976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @retval EFI_SUCCESS           Interrupts are enabled on the processor.
10076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @retval EFI_DEVICE_ERROR      Interrupts could not be enabled on the processor.
10176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
10276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman**/
10376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef
10476d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanEFI_STATUS
10576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman(EFIAPI *EFI_CPU_ENABLE_INTERRUPT)(
10676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  IN EFI_CPU_ARCH_PROTOCOL              *This
10776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  );
10876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
10976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
11076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/**
11176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  This function disables interrupt processing by the processor.
11276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
11376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @param  This             The EFI_CPU_ARCH_PROTOCOL instance.
11476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
11576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @retval EFI_SUCCESS           Interrupts are disabled on the processor.
11676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @retval EFI_DEVICE_ERROR      Interrupts could not be disabled on the processor.
11776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
11876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman**/
11976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef
12076d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanEFI_STATUS
12176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman(EFIAPI *EFI_CPU_DISABLE_INTERRUPT)(
12276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  IN EFI_CPU_ARCH_PROTOCOL              *This
12376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  );
12476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
12576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
12676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/**
12776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  This function retrieves the processor's current interrupt state a returns it in
12876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  State. If interrupts are currently enabled, then TRUE is returned. If interrupts
12976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  are currently disabled, then FALSE is returned.
13076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
13176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @param  This             The EFI_CPU_ARCH_PROTOCOL instance.
13276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @param  State            A pointer to the processor's current interrupt state. Set to TRUE if
13376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                           interrupts are enabled and FALSE if interrupts are disabled.
13476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
13576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @retval EFI_SUCCESS           The processor's current interrupt state was returned in State.
13676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @retval EFI_INVALID_PARAMETER State is NULL.
13776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
13876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman**/
13976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef
14076d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanEFI_STATUS
14176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman(EFIAPI *EFI_CPU_GET_INTERRUPT_STATE)(
14276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  IN EFI_CPU_ARCH_PROTOCOL              *This,
14376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  OUT BOOLEAN                           *State
14476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  );
14576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
14676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
14776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/**
14876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  This function generates an INIT on the processor. If this function succeeds, then the
14976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  processor will be reset, and control will not be returned to the caller. If InitType is
15076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  not supported by this processor, or the processor cannot programmatically generate an
15176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  INIT without help from external hardware, then EFI_UNSUPPORTED is returned. If an error
15276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  occurs attempting to generate an INIT, then EFI_DEVICE_ERROR is returned.
15376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
15476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @param  This             The EFI_CPU_ARCH_PROTOCOL instance.
15576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @param  InitType         The type of processor INIT to perform.
15676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
15776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @retval EFI_SUCCESS           The processor INIT was performed. This return code should never be seen.
15876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @retval EFI_UNSUPPORTED       The processor INIT operation specified by InitType is not supported
15976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                                by this processor.
16076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @retval EFI_DEVICE_ERROR      The processor INIT failed.
16176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
16276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman**/
16376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef
16476d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanEFI_STATUS
16576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman(EFIAPI *EFI_CPU_INIT)(
16676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  IN EFI_CPU_ARCH_PROTOCOL              *This,
16776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  IN EFI_CPU_INIT_TYPE                  InitType
16876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  );
16976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
17076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
17176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/**
17276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  This function registers and enables the handler specified by InterruptHandler for a processor
17376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  interrupt or exception type specified by InterruptType. If InterruptHandler is NULL, then the
17476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  handler for the processor interrupt or exception type specified by InterruptType is uninstalled.
17576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  The installed handler is called once for each processor interrupt or exception.
17676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
17776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @param  This             The EFI_CPU_ARCH_PROTOCOL instance.
17876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @param  InterruptType    A pointer to the processor's current interrupt state. Set to TRUE if interrupts
17976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                           are enabled and FALSE if interrupts are disabled.
18076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @param  InterruptHandler A pointer to a function of type EFI_CPU_INTERRUPT_HANDLER that is called
18176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                           when a processor interrupt occurs. If this parameter is NULL, then the handler
18276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                           will be uninstalled.
18376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
18476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @retval EFI_SUCCESS           The handler for the processor interrupt was successfully installed or uninstalled.
18576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @retval EFI_ALREADY_STARTED   InterruptHandler is not NULL, and a handler for InterruptType was
18676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                                previously installed.
18776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @retval EFI_INVALID_PARAMETER InterruptHandler is NULL, and a handler for InterruptType was not
18876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                                previously installed.
18976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @retval EFI_UNSUPPORTED       The interrupt specified by InterruptType is not supported.
19076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
19176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman**/
19276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef
19376d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanEFI_STATUS
19476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman(EFIAPI *EFI_CPU_REGISTER_INTERRUPT_HANDLER)(
19576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  IN EFI_CPU_ARCH_PROTOCOL              *This,
19676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  IN EFI_EXCEPTION_TYPE                 InterruptType,
19776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  IN EFI_CPU_INTERRUPT_HANDLER          InterruptHandler
19876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  );
19976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
20076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
20176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/**
20276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  This function reads the processor timer specified by TimerIndex and returns it in TimerValue.
20376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
20476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @param  This             The EFI_CPU_ARCH_PROTOCOL instance.
20576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @param  TimerIndex       Specifies which processor timer is to be returned in TimerValue. This parameter
20676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                           must be between 0 and NumberOfTimers-1.
20776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @param  TimerValue       Pointer to the returned timer value.
20876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @param  TimerPeriod      A pointer to the amount of time that passes in femtoseconds for each increment
20976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                           of TimerValue.
21076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
21176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @retval EFI_SUCCESS           The processor timer value specified by TimerIndex was returned in TimerValue.
21276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @retval EFI_DEVICE_ERROR      An error occurred attempting to read one of the processor's timers.
21376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @retval EFI_INVALID_PARAMETER TimerValue is NULL or TimerIndex is not valid.
21476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @retval EFI_UNSUPPORTED       The processor does not have any readable timers.
21576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
21676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman**/
21776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef
21876d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanEFI_STATUS
21976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman(EFIAPI *EFI_CPU_GET_TIMER_VALUE)(
22076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  IN EFI_CPU_ARCH_PROTOCOL              *This,
22176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  IN UINT32                             TimerIndex,
22276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  OUT UINT64                            *TimerValue,
22376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  OUT UINT64                            *TimerPeriod OPTIONAL
22476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  );
22576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
22676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
22776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/**
22876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  This function modifies the attributes for the memory region specified by BaseAddress and
22976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  Length from their current attributes to the attributes specified by Attributes.
23076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
23176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @param  This             The EFI_CPU_ARCH_PROTOCOL instance.
23276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @param  BaseAddress      The physical address that is the start address of a memory region.
23376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @param  Length           The size in bytes of the memory region.
23476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @param  Attributes       The bit mask of attributes to set for the memory region.
23576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
23676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @retval EFI_SUCCESS           The attributes were set for the memory region.
23776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @retval EFI_ACCESS_DENIED     The attributes for the memory resource range specified by
23876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                                BaseAddress and Length cannot be modified.
23976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @retval EFI_INVALID_PARAMETER Length is zero.
24076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @retval EFI_OUT_OF_RESOURCES  There are not enough system resources to modify the attributes of
24176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                                the memory resource range.
24276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @retval EFI_UNSUPPORTED       The processor does not support one or more bytes of the memory
24376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                                resource range specified by BaseAddress and Length.
24476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                                The bit mask of attributes is not support for the memory resource
24576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                                range specified by BaseAddress and Length.
24676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
24776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman**/
24876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef
24976d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanEFI_STATUS
25076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman(EFIAPI *EFI_CPU_SET_MEMORY_ATTRIBUTES)(
25176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  IN EFI_CPU_ARCH_PROTOCOL              *This,
25276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  IN  EFI_PHYSICAL_ADDRESS              BaseAddress,
25376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  IN  UINT64                            Length,
25476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  IN  UINT64                            Attributes
25576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  );
25676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
25776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
25876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman///
25976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/// The EFI_CPU_ARCH_PROTOCOL is used to abstract processor-specific functions from the DXE
26076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/// Foundation. This includes flushing caches, enabling and disabling interrupts, hooking interrupt
26176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/// vectors and exception vectors, reading internal processor timers, resetting the processor, and
26276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/// determining the processor frequency.
26376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman///
26476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct _EFI_CPU_ARCH_PROTOCOL {
26576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  EFI_CPU_FLUSH_DATA_CACHE            FlushDataCache;
26676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  EFI_CPU_ENABLE_INTERRUPT            EnableInterrupt;
26776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  EFI_CPU_DISABLE_INTERRUPT           DisableInterrupt;
26876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  EFI_CPU_GET_INTERRUPT_STATE         GetInterruptState;
26976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  EFI_CPU_INIT                        Init;
27076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  EFI_CPU_REGISTER_INTERRUPT_HANDLER  RegisterInterruptHandler;
27176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  EFI_CPU_GET_TIMER_VALUE             GetTimerValue;
27276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  EFI_CPU_SET_MEMORY_ATTRIBUTES       SetMemoryAttributes;
27376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  ///
27476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  /// The number of timers that are available in a processor. The value in this
27576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  /// field is a constant that must not be modified after the CPU Architectural
27676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  /// Protocol is installed. All consumers must treat this as a read-only field.
27776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  ///
27876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT32                              NumberOfTimers;
27976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  ///
28076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  /// The size, in bytes, of the alignment required for DMA buffer allocations.
28176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  /// This is typically the size of the largest data cache line in the platform.
28276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  /// The value in this field is a constant that must not be modified after the
28376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  /// CPU Architectural Protocol is installed. All consumers must treat this as
28476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  /// a read-only field.
28576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  ///
28676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT32                              DmaBufferAlignment;
28776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman};
28876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
28976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanextern EFI_GUID gEfiCpuArchProtocolGuid;
29076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
29176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif
292