Skip to content

Commit 792fab2

Browse files
weinanlzhenyw
authored andcommitted
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: 4023f30 ("drm/i915/gvt: opregion virtualization for win") CC: Xiaolin Zhang <xiaolin.zhang@intel.com> Reviewed-by: Xiaolin Zhang <xiaolin.zhang@intel.com> Signed-off-by: Weinan Li <weinan.z.li@intel.com> Signed-off-by: Zhenyu Wang <zhenyuw@linux.intel.com>
1 parent 0a1b60d commit 792fab2

File tree

1 file changed

+9
-11
lines changed

1 file changed

+9
-11
lines changed

drivers/gpu/drm/i915/gvt/opregion.c

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,6 @@
4242
#define DEVICE_TYPE_EFP3 0x20
4343
#define DEVICE_TYPE_EFP4 0x10
4444

45-
#define DEV_SIZE 38
46-
4745
struct opregion_header {
4846
u8 signature[16];
4947
u32 size;
@@ -63,6 +61,10 @@ struct bdb_data_header {
6361
u16 size; /* data size */
6462
} __packed;
6563

64+
/* For supporting windows guest with opregion, here hardcode the emulated
65+
* bdb header version as '186', and the corresponding child_device_config
66+
* length should be '33' but not '38'.
67+
*/
6668
struct efp_child_device_config {
6769
u16 handle;
6870
u16 device_type;
@@ -109,12 +111,6 @@ struct efp_child_device_config {
109111
u8 mipi_bridge_type; /* 171 */
110112
u16 device_class_ext;
111113
u8 dvo_function;
112-
u8 dp_usb_type_c:1; /* 195 */
113-
u8 skip6:7;
114-
u8 dp_usb_type_c_2x_gpio_index; /* 195 */
115-
u16 dp_usb_type_c_2x_gpio_pin; /* 195 */
116-
u8 iboost_dp:4; /* 196 */
117-
u8 iboost_hdmi:4; /* 196 */
118114
} __packed;
119115

120116
struct vbt {
@@ -155,7 +151,7 @@ static void virt_vbt_generation(struct vbt *v)
155151
v->header.bdb_offset = offsetof(struct vbt, bdb_header);
156152

157153
strcpy(&v->bdb_header.signature[0], "BIOS_DATA_BLOCK");
158-
v->bdb_header.version = 186; /* child_dev_size = 38 */
154+
v->bdb_header.version = 186; /* child_dev_size = 33 */
159155
v->bdb_header.header_size = sizeof(v->bdb_header);
160156

161157
v->bdb_header.bdb_size = sizeof(struct vbt) - sizeof(struct vbt_header)
@@ -169,11 +165,13 @@ static void virt_vbt_generation(struct vbt *v)
169165

170166
/* child device */
171167
num_child = 4; /* each port has one child */
168+
v->general_definitions.child_dev_size =
169+
sizeof(struct efp_child_device_config);
172170
v->general_definitions_header.id = BDB_GENERAL_DEFINITIONS;
173171
/* size will include child devices */
174172
v->general_definitions_header.size =
175-
sizeof(struct bdb_general_definitions) + num_child * DEV_SIZE;
176-
v->general_definitions.child_dev_size = DEV_SIZE;
173+
sizeof(struct bdb_general_definitions) +
174+
num_child * v->general_definitions.child_dev_size;
177175

178176
/* portA */
179177
v->child0.handle = DEVICE_TYPE_EFP1;

0 commit comments

Comments
 (0)