Commit 25bfa956 authored by Deepak Rawat's avatar Deepak Rawat

drm/hyperv: Handle feature change message from device

Virtual device inform if screen update is needed or not with
SYNTHVID_FEATURE_CHANGE message. Handle this message to set dirt_needed
flag.
Suggested-by: default avatarDexuan Cui <decui@microsoft.com>
Signed-off-by: default avatarDeepak Rawat <drawat.floss@gmail.com>
Acked-by: default avatarThomas Zimmermann <tzimmermann@suse.de>
Link: https://patchwork.freedesktop.org/patch/msgid/20210527112230.1274-2-drawat.floss@gmail.com
parent 76c56a5a
...@@ -29,6 +29,7 @@ struct hyperv_drm_device { ...@@ -29,6 +29,7 @@ struct hyperv_drm_device {
struct completion wait; struct completion wait;
u32 synthvid_version; u32 synthvid_version;
u32 mmio_megabytes; u32 mmio_megabytes;
bool dirt_needed;
u8 init_buf[VMBUS_MAX_PACKET_SIZE]; u8 init_buf[VMBUS_MAX_PACKET_SIZE];
u8 recv_buf[VMBUS_MAX_PACKET_SIZE]; u8 recv_buf[VMBUS_MAX_PACKET_SIZE];
......
...@@ -198,6 +198,8 @@ static int hyperv_vmbus_probe(struct hv_device *hdev, ...@@ -198,6 +198,8 @@ static int hyperv_vmbus_probe(struct hv_device *hdev,
if (ret) if (ret)
drm_warn(dev, "Failed to update vram location.\n"); drm_warn(dev, "Failed to update vram location.\n");
hv->dirt_needed = true;
ret = hyperv_mode_config_init(hv); ret = hyperv_mode_config_init(hv);
if (ret) if (ret)
goto err_vmbus_close; goto err_vmbus_close;
......
...@@ -301,8 +301,12 @@ int hyperv_update_situation(struct hv_device *hdev, u8 active, u32 bpp, ...@@ -301,8 +301,12 @@ int hyperv_update_situation(struct hv_device *hdev, u8 active, u32 bpp,
int hyperv_update_dirt(struct hv_device *hdev, struct drm_rect *rect) int hyperv_update_dirt(struct hv_device *hdev, struct drm_rect *rect)
{ {
struct hyperv_drm_device *hv = hv_get_drvdata(hdev);
struct synthvid_msg msg; struct synthvid_msg msg;
if (!hv->dirt_needed)
return 0;
memset(&msg, 0, sizeof(struct synthvid_msg)); memset(&msg, 0, sizeof(struct synthvid_msg));
msg.vid_hdr.type = SYNTHVID_DIRT; msg.vid_hdr.type = SYNTHVID_DIRT;
...@@ -387,6 +391,9 @@ static void hyperv_receive_sub(struct hv_device *hdev) ...@@ -387,6 +391,9 @@ static void hyperv_receive_sub(struct hv_device *hdev)
complete(&hv->wait); complete(&hv->wait);
return; return;
} }
if (msg->vid_hdr.type == SYNTHVID_FEATURE_CHANGE)
hv->dirt_needed = msg->feature_chg.is_dirt_needed;
} }
static void hyperv_receive(void *ctx) static void hyperv_receive(void *ctx)
......
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