u16 size; /* data size */
 } __packed;
 
+struct efp_child_device_config {
+       u16 handle;
+       u16 device_type;
+       u16 device_class;
+       u8 i2c_speed;
+       u8 dp_onboard_redriver; /* 158 */
+       u8 dp_ondock_redriver; /* 158 */
+       u8 hdmi_level_shifter_value:4; /* 169 */
+       u8 hdmi_max_data_rate:4; /* 204 */
+       u16 dtd_buf_ptr; /* 161 */
+       u8 edidless_efp:1; /* 161 */
+       u8 compression_enable:1; /* 198 */
+       u8 compression_method:1; /* 198 */
+       u8 ganged_edp:1; /* 202 */
+       u8 skip0:4;
+       u8 compression_structure_index:4; /* 198 */
+       u8 skip1:4;
+       u8 slave_port; /*  202 */
+       u8 skip2;
+       u8 dvo_port;
+       u8 i2c_pin; /* for add-in card */
+       u8 slave_addr; /* for add-in card */
+       u8 ddc_pin;
+       u16 edid_ptr;
+       u8 dvo_config;
+       u8 efp_docked_port:1; /* 158 */
+       u8 lane_reversal:1; /* 184 */
+       u8 onboard_lspcon:1; /* 192 */
+       u8 iboost_enable:1; /* 196 */
+       u8 hpd_invert:1; /* BXT 196 */
+       u8 slip3:3;
+       u8 hdmi_compat:1;
+       u8 dp_compat:1;
+       u8 tmds_compat:1;
+       u8 skip4:5;
+       u8 aux_channel;
+       u8 dongle_detect;
+       u8 pipe_cap:2;
+       u8 sdvo_stall:1; /* 158 */
+       u8 hpd_status:2;
+       u8 integrated_encoder:1;
+       u8 skip5:2;
+       u8 dvo_wiring;
+       u8 mipi_bridge_type; /* 171 */
+       u16 device_class_ext;
+       u8 dvo_function;
+       u8 dp_usb_type_c:1; /* 195 */
+       u8 skip6:7;
+       u8 dp_usb_type_c_2x_gpio_index; /* 195 */
+       u16 dp_usb_type_c_2x_gpio_pin; /* 195 */
+       u8 iboost_dp:4; /* 196 */
+       u8 iboost_hdmi:4; /* 196 */
+} __packed;
+
 struct vbt {
        /* header->bdb_offset point to bdb_header offset */
        struct vbt_header header;
 
        struct bdb_data_header general_definitions_header;
        struct bdb_general_definitions general_definitions;
-       struct child_device_config child0;
-       struct child_device_config child1;
-       struct child_device_config child2;
-       struct child_device_config child3;
+
+       struct efp_child_device_config child0;
+       struct efp_child_device_config child1;
+       struct efp_child_device_config child2;
+       struct efp_child_device_config child3;
 
        struct bdb_data_header driver_features_header;
        struct bdb_driver_features driver_features;
        v->header.bdb_offset = offsetof(struct vbt, bdb_header);
 
        strcpy(&v->bdb_header.signature[0], "BIOS_DATA_BLOCK");
-       v->bdb_header.version = 198; /* child_dev_size = 38 */
+       v->bdb_header.version = 186; /* child_dev_size = 38 */
        v->bdb_header.header_size = sizeof(v->bdb_header);
 
        v->bdb_header.bdb_size = sizeof(struct vbt) - sizeof(struct vbt_header)
        v->child0.device_type = DEVICE_TYPE_DP;
        v->child0.dvo_port = DVO_PORT_DPA;
        v->child0.aux_channel = DP_AUX_A;
+       v->child0.dp_compat = true;
+       v->child0.integrated_encoder = true;
 
        /* portB */
        v->child1.handle = DEVICE_TYPE_EFP2;
        v->child1.device_type = DEVICE_TYPE_DP;
        v->child1.dvo_port = DVO_PORT_DPB;
        v->child1.aux_channel = DP_AUX_B;
+       v->child1.dp_compat = true;
+       v->child1.integrated_encoder = true;
 
        /* portC */
        v->child2.handle = DEVICE_TYPE_EFP3;
        v->child2.device_type = DEVICE_TYPE_DP;
        v->child2.dvo_port = DVO_PORT_DPC;
        v->child2.aux_channel = DP_AUX_C;
+       v->child2.dp_compat = true;
+       v->child2.integrated_encoder = true;
 
        /* portD */
        v->child3.handle = DEVICE_TYPE_EFP4;
        v->child3.device_type = DEVICE_TYPE_DP;
        v->child3.dvo_port = DVO_PORT_DPD;
        v->child3.aux_channel = DP_AUX_D;
+       v->child3.dp_compat = true;
+       v->child3.integrated_encoder = true;
 
        /* driver features */
        v->driver_features_header.id = BDB_DRIVER_FEATURES;
        }
 
        /* emulated opregion with VBT mailbox only */
-       header = (struct opregion_header *)gvt->opregion.opregion_va;
+       buf = (u8 *)gvt->opregion.opregion_va;
+       header = (struct opregion_header *)buf;
        memcpy(header->signature, OPREGION_SIGNATURE,
                        sizeof(OPREGION_SIGNATURE));
+       header->size = 0x8;
+       header->opregion_ver = 0x02000000;
        header->mboxes = MBOX_VBT;
 
        /* for unknown reason, the value in LID field is incorrect
         * which block the windows guest, so workaround it by force
         * setting it to "OPEN"
         */
-       buf = (u8 *)gvt->opregion.opregion_va;
        buf[INTEL_GVT_OPREGION_CLID] = 0x3;
 
        /* emulated vbt from virt vbt generation */
        virt_vbt_generation(&v);
-       memcpy(gvt->opregion.opregion_va + INTEL_GVT_OPREGION_VBT_OFFSET,
-                       &v, sizeof(struct vbt));
+       memcpy(buf + INTEL_GVT_OPREGION_VBT_OFFSET, &v, sizeof(struct vbt));
 
        return 0;
 }