Generally looks reasonable, although as it stands this would of course be a much smaller patch in plain C ;) It would look better if you split the Rust-enabling parts from the actual new code. I also think there needs to be a little more thought into what registers are useful to dump and some documentation on the dump format. Naïve Rust question: there are a bunch of unwrap() calls in the code which to my C-trained brain look like BUG_ON()s - and in C I'd be complaining about them. What is the Rust style here? AFAICT they are all valid (they should never panic) but it makes me uneasy when I'm reading the code. Steve > +pub(crate) const MCU_STATUS: GpuRegister = GpuRegister(0x704); > +pub(crate) const MCU_STATUS_DISABLED: GpuRegister = GpuRegister(0); > +pub(crate) const MCU_STATUS_ENABLED: GpuRegister = GpuRegister(1); > +pub(crate) const MCU_STATUS_HALT: GpuRegister = GpuRegister(2); > +pub(crate) const MCU_STATUS_FATAL: GpuRegister = GpuRegister(3); > +pub(crate) const JOB_INT_RAWSTAT: GpuRegister = GpuRegister(0x1000); > +pub(crate) const JOB_INT_CLEAR: GpuRegister = GpuRegister(0x1004); > +pub(crate) const JOB_INT_MASK: GpuRegister = GpuRegister(0x1008); > +pub(crate) const JOB_INT_STAT: GpuRegister = GpuRegister(0x100c); > +pub(crate) const JOB_INT_GLOBAL_IF: GpuRegister = GpuRegister(bit(31)); > +pub(crate) const fn job_int_csg_if(x: u64) -> GpuRegister { > + GpuRegister(bit(x)) > +} > +pub(crate) const MMU_INT_RAWSTAT: GpuRegister = GpuRegister(0x2000); > +pub(crate) const MMU_INT_CLEAR: GpuRegister = GpuRegister(0x2004); > +pub(crate) const MMU_INT_MASK: GpuRegister = GpuRegister(0x2008); > +pub(crate) const MMU_INT_STAT: GpuRegister = GpuRegister(0x200c); > +pub(crate) const MMU_BASE: GpuRegister = GpuRegister(0x2400); > +pub(crate) const MMU_AS_SHIFT: GpuRegister = GpuRegister(6); > +const fn mmu_as(as_: u64) -> u64 { > + MMU_BASE.0 + ((as_) << MMU_AS_SHIFT.0) > +} > +pub(crate) const fn as_transtab_lo(as_: u64) -> GpuRegister { > + GpuRegister(mmu_as(as_) + 0x0) > +} > +pub(crate) const fn as_transtab_hi(as_: u64) -> GpuRegister { > + GpuRegister(mmu_as(as_) + 0x4) > +} > +pub(crate) const fn as_memattr_lo(as_: u64) -> GpuRegister { > + GpuRegister(mmu_as(as_) + 0x8) > +} > +pub(crate) const fn as_memattr_hi(as_: u64) -> GpuRegister { > + GpuRegister(mmu_as(as_) + 0xC) > +} > +pub(crate) const fn as_memattr_aarch64_inner_alloc_expl(w: u64, r: u64) -> GpuRegister { > + GpuRegister((3 << 2) | (if w > 0 { bit(0) } else { 0 } | (if r > 0 { bit(1) } else { 0 }))) > +} > +pub(crate) const fn as_lockaddr_lo(as_: u64) -> GpuRegister { > + GpuRegister(mmu_as(as_) + 0x10) > +} > +pub(crate) const fn as_lockaddr_hi(as_: u64) -> GpuRegister { > + GpuRegister(mmu_as(as_) + 0x14) > +} > +pub(crate) const fn as_command(as_: u64) -> GpuRegister { > + GpuRegister(mmu_as(as_) + 0x18) > +} > +pub(crate) const AS_COMMAND_NOP: GpuRegister = GpuRegister(0); > +pub(crate) const AS_COMMAND_UPDATE: GpuRegister = GpuRegister(1); > +pub(crate) const AS_COMMAND_LOCK: GpuRegister = GpuRegister(2); > +pub(crate) const AS_COMMAND_UNLOCK: GpuRegister = GpuRegister(3); > +pub(crate) const AS_COMMAND_FLUSH_PT: GpuRegister = GpuRegister(4); > +pub(crate) const AS_COMMAND_FLUSH_MEM: GpuRegister = GpuRegister(5); > +pub(crate) const fn as_faultstatus(as_: u64) -> GpuRegister { > + GpuRegister(mmu_as(as_) + 0x1C) > +} > +pub(crate) const fn as_faultaddress_lo(as_: u64) -> GpuRegister { > + GpuRegister(mmu_as(as_) + 0x20) > +} > +pub(crate) const fn as_faultaddress_hi(as_: u64) -> GpuRegister { > + GpuRegister(mmu_as(as_) + 0x24) > +} > +pub(crate) const fn as_status(as_: u64) -> GpuRegister { > + GpuRegister(mmu_as(as_) + 0x28) > +} > +pub(crate) const AS_STATUS_AS_ACTIVE: GpuRegister = GpuRegister(bit(0)); > +pub(crate) const fn as_transcfg_lo(as_: u64) -> GpuRegister { > + GpuRegister(mmu_as(as_) + 0x30) > +} > +pub(crate) const fn as_transcfg_hi(as_: u64) -> GpuRegister { > + GpuRegister(mmu_as(as_) + 0x34) > +} > +pub(crate) const fn as_transcfg_ina_bits(x: u64) -> GpuRegister { > + GpuRegister((x) << 6) > +} > +pub(crate) const fn as_transcfg_outa_bits(x: u64) -> GpuRegister { > + GpuRegister((x) << 14) > +} > +pub(crate) const AS_TRANSCFG_SL_CONCAT: GpuRegister = GpuRegister(bit(22)); > +pub(crate) const AS_TRANSCFG_PTW_RA: GpuRegister = GpuRegister(bit(30)); > +pub(crate) const AS_TRANSCFG_DISABLE_HIER_AP: GpuRegister = GpuRegister(bit(33)); > +pub(crate) const AS_TRANSCFG_DISABLE_AF_FAULT: GpuRegister = GpuRegister(bit(34)); > +pub(crate) const AS_TRANSCFG_WXN: GpuRegister = GpuRegister(bit(35)); > +pub(crate) const AS_TRANSCFG_XREADABLE: GpuRegister = GpuRegister(bit(36)); > +pub(crate) const fn as_faultextra_lo(as_: u64) -> GpuRegister { > + GpuRegister(mmu_as(as_) + 0x38) > +} > +pub(crate) const fn as_faultextra_hi(as_: u64) -> GpuRegister { > + GpuRegister(mmu_as(as_) + 0x3C) > +} > +pub(crate) const CSF_GPU_LATEST_FLUSH_ID: GpuRegister = GpuRegister(0x10000); > +pub(crate) const fn csf_doorbell(i: u64) -> GpuRegister { > + GpuRegister(0x80000 + ((i) * 0x10000)) > +} > +pub(crate) const CSF_GLB_DOORBELL_ID: GpuRegister = GpuRegister(0); > diff --git a/rust/bindings/bindings_helper.h b/rust/bindings/bindings_helper.h > index b245db8d5a87..4ee4b97e7930 100644 > --- a/rust/bindings/bindings_helper.h > +++ b/rust/bindings/bindings_helper.h > @@ -12,15 +12,18 @@ > #include <drm/drm_gem.h> > #include <drm/drm_ioctl.h> > #include <kunit/test.h> > +#include <linux/devcoredump.h> > #include <linux/errname.h> > #include <linux/ethtool.h> > #include <linux/jiffies.h> > +#include <linux/iosys-map.h> > #include <linux/mdio.h> > #include <linux/pci.h> > #include <linux/phy.h> > #include <linux/refcount.h> > #include <linux/sched.h> > #include <linux/slab.h> > +#include <linux/vmalloc.h> > #include <linux/wait.h> > #include <linux/workqueue.h> >