@@ -1936,8 +1936,8 @@ int drm_mode_getcrtc(struct drm_device *dev,
crtc_resp->x = crtc->primary->state->src_x >> 16;
crtc_resp->y = crtc->primary->state->src_y >> 16;
if (crtc->state->enable) {
- WARN_ON(!crtc->state->mode);
- drm_mode_convert_to_umode(&crtc_resp->mode, crtc->state->mode);
+ memcpy(&crtc_resp->mode, &crtc->mode->umode,
+ sizeof(crtc_resp->mode));
crtc_resp->mode_valid = 1;
} else {
@@ -1947,9 +1947,8 @@ int drm_mode_getcrtc(struct drm_device *dev,
crtc_resp->x = crtc->x;
crtc_resp->y = crtc->y;
if (crtc->enabled) {
- WARN_ON(!crtc->mode);
- drm_mode_convert_to_umode(&crtc_resp->mode,
- crtc->mode);
+ memcpy(&crtc_resp->mode, &crtc->mode->umode,
+ sizeof(crtc_resp->mode));
crtc_resp->mode_valid = 1;
} else {
@@ -2046,15 +2045,12 @@ int drm_mode_getconnector(struct drm_device *dev, void *data,
int ret = 0;
int copied = 0;
int i;
- struct drm_mode_modeinfo u_mode;
struct drm_mode_modeinfo __user *mode_ptr;
uint32_t __user *encoder_ptr;
if (!drm_core_check_feature(dev, DRIVER_MODESET))
return -EINVAL;
- memset(&u_mode, 0, sizeof(struct drm_mode_modeinfo));
-
DRM_DEBUG_KMS("[CONNECTOR:%d:?]\n", out_resp->connector_id);
mutex_lock(&dev->mode_config.mutex);
@@ -2106,9 +2102,8 @@ int drm_mode_getconnector(struct drm_device *dev, void *data,
if (!drm_mode_expose_to_userspace(mode, file_priv))
continue;
- drm_mode_convert_to_umode(&u_mode, mode);
if (copy_to_user(mode_ptr + copied,
- &u_mode, sizeof(u_mode))) {
+ &mode->umode, sizeof(mode->umode))) {
ret = -EFAULT;
goto out;
}
@@ -899,8 +899,8 @@ EXPORT_SYMBOL(drm_mode_duplicate);
* Convert a drm_display_mode into a drm_mode_modeinfo structure to return to
* the user.
*/
-void drm_mode_convert_to_umode(struct drm_mode_modeinfo *out,
- const struct drm_display_mode *in)
+static void drm_mode_convert_to_umode(struct drm_mode_modeinfo *out,
+ const struct drm_display_mode *in)
{
WARN(in->hdisplay > USHRT_MAX || in->hsync_start > USHRT_MAX ||
in->hsync_end > USHRT_MAX || in->htotal > USHRT_MAX ||
@@ -219,8 +219,6 @@ struct drm_display_mode *drm_mode_duplicate(struct drm_device *dev,
const struct drm_display_mode *mode);
struct drm_display_mode *drm_mode_new_from_umode(struct drm_device *dev,
const struct drm_mode_modeinfo *in);
-void drm_mode_convert_to_umode(struct drm_mode_modeinfo *out,
- const struct drm_display_mode *in);
bool drm_mode_equal(const struct drm_display_mode *mode1,
const struct drm_display_mode *mode2);
bool drm_mode_equal_no_clocks_no_stereo(const struct drm_display_mode *mode1,
Instead of generating a new usermode every time we need to copy a mode back to userspace, just use the cached one we already have. Signed-off-by: Daniel Stone <daniels@collabora.com> --- drivers/gpu/drm/drm_crtc.c | 15 +++++---------- drivers/gpu/drm/drm_modes.c | 4 ++-- include/drm/drm_modes.h | 2 -- 3 files changed, 7 insertions(+), 14 deletions(-)