| From foo@baz Fri Mar 16 15:43:17 CET 2018 |
| From: Philipp Zabel <p.zabel@pengutronix.de> |
| Date: Fri, 1 Dec 2017 16:00:41 +0100 |
| Subject: drm/etnaviv: make THERMAL selectable |
| |
| From: Philipp Zabel <p.zabel@pengutronix.de> |
| |
| |
| [ Upstream commit 49b82c389d2a40eaef1355aaa35868b367aec9d1 ] |
| |
| The etnaviv driver causes a link failure if it is built-in but THERMAL |
| is built as a module: |
| |
| drivers/gpu/drm/etnaviv/etnaviv_gpu.o: In function `etnaviv_gpu_bind': |
| etnaviv_gpu.c:(.text+0x4c4): undefined reference to `thermal_of_cooling_device_register' |
| etnaviv_gpu.c:(.text+0x600): undefined reference to `thermal_cooling_device_unregister' |
| drivers/gpu/drm/etnaviv/etnaviv_gpu.o: In function `etnaviv_gpu_unbind': |
| etnaviv_gpu.c:(.text+0x2aac): undefined reference to `thermal_cooling_device_unregister' |
| |
| Adding a Kconfig dependency on THERMAL || !THERMAL to avoid this causes |
| a dependency loop on x86_64: |
| |
| drivers/gpu/drm/tve200/Kconfig:1:error: recursive dependency detected! |
| For a resolution refer to Documentation/kbuild/kconfig-language.txt |
| subsection "Kconfig recursive dependency limitations" |
| drivers/gpu/drm/tve200/Kconfig:1: symbol DRM_TVE200 depends on CMA |
| For a resolution refer to Documentation/kbuild/kconfig-language.txt |
| subsection "Kconfig recursive dependency limitations" |
| mm/Kconfig:489: symbol CMA is selected by DRM_ETNAVIV |
| For a resolution refer to Documentation/kbuild/kconfig-language.txt |
| subsection "Kconfig recursive dependency limitations" |
| drivers/gpu/drm/etnaviv/Kconfig:2: symbol DRM_ETNAVIV depends on THERMAL |
| For a resolution refer to Documentation/kbuild/kconfig-language.txt |
| subsection "Kconfig recursive dependency limitations" |
| drivers/thermal/Kconfig:5: symbol THERMAL is selected by ACPI_VIDEO |
| For a resolution refer to Documentation/kbuild/kconfig-language.txt |
| subsection "Kconfig recursive dependency limitations" |
| drivers/acpi/Kconfig:189: symbol ACPI_VIDEO is selected by BACKLIGHT_CLASS_DEVICE |
| For a resolution refer to Documentation/kbuild/kconfig-language.txt |
| subsection "Kconfig recursive dependency limitations" |
| drivers/video/backlight/Kconfig:158: symbol BACKLIGHT_CLASS_DEVICE is selected by DRM_PARADE_PS8622 |
| For a resolution refer to Documentation/kbuild/kconfig-language.txt |
| subsection "Kconfig recursive dependency limitations" |
| drivers/gpu/drm/bridge/Kconfig:62: symbol DRM_PARADE_PS8622 depends on DRM_BRIDGE |
| For a resolution refer to Documentation/kbuild/kconfig-language.txt |
| subsection "Kconfig recursive dependency limitations" |
| drivers/gpu/drm/bridge/Kconfig:1: symbol DRM_BRIDGE is selected by DRM_TVE200 |
| |
| To work around this, add a new option DRM_ETNAVIV_THERMAL to optionally |
| enable thermal throttling support and make DRM_ETNAVIV select THERMAL |
| at the same time. |
| |
| Reported-by: Stephen Rothwell <sfr@canb.auug.org.au> |
| Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de> |
| Signed-off-by: Lucas Stach <l.stach@pengutronix.de> |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/gpu/drm/etnaviv/Kconfig | 9 +++++++++ |
| drivers/gpu/drm/etnaviv/etnaviv_gpu.c | 8 +++++--- |
| 2 files changed, 14 insertions(+), 3 deletions(-) |
| |
| --- a/drivers/gpu/drm/etnaviv/Kconfig |
| +++ b/drivers/gpu/drm/etnaviv/Kconfig |
| @@ -6,6 +6,7 @@ config DRM_ETNAVIV |
| depends on MMU |
| select SHMEM |
| select SYNC_FILE |
| + select THERMAL if DRM_ETNAVIV_THERMAL |
| select TMPFS |
| select IOMMU_API |
| select IOMMU_SUPPORT |
| @@ -15,6 +16,14 @@ config DRM_ETNAVIV |
| help |
| DRM driver for Vivante GPUs. |
| |
| +config DRM_ETNAVIV_THERMAL |
| + bool "enable ETNAVIV thermal throttling" |
| + depends on DRM_ETNAVIV |
| + default y |
| + help |
| + Compile in support for thermal throttling. |
| + Say Y unless you want to risk burning your SoC. |
| + |
| config DRM_ETNAVIV_REGISTER_LOGGING |
| bool "enable ETNAVIV register logging" |
| depends on DRM_ETNAVIV |
| --- a/drivers/gpu/drm/etnaviv/etnaviv_gpu.c |
| +++ b/drivers/gpu/drm/etnaviv/etnaviv_gpu.c |
| @@ -1622,7 +1622,7 @@ static int etnaviv_gpu_bind(struct devic |
| struct etnaviv_gpu *gpu = dev_get_drvdata(dev); |
| int ret; |
| |
| - if (IS_ENABLED(CONFIG_THERMAL)) { |
| + if (IS_ENABLED(CONFIG_DRM_ETNAVIV_THERMAL)) { |
| gpu->cooling = thermal_of_cooling_device_register(dev->of_node, |
| (char *)dev_name(dev), gpu, &cooling_ops); |
| if (IS_ERR(gpu->cooling)) |
| @@ -1635,7 +1635,8 @@ static int etnaviv_gpu_bind(struct devic |
| ret = etnaviv_gpu_clk_enable(gpu); |
| #endif |
| if (ret < 0) { |
| - thermal_cooling_device_unregister(gpu->cooling); |
| + if (IS_ENABLED(CONFIG_DRM_ETNAVIV_THERMAL)) |
| + thermal_cooling_device_unregister(gpu->cooling); |
| return ret; |
| } |
| |
| @@ -1692,7 +1693,8 @@ static void etnaviv_gpu_unbind(struct de |
| |
| gpu->drm = NULL; |
| |
| - thermal_cooling_device_unregister(gpu->cooling); |
| + if (IS_ENABLED(CONFIG_DRM_ETNAVIV_THERMAL)) |
| + thermal_cooling_device_unregister(gpu->cooling); |
| gpu->cooling = NULL; |
| } |
| |