-
Couldn't load subscription status.
- Fork 185
Add mtopi CSR #347
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Add mtopi CSR #347
Changes from all commits
980fe03
0ed27e1
770c6c8
353c670
527d9b7
258f3e2
73b03ec
b9b8ede
c646018
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
| @@ -0,0 +1,91 @@ | ||||||
| //! mtopi register — Machine Top Priority Interrupt (0x7C0) | ||||||
| //! | ||||||
| //! Provides information about the highest-priority pending interrupt when AIA (Advanced Interrupt Architecture) is supported. | ||||||
| //! This CSR is part of the RISC-V Advanced Interrupt Architecture extension and allows software to quickly | ||||||
| //! identify the most important pending interrupt without scanning through multiple interrupt pending registers. | ||||||
| //! | ||||||
| //! # Usage | ||||||
| //! | ||||||
| //! ```no_run | ||||||
| //! use riscv::register::mtopi; | ||||||
| //! | ||||||
| //! // Read the machine top priority interrupt register | ||||||
| //! let mtopi_val = mtopi::read(); | ||||||
| //! | ||||||
| //! if mtopi_val.has_interrupt() { | ||||||
| //! let interrupt_id = mtopi_val.iid(); | ||||||
| //! let priority = mtopi_val.ipid(); | ||||||
| //! println!("Highest priority interrupt: ID={}, Priority={}", interrupt_id, priority); | ||||||
| //! } else { | ||||||
| //! println!("No interrupts pending"); | ||||||
| //! } | ||||||
| //! ``` | ||||||
| read_only_csr! { | ||||||
| /// Machine Top Priority Interrupt Register | ||||||
| Mtopi: 0x7C0, | ||||||
| mask: 0x0FFF_00FF, | ||||||
| } | ||||||
|
|
||||||
| read_only_csr_field! { | ||||||
| Mtopi, | ||||||
| /// Interrupt ID (bits 16..27) | ||||||
| /// | ||||||
| /// Identifies the specific interrupt source. A value of 0 indicates no interrupt is pending. | ||||||
| /// Non-zero values correspond to specific interrupt sources as defined by the interrupt controller. | ||||||
| iid: [16:27], | ||||||
| } | ||||||
|
|
||||||
| read_only_csr_field! { | ||||||
| Mtopi, | ||||||
| /// Interrupt Priority ID (bits 0..7) | ||||||
| /// | ||||||
| /// Represents the priority level of the pending interrupt. | ||||||
| /// Lower numerical values indicate higher priority interrupts. | ||||||
| iprio: [0:7], | ||||||
| } | ||||||
|
|
||||||
| impl Mtopi { | ||||||
| /// Returns true if there is a valid interrupt pending | ||||||
| /// | ||||||
| /// When this returns true, both `interrupt_id()` and `priority()` will return meaningful values. | ||||||
| #[inline] | ||||||
| pub fn is_interrupt_pending(&self) -> bool { | ||||||
| self.iid() != 0 | ||||||
| } | ||||||
| } | ||||||
|
|
||||||
| #[cfg(test)] | ||||||
| mod tests { | ||||||
| use super::*; | ||||||
|
|
||||||
| #[test] | ||||||
| fn test_mtopi_fields() { | ||||||
| let mtopi = Mtopi::from_bits(0); | ||||||
|
|
||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
| test_csr_field!(mtopi, iid: [16, 27], 0x0); | ||||||
| test_csr_field!(mtopi, iprio: [0, 7], 0x0); | ||||||
|
|
||||||
| let mtopi = Mtopi::from_bits((11 << 16) | 5); | ||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. For clarity, so the numbers coincide with the next checks
Suggested change
|
||||||
| test_csr_field!(mtopi, iid: [16, 27], 0xB); | ||||||
| test_csr_field!(mtopi, iprio: [0, 7], 0x5); | ||||||
|
|
||||||
| let mtopi = Mtopi::from_bits((0xFFF << 16) | 0xFF); | ||||||
| test_csr_field!(mtopi, iid: [16, 27], 0xFFF); | ||||||
| test_csr_field!(mtopi, iprio: [0, 7], 0xFF); | ||||||
|
|
||||||
| let mtopi = Mtopi::from_bits(1 << 16); | ||||||
| test_csr_field!(mtopi, iid: [16, 27], 0x1); | ||||||
| test_csr_field!(mtopi, iprio: [0, 7], 0x0); | ||||||
|
|
||||||
| let mtopi = Mtopi::from_bits(1); | ||||||
| test_csr_field!(mtopi, iid: [16, 27], 0x0); | ||||||
| test_csr_field!(mtopi, iprio: [0, 7], 0x1); | ||||||
| } | ||||||
|
|
||||||
| #[test] | ||||||
| fn test_mtopi_bitmask() { | ||||||
| let mtopi = Mtopi::from_bits(usize::MAX); | ||||||
| assert_eq!(mtopi.bits(), usize::MAX); | ||||||
| } | ||||||
| } | ||||||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Only one new test branch that does all the checks