diff --git a/drivers/gpu/drm/panthor-rs/file.rs b/drivers/gpu/drm/panthor-rs/file.rs index 08aa207dad5ef99ce786b077dd46516775601909..2f2486f86e160d4a3d0d60f9a2de793a4398aeac 100644 --- a/drivers/gpu/drm/panthor-rs/file.rs +++ b/drivers/gpu/drm/panthor-rs/file.rs @@ -28,15 +28,27 @@ use core::ffi; pub(crate) type DrmFile = drm::file::File<File>; /// State associated with a client. -pub(crate) struct File(); +#[repr(C)] +pub(crate) struct File { + ptdev: *mut bindings::panthor_device, + // TODO make these embedded structs? + vms: *mut bindings::panthor_vm_pool, + groups: *mut bindings::panthor_group_pool, +} impl drm::file::DriverFile for File { type Driver = PanthorDriver; - fn open(_dev: &DrmDevice<Self::Driver>) -> Result<Pin<Box<Self>>> { + fn open(dev: &DrmDevice<Self::Driver>) -> Result<Pin<Box<Self>>> { + let ptdev = dev.data().ptdev; pr_info!("DRM Device :: open()\n"); - Ok(Box::into_pin(Box::new(Self(), GFP_KERNEL)?)) + // TODO allocation error handling + Ok(Box::into_pin(Box::new(Self { + ptdev, + vms: unsafe { bindings::panthor_vm_pool_create() }, + groups: unsafe { bindings::panthor_group_pool_create() } + }, GFP_KERNEL)?)) } } diff --git a/drivers/gpu/drm/panthor-rs/panthor_drv.c b/drivers/gpu/drm/panthor-rs/panthor_drv.c index 1df2fb94f12eeb5b4c13de6dd835cb2cf55fba00..47ebc714288ac05bf23b2cc6a45d5d567d079d6e 100644 --- a/drivers/gpu/drm/panthor-rs/panthor_drv.c +++ b/drivers/gpu/drm/panthor-rs/panthor_drv.c @@ -1241,46 +1241,6 @@ static int panthor_ioctl_vm_get_state(struct drm_device *ddev, void *data, return 0; } -static int -panthor_open(struct drm_device *ddev, struct drm_file *file) -{ - struct panthor_device *ptdev = container_of(ddev, struct panthor_device, base); - struct panthor_file *pfile; - int ret; - - if (!try_module_get(THIS_MODULE)) - return -EINVAL; - - pfile = kzalloc(sizeof(*pfile), GFP_KERNEL); - if (!pfile) { - ret = -ENOMEM; - goto err_put_mod; - } - - pfile->ptdev = ptdev; - - ret = panthor_vm_pool_create(pfile); - if (ret) - goto err_free_file; - - ret = panthor_group_pool_create(pfile); - if (ret) - goto err_destroy_vm_pool; - - file->driver_priv = pfile; - return 0; - -err_destroy_vm_pool: - panthor_vm_pool_destroy(pfile); - -err_free_file: - kfree(pfile); - -err_put_mod: - module_put(THIS_MODULE); - return ret; -} - static void panthor_postclose(struct drm_device *ddev, struct drm_file *file) { diff --git a/drivers/gpu/drm/panthor-rs/panthor_mmu.c b/drivers/gpu/drm/panthor-rs/panthor_mmu.c index b38a540840abc9ebdad7da77f39d3f3aa4dec008..ead0f943b3cf980b29d960ac19cad3da8c89f837 100644 --- a/drivers/gpu/drm/panthor-rs/panthor_mmu.c +++ b/drivers/gpu/drm/panthor-rs/panthor_mmu.c @@ -1583,14 +1583,14 @@ void panthor_vm_pool_destroy(struct panthor_file *pfile) * * Return: 0 on success, a negative error code otherwise. */ -int panthor_vm_pool_create(struct panthor_file *pfile) +struct panthor_vm_pool *panthor_vm_pool_create(void) { - pfile->vms = kzalloc(sizeof(*pfile->vms), GFP_KERNEL); - if (!pfile->vms) - return -ENOMEM; + struct panthor_vm_pool *vms = kzalloc(sizeof(*vms), GFP_KERNEL); + if (!vms) + return NULL; - xa_init_flags(&pfile->vms->xa, XA_FLAGS_ALLOC1); - return 0; + xa_init_flags(&vms->xa, XA_FLAGS_ALLOC1); + return vms; } /* dummy TLB ops, the real TLB flush happens in panthor_vm_flush_range() */ diff --git a/drivers/gpu/drm/panthor-rs/panthor_mmu.h b/drivers/gpu/drm/panthor-rs/panthor_mmu.h index e08da9e6a42c7df937ae79bdb397646df1c3738a..97b2dc16e2d544a464c7ba95aad35d45a26ec34f 100644 --- a/drivers/gpu/drm/panthor-rs/panthor_mmu.h +++ b/drivers/gpu/drm/panthor-rs/panthor_mmu.h @@ -54,7 +54,7 @@ struct dma_resv *panthor_vm_resv(struct panthor_vm *vm); struct drm_gem_object *panthor_vm_root_gem(struct panthor_vm *vm); void panthor_vm_pool_destroy(struct panthor_file *pfile); -int panthor_vm_pool_create(struct panthor_file *pfile); +struct panthor_vm_pool *panthor_vm_pool_create(void); int panthor_vm_pool_create_vm(struct panthor_device *ptdev, struct panthor_vm_pool *pool, struct drm_panthor_vm_create *args); diff --git a/drivers/gpu/drm/panthor-rs/panthor_sched.c b/drivers/gpu/drm/panthor-rs/panthor_sched.c index 6ee2d0b2b07448ac8f76a7d96091e0ab355bdb47..63b61d74909ab1ef1de66874a13e6c88694c3b9f 100644 --- a/drivers/gpu/drm/panthor-rs/panthor_sched.c +++ b/drivers/gpu/drm/panthor-rs/panthor_sched.c @@ -3254,17 +3254,16 @@ int panthor_group_get_state(struct panthor_file *pfile, return 0; } -int panthor_group_pool_create(struct panthor_file *pfile) +struct panthor_group_pool *panthor_group_pool_create(void) { struct panthor_group_pool *gpool; gpool = kzalloc(sizeof(*gpool), GFP_KERNEL); if (!gpool) - return -ENOMEM; + return NULL; xa_init_flags(&gpool->xa, XA_FLAGS_ALLOC1); - pfile->groups = gpool; - return 0; + return gpool; } void panthor_group_pool_destroy(struct panthor_file *pfile) diff --git a/drivers/gpu/drm/panthor-rs/panthor_sched.h b/drivers/gpu/drm/panthor-rs/panthor_sched.h index 3a30d2328b308df6eb5bf6204b07fa2ec33d8539..ec804894b39821b720b1ca649ab75c3b5390607d 100644 --- a/drivers/gpu/drm/panthor-rs/panthor_sched.h +++ b/drivers/gpu/drm/panthor-rs/panthor_sched.h @@ -34,7 +34,7 @@ struct panthor_vm *panthor_job_vm(struct drm_sched_job *sched_job); void panthor_job_put(struct drm_sched_job *job); void panthor_job_update_resvs(struct drm_exec *exec, struct drm_sched_job *job); -int panthor_group_pool_create(struct panthor_file *pfile); +struct panthor_group_pool *panthor_group_pool_create(void); void panthor_group_pool_destroy(struct panthor_file *pfile); int panthor_sched_init(struct panthor_device *ptdev);