+ return -EOPNOTSUPP;
+ }
+
if (!info->is_hdmi)
return 0;
diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c
index
272d6254ea4784e97ca894ec4d463beebf9fdbf0..e753de9fc80a26c30b9674c96083328711f32960
100644
--- a/drivers/gpu/drm/drm_connector.c
+++ b/drivers/gpu/drm/drm_connector.c
@@ -553,6 +553,7 @@ EXPORT_SYMBOL(drmm_connector_init);
* @connector_type: user visible type of the connector
* @ddc: optional pointer to the associated ddc adapter
* @supported_formats: Bitmask of @hdmi_colorspace listing supported output
formats
+ * @supported_infoframes: Bitmask of @DRM_CONNECTOR_INFOFRAME listing
supported Infoframes
* @max_bpc: Maximum bits per char the HDMI connector supports
*
* Initialises a preallocated HDMI connector. Connectors can be
@@ -576,6 +577,7 @@ int drmm_connector_hdmi_init(struct drm_device *dev,
int connector_type,
struct i2c_adapter *ddc,
unsigned long supported_formats,
+ unsigned long supported_infoframes,
unsigned int max_bpc)
{
int ret;
@@ -623,6 +625,8 @@ int drmm_connector_hdmi_init(struct drm_device *dev,
connector->hdmi.funcs = hdmi_funcs;
+ connector->hdmi.supported_infoframes = supported_infoframes;
+
return 0;
}
EXPORT_SYMBOL(drmm_connector_hdmi_init);
diff --git a/drivers/gpu/drm/drm_debugfs.c b/drivers/gpu/drm/drm_debugfs.c
index
365cf337529fa2a88b69516d57360d212419c126..248cb9ea1d8781674160cd8d454113c9422ec691
100644
--- a/drivers/gpu/drm/drm_debugfs.c
+++ b/drivers/gpu/drm/drm_debugfs.c
@@ -672,6 +672,9 @@ static int create_hdmi_audio_infoframe_file(struct
drm_connector *connector,
{
struct dentry *file;
+ if (!drm_hdmi_connector_supports_infoframe(connector, HDMI_INFOFRAME_TYPE_AUDIO))
+ return 0;
+
file = debugfs_create_file("audio", 0400, parent, connector,
&audio_infoframe_fops);
if (IS_ERR(file))
return PTR_ERR(file);
@@ -679,7 +682,7 @@ static int create_hdmi_audio_infoframe_file(struct
drm_connector *connector,
return 0;
}
-#define DEFINE_INFOFRAME_FILE(_f) \
+#define DEFINE_INFOFRAME_FILE(_f, _F) \
static ssize_t _f##_read_infoframe(struct file *filp, \
char __user *ubuf, \
size_t count, \
@@ -726,6 +729,9 @@ static int create_hdmi_## _f ## _infoframe_file(struct
drm_connector *connector,
{ \
struct dentry *file; \
\
+ if (!drm_hdmi_connector_supports_infoframe(connector,
HDMI_INFOFRAME_TYPE_ ## _F)) \
+ return 0; \
+ \
file = debugfs_create_file(#_f, 0400, parent, connector, &_f ##
_infoframe_fops); \
if (IS_ERR(file)) \
return PTR_ERR(file); \
@@ -733,10 +739,10 @@ static int create_hdmi_## _f ## _infoframe_file(struct
drm_connector *connector,
return 0; \
}
-DEFINE_INFOFRAME_FILE(avi);
-DEFINE_INFOFRAME_FILE(hdmi);
-DEFINE_INFOFRAME_FILE(hdr_drm);
-DEFINE_INFOFRAME_FILE(spd);
+DEFINE_INFOFRAME_FILE(avi, AVI);
+DEFINE_INFOFRAME_FILE(hdmi, VENDOR);
+DEFINE_INFOFRAME_FILE(hdr_drm, DRM);
+DEFINE_INFOFRAME_FILE(spd, SPD);
static int create_hdmi_infoframe_files(struct drm_connector *connector,
struct dentry *parent)
diff --git a/drivers/gpu/drm/rockchip/inno_hdmi.c
b/drivers/gpu/drm/rockchip/inno_hdmi.c
index
1ab3ad4bde9ea7305021186ea221d2ff9057fdbb..65eed5ae23194200c145cb174acff4f252b3ef1f
100644
--- a/drivers/gpu/drm/rockchip/inno_hdmi.c
+++ b/drivers/gpu/drm/rockchip/inno_hdmi.c
@@ -1065,6 +1065,7 @@ static int inno_hdmi_register(struct drm_device *drm,
struct inno_hdmi *hdmi)
DRM_MODE_CONNECTOR_HDMIA,
hdmi->ddc,
BIT(HDMI_COLORSPACE_RGB),
+ DRM_CONNECTOR_INFOFRAME_AVI,
8);
drm_connector_attach_encoder(&hdmi->connector, encoder);
diff --git a/drivers/gpu/drm/sun4i/sun4i_hdmi_enc.c
b/drivers/gpu/drm/sun4i/sun4i_hdmi_enc.c
index
ab0938ba61f7d75dd0bec473807a04a20e1cffbd..0b931da4ea2d4eb58a6224476059b9205e8626b4
100644
--- a/drivers/gpu/drm/sun4i/sun4i_hdmi_enc.c
+++ b/drivers/gpu/drm/sun4i/sun4i_hdmi_enc.c
@@ -640,6 +640,7 @@ static int sun4i_hdmi_bind(struct device *dev, struct
device *master,
DRM_MODE_CONNECTOR_HDMIA,
hdmi->ddc_i2c,
BIT(HDMI_COLORSPACE_RGB),
+ DRM_CONNECTOR_INFOFRAME_AVI,
8);
if (ret) {
dev_err(dev,
diff --git a/drivers/gpu/drm/tests/drm_connector_test.c
b/drivers/gpu/drm/tests/drm_connector_test.c
index
22e2d959eb31459f9981fef488228904d67cb6f9..fd28ed2bf8bcecabaabc67f2f8f5ccc1f42525d3
100644
--- a/drivers/gpu/drm/tests/drm_connector_test.c
+++ b/drivers/gpu/drm/tests/drm_connector_test.c
@@ -641,6 +641,13 @@ static struct kunit_suite
drm_connector_dynamic_register_test_suite = {
.test_cases = drm_connector_dynamic_register_tests,
};
+#define DRM_CONNECTOR_ALL_INFOFRAMES \
+ (DRM_CONNECTOR_INFOFRAME_AUDIO | \
+ DRM_CONNECTOR_INFOFRAME_AVI | \
+ DRM_CONNECTOR_INFOFRAME_DRM | \
+ DRM_CONNECTOR_INFOFRAME_SPD | \
+ DRM_CONNECTOR_INFOFRAME_VENDOR)
+
/*
* Test that the registration of a bog standard connector works as
* expected and doesn't report any error.
@@ -657,6 +664,7 @@ static void drm_test_connector_hdmi_init_valid(struct kunit
*test)
DRM_MODE_CONNECTOR_HDMIA,
&priv->ddc,
BIT(HDMI_COLORSPACE_RGB),
+ DRM_CONNECTOR_ALL_INFOFRAMES,
8);
KUNIT_EXPECT_EQ(test, ret, 0);
}
@@ -677,6 +685,7 @@ static void drm_test_connector_hdmi_init_null_ddc(struct
kunit *test)
DRM_MODE_CONNECTOR_HDMIA,
NULL,
BIT(HDMI_COLORSPACE_RGB),
+ DRM_CONNECTOR_ALL_INFOFRAMES,
8);
KUNIT_EXPECT_EQ(test, ret, 0);
}
@@ -697,6 +706,7 @@ static void drm_test_connector_hdmi_init_null_vendor(struct
kunit *test)
DRM_MODE_CONNECTOR_HDMIA,
&priv->ddc,
BIT(HDMI_COLORSPACE_RGB),
+ DRM_CONNECTOR_ALL_INFOFRAMES,
8);
KUNIT_EXPECT_LT(test, ret, 0);
}
@@ -717,6 +727,7 @@ static void
drm_test_connector_hdmi_init_null_product(struct kunit *test)
DRM_MODE_CONNECTOR_HDMIA,
&priv->ddc,
BIT(HDMI_COLORSPACE_RGB),
+ DRM_CONNECTOR_ALL_INFOFRAMES,
8);
KUNIT_EXPECT_LT(test, ret, 0);
}
@@ -743,6 +754,7 @@ static void
drm_test_connector_hdmi_init_product_valid(struct kunit *test)
DRM_MODE_CONNECTOR_HDMIA,
&priv->ddc,
BIT(HDMI_COLORSPACE_RGB),
+ DRM_CONNECTOR_ALL_INFOFRAMES,
8);
KUNIT_EXPECT_EQ(test, ret, 0);
KUNIT_EXPECT_MEMEQ(test,
@@ -776,6 +788,7 @@ static void
drm_test_connector_hdmi_init_product_length_exact(struct kunit *test
DRM_MODE_CONNECTOR_HDMIA,
&priv->ddc,
BIT(HDMI_COLORSPACE_RGB),
+ DRM_CONNECTOR_ALL_INFOFRAMES,
8);
KUNIT_EXPECT_EQ(test, ret, 0);
KUNIT_EXPECT_MEMEQ(test,
@@ -803,6 +816,7 @@ static void
drm_test_connector_hdmi_init_product_length_too_long(struct kunit *t
DRM_MODE_CONNECTOR_HDMIA,
&priv->ddc,
BIT(HDMI_COLORSPACE_RGB),
+ DRM_CONNECTOR_ALL_INFOFRAMES,
8);
KUNIT_EXPECT_LT(test, ret, 0);
}
@@ -829,6 +843,7 @@ static void
drm_test_connector_hdmi_init_vendor_valid(struct kunit *test)
DRM_MODE_CONNECTOR_HDMIA,
&priv->ddc,
BIT(HDMI_COLORSPACE_RGB),
+ DRM_CONNECTOR_ALL_INFOFRAMES,
8);
KUNIT_EXPECT_EQ(test, ret, 0);
KUNIT_EXPECT_MEMEQ(test,
@@ -861,6 +876,7 @@ static void
drm_test_connector_hdmi_init_vendor_length_exact(struct kunit *test)
DRM_MODE_CONNECTOR_HDMIA,
&priv->ddc,
BIT(HDMI_COLORSPACE_RGB),
+ DRM_CONNECTOR_ALL_INFOFRAMES,
8);
KUNIT_EXPECT_EQ(test, ret, 0);
KUNIT_EXPECT_MEMEQ(test,
@@ -888,6 +904,7 @@ static void
drm_test_connector_hdmi_init_vendor_length_too_long(struct kunit *te
DRM_MODE_CONNECTOR_HDMIA,
&priv->ddc,
BIT(HDMI_COLORSPACE_RGB),
+ DRM_CONNECTOR_ALL_INFOFRAMES,
8);
KUNIT_EXPECT_LT(test, ret, 0);
}
@@ -908,6 +925,7 @@ static void drm_test_connector_hdmi_init_bpc_invalid(struct
kunit *test)
DRM_MODE_CONNECTOR_HDMIA,
&priv->ddc,
BIT(HDMI_COLORSPACE_RGB),
+ DRM_CONNECTOR_ALL_INFOFRAMES,
9);
KUNIT_EXPECT_LT(test, ret, 0);
}
@@ -928,6 +946,7 @@ static void drm_test_connector_hdmi_init_bpc_null(struct
kunit *test)
DRM_MODE_CONNECTOR_HDMIA,
&priv->ddc,
BIT(HDMI_COLORSPACE_RGB),
+ DRM_CONNECTOR_ALL_INFOFRAMES,
0);
KUNIT_EXPECT_LT(test, ret, 0);
}
@@ -953,6 +972,7 @@ static void drm_test_connector_hdmi_init_bpc_8(struct kunit
*test)
DRM_MODE_CONNECTOR_HDMIA,
&priv->ddc,
BIT(HDMI_COLORSPACE_RGB),
+ DRM_CONNECTOR_ALL_INFOFRAMES,
8);
KUNIT_EXPECT_EQ(test, ret, 0);
@@ -994,6 +1014,7 @@ static void drm_test_connector_hdmi_init_bpc_10(struct kunit *test)
DRM_MODE_CONNECTOR_HDMIA,
&priv->ddc,
BIT(HDMI_COLORSPACE_RGB),
+ DRM_CONNECTOR_ALL_INFOFRAMES,
10);
KUNIT_EXPECT_EQ(test, ret, 0);
@@ -1035,6 +1056,7 @@ static void drm_test_connector_hdmi_init_bpc_12(struct kunit *test)
DRM_MODE_CONNECTOR_HDMIA,
&priv->ddc,
BIT(HDMI_COLORSPACE_RGB),
+ DRM_CONNECTOR_ALL_INFOFRAMES,
12);
KUNIT_EXPECT_EQ(test, ret, 0);
@@ -1071,6 +1093,7 @@ static void drm_test_connector_hdmi_init_formats_empty(struct kunit *test)
DRM_MODE_CONNECTOR_HDMIA,
&priv->ddc,
0,
+ DRM_CONNECTOR_ALL_INFOFRAMES,
8);
KUNIT_EXPECT_LT(test, ret, 0);
}
@@ -1091,6 +1114,7 @@ static void
drm_test_connector_hdmi_init_formats_no_rgb(struct kunit *test)
DRM_MODE_CONNECTOR_HDMIA,
&priv->ddc,
BIT(HDMI_COLORSPACE_YUV422),
+ DRM_CONNECTOR_ALL_INFOFRAMES,
8);
KUNIT_EXPECT_LT(test, ret, 0);
}
@@ -1149,6 +1173,7 @@ static void
drm_test_connector_hdmi_init_formats_yuv420_allowed(struct kunit *te
DRM_MODE_CONNECTOR_HDMIA,
&priv->ddc,
params->supported_formats,
+ DRM_CONNECTOR_ALL_INFOFRAMES,
8);
KUNIT_EXPECT_EQ(test, ret, params->expected_result);
}
@@ -1170,6 +1195,7 @@ static void
drm_test_connector_hdmi_init_type_valid(struct kunit *test)
connector_type,
&priv->ddc,
BIT(HDMI_COLORSPACE_RGB),
+ DRM_CONNECTOR_ALL_INFOFRAMES,
8);
KUNIT_EXPECT_EQ(test, ret, 0);
}
@@ -1205,6 +1231,7 @@ static void
drm_test_connector_hdmi_init_type_invalid(struct kunit *test)
connector_type,
&priv->ddc,
BIT(HDMI_COLORSPACE_RGB),
+ DRM_CONNECTOR_ALL_INFOFRAMES,
8);
KUNIT_EXPECT_LT(test, ret, 0);
}
@@ -1482,6 +1509,7 @@ static void
drm_test_drm_connector_attach_broadcast_rgb_property_hdmi_connector(
DRM_MODE_CONNECTOR_HDMIA,
&priv->ddc,
BIT(HDMI_COLORSPACE_RGB),
+ DRM_CONNECTOR_ALL_INFOFRAMES,
8);
KUNIT_EXPECT_EQ(test, ret, 0);
diff --git a/drivers/gpu/drm/tests/drm_hdmi_state_helper_test.c b/drivers/gpu/drm/tests/drm_hdmi_state_helper_test.c
index
8bd412735000cb18e66aeca21433b2ebbefe2b44..2901fcb6b12ee318a4a9c727a62d5290d7c9aa84
100644
--- a/drivers/gpu/drm/tests/drm_hdmi_state_helper_test.c
+++ b/drivers/gpu/drm/tests/drm_hdmi_state_helper_test.c
@@ -138,6 +138,13 @@ static const struct drm_connector_funcs
dummy_connector_funcs = {
.reset = dummy_hdmi_connector_reset,
};
+#define DRM_CONNECTOR_ALL_INFOFRAMES \
+ (DRM_CONNECTOR_INFOFRAME_AUDIO | \
+ DRM_CONNECTOR_INFOFRAME_AVI | \
+ DRM_CONNECTOR_INFOFRAME_DRM | \
+ DRM_CONNECTOR_INFOFRAME_SPD | \
+ DRM_CONNECTOR_INFOFRAME_VENDOR)
+
static
struct drm_atomic_helper_connector_hdmi_priv *
__connector_hdmi_init(struct kunit *test,
@@ -192,6 +199,7 @@ __connector_hdmi_init(struct kunit *test,
DRM_MODE_CONNECTOR_HDMIA,
NULL,
formats,
+ DRM_CONNECTOR_ALL_INFOFRAMES,
max_bpc);
KUNIT_ASSERT_EQ(test, ret, 0);
diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c
index
07c91b450f93ab9e795d040d6f60f485ac71cfe8..f7024fd554e04dbfa38d24f775ec5993ac8db335
100644
--- a/drivers/gpu/drm/vc4/vc4_hdmi.c
+++ b/drivers/gpu/drm/vc4/vc4_hdmi.c
@@ -556,6 +556,10 @@ static int vc4_hdmi_connector_init(struct drm_device *dev,
BIT(HDMI_COLORSPACE_RGB) |
BIT(HDMI_COLORSPACE_YUV422) |
BIT(HDMI_COLORSPACE_YUV444),
+ DRM_CONNECTOR_INFOFRAME_AVI |
+ DRM_CONNECTOR_INFOFRAME_DRM |
+ DRM_CONNECTOR_INFOFRAME_SPD |
+ DRM_CONNECTOR_INFOFRAME_VENDOR,