Skip to content
Snippets Groups Projects
  1. Mar 13, 2025
    • Daniel Almeida's avatar
      Introduce Tyr · 96d7356d
      Daniel Almeida authored
      
      Rust driver for ARM Mali CSF-based GPUs
      
      The skeleton is basically taken from Nova and also rust_platform_driver.rs.
      
      So far, this is just a very early-stage experiment, but it looks promissing:
      
      - We use the same uAPI as Panthor, although this needs a bit of work, since
        bindgen cannot translate #defines into Rust.
      
      - The DRM registration and a few IOCTLs are implemented. There is an igt
        branch with tests.
      
      - Basic iomem and register set implementation, so it's possible to program
      the device.
      
      - IRQ handling, so we can receive notifications from the device.
      
      - We can boot the firmware.
      
      - We can communicate with CSF using the global interface. We can submit
        requests and the MCU will appropriately respond in the ack field.
      
      - There is GEM_CREATE and VM_BIND support.
      - We can send a PING request to CSF, and it will acknowledge it
        successfully.
      
      Notably missing (apart from literally everything else):
      - Job subission logic through drm_scheduler and completion through dma_fences
      - Devfreq, pm_idle, etc.
      
      The name "Tyr" is inspired by Norse mythology, reflecting ARM's tradition of
      naming their GPUs after Nordic mythological figures and places.
      
      Co-developed-by: default avatarAlice Ryhl <alice.ryhl@google.com>
      Signed-off-by: default avatarAlice Ryhl <alice.ryhl@google.com>
      Signed-off-by: default avatarDaniel Almeida <daniel.almeida@collabora.com>
      96d7356d
    • Daniel Almeida's avatar
      rust: shmem: fix set_wc() · 4fc4b8d4
      Daniel Almeida authored
      set_wc() doesn't really do anything. It derefs the pointer, so the value
      gets copied into the stack. It then sets the flag on the stack value,
      leaving the original unchanged.
      
      The above can be confirmed by placing a trace in, e.g., drm_shmem_vmap()
      after a call to set_wc(true). The underlying value in the C struct will
      still be 0
      
      Fix this by introducing a mutable reborrow.
      4fc4b8d4
    • Asahi Lina's avatar
      rust: xarray: Add an abstraction for XArray · 193ac313
      Asahi Lina authored and Daniel Almeida's avatar Daniel Almeida committed
      
      The XArray is an abstract data type which behaves like a very large
      array of pointers. Add a Rust abstraction for this data type.
      
      The initial implementation uses explicit locking on get operations and
      returns a guard which blocks mutation, ensuring that the referenced
      object remains alive. To avoid excessive serialization, users are
      expected to use an inner type that can be efficiently cloned (such as
      Arc<T>), and eagerly clone and drop the guard to unblock other users
      after a lookup.
      
      Future variants may support using RCU instead to avoid mutex locking.
      
      This abstraction also introduces a reservation mechanism, which can be
      used by alloc-capable XArrays to reserve a free slot without immediately
      filling it, and then do so at a later time. If the reservation is
      dropped without being filled, the slot is freed again for other users,
      which eliminates the need for explicit cleanup code.
      
      Signed-off-by: default avatarAsahi Lina <lina@asahilina.net>
      ---
      
      Hi everyone!
      
      This abstraction is part of the set of dependencies for the drm/asahi
      Apple M1/M2 GPU driver.
      
      The branch at [1] contains the full series of patches rebased on
      upstream leading to the complete driver, for reference on how it is
      intended to be used.
      
      Thank you everyone who helped review this on GitHub [2]! I hope I didn't
      forget any CCs...
      
      Note that I dropped the convenience `Deref` impl for `Guard`, since I
      couldn't figure out how to do it safely. Suggestions welcome, or we can
      leave it for a future improvement ^^
      
      [1] https://github.com/AsahiLinux/linux/tree/gpu/rebase-20230224
      [2] https://github.com/Rust-for-Linux/linux/pull/952
      
      Changes in v3:
      - Updated to the error v2/v3 series API.
      - Renamed `err` to `ret` for consistency with the other instance.
      - Link to v2: https://lore.kernel.org/r/20230224-rust-xarray-v2-1-4eeb0134944c@asahilina.net
      Changes in v2:
      - Added Pin requirement for all XArray operations, to close a
        soundness hole due to the lock in the XArray (locks are not safe to
        move while locked). Creation does not require pinning in place, since
        the lock cannot be acquired at that point.
      - Added safety note to Drop impl about why we don't need to do the lock
        unlock dance to ensure soundness in case of a dropped lock guard.
      - Downstream drm/asahi driver was also rebased on this version to prove
        it works (previously it was still on a pre-v1 version).
      - This still depends on the Error series (v1). v2 of that will need a
        trivial rename of Error::from_kernel_errno -> Error::from_errno. If
        this version of XArray ends up looking good, I'll send a trivial v4 of
        XArray with the rename, after sending the v2 of the Error series.
      - Link to v1: https://lore.kernel.org/r/20230224-rust-xarray-v1-1-80f0904ce5d3@asahilina.net
      193ac313
  2. Feb 18, 2025
  3. Feb 17, 2025
Loading