Home | History | Annotate | Download | only in AArch64
      1 /** @file
      2 
      3   Copyright (c) 2014-2015, ARM Ltd. All rights reserved.
      4 
      5   This program and the accompanying materials are licensed and made available
      6   under the terms and conditions of the BSD License which accompanies this
      7   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, WITHOUT
     11   WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     12 
     13 **/
     14 
     15 #include "ArmVExpressInternal.h"
     16 #include <Library/ArmGicLib.h>
     17 
     18 //
     19 // Description of the AARCH64 model platforms :
     20 // Platform ids are defined in ArmVExpressInternal.h for
     21 // all "ArmVExpress-like" platforms (AARCH64 or ARM architecture,
     22 // model or hardware platforms).
     23 //
     24 CONST ARM_VEXPRESS_PLATFORM ArmVExpressPlatforms[] = {
     25   { ARM_FVP_VEXPRESS_AEMv8x4,                  FixedPcdGetPtr (PcdFdtFvpVExpressAEMv8x4),        L"rtsm_ve-aemv8a.dtb"                  },
     26   { ARM_FVP_BASE_AEMv8x4_AEMv8x4_GICV2,        FixedPcdGetPtr (PcdFdtFvpBaseAEMv8x4GicV2),       L"fvp-base-gicv2-psci.dtb"             },
     27   { ARM_FVP_BASE_AEMv8x4_AEMv8x4_GICV2_LEGACY, FixedPcdGetPtr (PcdFdtFvpBaseAEMv8x4GicV2Legacy), L"fvp-base-gicv2legacy-psci.dtb"       },
     28   { ARM_FVP_BASE_AEMv8x4_AEMv8x4_GICV3,        FixedPcdGetPtr (PcdFdtFvpBaseAEMv8x4GicV3),       L"fvp-base-gicv3-psci.dtb"             },
     29   { ARM_FVP_FOUNDATION_GICV2,                  FixedPcdGetPtr (PcdFdtFvpFoundationGicV2),        L"fvp-foundation-gicv2-psci.dtb"       },
     30   { ARM_FVP_FOUNDATION_GICV2_LEGACY,           FixedPcdGetPtr (PcdFdtFvpFoundationGicV2Legacy),  L"fvp-foundation-gicv2legacy-psci.dtb" },
     31   { ARM_FVP_FOUNDATION_GICV3,                  FixedPcdGetPtr (PcdFdtFvpFoundationGicV3),        L"fvp-foundation-gicv3-psci.dtb"       },
     32   { ARM_FVP_VEXPRESS_UNKNOWN }
     33 };
     34 
     35 /**
     36   Get information about the VExpress platform the firmware is running on.
     37 
     38   @param[out]  Platform   Address where the pointer to the platform information
     39                           (type ARM_VEXPRESS_PLATFORM*) should be stored.
     40                           The returned pointer does not point to an allocated
     41                           memory area.
     42 
     43   @retval  EFI_SUCCESS    The platform information was returned.
     44   @retval  EFI_NOT_FOUND  The platform was not recognised.
     45 
     46 **/
     47 EFI_STATUS
     48 ArmVExpressGetPlatform (
     49   OUT CONST ARM_VEXPRESS_PLATFORM** Platform
     50   )
     51 {
     52   EFI_STATUS            Status;
     53   UINT32                SysId;
     54   UINT32                FvpSysId;
     55   UINT32                VariantSysId;
     56   ARM_GIC_ARCH_REVISION GicRevision;
     57 
     58   ASSERT (Platform != NULL);
     59 
     60   Status = EFI_NOT_FOUND;
     61 
     62   SysId = MmioRead32 (ARM_VE_SYS_ID_REG);
     63   if (SysId != ARM_RTSM_SYS_ID) {
     64     // Remove the GIC variant to identify if we are running on the FVP Base or
     65     // Foundation models
     66     FvpSysId     = SysId & (ARM_FVP_SYS_ID_HBI_MASK |
     67                             ARM_FVP_SYS_ID_PLAT_MASK );
     68     // Extract the variant from the SysId
     69     VariantSysId = SysId & ARM_FVP_SYS_ID_VARIANT_MASK;
     70 
     71     if (FvpSysId == ARM_FVP_BASE_BOARD_SYS_ID) {
     72       if (VariantSysId == ARM_FVP_GIC_VE_MMAP) {
     73         // FVP Base Model with legacy GIC memory map
     74         Status = ArmVExpressGetPlatformFromId (ARM_FVP_BASE_AEMv8x4_AEMv8x4_GICV2_LEGACY, Platform);
     75       } else {
     76         GicRevision = ArmGicGetSupportedArchRevision ();
     77 
     78         if (GicRevision == ARM_GIC_ARCH_REVISION_2) {
     79           // FVP Base Model with GICv2 support
     80           Status = ArmVExpressGetPlatformFromId (ARM_FVP_BASE_AEMv8x4_AEMv8x4_GICV2, Platform);
     81         } else {
     82           // FVP Base Model with GICv3 support
     83           Status = ArmVExpressGetPlatformFromId (ARM_FVP_BASE_AEMv8x4_AEMv8x4_GICV3, Platform);
     84         }
     85       }
     86     } else if (FvpSysId == ARM_FVP_FOUNDATION_BOARD_SYS_ID) {
     87       if (VariantSysId == ARM_FVP_GIC_VE_MMAP) {
     88         // FVP Foundation Model with legacy GIC memory map
     89         Status = ArmVExpressGetPlatformFromId (ARM_FVP_FOUNDATION_GICV2_LEGACY, Platform);
     90       } else {
     91         GicRevision = ArmGicGetSupportedArchRevision ();
     92 
     93         if (GicRevision == ARM_GIC_ARCH_REVISION_2) {
     94           // FVP Foundation Model with GICv2
     95           Status = ArmVExpressGetPlatformFromId (ARM_FVP_FOUNDATION_GICV2, Platform);
     96         } else {
     97           // FVP Foundation Model with GICv3
     98           Status = ArmVExpressGetPlatformFromId (ARM_FVP_FOUNDATION_GICV3, Platform);
     99         }
    100       }
    101     }
    102   } else {
    103     // FVP Versatile Express AEMv8
    104     Status = ArmVExpressGetPlatformFromId (ARM_FVP_VEXPRESS_AEMv8x4, Platform);
    105   }
    106 
    107   if (EFI_ERROR (Status)) {
    108     DEBUG ((EFI_D_ERROR, "Unsupported AArch64 RTSM (SysId:0x%X).\n", SysId));
    109     ASSERT_EFI_ERROR (Status);
    110   }
    111 
    112   return Status;
    113 }
    114