Merge branch 'gma500-fixes' of git://github.com/patjak/drm-gma500 into drm-fixes

Patrik writes:
Two fixes for memory leaks split into Cedarview and Poulsbo versions,
and a fix for properly setting the pipe base when using fbdev. It's on
my todo-list to start unifying the chips since they are very similar,
but until then I'd like to split them up in case there are side-effects
on Cedarview that I cannot currently test.

airled: Verified pull from github matches what I expected.
* 'gma500-fixes' of git://github.com/patjak/drm-gma500:
drm/gma500/cdv: Fix cursor gem obj referencing on cdv
drm/gma500/psb: Fix cursor gem obj referencing on psb
drm/gma500/cdv: Unpin framebuffer on crtc disable
drm/gma500/psb: Unpin framebuffer on crtc disable
drm/gma500: Add fb gtt offset to fb base

+54 -13
+25 -5
drivers/gpu/drm/gma500/cdv_intel_display.c
··· 1462 1462 size_t addr = 0; 1463 1463 struct gtt_range *gt; 1464 1464 struct drm_gem_object *obj; 1465 - int ret; 1465 + int ret = 0; 1466 1466 1467 1467 /* if we want to turn of the cursor ignore width and height */ 1468 1468 if (!handle) { ··· 1499 1499 1500 1500 if (obj->size < width * height * 4) { 1501 1501 dev_dbg(dev->dev, "buffer is to small\n"); 1502 - return -ENOMEM; 1502 + ret = -ENOMEM; 1503 + goto unref_cursor; 1503 1504 } 1504 1505 1505 1506 gt = container_of(obj, struct gtt_range, gem); ··· 1509 1508 ret = psb_gtt_pin(gt); 1510 1509 if (ret) { 1511 1510 dev_err(dev->dev, "Can not pin down handle 0x%x\n", handle); 1512 - return ret; 1511 + goto unref_cursor; 1513 1512 } 1514 1513 1515 1514 addr = gt->offset; /* Or resource.start ??? */ ··· 1533 1532 struct gtt_range, gem); 1534 1533 psb_gtt_unpin(gt); 1535 1534 drm_gem_object_unreference(psb_intel_crtc->cursor_obj); 1536 - psb_intel_crtc->cursor_obj = obj; 1537 1535 } 1538 - return 0; 1536 + 1537 + psb_intel_crtc->cursor_obj = obj; 1538 + return ret; 1539 + 1540 + unref_cursor: 1541 + drm_gem_object_unreference(obj); 1542 + return ret; 1539 1543 } 1540 1544 1541 1545 static int cdv_intel_crtc_cursor_move(struct drm_crtc *crtc, int x, int y) ··· 1756 1750 kfree(psb_intel_crtc); 1757 1751 } 1758 1752 1753 + static void cdv_intel_crtc_disable(struct drm_crtc *crtc) 1754 + { 1755 + struct gtt_range *gt; 1756 + struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private; 1757 + 1758 + crtc_funcs->dpms(crtc, DRM_MODE_DPMS_OFF); 1759 + 1760 + if (crtc->fb) { 1761 + gt = to_psb_fb(crtc->fb)->gtt; 1762 + psb_gtt_unpin(gt); 1763 + } 1764 + } 1765 + 1759 1766 const struct drm_crtc_helper_funcs cdv_intel_helper_funcs = { 1760 1767 .dpms = cdv_intel_crtc_dpms, 1761 1768 .mode_fixup = cdv_intel_crtc_mode_fixup, ··· 1776 1757 .mode_set_base = cdv_intel_pipe_set_base, 1777 1758 .prepare = cdv_intel_crtc_prepare, 1778 1759 .commit = cdv_intel_crtc_commit, 1760 + .disable = cdv_intel_crtc_disable, 1779 1761 }; 1780 1762 1781 1763 const struct drm_crtc_funcs cdv_intel_crtc_funcs = {
+2 -2
drivers/gpu/drm/gma500/framebuffer.c
··· 121 121 unsigned long address; 122 122 int ret; 123 123 unsigned long pfn; 124 - /* FIXME: assumes fb at stolen base which may not be true */ 125 - unsigned long phys_addr = (unsigned long)dev_priv->stolen_base; 124 + unsigned long phys_addr = (unsigned long)dev_priv->stolen_base + 125 + psbfb->gtt->offset; 126 126 127 127 page_num = (vma->vm_end - vma->vm_start) >> PAGE_SHIFT; 128 128 address = (unsigned long)vmf->virtual_address - (vmf->pgoff << PAGE_SHIFT);
+27 -6
drivers/gpu/drm/gma500/psb_intel_display.c
··· 843 843 struct gtt_range *cursor_gt = psb_intel_crtc->cursor_gt; 844 844 struct drm_gem_object *obj; 845 845 void *tmp_dst, *tmp_src; 846 - int ret, i, cursor_pages; 846 + int ret = 0, i, cursor_pages; 847 847 848 848 /* if we want to turn of the cursor ignore width and height */ 849 849 if (!handle) { ··· 880 880 881 881 if (obj->size < width * height * 4) { 882 882 dev_dbg(dev->dev, "buffer is to small\n"); 883 - return -ENOMEM; 883 + ret = -ENOMEM; 884 + goto unref_cursor; 884 885 } 885 886 886 887 gt = container_of(obj, struct gtt_range, gem); ··· 890 889 ret = psb_gtt_pin(gt); 891 890 if (ret) { 892 891 dev_err(dev->dev, "Can not pin down handle 0x%x\n", handle); 893 - return ret; 892 + goto unref_cursor; 894 893 } 895 894 896 895 if (dev_priv->ops->cursor_needs_phys) { 897 896 if (cursor_gt == NULL) { 898 897 dev_err(dev->dev, "No hardware cursor mem available"); 899 - return -ENOMEM; 898 + ret = -ENOMEM; 899 + goto unref_cursor; 900 900 } 901 901 902 902 /* Prevent overflow */ ··· 938 936 struct gtt_range, gem); 939 937 psb_gtt_unpin(gt); 940 938 drm_gem_object_unreference(psb_intel_crtc->cursor_obj); 941 - psb_intel_crtc->cursor_obj = obj; 942 939 } 943 - return 0; 940 + 941 + psb_intel_crtc->cursor_obj = obj; 942 + return ret; 943 + 944 + unref_cursor: 945 + drm_gem_object_unreference(obj); 946 + return ret; 944 947 } 945 948 946 949 static int psb_intel_crtc_cursor_move(struct drm_crtc *crtc, int x, int y) ··· 1157 1150 kfree(psb_intel_crtc); 1158 1151 } 1159 1152 1153 + static void psb_intel_crtc_disable(struct drm_crtc *crtc) 1154 + { 1155 + struct gtt_range *gt; 1156 + struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private; 1157 + 1158 + crtc_funcs->dpms(crtc, DRM_MODE_DPMS_OFF); 1159 + 1160 + if (crtc->fb) { 1161 + gt = to_psb_fb(crtc->fb)->gtt; 1162 + psb_gtt_unpin(gt); 1163 + } 1164 + } 1165 + 1160 1166 const struct drm_crtc_helper_funcs psb_intel_helper_funcs = { 1161 1167 .dpms = psb_intel_crtc_dpms, 1162 1168 .mode_fixup = psb_intel_crtc_mode_fixup, ··· 1177 1157 .mode_set_base = psb_intel_pipe_set_base, 1178 1158 .prepare = psb_intel_crtc_prepare, 1179 1159 .commit = psb_intel_crtc_commit, 1160 + .disable = psb_intel_crtc_disable, 1180 1161 }; 1181 1162 1182 1163 const struct drm_crtc_funcs psb_intel_crtc_funcs = {