master
c 46 lines 1 KB
Raw
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /*
3 *
4 * FEAT_RME_GDI Feature presence and enabled bits test
5 *
6 * Copyright (c) 2026 Linaro Ltd
7 *
8 */
9
10 #include <stdint.h>
11 #include <minilib.h>
12
13 #define ID_AA64PFR0_EL1 "S3_0_C0_C4_0"
14 #define ID_AA64MMFR4_EL1 "S3_0_C0_C7_4"
15
16 int main()
17 {
18 uint64_t mmfr4;
19 uint64_t pfr0;
20 int rme_status;
21 int rmegdi_status;
22
23 asm("mrs %[pfr0], " ID_AA64PFR0_EL1 "\n\t"
24 : [pfr0] "=r" (pfr0));
25
26 /* rme_status is 1 for RME, 2 for RME + GPC2, 3 for RME+GPC3 */
27 rme_status = (pfr0 >> 52) & 0xF;
28
29 asm("mrs %[mmfr4], " ID_AA64MMFR4_EL1 "\n\t"
30 : [mmfr4] "=r" (mmfr4));
31
32 rmegdi_status = ((mmfr4 >> 28) & 0xF);
33
34 if (rmegdi_status < 1) {
35 ml_printf("SKIP: GDI not implemented\n");
36 return 0;
37 }
38
39 /* Check FEAT_RME and FEAT_RME_GPC2 also present */
40 if (rme_status < 2) {
41 ml_printf("FAIL: GDI is %d, but RME is %d; RME should be >= 2\n",
42 rmegdi_status, rme_status);
43 return 1;
44 }
45 return 0;
46 }