From 74dd4682cd00524550ae5baee10415e074aed407 Mon Sep 17 00:00:00 2001 From: Raviteja Tamatam Date: Thu, 24 Sep 2020 04:35:11 +0530 Subject: [PATCH 1/3] disp: msm: sde rotator driver configs for probe only Added code for dummy probe defined under CONFIG_SDE_ROTATOR_INIT_ONLY to address cases where rotator device node is defined but driver needs to be disabled. This is stop gap arrangement until v4l2 configs are available in GKI. Change-Id: I069b37f818d2e4401b3992f1f1e308858a7e29e6 Signed-off-by: Raviteja Tamatam --- rotator/sde_rotator_dev.c | 34 +++++++++++++++++++++++++++++++++- rotator/sde_rotator_dev.h | 4 +++- 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/rotator/sde_rotator_dev.c b/rotator/sde_rotator_dev.c index 1c9dbe2f9c..c97d52e6fb 100644 --- a/rotator/sde_rotator_dev.c +++ b/rotator/sde_rotator_dev.c @@ -52,7 +52,7 @@ #define SDE_ROTATOR_ADD_REQUEST 1 #define SDE_ROTATOR_REMOVE_REQUEST 0 - +#ifndef CONFIG_MSM_SDE_ROTATOR_INIT_ONLY static void sde_rotator_submit_handler(struct kthread_work *work); static void sde_rotator_retire_handler(struct kthread_work *work); #ifdef CONFIG_COMPAT @@ -3373,6 +3373,7 @@ static struct v4l2_m2m_ops sde_rotator_m2m_ops = { .job_abort = sde_rotator_job_abort, .job_ready = sde_rotator_job_ready, }; +#endif /* Device tree match struct */ static const struct of_device_id sde_rotator_dt_match[] = { @@ -3383,6 +3384,7 @@ static const struct of_device_id sde_rotator_dt_match[] = { {} }; +#ifndef CONFIG_MSM_SDE_ROTATOR_INIT_ONLY /* * sde_rotator_get_drv_data - rotator device driver data. * @dev: Pointer to device. @@ -3580,6 +3582,36 @@ static struct platform_driver rotator_driver = { }, }; +#else +/* + * sde_rotator_probe - rotator device probe method. + * @pdev: Pointer to rotator platform device. + */ +static int sde_rotator_probe(struct platform_device *pdev) +{ + return 0; +} + +/* + * sde_rotator_remove - rotator device remove method. + * @pdev: Pointer rotator platform device. + */ +static int sde_rotator_remove(struct platform_device *pdev) +{ + return 0; +} + +/* SDE Rotator platform driver definition */ +static struct platform_driver rotator_driver = { + .probe = sde_rotator_probe, + .remove = sde_rotator_remove, + .driver = { + .name = SDE_ROTATOR_DRV_NAME, + .of_match_table = sde_rotator_dt_match, + }, +}; +#endif + void __init sde_rotator_register(void) { platform_driver_register(&rotator_driver); diff --git a/rotator/sde_rotator_dev.h b/rotator/sde_rotator_dev.h index 8091ae02c5..d83e9d7f74 100644 --- a/rotator/sde_rotator_dev.h +++ b/rotator/sde_rotator_dev.h @@ -1,6 +1,6 @@ /* SPDX-License-Identifier: GPL-2.0-only */ /* - * Copyright (c) 2015-2019, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-2020, The Linux Foundation. All rights reserved. */ #ifndef __SDE_ROTATOR_DEV_H__ @@ -215,7 +215,9 @@ struct sde_rotator_device { struct device *dev; struct v4l2_device v4l2_dev; struct video_device *vdev; +#ifndef CONFIG_MSM_SDE_ROTATOR_INIT_ONLY struct v4l2_m2m_dev *m2m_dev; +#endif struct platform_device *pdev; const void *drvdata; u32 early_submit; From af9841fa44fd4ac4a4a59a67bea0491de5b5ca3e Mon Sep 17 00:00:00 2001 From: Yashwanth Date: Tue, 22 Sep 2020 17:06:15 +0530 Subject: [PATCH 2/3] disp: msm: enable SDE rotator driver configs for GKI This change enables and exports configs to support SDE offline rotator in GKI. It also removes unused ioctls for rotator compilation with GKI config. Change-Id: I7f67aec394f644478173dcfe9e3ff52fe9129615 Signed-off-by: Yashwanth --- config/gki_holidisp.conf | 3 +++ config/gki_holidispconf.h | 3 +++ rotator/sde_rotator_debug.c | 3 +++ rotator/sde_rotator_dev.c | 1 - rotator/sde_rotator_r1_debug.c | 5 ++++- rotator/sde_rotator_r3_debug.c | 5 ++++- rotator/sde_rotator_sync.c | 4 ++-- 7 files changed, 19 insertions(+), 5 deletions(-) diff --git a/config/gki_holidisp.conf b/config/gki_holidisp.conf index 6df5fa7e71..ce2c475e51 100644 --- a/config/gki_holidisp.conf +++ b/config/gki_holidisp.conf @@ -13,3 +13,6 @@ export CONFIG_DRM_MSM_REGISTER_LOGGING=y export CONFIG_QCOM_MDSS_PLL=y export CONFIG_DRM_SDE_RSC=n export CONFIG_DISPLAY_BUILD=m +export CONFIG_MSM_SDE_ROTATOR=y +export CONFIG_MSM_SDE_ROTATOR_EVTLOG_DEBUG=y +export CONFIG_MSM_SDE_ROTATOR_INIT_ONLY=y diff --git a/config/gki_holidispconf.h b/config/gki_holidispconf.h index 378d3216bb..535c20d518 100644 --- a/config/gki_holidispconf.h +++ b/config/gki_holidispconf.h @@ -12,3 +12,6 @@ #define CONFIG_DRM_SDE_EVTLOG_DEBUG 1 #define CONFIG_QCOM_MDSS_PLL 1 #define CONFIG_GKI_DISPLAY 1 +#define CONFIG_MSM_SDE_ROTATOR 1 +#define CONFIG_MSM_SDE_ROTATOR_EVTLOG_DEBUG 1 +#define CONFIG_MSM_SDE_ROTATOR_INIT_ONLY 1 diff --git a/rotator/sde_rotator_debug.c b/rotator/sde_rotator_debug.c index 42a5272529..181620f8dc 100644 --- a/rotator/sde_rotator_debug.c +++ b/rotator/sde_rotator_debug.c @@ -50,6 +50,8 @@ #define SDE_ROT_TEST_MASK(id, tp) ((id << 4) | (tp << 1) | BIT(0)) +#if defined(CONFIG_MSM_SDE_ROTATOR_EVTLOG_DEBUG) && \ + defined(CONFIG_DEBUG_FS) static DEFINE_SPINLOCK(sde_rot_xlock); /* @@ -1358,3 +1360,4 @@ void sde_rotator_destroy_debugfs(struct dentry *debugfs) { debugfs_remove_recursive(debugfs); } +#endif diff --git a/rotator/sde_rotator_dev.c b/rotator/sde_rotator_dev.c index c97d52e6fb..f8ddb8d41a 100644 --- a/rotator/sde_rotator_dev.c +++ b/rotator/sde_rotator_dev.c @@ -2844,7 +2844,6 @@ static const struct v4l2_ioctl_ops sde_rotator_ioctl_ops = { .vidioc_g_parm = sde_rotator_g_parm, .vidioc_s_parm = sde_rotator_s_parm, .vidioc_default = sde_rotator_private_ioctl, - .vidioc_log_status = v4l2_ctrl_log_status, .vidioc_subscribe_event = sde_rotator_ctrl_subscribe_event, .vidioc_unsubscribe_event = sde_rotator_event_unsubscribe, }; diff --git a/rotator/sde_rotator_r1_debug.c b/rotator/sde_rotator_r1_debug.c index 06bc11c3cd..8dff33de99 100644 --- a/rotator/sde_rotator_r1_debug.c +++ b/rotator/sde_rotator_r1_debug.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only /* - * Copyright (c) 2015-2019, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-2020, The Linux Foundation. All rights reserved. */ #define pr_fmt(fmt) "%s: " fmt, __func__ @@ -16,6 +16,8 @@ #include "sde_rotator_r1.h" #include "sde_rotator_r1_internal.h" +#if defined(CONFIG_MSM_SDE_ROTATOR_EVTLOG_DEBUG) && \ + defined(CONFIG_DEBUG_FS) /* * sde_rotator_r1_create_debugfs - Setup rotator r1 debugfs directory structure. * @rot_dev: Pointer to rotator device @@ -34,3 +36,4 @@ int sde_rotator_r1_create_debugfs(struct sde_rot_mgr *mgr, return 0; } +#endif diff --git a/rotator/sde_rotator_r3_debug.c b/rotator/sde_rotator_r3_debug.c index d2060afb0f..267eee54b6 100644 --- a/rotator/sde_rotator_r3_debug.c +++ b/rotator/sde_rotator_r3_debug.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only /* - * Copyright (c) 2015-2019, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-2020, The Linux Foundation. All rights reserved. */ #define pr_fmt(fmt) "%s: " fmt, __func__ @@ -16,6 +16,8 @@ #include "sde_rotator_r3.h" #include "sde_rotator_r3_internal.h" +#if defined(CONFIG_MSM_SDE_ROTATOR_EVTLOG_DEBUG) && \ + defined(CONFIG_DEBUG_FS) /* * sde_rotator_r3_create_debugfs - Setup rotator r3 debugfs directory structure. * @rot_dev: Pointer to rotator device @@ -68,3 +70,4 @@ int sde_rotator_r3_create_debugfs(struct sde_rot_mgr *mgr, return 0; } +#endif diff --git a/rotator/sde_rotator_sync.c b/rotator/sde_rotator_sync.c index a4f28cfe05..4f7f54aa62 100644 --- a/rotator/sde_rotator_sync.c +++ b/rotator/sde_rotator_sync.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only /* - * Copyright (c) 2015-2019, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-2020, The Linux Foundation. All rights reserved. */ #define pr_fmt(fmt) "%s: " fmt, __func__ @@ -148,7 +148,7 @@ static void sde_rot_fence_release(struct dma_fence *fence) list_del(&f->fence_list); spin_unlock_irqrestore(fence->lock, flags); sde_rotator_put_timeline(to_sde_rot_timeline(fence)); - kfree_rcu(f, base.rcu); + kfree(f); } static void sde_rot_fence_value_str(struct dma_fence *fence, char *str, From 26833249733d9a859ff41b0d41d9a30fc153fa16 Mon Sep 17 00:00:00 2001 From: Yashwanth Date: Fri, 25 Sep 2020 14:43:49 +0530 Subject: [PATCH 3/3] disp: msm: register rotator platform driver after genpd init Due to power-domain, if rotator driver is registered early, probe might get deferred several times and get stuck indefinitely. So, this change adds driver registration after genpd init to handle such cases. Change-Id: I8dcb640d0ab0cdf0818cbce1b1fb460c28d8b9e7 Signed-off-by: Yashwanth --- msm/msm_drv.c | 6 ++++-- msm/msm_drv.h | 16 ++++++++-------- rotator/sde_rotator_dev.c | 4 ++-- rotator/sde_rotator_smmu.c | 4 ++-- 4 files changed, 16 insertions(+), 14 deletions(-) diff --git a/msm/msm_drv.c b/msm/msm_drv.c index d7bc641fed..65dd98fd5e 100644 --- a/msm/msm_drv.c +++ b/msm/msm_drv.c @@ -860,6 +860,10 @@ static int msm_drm_component_init(struct device *dev) goto fail; } + /* Register rotator platform driver only after genpd init */ + sde_rotator_register(); + sde_rotator_smmu_driver_register(); + ret = msm_drm_display_thread_create(param, priv, ddev, dev); if (ret) { dev_err(dev, "msm_drm_display_thread_create failed\n"); @@ -2198,8 +2202,6 @@ static int __init msm_drm_register(void) msm_hdcp_register(); dp_display_register(); msm_smmu_driver_init(); - sde_rotator_register(); - sde_rotator_smmu_driver_register(); msm_dsi_register(); msm_edp_register(); msm_hdmi_register(); diff --git a/msm/msm_drv.h b/msm/msm_drv.h index a16da105e7..abb02fcc6d 100644 --- a/msm/msm_drv.h +++ b/msm/msm_drv.h @@ -1294,25 +1294,25 @@ static inline void __exit sde_wb_unregister(void) #endif /* CONFIG_DRM_SDE_WB */ #if IS_ENABLED(CONFIG_MSM_SDE_ROTATOR) -void __init sde_rotator_register(void); -void __exit sde_rotator_unregister(void); +void sde_rotator_register(void); +void sde_rotator_unregister(void); #else -static inline void __init sde_rotator_register(void) +static inline void sde_rotator_register(void) { } -static inline void __exit sde_rotator_unregister(void) +static inline void sde_rotator_unregister(void) { } #endif /* CONFIG_MSM_SDE_ROTATOR */ #if IS_ENABLED(CONFIG_MSM_SDE_ROTATOR) -void __init sde_rotator_smmu_driver_register(void); -void __exit sde_rotator_smmu_driver_unregister(void); +void sde_rotator_smmu_driver_register(void); +void sde_rotator_smmu_driver_unregister(void); #else -static inline void __init sde_rotator_smmu_driver_register(void) +static inline void sde_rotator_smmu_driver_register(void) { } -static inline void __exit sde_rotator_smmu_driver_unregister(void) +static inline void sde_rotator_smmu_driver_unregister(void) { } #endif /* CONFIG_MSM_SDE_ROTATOR */ diff --git a/rotator/sde_rotator_dev.c b/rotator/sde_rotator_dev.c index f8ddb8d41a..d54f47f2a4 100644 --- a/rotator/sde_rotator_dev.c +++ b/rotator/sde_rotator_dev.c @@ -3611,12 +3611,12 @@ static struct platform_driver rotator_driver = { }; #endif -void __init sde_rotator_register(void) +void sde_rotator_register(void) { platform_driver_register(&rotator_driver); } -void __exit sde_rotator_unregister(void) +void sde_rotator_unregister(void) { platform_driver_unregister(&rotator_driver); } diff --git a/rotator/sde_rotator_smmu.c b/rotator/sde_rotator_smmu.c index 6a623bb684..cf37bd92cc 100644 --- a/rotator/sde_rotator_smmu.c +++ b/rotator/sde_rotator_smmu.c @@ -671,12 +671,12 @@ static struct platform_driver sde_smmu_driver = { }, }; -void __init sde_rotator_smmu_driver_register(void) +void sde_rotator_smmu_driver_register(void) { platform_driver_register(&sde_smmu_driver); } -void __exit sde_rotator_smmu_driver_unregister(void) +void sde_rotator_smmu_driver_unregister(void) { platform_driver_unregister(&sde_smmu_driver); }