Hi Alvin, Same comment about dev_err vs dev_dbg.
> On 28 Sep 2026, at 23:15, Ke Sun via B4 Relay > <[email protected]> wrote: > > From: Alvin Sun <[email protected]> > > Implement BO_CREATE and BO_MMAP_OFFSET so userspace can allocate GPU > buffers and obtain a DRM mmap offset for the generic mmap path. > BO_CREATE page-aligns the requested size; BO_MMAP_OFFSET rejects > NO_MMAP objects, which must never be CPU-mapped. > > Signed-off-by: Alvin Sun <[email protected]> > --- > drivers/gpu/drm/tyr/driver.rs | 2 ++ > drivers/gpu/drm/tyr/file.rs | 73 +++++++++++++++++++++++++++++++++++++++++++ > drivers/gpu/drm/tyr/gem.rs | 8 ++++- > 3 files changed, 82 insertions(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/tyr/driver.rs b/drivers/gpu/drm/tyr/driver.rs > index 9a7f147935e29..8baf88aee96ad 100644 > --- a/drivers/gpu/drm/tyr/driver.rs > +++ b/drivers/gpu/drm/tyr/driver.rs > @@ -224,6 +224,8 @@ impl drm::Driver for TyrDrmDriver { > (PANTHOR_VM_DESTROY, drm_panthor_vm_destroy, ioctl::RENDER_ALLOW, > TyrDrmFileData::vm_destroy), > (PANTHOR_VM_BIND, drm_panthor_vm_bind, ioctl::RENDER_ALLOW, > TyrDrmFileData::vm_bind), > (PANTHOR_VM_GET_STATE, drm_panthor_vm_get_state, ioctl::RENDER_ALLOW, > TyrDrmFileData::vm_get_state), > + (PANTHOR_BO_CREATE, drm_panthor_bo_create, ioctl::RENDER_ALLOW, > TyrDrmFileData::bo_create), > + (PANTHOR_BO_MMAP_OFFSET, drm_panthor_bo_mmap_offset, > ioctl::RENDER_ALLOW, TyrDrmFileData::bo_mmap_offset), > } > } > > diff --git a/drivers/gpu/drm/tyr/file.rs b/drivers/gpu/drm/tyr/file.rs > index 2c037b136406c..e98eb0a46877f 100644 > --- a/drivers/gpu/drm/tyr/file.rs > +++ b/drivers/gpu/drm/tyr/file.rs > @@ -248,6 +248,79 @@ pub(crate) fn vm_get_state( > Ok(0) > }) > } > + > + pub(crate) fn bo_create( > + ddev: &TyrDrmDevice<Registered>, > + _reg_data: &TyrDrmRegistrationData<'_>, > + bocreate: &mut uapi::drm_panthor_bo_create, > + file: &TyrDrmFile, > + ) -> Result<u32> { > + if bocreate.size == 0 > + || bocreate.pad != 0 > + || bocreate.flags & > !uapi::drm_panthor_bo_flags_DRM_PANTHOR_BO_NO_MMAP != 0 > + { > + dev_err!( > + ddev.as_ref(), > + "Invalid BO_CREATE params: size={}, pad={}, flags={:#x}\n", > + bocreate.size, > + bocreate.pad, > + bocreate.flags > + ); > + return Err(EINVAL); > + } > + > + if bocreate.exclusive_vm_id != 0 { > + dev_err!(ddev.as_ref(), "BO_CREATE: exclusive_vm_id not > supported\n"); > + return Err(EINVAL); > + } > + > + let size = usize::try_from(bocreate.size).map_err(|_| { > + dev_err!( > + ddev.as_ref(), > + "BO_CREATE size {:#x} too large\n", > + bocreate.size > + ); > + EINVAL > + })?; > + let bo = crate::gem::new_object(ddev, size, bocreate.flags)?; > + bocreate.handle = bo.create_handle(file)?; > + bocreate.size = bo.size() as u64; Why is the sg_table() call only added later? As it stands, this patch introduces a silent (and extremely confusing) issue. I’d prefer if the call were to be here instead. You can just call it unconditionally for now. IIUC it is harmless for coherent systems and in any case, we only support non-coherent systems atm. With the changes above: Reviewed-by: Daniel Almeida <[email protected]> — Daniel
