1*d54792bdSManish V Badarkhe /* 2*d54792bdSManish V Badarkhe * Copyright (c) 2022 Arm Limited. All rights reserved. 3*d54792bdSManish V Badarkhe * 4*d54792bdSManish V Badarkhe * SPDX-License-Identifier: BSD-3-Clause 5*d54792bdSManish V Badarkhe * 6*d54792bdSManish V Badarkhe * DRTM DMA protection. 7*d54792bdSManish V Badarkhe * 8*d54792bdSManish V Badarkhe * Authors: 9*d54792bdSManish V Badarkhe * Lucian Paul-Trifu <lucian.paultrifu@gmail.com> 10*d54792bdSManish V Badarkhe * 11*d54792bdSManish V Badarkhe */ 12*d54792bdSManish V Badarkhe 13*d54792bdSManish V Badarkhe #include <stdint.h> 14*d54792bdSManish V Badarkhe #include <string.h> 15*d54792bdSManish V Badarkhe 16*d54792bdSManish V Badarkhe #include <common/debug.h> 17*d54792bdSManish V Badarkhe 18*d54792bdSManish V Badarkhe #include "drtm_dma_prot.h" 19*d54792bdSManish V Badarkhe #include <plat/common/platform.h> 20*d54792bdSManish V Badarkhe 21*d54792bdSManish V Badarkhe /* 22*d54792bdSManish V Badarkhe * This function checks that platform supports complete DMA protection. 23*d54792bdSManish V Badarkhe * and returns false - if the platform supports complete DMA protection. 24*d54792bdSManish V Badarkhe * and returns true - if the platform does not support complete DMA protection. 25*d54792bdSManish V Badarkhe */ 26*d54792bdSManish V Badarkhe bool drtm_dma_prot_init(void) 27*d54792bdSManish V Badarkhe { 28*d54792bdSManish V Badarkhe bool must_init_fail = false; 29*d54792bdSManish V Badarkhe const uintptr_t *smmus; 30*d54792bdSManish V Badarkhe size_t num_smmus = 0; 31*d54792bdSManish V Badarkhe unsigned int total_smmus; 32*d54792bdSManish V Badarkhe 33*d54792bdSManish V Badarkhe /* Warns presence of non-host platforms */ 34*d54792bdSManish V Badarkhe if (plat_has_non_host_platforms()) { 35*d54792bdSManish V Badarkhe WARN("DRTM: the platform includes trusted DMA-capable devices" 36*d54792bdSManish V Badarkhe " (non-host platforms)\n"); 37*d54792bdSManish V Badarkhe } 38*d54792bdSManish V Badarkhe 39*d54792bdSManish V Badarkhe /* 40*d54792bdSManish V Badarkhe * DLME protection is uncertain on platforms with peripherals whose 41*d54792bdSManish V Badarkhe * DMA is not managed by an SMMU. DRTM doesn't work on such platforms. 42*d54792bdSManish V Badarkhe */ 43*d54792bdSManish V Badarkhe if (plat_has_unmanaged_dma_peripherals()) { 44*d54792bdSManish V Badarkhe ERROR("DRTM: this platform does not provide DMA protection\n"); 45*d54792bdSManish V Badarkhe must_init_fail = true; 46*d54792bdSManish V Badarkhe } 47*d54792bdSManish V Badarkhe 48*d54792bdSManish V Badarkhe /* 49*d54792bdSManish V Badarkhe * Check that the platform reported all SMMUs. 50*d54792bdSManish V Badarkhe * It is acceptable if the platform doesn't have any SMMUs when it 51*d54792bdSManish V Badarkhe * doesn't have any DMA-capable devices. 52*d54792bdSManish V Badarkhe */ 53*d54792bdSManish V Badarkhe total_smmus = plat_get_total_smmus(); 54*d54792bdSManish V Badarkhe plat_enumerate_smmus(&smmus, &num_smmus); 55*d54792bdSManish V Badarkhe if (num_smmus != total_smmus) { 56*d54792bdSManish V Badarkhe ERROR("DRTM: could not discover all SMMUs\n"); 57*d54792bdSManish V Badarkhe must_init_fail = true; 58*d54792bdSManish V Badarkhe } 59*d54792bdSManish V Badarkhe 60*d54792bdSManish V Badarkhe return must_init_fail; 61*d54792bdSManish V Badarkhe } 62