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