diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/igt_chamelium.c | 30 | ||||
| -rw-r--r-- | lib/igt_chamelium.h | 2 |
2 files changed, 30 insertions, 2 deletions
diff --git a/lib/igt_chamelium.c b/lib/igt_chamelium.c index 94c363ae..ae10bf4c 100644 --- a/lib/igt_chamelium.c +++ b/lib/igt_chamelium.c @@ -84,6 +84,7 @@ struct chamelium_edid { int id; + struct edid *raw; struct igt_list link; }; @@ -531,6 +532,11 @@ void chamelium_schedule_hpd_toggle(struct chamelium *chamelium, * Uploads and registers a new EDID with the chamelium. The EDID will be * destroyed automatically when #chamelium_deinit is called. * + * Callers shouldn't assume that the raw EDID they provide is uploaded as-is to + * the Chamelium. The EDID may be mutated (e.g. a serial number can be appended + * to be able to uniquely identify the EDID). To retrieve the exact EDID that + * will be applied to a particular port, use #chamelium_edid_get_raw. + * * Returns: An opaque pointer to the Chamelium EDID */ struct chamelium_edid *chamelium_new_edid(struct chamelium *chamelium, @@ -540,16 +546,18 @@ struct chamelium_edid *chamelium_new_edid(struct chamelium *chamelium, struct chamelium_edid *chamelium_edid; int edid_id; const struct edid *edid = (struct edid *) raw_edid; + size_t edid_size = edid_get_size(edid); res = chamelium_rpc(chamelium, NULL, "CreateEdid", "(6)", - raw_edid, edid_get_size(edid)); + raw_edid, edid_size); xmlrpc_read_int(&chamelium->env, res, &edid_id); xmlrpc_DECREF(res); chamelium_edid = calloc(1, sizeof(struct chamelium_edid)); chamelium_edid->id = edid_id; - + chamelium_edid->raw = malloc(edid_size); + memcpy(chamelium_edid->raw, raw_edid, edid_size); igt_list_add(&chamelium_edid->link, &chamelium->edids); return chamelium_edid; @@ -562,6 +570,23 @@ static void chamelium_destroy_edid(struct chamelium *chamelium, int edid_id) } /** + * chamelium_edid_get_raw: get the raw EDID + * @edid: the Chamelium EDID + * @port: the Chamelium port + * + * The EDID provided to #chamelium_new_edid may be mutated for identification + * purposes. This function allows to retrieve the exact EDID that will be set + * for a given port. + * + * The returned raw EDID is only valid until the next call to this function. + */ +const struct edid *chamelium_edid_get_raw(struct chamelium_edid *edid, + struct chamelium_port *port) +{ + return edid->raw; +} + +/** * chamelium_port_set_edid: * @chamelium: The Chamelium instance to use * @port: The port on the Chamelium to set the EDID on @@ -1964,6 +1989,7 @@ void chamelium_deinit(struct chamelium *chamelium) /* Destroy any EDIDs we created to make sure we don't leak them */ igt_list_for_each_safe(pos, tmp, &chamelium->edids, link) { chamelium_destroy_edid(chamelium, pos->id); + free(pos->raw); free(pos); } diff --git a/lib/igt_chamelium.h b/lib/igt_chamelium.h index 8b4fc334..7f77745f 100644 --- a/lib/igt_chamelium.h +++ b/lib/igt_chamelium.h @@ -108,6 +108,8 @@ void chamelium_schedule_hpd_toggle(struct chamelium *chamelium, bool rising_edge); struct chamelium_edid *chamelium_new_edid(struct chamelium *chamelium, const unsigned char *edid); +const struct edid *chamelium_edid_get_raw(struct chamelium_edid *edid, + struct chamelium_port *port); void chamelium_port_set_edid(struct chamelium *chamelium, struct chamelium_port *port, struct chamelium_edid *edid); |
