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

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
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@ struct hyperv_drm_device {
	struct completion wait;
	u32 synthvid_version;
	u32 mmio_megabytes;
	bool dirt_needed;

	u8 init_buf[VMBUS_MAX_PACKET_SIZE];
	u8 recv_buf[VMBUS_MAX_PACKET_SIZE];
+2 −0
Original line number Diff line number Diff line
@@ -198,6 +198,8 @@ static int hyperv_vmbus_probe(struct hv_device *hdev,
	if (ret)
		drm_warn(dev, "Failed to update vram location.\n");

	hv->dirt_needed = true;

	ret = hyperv_mode_config_init(hv);
	if (ret)
		goto err_vmbus_close;
+7 −0
Original line number Diff line number Diff line
@@ -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)
{
	struct hyperv_drm_device *hv = hv_get_drvdata(hdev);
	struct synthvid_msg msg;

	if (!hv->dirt_needed)
		return 0;

	memset(&msg, 0, sizeof(struct synthvid_msg));

	msg.vid_hdr.type = SYNTHVID_DIRT;
@@ -387,6 +391,9 @@ static void hyperv_receive_sub(struct hv_device *hdev)
		complete(&hv->wait);
		return;
	}

	if (msg->vid_hdr.type == SYNTHVID_FEATURE_CHANGE)
		hv->dirt_needed = msg->feature_chg.is_dirt_needed;
}

static void hyperv_receive(void *ctx)