Commit 792fab2c authored by Weinan Li's avatar Weinan Li Committed by Zhenyu Wang

drm/i915/gvt: Fix the incorrect length of child_device_config issue

GVT-g emualte the opregion for guest with bdb version as '186' which
child_device_config length should be '33'.

v2: split into 2 patch. 1st for issue fix, 2nd for code clean up.(Zhenyu)
v3: add fixes tag.(Zhenyu)

Fixes: 4023f301 ("drm/i915/gvt: opregion virtualization for win")
CC: Xiaolin Zhang <xiaolin.zhang@intel.com>
Reviewed-by: default avatarXiaolin Zhang <xiaolin.zhang@intel.com>
Signed-off-by: default avatarWeinan Li <weinan.z.li@intel.com>
Signed-off-by: default avatarZhenyu Wang <zhenyuw@linux.intel.com>
parent 0a1b60d7
...@@ -42,8 +42,6 @@ ...@@ -42,8 +42,6 @@
#define DEVICE_TYPE_EFP3 0x20 #define DEVICE_TYPE_EFP3 0x20
#define DEVICE_TYPE_EFP4 0x10 #define DEVICE_TYPE_EFP4 0x10
#define DEV_SIZE 38
struct opregion_header { struct opregion_header {
u8 signature[16]; u8 signature[16];
u32 size; u32 size;
...@@ -63,6 +61,10 @@ struct bdb_data_header { ...@@ -63,6 +61,10 @@ struct bdb_data_header {
u16 size; /* data size */ u16 size; /* data size */
} __packed; } __packed;
/* For supporting windows guest with opregion, here hardcode the emulated
* bdb header version as '186', and the corresponding child_device_config
* length should be '33' but not '38'.
*/
struct efp_child_device_config { struct efp_child_device_config {
u16 handle; u16 handle;
u16 device_type; u16 device_type;
...@@ -109,12 +111,6 @@ struct efp_child_device_config { ...@@ -109,12 +111,6 @@ struct efp_child_device_config {
u8 mipi_bridge_type; /* 171 */ u8 mipi_bridge_type; /* 171 */
u16 device_class_ext; u16 device_class_ext;
u8 dvo_function; 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; } __packed;
struct vbt { struct vbt {
...@@ -155,7 +151,7 @@ static void virt_vbt_generation(struct vbt *v) ...@@ -155,7 +151,7 @@ static void virt_vbt_generation(struct vbt *v)
v->header.bdb_offset = offsetof(struct vbt, bdb_header); v->header.bdb_offset = offsetof(struct vbt, bdb_header);
strcpy(&v->bdb_header.signature[0], "BIOS_DATA_BLOCK"); strcpy(&v->bdb_header.signature[0], "BIOS_DATA_BLOCK");
v->bdb_header.version = 186; /* child_dev_size = 38 */ v->bdb_header.version = 186; /* child_dev_size = 33 */
v->bdb_header.header_size = sizeof(v->bdb_header); v->bdb_header.header_size = sizeof(v->bdb_header);
v->bdb_header.bdb_size = sizeof(struct vbt) - sizeof(struct vbt_header) v->bdb_header.bdb_size = sizeof(struct vbt) - sizeof(struct vbt_header)
...@@ -169,11 +165,13 @@ static void virt_vbt_generation(struct vbt *v) ...@@ -169,11 +165,13 @@ static void virt_vbt_generation(struct vbt *v)
/* child device */ /* child device */
num_child = 4; /* each port has one child */ num_child = 4; /* each port has one child */
v->general_definitions.child_dev_size =
sizeof(struct efp_child_device_config);
v->general_definitions_header.id = BDB_GENERAL_DEFINITIONS; v->general_definitions_header.id = BDB_GENERAL_DEFINITIONS;
/* size will include child devices */ /* size will include child devices */
v->general_definitions_header.size = v->general_definitions_header.size =
sizeof(struct bdb_general_definitions) + num_child * DEV_SIZE; sizeof(struct bdb_general_definitions) +
v->general_definitions.child_dev_size = DEV_SIZE; num_child * v->general_definitions.child_dev_size;
/* portA */ /* portA */
v->child0.handle = DEVICE_TYPE_EFP1; v->child0.handle = DEVICE_TYPE_EFP1;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment