Lines Matching refs:drm_edid
42 #include <drm/drm_edid.h>
97 const struct drm_edid *drm_edid;
1578 * The opaque EDID type, internal to drm_edid.c.
1580 struct drm_edid {
1628 static int __drm_edid_block_count(const struct drm_edid *drm_edid)
1633 num_blocks = edid_block_count(drm_edid->edid);
1636 if (drm_edid->size >= edid_size_by_blocks(2)) {
1643 eeodb = edid_hfeeodb_block_count(drm_edid->edid);
1652 static int drm_edid_block_count(const struct drm_edid *drm_edid)
1655 return min(__drm_edid_block_count(drm_edid),
1656 (int)drm_edid->size / EDID_LENGTH);
1660 static int drm_edid_extension_block_count(const struct drm_edid *drm_edid)
1662 return drm_edid_block_count(drm_edid) - 1;
1665 static const void *drm_edid_block_data(const struct drm_edid *drm_edid, int index)
1667 return edid_block_data(drm_edid->edid, index);
1670 static const void *drm_edid_extension_block_data(const struct drm_edid *drm_edid,
1673 return edid_extension_block_data(drm_edid->edid, index);
1680 static const struct drm_edid *drm_edid_legacy_init(struct drm_edid *drm_edid,
1686 memset(drm_edid, 0, sizeof(*drm_edid));
1688 drm_edid->edid = edid;
1689 drm_edid->size = edid_size(edid);
1691 return drm_edid;
1700 * drm_edid_iter_begin(drm_edid, &iter);
1707 const struct drm_edid *drm_edid;
1713 static void drm_edid_iter_begin(const struct drm_edid *drm_edid,
1718 iter->drm_edid = drm_edid;
1725 if (!iter->drm_edid)
1728 if (iter->index < drm_edid_block_count(iter->drm_edid))
1729 block = drm_edid_block_data(iter->drm_edid, iter->index++);
2056 * @drm_edid: EDID data
2063 bool drm_edid_valid(const struct drm_edid *drm_edid)
2067 if (!drm_edid)
2070 if (edid_size_by_blocks(__drm_edid_block_count(drm_edid)) != drm_edid->size)
2073 for (i = 0; i < drm_edid_block_count(drm_edid); i++) {
2074 const void *block = drm_edid_block_data(drm_edid, i);
2217 static const struct drm_edid *drm_edid_override_get(struct drm_connector *connector)
2219 const struct drm_edid *override = NULL;
2237 const struct drm_edid *drm_edid;
2241 drm_edid = connector->edid_override;
2242 if (drm_edid)
2243 seq_write(m, drm_edid->edid, drm_edid->size);
2254 const struct drm_edid *drm_edid;
2256 drm_edid = drm_edid_alloc(edid, size);
2257 if (!drm_edid_valid(drm_edid)) {
2260 drm_edid_free(drm_edid);
2270 connector->edid_override = drm_edid;
2306 const struct drm_edid *override;
2366 const struct drm_edid *override;
2496 * @drm_edid: drm_edid container
2504 const struct edid *drm_edid_raw(const struct drm_edid *drm_edid)
2506 if (!drm_edid || !drm_edid->size)
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)
2523 struct drm_edid *drm_edid;
2528 drm_edid = kzalloc(sizeof(*drm_edid), GFP_KERNEL);
2529 if (drm_edid) {
2530 drm_edid->edid = edid;
2531 drm_edid->size = size;
2534 return drm_edid;
2538 * drm_edid_alloc - Allocate a new drm_edid container
2542 * Allocate a new drm_edid container. Do not calculate edid size from edid, pass
2549 * Return: drm_edid container, or NULL on errors
2551 const struct drm_edid *drm_edid_alloc(const void *edid, size_t size)
2553 const struct drm_edid *drm_edid;
2562 drm_edid = _drm_edid_alloc(edid, size);
2563 if (!drm_edid)
2566 return drm_edid;
2571 * drm_edid_dup - Duplicate a drm_edid container
2572 * @drm_edid: EDID to duplicate
2576 * Returns: drm_edid container copy, or NULL on errors
2578 const struct drm_edid *drm_edid_dup(const struct drm_edid *drm_edid)
2580 if (!drm_edid)
2583 return drm_edid_alloc(drm_edid->edid, drm_edid->size);
2588 * drm_edid_free - Free the drm_edid container
2589 * @drm_edid: EDID to free
2591 void drm_edid_free(const struct drm_edid *drm_edid)
2593 if (!drm_edid)
2596 kfree(drm_edid->edid);
2597 kfree(drm_edid);
2666 const struct drm_edid *drm_edid_read_custom(struct drm_connector *connector,
2670 const struct drm_edid *drm_edid;
2681 drm_edid = _drm_edid_alloc(edid, size);
2682 if (!drm_edid)
2685 return drm_edid;
2707 const struct drm_edid *drm_edid_read_ddc(struct drm_connector *connector,
2710 const struct drm_edid *drm_edid;
2718 drm_edid = drm_edid_read_custom(connector, drm_do_probe_ddc_edid, adapter);
2722 return drm_edid;
2740 const struct drm_edid *drm_edid_read(struct drm_connector *connector)
2863 const struct drm_edid *drm_edid_read_switcheroo(struct drm_connector *connector,
2868 const struct drm_edid *drm_edid;
2874 drm_edid = drm_edid_read_ddc(connector, adapter);
2877 return drm_edid;
2900 * @drm_edid: EDID to process
2904 static u32 edid_get_quirks(const struct drm_edid *drm_edid)
2906 u32 panel_id = edid_extract_panel_id(drm_edid->edid);
3061 static void drm_for_each_detailed_block(const struct drm_edid *drm_edid,
3068 if (!drm_edid)
3072 cb(&drm_edid->edid->detailed_timings[i], closure);
3074 drm_edid_iter_begin(drm_edid, &edid_iter);
3108 drm_monitor_supports_rb(const struct drm_edid *drm_edid)
3110 if (drm_edid->edid->revision >= 4) {
3113 drm_for_each_detailed_block(drm_edid, is_rb, &ret);
3117 return ((drm_edid->edid->input & DRM_EDID_INPUT_DIGITAL) != 0);
3136 drm_gtf2_hbreak(const struct drm_edid *drm_edid)
3140 drm_for_each_detailed_block(drm_edid, find_gtf2, &descriptor);
3148 drm_gtf2_2c(const struct drm_edid *drm_edid)
3152 drm_for_each_detailed_block(drm_edid, find_gtf2, &descriptor);
3160 drm_gtf2_m(const struct drm_edid *drm_edid)
3164 drm_for_each_detailed_block(drm_edid, find_gtf2, &descriptor);
3172 drm_gtf2_k(const struct drm_edid *drm_edid)
3176 drm_for_each_detailed_block(drm_edid, find_gtf2, &descriptor);
3184 drm_gtf2_2j(const struct drm_edid *drm_edid)
3188 drm_for_each_detailed_block(drm_edid, find_gtf2, &descriptor);
3221 static int standard_timing_level(const struct drm_edid *drm_edid)
3223 const struct edid *edid = drm_edid->edid;
3232 drm_for_each_detailed_block(drm_edid, get_timing_level, &ret);
3235 } else if (edid->revision >= 3 && drm_gtf2_hbreak(drm_edid)) {
3266 const struct drm_edid *drm_edid,
3280 if (drm_mode_hsync(mode) > drm_gtf2_hbreak(drm_edid)) {
3284 drm_gtf2_m(drm_edid),
3285 drm_gtf2_2c(drm_edid),
3286 drm_gtf2_k(drm_edid),
3287 drm_gtf2_2j(drm_edid));
3298 const struct drm_edid *drm_edid,
3309 int timing_level = standard_timing_level(drm_edid);
3320 if (drm_edid->edid->revision < 3)
3363 if (drm_monitor_supports_rb(drm_edid)) {
3381 mode = drm_gtf2_mode(dev, drm_edid, hsize, vsize, vrefresh_rate);
3439 const struct drm_edid *drm_edid,
3538 mode->width_mm = drm_edid->edid->width_cm * 10;
3539 mode->height_mm = drm_edid->edid->height_cm * 10;
3598 const struct drm_edid *drm_edid,
3601 const struct edid *edid = drm_edid->edid;
3620 if (mode_is_rb(mode) && !drm_monitor_supports_rb(drm_edid))
3645 const struct drm_edid *drm_edid,
3653 if (mode_in_range(drm_dmt_modes + i, drm_edid, timing) &&
3680 const struct drm_edid *drm_edid,
3695 if (!mode_in_range(newmode, drm_edid, timing) ||
3709 const struct drm_edid *drm_edid,
3719 newmode = drm_gtf2_mode(dev, drm_edid, m->w, m->h, m->r);
3724 if (!mode_in_range(newmode, drm_edid, timing) ||
3738 const struct drm_edid *drm_edid,
3744 bool rb = drm_monitor_supports_rb(drm_edid);
3754 if (!mode_in_range(newmode, drm_edid, timing) ||
3778 closure->drm_edid,
3781 if (closure->drm_edid->edid->revision < 2)
3787 closure->drm_edid,
3792 closure->drm_edid,
3796 if (closure->drm_edid->edid->revision < 4)
3800 closure->drm_edid,
3810 const struct drm_edid *drm_edid)
3814 .drm_edid = drm_edid,
3817 if (drm_edid->edid->revision >= 1)
3818 drm_for_each_detailed_block(drm_edid, do_inferred_modes, &closure);
3869 const struct drm_edid *drm_edid)
3872 const struct edid *edid = drm_edid->edid;
3879 .drm_edid = drm_edid,
3895 drm_for_each_detailed_block(drm_edid, do_established_modes,
3916 newmode = drm_mode_std(connector, closure->drm_edid, std);
3930 const struct drm_edid *drm_edid)
3935 .drm_edid = drm_edid,
3941 newmode = drm_mode_std(connector, drm_edid,
3942 &drm_edid->edid->standard_timings[i]);
3949 if (drm_edid->edid->revision >= 1)
3950 drm_for_each_detailed_block(drm_edid, do_standard_modes,
4022 add_cvt_modes(struct drm_connector *connector, const struct drm_edid *drm_edid)
4026 .drm_edid = drm_edid,
4029 if (drm_edid->edid->revision >= 3)
4030 drm_for_each_detailed_block(drm_edid, do_cvt_mode, &closure);
4050 closure->drm_edid, timing);
4072 * @drm_edid: EDID block to scan
4075 const struct drm_edid *drm_edid)
4079 .drm_edid = drm_edid,
4082 if (drm_edid->edid->revision >= 4)
4086 drm_edid->edid->features & DRM_EDID_FEATURE_PREFERRED_TIMING;
4088 drm_for_each_detailed_block(drm_edid, do_detailed_mode, &closure);
4119 const u8 *drm_find_edid_extension(const struct drm_edid *drm_edid,
4126 if (!drm_edid || !drm_edid_extension_block_count(drm_edid))
4130 for (i = *ext_index; i < drm_edid_extension_block_count(drm_edid); i++) {
4131 edid_ext = drm_edid_extension_block_data(drm_edid, i);
4136 if (i >= drm_edid_extension_block_count(drm_edid))
4145 static bool drm_edid_has_cta_extension(const struct drm_edid *drm_edid)
4153 if (drm_find_edid_extension(drm_edid, CEA_EXT, &ext_index))
4157 displayid_iter_edid_begin(drm_edid, &iter);
4432 const struct drm_edid *drm_edid)
4440 if (!drm_edid_has_cta_extension(drm_edid))
4963 static void cea_db_iter_edid_begin(const struct drm_edid *drm_edid,
4968 drm_edid_iter_begin(drm_edid, &iter->edid_iter);
4969 displayid_iter_edid_begin(drm_edid, &iter->displayid_iter);
5255 const struct drm_edid *drm_edid)
5264 cea_db_iter_edid_begin(drm_edid, &iter);
5452 static int get_monitor_name(const struct drm_edid *drm_edid, char name[13])
5457 if (!drm_edid || !name)
5460 drm_for_each_detailed_block(drm_edid, monitor_name, &edid_name);
5487 struct drm_edid drm_edid = {
5492 name_length = min(get_monitor_name(&drm_edid, buf), bufsize - 1);
5515 * @drm_edid: EDID to parse
5521 const struct drm_edid *drm_edid)
5530 if (!drm_edid)
5533 mnl = get_monitor_name(drm_edid, &eld[DRM_ELD_MONITOR_NAME_STRING]);
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];
5548 cea_db_iter_edid_begin(drm_edid, &iter);
5595 static int _drm_edid_to_sad(const struct drm_edid *drm_edid,
5602 cea_db_iter_edid_begin(drm_edid, &iter);
5642 struct drm_edid drm_edid;
5644 return _drm_edid_to_sad(drm_edid_legacy_init(&drm_edid, edid), sads);
5648 static int _drm_edid_to_speaker_allocation(const struct drm_edid *drm_edid,
5655 cea_db_iter_edid_begin(drm_edid, &iter);
5688 struct drm_edid drm_edid;
5690 return _drm_edid_to_speaker_allocation(drm_edid_legacy_init(&drm_edid, edid),
5736 static bool _drm_detect_hdmi_monitor(const struct drm_edid *drm_edid)
5746 cea_db_iter_edid_begin(drm_edid, &iter);
5771 struct drm_edid drm_edid;
5773 return _drm_detect_hdmi_monitor(drm_edid_legacy_init(&drm_edid, edid));
5777 static bool _drm_detect_monitor_audio(const struct drm_edid *drm_edid)
5785 drm_edid_iter_begin(drm_edid, &edid_iter);
5800 cea_db_iter_edid_begin(drm_edid, &iter);
5833 struct drm_edid drm_edid;
5835 return _drm_detect_monitor_audio(drm_edid_legacy_init(&drm_edid, edid));
6249 const struct drm_edid *drm_edid)
6258 drm_edid_iter_begin(drm_edid, &edid_iter);
6284 cea_db_iter_edid_begin(drm_edid, &iter);
6323 const struct edid *edid = closure->drm_edid->edid;
6352 const struct drm_edid *drm_edid)
6357 .drm_edid = drm_edid,
6360 if (drm_edid->edid->revision < 4)
6363 if (!(drm_edid->edid->features & DRM_EDID_FEATURE_CONTINUOUS_FREQ))
6366 drm_for_each_detailed_block(drm_edid, get_monitor_range, &closure);
6435 const struct drm_edid *drm_edid)
6440 displayid_iter_edid_begin(drm_edid, &iter);
6488 const struct drm_edid *drm_edid)
6494 displayid_iter_edid_begin(drm_edid, &iter);
6511 const struct drm_edid *drm_edid)
6519 if (!drm_edid)
6522 edid = drm_edid->edid;
6524 info->quirks = edid_get_quirks(drm_edid);
6529 drm_get_monitor_range(connector, drm_edid);
6538 drm_parse_cea_ext(connector, drm_edid);
6540 update_displayid_info(connector, drm_edid);
6595 drm_update_mso(connector, drm_edid);
6621 drm_edid_to_eld(connector, drm_edid);
6699 const struct drm_edid *drm_edid)
6705 displayid_iter_edid_begin(drm_edid, &iter);
6717 const struct drm_edid *drm_edid)
6722 if (!drm_edid)
6739 num_modes += add_detailed_modes(connector, drm_edid);
6740 num_modes += add_cvt_modes(connector, drm_edid);
6741 num_modes += add_standard_modes(connector, drm_edid);
6742 num_modes += add_established_modes(connector, drm_edid);
6743 num_modes += add_cea_modes(connector, drm_edid);
6744 num_modes += add_alternate_cea_modes(connector, drm_edid);
6745 num_modes += add_displayid_detailed_modes(connector, drm_edid);
6746 if (drm_edid->edid->features & DRM_EDID_FEATURE_CONTINUOUS_FREQ)
6747 num_modes += add_inferred_modes(connector, drm_edid);
6756 const struct drm_edid *drm_edid);
6759 const struct drm_edid *drm_edid)
6768 if (!drm_edid_are_equal(drm_edid ? drm_edid->edid : NULL, old_edid)) {
6779 drm_edid ? drm_edid->size : 0,
6780 drm_edid ? drm_edid->edid : NULL,
6812 * @drm_edid: EDID
6824 const struct drm_edid *drm_edid)
6826 update_display_info(connector, drm_edid);
6828 _drm_update_tile_info(connector, drm_edid);
6830 return _drm_edid_connector_property_update(connector, drm_edid);
6848 const struct drm_edid *drm_edid = NULL;
6852 drm_edid = drm_edid_alloc(connector->edid_blob_ptr->data,
6855 count = _drm_edid_connector_add_modes(connector, drm_edid);
6857 drm_edid_free(drm_edid);
6882 struct drm_edid drm_edid;
6884 return drm_edid_connector_update(connector, drm_edid_legacy_init(&drm_edid, edid));
6903 struct drm_edid _drm_edid;
6904 const struct drm_edid *drm_edid;
6912 drm_edid = drm_edid_legacy_init(&_drm_edid, edid);
6914 update_display_info(connector, drm_edid);
6916 return _drm_edid_connector_add_modes(connector, drm_edid);
7331 const struct drm_edid *drm_edid)
7338 displayid_iter_edid_begin(drm_edid, &iter);