*
  */
 
+#include <acpi/video.h>
+
 #include <linux/string.h>
 #include <linux/acpi.h>
 #include <linux/i2c.h>
        return dp_sink_present;
 }
 
+static int
+dm_helpers_probe_acpi_edid(void *data, u8 *buf, unsigned int block, size_t len)
+{
+       struct drm_connector *connector = data;
+       struct acpi_device *acpidev = ACPI_COMPANION(connector->dev->dev);
+       unsigned char start = block * EDID_LENGTH;
+       void *edid;
+       int r;
+
+       if (!acpidev)
+               return -ENODEV;
+
+       /* fetch the entire edid from BIOS */
+       r = acpi_video_get_edid(acpidev, ACPI_VIDEO_DISPLAY_LCD, -1, &edid);
+       if (r < 0) {
+               drm_dbg(connector->dev, "Failed to get EDID from ACPI: %d\n", r);
+               return r;
+       }
+       if (len > r || start > r || start + len > r) {
+               r = -EINVAL;
+               goto cleanup;
+       }
+
+       memcpy(buf, edid + start, len);
+       r = 0;
+
+cleanup:
+       kfree(edid);
+
+       return r;
+}
+
+static const struct drm_edid *
+dm_helpers_read_acpi_edid(struct amdgpu_dm_connector *aconnector)
+{
+       struct drm_connector *connector = &aconnector->base;
+
+       if (amdgpu_dc_debug_mask & DC_DISABLE_ACPI_EDID)
+               return NULL;
+
+       switch (connector->connector_type) {
+       case DRM_MODE_CONNECTOR_LVDS:
+       case DRM_MODE_CONNECTOR_eDP:
+               break;
+       default:
+               return NULL;
+       }
+
+       if (connector->force == DRM_FORCE_OFF)
+               return NULL;
+
+       return drm_edid_read_custom(connector, dm_helpers_probe_acpi_edid, connector);
+}
+
 enum dc_edid_status dm_helpers_read_local_edid(
                struct dc_context *ctx,
                struct dc_link *link,
         * do check sum and retry to make sure read correct edid.
         */
        do {
-
-               drm_edid = drm_edid_read_ddc(connector, ddc);
+               drm_edid = dm_helpers_read_acpi_edid(aconnector);
+               if (drm_edid)
+                       drm_info(connector->dev, "Using ACPI provided EDID for %s\n", connector->name);
+               else
+                       drm_edid = drm_edid_read_ddc(connector, ddc);
                drm_edid_connector_update(connector, drm_edid);
 
                /* DP Compliance Test 4.2.2.6 */
 {
        // TODO
        return false;
-}
\ No newline at end of file
+}
 
         * @DC_FORCE_IPS_ENABLE: If set, force enable all IPS, all the time.
         */
        DC_FORCE_IPS_ENABLE = 0x4000,
+       /**
+        * @DC_DISABLE_ACPI_EDID: If set, don't attempt to fetch EDID for
+        * eDP display from ACPI _DDC method.
+        */
+       DC_DISABLE_ACPI_EDID = 0x8000,
 };
 
 enum amd_dpm_forced_level;