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: Dexuan Cui <decui@microsoft.com> Signed-off-by: Deepak Rawat <drawat.floss@gmail.com> Acked-by: Thomas Zimmermann <tzimmermann@suse.de> Link: https://patchwork.freedesktop.org/patch/msgid/20210527112230.1274-2-drawat.floss@gmail.com
This commit is contained in:
@@ -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,
|
|||||||
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,
|
|||||||
|
|
||||||
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)
|
|||||||
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)
|
||||||
|
|||||||
Reference in New Issue
Block a user