diff --git a/drivers/gpu/drm/vkms/vkms_composer.c b/drivers/gpu/drm/vkms/vkms_composer.c
index 2988d5b49eb6..2b516e60c07f 100644
--- a/drivers/gpu/drm/vkms/vkms_composer.c
+++ b/drivers/gpu/drm/vkms/vkms_composer.c
@@ -373,8 +373,22 @@ int vkms_set_crc_source(struct drm_crtc *crtc, const char *src_name)
int ret = 0;
ret = vkms_crc_parse_source(src_name, &enabled);
-
+ printk(KERN_CRIT "enabled after parsing is %d\n", enabled);
vkms_set_composer(out, enabled);
return ret;
}
+
+
+int vkms_set_crc_vhw_source(struct drm_crtc *crtc, const char *src_name)
+{
+ struct vkms_output *out = drm_crtc_to_vkms_output(crtc);
+ bool enabled = false;
+ int ret = 0;
+
+ ret = vkms_crc_parse_source(src_name, &enabled);
+
+ //vkms_set_composer(out, enabled);
+
+ return ret;
+}
\ No newline at end of file
diff --git a/drivers/gpu/drm/vkms/vkms_crtc.c b/drivers/gpu/drm/vkms/vkms_crtc.c
index 8477b33c4d09..957f560612f1 100644
--- a/drivers/gpu/drm/vkms/vkms_crtc.c
+++ b/drivers/gpu/drm/vkms/vkms_crtc.c
@@ -174,6 +174,21 @@ static const struct drm_crtc_funcs vkms_crtc_funcs = {
.verify_crc_source = vkms_verify_crc_source,
};
+static const struct drm_crtc_funcs vkms_crtc_vhw_funcs = {
+ .set_config = drm_atomic_helper_set_config,
+ .destroy = drm_crtc_cleanup,
+ .page_flip = drm_atomic_helper_page_flip,
+ .reset = vkms_atomic_crtc_reset,
+ .atomic_duplicate_state = vkms_atomic_crtc_duplicate_state,
+ .atomic_destroy_state = vkms_atomic_crtc_destroy_state,
+ //.enable_vblank = vkms_enable_vblank,
+ //.disable_vblank = vkms_disable_vblank,
+ //.get_vblank_timestamp = vkms_get_vblank_timestamp,
+ .get_crc_sources = vkms_get_crc_sources,
+ .set_crc_source = vkms_set_crc_vhw_source,
+ .verify_crc_source = vkms_verify_crc_source,
+};
+
static int vkms_crtc_atomic_check(struct drm_crtc *crtc,
struct drm_atomic_state *state)
{
@@ -302,8 +317,15 @@ int vkms_crtc_init(struct drm_device *dev, struct drm_crtc *crtc,
struct vkms_device *vkmsdev = drm_device_to_vkms_device(dev);
int ret;
- ret = drm_crtc_init_with_planes(dev, crtc, primary, cursor,
+ if (vkmsdev->config->virtual_hw)
+ ret = drm_crtc_init_with_planes(dev, crtc, primary, cursor,
+ &vkms_crtc_vhw_funcs, NULL);
+ else
+ ret = drm_crtc_init_with_planes(dev, crtc, primary, cursor,
&vkms_crtc_funcs, NULL);
+
+ //ret = drm_crtc_init_with_planes(dev, crtc, primary, cursor,
+ // &vkms_crtc_funcs, NULL);
if (ret) {
DRM_ERROR("Failed to init CRTC\n");
return ret;
diff --git a/drivers/gpu/drm/vkms/vkms_drv.h b/drivers/gpu/drm/vkms/vkms_drv.h
index 770594e07f0e..1959e78746c5 100644
--- a/drivers/gpu/drm/vkms/vkms_drv.h
+++ b/drivers/gpu/drm/vkms/vkms_drv.h
@@ -129,6 +129,7 @@ struct vkms_plane *vkms_plane_init(struct vkms_device *vkmsdev,
const char *const *vkms_get_crc_sources(struct drm_crtc *crtc,
size_t *count);
int vkms_set_crc_source(struct drm_crtc *crtc, const char *src_name);
+int vkms_set_crc_vhw_source(struct drm_crtc *crtc, const char *src_name);
int vkms_verify_crc_source(struct drm_crtc *crtc, const char *source_name,
size_t *values_cnt);