android_kernel_xiaomi_sm8350/msm/sde_vm_event.c
Jeykumar Sankaran 99df0d5052 disp: msm: add support for vm event register framework
Besides SDE, other subdrivers may be interested in participating in
the VM switch. This change provides framework for display dependent
drivers like DSI, DP and RSCC to register for various VM switch
event hooks.

The following hooks to provided through msm_vm_ops:
post_hw_acquire: invoked before the first frame push after gaining
                 HW access.
pre_hw_release: invoked after the last frame commit before releasing
                the HW.
check:       check with vm clients for their readiness for HW
             releasing.

Change-Id: I616db04e979f78f76f6f97ee3b068dd348339ab6
Signed-off-by: Jeykumar Sankaran <jsanka@codeaurora.org>
2020-07-08 23:14:31 -07:00

59 lines
1.5 KiB
C

// SPDX-License-Identifier: GPL-2.0-only
/*
* Copyright (c) 2020, The Linux Foundation. All rights reserved.
*/
#include <linux/sde_vm_event.h>
#include "msm_drv.h"
int msm_register_vm_event(struct device *dev, struct device *client_dev,
struct msm_vm_ops *ops, void *priv_data)
{
struct platform_device *pdev = to_platform_device(dev);
struct drm_device *ddev = platform_get_drvdata(pdev);
struct msm_drm_private *priv = ddev->dev_private;
struct msm_vm_client_entry *client_entry;
if (!client_dev || !ops)
return -EINVAL;
client_entry = kzalloc(sizeof(*client_entry), GFP_KERNEL);
if (!client_entry)
return -ENOMEM;
mutex_lock(&priv->vm_client_lock);
memcpy(&client_entry->ops, ops, sizeof(*ops));
client_entry->dev = client_dev;
client_entry->data = priv_data;
list_add(&client_entry->list, &priv->vm_client_list);
mutex_unlock(&priv->vm_client_lock);
return 0;
}
EXPORT_SYMBOL(msm_register_vm_event);
void msm_unregister_vm_event(struct device *dev, struct device *client_dev)
{
struct platform_device *pdev = to_platform_device(dev);
struct drm_device *ddev = platform_get_drvdata(pdev);
struct msm_drm_private *priv = ddev->dev_private;
struct msm_vm_client_entry *client_entry, *tmp;
mutex_lock(&priv->vm_client_lock);
list_for_each_entry_safe(client_entry, tmp, &priv->vm_client_list,
list) {
if (client_entry->dev == client_dev) {
list_del(&client_entry->list);
kfree(client_entry);
break;
}
}
mutex_unlock(&priv->vm_client_lock);
}
EXPORT_SYMBOL(msm_unregister_vm_event);