From 37a87f31586c798737c1bc9f92cd9b6eadb815c4 Mon Sep 17 00:00:00 2001 From: rmsyn Date: Sat, 11 Jan 2025 17:38:07 +0000 Subject: [PATCH] riscv: define mvendorid CSR with macro helpers Uses CSR macro helpers to define the `mvendorid` CSR register. --- riscv/CHANGELOG.md | 1 + riscv/src/register/mvendorid.rs | 48 +++++++++++++++------------------ 2 files changed, 23 insertions(+), 26 deletions(-) diff --git a/riscv/CHANGELOG.md b/riscv/CHANGELOG.md index 3894d740..c09ef787 100644 --- a/riscv/CHANGELOG.md +++ b/riscv/CHANGELOG.md @@ -28,6 +28,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/). - Use CSR helper macros to define `mstatus` register - Use CSR helper macros to define `mstatush` register - Use CSR helper macros to define `mtvec` register +- Use CSR helper macros to define `mtvendorid` register ## [v0.12.1] - 2024-10-20 diff --git a/riscv/src/register/mvendorid.rs b/riscv/src/register/mvendorid.rs index 5c621478..11bb2cf8 100644 --- a/riscv/src/register/mvendorid.rs +++ b/riscv/src/register/mvendorid.rs @@ -1,34 +1,30 @@ //! mvendorid register -use core::num::NonZeroUsize; - -/// mvendorid register -#[derive(Clone, Copy, Debug)] -pub struct Mvendorid { - bits: NonZeroUsize, +read_only_csr! { + /// `mvendorid` register + Mvendorid: 0xF11, + mask: 0xffff_ffff, + sentinel: 0, } -impl Mvendorid { - /// Returns the contents of the register as raw bits - #[inline] - pub fn bits(&self) -> usize { - self.bits.get() - } - - /// Returns the JEDEC manufacturer ID - #[inline] - pub fn jedec_manufacturer(&self) -> usize { - self.bits() >> 7 - } +read_only_csr_field! { + Mvendorid, + /// Represents the number of continuation bytes (`0x7f`) in the JEDEC manufacturer ID. + bank: [7:31], } -read_csr!(0xF11); +read_only_csr_field! { + Mvendorid, + /// Represents the final offset field in the JEDEC manufacturer ID. + offset: [0:6], +} -/// Reads the CSR -#[inline] -pub fn read() -> Option { - let r = unsafe { _read() }; - // When mvendorid is hardwired to zero it means that the mvendorid - // csr isn't implemented. - NonZeroUsize::new(r).map(|bits| Mvendorid { bits }) +impl Mvendorid { + /// Gets the JEDEC manufacturer ID decoded into parts: + /// + /// - `bank`: the number of continuation bytes (`0x7f`) + /// - `offset`: specific offset in the JEDEC bank number + pub fn jedec_manufacturer(&self) -> (usize, usize) { + (self.bank(), (0x80 | self.offset())) + } }