cortex_a/registers/
id_aa64mmfr2_el1.rs

1// SPDX-License-Identifier: Apache-2.0 OR MIT
2//
3// Copyright (c) 2018-2022 by the author(s)
4//
5// Author(s):
6//   - Valentin B. <valentin.be@protonmail.com>
7
8//! AArch64 Memory Model Feature Register 2 - EL1
9//!
10//! Provides information about the implemented memory model and memory
11//! management support in AArch64 state.
12
13use tock_registers::{interfaces::Readable, register_bitfields};
14
15register_bitfields! {u64,
16    pub ID_AA64MMFR2_EL1 [
17        /// Indicates support for the E0PD mechanism.
18        E0PD OFFSET(60) NUMBITS(4) [],
19
20        /// Enhanced Virtualization Traps.
21        ///
22        /// If EL2 is implemented, indicates support for the
23        /// HCR_EL2.{TTLBOS, TTLBIS, TOCU, TICAB, TID4} traps.
24        EVT OFFSET(56) NUMBITS(4) [
25            /// None of the aforementioned traps are supported.
26            Nothing = 0b0000,
27            /// All aforementioned traps but the HCR_EL2.{TTLBOS, TTLBBIS}
28            /// ones are supported.
29            NoTtl = 0b0001,
30            /// All the aforementioned HCR_EL2 traps are supported.
31            Everything = 0b0010
32        ],
33
34        /// Allows identification of the requirements of the hardware to have
35        /// break-before-make sequences when changing block size for a translation.
36        BBM OFFSET(52) NUMBITS(4) [
37            /// Level 0 support for changing block size is supported.
38            Level0 = 0b0000,
39            /// Level 1 support for changing block size is supported.
40            Level1 = 0b0001,
41            /// Level 2 support for changing block size is supported.
42            Level2 = 0b0010
43        ],
44
45        /// Indicates support for TTL field in address operations.
46        TTL OFFSET(48) NUMBITS(4) [],
47
48        /// Indicates support for HCR_EL2.FWB.
49        FWB OFFSET(40) NUMBITS(4) [],
50
51        /// Indicates the value of ESR_ELx.EC that reports an exception generated by
52        /// a read access to the feature ID space.
53        ///
54        /// - When reading 0, only read access exceptions other than HCR_EL2.TIDx,
55        /// SCTLR_EL1.UCT, or SCTLR_EL2.UCT traps are reported by ESR_ELx.EC == 0.
56        ///
57        /// - When reading 1, all read access exceptions are reported by ESR_ELx.EC == 0x18.
58        IDS OFFSET(36) NUMBITS(4) [],
59
60        /// Identifies support for unaligned single-copy atomicity and atomic functions.
61        AT OFFSET(32) NUMBITS(4) [],
62
63        /// Identifies support for small translation tables.
64        ST OFFSET(28) NUMBITS(4) [],
65
66        /// If EL2 is implemented, indicates support for the use of nested virtualization.
67        NV OFFSET(24) NUMBITS(4) [
68            /// Nested virtualization is not supported.
69            Unsupported = 0b0000,
70            /// The HCR_EL2.{AT, NV1, NV} bits are implemented.
71            Partial = 0b001,
72            /// The VNCR_EL2 register and the HCR_EL2.{NV2, AT, NV1, NV} bits are implemented.
73            Full = 0b0010
74        ],
75
76        /// Support for the use of revised `CCSIDR_EL1` register format.
77        CCIDX OFFSET(20) NUMBITS(4) [],
78
79        /// Indicates support for a larger virtual address.
80        ///
81        /// When this reads 1, 52-bit VAs when using the 64KB translation granule are
82        /// supported along with the standard 48-bit VAs.
83        VARange OFFSET(16) NUMBITS(4) [],
84
85        /// Indicates support for the IESB bit in the SCTLR_ELx registers.
86        IESB OFFSET(12) NUMBITS(4) [],
87
88        /// Indicates support for LSMAOE and nTLSMD bits in SCTLR_EL1 and SCTLR_EL2.
89        LSM OFFSET(8) NUMBITS(4) [],
90
91        /// Indicates support for User Access Overrides.
92        UAO OFFSET(4) NUMBITS(4) [],
93
94        /// Indicates support for Common not Private translations.
95        CnP OFFSET(0) NUMBITS(4) []
96    ]
97}
98
99pub struct Reg;
100
101impl Readable for Reg {
102    type T = u64;
103    type R = ID_AA64MMFR2_EL1::Register;
104
105    sys_coproc_read_raw!(u64, "ID_AA64MMFR2_EL1", "x");
106}
107
108pub const ID_AA64MMFR2_EL1: Reg = Reg;