BACKPORT: FROMGIT: drm/evdi: Port evdi_painter_connect ioctl api change

(cherry picked from commit 09f7798e1ac8afbe669014f53bac1a0c5610a123
 https://github.com/DisplayLink/evdi devel)

BUG=none
TEST=various boards including sarien, trogdor

Cq-Depend: chromium:4454870
Change-Id: I8dca339fbaeee87079c64b7611725dc728027a6e
Signed-off-by: Łukasz Spintzyk <lukasz.spintzyk@synaptics.com>
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/kernel/+/4454868
Reviewed-by: Dominik Behr <dbehr@chromium.org>
diff --git a/drivers/gpu/drm/evdi/evdi_connector.c b/drivers/gpu/drm/evdi/evdi_connector.c
index 0a3a271..a4b391e 100644
--- a/drivers/gpu/drm/evdi/evdi_connector.c
+++ b/drivers/gpu/drm/evdi/evdi_connector.c
@@ -49,12 +49,14 @@
 			   struct drm_display_mode *mode)
 {
 	struct evdi_device *evdi = connector->dev->dev_private;
-	uint32_t mode_area = mode->hdisplay * mode->vdisplay;
+	uint32_t area_limit = mode->hdisplay * mode->vdisplay;
+	uint32_t mode_limit = area_limit * drm_mode_vrefresh(mode);
 
-	if (evdi->sku_area_limit == 0)
+	if (evdi->pixel_per_second_limit == 0)
 		return MODE_OK;
 
-	if (mode_area > evdi->sku_area_limit) {
+	if (area_limit > evdi->pixel_area_limit ||
+	    mode_limit > evdi->pixel_per_second_limit) {
 		EVDI_WARN("(dev=%d) Mode %dx%d@%d rejected\n",
 			evdi->dev_index,
 			mode->hdisplay,
diff --git a/drivers/gpu/drm/evdi/evdi_drv.h b/drivers/gpu/drm/evdi/evdi_drv.h
index 436497a..edd9896 100644
--- a/drivers/gpu/drm/evdi/evdi_drv.h
+++ b/drivers/gpu/drm/evdi/evdi_drv.h
@@ -41,7 +41,8 @@
 	struct evdi_cursor *cursor;
 	bool cursor_events_enabled;
 
-	uint32_t sku_area_limit;
+	uint32_t pixel_area_limit;
+	uint32_t pixel_per_second_limit;
 
 	struct evdi_fbdev *fbdev;
 	struct evdi_painter *painter;
@@ -167,4 +168,3 @@
 				struct i2c_msg *msg);
 int evdi_fb_get_bpp(uint32_t format);
 #endif
-
diff --git a/drivers/gpu/drm/evdi/evdi_ioc32.c b/drivers/gpu/drm/evdi/evdi_ioc32.c
index 8b97f65..d16b4cc 100644
--- a/drivers/gpu/drm/evdi/evdi_ioc32.c
+++ b/drivers/gpu/drm/evdi/evdi_ioc32.c
@@ -31,7 +31,8 @@
 	int32_t dev_index;
 	uint32_t edid_ptr32;
 	uint32_t edid_length;
-	uint32_t sku_area_limit;
+	uint32_t pixel_area_limit;
+	uint32_t pixel_per_second_limit;
 };
 
 struct drm_evdi_grabpix32 {
@@ -61,7 +62,8 @@
 	    || __put_user((void __user *)(unsigned long)req32.edid_ptr32,
 			  &request->edid)
 	    || __put_user(req32.edid_length, &request->edid_length)
-	    || __put_user(req32.sku_area_limit, &request->sku_area_limit))
+	    || __put_user(req32.pixel_area_limit, &request->pixel_area_limit)
+	    || __put_user(req32.pixel_per_second_limit, &request->pixel_per_second_limit))
 		return -EFAULT;
 
 	return drm_ioctl(file, DRM_IOCTL_EVDI_CONNECT,
diff --git a/drivers/gpu/drm/evdi/evdi_painter.c b/drivers/gpu/drm/evdi/evdi_painter.c
index f9aafe1..01e8ac8 100644
--- a/drivers/gpu/drm/evdi/evdi_painter.c
+++ b/drivers/gpu/drm/evdi/evdi_painter.c
@@ -720,7 +720,8 @@
 static int
 evdi_painter_connect(struct evdi_device *evdi,
 		     void const __user *edid_data, unsigned int edid_length,
-		     uint32_t sku_area_limit,
+		     uint32_t pixel_area_limit,
+		     uint32_t pixel_per_second_limit,
 		     struct drm_file *file, int dev_index)
 {
 	struct evdi_painter *painter = evdi->painter;
@@ -769,7 +770,8 @@
 	painter_lock(painter);
 
 	evdi->dev_index = dev_index;
-	evdi->sku_area_limit = sku_area_limit;
+	evdi->pixel_area_limit = pixel_area_limit;
+	evdi->pixel_per_second_limit = pixel_per_second_limit;
 	painter->drm_filp = file;
 	kfree(painter->edid);
 	painter->edid_length = edid_length;
@@ -864,7 +866,8 @@
 			ret = evdi_painter_connect(evdi,
 					     cmd->edid,
 					     cmd->edid_length,
-					     cmd->sku_area_limit,
+					     cmd->pixel_area_limit,
+					     cmd->pixel_per_second_limit,
 					     file,
 					     cmd->dev_index);
 		else
diff --git a/include/uapi/drm/evdi_drm.h b/include/uapi/drm/evdi_drm.h
index c43e5fb..37345f9 100644
--- a/include/uapi/drm/evdi_drm.h
+++ b/include/uapi/drm/evdi_drm.h
@@ -46,7 +46,8 @@
 	int32_t dev_index;
 	const unsigned char * __user edid;
 	uint32_t edid_length;
-	uint32_t sku_area_limit;
+	uint32_t pixel_area_limit;
+	uint32_t pixel_per_second_limit;
 };
 
 struct drm_evdi_request_update {
@@ -128,4 +129,3 @@
 	DRM_EVDI_ENABLE_CURSOR_EVENTS, struct drm_evdi_enable_cursor_events)
 
 #endif /* __EVDI_UAPI_DRM_H__ */
-