summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/igt_kms.c46
-rw-r--r--lib/igt_kms.h3
-rw-r--r--tests/kms_chamelium.c10
-rw-r--r--tests/kms_hdmi_inject.c2
4 files changed, 47 insertions, 14 deletions
diff --git a/lib/igt_kms.c b/lib/igt_kms.c
index 8a465f67..da188a39 100644
--- a/lib/igt_kms.c
+++ b/lib/igt_kms.c
@@ -183,9 +183,9 @@ const unsigned char *igt_kms_get_alt_edid(void)
}
static void
-generate_hdmi_audio_edid(unsigned char raw_edid[static HDMI_AUDIO_EDID_LENGTH],
- struct cea_sad *sad,
- struct cea_speaker_alloc *speaker_alloc)
+generate_audio_edid(unsigned char raw_edid[static AUDIO_EDID_LENGTH],
+ bool with_vsd, struct cea_sad *sad,
+ struct cea_speaker_alloc *speaker_alloc)
{
struct edid *edid;
struct edid_ext *edid_ext;
@@ -210,10 +210,12 @@ generate_hdmi_audio_edid(unsigned char raw_edid[static HDMI_AUDIO_EDID_LENGTH],
cea_data_size += edid_cea_data_block_set_sad(block, sad, 1);
/* A Vendor Specific Data block is needed for HDMI audio */
- block = (struct edid_cea_data_block *) &cea_data[cea_data_size];
- vsd = cea_vsd_get_hdmi_default(&vsd_size);
- cea_data_size += edid_cea_data_block_set_vsd(block, vsd,
- vsd_size);
+ if (with_vsd) {
+ block = (struct edid_cea_data_block *) &cea_data[cea_data_size];
+ vsd = cea_vsd_get_hdmi_default(&vsd_size);
+ cea_data_size += edid_cea_data_block_set_vsd(block, vsd,
+ vsd_size);
+ }
/* Speaker Allocation Data block */
block = (struct edid_cea_data_block *) &cea_data[cea_data_size];
@@ -233,7 +235,33 @@ const unsigned char *igt_kms_get_hdmi_audio_edid(void)
{
int channels;
uint8_t sampling_rates, sample_sizes;
- static unsigned char raw_edid[HDMI_AUDIO_EDID_LENGTH] = {0};
+ static unsigned char raw_edid[AUDIO_EDID_LENGTH] = {0};
+ struct cea_sad sad = {0};
+ struct cea_speaker_alloc speaker_alloc = {0};
+
+ /* Initialize the Short Audio Descriptor for PCM */
+ channels = 2;
+ sampling_rates = CEA_SAD_SAMPLING_RATE_32KHZ |
+ CEA_SAD_SAMPLING_RATE_44KHZ |
+ CEA_SAD_SAMPLING_RATE_48KHZ;
+ sample_sizes = CEA_SAD_SAMPLE_SIZE_16 |
+ CEA_SAD_SAMPLE_SIZE_20 |
+ CEA_SAD_SAMPLE_SIZE_24;
+ cea_sad_init_pcm(&sad, channels, sampling_rates, sample_sizes);
+
+ /* Initialize the Speaker Allocation Data */
+ speaker_alloc.speakers = CEA_SPEAKER_FRONT_LEFT_RIGHT_CENTER;
+
+ generate_audio_edid(raw_edid, true, &sad, &speaker_alloc);
+
+ return raw_edid;
+}
+
+const unsigned char *igt_kms_get_dp_audio_edid(void)
+{
+ int channels;
+ uint8_t sampling_rates, sample_sizes;
+ static unsigned char raw_edid[AUDIO_EDID_LENGTH] = {0};
struct cea_sad sad = {0};
struct cea_speaker_alloc speaker_alloc = {0};
@@ -250,7 +278,7 @@ const unsigned char *igt_kms_get_hdmi_audio_edid(void)
/* Initialize the Speaker Allocation Data */
speaker_alloc.speakers = CEA_SPEAKER_FRONT_LEFT_RIGHT_CENTER;
- generate_hdmi_audio_edid(raw_edid, &sad, &speaker_alloc);
+ generate_audio_edid(raw_edid, false, &sad, &speaker_alloc);
return raw_edid;
}
diff --git a/lib/igt_kms.h b/lib/igt_kms.h
index 5b5cf274..a448a003 100644
--- a/lib/igt_kms.h
+++ b/lib/igt_kms.h
@@ -759,10 +759,11 @@ struct cea_sad;
struct cea_speaker_alloc;
#define EDID_LENGTH 128
-#define HDMI_AUDIO_EDID_LENGTH (2 * EDID_LENGTH)
+#define AUDIO_EDID_LENGTH (2 * EDID_LENGTH)
const unsigned char *igt_kms_get_base_edid(void);
const unsigned char *igt_kms_get_alt_edid(void);
const unsigned char *igt_kms_get_hdmi_audio_edid(void);
+const unsigned char *igt_kms_get_dp_audio_edid(void);
struct udev_monitor *igt_watch_hotplug(void);
bool igt_hotplug_detected(struct udev_monitor *mon,
diff --git a/tests/kms_chamelium.c b/tests/kms_chamelium.c
index 52e3f095..3beea0c6 100644
--- a/tests/kms_chamelium.c
+++ b/tests/kms_chamelium.c
@@ -39,7 +39,9 @@ enum test_edid {
TEST_EDID_BASE,
TEST_EDID_ALT,
TEST_EDID_HDMI_AUDIO,
+ TEST_EDID_DP_AUDIO,
};
+#define TEST_EDID_COUNT 5
typedef struct {
struct chamelium *chamelium;
@@ -49,7 +51,7 @@ typedef struct {
int drm_fd;
- int edids[4];
+ int edids[TEST_EDID_COUNT];
} data_t;
#define HOTPLUG_TIMEOUT 20 /* seconds */
@@ -1997,6 +1999,8 @@ static const unsigned char *get_edid(enum test_edid edid)
return igt_kms_get_alt_edid();
case TEST_EDID_HDMI_AUDIO:
return igt_kms_get_hdmi_audio_edid();
+ case TEST_EDID_DP_AUDIO:
+ return igt_kms_get_dp_audio_edid();
}
assert(0); /* unreachable */
}
@@ -2031,7 +2035,7 @@ igt_main
&data.port_count);
data.edids[TEST_EDID_CHAMELIUM_DEFAULT] = CHAMELIUM_DEFAULT_EDID;
- for (i = 1; i < sizeof(data.edids) / sizeof(data.edids[0]); ++i) {
+ for (i = 1; i < TEST_EDID_COUNT; ++i) {
data.edids[i] = chamelium_new_edid(data.chamelium,
get_edid(i));
}
@@ -2113,7 +2117,7 @@ igt_main
* Use the Chamelium's default EDID for DP audio. */
connector_subtest("dp-audio", DisplayPort)
test_display_audio(&data, port, "HDMI",
- TEST_EDID_CHAMELIUM_DEFAULT);
+ TEST_EDID_DP_AUDIO);
}
igt_subtest_group {
diff --git a/tests/kms_hdmi_inject.c b/tests/kms_hdmi_inject.c
index 754a7407..8c0d1333 100644
--- a/tests/kms_hdmi_inject.c
+++ b/tests/kms_hdmi_inject.c
@@ -149,7 +149,7 @@ hdmi_inject_audio(int drm_fd, drmModeConnector *connector)
struct kmstest_connector_config config;
edid = igt_kms_get_hdmi_audio_edid();
- length = HDMI_AUDIO_EDID_LENGTH;
+ length = AUDIO_EDID_LENGTH;
kmstest_force_edid(drm_fd, connector, edid, length);