overlay->fb_y = pos->fb_y;
        overlay->fb_width = fb->width;
        overlay->fb_height = fb->height;
+       overlay->src_width = pos->src_w;
+       overlay->src_height = pos->src_h;
        overlay->bpp = fb->bits_per_pixel;
        overlay->pitch = fb->pitches[0];
        overlay->pixel_format = fb->pixel_format;
        pos.crtc_y = 0;
        pos.crtc_w = fb->width - crtc->x;
        pos.crtc_h = fb->height - crtc->y;
+       pos.src_w = pos.crtc_w;
+       pos.src_h = pos.crtc_h;
 
        return exynos_drm_overlay_update(overlay, crtc->fb, mode, &pos);
 }
 
  *     - the unit is screen coordinates.
  * @fb_y: offset y on a framebuffer to be displayed
  *     - the unit is screen coordinates.
+ * @src_w: width of source area to be displayed from a framebuffer.
+ * @src_h: height of source area to be displayed from a framebuffer.
  * @crtc_x: offset x on hardware screen.
  * @crtc_y: offset y on hardware screen.
  * @crtc_w: width of hardware screen.
 struct exynos_drm_crtc_pos {
        unsigned int fb_x;
        unsigned int fb_y;
+       unsigned int src_w;
+       unsigned int src_h;
        unsigned int crtc_x;
        unsigned int crtc_y;
        unsigned int crtc_w;
 
  *     - the unit is screen coordinates.
  * @fb_width: width of a framebuffer.
  * @fb_height: height of a framebuffer.
+ * @src_width: width of a partial image to be displayed from framebuffer.
+ * @src_height: height of a partial image to be displayed from framebuffer.
  * @crtc_x: offset x on hardware screen.
  * @crtc_y: offset y on hardware screen.
  * @crtc_width: window width to be displayed (hardware screen).
        unsigned int fb_y;
        unsigned int fb_width;
        unsigned int fb_height;
+       unsigned int src_width;
+       unsigned int src_height;
        unsigned int crtc_x;
        unsigned int crtc_y;
        unsigned int crtc_width;
 
                container_of(plane, struct exynos_plane, base);
        struct exynos_drm_overlay *overlay = &exynos_plane->overlay;
        struct exynos_drm_crtc_pos pos;
-       unsigned int x = src_x >> 16;
-       unsigned int y = src_y >> 16;
        int ret;
 
        DRM_DEBUG_KMS("[%d] %s\n", __LINE__, __func__);
        pos.crtc_w = crtc_w;
        pos.crtc_h = crtc_h;
 
-       pos.fb_x = x;
-       pos.fb_y = y;
+       /* considering 16.16 fixed point of source values */
+       pos.fb_x = src_x >> 16;
+       pos.fb_y = src_y >> 16;
+       pos.src_w = src_w >> 16;
+       pos.src_h = src_h >> 16;
 
-       /* TODO: scale feature */
        ret = exynos_drm_overlay_update(overlay, fb, &crtc->mode, &pos);
        if (ret < 0)
                return ret;