summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Documentation/devicetree/bindings/display/msm/sde-hyp.txt7
-rw-r--r--drivers/gpu/drm/msm-hyp/msm_drv_hyp.c51
2 files changed, 58 insertions, 0 deletions
diff --git a/Documentation/devicetree/bindings/display/msm/sde-hyp.txt b/Documentation/devicetree/bindings/display/msm/sde-hyp.txt
index 6e60822ad95b..5eb685a706c2 100644
--- a/Documentation/devicetree/bindings/display/msm/sde-hyp.txt
+++ b/Documentation/devicetree/bindings/display/msm/sde-hyp.txt
@@ -7,7 +7,14 @@ VBlank and Page Flip events to User Space listeners.
Required properties
- compatible: Must be "qcom,sde-kms-hyp"
+Optional properties:
+- qcom,client-id: A four character string that is converted to a u32. It's
+ understood as a hex value, if compatible (i.e. "7816").
+ Otherwise, it is treated as a FourCC sequence code
+ (i.e. "LV01").
+
Example:
sde_kms_hyp: qcom,sde_kms_hyp@900000 {
compatible = "qcom,sde-kms-hyp";
+ qcom,client-id = "7816";
};
diff --git a/drivers/gpu/drm/msm-hyp/msm_drv_hyp.c b/drivers/gpu/drm/msm-hyp/msm_drv_hyp.c
index 8e2f57741e43..baf7ee266088 100644
--- a/drivers/gpu/drm/msm-hyp/msm_drv_hyp.c
+++ b/drivers/gpu/drm/msm-hyp/msm_drv_hyp.c
@@ -161,6 +161,7 @@ struct drm_msm_hyp_gem {
#define DRM_MSM_HYP_GEM_GET 0x1
#define DRM_MSM_HYP_GEM_PUT 0x2
#define DRM_MSM_HYP_GEM_QRY 0x3
+#define DRM_MSM_HYP_QRY_CLT_ID 0x4
#define DRM_IOCTL_MSM_HYP_GEM_GET\
DRM_IOWR(DRM_COMMAND_BASE + DRM_MSM_HYP_GEM_GET, struct drm_msm_hyp_gem)
@@ -168,6 +169,10 @@ struct drm_msm_hyp_gem {
DRM_IOW(DRM_COMMAND_BASE + DRM_MSM_HYP_GEM_PUT, struct drm_msm_hyp_gem)
#define DRM_IOCTL_MSM_HYP_GEM_QRY\
DRM_IOWR(DRM_COMMAND_BASE + DRM_MSM_HYP_GEM_QRY, struct drm_msm_hyp_gem)
+#define DRM_IOCTL_MSM_HYP_QRY_CLT_ID\
+ DRM_IOR(DRM_COMMAND_BASE + DRM_MSM_HYP_QRY_CLT_ID, u32)
+
+#define CLIENT_ID_LEN_IN_CHARS 5
static ssize_t msm_drm_write(struct file *filp, const char __user *buffer,
size_t count, loff_t *offset)
@@ -306,6 +311,50 @@ static int msm_ioctl_gem_put(struct drm_device *dev, void *data,
return ret;
}
+static int _msm_parse_dt(struct device_node *node, u32 *client_id)
+{
+ int len = 0;
+ int ret = 0;
+ const char *client_id_str;
+
+ client_id_str = of_get_property(node, "qcom,client-id", &len);
+ if (len != CLIENT_ID_LEN_IN_CHARS) {
+ DBG("client_id_str len(%d) is invalid\n", len);
+ ret = -EINVAL;
+ } else {
+ /* Try node as a hex value */
+ ret = kstrtouint(client_id_str, 16, client_id);
+ if (ret) {
+ /* Otherwise, treat at 4cc code */
+ *client_id = fourcc_code(client_id_str[0],
+ client_id_str[1],
+ client_id_str[2],
+ client_id_str[3]);
+
+ ret = 0;
+ }
+ }
+
+ return ret;
+}
+
+static int msm_ioctl_query_client_id(struct drm_device *dev, void *data,
+ struct drm_file *file_priv)
+{
+ struct platform_device *pdev = dev->platformdev;
+ u32 *arg = (u32 *)data;
+ int ret = 0;
+
+ if (!pdev || !pdev->dev.of_node) {
+ DBG("pdev not found\n");
+ return -ENODEV;
+ }
+
+ ret = _msm_parse_dt(pdev->dev.of_node, arg);
+
+ return ret;
+}
+
static const struct file_operations fops = {
.owner = THIS_MODULE,
.open = drm_open,
@@ -324,6 +373,8 @@ static const struct drm_ioctl_desc msm_ioctls[] = {
DRM_AUTH|DRM_RENDER_ALLOW),
DRM_IOCTL_DEF_DRV(MSM_HYP_GEM_QRY, msm_ioctl_gem_query,
DRM_AUTH|DRM_RENDER_ALLOW),
+ DRM_IOCTL_DEF_DRV(MSM_HYP_QRY_CLT_ID, msm_ioctl_query_client_id,
+ DRM_AUTH|DRM_RENDER_ALLOW),
};
static struct drm_driver msm_driver = {