u16 yres_virtual;
        u32 stride;
        u32 bpp;
+       struct edid *edid;
 
        /* drm */
        struct drm_device  *dev;
                      const struct drm_format_info *format);
 void bochs_hw_setbase(struct bochs_device *bochs,
                      int x, int y, u64 addr);
+int bochs_hw_load_edid(struct bochs_device *bochs);
 
 /* bochs_mm.c */
 int bochs_mm_init(struct bochs_device *bochs);
 
 #define bochs_hw_set_native_endian(_b) bochs_hw_set_little_endian(_b)
 #endif
 
+static int bochs_get_edid_block(void *data, u8 *buf,
+                               unsigned int block, size_t len)
+{
+       struct bochs_device *bochs = data;
+       size_t i, start = block * EDID_LENGTH;
+
+       if (start + len > 0x400 /* vga register offset */)
+               return -1;
+
+       for (i = 0; i < len; i++) {
+               buf[i] = readb(bochs->mmio + start + i);
+       }
+       return 0;
+}
+
+int bochs_hw_load_edid(struct bochs_device *bochs)
+{
+       if (!bochs->mmio)
+               return -1;
+
+       kfree(bochs->edid);
+       bochs->edid = drm_do_get_edid(&bochs->connector,
+                                     bochs_get_edid_block, bochs);
+       if (bochs->edid == NULL)
+               return -1;
+
+       return 0;
+}
+
 int bochs_hw_init(struct drm_device *dev)
 {
        struct bochs_device *bochs = dev->dev_private;
        if (bochs->fb_map)
                iounmap(bochs->fb_map);
        pci_release_regions(dev->pdev);
+       kfree(bochs->edid);
 }
 
 void bochs_hw_setmode(struct bochs_device *bochs,
 
 
 static int bochs_connector_get_modes(struct drm_connector *connector)
 {
-       int count;
+       struct bochs_device *bochs =
+               container_of(connector, struct bochs_device, connector);
+       int count = 0;
+
+       if (bochs->edid)
+               count = drm_add_edid_modes(connector, bochs->edid);
 
-       count = drm_add_modes_noedid(connector, 8192, 8192);
-       drm_set_preferred_mode(connector, defx, defy);
+       if (!count) {
+               count = drm_add_modes_noedid(connector, 8192, 8192);
+               drm_set_preferred_mode(connector, defx, defy);
+       }
        return count;
 }
 
        drm_connector_helper_add(connector,
                                 &bochs_connector_connector_helper_funcs);
        drm_connector_register(connector);
+
+       bochs_hw_load_edid(bochs);
+       if (bochs->edid) {
+               DRM_INFO("Found EDID data blob.\n");
+               drm_connector_attach_edid_property(connector);
+               drm_connector_update_edid_property(connector, bochs->edid);
+       }
 }