From 540737a228e8f465e09e238be5f003a458f174fb Mon Sep 17 00:00:00 2001 From: Jon Hunter Date: Thu, 3 Apr 2025 14:04:56 +0100 Subject: [PATCH] drm/tegra: Update to Linux v6.13 Update the Tegra DRM driver to align with Linux v6.13. A function pointer 'fbdev_probe' was added to the drm_driver structure in Linux v6.13 and so use conftest to detect this and make the necessary changes to the Tegra DRM driver. JIRA LINQPJ14-47 Change-Id: I0120fe9f13bc39446ce4e0a8827eb5d8b42a082c Signed-off-by: Jon Hunter Reviewed-on: https://git-master.nvidia.com/r/c/linux-nv-oot/+/3333836 Reviewed-by: Mikko Perttunen Tested-by: mobile promotions GVS: buildbot_gerritrpt Reviewed-by: mobile promotions --- drivers/gpu/drm/tegra/drm.c | 11 +++++++++++ drivers/gpu/drm/tegra/drm.h | 15 +++++++++++++++ drivers/gpu/drm/tegra/fbdev.c | 13 +++++++++++++ drivers/gpu/drm/tegra/hdmi.c | 2 +- scripts/conftest/Makefile | 2 ++ scripts/conftest/conftest.sh | 19 +++++++++++++++++++ 6 files changed, 61 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/tegra/drm.c b/drivers/gpu/drm/tegra/drm.c index 5be6f086..ddb420d6 100644 --- a/drivers/gpu/drm/tegra/drm.c +++ b/drivers/gpu/drm/tegra/drm.c @@ -23,6 +23,9 @@ #endif #include #include +#if defined(NV_DRM_DRM_CLIENT_SETUP_H_PRESENT) /* Linux v6.13 */ +#include +#endif #include #include #include @@ -743,6 +746,10 @@ static const struct drm_driver tegra_drm_driver = { .dumb_create = tegra_bo_dumb_create, +#if defined(NV_DRM_DRIVER_HAS_FBDEV_PROBE) /* Linux v6.13 */ + TEGRA_FBDEV_DRIVER_OPS, +#endif + .ioctls = tegra_drm_ioctls, .num_ioctls = ARRAY_SIZE(tegra_drm_ioctls), .fops = &tegra_drm_fops, @@ -1199,7 +1206,11 @@ static int host1x_drm_probe(struct host1x_device *dev) if (err < 0) goto hub; +#if defined(NV_DRM_DRIVER_HAS_FBDEV_PROBE) /* Linux v6.13 */ + drm_client_setup(drm, NULL); +#else tegra_fbdev_setup(drm); +#endif return 0; diff --git a/drivers/gpu/drm/tegra/drm.h b/drivers/gpu/drm/tegra/drm.h index 4a26cb67..b602361d 100644 --- a/drivers/gpu/drm/tegra/drm.h +++ b/drivers/gpu/drm/tegra/drm.h @@ -36,6 +36,9 @@ /* XXX move to include/uapi/drm/drm_fourcc.h? */ #define DRM_FORMAT_MOD_NVIDIA_SECTOR_LAYOUT BIT_ULL(22) +struct drm_fb_helper; +struct drm_fb_helper_surface_size; + struct edid; struct reset_control; @@ -220,12 +223,24 @@ struct drm_framebuffer *tegra_fb_create(struct drm_device *drm, struct drm_file *file, const struct drm_mode_fb_cmd2 *cmd); +#if defined(NV_DRM_DRIVER_HAS_FBDEV_PROBE) /* Linux v6.13 */ +#ifdef CONFIG_DRM_FBDEV_EMULATION +int tegra_fbdev_driver_fbdev_probe(struct drm_fb_helper *helper, + struct drm_fb_helper_surface_size *sizes); +#define TEGRA_FBDEV_DRIVER_OPS \ + .fbdev_probe = tegra_fbdev_driver_fbdev_probe +#else +#define TEGRA_FBDEV_DRIVER_OPS \ + .fbdev_probe = NULL +#endif +#else #ifdef CONFIG_DRM_FBDEV_EMULATION void tegra_fbdev_setup(struct drm_device *drm); #else static inline void tegra_fbdev_setup(struct drm_device *drm) { } #endif +#endif /* NV_DRM_DRIVER_HAS_FBDEV_PROBE */ #ifdef CONFIG_DRM_TEGRA_HAVE_DISPLAY extern struct platform_driver tegra_display_hub_driver; diff --git a/drivers/gpu/drm/tegra/fbdev.c b/drivers/gpu/drm/tegra/fbdev.c index d741d6e4..87cffafc 100644 --- a/drivers/gpu/drm/tegra/fbdev.c +++ b/drivers/gpu/drm/tegra/fbdev.c @@ -85,8 +85,16 @@ static const struct fb_ops tegra_fb_ops = { .fb_destroy = tegra_fbdev_fb_destroy, }; +#if defined(NV_DRM_DRIVER_HAS_FBDEV_PROBE) /* Linux v6.13 */ +static const struct drm_fb_helper_funcs tegra_fbdev_helper_funcs = { +}; + +int tegra_fbdev_driver_fbdev_probe(struct drm_fb_helper *helper, + struct drm_fb_helper_surface_size *sizes) +#else static int tegra_fbdev_probe(struct drm_fb_helper *helper, struct drm_fb_helper_surface_size *sizes) +#endif { struct tegra_drm *tegra = helper->dev->dev_private; struct drm_device *drm = helper->dev; @@ -135,6 +143,9 @@ static int tegra_fbdev_probe(struct drm_fb_helper *helper, return PTR_ERR(fb); } +#if defined(NV_DRM_DRIVER_HAS_FBDEV_PROBE) /* Linux v6.13 */ + helper->funcs = &tegra_fbdev_helper_funcs; +#endif helper->fb = fb; #if defined(NV_DRM_FB_HELPER_STRUCT_HAS_INFO_ARG) /* Linux v6.2 */ helper->info = info; @@ -175,6 +186,7 @@ destroy: return err; } +#if !defined(NV_DRM_DRIVER_HAS_FBDEV_PROBE) /* Linux v6.13 */ static const struct drm_fb_helper_funcs tegra_fb_helper_funcs = { .fb_probe = tegra_fbdev_probe, }; @@ -288,3 +300,4 @@ err_drm_client_init: #endif kfree(helper); } +#endif diff --git a/drivers/gpu/drm/tegra/hdmi.c b/drivers/gpu/drm/tegra/hdmi.c index 3ffba63b..08e78996 100644 --- a/drivers/gpu/drm/tegra/hdmi.c +++ b/drivers/gpu/drm/tegra/hdmi.c @@ -439,7 +439,7 @@ tegra_hdmi_get_audio_config(unsigned int audio_freq, unsigned int pix_clock, static void tegra_hdmi_setup_audio_fs_tables(struct tegra_hdmi *hdmi) { - const unsigned int freqs[] = { + static const unsigned int freqs[] = { 32000, 44100, 48000, 88200, 96000, 176400, 192000 }; unsigned int i; diff --git a/scripts/conftest/Makefile b/scripts/conftest/Makefile index 47e56183..5e87edbf 100644 --- a/scripts/conftest/Makefile +++ b/scripts/conftest/Makefile @@ -124,6 +124,7 @@ NV_CONFTEST_FUNCTION_COMPILE_TESTS += dma_slave_config_struct_has_slave_id NV_CONFTEST_FUNCTION_COMPILE_TESTS += drm_aperture_remove_framebuffers NV_CONFTEST_FUNCTION_COMPILE_TESTS += drm_debugfs_remove_files_has_root_arg NV_CONFTEST_FUNCTION_COMPILE_TESTS += drm_display_info_struct_has_source_physical_address +NV_CONFTEST_FUNCTION_COMPILE_TESTS += drm_driver_has_fbdev_probe NV_CONFTEST_FUNCTION_COMPILE_TESTS += drm_driver_struct_has_date NV_CONFTEST_FUNCTION_COMPILE_TESTS += drm_driver_struct_has_irq_enabled_arg NV_CONFTEST_FUNCTION_COMPILE_TESTS += drm_edid_connector_add_modes @@ -266,6 +267,7 @@ NV_HEADER_PRESENCE_TESTS = \ drm/display/drm_scdc_helper.h \ drm/dp/drm_dp_aux_bus.h \ drm/dp/drm_dp_helper.h \ + drm/drm_client_setup.h \ drm/drm_dp_aux_bus.h \ drm/drm_eld.h \ generated/autoconf.h \ diff --git a/scripts/conftest/conftest.sh b/scripts/conftest/conftest.sh index 06f73dc8..9c270027 100755 --- a/scripts/conftest/conftest.sh +++ b/scripts/conftest/conftest.sh @@ -7162,6 +7162,25 @@ compile_test() { compile_check_conftest "$CODE" "NV_DRM_DISPLAY_INFO_STRUCT_HAS_SOURCE_PHYSICAL_ADDRESS" "" "types" ;; + drm_driver_has_fbdev_probe) + # + # Determine if the 'drm_driver' structure has an 'fbdev_probe' + # function pointer. + # + # In Linux v6.13, commit 5d08c44e47b9 ("drm/fbdev: Add + # memory-agnostic fbdev client") added an 'fbdev_probe' callback + # to the drm_driver structure. + # + CODE=" + #include + + int conftest_drm_driver_has_fbdev_probe(void) { + return offsetof(struct drm_driver, fbdev_probe); + }" + + compile_check_conftest "$CODE" "NV_DRM_DRIVER_HAS_FBDEV_PROBE" "" "types" + ;; + drm_driver_struct_has_date) # # Determine if the 'drm_driver' structure has a 'date' field.