All of lore.kernel.org
 help / color / mirror / Atom feed
From: Deborah Brouwer <deborah.brouwer@collabora.com>
To: Gary Guo <gary@garyguo.net>
Cc: dri-devel@lists.freedesktop.org, rust-for-linux@vger.kernel.org,
	"Boqun Feng" <boqun@kernel.org>,
	"Danilo Krummrich" <dakr@kernel.org>,
	"Alice Ryhl" <aliceryhl@google.com>,
	"Daniel Almeida" <daniel.almeida@collabora.com>,
	"Maarten Lankhorst" <maarten.lankhorst@linux.intel.com>,
	"Maxime Ripard" <mripard@kernel.org>,
	"Thomas Zimmermann" <tzimmermann@suse.de>,
	"David Airlie" <airlied@gmail.com>,
	"Simona Vetter" <simona@ffwll.ch>,
	"Miguel Ojeda" <ojeda@kernel.org>,
	"Björn Roy Baron" <bjorn3_gh@protonmail.com>,
	"Benno Lossin" <lossin@kernel.org>,
	"Andreas Hindborg" <a.hindborg@kernel.org>,
	"Trevor Gross" <tmgross@umich.edu>,
	"Steven Price" <steven.price@arm.com>,
	"Boris Brezillon" <boris.brezillon@collabora.com>,
	"Dirk Behme" <dirk.behme@gmail.com>,
	"Alexandre Courbot" <acourbot@nvidia.com>
Subject: Re: [PATCH v4 1/6] drm/tyr: Use register! macro for GPU_CONTROL
Date: Thu, 9 Apr 2026 09:55:28 -0700	[thread overview]
Message-ID: <adfaALk-8Gn0yps7@um790> (raw)
In-Reply-To: <DHOJSH0AII57.2U2V9ZWH23EAC@garyguo.net>

On Thu, Apr 09, 2026 at 11:21:54AM +0100, Gary Guo wrote:
> On Fri Apr 3, 2026 at 12:35 AM BST, Deborah Brouwer wrote:
> > From: Daniel Almeida <daniel.almeida@collabora.com>
> >
> > Convert the GPU_CONTROL register definitions to use the `register!` macro.
> >
> > Using the `register!` macro allows us to replace manual bit masks and
> > shifts with typed register and field accessors, which makes the code
> > easier to read and avoids errors from bit manipulation.
> >
> > Acked-by: Boris Brezillon <boris.brezillon@collabora.com>
> > Signed-off-by: Daniel Almeida <daniel.almeida@collabora.com>
> > Co-developed-by: Deborah Brouwer <deborah.brouwer@collabora.com>
> > Signed-off-by: Deborah Brouwer <deborah.brouwer@collabora.com>
> > ---
> >  drivers/gpu/drm/tyr/driver.rs |  24 +-
> >  drivers/gpu/drm/tyr/gpu.rs    | 232 +++++------
> >  drivers/gpu/drm/tyr/regs.rs   | 909 +++++++++++++++++++++++++++++++++++++++---
> >  3 files changed, 969 insertions(+), 196 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/tyr/driver.rs b/drivers/gpu/drm/tyr/driver.rs
> > index 611434641580574ec6b5afa49a8fe79888bb7ace..3ebb5e08bfca342f136e8d365b1d9dcb6cc3dbca 100644
> > --- a/drivers/gpu/drm/tyr/driver.rs
> > +++ b/drivers/gpu/drm/tyr/driver.rs
> > @@ -13,7 +13,10 @@
> >      devres::Devres,
> >      drm,
> >      drm::ioctl,
> > -    io::poll,
> > +    io::{
> > +        poll,
> > +        Io, //
> > +    },
> >      new_mutex,
> >      of,
> >      platform,
> > @@ -33,8 +36,11 @@
> >      file::TyrDrmFileData,
> >      gem::TyrObject,
> >      gpu,
> > -    gpu::GpuInfo,
> > -    regs, //
> > +    gpu::{
> > +        gpu_info_log, //
> > +        GpuInfo,
> > +    },
> > +    regs::gpu_control::*, //
> >  };
> >  
> >  pub(crate) type IoMem = kernel::io::mem::IoMem<SZ_2M>;
> > @@ -78,11 +84,15 @@ unsafe impl Send for TyrDrmDeviceData {}
> >  unsafe impl Sync for TyrDrmDeviceData {}
> >  
> >  fn issue_soft_reset(dev: &Device<Bound>, iomem: &Devres<IoMem>) -> Result {
> > -    regs::GPU_CMD.write(dev, iomem, regs::GPU_CMD_SOFT_RESET)?;
> > +    let io = (*iomem).access(dev)?;
> > +    io.write_reg(GPU_COMMAND::reset(ResetMode::SoftReset));
> >  
> >      poll::read_poll_timeout(
> > -        || regs::GPU_IRQ_RAWSTAT.read(dev, iomem),
> > -        |status| *status & regs::GPU_IRQ_RAWSTAT_RESET_COMPLETED != 0,
> > +        || {
> > +            let io = (*iomem).access(dev)?;
> > +            Ok(io.read(GPU_IRQ_RAWSTAT))
> > +        },
> > +        |status| status.reset_completed(),
> >          time::Delta::from_millis(1),
> >          time::Delta::from_millis(100),
> >      )
> > @@ -127,7 +137,7 @@ fn probe(
> >          gpu::l2_power_on(pdev.as_ref(), &iomem)?;
> >  
> >          let gpu_info = GpuInfo::new(pdev.as_ref(), &iomem)?;
> > -        gpu_info.log(pdev);
> > +        gpu_info_log(pdev.as_ref(), &iomem)?;
> 
> This causes all registers to be re-read again for some reason?
> 
> Why is the function signature of `gpu_info_log` changing from a method to a
> standalone function? The commit message doesn't mention any.

I think i was originally trying to get rid of GpuInfo altogether which
was not possible, so you're right these reads are redundant.

I will change it back to a method for v5.

> 
> >  
> >          let platform: ARef<platform::Device> = pdev.into();
> >  
> > diff --git a/drivers/gpu/drm/tyr/gpu.rs b/drivers/gpu/drm/tyr/gpu.rs
> > index a88775160f981e899e9c9b58debbda33e1b7244d..8ae39137a1d190ef026351d47a6cdd89063ed0fb 100644
> > --- a/drivers/gpu/drm/tyr/gpu.rs
> > +++ b/drivers/gpu/drm/tyr/gpu.rs
> > @@ -5,14 +5,16 @@
> >      DerefMut, //
> >  };
> >  use kernel::{
> > -    bits::genmask_u32,
> >      device::{
> >          Bound,
> >          Device, //
> >      },
> >      devres::Devres,
> > -    io::poll,
> > -    platform,
> > +    io::{
> > +        poll,
> > +        register::Array,
> > +        Io, //
> > +    },
> >      prelude::*,
> >      time::Delta,
> >      transmute::AsBytes,
> > @@ -21,7 +23,10 @@
> >  
> >  use crate::{
> >      driver::IoMem,
> > -    regs, //
> > +    regs::{
> > +        gpu_control::*,
> > +        join_u64, //
> > +    }, //
> >  };
> >  
> >  /// Struct containing information that can be queried by userspace. This is read from
> > @@ -29,120 +34,55 @@
> >  ///
> >  /// # Invariants
> >  ///
> > -/// - The layout of this struct identical to the C `struct drm_panthor_gpu_info`.
> > +/// - The layout of this struct is identical to the C `struct drm_panthor_gpu_info`.
> >  #[repr(transparent)]
> >  #[derive(Clone, Copy)]
> >  pub(crate) struct GpuInfo(pub(crate) uapi::drm_panthor_gpu_info);
> >  
> >  impl GpuInfo {
> >      pub(crate) fn new(dev: &Device<Bound>, iomem: &Devres<IoMem>) -> Result<Self> {
> > -        let gpu_id = regs::GPU_ID.read(dev, iomem)?;
> > -        let csf_id = regs::GPU_CSF_ID.read(dev, iomem)?;
> > -        let gpu_rev = regs::GPU_REVID.read(dev, iomem)?;
> > -        let core_features = regs::GPU_CORE_FEATURES.read(dev, iomem)?;
> > -        let l2_features = regs::GPU_L2_FEATURES.read(dev, iomem)?;
> > -        let tiler_features = regs::GPU_TILER_FEATURES.read(dev, iomem)?;
> > -        let mem_features = regs::GPU_MEM_FEATURES.read(dev, iomem)?;
> > -        let mmu_features = regs::GPU_MMU_FEATURES.read(dev, iomem)?;
> > -        let thread_features = regs::GPU_THREAD_FEATURES.read(dev, iomem)?;
> > -        let max_threads = regs::GPU_THREAD_MAX_THREADS.read(dev, iomem)?;
> > -        let thread_max_workgroup_size = regs::GPU_THREAD_MAX_WORKGROUP_SIZE.read(dev, iomem)?;
> > -        let thread_max_barrier_size = regs::GPU_THREAD_MAX_BARRIER_SIZE.read(dev, iomem)?;
> > -        let coherency_features = regs::GPU_COHERENCY_FEATURES.read(dev, iomem)?;
> > -
> > -        let texture_features = regs::GPU_TEXTURE_FEATURES0.read(dev, iomem)?;
> > -
> > -        let as_present = regs::GPU_AS_PRESENT.read(dev, iomem)?;
> > -
> > -        let shader_present = u64::from(regs::GPU_SHADER_PRESENT_LO.read(dev, iomem)?);
> > -        let shader_present =
> > -            shader_present | u64::from(regs::GPU_SHADER_PRESENT_HI.read(dev, iomem)?) << 32;
> > -
> > -        let tiler_present = u64::from(regs::GPU_TILER_PRESENT_LO.read(dev, iomem)?);
> > -        let tiler_present =
> > -            tiler_present | u64::from(regs::GPU_TILER_PRESENT_HI.read(dev, iomem)?) << 32;
> > -
> > -        let l2_present = u64::from(regs::GPU_L2_PRESENT_LO.read(dev, iomem)?);
> > -        let l2_present = l2_present | u64::from(regs::GPU_L2_PRESENT_HI.read(dev, iomem)?) << 32;
> > +        let io = (*iomem).access(dev)?;
> >  
> >          Ok(Self(uapi::drm_panthor_gpu_info {
> > -            gpu_id,
> > -            gpu_rev,
> > -            csf_id,
> > -            l2_features,
> > -            tiler_features,
> > -            mem_features,
> > -            mmu_features,
> > -            thread_features,
> > -            max_threads,
> > -            thread_max_workgroup_size,
> > -            thread_max_barrier_size,
> > -            coherency_features,
> > -            // TODO: Add texture_features_{1,2,3}.
> > -            texture_features: [texture_features, 0, 0, 0],
> > -            as_present,
> > +            gpu_id: io.read(GPU_ID).into_raw(),
> > +            gpu_rev: io.read(REVIDR).into_raw(),
> > +            csf_id: io.read(CSF_ID).into_raw(),
> > +            l2_features: io.read(L2_FEATURES).into_raw(),
> > +            tiler_features: io.read(TILER_FEATURES).into_raw(),
> > +            mem_features: io.read(MEM_FEATURES).into_raw(),
> > +            mmu_features: io.read(MMU_FEATURES).into_raw(),
> > +            thread_features: io.read(THREAD_FEATURES).into_raw(),
> > +            max_threads: io.read(THREAD_MAX_THREADS).into_raw(),
> > +            thread_max_workgroup_size: io.read(THREAD_MAX_WORKGROUP_SIZE).into_raw(),
> > +            thread_max_barrier_size: io.read(THREAD_MAX_BARRIER_SIZE).into_raw(),
> > +            coherency_features: io.read(COHERENCY_FEATURES).into_raw(),
> > +            texture_features: [
> > +                io.read(TEXTURE_FEATURES::at(0)).supported_formats().get(),
> > +                io.read(TEXTURE_FEATURES::at(1)).supported_formats().get(),
> > +                io.read(TEXTURE_FEATURES::at(2)).supported_formats().get(),
> > +                io.read(TEXTURE_FEATURES::at(3)).supported_formats().get(),
> > +            ],
> > +            as_present: io.read(AS_PRESENT).into_raw(),
> >              selected_coherency: uapi::drm_panthor_gpu_coherency_DRM_PANTHOR_GPU_COHERENCY_NONE,
> > -            shader_present,
> > -            l2_present,
> > -            tiler_present,
> > -            core_features,
> > +            shader_present: join_u64(
> > +                io.read(SHADER_PRESENT_LO).into_raw(),
> > +                io.read(SHADER_PRESENT_HI).into_raw(),
> > +            ),
> > +            l2_present: join_u64(
> > +                io.read(L2_PRESENT_LO).into_raw(),
> > +                io.read(L2_PRESENT_HI).into_raw(),
> > +            ),
> > +            tiler_present: join_u64(
> > +                io.read(TILER_PRESENT_LO).into_raw(),
> > +                io.read(TILER_PRESENT_HI).into_raw(),
> > +            ),
> > +            core_features: io.read(CORE_FEATURES).into_raw(),
> > +            // Padding must be zero.
> >              pad: 0,
> > +            //GPU_FEATURES register is not available; it was introduced in arch 11.x.
> >              gpu_features: 0,
> >          }))
> >      }
> > -
> > -    pub(crate) fn log(&self, pdev: &platform::Device) {
> > -        let gpu_id = GpuId::from(self.gpu_id);
> > -
> > -        let model_name = if let Some(model) = GPU_MODELS
> > -            .iter()
> > -            .find(|&f| f.arch_major == gpu_id.arch_major && f.prod_major == gpu_id.prod_major)
> > -        {
> > -            model.name
> > -        } else {
> > -            "unknown"
> > -        };
> > -
> > -        dev_info!(
> > -            pdev,
> > -            "mali-{} id 0x{:x} major 0x{:x} minor 0x{:x} status 0x{:x}",
> > -            model_name,
> > -            self.gpu_id >> 16,
> > -            gpu_id.ver_major,
> > -            gpu_id.ver_minor,
> > -            gpu_id.ver_status
> > -        );
> > -
> > -        dev_info!(
> > -            pdev,
> > -            "Features: L2:{:#x} Tiler:{:#x} Mem:{:#x} MMU:{:#x} AS:{:#x}",
> > -            self.l2_features,
> > -            self.tiler_features,
> > -            self.mem_features,
> > -            self.mmu_features,
> > -            self.as_present
> > -        );
> > -
> > -        dev_info!(
> > -            pdev,
> > -            "shader_present=0x{:016x} l2_present=0x{:016x} tiler_present=0x{:016x}",
> > -            self.shader_present,
> > -            self.l2_present,
> > -            self.tiler_present
> > -        );
> > -    }
> > -
> > -    /// Returns the number of virtual address bits supported by the GPU.
> > -    #[expect(dead_code)]
> > -    pub(crate) fn va_bits(&self) -> u32 {
> > -        self.mmu_features & genmask_u32(0..=7)
> > -    }
> > -
> > -    /// Returns the number of physical address bits supported by the GPU.
> > -    #[expect(dead_code)]
> > -    pub(crate) fn pa_bits(&self) -> u32 {
> > -        (self.mmu_features >> 8) & genmask_u32(0..=7)
> > -    }
> >  }
> >  
> >  impl Deref for GpuInfo {
> > @@ -182,38 +122,68 @@ struct GpuModels {
> >      prod_major: 7,
> >  }];
> >  
> > -#[allow(dead_code)]
> > -pub(crate) struct GpuId {
> > -    pub(crate) arch_major: u32,
> > -    pub(crate) arch_minor: u32,
> > -    pub(crate) arch_rev: u32,
> > -    pub(crate) prod_major: u32,
> > -    pub(crate) ver_major: u32,
> > -    pub(crate) ver_minor: u32,
> > -    pub(crate) ver_status: u32,
> > -}
> > -
> > -impl From<u32> for GpuId {
> > -    fn from(value: u32) -> Self {
> > -        GpuId {
> > -            arch_major: (value & genmask_u32(28..=31)) >> 28,
> > -            arch_minor: (value & genmask_u32(24..=27)) >> 24,
> > -            arch_rev: (value & genmask_u32(20..=23)) >> 20,
> > -            prod_major: (value & genmask_u32(16..=19)) >> 16,
> > -            ver_major: (value & genmask_u32(12..=15)) >> 12,
> > -            ver_minor: (value & genmask_u32(4..=11)) >> 4,
> > -            ver_status: value & genmask_u32(0..=3),
> > -        }
> > -    }
> > +pub(crate) fn gpu_info_log(dev: &Device<Bound>, iomem: &Devres<IoMem>) -> Result {
> > +    let io = (*iomem).access(dev)?;
> > +    let gpu_id = io.read(GPU_ID);
> > +
> > +    let model_name = if let Some(model) = GPU_MODELS.iter().find(|&f| {
> > +        f.arch_major == gpu_id.arch_major().get() && f.prod_major == gpu_id.prod_major().get()
> > +    }) {
> > +        model.name
> > +    } else {
> > +        "unknown"
> > +    };
> > +
> > +    dev_info!(
> > +        dev,
> > +        "mali-{} id 0x{:x} major 0x{:x} minor 0x{:x} status 0x{:x}",
> > +        model_name,
> > +        gpu_id.into_raw() >> 16,
> > +        gpu_id.ver_major().get(),
> > +        gpu_id.ver_minor().get(),
> > +        gpu_id.ver_status().get()
> > +    );
> > +
> > +    dev_info!(
> > +        dev,
> > +        "Features: L2:{:#x} Tiler:{:#x} Mem:{:#x} MMU:{:#x} AS:{:#x}",
> > +        io.read(L2_FEATURES).into_raw(),
> > +        io.read(TILER_FEATURES).into_raw(),
> > +        io.read(MEM_FEATURES).into_raw(),
> > +        io.read(MMU_FEATURES).into_raw(),
> > +        io.read(AS_PRESENT).into_raw(),
> > +    );
> 
> Without the signature change the old code is all accessing from self.

Ack.

> 
> Best,
> Gary
> 
> > +
> > +    dev_info!(
> > +        dev,
> > +        "shader_present=0x{:016x} l2_present=0x{:016x} tiler_present=0x{:016x}",
> > +        join_u64(
> > +            io.read(SHADER_PRESENT_LO).into_raw(),
> > +            io.read(SHADER_PRESENT_HI).into_raw(),
> > +        ),
> > +        join_u64(
> > +            io.read(L2_PRESENT_LO).into_raw(),
> > +            io.read(L2_PRESENT_HI).into_raw(),
> > +        ),
> > +        join_u64(
> > +            io.read(TILER_PRESENT_LO).into_raw(),
> > +            io.read(TILER_PRESENT_HI).into_raw(),
> > +        ),
> > +    );
> > +    Ok(())
> >  }
> >  
> > [snip]

  reply	other threads:[~2026-04-09 16:55 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-04-02 23:35 [PATCH v4 0/6] drm/tyr: Use register! macro Deborah Brouwer
2026-04-02 23:35 ` [PATCH v4 1/6] drm/tyr: Use register! macro for GPU_CONTROL Deborah Brouwer
2026-04-09 10:21   ` Gary Guo
2026-04-09 16:55     ` Deborah Brouwer [this message]
2026-04-02 23:35 ` [PATCH v4 2/6] drm/tyr: Print GPU_ID without filtering Deborah Brouwer
2026-04-02 23:35 ` [PATCH v4 3/6] drm/tyr: Use register! macro for JOB_CONTROL Deborah Brouwer
2026-04-03  7:27   ` Boris Brezillon
2026-04-07 23:57     ` Deborah Brouwer
2026-04-02 23:35 ` [PATCH v4 4/6] drm/tyr: Use register! macro for MMU_CONTROL Deborah Brouwer
2026-04-02 23:35 ` [PATCH v4 5/6] drm/tyr: Remove custom register struct Deborah Brouwer
2026-04-02 23:35 ` [PATCH v4 6/6] drm/tyr: Add DOORBELL_BLOCK registers Deborah Brouwer

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=adfaALk-8Gn0yps7@um790 \
    --to=deborah.brouwer@collabora.com \
    --cc=a.hindborg@kernel.org \
    --cc=acourbot@nvidia.com \
    --cc=airlied@gmail.com \
    --cc=aliceryhl@google.com \
    --cc=bjorn3_gh@protonmail.com \
    --cc=boqun@kernel.org \
    --cc=boris.brezillon@collabora.com \
    --cc=dakr@kernel.org \
    --cc=daniel.almeida@collabora.com \
    --cc=dirk.behme@gmail.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=gary@garyguo.net \
    --cc=lossin@kernel.org \
    --cc=maarten.lankhorst@linux.intel.com \
    --cc=mripard@kernel.org \
    --cc=ojeda@kernel.org \
    --cc=rust-for-linux@vger.kernel.org \
    --cc=simona@ffwll.ch \
    --cc=steven.price@arm.com \
    --cc=tmgross@umich.edu \
    --cc=tzimmermann@suse.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.