diff options
| -rw-r--r-- | lib/igt_kms.c | 46 | ||||
| -rw-r--r-- | lib/igt_kms.h | 3 | ||||
| -rw-r--r-- | tests/kms_chamelium.c | 10 | ||||
| -rw-r--r-- | tests/kms_hdmi_inject.c | 2 |
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); |
