On Mon, Apr 16, 2018 at 11:22:19AM -0700, Jeykumar Sankaran wrote: > Remove custom ioctl support in SDM845 which allows > user space to register/unregister for hw events. > > Signed-off-by: Jeykumar Sankaran <jsanka@xxxxxxxxxxxxxx> Reviewed-by: Sean Paul <seanpaul@xxxxxxxxxxxx> > --- > drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 218 +------------------------------ > drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h | 1 - > drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 31 ----- > drivers/gpu/drm/msm/msm_drv.c | 201 ---------------------------- > drivers/gpu/drm/msm/msm_kms.h | 2 - > 5 files changed, 1 insertion(+), 452 deletions(-) > > diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c > index 8e464fa..387919a 100644 > --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c > +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c > @@ -39,31 +39,6 @@ > #include "dpu_core_perf.h" > #include "dpu_trace.h" > > -struct dpu_crtc_irq_info { > - struct dpu_irq_callback irq; > - u32 event; > - int (*func)(struct drm_crtc *crtc, bool en, > - struct dpu_irq_callback *irq); > - struct list_head list; > -}; > - > -struct dpu_crtc_custom_events { > - u32 event; > - int (*func)(struct drm_crtc *crtc, bool en, > - struct dpu_irq_callback *irq); > -}; > - > -static int dpu_crtc_power_interrupt_handler(struct drm_crtc *crtc_drm, > - bool en, struct dpu_irq_callback *ad_irq); > -static int dpu_crtc_idle_interrupt_handler(struct drm_crtc *crtc_drm, > - bool en, struct dpu_irq_callback *idle_irq); > - > -static struct dpu_crtc_custom_events custom_events[] = { > - {DRM_EVENT_AD_BACKLIGHT, dpu_cp_ad_interrupt}, > - {DRM_EVENT_CRTC_POWER, dpu_crtc_power_interrupt_handler}, > - {DRM_EVENT_IDLE_NOTIFY, dpu_crtc_idle_interrupt_handler} > -}; > - > /* layer mixer index on dpu_crtc */ > #define LEFT_MIXER 0 > #define RIGHT_MIXER 1 > @@ -2455,9 +2430,6 @@ static void dpu_crtc_handle_power_event(u32 event_type, void *arg) > struct drm_encoder *encoder; > struct dpu_crtc_mixer *m; > u32 i, misr_status; > - unsigned long flags; > - struct dpu_crtc_irq_info *node = NULL; > - int ret = 0; > > if (!crtc) { > DPU_ERROR("invalid crtc\n"); > @@ -2479,17 +2451,6 @@ static void dpu_crtc_handle_power_event(u32 event_type, void *arg) > dpu_encoder_virt_restore(encoder); > } > > - spin_lock_irqsave(&dpu_crtc->spin_lock, flags); > - list_for_each_entry(node, &dpu_crtc->user_event_list, list) { > - ret = 0; > - if (node->func) > - ret = node->func(crtc, true, &node->irq); > - if (ret) > - DPU_ERROR("%s failed to enable event %x\n", > - dpu_crtc->name, node->event); > - } > - spin_unlock_irqrestore(&dpu_crtc->spin_lock, flags); > - > dpu_cp_crtc_post_ipc(crtc); > > for (i = 0; i < dpu_crtc->num_mixers; ++i) { > @@ -2514,18 +2475,6 @@ static void dpu_crtc_handle_power_event(u32 event_type, void *arg) > dpu_crtc->misr_data[i]; > } > > - spin_lock_irqsave(&dpu_crtc->spin_lock, flags); > - node = NULL; > - list_for_each_entry(node, &dpu_crtc->user_event_list, list) { > - ret = 0; > - if (node->func) > - ret = node->func(crtc, false, &node->irq); > - if (ret) > - DPU_ERROR("%s failed to disable event %x\n", > - dpu_crtc->name, node->event); > - } > - spin_unlock_irqrestore(&dpu_crtc->spin_lock, flags); > - > dpu_cp_crtc_pre_ipc(crtc); > break; > case DPU_POWER_EVENT_POST_DISABLE: > @@ -2553,8 +2502,6 @@ static void dpu_crtc_disable(struct drm_crtc *crtc) > struct drm_display_mode *mode; > struct drm_encoder *encoder; > struct msm_drm_private *priv; > - unsigned long flags; > - struct dpu_crtc_irq_info *node = NULL; > struct drm_event event; > u32 power_on; > int ret; > @@ -2614,17 +2561,6 @@ static void dpu_crtc_disable(struct drm_crtc *crtc) > atomic_set(&dpu_crtc->frame_pending, 0); > } > > - spin_lock_irqsave(&dpu_crtc->spin_lock, flags); > - list_for_each_entry(node, &dpu_crtc->user_event_list, list) { > - ret = 0; > - if (node->func) > - ret = node->func(crtc, false, &node->irq); > - if (ret) > - DPU_ERROR("%s failed to disable event %x\n", > - dpu_crtc->name, node->event); > - } > - spin_unlock_irqrestore(&dpu_crtc->spin_lock, flags); > - > dpu_core_perf_crtc_update(crtc, 0, true); > > drm_for_each_encoder(encoder, crtc->dev) { > @@ -2656,8 +2592,6 @@ static void dpu_crtc_enable(struct drm_crtc *crtc, > struct dpu_crtc *dpu_crtc; > struct drm_encoder *encoder; > struct msm_drm_private *priv; > - unsigned long flags; > - struct dpu_crtc_irq_info *node = NULL; > struct drm_event event; > u32 power_on; > int ret; > @@ -2709,17 +2643,6 @@ static void dpu_crtc_enable(struct drm_crtc *crtc, > > mutex_unlock(&dpu_crtc->crtc_lock); > > - spin_lock_irqsave(&dpu_crtc->spin_lock, flags); > - list_for_each_entry(node, &dpu_crtc->user_event_list, list) { > - ret = 0; > - if (node->func) > - ret = node->func(crtc, true, &node->irq); > - if (ret) > - DPU_ERROR("%s failed to enable event %x\n", > - dpu_crtc->name, node->event); > - } > - spin_unlock_irqrestore(&dpu_crtc->spin_lock, flags); > - > dpu_crtc->power_event = dpu_power_handle_register_event( > &priv->phandle, > DPU_POWER_EVENT_POST_ENABLE | DPU_POWER_EVENT_POST_DISABLE | > @@ -3995,7 +3918,7 @@ struct drm_crtc *dpu_crtc_init(struct drm_device *dev, struct drm_plane *plane) > init_completion(&dpu_crtc->frame_done_comp); > > INIT_LIST_HEAD(&dpu_crtc->frame_event_list); > - INIT_LIST_HEAD(&dpu_crtc->user_event_list); > + > for (i = 0; i < ARRAY_SIZE(dpu_crtc->frame_events); i++) { > INIT_LIST_HEAD(&dpu_crtc->frame_events[i].list); > list_add(&dpu_crtc->frame_events[i].list, > @@ -4039,142 +3962,3 @@ struct drm_crtc *dpu_crtc_init(struct drm_device *dev, struct drm_plane *plane) > DPU_DEBUG("%s: successfully initialized crtc\n", dpu_crtc->name); > return crtc; > } > - > -static int _dpu_crtc_event_enable(struct dpu_kms *kms, > - struct drm_crtc *crtc_drm, u32 event) > -{ > - struct dpu_crtc *crtc = NULL; > - struct dpu_crtc_irq_info *node; > - struct msm_drm_private *priv; > - unsigned long flags; > - bool found = false; > - int ret, i = 0; > - > - crtc = to_dpu_crtc(crtc_drm); > - spin_lock_irqsave(&crtc->spin_lock, flags); > - list_for_each_entry(node, &crtc->user_event_list, list) { > - if (node->event == event) { > - found = true; > - break; > - } > - } > - spin_unlock_irqrestore(&crtc->spin_lock, flags); > - > - /* event already enabled */ > - if (found) > - return 0; > - > - node = NULL; > - for (i = 0; i < ARRAY_SIZE(custom_events); i++) { > - if (custom_events[i].event == event && > - custom_events[i].func) { > - node = kzalloc(sizeof(*node), GFP_KERNEL); > - if (!node) > - return -ENOMEM; > - node->event = event; > - INIT_LIST_HEAD(&node->list); > - node->func = custom_events[i].func; > - node->event = event; > - break; > - } > - } > - > - if (!node) { > - DPU_ERROR("unsupported event %x\n", event); > - return -EINVAL; > - } > - > - priv = kms->dev->dev_private; > - ret = 0; > - if (crtc_drm->enabled) { > - dpu_power_resource_enable(&priv->phandle, kms->core_client, > - true); > - INIT_LIST_HEAD(&node->irq.list); > - ret = node->func(crtc_drm, true, &node->irq); > - dpu_power_resource_enable(&priv->phandle, kms->core_client, > - false); > - } > - > - if (!ret) { > - spin_lock_irqsave(&crtc->spin_lock, flags); > - list_add_tail(&node->list, &crtc->user_event_list); > - spin_unlock_irqrestore(&crtc->spin_lock, flags); > - } else { > - kfree(node); > - } > - > - return ret; > -} > - > -static int _dpu_crtc_event_disable(struct dpu_kms *kms, > - struct drm_crtc *crtc_drm, u32 event) > -{ > - struct dpu_crtc *crtc = NULL; > - struct dpu_crtc_irq_info *node = NULL; > - struct msm_drm_private *priv; > - unsigned long flags; > - bool found = false; > - int ret; > - > - crtc = to_dpu_crtc(crtc_drm); > - spin_lock_irqsave(&crtc->spin_lock, flags); > - list_for_each_entry(node, &crtc->user_event_list, list) { > - if (node->event == event) { > - list_del(&node->list); > - found = true; > - break; > - } > - } > - spin_unlock_irqrestore(&crtc->spin_lock, flags); > - > - /* event already disabled */ > - if (!found) > - return 0; > - > - /** > - * crtc is disabled interrupts are cleared remove from the list, > - * no need to disable/de-register. > - */ > - if (!crtc_drm->enabled) { > - kfree(node); > - return 0; > - } > - priv = kms->dev->dev_private; > - dpu_power_resource_enable(&priv->phandle, kms->core_client, true); > - ret = node->func(crtc_drm, false, &node->irq); > - dpu_power_resource_enable(&priv->phandle, kms->core_client, false); > - return ret; > -} > - > -int dpu_crtc_register_custom_event(struct dpu_kms *kms, > - struct drm_crtc *crtc_drm, u32 event, bool en) > -{ > - struct dpu_crtc *crtc = NULL; > - int ret; > - > - crtc = to_dpu_crtc(crtc_drm); > - if (!crtc || !kms || !kms->dev) { > - DRM_ERROR("invalid dpu_crtc %pK kms %pK dev %pK\n", crtc, > - kms, ((kms) ? (kms->dev) : NULL)); > - return -EINVAL; > - } > - > - if (en) > - ret = _dpu_crtc_event_enable(kms, crtc_drm, event); > - else > - ret = _dpu_crtc_event_disable(kms, crtc_drm, event); > - > - return ret; > -} > - > -static int dpu_crtc_power_interrupt_handler(struct drm_crtc *crtc_drm, > - bool en, struct dpu_irq_callback *irq) > -{ > - return 0; > -} > - > -static int dpu_crtc_idle_interrupt_handler(struct drm_crtc *crtc_drm, > - bool en, struct dpu_irq_callback *irq) > -{ > - return 0; > -} > diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h > index fade658..bc08416 100644 > --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h > +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h > @@ -223,7 +223,6 @@ struct dpu_crtc { > struct list_head dirty_list; > struct list_head ad_dirty; > struct list_head ad_active; > - struct list_head user_event_list; > > struct mutex crtc_lock; > > diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c > index 2c187e9..5b07f77 100644 > --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c > +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c > @@ -90,8 +90,6 @@ > > static int dpu_kms_hw_init(struct msm_kms *kms); > static int _dpu_kms_mmu_destroy(struct dpu_kms *dpu_kms); > -static int _dpu_kms_register_events(struct msm_kms *kms, > - struct drm_mode_object *obj, u32 event, bool en); > bool dpu_is_custom_client(void) > { > return dpucustom; > @@ -1745,7 +1743,6 @@ static int dpu_kms_pm_resume(struct device *dev) > .pm_suspend = dpu_kms_pm_suspend, > .pm_resume = dpu_kms_pm_resume, > .destroy = dpu_kms_destroy, > - .register_events = _dpu_kms_register_events, > .get_address_space = _dpu_kms_get_address_space, > .postopen = _dpu_kms_post_open, > }; > @@ -2159,31 +2156,3 @@ struct msm_kms *dpu_kms_init(struct drm_device *dev) > return &dpu_kms->base; > } > > -static int _dpu_kms_register_events(struct msm_kms *kms, > - struct drm_mode_object *obj, u32 event, bool en) > -{ > - int ret = 0; > - struct drm_crtc *crtc = NULL; > - struct drm_connector *conn = NULL; > - struct dpu_kms *dpu_kms = NULL; > - > - if (!kms || !obj) { > - DPU_ERROR("invalid argument kms %pK obj %pK\n", kms, obj); > - return -EINVAL; > - } > - > - dpu_kms = to_dpu_kms(kms); > - switch (obj->type) { > - case DRM_MODE_OBJECT_CRTC: > - crtc = obj_to_crtc(obj); > - ret = dpu_crtc_register_custom_event(dpu_kms, crtc, event, en); > - break; > - case DRM_MODE_OBJECT_CONNECTOR: > - conn = obj_to_connector(obj); > - ret = dpu_connector_register_custom_event(dpu_kms, conn, event, > - en); > - break; > - } > - > - return ret; > -} > diff --git a/drivers/gpu/drm/msm/msm_drv.c b/drivers/gpu/drm/msm/msm_drv.c > index 5b12e87..a710b63 100644 > --- a/drivers/gpu/drm/msm/msm_drv.c > +++ b/drivers/gpu/drm/msm/msm_drv.c > @@ -1226,180 +1226,6 @@ static int msm_ioctl_submitqueue_close(struct drm_device *dev, void *data, > return msm_submitqueue_remove(file->driver_priv, id); > } > > -static int msm_drm_object_supports_event(struct drm_device *dev, > - struct drm_msm_event_req *req, struct drm_file *file) > -{ > - int ret = -EINVAL; > - struct drm_mode_object *arg_obj; > - > - arg_obj = drm_mode_object_find(dev, file, req->object_id, req->object_type); > - if (!arg_obj) > - return -ENOENT; > - > - switch (arg_obj->type) { > - case DRM_MODE_OBJECT_CRTC: > - case DRM_MODE_OBJECT_CONNECTOR: > - ret = 0; > - break; > - default: > - ret = -EOPNOTSUPP; > - break; > - } > - > - return ret; > -} > - > -static int msm_register_event(struct drm_device *dev, > - struct drm_msm_event_req *req, struct drm_file *file, bool en) > -{ > - int ret = -EINVAL; > - struct msm_drm_private *priv = dev->dev_private; > - struct msm_kms *kms = priv->kms; > - struct drm_mode_object *arg_obj; > - > - arg_obj = drm_mode_object_find(dev, file, req->object_id, req->object_type); > - if (!arg_obj) > - return -ENOENT; > - > - ret = kms->funcs->register_events(kms, arg_obj, req->event, en); > - return ret; > -} > - > -static int msm_event_client_count(struct drm_device *dev, > - struct drm_msm_event_req *req_event, bool locked) > -{ > - struct msm_drm_private *priv = dev->dev_private; > - unsigned long flag = 0; > - struct msm_drm_event *node; > - int count = 0; > - > - if (!locked) > - spin_lock_irqsave(&dev->event_lock, flag); > - list_for_each_entry(node, &priv->client_event_list, base.link) { > - if (node->event.type == req_event->event && > - node->info.object_id == req_event->object_id) > - count++; > - } > - if (!locked) > - spin_unlock_irqrestore(&dev->event_lock, flag); > - > - return count; > -} > - > -static int msm_ioctl_register_event(struct drm_device *dev, void *data, > - struct drm_file *file) > -{ > - struct msm_drm_private *priv = dev->dev_private; > - struct drm_msm_event_req *req_event = data; > - struct msm_drm_event *client, *node; > - unsigned long flag = 0; > - bool dup_request = false; > - int ret = 0, count = 0; > - > - ret = msm_drm_object_supports_event(dev, req_event, file); > - if (ret) { > - DRM_ERROR("unsupported event %x object %x object id %d\n", > - req_event->event, req_event->object_type, > - req_event->object_id); > - return ret; > - } > - > - spin_lock_irqsave(&dev->event_lock, flag); > - list_for_each_entry(node, &priv->client_event_list, base.link) { > - if (node->base.file_priv != file) > - continue; > - if (node->event.type == req_event->event && > - node->info.object_id == req_event->object_id) { > - DRM_DEBUG("duplicate request for event %x obj id %d\n", > - node->event.type, node->info.object_id); > - dup_request = true; > - break; > - } > - } > - spin_unlock_irqrestore(&dev->event_lock, flag); > - > - if (dup_request) > - return -EALREADY; > - > - client = kzalloc(sizeof(*client), GFP_KERNEL); > - if (!client) > - return -ENOMEM; > - > - client->base.file_priv = file; > - client->base.event = &client->event; > - client->event.type = req_event->event; > - memcpy(&client->info, req_event, sizeof(client->info)); > - > - /* Get the count of clients that have registered for event. > - * Event should be enabled for first client, for subsequent enable > - * calls add to client list and return. > - */ > - count = msm_event_client_count(dev, req_event, false); > - /* Add current client to list */ > - spin_lock_irqsave(&dev->event_lock, flag); > - list_add_tail(&client->base.link, &priv->client_event_list); > - spin_unlock_irqrestore(&dev->event_lock, flag); > - > - if (count) > - return 0; > - > - ret = msm_register_event(dev, req_event, file, true); > - if (ret) { > - DRM_ERROR("failed to enable event %x object %x object id %d\n", > - req_event->event, req_event->object_type, > - req_event->object_id); > - spin_lock_irqsave(&dev->event_lock, flag); > - list_del(&client->base.link); > - spin_unlock_irqrestore(&dev->event_lock, flag); > - kfree(client); > - } > - return ret; > -} > - > -static int msm_ioctl_deregister_event(struct drm_device *dev, void *data, > - struct drm_file *file) > -{ > - struct msm_drm_private *priv = dev->dev_private; > - struct drm_msm_event_req *req_event = data; > - struct msm_drm_event *client = NULL, *node, *temp; > - unsigned long flag = 0; > - int count = 0; > - bool found = false; > - int ret = 0; > - > - ret = msm_drm_object_supports_event(dev, req_event, file); > - if (ret) { > - DRM_ERROR("unsupported event %x object %x object id %d\n", > - req_event->event, req_event->object_type, > - req_event->object_id); > - return ret; > - } > - > - spin_lock_irqsave(&dev->event_lock, flag); > - list_for_each_entry_safe(node, temp, &priv->client_event_list, > - base.link) { > - if (node->event.type == req_event->event && > - node->info.object_id == req_event->object_id && > - node->base.file_priv == file) { > - client = node; > - list_del(&client->base.link); > - found = true; > - kfree(client); > - break; > - } > - } > - spin_unlock_irqrestore(&dev->event_lock, flag); > - > - if (!found) > - return -ENOENT; > - > - count = msm_event_client_count(dev, req_event, false); > - if (!count) > - ret = msm_register_event(dev, req_event, file, false); > - > - return ret; > -} > - > void msm_mode_object_event_notify(struct drm_mode_object *obj, > struct drm_device *dev, struct drm_event *event, u8 *payload) > { > @@ -1452,29 +1278,6 @@ void msm_mode_object_event_notify(struct drm_mode_object *obj, > > static int msm_release(struct inode *inode, struct file *filp) > { > - struct drm_file *file_priv = filp->private_data; > - struct drm_minor *minor = file_priv->minor; > - struct drm_device *dev = minor->dev; > - struct msm_drm_private *priv = dev->dev_private; > - struct msm_drm_event *node, *temp; > - u32 count; > - unsigned long flags; > - > - spin_lock_irqsave(&dev->event_lock, flags); > - list_for_each_entry_safe(node, temp, &priv->client_event_list, > - base.link) { > - if (node->base.file_priv != file_priv) > - continue; > - list_del(&node->base.link); > - spin_unlock_irqrestore(&dev->event_lock, flags); > - count = msm_event_client_count(dev, &node->info, true); > - if (!count) > - msm_register_event(dev, &node->info, file_priv, false); > - kfree(node); > - spin_lock_irqsave(&dev->event_lock, flags); > - } > - spin_unlock_irqrestore(&dev->event_lock, flags); > - > return drm_release(inode, filp); > } > > @@ -1595,10 +1398,6 @@ int msm_ioctl_rmfb2(struct drm_device *dev, void *data, > #ifdef CONFIG_DRM_MSM_WRITEBACK > DRM_IOCTL_DEF_DRV(DPU_WB_CONFIG, dpu_wb_config, DRM_UNLOCKED|DRM_AUTH), > #endif > - DRM_IOCTL_DEF_DRV(MSM_REGISTER_EVENT, msm_ioctl_register_event, > - DRM_UNLOCKED|DRM_CONTROL_ALLOW), > - DRM_IOCTL_DEF_DRV(MSM_DEREGISTER_EVENT, msm_ioctl_deregister_event, > - DRM_UNLOCKED|DRM_CONTROL_ALLOW), > DRM_IOCTL_DEF_DRV(MSM_RMFB2, msm_ioctl_rmfb2, > DRM_CONTROL_ALLOW|DRM_UNLOCKED), > }; > diff --git a/drivers/gpu/drm/msm/msm_kms.h b/drivers/gpu/drm/msm/msm_kms.h > index 25800c0..0ae1deb 100644 > --- a/drivers/gpu/drm/msm/msm_kms.h > +++ b/drivers/gpu/drm/msm/msm_kms.h > @@ -94,8 +94,6 @@ struct msm_kms_funcs { > void (*preclose)(struct msm_kms *kms, struct drm_file *file); > void (*postclose)(struct msm_kms *kms, struct drm_file *file); > void (*lastclose)(struct msm_kms *kms); > - int (*register_events)(struct msm_kms *kms, > - struct drm_mode_object *obj, u32 event, bool en); > void (*set_encoder_mode)(struct msm_kms *kms, > struct drm_encoder *encoder, > bool cmd_mode); > -- > The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, > a Linux Foundation Collaborative Project > > -- > To unsubscribe from this list: send the line "unsubscribe linux-arm-msm" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html -- Sean Paul, Software Engineer, Google / Chromium OS -- To unsubscribe from this list: send the line "unsubscribe linux-arm-msm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html