xref: /rk3399_ARM-atf/services/std_svc/drtm/drtm_dma_prot.c (revision d54792bd93f76b943bf0559c8373b898e0e3b93c)
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