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 <jonathanh@nvidia.com>
Reviewed-on: https://git-master.nvidia.com/r/c/linux-nv-oot/+/3333836
Reviewed-by: Mikko Perttunen <mperttunen@nvidia.com>
Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
GVS: buildbot_gerritrpt <buildbot_gerritrpt@nvidia.com>
Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com>
This commit is contained in:
Jon Hunter
2025-04-03 14:04:56 +01:00
parent 6be033ba85
commit 540737a228
6 changed files with 61 additions and 1 deletions

View File

@@ -23,6 +23,9 @@
#endif
#include <drm/drm_atomic.h>
#include <drm/drm_atomic_helper.h>
#if defined(NV_DRM_DRM_CLIENT_SETUP_H_PRESENT) /* Linux v6.13 */
#include <drm/drm_client_setup.h>
#endif
#include <drm/drm_debugfs.h>
#include <drm/drm_drv.h>
#include <drm/drm_fourcc.h>
@@ -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;

View File

@@ -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;

View File

@@ -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

View File

@@ -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;

View File

@@ -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 \

View File

@@ -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 <drm/drm_drv.h>
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.