1d72c486bSLucian Paul-Trifu /* 2d72c486bSLucian Paul-Trifu * Copyright (c) 2022, Arm Limited. All rights reserved. 3d72c486bSLucian Paul-Trifu * 4d72c486bSLucian Paul-Trifu * SPDX-License-Identifier: BSD-3-Clause 5d72c486bSLucian Paul-Trifu */ 6d72c486bSLucian Paul-Trifu 7d72c486bSLucian Paul-Trifu #include <stdbool.h> 8d72c486bSLucian Paul-Trifu #include <stddef.h> 9d72c486bSLucian Paul-Trifu 10d72c486bSLucian Paul-Trifu #include <drivers/arm/smmu_v3.h> 11d72c486bSLucian Paul-Trifu #include <lib/utils_def.h> 12d72c486bSLucian Paul-Trifu #include <plat/arm/common/arm_config.h> 13d72c486bSLucian Paul-Trifu #include <plat/common/platform.h> 14d72c486bSLucian Paul-Trifu 15d72c486bSLucian Paul-Trifu #include <platform_def.h> 16d72c486bSLucian Paul-Trifu 17d72c486bSLucian Paul-Trifu /** 18d72c486bSLucian Paul-Trifu * Array mentioning number of SMMUs supported by FVP 19d72c486bSLucian Paul-Trifu */ 20d72c486bSLucian Paul-Trifu static const uintptr_t fvp_smmus[] = { 21d72c486bSLucian Paul-Trifu PLAT_FVP_SMMUV3_BASE, 22d72c486bSLucian Paul-Trifu }; 23d72c486bSLucian Paul-Trifu plat_has_non_host_platforms(void)24d72c486bSLucian Paul-Trifubool plat_has_non_host_platforms(void) 25d72c486bSLucian Paul-Trifu { 26d72c486bSLucian Paul-Trifu /* FVP base platforms typically have GPU, as per FVP Reference guide */ 27d72c486bSLucian Paul-Trifu return true; 28d72c486bSLucian Paul-Trifu } 29d72c486bSLucian Paul-Trifu plat_has_unmanaged_dma_peripherals(void)30d72c486bSLucian Paul-Trifubool plat_has_unmanaged_dma_peripherals(void) 31d72c486bSLucian Paul-Trifu { 32d72c486bSLucian Paul-Trifu /* 33d72c486bSLucian Paul-Trifu * FVP Reference guide does not show devices that are described as 34d72c486bSLucian Paul-Trifu * DMA-capable but not managed by an SMMU in the FVP documentation. 35d72c486bSLucian Paul-Trifu * However, the SMMU seems to have only been introduced in the RevC 36d72c486bSLucian Paul-Trifu * revision. 37d72c486bSLucian Paul-Trifu */ 38d72c486bSLucian Paul-Trifu return (arm_config.flags & ARM_CONFIG_FVP_HAS_SMMUV3) == 0; 39d72c486bSLucian Paul-Trifu } 40d72c486bSLucian Paul-Trifu plat_get_total_smmus(void)41d72c486bSLucian Paul-Trifuunsigned int plat_get_total_smmus(void) 42d72c486bSLucian Paul-Trifu { 43d72c486bSLucian Paul-Trifu if ((arm_config.flags & ARM_CONFIG_FVP_HAS_SMMUV3) != 0U) { 44d72c486bSLucian Paul-Trifu return ARRAY_SIZE(fvp_smmus); 45d72c486bSLucian Paul-Trifu } else { 46d72c486bSLucian Paul-Trifu return 0; 47d72c486bSLucian Paul-Trifu } 48d72c486bSLucian Paul-Trifu } 49d72c486bSLucian Paul-Trifu plat_enumerate_smmus(const uintptr_t ** smmus_out,size_t * smmu_count_out)50d72c486bSLucian Paul-Trifuvoid plat_enumerate_smmus(const uintptr_t **smmus_out, 51d72c486bSLucian Paul-Trifu size_t *smmu_count_out) 52d72c486bSLucian Paul-Trifu { 53d72c486bSLucian Paul-Trifu if ((arm_config.flags & ARM_CONFIG_FVP_HAS_SMMUV3) != 0U) { 54d72c486bSLucian Paul-Trifu *smmus_out = fvp_smmus; 55d72c486bSLucian Paul-Trifu *smmu_count_out = ARRAY_SIZE(fvp_smmus); 56d72c486bSLucian Paul-Trifu } else { 57d72c486bSLucian Paul-Trifu *smmus_out = NULL; 58d72c486bSLucian Paul-Trifu *smmu_count_out = 0; 59d72c486bSLucian Paul-Trifu } 60d72c486bSLucian Paul-Trifu } 61*2a1cdee4Sjohpow01 62*2a1cdee4Sjohpow01 /* DRTM DMA Protection Features */ 63*2a1cdee4Sjohpow01 static const plat_drtm_dma_prot_features_t dma_prot_features = { 64*2a1cdee4Sjohpow01 .max_num_mem_prot_regions = 0, /* No protection regions are present */ 65*2a1cdee4Sjohpow01 .dma_protection_support = 0x1 /* Complete DMA protection only */ 66*2a1cdee4Sjohpow01 }; 67*2a1cdee4Sjohpow01 plat_drtm_get_dma_prot_features(void)68*2a1cdee4Sjohpow01const plat_drtm_dma_prot_features_t *plat_drtm_get_dma_prot_features(void) 69*2a1cdee4Sjohpow01 { 70*2a1cdee4Sjohpow01 return &dma_prot_features; 71*2a1cdee4Sjohpow01 } 72*2a1cdee4Sjohpow01 plat_drtm_dma_prot_get_max_table_bytes(void)73*2a1cdee4Sjohpow01uint64_t plat_drtm_dma_prot_get_max_table_bytes(void) 74*2a1cdee4Sjohpow01 { 75*2a1cdee4Sjohpow01 return 0U; 76*2a1cdee4Sjohpow01 } 77