Lines Matching refs:edid
1581 /* Size allocated for edid */
1583 const struct edid *edid;
1586 static int edid_hfeeodb_extension_block_count(const struct edid *edid);
1588 static int edid_hfeeodb_block_count(const struct edid *edid)
1590 int eeodb = edid_hfeeodb_extension_block_count(edid);
1595 static int edid_extension_block_count(const struct edid *edid)
1597 return edid->extensions;
1600 static int edid_block_count(const struct edid *edid)
1602 return edid_extension_block_count(edid) + 1;
1610 static int edid_size(const struct edid *edid)
1612 return edid_size_by_blocks(edid_block_count(edid));
1615 static const void *edid_block_data(const struct edid *edid, int index)
1617 BUILD_BUG_ON(sizeof(*edid) != EDID_LENGTH);
1619 return edid + index;
1622 static const void *edid_extension_block_data(const struct edid *edid, int index)
1624 return edid_block_data(edid, index + 1);
1633 num_blocks = edid_block_count(drm_edid->edid);
1643 eeodb = edid_hfeeodb_block_count(drm_edid->edid);
1667 return edid_block_data(drm_edid->edid, index);
1673 return edid_extension_block_data(drm_edid->edid, index);
1678 * trust edid size. Not for general purpose use.
1681 const struct edid *edid)
1683 if (!edid)
1688 drm_edid->edid = edid;
1689 drm_edid->size = edid_size(edid);
1746 static void edid_header_fix(void *edid)
1748 memcpy(edid, edid_header, sizeof(edid_header));
1761 const struct edid *edid = _edid;
1765 if (edid->header[i] == edid_header[i])
1794 const struct edid *block = _block;
1806 static bool edid_block_is_zero(const void *edid)
1808 return !memchr_inv(edid, 0, EDID_LENGTH);
1812 * drm_edid_are_equal - compare two edid blobs.
1816 * edid had changed.
1818 bool drm_edid_are_equal(const struct edid *edid1, const struct edid *edid2)
1857 const struct edid *block = _block;
1905 const struct edid *block,
1945 WARN(1, "EDID block %d unknown edid block status code %d\n",
1983 struct edid *block = (struct edid *)_block;
2030 * @edid: EDID data
2036 bool drm_edid_is_valid(struct edid *edid)
2040 if (!edid)
2043 for (i = 0; i < edid_block_count(edid); i++) {
2044 void *block = (void *)edid_block_data(edid, i);
2084 static struct edid *edid_filter_invalid_blocks(struct edid *edid,
2087 struct edid *new;
2095 for (i = 0; i < edid_block_count(edid); i++) {
2096 const void *src_block = edid_block_data(edid, i);
2099 void *dst_block = (void *)edid_block_data(edid, valid_blocks);
2108 kfree(edid);
2112 edid->extensions = valid_blocks - 1;
2113 edid->checksum = edid_block_compute_checksum(edid);
2117 new = krealloc(edid, *alloc_size, GFP_KERNEL);
2119 kfree(edid);
2189 const struct edid *edid, int num_blocks)
2200 last_block = edid->extensions;
2202 /* Calculate real checksum for the last edid extension block data */
2205 edid_block_compute_checksum(edid + last_block);
2213 edid_block_dump(KERN_DEBUG, edid + i, i);
2243 seq_write(m, drm_edid->edid, drm_edid->size);
2251 int drm_edid_override_set(struct drm_connector *connector, const void *edid,
2256 drm_edid = drm_edid_alloc(edid, size);
2360 static struct edid *_drm_do_get_edid(struct drm_connector *connector,
2367 struct edid *edid, *new;
2373 edid = kmemdup(override->edid, alloc_size, GFP_KERNEL);
2375 if (!edid)
2380 edid = kmalloc(alloc_size, GFP_KERNEL);
2381 if (!edid)
2384 status = edid_block_read(edid, 0, read_block, context);
2386 edid_block_status_print(status, edid, 0);
2397 if (!edid_block_status_valid(status, edid_block_tag(edid))) {
2401 connector_bad_edid(connector, edid, 1);
2405 if (!edid_extension_block_count(edid))
2408 alloc_size = edid_size(edid);
2409 new = krealloc(edid, alloc_size, GFP_KERNEL);
2412 edid = new;
2414 num_blocks = edid_block_count(edid);
2416 void *block = (void *)edid_block_data(edid, i);
2436 int eeodb = edid_hfeeodb_block_count(edid);
2441 new = krealloc(edid, alloc_size, GFP_KERNEL);
2444 edid = new;
2450 connector_bad_edid(connector, edid, num_blocks);
2452 edid = edid_filter_invalid_blocks(edid, &alloc_size);
2459 return edid;
2462 kfree(edid);
2486 struct edid *drm_do_get_edid(struct drm_connector *connector,
2504 const struct edid *drm_edid_raw(const struct drm_edid *drm_edid)
2513 if (WARN_ON(edid_size(drm_edid->edid) > drm_edid->size))
2516 return drm_edid->edid;
2520 /* Allocate struct drm_edid container *without* duplicating the edid data */
2521 static const struct drm_edid *_drm_edid_alloc(const void *edid, size_t size)
2525 if (!edid || !size || size < EDID_LENGTH)
2530 drm_edid->edid = edid;
2539 * @edid: Pointer to raw EDID data
2542 * Allocate a new drm_edid container. Do not calculate edid size from edid, pass
2551 const struct drm_edid *drm_edid_alloc(const void *edid, size_t size)
2555 if (!edid || !size || size < EDID_LENGTH)
2558 edid = kmemdup(edid, size, GFP_KERNEL);
2559 if (!edid)
2562 drm_edid = _drm_edid_alloc(edid, size);
2564 kfree(edid);
2583 return drm_edid_alloc(drm_edid->edid, drm_edid->size);
2596 kfree(drm_edid->edid);
2626 struct edid *drm_get_edid(struct drm_connector *connector,
2629 struct edid *edid;
2637 edid = _drm_do_get_edid(connector, drm_do_probe_ddc_edid, adapter, NULL);
2638 drm_connector_update_edid_property(connector, edid);
2639 return edid;
2671 struct edid *edid;
2674 edid = _drm_do_get_edid(connector, read_block, context, &size);
2675 if (!edid)
2681 drm_edid = _drm_edid_alloc(edid, size);
2683 kfree(edid);
2749 static u32 edid_extract_panel_id(const struct edid *edid)
2764 return (u32)edid->mfg_id[0] << 24 |
2765 (u32)edid->mfg_id[1] << 16 |
2766 (u32)EDID_PRODUCT_ID(edid);
2834 struct edid *drm_get_edid_switcheroo(struct drm_connector *connector,
2839 struct edid *edid;
2845 edid = drm_get_edid(connector, adapter);
2848 return edid;
2883 * @edid: EDID to duplicate
2887 struct edid *drm_edid_duplicate(const struct edid *edid)
2889 if (!edid)
2892 return kmemdup(edid, edid_size(edid), GFP_KERNEL);
2906 u32 panel_id = edid_extract_panel_id(drm_edid->edid);
3072 cb(&drm_edid->edid->detailed_timings[i], closure);
3110 if (drm_edid->edid->revision >= 4) {
3117 return ((drm_edid->edid->input & DRM_EDID_INPUT_DIGITAL) != 0);
3223 const struct edid *edid = drm_edid->edid;
3225 if (edid->revision >= 4) {
3235 } else if (edid->revision >= 3 && drm_gtf2_hbreak(drm_edid)) {
3237 } else if (edid->revision >= 2) {
3320 if (drm_edid->edid->revision < 3)
3538 mode->width_mm = drm_edid->edid->width_cm * 10;
3539 mode->height_mm = drm_edid->edid->height_cm * 10;
3550 const struct edid *edid, const u8 *t)
3555 if (edid->revision >= 4)
3558 if (edid->revision >= 4)
3567 const struct edid *edid, const u8 *t)
3572 if (edid->revision >= 4)
3575 if (edid->revision >= 4)
3583 range_pixel_clock(const struct edid *edid, const u8 *t)
3590 if (edid->revision >= 4 && t[10] == DRM_EDID_CVT_SUPPORT_FLAG)
3601 const struct edid *edid = drm_edid->edid;
3605 if (!mode_in_hsync_range(mode, edid, t))
3608 if (!mode_in_vsync_range(mode, edid, t))
3611 if ((max_clock = range_pixel_clock(edid, t)))
3616 if (edid->revision >= 4 && t[10] == DRM_EDID_CVT_SUPPORT_FLAG)
3781 if (closure->drm_edid->edid->revision < 2)
3796 if (closure->drm_edid->edid->revision < 4)
3817 if (drm_edid->edid->revision >= 1)
3872 const struct edid *edid = drm_edid->edid;
3873 unsigned long est_bits = edid->established_timings.t1 |
3874 (edid->established_timings.t2 << 8) |
3875 ((edid->established_timings.mfg_rsvd & 0x80) << 9);
3894 if (edid->revision >= 1)
3942 &drm_edid->edid->standard_timings[i]);
3949 if (drm_edid->edid->revision >= 1)
4029 if (drm_edid->edid->revision >= 3)
4082 if (drm_edid->edid->revision >= 4)
4086 drm_edid->edid->features & DRM_EDID_FEATURE_PREFERRED_TIMING;
4903 * cea_db_iter_edid_begin(edid, &iter);
5179 static int edid_hfeeodb_extension_block_count(const struct edid *edid)
5184 if (!edid_extension_block_count(edid))
5188 cta = edid_extension_block_data(edid, 0);
5472 * drm_edid_get_monitor_name - fetch the monitor name from the edid
5473 * @edid: monitor EDID information
5478 void drm_edid_get_monitor_name(const struct edid *edid, char *name, int bufsize)
5485 if (edid) {
5488 .edid = edid,
5489 .size = edid_size(edid),
5543 eld[DRM_ELD_MANUFACTURER_NAME0] = drm_edid->edid->mfg_id[0];
5544 eld[DRM_ELD_MANUFACTURER_NAME1] = drm_edid->edid->mfg_id[1];
5545 eld[DRM_ELD_PRODUCT_CODE0] = drm_edid->edid->prod_code[0];
5546 eld[DRM_ELD_PRODUCT_CODE1] = drm_edid->edid->prod_code[1];
5631 * @edid: EDID to parse
5640 int drm_edid_to_sad(const struct edid *edid, struct cea_sad **sads)
5644 return _drm_edid_to_sad(drm_edid_legacy_init(&drm_edid, edid), sads);
5676 * @edid: EDID to parse
5686 int drm_edid_to_speaker_allocation(const struct edid *edid, u8 **sadb)
5690 return _drm_edid_to_speaker_allocation(drm_edid_legacy_init(&drm_edid, edid),
5760 * @edid: monitor EDID information
5769 bool drm_detect_hdmi_monitor(const struct edid *edid)
5773 return _drm_detect_hdmi_monitor(drm_edid_legacy_init(&drm_edid, edid));
5821 * @edid: EDID block to scan
5831 bool drm_detect_monitor_audio(const struct edid *edid)
5835 return _drm_detect_monitor_audio(drm_edid_legacy_init(&drm_edid, edid));
6230 * https://docs.microsoft.com/en-us/windows-hardware/drivers/display/specialized-monitors-edid-extension
6323 const struct edid *edid = closure->drm_edid->edid;
6343 if (edid->revision >= 4) {
6360 if (drm_edid->edid->revision < 4)
6363 if (!(drm_edid->edid->features & DRM_EDID_FEATURE_CONTINUOUS_FREQ))
6514 const struct edid *edid;
6522 edid = drm_edid->edid;
6526 info->width_mm = edid->width_cm * 10;
6527 info->height_mm = edid->height_cm * 10;
6531 if (edid->revision < 3)
6534 if (!(edid->input & DRM_EDID_INPUT_DIGITAL))
6549 if (info->bpc == 0 && edid->revision == 3 &&
6550 edid->input & DRM_EDID_DIGITAL_DFP_1_X) {
6558 if (edid->revision < 4)
6561 switch (edid->input & DRM_EDID_DIGITAL_DEPTH_MASK) {
6590 if (edid->features & DRM_EDID_FEATURE_RGB_YCRCB444)
6592 if (edid->features & DRM_EDID_FEATURE_RGB_YCRCB422)
6746 if (drm_edid->edid->features & DRM_EDID_FEATURE_CONTINUOUS_FREQ)
6765 const struct edid *old_edid = connector->edid_blob_ptr->data;
6768 if (!drm_edid_are_equal(drm_edid ? drm_edid->edid : NULL, old_edid)) {
6780 drm_edid ? drm_edid->edid : NULL,
6864 * drm_connector_update_edid_property - update the edid property of a connector
6866 * @edid: new value of the edid property
6869 * connector's edid property.
6880 const struct edid *edid)
6884 return drm_edid_connector_update(connector, drm_edid_legacy_init(&drm_edid, edid));
6891 * @edid: EDID data
6895 * can be derived from the edid.
6901 int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid)
6906 if (edid && !drm_edid_is_valid(edid)) {
6909 edid = NULL;
6912 drm_edid = drm_edid_legacy_init(&_drm_edid, edid);