diff options
| -rw-r--r-- | drivers/gpu/drm/gma500/cdv_intel_display.c | 30 | ||||
| -rw-r--r-- | drivers/gpu/drm/gma500/framebuffer.c | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/gma500/psb_intel_display.c | 33 |
3 files changed, 54 insertions, 13 deletions
diff --git a/drivers/gpu/drm/gma500/cdv_intel_display.c b/drivers/gpu/drm/gma500/cdv_intel_display.c index 3cfd0931fbfb..82430ad8ba62 100644 --- a/drivers/gpu/drm/gma500/cdv_intel_display.c +++ b/drivers/gpu/drm/gma500/cdv_intel_display.c | |||
| @@ -1462,7 +1462,7 @@ static int cdv_intel_crtc_cursor_set(struct drm_crtc *crtc, | |||
| 1462 | size_t addr = 0; | 1462 | size_t addr = 0; |
| 1463 | struct gtt_range *gt; | 1463 | struct gtt_range *gt; |
| 1464 | struct drm_gem_object *obj; | 1464 | struct drm_gem_object *obj; |
| 1465 | int ret; | 1465 | int ret = 0; |
| 1466 | 1466 | ||
| 1467 | /* if we want to turn of the cursor ignore width and height */ | 1467 | /* if we want to turn of the cursor ignore width and height */ |
| 1468 | if (!handle) { | 1468 | if (!handle) { |
| @@ -1499,7 +1499,8 @@ static int cdv_intel_crtc_cursor_set(struct drm_crtc *crtc, | |||
| 1499 | 1499 | ||
| 1500 | if (obj->size < width * height * 4) { | 1500 | if (obj->size < width * height * 4) { |
| 1501 | dev_dbg(dev->dev, "buffer is to small\n"); | 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 | gt = container_of(obj, struct gtt_range, gem); | 1506 | gt = container_of(obj, struct gtt_range, gem); |
| @@ -1508,7 +1509,7 @@ static int cdv_intel_crtc_cursor_set(struct drm_crtc *crtc, | |||
| 1508 | ret = psb_gtt_pin(gt); | 1509 | ret = psb_gtt_pin(gt); |
| 1509 | if (ret) { | 1510 | if (ret) { |
| 1510 | dev_err(dev->dev, "Can not pin down handle 0x%x\n", handle); | 1511 | dev_err(dev->dev, "Can not pin down handle 0x%x\n", handle); |
| 1511 | return ret; | 1512 | goto unref_cursor; |
| 1512 | } | 1513 | } |
| 1513 | 1514 | ||
| 1514 | addr = gt->offset; /* Or resource.start ??? */ | 1515 | addr = gt->offset; /* Or resource.start ??? */ |
| @@ -1532,9 +1533,14 @@ static int cdv_intel_crtc_cursor_set(struct drm_crtc *crtc, | |||
| 1532 | struct gtt_range, gem); | 1533 | struct gtt_range, gem); |
| 1533 | psb_gtt_unpin(gt); | 1534 | psb_gtt_unpin(gt); |
| 1534 | drm_gem_object_unreference(psb_intel_crtc->cursor_obj); | 1535 | drm_gem_object_unreference(psb_intel_crtc->cursor_obj); |
| 1535 | psb_intel_crtc->cursor_obj = obj; | ||
| 1536 | } | 1536 | } |
| 1537 | return 0; | 1537 | |
| 1538 | psb_intel_crtc->cursor_obj = obj; | ||
| 1539 | return ret; | ||
| 1540 | |||
| 1541 | unref_cursor: | ||
| 1542 | drm_gem_object_unreference(obj); | ||
| 1543 | return ret; | ||
| 1538 | } | 1544 | } |
| 1539 | 1545 | ||
| 1540 | static int cdv_intel_crtc_cursor_move(struct drm_crtc *crtc, int x, int y) | 1546 | static int cdv_intel_crtc_cursor_move(struct drm_crtc *crtc, int x, int y) |
| @@ -1750,6 +1756,19 @@ static void cdv_intel_crtc_destroy(struct drm_crtc *crtc) | |||
| 1750 | kfree(psb_intel_crtc); | 1756 | kfree(psb_intel_crtc); |
| 1751 | } | 1757 | } |
| 1752 | 1758 | ||
| 1759 | static void cdv_intel_crtc_disable(struct drm_crtc *crtc) | ||
| 1760 | { | ||
| 1761 | struct gtt_range *gt; | ||
| 1762 | struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private; | ||
| 1763 | |||
| 1764 | crtc_funcs->dpms(crtc, DRM_MODE_DPMS_OFF); | ||
| 1765 | |||
| 1766 | if (crtc->fb) { | ||
| 1767 | gt = to_psb_fb(crtc->fb)->gtt; | ||
| 1768 | psb_gtt_unpin(gt); | ||
| 1769 | } | ||
| 1770 | } | ||
| 1771 | |||
| 1753 | const struct drm_crtc_helper_funcs cdv_intel_helper_funcs = { | 1772 | const struct drm_crtc_helper_funcs cdv_intel_helper_funcs = { |
| 1754 | .dpms = cdv_intel_crtc_dpms, | 1773 | .dpms = cdv_intel_crtc_dpms, |
| 1755 | .mode_fixup = cdv_intel_crtc_mode_fixup, | 1774 | .mode_fixup = cdv_intel_crtc_mode_fixup, |
| @@ -1757,6 +1776,7 @@ const struct drm_crtc_helper_funcs cdv_intel_helper_funcs = { | |||
| 1757 | .mode_set_base = cdv_intel_pipe_set_base, | 1776 | .mode_set_base = cdv_intel_pipe_set_base, |
| 1758 | .prepare = cdv_intel_crtc_prepare, | 1777 | .prepare = cdv_intel_crtc_prepare, |
| 1759 | .commit = cdv_intel_crtc_commit, | 1778 | .commit = cdv_intel_crtc_commit, |
| 1779 | .disable = cdv_intel_crtc_disable, | ||
| 1760 | }; | 1780 | }; |
| 1761 | 1781 | ||
| 1762 | const struct drm_crtc_funcs cdv_intel_crtc_funcs = { | 1782 | const struct drm_crtc_funcs cdv_intel_crtc_funcs = { |
diff --git a/drivers/gpu/drm/gma500/framebuffer.c b/drivers/gpu/drm/gma500/framebuffer.c index 1534e220097a..8b1b6d923abe 100644 --- a/drivers/gpu/drm/gma500/framebuffer.c +++ b/drivers/gpu/drm/gma500/framebuffer.c | |||
| @@ -121,8 +121,8 @@ static int psbfb_vm_fault(struct vm_area_struct *vma, struct vm_fault *vmf) | |||
| 121 | unsigned long address; | 121 | unsigned long address; |
| 122 | int ret; | 122 | int ret; |
| 123 | unsigned long pfn; | 123 | unsigned long pfn; |
| 124 | /* FIXME: assumes fb at stolen base which may not be true */ | 124 | unsigned long phys_addr = (unsigned long)dev_priv->stolen_base + |
| 125 | unsigned long phys_addr = (unsigned long)dev_priv->stolen_base; | 125 | psbfb->gtt->offset; |
| 126 | 126 | ||
| 127 | page_num = (vma->vm_end - vma->vm_start) >> PAGE_SHIFT; | 127 | page_num = (vma->vm_end - vma->vm_start) >> PAGE_SHIFT; |
| 128 | address = (unsigned long)vmf->virtual_address - (vmf->pgoff << PAGE_SHIFT); | 128 | address = (unsigned long)vmf->virtual_address - (vmf->pgoff << PAGE_SHIFT); |
diff --git a/drivers/gpu/drm/gma500/psb_intel_display.c b/drivers/gpu/drm/gma500/psb_intel_display.c index 6e8f42b61ff6..6666493789d1 100644 --- a/drivers/gpu/drm/gma500/psb_intel_display.c +++ b/drivers/gpu/drm/gma500/psb_intel_display.c | |||
| @@ -843,7 +843,7 @@ static int psb_intel_crtc_cursor_set(struct drm_crtc *crtc, | |||
| 843 | struct gtt_range *cursor_gt = psb_intel_crtc->cursor_gt; | 843 | struct gtt_range *cursor_gt = psb_intel_crtc->cursor_gt; |
| 844 | struct drm_gem_object *obj; | 844 | struct drm_gem_object *obj; |
| 845 | void *tmp_dst, *tmp_src; | 845 | void *tmp_dst, *tmp_src; |
| 846 | int ret, i, cursor_pages; | 846 | int ret = 0, i, cursor_pages; |
| 847 | 847 | ||
| 848 | /* if we want to turn of the cursor ignore width and height */ | 848 | /* if we want to turn of the cursor ignore width and height */ |
| 849 | if (!handle) { | 849 | if (!handle) { |
| @@ -880,7 +880,8 @@ static int psb_intel_crtc_cursor_set(struct drm_crtc *crtc, | |||
| 880 | 880 | ||
| 881 | if (obj->size < width * height * 4) { | 881 | if (obj->size < width * height * 4) { |
| 882 | dev_dbg(dev->dev, "buffer is to small\n"); | 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 | gt = container_of(obj, struct gtt_range, gem); | 887 | gt = container_of(obj, struct gtt_range, gem); |
| @@ -889,13 +890,14 @@ static int psb_intel_crtc_cursor_set(struct drm_crtc *crtc, | |||
| 889 | ret = psb_gtt_pin(gt); | 890 | ret = psb_gtt_pin(gt); |
| 890 | if (ret) { | 891 | if (ret) { |
| 891 | dev_err(dev->dev, "Can not pin down handle 0x%x\n", handle); | 892 | dev_err(dev->dev, "Can not pin down handle 0x%x\n", handle); |
| 892 | return ret; | 893 | goto unref_cursor; |
| 893 | } | 894 | } |
| 894 | 895 | ||
| 895 | if (dev_priv->ops->cursor_needs_phys) { | 896 | if (dev_priv->ops->cursor_needs_phys) { |
| 896 | if (cursor_gt == NULL) { | 897 | if (cursor_gt == NULL) { |
| 897 | dev_err(dev->dev, "No hardware cursor mem available"); | 898 | dev_err(dev->dev, "No hardware cursor mem available"); |
| 898 | return -ENOMEM; | 899 | ret = -ENOMEM; |
| 900 | goto unref_cursor; | ||
| 899 | } | 901 | } |
| 900 | 902 | ||
| 901 | /* Prevent overflow */ | 903 | /* Prevent overflow */ |
| @@ -936,9 +938,14 @@ static int psb_intel_crtc_cursor_set(struct drm_crtc *crtc, | |||
| 936 | struct gtt_range, gem); | 938 | struct gtt_range, gem); |
| 937 | psb_gtt_unpin(gt); | 939 | psb_gtt_unpin(gt); |
| 938 | drm_gem_object_unreference(psb_intel_crtc->cursor_obj); | 940 | drm_gem_object_unreference(psb_intel_crtc->cursor_obj); |
| 939 | psb_intel_crtc->cursor_obj = obj; | ||
| 940 | } | 941 | } |
| 941 | return 0; | 942 | |
| 943 | psb_intel_crtc->cursor_obj = obj; | ||
| 944 | return ret; | ||
| 945 | |||
| 946 | unref_cursor: | ||
| 947 | drm_gem_object_unreference(obj); | ||
| 948 | return ret; | ||
| 942 | } | 949 | } |
| 943 | 950 | ||
| 944 | static int psb_intel_crtc_cursor_move(struct drm_crtc *crtc, int x, int y) | 951 | static int psb_intel_crtc_cursor_move(struct drm_crtc *crtc, int x, int y) |
| @@ -1150,6 +1157,19 @@ static void psb_intel_crtc_destroy(struct drm_crtc *crtc) | |||
| 1150 | kfree(psb_intel_crtc); | 1157 | kfree(psb_intel_crtc); |
| 1151 | } | 1158 | } |
| 1152 | 1159 | ||
| 1160 | static void psb_intel_crtc_disable(struct drm_crtc *crtc) | ||
| 1161 | { | ||
| 1162 | struct gtt_range *gt; | ||
| 1163 | struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private; | ||
| 1164 | |||
| 1165 | crtc_funcs->dpms(crtc, DRM_MODE_DPMS_OFF); | ||
| 1166 | |||
| 1167 | if (crtc->fb) { | ||
| 1168 | gt = to_psb_fb(crtc->fb)->gtt; | ||
| 1169 | psb_gtt_unpin(gt); | ||
| 1170 | } | ||
| 1171 | } | ||
| 1172 | |||
| 1153 | const struct drm_crtc_helper_funcs psb_intel_helper_funcs = { | 1173 | const struct drm_crtc_helper_funcs psb_intel_helper_funcs = { |
| 1154 | .dpms = psb_intel_crtc_dpms, | 1174 | .dpms = psb_intel_crtc_dpms, |
| 1155 | .mode_fixup = psb_intel_crtc_mode_fixup, | 1175 | .mode_fixup = psb_intel_crtc_mode_fixup, |
| @@ -1157,6 +1177,7 @@ const struct drm_crtc_helper_funcs psb_intel_helper_funcs = { | |||
| 1157 | .mode_set_base = psb_intel_pipe_set_base, | 1177 | .mode_set_base = psb_intel_pipe_set_base, |
| 1158 | .prepare = psb_intel_crtc_prepare, | 1178 | .prepare = psb_intel_crtc_prepare, |
| 1159 | .commit = psb_intel_crtc_commit, | 1179 | .commit = psb_intel_crtc_commit, |
| 1180 | .disable = psb_intel_crtc_disable, | ||
| 1160 | }; | 1181 | }; |
| 1161 | 1182 | ||
| 1162 | const struct drm_crtc_funcs psb_intel_crtc_funcs = { | 1183 | const struct drm_crtc_funcs psb_intel_crtc_funcs = { |
