diff options
author | Jiri Kosina <jkosina@suse.cz> | 2011-04-26 04:22:15 -0400 |
---|---|---|
committer | Jiri Kosina <jkosina@suse.cz> | 2011-04-26 04:22:59 -0400 |
commit | 07f9479a40cc778bc1462ada11f95b01360ae4ff (patch) | |
tree | 0676cf38df3844004bb3ebfd99dfa67a4a8998f5 /drivers/gpu | |
parent | 9d5e6bdb3013acfb311ab407eeca0b6a6a3dedbf (diff) | |
parent | cd2e49e90f1cae7726c9a2c54488d881d7f1cd1c (diff) |
Merge branch 'master' into for-next
Fast-forwarded to current state of Linus' tree as there are patches to be
applied for files that didn't exist on the old branch.
Diffstat (limited to 'drivers/gpu')
84 files changed, 1027 insertions, 569 deletions
diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig index a6feb78c404c..c58f691ec3ce 100644 --- a/drivers/gpu/drm/Kconfig +++ b/drivers/gpu/drm/Kconfig | |||
@@ -96,6 +96,7 @@ config DRM_I915 | |||
96 | # i915 depends on ACPI_VIDEO when ACPI is enabled | 96 | # i915 depends on ACPI_VIDEO when ACPI is enabled |
97 | # but for select to work, need to select ACPI_VIDEO's dependencies, ick | 97 | # but for select to work, need to select ACPI_VIDEO's dependencies, ick |
98 | select BACKLIGHT_CLASS_DEVICE if ACPI | 98 | select BACKLIGHT_CLASS_DEVICE if ACPI |
99 | select VIDEO_OUTPUT_CONTROL if ACPI | ||
99 | select INPUT if ACPI | 100 | select INPUT if ACPI |
100 | select ACPI_VIDEO if ACPI | 101 | select ACPI_VIDEO if ACPI |
101 | select ACPI_BUTTON if ACPI | 102 | select ACPI_BUTTON if ACPI |
diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c index 4c95b5fd9df3..872747c5a544 100644 --- a/drivers/gpu/drm/drm_crtc.c +++ b/drivers/gpu/drm/drm_crtc.c | |||
@@ -1073,6 +1073,9 @@ int drm_mode_getresources(struct drm_device *dev, void *data, | |||
1073 | uint32_t __user *encoder_id; | 1073 | uint32_t __user *encoder_id; |
1074 | struct drm_mode_group *mode_group; | 1074 | struct drm_mode_group *mode_group; |
1075 | 1075 | ||
1076 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | ||
1077 | return -EINVAL; | ||
1078 | |||
1076 | mutex_lock(&dev->mode_config.mutex); | 1079 | mutex_lock(&dev->mode_config.mutex); |
1077 | 1080 | ||
1078 | /* | 1081 | /* |
@@ -1244,6 +1247,9 @@ int drm_mode_getcrtc(struct drm_device *dev, | |||
1244 | struct drm_mode_object *obj; | 1247 | struct drm_mode_object *obj; |
1245 | int ret = 0; | 1248 | int ret = 0; |
1246 | 1249 | ||
1250 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | ||
1251 | return -EINVAL; | ||
1252 | |||
1247 | mutex_lock(&dev->mode_config.mutex); | 1253 | mutex_lock(&dev->mode_config.mutex); |
1248 | 1254 | ||
1249 | obj = drm_mode_object_find(dev, crtc_resp->crtc_id, | 1255 | obj = drm_mode_object_find(dev, crtc_resp->crtc_id, |
@@ -1312,6 +1318,9 @@ int drm_mode_getconnector(struct drm_device *dev, void *data, | |||
1312 | uint64_t __user *prop_values; | 1318 | uint64_t __user *prop_values; |
1313 | uint32_t __user *encoder_ptr; | 1319 | uint32_t __user *encoder_ptr; |
1314 | 1320 | ||
1321 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | ||
1322 | return -EINVAL; | ||
1323 | |||
1315 | memset(&u_mode, 0, sizeof(struct drm_mode_modeinfo)); | 1324 | memset(&u_mode, 0, sizeof(struct drm_mode_modeinfo)); |
1316 | 1325 | ||
1317 | DRM_DEBUG_KMS("[CONNECTOR:%d:?]\n", out_resp->connector_id); | 1326 | DRM_DEBUG_KMS("[CONNECTOR:%d:?]\n", out_resp->connector_id); |
@@ -1431,6 +1440,9 @@ int drm_mode_getencoder(struct drm_device *dev, void *data, | |||
1431 | struct drm_encoder *encoder; | 1440 | struct drm_encoder *encoder; |
1432 | int ret = 0; | 1441 | int ret = 0; |
1433 | 1442 | ||
1443 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | ||
1444 | return -EINVAL; | ||
1445 | |||
1434 | mutex_lock(&dev->mode_config.mutex); | 1446 | mutex_lock(&dev->mode_config.mutex); |
1435 | obj = drm_mode_object_find(dev, enc_resp->encoder_id, | 1447 | obj = drm_mode_object_find(dev, enc_resp->encoder_id, |
1436 | DRM_MODE_OBJECT_ENCODER); | 1448 | DRM_MODE_OBJECT_ENCODER); |
@@ -1486,6 +1498,9 @@ int drm_mode_setcrtc(struct drm_device *dev, void *data, | |||
1486 | int ret = 0; | 1498 | int ret = 0; |
1487 | int i; | 1499 | int i; |
1488 | 1500 | ||
1501 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | ||
1502 | return -EINVAL; | ||
1503 | |||
1489 | mutex_lock(&dev->mode_config.mutex); | 1504 | mutex_lock(&dev->mode_config.mutex); |
1490 | obj = drm_mode_object_find(dev, crtc_req->crtc_id, | 1505 | obj = drm_mode_object_find(dev, crtc_req->crtc_id, |
1491 | DRM_MODE_OBJECT_CRTC); | 1506 | DRM_MODE_OBJECT_CRTC); |
@@ -1603,6 +1618,9 @@ int drm_mode_cursor_ioctl(struct drm_device *dev, | |||
1603 | struct drm_crtc *crtc; | 1618 | struct drm_crtc *crtc; |
1604 | int ret = 0; | 1619 | int ret = 0; |
1605 | 1620 | ||
1621 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | ||
1622 | return -EINVAL; | ||
1623 | |||
1606 | if (!req->flags) { | 1624 | if (!req->flags) { |
1607 | DRM_ERROR("no operation set\n"); | 1625 | DRM_ERROR("no operation set\n"); |
1608 | return -EINVAL; | 1626 | return -EINVAL; |
@@ -1667,6 +1685,9 @@ int drm_mode_addfb(struct drm_device *dev, | |||
1667 | struct drm_framebuffer *fb; | 1685 | struct drm_framebuffer *fb; |
1668 | int ret = 0; | 1686 | int ret = 0; |
1669 | 1687 | ||
1688 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | ||
1689 | return -EINVAL; | ||
1690 | |||
1670 | if ((config->min_width > r->width) || (r->width > config->max_width)) { | 1691 | if ((config->min_width > r->width) || (r->width > config->max_width)) { |
1671 | DRM_ERROR("mode new framebuffer width not within limits\n"); | 1692 | DRM_ERROR("mode new framebuffer width not within limits\n"); |
1672 | return -EINVAL; | 1693 | return -EINVAL; |
@@ -1678,7 +1699,7 @@ int drm_mode_addfb(struct drm_device *dev, | |||
1678 | 1699 | ||
1679 | mutex_lock(&dev->mode_config.mutex); | 1700 | mutex_lock(&dev->mode_config.mutex); |
1680 | 1701 | ||
1681 | /* TODO check buffer is sufficently large */ | 1702 | /* TODO check buffer is sufficiently large */ |
1682 | /* TODO setup destructor callback */ | 1703 | /* TODO setup destructor callback */ |
1683 | 1704 | ||
1684 | fb = dev->mode_config.funcs->fb_create(dev, file_priv, r); | 1705 | fb = dev->mode_config.funcs->fb_create(dev, file_priv, r); |
@@ -1724,9 +1745,12 @@ int drm_mode_rmfb(struct drm_device *dev, | |||
1724 | int ret = 0; | 1745 | int ret = 0; |
1725 | int found = 0; | 1746 | int found = 0; |
1726 | 1747 | ||
1748 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | ||
1749 | return -EINVAL; | ||
1750 | |||
1727 | mutex_lock(&dev->mode_config.mutex); | 1751 | mutex_lock(&dev->mode_config.mutex); |
1728 | obj = drm_mode_object_find(dev, *id, DRM_MODE_OBJECT_FB); | 1752 | obj = drm_mode_object_find(dev, *id, DRM_MODE_OBJECT_FB); |
1729 | /* TODO check that we realy get a framebuffer back. */ | 1753 | /* TODO check that we really get a framebuffer back. */ |
1730 | if (!obj) { | 1754 | if (!obj) { |
1731 | DRM_ERROR("mode invalid framebuffer id\n"); | 1755 | DRM_ERROR("mode invalid framebuffer id\n"); |
1732 | ret = -EINVAL; | 1756 | ret = -EINVAL; |
@@ -1780,6 +1804,9 @@ int drm_mode_getfb(struct drm_device *dev, | |||
1780 | struct drm_framebuffer *fb; | 1804 | struct drm_framebuffer *fb; |
1781 | int ret = 0; | 1805 | int ret = 0; |
1782 | 1806 | ||
1807 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | ||
1808 | return -EINVAL; | ||
1809 | |||
1783 | mutex_lock(&dev->mode_config.mutex); | 1810 | mutex_lock(&dev->mode_config.mutex); |
1784 | obj = drm_mode_object_find(dev, r->fb_id, DRM_MODE_OBJECT_FB); | 1811 | obj = drm_mode_object_find(dev, r->fb_id, DRM_MODE_OBJECT_FB); |
1785 | if (!obj) { | 1812 | if (!obj) { |
@@ -1813,6 +1840,9 @@ int drm_mode_dirtyfb_ioctl(struct drm_device *dev, | |||
1813 | int num_clips; | 1840 | int num_clips; |
1814 | int ret = 0; | 1841 | int ret = 0; |
1815 | 1842 | ||
1843 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | ||
1844 | return -EINVAL; | ||
1845 | |||
1816 | mutex_lock(&dev->mode_config.mutex); | 1846 | mutex_lock(&dev->mode_config.mutex); |
1817 | obj = drm_mode_object_find(dev, r->fb_id, DRM_MODE_OBJECT_FB); | 1847 | obj = drm_mode_object_find(dev, r->fb_id, DRM_MODE_OBJECT_FB); |
1818 | if (!obj) { | 1848 | if (!obj) { |
@@ -1996,6 +2026,9 @@ int drm_mode_attachmode_ioctl(struct drm_device *dev, | |||
1996 | struct drm_mode_modeinfo *umode = &mode_cmd->mode; | 2026 | struct drm_mode_modeinfo *umode = &mode_cmd->mode; |
1997 | int ret = 0; | 2027 | int ret = 0; |
1998 | 2028 | ||
2029 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | ||
2030 | return -EINVAL; | ||
2031 | |||
1999 | mutex_lock(&dev->mode_config.mutex); | 2032 | mutex_lock(&dev->mode_config.mutex); |
2000 | 2033 | ||
2001 | obj = drm_mode_object_find(dev, mode_cmd->connector_id, DRM_MODE_OBJECT_CONNECTOR); | 2034 | obj = drm_mode_object_find(dev, mode_cmd->connector_id, DRM_MODE_OBJECT_CONNECTOR); |
@@ -2042,6 +2075,9 @@ int drm_mode_detachmode_ioctl(struct drm_device *dev, | |||
2042 | struct drm_mode_modeinfo *umode = &mode_cmd->mode; | 2075 | struct drm_mode_modeinfo *umode = &mode_cmd->mode; |
2043 | int ret = 0; | 2076 | int ret = 0; |
2044 | 2077 | ||
2078 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | ||
2079 | return -EINVAL; | ||
2080 | |||
2045 | mutex_lock(&dev->mode_config.mutex); | 2081 | mutex_lock(&dev->mode_config.mutex); |
2046 | 2082 | ||
2047 | obj = drm_mode_object_find(dev, mode_cmd->connector_id, DRM_MODE_OBJECT_CONNECTOR); | 2083 | obj = drm_mode_object_find(dev, mode_cmd->connector_id, DRM_MODE_OBJECT_CONNECTOR); |
@@ -2211,6 +2247,9 @@ int drm_mode_getproperty_ioctl(struct drm_device *dev, | |||
2211 | uint64_t __user *values_ptr; | 2247 | uint64_t __user *values_ptr; |
2212 | uint32_t __user *blob_length_ptr; | 2248 | uint32_t __user *blob_length_ptr; |
2213 | 2249 | ||
2250 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | ||
2251 | return -EINVAL; | ||
2252 | |||
2214 | mutex_lock(&dev->mode_config.mutex); | 2253 | mutex_lock(&dev->mode_config.mutex); |
2215 | obj = drm_mode_object_find(dev, out_resp->prop_id, DRM_MODE_OBJECT_PROPERTY); | 2254 | obj = drm_mode_object_find(dev, out_resp->prop_id, DRM_MODE_OBJECT_PROPERTY); |
2216 | if (!obj) { | 2255 | if (!obj) { |
@@ -2333,6 +2372,9 @@ int drm_mode_getblob_ioctl(struct drm_device *dev, | |||
2333 | int ret = 0; | 2372 | int ret = 0; |
2334 | void *blob_ptr; | 2373 | void *blob_ptr; |
2335 | 2374 | ||
2375 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | ||
2376 | return -EINVAL; | ||
2377 | |||
2336 | mutex_lock(&dev->mode_config.mutex); | 2378 | mutex_lock(&dev->mode_config.mutex); |
2337 | obj = drm_mode_object_find(dev, out_resp->blob_id, DRM_MODE_OBJECT_BLOB); | 2379 | obj = drm_mode_object_find(dev, out_resp->blob_id, DRM_MODE_OBJECT_BLOB); |
2338 | if (!obj) { | 2380 | if (!obj) { |
@@ -2393,6 +2435,9 @@ int drm_mode_connector_property_set_ioctl(struct drm_device *dev, | |||
2393 | int ret = -EINVAL; | 2435 | int ret = -EINVAL; |
2394 | int i; | 2436 | int i; |
2395 | 2437 | ||
2438 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | ||
2439 | return -EINVAL; | ||
2440 | |||
2396 | mutex_lock(&dev->mode_config.mutex); | 2441 | mutex_lock(&dev->mode_config.mutex); |
2397 | 2442 | ||
2398 | obj = drm_mode_object_find(dev, out_resp->connector_id, DRM_MODE_OBJECT_CONNECTOR); | 2443 | obj = drm_mode_object_find(dev, out_resp->connector_id, DRM_MODE_OBJECT_CONNECTOR); |
@@ -2509,6 +2554,9 @@ int drm_mode_gamma_set_ioctl(struct drm_device *dev, | |||
2509 | int size; | 2554 | int size; |
2510 | int ret = 0; | 2555 | int ret = 0; |
2511 | 2556 | ||
2557 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | ||
2558 | return -EINVAL; | ||
2559 | |||
2512 | mutex_lock(&dev->mode_config.mutex); | 2560 | mutex_lock(&dev->mode_config.mutex); |
2513 | obj = drm_mode_object_find(dev, crtc_lut->crtc_id, DRM_MODE_OBJECT_CRTC); | 2561 | obj = drm_mode_object_find(dev, crtc_lut->crtc_id, DRM_MODE_OBJECT_CRTC); |
2514 | if (!obj) { | 2562 | if (!obj) { |
@@ -2560,6 +2608,9 @@ int drm_mode_gamma_get_ioctl(struct drm_device *dev, | |||
2560 | int size; | 2608 | int size; |
2561 | int ret = 0; | 2609 | int ret = 0; |
2562 | 2610 | ||
2611 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | ||
2612 | return -EINVAL; | ||
2613 | |||
2563 | mutex_lock(&dev->mode_config.mutex); | 2614 | mutex_lock(&dev->mode_config.mutex); |
2564 | obj = drm_mode_object_find(dev, crtc_lut->crtc_id, DRM_MODE_OBJECT_CRTC); | 2615 | obj = drm_mode_object_find(dev, crtc_lut->crtc_id, DRM_MODE_OBJECT_CRTC); |
2565 | if (!obj) { | 2616 | if (!obj) { |
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c index 9c595e3b9c20..adc9358c9bec 100644 --- a/drivers/gpu/drm/drm_edid.c +++ b/drivers/gpu/drm/drm_edid.c | |||
@@ -1297,7 +1297,7 @@ add_detailed_modes(struct drm_connector *connector, struct edid *edid, | |||
1297 | /** | 1297 | /** |
1298 | * Search EDID for CEA extension block. | 1298 | * Search EDID for CEA extension block. |
1299 | */ | 1299 | */ |
1300 | static u8 *drm_find_cea_extension(struct edid *edid) | 1300 | u8 *drm_find_cea_extension(struct edid *edid) |
1301 | { | 1301 | { |
1302 | u8 *edid_ext = NULL; | 1302 | u8 *edid_ext = NULL; |
1303 | int i; | 1303 | int i; |
@@ -1318,6 +1318,7 @@ static u8 *drm_find_cea_extension(struct edid *edid) | |||
1318 | 1318 | ||
1319 | return edid_ext; | 1319 | return edid_ext; |
1320 | } | 1320 | } |
1321 | EXPORT_SYMBOL(drm_find_cea_extension); | ||
1321 | 1322 | ||
1322 | /** | 1323 | /** |
1323 | * drm_detect_hdmi_monitor - detect whether monitor is hdmi. | 1324 | * drm_detect_hdmi_monitor - detect whether monitor is hdmi. |
diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c index 57ce27c9a747..74e4ff578017 100644 --- a/drivers/gpu/drm/drm_gem.c +++ b/drivers/gpu/drm/drm_gem.c | |||
@@ -499,11 +499,12 @@ EXPORT_SYMBOL(drm_gem_vm_open); | |||
499 | void drm_gem_vm_close(struct vm_area_struct *vma) | 499 | void drm_gem_vm_close(struct vm_area_struct *vma) |
500 | { | 500 | { |
501 | struct drm_gem_object *obj = vma->vm_private_data; | 501 | struct drm_gem_object *obj = vma->vm_private_data; |
502 | struct drm_device *dev = obj->dev; | ||
502 | 503 | ||
503 | mutex_lock(&obj->dev->struct_mutex); | 504 | mutex_lock(&dev->struct_mutex); |
504 | drm_vm_close_locked(vma); | 505 | drm_vm_close_locked(vma); |
505 | drm_gem_object_unreference(obj); | 506 | drm_gem_object_unreference(obj); |
506 | mutex_unlock(&obj->dev->struct_mutex); | 507 | mutex_unlock(&dev->struct_mutex); |
507 | } | 508 | } |
508 | EXPORT_SYMBOL(drm_gem_vm_close); | 509 | EXPORT_SYMBOL(drm_gem_vm_close); |
509 | 510 | ||
diff --git a/drivers/gpu/drm/drm_ioctl.c b/drivers/gpu/drm/drm_ioctl.c index 7f6912a16761..904d7e9c8e47 100644 --- a/drivers/gpu/drm/drm_ioctl.c +++ b/drivers/gpu/drm/drm_ioctl.c | |||
@@ -280,6 +280,9 @@ int drm_getcap(struct drm_device *dev, void *data, struct drm_file *file_priv) | |||
280 | if (dev->driver->dumb_create) | 280 | if (dev->driver->dumb_create) |
281 | req->value = 1; | 281 | req->value = 1; |
282 | break; | 282 | break; |
283 | case DRM_CAP_VBLANK_HIGH_CRTC: | ||
284 | req->value = 1; | ||
285 | break; | ||
283 | default: | 286 | default: |
284 | return -EINVAL; | 287 | return -EINVAL; |
285 | } | 288 | } |
diff --git a/drivers/gpu/drm/drm_irq.c b/drivers/gpu/drm/drm_irq.c index a34ef97d3c81..741457bd1c46 100644 --- a/drivers/gpu/drm/drm_irq.c +++ b/drivers/gpu/drm/drm_irq.c | |||
@@ -1125,7 +1125,7 @@ int drm_wait_vblank(struct drm_device *dev, void *data, | |||
1125 | { | 1125 | { |
1126 | union drm_wait_vblank *vblwait = data; | 1126 | union drm_wait_vblank *vblwait = data; |
1127 | int ret = 0; | 1127 | int ret = 0; |
1128 | unsigned int flags, seq, crtc; | 1128 | unsigned int flags, seq, crtc, high_crtc; |
1129 | 1129 | ||
1130 | if ((!drm_dev_to_irq(dev)) || (!dev->irq_enabled)) | 1130 | if ((!drm_dev_to_irq(dev)) || (!dev->irq_enabled)) |
1131 | return -EINVAL; | 1131 | return -EINVAL; |
@@ -1134,16 +1134,21 @@ int drm_wait_vblank(struct drm_device *dev, void *data, | |||
1134 | return -EINVAL; | 1134 | return -EINVAL; |
1135 | 1135 | ||
1136 | if (vblwait->request.type & | 1136 | if (vblwait->request.type & |
1137 | ~(_DRM_VBLANK_TYPES_MASK | _DRM_VBLANK_FLAGS_MASK)) { | 1137 | ~(_DRM_VBLANK_TYPES_MASK | _DRM_VBLANK_FLAGS_MASK | |
1138 | _DRM_VBLANK_HIGH_CRTC_MASK)) { | ||
1138 | DRM_ERROR("Unsupported type value 0x%x, supported mask 0x%x\n", | 1139 | DRM_ERROR("Unsupported type value 0x%x, supported mask 0x%x\n", |
1139 | vblwait->request.type, | 1140 | vblwait->request.type, |
1140 | (_DRM_VBLANK_TYPES_MASK | _DRM_VBLANK_FLAGS_MASK)); | 1141 | (_DRM_VBLANK_TYPES_MASK | _DRM_VBLANK_FLAGS_MASK | |
1142 | _DRM_VBLANK_HIGH_CRTC_MASK)); | ||
1141 | return -EINVAL; | 1143 | return -EINVAL; |
1142 | } | 1144 | } |
1143 | 1145 | ||
1144 | flags = vblwait->request.type & _DRM_VBLANK_FLAGS_MASK; | 1146 | flags = vblwait->request.type & _DRM_VBLANK_FLAGS_MASK; |
1145 | crtc = flags & _DRM_VBLANK_SECONDARY ? 1 : 0; | 1147 | high_crtc = (vblwait->request.type & _DRM_VBLANK_HIGH_CRTC_MASK); |
1146 | 1148 | if (high_crtc) | |
1149 | crtc = high_crtc >> _DRM_VBLANK_HIGH_CRTC_SHIFT; | ||
1150 | else | ||
1151 | crtc = flags & _DRM_VBLANK_SECONDARY ? 1 : 0; | ||
1147 | if (crtc >= dev->num_crtcs) | 1152 | if (crtc >= dev->num_crtcs) |
1148 | return -EINVAL; | 1153 | return -EINVAL; |
1149 | 1154 | ||
diff --git a/drivers/gpu/drm/drm_mm.c b/drivers/gpu/drm/drm_mm.c index add1737dae0d..5d00b0fc0d91 100644 --- a/drivers/gpu/drm/drm_mm.c +++ b/drivers/gpu/drm/drm_mm.c | |||
@@ -551,7 +551,7 @@ EXPORT_SYMBOL(drm_mm_scan_add_block); | |||
551 | * corrupted. | 551 | * corrupted. |
552 | * | 552 | * |
553 | * When the scan list is empty, the selected memory nodes can be freed. An | 553 | * When the scan list is empty, the selected memory nodes can be freed. An |
554 | * immediatly following drm_mm_search_free with best_match = 0 will then return | 554 | * immediately following drm_mm_search_free with best_match = 0 will then return |
555 | * the just freed block (because its at the top of the free_stack list). | 555 | * the just freed block (because its at the top of the free_stack list). |
556 | * | 556 | * |
557 | * Returns one if this block should be evicted, zero otherwise. Will always | 557 | * Returns one if this block should be evicted, zero otherwise. Will always |
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c index 09e0327fc6ce..87c8e29465e3 100644 --- a/drivers/gpu/drm/i915/i915_debugfs.c +++ b/drivers/gpu/drm/i915/i915_debugfs.c | |||
@@ -892,7 +892,7 @@ static int i915_cur_delayinfo(struct seq_file *m, void *unused) | |||
892 | seq_printf(m, "Render p-state limit: %d\n", | 892 | seq_printf(m, "Render p-state limit: %d\n", |
893 | rp_state_limits & 0xff); | 893 | rp_state_limits & 0xff); |
894 | seq_printf(m, "CAGF: %dMHz\n", ((rpstat & GEN6_CAGF_MASK) >> | 894 | seq_printf(m, "CAGF: %dMHz\n", ((rpstat & GEN6_CAGF_MASK) >> |
895 | GEN6_CAGF_SHIFT) * 100); | 895 | GEN6_CAGF_SHIFT) * 50); |
896 | seq_printf(m, "RP CUR UP EI: %dus\n", rpupei & | 896 | seq_printf(m, "RP CUR UP EI: %dus\n", rpupei & |
897 | GEN6_CURICONT_MASK); | 897 | GEN6_CURICONT_MASK); |
898 | seq_printf(m, "RP CUR UP: %dus\n", rpcurup & | 898 | seq_printf(m, "RP CUR UP: %dus\n", rpcurup & |
@@ -908,15 +908,15 @@ static int i915_cur_delayinfo(struct seq_file *m, void *unused) | |||
908 | 908 | ||
909 | max_freq = (rp_state_cap & 0xff0000) >> 16; | 909 | max_freq = (rp_state_cap & 0xff0000) >> 16; |
910 | seq_printf(m, "Lowest (RPN) frequency: %dMHz\n", | 910 | seq_printf(m, "Lowest (RPN) frequency: %dMHz\n", |
911 | max_freq * 100); | 911 | max_freq * 50); |
912 | 912 | ||
913 | max_freq = (rp_state_cap & 0xff00) >> 8; | 913 | max_freq = (rp_state_cap & 0xff00) >> 8; |
914 | seq_printf(m, "Nominal (RP1) frequency: %dMHz\n", | 914 | seq_printf(m, "Nominal (RP1) frequency: %dMHz\n", |
915 | max_freq * 100); | 915 | max_freq * 50); |
916 | 916 | ||
917 | max_freq = rp_state_cap & 0xff; | 917 | max_freq = rp_state_cap & 0xff; |
918 | seq_printf(m, "Max non-overclocked (RP0) frequency: %dMHz\n", | 918 | seq_printf(m, "Max non-overclocked (RP0) frequency: %dMHz\n", |
919 | max_freq * 100); | 919 | max_freq * 50); |
920 | 920 | ||
921 | __gen6_gt_force_wake_put(dev_priv); | 921 | __gen6_gt_force_wake_put(dev_priv); |
922 | } else { | 922 | } else { |
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 449650545bb4..1c1b27c97e5c 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h | |||
@@ -383,6 +383,7 @@ typedef struct drm_i915_private { | |||
383 | u32 saveDSPACNTR; | 383 | u32 saveDSPACNTR; |
384 | u32 saveDSPBCNTR; | 384 | u32 saveDSPBCNTR; |
385 | u32 saveDSPARB; | 385 | u32 saveDSPARB; |
386 | u32 saveHWS; | ||
386 | u32 savePIPEACONF; | 387 | u32 savePIPEACONF; |
387 | u32 savePIPEBCONF; | 388 | u32 savePIPEBCONF; |
388 | u32 savePIPEASRC; | 389 | u32 savePIPEASRC; |
@@ -629,7 +630,7 @@ typedef struct drm_i915_private { | |||
629 | * Flag if the hardware appears to be wedged. | 630 | * Flag if the hardware appears to be wedged. |
630 | * | 631 | * |
631 | * This is set when attempts to idle the device timeout. | 632 | * This is set when attempts to idle the device timeout. |
632 | * It prevents command submission from occuring and makes | 633 | * It prevents command submission from occurring and makes |
633 | * every pending request fail | 634 | * every pending request fail |
634 | */ | 635 | */ |
635 | atomic_t wedged; | 636 | atomic_t wedged; |
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index c4c2855d002d..7ce3f353af33 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
@@ -224,7 +224,7 @@ i915_gem_dumb_create(struct drm_file *file, | |||
224 | struct drm_mode_create_dumb *args) | 224 | struct drm_mode_create_dumb *args) |
225 | { | 225 | { |
226 | /* have to work out size/pitch and return them */ | 226 | /* have to work out size/pitch and return them */ |
227 | args->pitch = ALIGN(args->width & ((args->bpp + 1) / 8), 64); | 227 | args->pitch = ALIGN(args->width * ((args->bpp + 7) / 8), 64); |
228 | args->size = args->pitch * args->height; | 228 | args->size = args->pitch * args->height; |
229 | return i915_gem_create(file, dev, | 229 | return i915_gem_create(file, dev, |
230 | args->size, &args->handle); | 230 | args->size, &args->handle); |
@@ -1356,9 +1356,10 @@ i915_gem_release_mmap(struct drm_i915_gem_object *obj) | |||
1356 | if (!obj->fault_mappable) | 1356 | if (!obj->fault_mappable) |
1357 | return; | 1357 | return; |
1358 | 1358 | ||
1359 | unmap_mapping_range(obj->base.dev->dev_mapping, | 1359 | if (obj->base.dev->dev_mapping) |
1360 | (loff_t)obj->base.map_list.hash.key<<PAGE_SHIFT, | 1360 | unmap_mapping_range(obj->base.dev->dev_mapping, |
1361 | obj->base.size, 1); | 1361 | (loff_t)obj->base.map_list.hash.key<<PAGE_SHIFT, |
1362 | obj->base.size, 1); | ||
1362 | 1363 | ||
1363 | obj->fault_mappable = false; | 1364 | obj->fault_mappable = false; |
1364 | } | 1365 | } |
@@ -1796,8 +1797,10 @@ i915_gem_request_remove_from_client(struct drm_i915_gem_request *request) | |||
1796 | return; | 1797 | return; |
1797 | 1798 | ||
1798 | spin_lock(&file_priv->mm.lock); | 1799 | spin_lock(&file_priv->mm.lock); |
1799 | list_del(&request->client_list); | 1800 | if (request->file_priv) { |
1800 | request->file_priv = NULL; | 1801 | list_del(&request->client_list); |
1802 | request->file_priv = NULL; | ||
1803 | } | ||
1801 | spin_unlock(&file_priv->mm.lock); | 1804 | spin_unlock(&file_priv->mm.lock); |
1802 | } | 1805 | } |
1803 | 1806 | ||
@@ -2217,13 +2220,18 @@ i915_gem_flush_ring(struct intel_ring_buffer *ring, | |||
2217 | { | 2220 | { |
2218 | int ret; | 2221 | int ret; |
2219 | 2222 | ||
2223 | if (((invalidate_domains | flush_domains) & I915_GEM_GPU_DOMAINS) == 0) | ||
2224 | return 0; | ||
2225 | |||
2220 | trace_i915_gem_ring_flush(ring, invalidate_domains, flush_domains); | 2226 | trace_i915_gem_ring_flush(ring, invalidate_domains, flush_domains); |
2221 | 2227 | ||
2222 | ret = ring->flush(ring, invalidate_domains, flush_domains); | 2228 | ret = ring->flush(ring, invalidate_domains, flush_domains); |
2223 | if (ret) | 2229 | if (ret) |
2224 | return ret; | 2230 | return ret; |
2225 | 2231 | ||
2226 | i915_gem_process_flushing_list(ring, flush_domains); | 2232 | if (flush_domains & I915_GEM_GPU_DOMAINS) |
2233 | i915_gem_process_flushing_list(ring, flush_domains); | ||
2234 | |||
2227 | return 0; | 2235 | return 0; |
2228 | } | 2236 | } |
2229 | 2237 | ||
@@ -2579,8 +2587,23 @@ i915_gem_object_get_fence(struct drm_i915_gem_object *obj, | |||
2579 | reg = &dev_priv->fence_regs[obj->fence_reg]; | 2587 | reg = &dev_priv->fence_regs[obj->fence_reg]; |
2580 | list_move_tail(®->lru_list, &dev_priv->mm.fence_list); | 2588 | list_move_tail(®->lru_list, &dev_priv->mm.fence_list); |
2581 | 2589 | ||
2582 | if (!obj->fenced_gpu_access && !obj->last_fenced_seqno) | 2590 | if (obj->tiling_changed) { |
2583 | pipelined = NULL; | 2591 | ret = i915_gem_object_flush_fence(obj, pipelined); |
2592 | if (ret) | ||
2593 | return ret; | ||
2594 | |||
2595 | if (!obj->fenced_gpu_access && !obj->last_fenced_seqno) | ||
2596 | pipelined = NULL; | ||
2597 | |||
2598 | if (pipelined) { | ||
2599 | reg->setup_seqno = | ||
2600 | i915_gem_next_request_seqno(pipelined); | ||
2601 | obj->last_fenced_seqno = reg->setup_seqno; | ||
2602 | obj->last_fenced_ring = pipelined; | ||
2603 | } | ||
2604 | |||
2605 | goto update; | ||
2606 | } | ||
2584 | 2607 | ||
2585 | if (!pipelined) { | 2608 | if (!pipelined) { |
2586 | if (reg->setup_seqno) { | 2609 | if (reg->setup_seqno) { |
@@ -2599,31 +2622,6 @@ i915_gem_object_get_fence(struct drm_i915_gem_object *obj, | |||
2599 | ret = i915_gem_object_flush_fence(obj, pipelined); | 2622 | ret = i915_gem_object_flush_fence(obj, pipelined); |
2600 | if (ret) | 2623 | if (ret) |
2601 | return ret; | 2624 | return ret; |
2602 | } else if (obj->tiling_changed) { | ||
2603 | if (obj->fenced_gpu_access) { | ||
2604 | if (obj->base.write_domain & I915_GEM_GPU_DOMAINS) { | ||
2605 | ret = i915_gem_flush_ring(obj->ring, | ||
2606 | 0, obj->base.write_domain); | ||
2607 | if (ret) | ||
2608 | return ret; | ||
2609 | } | ||
2610 | |||
2611 | obj->fenced_gpu_access = false; | ||
2612 | } | ||
2613 | } | ||
2614 | |||
2615 | if (!obj->fenced_gpu_access && !obj->last_fenced_seqno) | ||
2616 | pipelined = NULL; | ||
2617 | BUG_ON(!pipelined && reg->setup_seqno); | ||
2618 | |||
2619 | if (obj->tiling_changed) { | ||
2620 | if (pipelined) { | ||
2621 | reg->setup_seqno = | ||
2622 | i915_gem_next_request_seqno(pipelined); | ||
2623 | obj->last_fenced_seqno = reg->setup_seqno; | ||
2624 | obj->last_fenced_ring = pipelined; | ||
2625 | } | ||
2626 | goto update; | ||
2627 | } | 2625 | } |
2628 | 2626 | ||
2629 | return 0; | 2627 | return 0; |
@@ -3606,6 +3604,8 @@ static void i915_gem_free_object_tail(struct drm_i915_gem_object *obj) | |||
3606 | return; | 3604 | return; |
3607 | } | 3605 | } |
3608 | 3606 | ||
3607 | trace_i915_gem_object_destroy(obj); | ||
3608 | |||
3609 | if (obj->base.map_list.map) | 3609 | if (obj->base.map_list.map) |
3610 | i915_gem_free_mmap_offset(obj); | 3610 | i915_gem_free_mmap_offset(obj); |
3611 | 3611 | ||
@@ -3615,8 +3615,6 @@ static void i915_gem_free_object_tail(struct drm_i915_gem_object *obj) | |||
3615 | kfree(obj->page_cpu_valid); | 3615 | kfree(obj->page_cpu_valid); |
3616 | kfree(obj->bit_17); | 3616 | kfree(obj->bit_17); |
3617 | kfree(obj); | 3617 | kfree(obj); |
3618 | |||
3619 | trace_i915_gem_object_destroy(obj); | ||
3620 | } | 3618 | } |
3621 | 3619 | ||
3622 | void i915_gem_free_object(struct drm_gem_object *gem_obj) | 3620 | void i915_gem_free_object(struct drm_gem_object *gem_obj) |
diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c index 7ff7f933ddf1..20a4cc5b818f 100644 --- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c +++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c | |||
@@ -367,6 +367,10 @@ i915_gem_execbuffer_relocate_entry(struct drm_i915_gem_object *obj, | |||
367 | uint32_t __iomem *reloc_entry; | 367 | uint32_t __iomem *reloc_entry; |
368 | void __iomem *reloc_page; | 368 | void __iomem *reloc_page; |
369 | 369 | ||
370 | /* We can't wait for rendering with pagefaults disabled */ | ||
371 | if (obj->active && in_atomic()) | ||
372 | return -EFAULT; | ||
373 | |||
370 | ret = i915_gem_object_set_to_gtt_domain(obj, 1); | 374 | ret = i915_gem_object_set_to_gtt_domain(obj, 1); |
371 | if (ret) | 375 | if (ret) |
372 | return ret; | 376 | return ret; |
@@ -440,15 +444,24 @@ i915_gem_execbuffer_relocate(struct drm_device *dev, | |||
440 | struct list_head *objects) | 444 | struct list_head *objects) |
441 | { | 445 | { |
442 | struct drm_i915_gem_object *obj; | 446 | struct drm_i915_gem_object *obj; |
443 | int ret; | 447 | int ret = 0; |
444 | 448 | ||
449 | /* This is the fast path and we cannot handle a pagefault whilst | ||
450 | * holding the struct mutex lest the user pass in the relocations | ||
451 | * contained within a mmaped bo. For in such a case we, the page | ||
452 | * fault handler would call i915_gem_fault() and we would try to | ||
453 | * acquire the struct mutex again. Obviously this is bad and so | ||
454 | * lockdep complains vehemently. | ||
455 | */ | ||
456 | pagefault_disable(); | ||
445 | list_for_each_entry(obj, objects, exec_list) { | 457 | list_for_each_entry(obj, objects, exec_list) { |
446 | ret = i915_gem_execbuffer_relocate_object(obj, eb); | 458 | ret = i915_gem_execbuffer_relocate_object(obj, eb); |
447 | if (ret) | 459 | if (ret) |
448 | return ret; | 460 | break; |
449 | } | 461 | } |
462 | pagefault_enable(); | ||
450 | 463 | ||
451 | return 0; | 464 | return ret; |
452 | } | 465 | } |
453 | 466 | ||
454 | static int | 467 | static int |
diff --git a/drivers/gpu/drm/i915/i915_suspend.c b/drivers/gpu/drm/i915/i915_suspend.c index 7e992a8e9098..da474153a0a2 100644 --- a/drivers/gpu/drm/i915/i915_suspend.c +++ b/drivers/gpu/drm/i915/i915_suspend.c | |||
@@ -796,6 +796,9 @@ int i915_save_state(struct drm_device *dev) | |||
796 | 796 | ||
797 | pci_read_config_byte(dev->pdev, LBB, &dev_priv->saveLBB); | 797 | pci_read_config_byte(dev->pdev, LBB, &dev_priv->saveLBB); |
798 | 798 | ||
799 | /* Hardware status page */ | ||
800 | dev_priv->saveHWS = I915_READ(HWS_PGA); | ||
801 | |||
799 | i915_save_display(dev); | 802 | i915_save_display(dev); |
800 | 803 | ||
801 | /* Interrupt state */ | 804 | /* Interrupt state */ |
@@ -842,6 +845,9 @@ int i915_restore_state(struct drm_device *dev) | |||
842 | 845 | ||
843 | pci_write_config_byte(dev->pdev, LBB, dev_priv->saveLBB); | 846 | pci_write_config_byte(dev->pdev, LBB, dev_priv->saveLBB); |
844 | 847 | ||
848 | /* Hardware status page */ | ||
849 | I915_WRITE(HWS_PGA, dev_priv->saveHWS); | ||
850 | |||
845 | i915_restore_display(dev); | 851 | i915_restore_display(dev); |
846 | 852 | ||
847 | /* Interrupt state */ | 853 | /* Interrupt state */ |
diff --git a/drivers/gpu/drm/i915/intel_crt.c b/drivers/gpu/drm/i915/intel_crt.c index 8342259f3160..d03fc05b39c0 100644 --- a/drivers/gpu/drm/i915/intel_crt.c +++ b/drivers/gpu/drm/i915/intel_crt.c | |||
@@ -269,21 +269,6 @@ static bool intel_crt_detect_hotplug(struct drm_connector *connector) | |||
269 | return ret; | 269 | return ret; |
270 | } | 270 | } |
271 | 271 | ||
272 | static bool intel_crt_ddc_probe(struct drm_i915_private *dev_priv, int ddc_bus) | ||
273 | { | ||
274 | u8 buf; | ||
275 | struct i2c_msg msgs[] = { | ||
276 | { | ||
277 | .addr = 0xA0, | ||
278 | .flags = 0, | ||
279 | .len = 1, | ||
280 | .buf = &buf, | ||
281 | }, | ||
282 | }; | ||
283 | /* DDC monitor detect: Does it ACK a write to 0xA0? */ | ||
284 | return i2c_transfer(&dev_priv->gmbus[ddc_bus].adapter, msgs, 1) == 1; | ||
285 | } | ||
286 | |||
287 | static bool intel_crt_detect_ddc(struct drm_connector *connector) | 272 | static bool intel_crt_detect_ddc(struct drm_connector *connector) |
288 | { | 273 | { |
289 | struct intel_crt *crt = intel_attached_crt(connector); | 274 | struct intel_crt *crt = intel_attached_crt(connector); |
@@ -293,11 +278,6 @@ static bool intel_crt_detect_ddc(struct drm_connector *connector) | |||
293 | if (crt->base.type != INTEL_OUTPUT_ANALOG) | 278 | if (crt->base.type != INTEL_OUTPUT_ANALOG) |
294 | return false; | 279 | return false; |
295 | 280 | ||
296 | if (intel_crt_ddc_probe(dev_priv, dev_priv->crt_ddc_pin)) { | ||
297 | DRM_DEBUG_KMS("CRT detected via DDC:0xa0\n"); | ||
298 | return true; | ||
299 | } | ||
300 | |||
301 | if (intel_ddc_probe(&crt->base, dev_priv->crt_ddc_pin)) { | 281 | if (intel_ddc_probe(&crt->base, dev_priv->crt_ddc_pin)) { |
302 | struct edid *edid; | 282 | struct edid *edid; |
303 | bool is_digital = false; | 283 | bool is_digital = false; |
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 3106c0dc8389..e522c702b04e 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
@@ -1516,9 +1516,10 @@ static void intel_enable_pipe(struct drm_i915_private *dev_priv, enum pipe pipe, | |||
1516 | 1516 | ||
1517 | reg = PIPECONF(pipe); | 1517 | reg = PIPECONF(pipe); |
1518 | val = I915_READ(reg); | 1518 | val = I915_READ(reg); |
1519 | val |= PIPECONF_ENABLE; | 1519 | if (val & PIPECONF_ENABLE) |
1520 | I915_WRITE(reg, val); | 1520 | return; |
1521 | POSTING_READ(reg); | 1521 | |
1522 | I915_WRITE(reg, val | PIPECONF_ENABLE); | ||
1522 | intel_wait_for_vblank(dev_priv->dev, pipe); | 1523 | intel_wait_for_vblank(dev_priv->dev, pipe); |
1523 | } | 1524 | } |
1524 | 1525 | ||
@@ -1552,9 +1553,10 @@ static void intel_disable_pipe(struct drm_i915_private *dev_priv, | |||
1552 | 1553 | ||
1553 | reg = PIPECONF(pipe); | 1554 | reg = PIPECONF(pipe); |
1554 | val = I915_READ(reg); | 1555 | val = I915_READ(reg); |
1555 | val &= ~PIPECONF_ENABLE; | 1556 | if ((val & PIPECONF_ENABLE) == 0) |
1556 | I915_WRITE(reg, val); | 1557 | return; |
1557 | POSTING_READ(reg); | 1558 | |
1559 | I915_WRITE(reg, val & ~PIPECONF_ENABLE); | ||
1558 | intel_wait_for_pipe_off(dev_priv->dev, pipe); | 1560 | intel_wait_for_pipe_off(dev_priv->dev, pipe); |
1559 | } | 1561 | } |
1560 | 1562 | ||
@@ -1577,9 +1579,10 @@ static void intel_enable_plane(struct drm_i915_private *dev_priv, | |||
1577 | 1579 | ||
1578 | reg = DSPCNTR(plane); | 1580 | reg = DSPCNTR(plane); |
1579 | val = I915_READ(reg); | 1581 | val = I915_READ(reg); |
1580 | val |= DISPLAY_PLANE_ENABLE; | 1582 | if (val & DISPLAY_PLANE_ENABLE) |
1581 | I915_WRITE(reg, val); | 1583 | return; |
1582 | POSTING_READ(reg); | 1584 | |
1585 | I915_WRITE(reg, val | DISPLAY_PLANE_ENABLE); | ||
1583 | intel_wait_for_vblank(dev_priv->dev, pipe); | 1586 | intel_wait_for_vblank(dev_priv->dev, pipe); |
1584 | } | 1587 | } |
1585 | 1588 | ||
@@ -1610,9 +1613,10 @@ static void intel_disable_plane(struct drm_i915_private *dev_priv, | |||
1610 | 1613 | ||
1611 | reg = DSPCNTR(plane); | 1614 | reg = DSPCNTR(plane); |
1612 | val = I915_READ(reg); | 1615 | val = I915_READ(reg); |
1613 | val &= ~DISPLAY_PLANE_ENABLE; | 1616 | if ((val & DISPLAY_PLANE_ENABLE) == 0) |
1614 | I915_WRITE(reg, val); | 1617 | return; |
1615 | POSTING_READ(reg); | 1618 | |
1619 | I915_WRITE(reg, val & ~DISPLAY_PLANE_ENABLE); | ||
1616 | intel_flush_display_plane(dev_priv, plane); | 1620 | intel_flush_display_plane(dev_priv, plane); |
1617 | intel_wait_for_vblank(dev_priv->dev, pipe); | 1621 | intel_wait_for_vblank(dev_priv->dev, pipe); |
1618 | } | 1622 | } |
@@ -1769,7 +1773,6 @@ static void g4x_enable_fbc(struct drm_crtc *crtc, unsigned long interval) | |||
1769 | return; | 1773 | return; |
1770 | 1774 | ||
1771 | I915_WRITE(DPFC_CONTROL, dpfc_ctl & ~DPFC_CTL_EN); | 1775 | I915_WRITE(DPFC_CONTROL, dpfc_ctl & ~DPFC_CTL_EN); |
1772 | POSTING_READ(DPFC_CONTROL); | ||
1773 | intel_wait_for_vblank(dev, intel_crtc->pipe); | 1776 | intel_wait_for_vblank(dev, intel_crtc->pipe); |
1774 | } | 1777 | } |
1775 | 1778 | ||
@@ -1861,7 +1864,6 @@ static void ironlake_enable_fbc(struct drm_crtc *crtc, unsigned long interval) | |||
1861 | return; | 1864 | return; |
1862 | 1865 | ||
1863 | I915_WRITE(ILK_DPFC_CONTROL, dpfc_ctl & ~DPFC_CTL_EN); | 1866 | I915_WRITE(ILK_DPFC_CONTROL, dpfc_ctl & ~DPFC_CTL_EN); |
1864 | POSTING_READ(ILK_DPFC_CONTROL); | ||
1865 | intel_wait_for_vblank(dev, intel_crtc->pipe); | 1867 | intel_wait_for_vblank(dev, intel_crtc->pipe); |
1866 | } | 1868 | } |
1867 | 1869 | ||
@@ -3769,8 +3771,11 @@ static bool g4x_compute_wm0(struct drm_device *dev, | |||
3769 | int entries, tlb_miss; | 3771 | int entries, tlb_miss; |
3770 | 3772 | ||
3771 | crtc = intel_get_crtc_for_plane(dev, plane); | 3773 | crtc = intel_get_crtc_for_plane(dev, plane); |
3772 | if (crtc->fb == NULL || !crtc->enabled) | 3774 | if (crtc->fb == NULL || !crtc->enabled) { |
3775 | *cursor_wm = cursor->guard_size; | ||
3776 | *plane_wm = display->guard_size; | ||
3773 | return false; | 3777 | return false; |
3778 | } | ||
3774 | 3779 | ||
3775 | htotal = crtc->mode.htotal; | 3780 | htotal = crtc->mode.htotal; |
3776 | hdisplay = crtc->mode.hdisplay; | 3781 | hdisplay = crtc->mode.hdisplay; |
@@ -3883,10 +3888,7 @@ static bool g4x_compute_srwm(struct drm_device *dev, | |||
3883 | display, cursor); | 3888 | display, cursor); |
3884 | } | 3889 | } |
3885 | 3890 | ||
3886 | static inline bool single_plane_enabled(unsigned int mask) | 3891 | #define single_plane_enabled(mask) is_power_of_2(mask) |
3887 | { | ||
3888 | return mask && (mask & -mask) == 0; | ||
3889 | } | ||
3890 | 3892 | ||
3891 | static void g4x_update_wm(struct drm_device *dev) | 3893 | static void g4x_update_wm(struct drm_device *dev) |
3892 | { | 3894 | { |
@@ -5777,7 +5779,6 @@ static void intel_increase_pllclock(struct drm_crtc *crtc) | |||
5777 | 5779 | ||
5778 | dpll &= ~DISPLAY_RATE_SELECT_FPA1; | 5780 | dpll &= ~DISPLAY_RATE_SELECT_FPA1; |
5779 | I915_WRITE(dpll_reg, dpll); | 5781 | I915_WRITE(dpll_reg, dpll); |
5780 | POSTING_READ(dpll_reg); | ||
5781 | intel_wait_for_vblank(dev, pipe); | 5782 | intel_wait_for_vblank(dev, pipe); |
5782 | 5783 | ||
5783 | dpll = I915_READ(dpll_reg); | 5784 | dpll = I915_READ(dpll_reg); |
@@ -5821,7 +5822,6 @@ static void intel_decrease_pllclock(struct drm_crtc *crtc) | |||
5821 | 5822 | ||
5822 | dpll |= DISPLAY_RATE_SELECT_FPA1; | 5823 | dpll |= DISPLAY_RATE_SELECT_FPA1; |
5823 | I915_WRITE(dpll_reg, dpll); | 5824 | I915_WRITE(dpll_reg, dpll); |
5824 | dpll = I915_READ(dpll_reg); | ||
5825 | intel_wait_for_vblank(dev, pipe); | 5825 | intel_wait_for_vblank(dev, pipe); |
5826 | dpll = I915_READ(dpll_reg); | 5826 | dpll = I915_READ(dpll_reg); |
5827 | if (!(dpll & DISPLAY_RATE_SELECT_FPA1)) | 5827 | if (!(dpll & DISPLAY_RATE_SELECT_FPA1)) |
@@ -6218,36 +6218,6 @@ cleanup_work: | |||
6218 | return ret; | 6218 | return ret; |
6219 | } | 6219 | } |
6220 | 6220 | ||
6221 | static void intel_crtc_reset(struct drm_crtc *crtc) | ||
6222 | { | ||
6223 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); | ||
6224 | |||
6225 | /* Reset flags back to the 'unknown' status so that they | ||
6226 | * will be correctly set on the initial modeset. | ||
6227 | */ | ||
6228 | intel_crtc->dpms_mode = -1; | ||
6229 | } | ||
6230 | |||
6231 | static struct drm_crtc_helper_funcs intel_helper_funcs = { | ||
6232 | .dpms = intel_crtc_dpms, | ||
6233 | .mode_fixup = intel_crtc_mode_fixup, | ||
6234 | .mode_set = intel_crtc_mode_set, | ||
6235 | .mode_set_base = intel_pipe_set_base, | ||
6236 | .mode_set_base_atomic = intel_pipe_set_base_atomic, | ||
6237 | .load_lut = intel_crtc_load_lut, | ||
6238 | .disable = intel_crtc_disable, | ||
6239 | }; | ||
6240 | |||
6241 | static const struct drm_crtc_funcs intel_crtc_funcs = { | ||
6242 | .reset = intel_crtc_reset, | ||
6243 | .cursor_set = intel_crtc_cursor_set, | ||
6244 | .cursor_move = intel_crtc_cursor_move, | ||
6245 | .gamma_set = intel_crtc_gamma_set, | ||
6246 | .set_config = drm_crtc_helper_set_config, | ||
6247 | .destroy = intel_crtc_destroy, | ||
6248 | .page_flip = intel_crtc_page_flip, | ||
6249 | }; | ||
6250 | |||
6251 | static void intel_sanitize_modesetting(struct drm_device *dev, | 6221 | static void intel_sanitize_modesetting(struct drm_device *dev, |
6252 | int pipe, int plane) | 6222 | int pipe, int plane) |
6253 | { | 6223 | { |
@@ -6284,6 +6254,42 @@ static void intel_sanitize_modesetting(struct drm_device *dev, | |||
6284 | intel_disable_pipe(dev_priv, pipe); | 6254 | intel_disable_pipe(dev_priv, pipe); |
6285 | } | 6255 | } |
6286 | 6256 | ||
6257 | static void intel_crtc_reset(struct drm_crtc *crtc) | ||
6258 | { | ||
6259 | struct drm_device *dev = crtc->dev; | ||
6260 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); | ||
6261 | |||
6262 | /* Reset flags back to the 'unknown' status so that they | ||
6263 | * will be correctly set on the initial modeset. | ||
6264 | */ | ||
6265 | intel_crtc->dpms_mode = -1; | ||
6266 | |||
6267 | /* We need to fix up any BIOS configuration that conflicts with | ||
6268 | * our expectations. | ||
6269 | */ | ||
6270 | intel_sanitize_modesetting(dev, intel_crtc->pipe, intel_crtc->plane); | ||
6271 | } | ||
6272 | |||
6273 | static struct drm_crtc_helper_funcs intel_helper_funcs = { | ||
6274 | .dpms = intel_crtc_dpms, | ||
6275 | .mode_fixup = intel_crtc_mode_fixup, | ||
6276 | .mode_set = intel_crtc_mode_set, | ||
6277 | .mode_set_base = intel_pipe_set_base, | ||
6278 | .mode_set_base_atomic = intel_pipe_set_base_atomic, | ||
6279 | .load_lut = intel_crtc_load_lut, | ||
6280 | .disable = intel_crtc_disable, | ||
6281 | }; | ||
6282 | |||
6283 | static const struct drm_crtc_funcs intel_crtc_funcs = { | ||
6284 | .reset = intel_crtc_reset, | ||
6285 | .cursor_set = intel_crtc_cursor_set, | ||
6286 | .cursor_move = intel_crtc_cursor_move, | ||
6287 | .gamma_set = intel_crtc_gamma_set, | ||
6288 | .set_config = drm_crtc_helper_set_config, | ||
6289 | .destroy = intel_crtc_destroy, | ||
6290 | .page_flip = intel_crtc_page_flip, | ||
6291 | }; | ||
6292 | |||
6287 | static void intel_crtc_init(struct drm_device *dev, int pipe) | 6293 | static void intel_crtc_init(struct drm_device *dev, int pipe) |
6288 | { | 6294 | { |
6289 | drm_i915_private_t *dev_priv = dev->dev_private; | 6295 | drm_i915_private_t *dev_priv = dev->dev_private; |
@@ -6333,8 +6339,6 @@ static void intel_crtc_init(struct drm_device *dev, int pipe) | |||
6333 | 6339 | ||
6334 | setup_timer(&intel_crtc->idle_timer, intel_crtc_idle_timer, | 6340 | setup_timer(&intel_crtc->idle_timer, intel_crtc_idle_timer, |
6335 | (unsigned long)intel_crtc); | 6341 | (unsigned long)intel_crtc); |
6336 | |||
6337 | intel_sanitize_modesetting(dev, intel_crtc->pipe, intel_crtc->plane); | ||
6338 | } | 6342 | } |
6339 | 6343 | ||
6340 | int intel_get_pipe_from_crtc_id(struct drm_device *dev, void *data, | 6344 | int intel_get_pipe_from_crtc_id(struct drm_device *dev, void *data, |
@@ -6933,7 +6937,7 @@ void gen6_enable_rps(struct drm_i915_private *dev_priv) | |||
6933 | DRM_ERROR("timeout waiting for pcode mailbox to finish\n"); | 6937 | DRM_ERROR("timeout waiting for pcode mailbox to finish\n"); |
6934 | if (pcu_mbox & (1<<31)) { /* OC supported */ | 6938 | if (pcu_mbox & (1<<31)) { /* OC supported */ |
6935 | max_freq = pcu_mbox & 0xff; | 6939 | max_freq = pcu_mbox & 0xff; |
6936 | DRM_DEBUG_DRIVER("overclocking supported, adjusting frequency max to %dMHz\n", pcu_mbox * 100); | 6940 | DRM_DEBUG_DRIVER("overclocking supported, adjusting frequency max to %dMHz\n", pcu_mbox * 50); |
6937 | } | 6941 | } |
6938 | 6942 | ||
6939 | /* In units of 100MHz */ | 6943 | /* In units of 100MHz */ |
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index d29e33f815d7..cb8578b7e443 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c | |||
@@ -213,7 +213,7 @@ intel_dp_mode_valid(struct drm_connector *connector, | |||
213 | return MODE_PANEL; | 213 | return MODE_PANEL; |
214 | } | 214 | } |
215 | 215 | ||
216 | /* only refuse the mode on non eDP since we have seen some wierd eDP panels | 216 | /* only refuse the mode on non eDP since we have seen some weird eDP panels |
217 | which are outside spec tolerances but somehow work by magic */ | 217 | which are outside spec tolerances but somehow work by magic */ |
218 | if (!is_edp(intel_dp) && | 218 | if (!is_edp(intel_dp) && |
219 | (intel_dp_link_required(connector->dev, intel_dp, mode->clock) | 219 | (intel_dp_link_required(connector->dev, intel_dp, mode->clock) |
@@ -1957,9 +1957,9 @@ intel_dp_init(struct drm_device *dev, int output_reg) | |||
1957 | DP_NO_AUX_HANDSHAKE_LINK_TRAINING; | 1957 | DP_NO_AUX_HANDSHAKE_LINK_TRAINING; |
1958 | } else { | 1958 | } else { |
1959 | /* if this fails, presume the device is a ghost */ | 1959 | /* if this fails, presume the device is a ghost */ |
1960 | DRM_ERROR("failed to retrieve link info\n"); | 1960 | DRM_INFO("failed to retrieve link info, disabling eDP\n"); |
1961 | intel_dp_destroy(&intel_connector->base); | ||
1962 | intel_dp_encoder_destroy(&intel_dp->base.base); | 1961 | intel_dp_encoder_destroy(&intel_dp->base.base); |
1962 | intel_dp_destroy(&intel_connector->base); | ||
1963 | return; | 1963 | return; |
1964 | } | 1964 | } |
1965 | } | 1965 | } |
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h index 5daa991cb287..f5b0d8306d83 100644 --- a/drivers/gpu/drm/i915/intel_drv.h +++ b/drivers/gpu/drm/i915/intel_drv.h | |||
@@ -39,7 +39,7 @@ | |||
39 | ret__ = -ETIMEDOUT; \ | 39 | ret__ = -ETIMEDOUT; \ |
40 | break; \ | 40 | break; \ |
41 | } \ | 41 | } \ |
42 | if (W && !in_dbg_master()) msleep(W); \ | 42 | if (W && !(in_atomic() || in_dbg_master())) msleep(W); \ |
43 | } \ | 43 | } \ |
44 | ret__; \ | 44 | ret__; \ |
45 | }) | 45 | }) |
diff --git a/drivers/gpu/drm/i915/intel_i2c.c b/drivers/gpu/drm/i915/intel_i2c.c index 82d04c5899d2..d3b903bce7c5 100644 --- a/drivers/gpu/drm/i915/intel_i2c.c +++ b/drivers/gpu/drm/i915/intel_i2c.c | |||
@@ -259,7 +259,7 @@ gmbus_xfer(struct i2c_adapter *adapter, | |||
259 | if (wait_for(I915_READ(GMBUS2 + reg_offset) & (GMBUS_SATOER | GMBUS_HW_RDY), 50)) | 259 | if (wait_for(I915_READ(GMBUS2 + reg_offset) & (GMBUS_SATOER | GMBUS_HW_RDY), 50)) |
260 | goto timeout; | 260 | goto timeout; |
261 | if (I915_READ(GMBUS2 + reg_offset) & GMBUS_SATOER) | 261 | if (I915_READ(GMBUS2 + reg_offset) & GMBUS_SATOER) |
262 | return 0; | 262 | goto clear_err; |
263 | 263 | ||
264 | val = I915_READ(GMBUS3 + reg_offset); | 264 | val = I915_READ(GMBUS3 + reg_offset); |
265 | do { | 265 | do { |
@@ -287,7 +287,7 @@ gmbus_xfer(struct i2c_adapter *adapter, | |||
287 | if (wait_for(I915_READ(GMBUS2 + reg_offset) & (GMBUS_SATOER | GMBUS_HW_RDY), 50)) | 287 | if (wait_for(I915_READ(GMBUS2 + reg_offset) & (GMBUS_SATOER | GMBUS_HW_RDY), 50)) |
288 | goto timeout; | 288 | goto timeout; |
289 | if (I915_READ(GMBUS2 + reg_offset) & GMBUS_SATOER) | 289 | if (I915_READ(GMBUS2 + reg_offset) & GMBUS_SATOER) |
290 | return 0; | 290 | goto clear_err; |
291 | 291 | ||
292 | val = loop = 0; | 292 | val = loop = 0; |
293 | do { | 293 | do { |
@@ -302,14 +302,31 @@ gmbus_xfer(struct i2c_adapter *adapter, | |||
302 | if (i + 1 < num && wait_for(I915_READ(GMBUS2 + reg_offset) & (GMBUS_SATOER | GMBUS_HW_WAIT_PHASE), 50)) | 302 | if (i + 1 < num && wait_for(I915_READ(GMBUS2 + reg_offset) & (GMBUS_SATOER | GMBUS_HW_WAIT_PHASE), 50)) |
303 | goto timeout; | 303 | goto timeout; |
304 | if (I915_READ(GMBUS2 + reg_offset) & GMBUS_SATOER) | 304 | if (I915_READ(GMBUS2 + reg_offset) & GMBUS_SATOER) |
305 | return 0; | 305 | goto clear_err; |
306 | } | 306 | } |
307 | 307 | ||
308 | return num; | 308 | goto done; |
309 | |||
310 | clear_err: | ||
311 | /* Toggle the Software Clear Interrupt bit. This has the effect | ||
312 | * of resetting the GMBUS controller and so clearing the | ||
313 | * BUS_ERROR raised by the slave's NAK. | ||
314 | */ | ||
315 | I915_WRITE(GMBUS1 + reg_offset, GMBUS_SW_CLR_INT); | ||
316 | I915_WRITE(GMBUS1 + reg_offset, 0); | ||
317 | |||
318 | done: | ||
319 | /* Mark the GMBUS interface as disabled. We will re-enable it at the | ||
320 | * start of the next xfer, till then let it sleep. | ||
321 | */ | ||
322 | I915_WRITE(GMBUS0 + reg_offset, 0); | ||
323 | return i; | ||
309 | 324 | ||
310 | timeout: | 325 | timeout: |
311 | DRM_INFO("GMBUS timed out, falling back to bit banging on pin %d [%s]\n", | 326 | DRM_INFO("GMBUS timed out, falling back to bit banging on pin %d [%s]\n", |
312 | bus->reg0 & 0xff, bus->adapter.name); | 327 | bus->reg0 & 0xff, bus->adapter.name); |
328 | I915_WRITE(GMBUS0 + reg_offset, 0); | ||
329 | |||
313 | /* Hardware may not support GMBUS over these pins? Try GPIO bitbanging instead. */ | 330 | /* Hardware may not support GMBUS over these pins? Try GPIO bitbanging instead. */ |
314 | bus->force_bit = intel_gpio_create(dev_priv, bus->reg0 & 0xff); | 331 | bus->force_bit = intel_gpio_create(dev_priv, bus->reg0 & 0xff); |
315 | if (!bus->force_bit) | 332 | if (!bus->force_bit) |
diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c index 1a311ad01116..a562bd2648c7 100644 --- a/drivers/gpu/drm/i915/intel_lvds.c +++ b/drivers/gpu/drm/i915/intel_lvds.c | |||
@@ -473,19 +473,13 @@ static enum drm_connector_status | |||
473 | intel_lvds_detect(struct drm_connector *connector, bool force) | 473 | intel_lvds_detect(struct drm_connector *connector, bool force) |
474 | { | 474 | { |
475 | struct drm_device *dev = connector->dev; | 475 | struct drm_device *dev = connector->dev; |
476 | enum drm_connector_status status = connector_status_connected; | 476 | enum drm_connector_status status; |
477 | 477 | ||
478 | status = intel_panel_detect(dev); | 478 | status = intel_panel_detect(dev); |
479 | if (status != connector_status_unknown) | 479 | if (status != connector_status_unknown) |
480 | return status; | 480 | return status; |
481 | 481 | ||
482 | /* ACPI lid methods were generally unreliable in this generation, so | 482 | return connector_status_connected; |
483 | * don't even bother. | ||
484 | */ | ||
485 | if (IS_GEN2(dev) || IS_GEN3(dev)) | ||
486 | return connector_status_connected; | ||
487 | |||
488 | return status; | ||
489 | } | 483 | } |
490 | 484 | ||
491 | /** | 485 | /** |
@@ -835,25 +829,6 @@ static bool lvds_is_present_in_vbt(struct drm_device *dev, | |||
835 | return false; | 829 | return false; |
836 | } | 830 | } |
837 | 831 | ||
838 | static bool intel_lvds_ddc_probe(struct drm_device *dev, u8 pin) | ||
839 | { | ||
840 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
841 | u8 buf = 0; | ||
842 | struct i2c_msg msgs[] = { | ||
843 | { | ||
844 | .addr = 0xA0, | ||
845 | .flags = 0, | ||
846 | .len = 1, | ||
847 | .buf = &buf, | ||
848 | }, | ||
849 | }; | ||
850 | struct i2c_adapter *i2c = &dev_priv->gmbus[pin].adapter; | ||
851 | /* XXX this only appears to work when using GMBUS */ | ||
852 | if (intel_gmbus_is_forced_bit(i2c)) | ||
853 | return true; | ||
854 | return i2c_transfer(i2c, msgs, 1) == 1; | ||
855 | } | ||
856 | |||
857 | /** | 832 | /** |
858 | * intel_lvds_init - setup LVDS connectors on this device | 833 | * intel_lvds_init - setup LVDS connectors on this device |
859 | * @dev: drm device | 834 | * @dev: drm device |
@@ -894,11 +869,6 @@ bool intel_lvds_init(struct drm_device *dev) | |||
894 | } | 869 | } |
895 | } | 870 | } |
896 | 871 | ||
897 | if (!intel_lvds_ddc_probe(dev, pin)) { | ||
898 | DRM_DEBUG_KMS("LVDS did not respond to DDC probe\n"); | ||
899 | return false; | ||
900 | } | ||
901 | |||
902 | intel_lvds = kzalloc(sizeof(struct intel_lvds), GFP_KERNEL); | 872 | intel_lvds = kzalloc(sizeof(struct intel_lvds), GFP_KERNEL); |
903 | if (!intel_lvds) { | 873 | if (!intel_lvds) { |
904 | return false; | 874 | return false; |
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c index 789c47801ba8..e9e6f71418a4 100644 --- a/drivers/gpu/drm/i915/intel_ringbuffer.c +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c | |||
@@ -65,62 +65,60 @@ render_ring_flush(struct intel_ring_buffer *ring, | |||
65 | u32 cmd; | 65 | u32 cmd; |
66 | int ret; | 66 | int ret; |
67 | 67 | ||
68 | if ((invalidate_domains | flush_domains) & I915_GEM_GPU_DOMAINS) { | 68 | /* |
69 | * read/write caches: | ||
70 | * | ||
71 | * I915_GEM_DOMAIN_RENDER is always invalidated, but is | ||
72 | * only flushed if MI_NO_WRITE_FLUSH is unset. On 965, it is | ||
73 | * also flushed at 2d versus 3d pipeline switches. | ||
74 | * | ||
75 | * read-only caches: | ||
76 | * | ||
77 | * I915_GEM_DOMAIN_SAMPLER is flushed on pre-965 if | ||
78 | * MI_READ_FLUSH is set, and is always flushed on 965. | ||
79 | * | ||
80 | * I915_GEM_DOMAIN_COMMAND may not exist? | ||
81 | * | ||
82 | * I915_GEM_DOMAIN_INSTRUCTION, which exists on 965, is | ||
83 | * invalidated when MI_EXE_FLUSH is set. | ||
84 | * | ||
85 | * I915_GEM_DOMAIN_VERTEX, which exists on 965, is | ||
86 | * invalidated with every MI_FLUSH. | ||
87 | * | ||
88 | * TLBs: | ||
89 | * | ||
90 | * On 965, TLBs associated with I915_GEM_DOMAIN_COMMAND | ||
91 | * and I915_GEM_DOMAIN_CPU in are invalidated at PTE write and | ||
92 | * I915_GEM_DOMAIN_RENDER and I915_GEM_DOMAIN_SAMPLER | ||
93 | * are flushed at any MI_FLUSH. | ||
94 | */ | ||
95 | |||
96 | cmd = MI_FLUSH | MI_NO_WRITE_FLUSH; | ||
97 | if ((invalidate_domains|flush_domains) & | ||
98 | I915_GEM_DOMAIN_RENDER) | ||
99 | cmd &= ~MI_NO_WRITE_FLUSH; | ||
100 | if (INTEL_INFO(dev)->gen < 4) { | ||
69 | /* | 101 | /* |
70 | * read/write caches: | 102 | * On the 965, the sampler cache always gets flushed |
71 | * | 103 | * and this bit is reserved. |
72 | * I915_GEM_DOMAIN_RENDER is always invalidated, but is | ||
73 | * only flushed if MI_NO_WRITE_FLUSH is unset. On 965, it is | ||
74 | * also flushed at 2d versus 3d pipeline switches. | ||
75 | * | ||
76 | * read-only caches: | ||
77 | * | ||
78 | * I915_GEM_DOMAIN_SAMPLER is flushed on pre-965 if | ||
79 | * MI_READ_FLUSH is set, and is always flushed on 965. | ||
80 | * | ||
81 | * I915_GEM_DOMAIN_COMMAND may not exist? | ||
82 | * | ||
83 | * I915_GEM_DOMAIN_INSTRUCTION, which exists on 965, is | ||
84 | * invalidated when MI_EXE_FLUSH is set. | ||
85 | * | ||
86 | * I915_GEM_DOMAIN_VERTEX, which exists on 965, is | ||
87 | * invalidated with every MI_FLUSH. | ||
88 | * | ||
89 | * TLBs: | ||
90 | * | ||
91 | * On 965, TLBs associated with I915_GEM_DOMAIN_COMMAND | ||
92 | * and I915_GEM_DOMAIN_CPU in are invalidated at PTE write and | ||
93 | * I915_GEM_DOMAIN_RENDER and I915_GEM_DOMAIN_SAMPLER | ||
94 | * are flushed at any MI_FLUSH. | ||
95 | */ | 104 | */ |
105 | if (invalidate_domains & I915_GEM_DOMAIN_SAMPLER) | ||
106 | cmd |= MI_READ_FLUSH; | ||
107 | } | ||
108 | if (invalidate_domains & I915_GEM_DOMAIN_INSTRUCTION) | ||
109 | cmd |= MI_EXE_FLUSH; | ||
96 | 110 | ||
97 | cmd = MI_FLUSH | MI_NO_WRITE_FLUSH; | 111 | if (invalidate_domains & I915_GEM_DOMAIN_COMMAND && |
98 | if ((invalidate_domains|flush_domains) & | 112 | (IS_G4X(dev) || IS_GEN5(dev))) |
99 | I915_GEM_DOMAIN_RENDER) | 113 | cmd |= MI_INVALIDATE_ISP; |
100 | cmd &= ~MI_NO_WRITE_FLUSH; | ||
101 | if (INTEL_INFO(dev)->gen < 4) { | ||
102 | /* | ||
103 | * On the 965, the sampler cache always gets flushed | ||
104 | * and this bit is reserved. | ||
105 | */ | ||
106 | if (invalidate_domains & I915_GEM_DOMAIN_SAMPLER) | ||
107 | cmd |= MI_READ_FLUSH; | ||
108 | } | ||
109 | if (invalidate_domains & I915_GEM_DOMAIN_INSTRUCTION) | ||
110 | cmd |= MI_EXE_FLUSH; | ||
111 | |||
112 | if (invalidate_domains & I915_GEM_DOMAIN_COMMAND && | ||
113 | (IS_G4X(dev) || IS_GEN5(dev))) | ||
114 | cmd |= MI_INVALIDATE_ISP; | ||
115 | 114 | ||
116 | ret = intel_ring_begin(ring, 2); | 115 | ret = intel_ring_begin(ring, 2); |
117 | if (ret) | 116 | if (ret) |
118 | return ret; | 117 | return ret; |
119 | 118 | ||
120 | intel_ring_emit(ring, cmd); | 119 | intel_ring_emit(ring, cmd); |
121 | intel_ring_emit(ring, MI_NOOP); | 120 | intel_ring_emit(ring, MI_NOOP); |
122 | intel_ring_advance(ring); | 121 | intel_ring_advance(ring); |
123 | } | ||
124 | 122 | ||
125 | return 0; | 123 | return 0; |
126 | } | 124 | } |
@@ -568,9 +566,6 @@ bsd_ring_flush(struct intel_ring_buffer *ring, | |||
568 | { | 566 | { |
569 | int ret; | 567 | int ret; |
570 | 568 | ||
571 | if ((flush_domains & I915_GEM_DOMAIN_RENDER) == 0) | ||
572 | return 0; | ||
573 | |||
574 | ret = intel_ring_begin(ring, 2); | 569 | ret = intel_ring_begin(ring, 2); |
575 | if (ret) | 570 | if (ret) |
576 | return ret; | 571 | return ret; |
@@ -1056,9 +1051,6 @@ static int gen6_ring_flush(struct intel_ring_buffer *ring, | |||
1056 | uint32_t cmd; | 1051 | uint32_t cmd; |
1057 | int ret; | 1052 | int ret; |
1058 | 1053 | ||
1059 | if (((invalidate | flush) & I915_GEM_GPU_DOMAINS) == 0) | ||
1060 | return 0; | ||
1061 | |||
1062 | ret = intel_ring_begin(ring, 4); | 1054 | ret = intel_ring_begin(ring, 4); |
1063 | if (ret) | 1055 | if (ret) |
1064 | return ret; | 1056 | return ret; |
@@ -1230,9 +1222,6 @@ static int blt_ring_flush(struct intel_ring_buffer *ring, | |||
1230 | uint32_t cmd; | 1222 | uint32_t cmd; |
1231 | int ret; | 1223 | int ret; |
1232 | 1224 | ||
1233 | if (((invalidate | flush) & I915_GEM_DOMAIN_RENDER) == 0) | ||
1234 | return 0; | ||
1235 | |||
1236 | ret = blt_ring_begin(ring, 4); | 1225 | ret = blt_ring_begin(ring, 4); |
1237 | if (ret) | 1226 | if (ret) |
1238 | return ret; | 1227 | return ret; |
diff --git a/drivers/gpu/drm/i915/intel_sdvo_regs.h b/drivers/gpu/drm/i915/intel_sdvo_regs.h index a386b022e538..4f4e23bc2d16 100644 --- a/drivers/gpu/drm/i915/intel_sdvo_regs.h +++ b/drivers/gpu/drm/i915/intel_sdvo_regs.h | |||
@@ -230,7 +230,7 @@ struct intel_sdvo_set_target_input_args { | |||
230 | } __attribute__((packed)); | 230 | } __attribute__((packed)); |
231 | 231 | ||
232 | /** | 232 | /** |
233 | * Takes a struct intel_sdvo_output_flags of which outputs are targetted by | 233 | * Takes a struct intel_sdvo_output_flags of which outputs are targeted by |
234 | * future output commands. | 234 | * future output commands. |
235 | * | 235 | * |
236 | * Affected commands inclue SET_OUTPUT_TIMINGS_PART[12], | 236 | * Affected commands inclue SET_OUTPUT_TIMINGS_PART[12], |
diff --git a/drivers/gpu/drm/i915/intel_tv.c b/drivers/gpu/drm/i915/intel_tv.c index 4256b8ef3947..6b22c1dcc015 100644 --- a/drivers/gpu/drm/i915/intel_tv.c +++ b/drivers/gpu/drm/i915/intel_tv.c | |||
@@ -1151,10 +1151,10 @@ intel_tv_mode_set(struct drm_encoder *encoder, struct drm_display_mode *mode, | |||
1151 | (video_levels->blank << TV_BLANK_LEVEL_SHIFT))); | 1151 | (video_levels->blank << TV_BLANK_LEVEL_SHIFT))); |
1152 | { | 1152 | { |
1153 | int pipeconf_reg = PIPECONF(pipe); | 1153 | int pipeconf_reg = PIPECONF(pipe); |
1154 | int dspcntr_reg = DSPCNTR(pipe); | 1154 | int dspcntr_reg = DSPCNTR(intel_crtc->plane); |
1155 | int pipeconf = I915_READ(pipeconf_reg); | 1155 | int pipeconf = I915_READ(pipeconf_reg); |
1156 | int dspcntr = I915_READ(dspcntr_reg); | 1156 | int dspcntr = I915_READ(dspcntr_reg); |
1157 | int dspbase_reg = DSPADDR(pipe); | 1157 | int dspbase_reg = DSPADDR(intel_crtc->plane); |
1158 | int xpos = 0x0, ypos = 0x0; | 1158 | int xpos = 0x0, ypos = 0x0; |
1159 | unsigned int xsize, ysize; | 1159 | unsigned int xsize, ysize; |
1160 | /* Pipe must be off here */ | 1160 | /* Pipe must be off here */ |
@@ -1378,7 +1378,9 @@ intel_tv_detect(struct drm_connector *connector, bool force) | |||
1378 | if (type < 0) | 1378 | if (type < 0) |
1379 | return connector_status_disconnected; | 1379 | return connector_status_disconnected; |
1380 | 1380 | ||
1381 | intel_tv->type = type; | ||
1381 | intel_tv_find_better_format(connector); | 1382 | intel_tv_find_better_format(connector); |
1383 | |||
1382 | return connector_status_connected; | 1384 | return connector_status_connected; |
1383 | } | 1385 | } |
1384 | 1386 | ||
@@ -1670,8 +1672,7 @@ intel_tv_init(struct drm_device *dev) | |||
1670 | * | 1672 | * |
1671 | * More recent chipsets favour HDMI rather than integrated S-Video. | 1673 | * More recent chipsets favour HDMI rather than integrated S-Video. |
1672 | */ | 1674 | */ |
1673 | connector->polled = | 1675 | connector->polled = DRM_CONNECTOR_POLL_CONNECT; |
1674 | DRM_CONNECTOR_POLL_CONNECT | DRM_CONNECTOR_POLL_DISCONNECT; | ||
1675 | 1676 | ||
1676 | drm_connector_init(dev, connector, &intel_tv_connector_funcs, | 1677 | drm_connector_init(dev, connector, &intel_tv_connector_funcs, |
1677 | DRM_MODE_CONNECTOR_SVIDEO); | 1678 | DRM_MODE_CONNECTOR_SVIDEO); |
diff --git a/drivers/gpu/drm/mga/mga_dma.c b/drivers/gpu/drm/mga/mga_dma.c index 1e1eb1d7e971..5ccb65deb83c 100644 --- a/drivers/gpu/drm/mga/mga_dma.c +++ b/drivers/gpu/drm/mga/mga_dma.c | |||
@@ -426,7 +426,7 @@ int mga_driver_load(struct drm_device *dev, unsigned long flags) | |||
426 | * Bootstrap the driver for AGP DMA. | 426 | * Bootstrap the driver for AGP DMA. |
427 | * | 427 | * |
428 | * \todo | 428 | * \todo |
429 | * Investigate whether there is any benifit to storing the WARP microcode in | 429 | * Investigate whether there is any benefit to storing the WARP microcode in |
430 | * AGP memory. If not, the microcode may as well always be put in PCI | 430 | * AGP memory. If not, the microcode may as well always be put in PCI |
431 | * memory. | 431 | * memory. |
432 | * | 432 | * |
diff --git a/drivers/gpu/drm/nouveau/nouveau_backlight.c b/drivers/gpu/drm/nouveau/nouveau_backlight.c index d3a9c6e02477..00a55dfdba82 100644 --- a/drivers/gpu/drm/nouveau/nouveau_backlight.c +++ b/drivers/gpu/drm/nouveau/nouveau_backlight.c | |||
@@ -88,18 +88,20 @@ static const struct backlight_ops nv50_bl_ops = { | |||
88 | .update_status = nv50_set_intensity, | 88 | .update_status = nv50_set_intensity, |
89 | }; | 89 | }; |
90 | 90 | ||
91 | static int nouveau_nv40_backlight_init(struct drm_device *dev) | 91 | static int nouveau_nv40_backlight_init(struct drm_connector *connector) |
92 | { | 92 | { |
93 | struct backlight_properties props; | 93 | struct drm_device *dev = connector->dev; |
94 | struct drm_nouveau_private *dev_priv = dev->dev_private; | 94 | struct drm_nouveau_private *dev_priv = dev->dev_private; |
95 | struct backlight_properties props; | ||
95 | struct backlight_device *bd; | 96 | struct backlight_device *bd; |
96 | 97 | ||
97 | if (!(nv_rd32(dev, NV40_PMC_BACKLIGHT) & NV40_PMC_BACKLIGHT_MASK)) | 98 | if (!(nv_rd32(dev, NV40_PMC_BACKLIGHT) & NV40_PMC_BACKLIGHT_MASK)) |
98 | return 0; | 99 | return 0; |
99 | 100 | ||
100 | memset(&props, 0, sizeof(struct backlight_properties)); | 101 | memset(&props, 0, sizeof(struct backlight_properties)); |
102 | props.type = BACKLIGHT_RAW; | ||
101 | props.max_brightness = 31; | 103 | props.max_brightness = 31; |
102 | bd = backlight_device_register("nv_backlight", &dev->pdev->dev, dev, | 104 | bd = backlight_device_register("nv_backlight", &connector->kdev, dev, |
103 | &nv40_bl_ops, &props); | 105 | &nv40_bl_ops, &props); |
104 | if (IS_ERR(bd)) | 106 | if (IS_ERR(bd)) |
105 | return PTR_ERR(bd); | 107 | return PTR_ERR(bd); |
@@ -111,18 +113,20 @@ static int nouveau_nv40_backlight_init(struct drm_device *dev) | |||
111 | return 0; | 113 | return 0; |
112 | } | 114 | } |
113 | 115 | ||
114 | static int nouveau_nv50_backlight_init(struct drm_device *dev) | 116 | static int nouveau_nv50_backlight_init(struct drm_connector *connector) |
115 | { | 117 | { |
116 | struct backlight_properties props; | 118 | struct drm_device *dev = connector->dev; |
117 | struct drm_nouveau_private *dev_priv = dev->dev_private; | 119 | struct drm_nouveau_private *dev_priv = dev->dev_private; |
120 | struct backlight_properties props; | ||
118 | struct backlight_device *bd; | 121 | struct backlight_device *bd; |
119 | 122 | ||
120 | if (!nv_rd32(dev, NV50_PDISPLAY_SOR_BACKLIGHT)) | 123 | if (!nv_rd32(dev, NV50_PDISPLAY_SOR_BACKLIGHT)) |
121 | return 0; | 124 | return 0; |
122 | 125 | ||
123 | memset(&props, 0, sizeof(struct backlight_properties)); | 126 | memset(&props, 0, sizeof(struct backlight_properties)); |
127 | props.type = BACKLIGHT_RAW; | ||
124 | props.max_brightness = 1025; | 128 | props.max_brightness = 1025; |
125 | bd = backlight_device_register("nv_backlight", &dev->pdev->dev, dev, | 129 | bd = backlight_device_register("nv_backlight", &connector->kdev, dev, |
126 | &nv50_bl_ops, &props); | 130 | &nv50_bl_ops, &props); |
127 | if (IS_ERR(bd)) | 131 | if (IS_ERR(bd)) |
128 | return PTR_ERR(bd); | 132 | return PTR_ERR(bd); |
@@ -133,8 +137,9 @@ static int nouveau_nv50_backlight_init(struct drm_device *dev) | |||
133 | return 0; | 137 | return 0; |
134 | } | 138 | } |
135 | 139 | ||
136 | int nouveau_backlight_init(struct drm_device *dev) | 140 | int nouveau_backlight_init(struct drm_connector *connector) |
137 | { | 141 | { |
142 | struct drm_device *dev = connector->dev; | ||
138 | struct drm_nouveau_private *dev_priv = dev->dev_private; | 143 | struct drm_nouveau_private *dev_priv = dev->dev_private; |
139 | 144 | ||
140 | #ifdef CONFIG_ACPI | 145 | #ifdef CONFIG_ACPI |
@@ -147,9 +152,9 @@ int nouveau_backlight_init(struct drm_device *dev) | |||
147 | 152 | ||
148 | switch (dev_priv->card_type) { | 153 | switch (dev_priv->card_type) { |
149 | case NV_40: | 154 | case NV_40: |
150 | return nouveau_nv40_backlight_init(dev); | 155 | return nouveau_nv40_backlight_init(connector); |
151 | case NV_50: | 156 | case NV_50: |
152 | return nouveau_nv50_backlight_init(dev); | 157 | return nouveau_nv50_backlight_init(connector); |
153 | default: | 158 | default: |
154 | break; | 159 | break; |
155 | } | 160 | } |
@@ -157,8 +162,9 @@ int nouveau_backlight_init(struct drm_device *dev) | |||
157 | return 0; | 162 | return 0; |
158 | } | 163 | } |
159 | 164 | ||
160 | void nouveau_backlight_exit(struct drm_device *dev) | 165 | void nouveau_backlight_exit(struct drm_connector *connector) |
161 | { | 166 | { |
167 | struct drm_device *dev = connector->dev; | ||
162 | struct drm_nouveau_private *dev_priv = dev->dev_private; | 168 | struct drm_nouveau_private *dev_priv = dev->dev_private; |
163 | 169 | ||
164 | if (dev_priv->backlight) { | 170 | if (dev_priv->backlight) { |
diff --git a/drivers/gpu/drm/nouveau/nouveau_bios.c b/drivers/gpu/drm/nouveau/nouveau_bios.c index 8314a49b6b9a..90aef64b76f2 100644 --- a/drivers/gpu/drm/nouveau/nouveau_bios.c +++ b/drivers/gpu/drm/nouveau/nouveau_bios.c | |||
@@ -269,7 +269,7 @@ struct init_tbl_entry { | |||
269 | int (*handler)(struct nvbios *, uint16_t, struct init_exec *); | 269 | int (*handler)(struct nvbios *, uint16_t, struct init_exec *); |
270 | }; | 270 | }; |
271 | 271 | ||
272 | static int parse_init_table(struct nvbios *, unsigned int, struct init_exec *); | 272 | static int parse_init_table(struct nvbios *, uint16_t, struct init_exec *); |
273 | 273 | ||
274 | #define MACRO_INDEX_SIZE 2 | 274 | #define MACRO_INDEX_SIZE 2 |
275 | #define MACRO_SIZE 8 | 275 | #define MACRO_SIZE 8 |
@@ -2011,6 +2011,27 @@ init_sub_direct(struct nvbios *bios, uint16_t offset, struct init_exec *iexec) | |||
2011 | } | 2011 | } |
2012 | 2012 | ||
2013 | static int | 2013 | static int |
2014 | init_jump(struct nvbios *bios, uint16_t offset, struct init_exec *iexec) | ||
2015 | { | ||
2016 | /* | ||
2017 | * INIT_JUMP opcode: 0x5C ('\') | ||
2018 | * | ||
2019 | * offset (8 bit): opcode | ||
2020 | * offset + 1 (16 bit): offset (in bios) | ||
2021 | * | ||
2022 | * Continue execution of init table from 'offset' | ||
2023 | */ | ||
2024 | |||
2025 | uint16_t jmp_offset = ROM16(bios->data[offset + 1]); | ||
2026 | |||
2027 | if (!iexec->execute) | ||
2028 | return 3; | ||
2029 | |||
2030 | BIOSLOG(bios, "0x%04X: Jump to 0x%04X\n", offset, jmp_offset); | ||
2031 | return jmp_offset - offset; | ||
2032 | } | ||
2033 | |||
2034 | static int | ||
2014 | init_i2c_if(struct nvbios *bios, uint16_t offset, struct init_exec *iexec) | 2035 | init_i2c_if(struct nvbios *bios, uint16_t offset, struct init_exec *iexec) |
2015 | { | 2036 | { |
2016 | /* | 2037 | /* |
@@ -3659,6 +3680,7 @@ static struct init_tbl_entry itbl_entry[] = { | |||
3659 | { "INIT_ZM_REG_SEQUENCE" , 0x58, init_zm_reg_sequence }, | 3680 | { "INIT_ZM_REG_SEQUENCE" , 0x58, init_zm_reg_sequence }, |
3660 | /* INIT_INDIRECT_REG (0x5A, 7, 0, 0) removed due to no example of use */ | 3681 | /* INIT_INDIRECT_REG (0x5A, 7, 0, 0) removed due to no example of use */ |
3661 | { "INIT_SUB_DIRECT" , 0x5B, init_sub_direct }, | 3682 | { "INIT_SUB_DIRECT" , 0x5B, init_sub_direct }, |
3683 | { "INIT_JUMP" , 0x5C, init_jump }, | ||
3662 | { "INIT_I2C_IF" , 0x5E, init_i2c_if }, | 3684 | { "INIT_I2C_IF" , 0x5E, init_i2c_if }, |
3663 | { "INIT_COPY_NV_REG" , 0x5F, init_copy_nv_reg }, | 3685 | { "INIT_COPY_NV_REG" , 0x5F, init_copy_nv_reg }, |
3664 | { "INIT_ZM_INDEX_IO" , 0x62, init_zm_index_io }, | 3686 | { "INIT_ZM_INDEX_IO" , 0x62, init_zm_index_io }, |
@@ -3700,8 +3722,7 @@ static struct init_tbl_entry itbl_entry[] = { | |||
3700 | #define MAX_TABLE_OPS 1000 | 3722 | #define MAX_TABLE_OPS 1000 |
3701 | 3723 | ||
3702 | static int | 3724 | static int |
3703 | parse_init_table(struct nvbios *bios, unsigned int offset, | 3725 | parse_init_table(struct nvbios *bios, uint16_t offset, struct init_exec *iexec) |
3704 | struct init_exec *iexec) | ||
3705 | { | 3726 | { |
3706 | /* | 3727 | /* |
3707 | * Parses all commands in an init table. | 3728 | * Parses all commands in an init table. |
@@ -6333,6 +6354,32 @@ apply_dcb_encoder_quirks(struct drm_device *dev, int idx, u32 *conn, u32 *conf) | |||
6333 | } | 6354 | } |
6334 | } | 6355 | } |
6335 | 6356 | ||
6357 | /* XFX GT-240X-YA | ||
6358 | * | ||
6359 | * So many things wrong here, replace the entire encoder table.. | ||
6360 | */ | ||
6361 | if (nv_match_device(dev, 0x0ca3, 0x1682, 0x3003)) { | ||
6362 | if (idx == 0) { | ||
6363 | *conn = 0x02001300; /* VGA, connector 1 */ | ||
6364 | *conf = 0x00000028; | ||
6365 | } else | ||
6366 | if (idx == 1) { | ||
6367 | *conn = 0x01010312; /* DVI, connector 0 */ | ||
6368 | *conf = 0x00020030; | ||
6369 | } else | ||
6370 | if (idx == 2) { | ||
6371 | *conn = 0x01010310; /* VGA, connector 0 */ | ||
6372 | *conf = 0x00000028; | ||
6373 | } else | ||
6374 | if (idx == 3) { | ||
6375 | *conn = 0x02022362; /* HDMI, connector 2 */ | ||
6376 | *conf = 0x00020010; | ||
6377 | } else { | ||
6378 | *conn = 0x0000000e; /* EOL */ | ||
6379 | *conf = 0x00000000; | ||
6380 | } | ||
6381 | } | ||
6382 | |||
6336 | return true; | 6383 | return true; |
6337 | } | 6384 | } |
6338 | 6385 | ||
diff --git a/drivers/gpu/drm/nouveau/nouveau_channel.c b/drivers/gpu/drm/nouveau/nouveau_channel.c index 3837090d66af..4cea35c57d15 100644 --- a/drivers/gpu/drm/nouveau/nouveau_channel.c +++ b/drivers/gpu/drm/nouveau/nouveau_channel.c | |||
@@ -200,7 +200,7 @@ nouveau_channel_alloc(struct drm_device *dev, struct nouveau_channel **chan_ret, | |||
200 | /* disable the fifo caches */ | 200 | /* disable the fifo caches */ |
201 | pfifo->reassign(dev, false); | 201 | pfifo->reassign(dev, false); |
202 | 202 | ||
203 | /* Construct inital RAMFC for new channel */ | 203 | /* Construct initial RAMFC for new channel */ |
204 | ret = pfifo->create_context(chan); | 204 | ret = pfifo->create_context(chan); |
205 | if (ret) { | 205 | if (ret) { |
206 | nouveau_channel_put(&chan); | 206 | nouveau_channel_put(&chan); |
@@ -278,7 +278,7 @@ nouveau_channel_put_unlocked(struct nouveau_channel **pchan) | |||
278 | return; | 278 | return; |
279 | } | 279 | } |
280 | 280 | ||
281 | /* noone wants the channel anymore */ | 281 | /* no one wants the channel anymore */ |
282 | NV_DEBUG(dev, "freeing channel %d\n", chan->id); | 282 | NV_DEBUG(dev, "freeing channel %d\n", chan->id); |
283 | nouveau_debugfs_channel_fini(chan); | 283 | nouveau_debugfs_channel_fini(chan); |
284 | 284 | ||
diff --git a/drivers/gpu/drm/nouveau/nouveau_connector.c b/drivers/gpu/drm/nouveau/nouveau_connector.c index 390d82c3c4b0..7ae151109a66 100644 --- a/drivers/gpu/drm/nouveau/nouveau_connector.c +++ b/drivers/gpu/drm/nouveau/nouveau_connector.c | |||
@@ -116,6 +116,10 @@ nouveau_connector_destroy(struct drm_connector *connector) | |||
116 | nouveau_connector_hotplug, connector); | 116 | nouveau_connector_hotplug, connector); |
117 | } | 117 | } |
118 | 118 | ||
119 | if (connector->connector_type == DRM_MODE_CONNECTOR_LVDS || | ||
120 | connector->connector_type == DRM_MODE_CONNECTOR_eDP) | ||
121 | nouveau_backlight_exit(connector); | ||
122 | |||
119 | kfree(nv_connector->edid); | 123 | kfree(nv_connector->edid); |
120 | drm_sysfs_connector_remove(connector); | 124 | drm_sysfs_connector_remove(connector); |
121 | drm_connector_cleanup(connector); | 125 | drm_connector_cleanup(connector); |
@@ -894,6 +898,11 @@ nouveau_connector_create(struct drm_device *dev, int index) | |||
894 | } | 898 | } |
895 | 899 | ||
896 | drm_sysfs_connector_add(connector); | 900 | drm_sysfs_connector_add(connector); |
901 | |||
902 | if (connector->connector_type == DRM_MODE_CONNECTOR_LVDS || | ||
903 | connector->connector_type == DRM_MODE_CONNECTOR_eDP) | ||
904 | nouveau_backlight_init(connector); | ||
905 | |||
897 | dcb->drm = connector; | 906 | dcb->drm = connector; |
898 | return dcb->drm; | 907 | return dcb->drm; |
899 | 908 | ||
diff --git a/drivers/gpu/drm/nouveau/nouveau_dma.c b/drivers/gpu/drm/nouveau/nouveau_dma.c index ce38e97b9428..568caedd7216 100644 --- a/drivers/gpu/drm/nouveau/nouveau_dma.c +++ b/drivers/gpu/drm/nouveau/nouveau_dma.c | |||
@@ -83,7 +83,7 @@ nouveau_dma_init(struct nouveau_channel *chan) | |||
83 | return ret; | 83 | return ret; |
84 | 84 | ||
85 | /* NV_MEMORY_TO_MEMORY_FORMAT requires a notifier object */ | 85 | /* NV_MEMORY_TO_MEMORY_FORMAT requires a notifier object */ |
86 | ret = nouveau_notifier_alloc(chan, NvNotify0, 32, 0xfd0, 0x1000, | 86 | ret = nouveau_notifier_alloc(chan, NvNotify0, 32, 0xfe0, 0x1000, |
87 | &chan->m2mf_ntfy); | 87 | &chan->m2mf_ntfy); |
88 | if (ret) | 88 | if (ret) |
89 | return ret; | 89 | return ret; |
diff --git a/drivers/gpu/drm/nouveau/nouveau_drv.h b/drivers/gpu/drm/nouveau/nouveau_drv.h index 06111887b789..a76514a209b3 100644 --- a/drivers/gpu/drm/nouveau/nouveau_drv.h +++ b/drivers/gpu/drm/nouveau/nouveau_drv.h | |||
@@ -216,7 +216,7 @@ struct nouveau_channel { | |||
216 | /* mapping of the fifo itself */ | 216 | /* mapping of the fifo itself */ |
217 | struct drm_local_map *map; | 217 | struct drm_local_map *map; |
218 | 218 | ||
219 | /* mapping of the regs controling the fifo */ | 219 | /* mapping of the regs controlling the fifo */ |
220 | void __iomem *user; | 220 | void __iomem *user; |
221 | uint32_t user_get; | 221 | uint32_t user_get; |
222 | uint32_t user_put; | 222 | uint32_t user_put; |
@@ -682,6 +682,9 @@ struct drm_nouveau_private { | |||
682 | /* For PFIFO and PGRAPH. */ | 682 | /* For PFIFO and PGRAPH. */ |
683 | spinlock_t context_switch_lock; | 683 | spinlock_t context_switch_lock; |
684 | 684 | ||
685 | /* VM/PRAMIN flush, legacy PRAMIN aperture */ | ||
686 | spinlock_t vm_lock; | ||
687 | |||
685 | /* RAMIN configuration, RAMFC, RAMHT and RAMRO offsets */ | 688 | /* RAMIN configuration, RAMFC, RAMHT and RAMRO offsets */ |
686 | struct nouveau_ramht *ramht; | 689 | struct nouveau_ramht *ramht; |
687 | struct nouveau_gpuobj *ramfc; | 690 | struct nouveau_gpuobj *ramfc; |
@@ -999,15 +1002,15 @@ static inline int nouveau_acpi_edid(struct drm_device *dev, struct drm_connector | |||
999 | 1002 | ||
1000 | /* nouveau_backlight.c */ | 1003 | /* nouveau_backlight.c */ |
1001 | #ifdef CONFIG_DRM_NOUVEAU_BACKLIGHT | 1004 | #ifdef CONFIG_DRM_NOUVEAU_BACKLIGHT |
1002 | extern int nouveau_backlight_init(struct drm_device *); | 1005 | extern int nouveau_backlight_init(struct drm_connector *); |
1003 | extern void nouveau_backlight_exit(struct drm_device *); | 1006 | extern void nouveau_backlight_exit(struct drm_connector *); |
1004 | #else | 1007 | #else |
1005 | static inline int nouveau_backlight_init(struct drm_device *dev) | 1008 | static inline int nouveau_backlight_init(struct drm_connector *dev) |
1006 | { | 1009 | { |
1007 | return 0; | 1010 | return 0; |
1008 | } | 1011 | } |
1009 | 1012 | ||
1010 | static inline void nouveau_backlight_exit(struct drm_device *dev) { } | 1013 | static inline void nouveau_backlight_exit(struct drm_connector *dev) { } |
1011 | #endif | 1014 | #endif |
1012 | 1015 | ||
1013 | /* nouveau_bios.c */ | 1016 | /* nouveau_bios.c */ |
@@ -1190,7 +1193,7 @@ extern int nv50_graph_load_context(struct nouveau_channel *); | |||
1190 | extern int nv50_graph_unload_context(struct drm_device *); | 1193 | extern int nv50_graph_unload_context(struct drm_device *); |
1191 | extern int nv50_grctx_init(struct nouveau_grctx *); | 1194 | extern int nv50_grctx_init(struct nouveau_grctx *); |
1192 | extern void nv50_graph_tlb_flush(struct drm_device *dev); | 1195 | extern void nv50_graph_tlb_flush(struct drm_device *dev); |
1193 | extern void nv86_graph_tlb_flush(struct drm_device *dev); | 1196 | extern void nv84_graph_tlb_flush(struct drm_device *dev); |
1194 | extern struct nouveau_enum nv50_data_error_names[]; | 1197 | extern struct nouveau_enum nv50_data_error_names[]; |
1195 | 1198 | ||
1196 | /* nvc0_graph.c */ | 1199 | /* nvc0_graph.c */ |
diff --git a/drivers/gpu/drm/nouveau/nouveau_fbcon.c b/drivers/gpu/drm/nouveau/nouveau_fbcon.c index 889c4454682e..39aee6d4daf8 100644 --- a/drivers/gpu/drm/nouveau/nouveau_fbcon.c +++ b/drivers/gpu/drm/nouveau/nouveau_fbcon.c | |||
@@ -181,13 +181,13 @@ nouveau_fbcon_sync(struct fb_info *info) | |||
181 | OUT_RING (chan, 0); | 181 | OUT_RING (chan, 0); |
182 | } | 182 | } |
183 | 183 | ||
184 | nouveau_bo_wr32(chan->notifier_bo, chan->m2mf_ntfy + 3, 0xffffffff); | 184 | nouveau_bo_wr32(chan->notifier_bo, chan->m2mf_ntfy/4 + 3, 0xffffffff); |
185 | FIRE_RING(chan); | 185 | FIRE_RING(chan); |
186 | mutex_unlock(&chan->mutex); | 186 | mutex_unlock(&chan->mutex); |
187 | 187 | ||
188 | ret = -EBUSY; | 188 | ret = -EBUSY; |
189 | for (i = 0; i < 100000; i++) { | 189 | for (i = 0; i < 100000; i++) { |
190 | if (!nouveau_bo_rd32(chan->notifier_bo, chan->m2mf_ntfy + 3)) { | 190 | if (!nouveau_bo_rd32(chan->notifier_bo, chan->m2mf_ntfy/4 + 3)) { |
191 | ret = 0; | 191 | ret = 0; |
192 | break; | 192 | break; |
193 | } | 193 | } |
diff --git a/drivers/gpu/drm/nouveau/nouveau_gem.c b/drivers/gpu/drm/nouveau/nouveau_gem.c index e8b04f4aed7e..b52e46018245 100644 --- a/drivers/gpu/drm/nouveau/nouveau_gem.c +++ b/drivers/gpu/drm/nouveau/nouveau_gem.c | |||
@@ -97,7 +97,7 @@ nouveau_gem_new(struct drm_device *dev, struct nouveau_channel *chan, | |||
97 | return -ENOMEM; | 97 | return -ENOMEM; |
98 | } | 98 | } |
99 | 99 | ||
100 | nvbo->bo.persistant_swap_storage = nvbo->gem->filp; | 100 | nvbo->bo.persistent_swap_storage = nvbo->gem->filp; |
101 | nvbo->gem->driver_private = nvbo; | 101 | nvbo->gem->driver_private = nvbo; |
102 | return 0; | 102 | return 0; |
103 | } | 103 | } |
diff --git a/drivers/gpu/drm/nouveau/nouveau_mem.c b/drivers/gpu/drm/nouveau/nouveau_mem.c index 2683377f4131..5045f8b921d6 100644 --- a/drivers/gpu/drm/nouveau/nouveau_mem.c +++ b/drivers/gpu/drm/nouveau/nouveau_mem.c | |||
@@ -398,7 +398,7 @@ nouveau_mem_vram_init(struct drm_device *dev) | |||
398 | dma_bits = 40; | 398 | dma_bits = 40; |
399 | } else | 399 | } else |
400 | if (drm_pci_device_is_pcie(dev) && | 400 | if (drm_pci_device_is_pcie(dev) && |
401 | dev_priv->chipset != 0x40 && | 401 | dev_priv->chipset > 0x40 && |
402 | dev_priv->chipset != 0x45) { | 402 | dev_priv->chipset != 0x45) { |
403 | if (pci_dma_supported(dev->pdev, DMA_BIT_MASK(39))) | 403 | if (pci_dma_supported(dev->pdev, DMA_BIT_MASK(39))) |
404 | dma_bits = 39; | 404 | dma_bits = 39; |
@@ -552,6 +552,7 @@ nouveau_mem_timing_init(struct drm_device *dev) | |||
552 | u8 tRC; /* Byte 9 */ | 552 | u8 tRC; /* Byte 9 */ |
553 | u8 tUNK_10, tUNK_11, tUNK_12, tUNK_13, tUNK_14; | 553 | u8 tUNK_10, tUNK_11, tUNK_12, tUNK_13, tUNK_14; |
554 | u8 tUNK_18, tUNK_19, tUNK_20, tUNK_21; | 554 | u8 tUNK_18, tUNK_19, tUNK_20, tUNK_21; |
555 | u8 magic_number = 0; /* Yeah... sorry*/ | ||
555 | u8 *mem = NULL, *entry; | 556 | u8 *mem = NULL, *entry; |
556 | int i, recordlen, entries; | 557 | int i, recordlen, entries; |
557 | 558 | ||
@@ -596,6 +597,12 @@ nouveau_mem_timing_init(struct drm_device *dev) | |||
596 | if (!memtimings->timing) | 597 | if (!memtimings->timing) |
597 | return; | 598 | return; |
598 | 599 | ||
600 | /* Get "some number" from the timing reg for NV_40 | ||
601 | * Used in calculations later */ | ||
602 | if(dev_priv->card_type == NV_40) { | ||
603 | magic_number = (nv_rd32(dev,0x100228) & 0x0f000000) >> 24; | ||
604 | } | ||
605 | |||
599 | entry = mem + mem[1]; | 606 | entry = mem + mem[1]; |
600 | for (i = 0; i < entries; i++, entry += recordlen) { | 607 | for (i = 0; i < entries; i++, entry += recordlen) { |
601 | struct nouveau_pm_memtiming *timing = &pm->memtimings.timing[i]; | 608 | struct nouveau_pm_memtiming *timing = &pm->memtimings.timing[i]; |
@@ -635,36 +642,51 @@ nouveau_mem_timing_init(struct drm_device *dev) | |||
635 | 642 | ||
636 | /* XXX: I don't trust the -1's and +1's... they must come | 643 | /* XXX: I don't trust the -1's and +1's... they must come |
637 | * from somewhere! */ | 644 | * from somewhere! */ |
638 | timing->reg_100224 = ((tUNK_0 + tUNK_19 + 1) << 24 | | 645 | timing->reg_100224 = (tUNK_0 + tUNK_19 + 1 + magic_number) << 24 | |
639 | tUNK_18 << 16 | | 646 | tUNK_18 << 16 | |
640 | (tUNK_1 + tUNK_19 + 1) << 8 | | 647 | (tUNK_1 + tUNK_19 + 1 + magic_number) << 8; |
641 | (tUNK_2 - 1)); | 648 | if(dev_priv->chipset == 0xa8) { |
649 | timing->reg_100224 |= (tUNK_2 - 1); | ||
650 | } else { | ||
651 | timing->reg_100224 |= (tUNK_2 + 2 - magic_number); | ||
652 | } | ||
642 | 653 | ||
643 | timing->reg_100228 = (tUNK_12 << 16 | tUNK_11 << 8 | tUNK_10); | 654 | timing->reg_100228 = (tUNK_12 << 16 | tUNK_11 << 8 | tUNK_10); |
644 | if(recordlen > 19) { | 655 | if(dev_priv->chipset >= 0xa3 && dev_priv->chipset < 0xaa) { |
645 | timing->reg_100228 += (tUNK_19 - 1) << 24; | 656 | timing->reg_100228 |= (tUNK_19 - 1) << 24; |
646 | }/* I cannot back-up this else-statement right now | 657 | } |
647 | else { | 658 | |
648 | timing->reg_100228 += tUNK_12 << 24; | 659 | if(dev_priv->card_type == NV_40) { |
649 | }*/ | 660 | /* NV40: don't know what the rest of the regs are.. |
650 | 661 | * And don't need to know either */ | |
651 | /* XXX: reg_10022c */ | 662 | timing->reg_100228 |= 0x20200000 | magic_number << 24; |
652 | timing->reg_10022c = tUNK_2 - 1; | 663 | } else if(dev_priv->card_type >= NV_50) { |
653 | 664 | /* XXX: reg_10022c */ | |
654 | timing->reg_100230 = (tUNK_20 << 24 | tUNK_21 << 16 | | 665 | timing->reg_10022c = tUNK_2 - 1; |
655 | tUNK_13 << 8 | tUNK_13); | 666 | |
656 | 667 | timing->reg_100230 = (tUNK_20 << 24 | tUNK_21 << 16 | | |
657 | /* XXX: +6? */ | 668 | tUNK_13 << 8 | tUNK_13); |
658 | timing->reg_100234 = (tRAS << 24 | (tUNK_19 + 6) << 8 | tRC); | 669 | |
659 | timing->reg_100234 += max(tUNK_10,tUNK_11) << 16; | 670 | timing->reg_100234 = (tRAS << 24 | tRC); |
660 | 671 | timing->reg_100234 += max(tUNK_10,tUNK_11) << 16; | |
661 | /* XXX; reg_100238, reg_10023c | 672 | |
662 | * reg: 0x00?????? | 673 | if(dev_priv->chipset < 0xa3) { |
663 | * reg_10023c: | 674 | timing->reg_100234 |= (tUNK_2 + 2) << 8; |
664 | * 0 for pre-NV50 cards | 675 | } else { |
665 | * 0x????0202 for NV50+ cards (empirical evidence) */ | 676 | /* XXX: +6? */ |
666 | if(dev_priv->card_type >= NV_50) { | 677 | timing->reg_100234 |= (tUNK_19 + 6) << 8; |
678 | } | ||
679 | |||
680 | /* XXX; reg_100238, reg_10023c | ||
681 | * reg_100238: 0x00?????? | ||
682 | * reg_10023c: 0x!!??0202 for NV50+ cards (empirical evidence) */ | ||
667 | timing->reg_10023c = 0x202; | 683 | timing->reg_10023c = 0x202; |
684 | if(dev_priv->chipset < 0xa3) { | ||
685 | timing->reg_10023c |= 0x4000000 | (tUNK_2 - 1) << 16; | ||
686 | } else { | ||
687 | /* currently unknown | ||
688 | * 10023c seen as 06xxxxxx, 0bxxxxxx or 0fxxxxxx */ | ||
689 | } | ||
668 | } | 690 | } |
669 | 691 | ||
670 | NV_DEBUG(dev, "Entry %d: 220: %08x %08x %08x %08x\n", i, | 692 | NV_DEBUG(dev, "Entry %d: 220: %08x %08x %08x %08x\n", i, |
@@ -675,7 +697,7 @@ nouveau_mem_timing_init(struct drm_device *dev) | |||
675 | timing->reg_100238, timing->reg_10023c); | 697 | timing->reg_100238, timing->reg_10023c); |
676 | } | 698 | } |
677 | 699 | ||
678 | memtimings->nr_timing = entries; | 700 | memtimings->nr_timing = entries; |
679 | memtimings->supported = true; | 701 | memtimings->supported = true; |
680 | } | 702 | } |
681 | 703 | ||
diff --git a/drivers/gpu/drm/nouveau/nouveau_notifier.c b/drivers/gpu/drm/nouveau/nouveau_notifier.c index 7ba3fc0b30c1..5b39718ae1f8 100644 --- a/drivers/gpu/drm/nouveau/nouveau_notifier.c +++ b/drivers/gpu/drm/nouveau/nouveau_notifier.c | |||
@@ -35,19 +35,22 @@ nouveau_notifier_init_channel(struct nouveau_channel *chan) | |||
35 | { | 35 | { |
36 | struct drm_device *dev = chan->dev; | 36 | struct drm_device *dev = chan->dev; |
37 | struct nouveau_bo *ntfy = NULL; | 37 | struct nouveau_bo *ntfy = NULL; |
38 | uint32_t flags; | 38 | uint32_t flags, ttmpl; |
39 | int ret; | 39 | int ret; |
40 | 40 | ||
41 | if (nouveau_vram_notify) | 41 | if (nouveau_vram_notify) { |
42 | flags = NOUVEAU_GEM_DOMAIN_VRAM; | 42 | flags = NOUVEAU_GEM_DOMAIN_VRAM; |
43 | else | 43 | ttmpl = TTM_PL_FLAG_VRAM; |
44 | } else { | ||
44 | flags = NOUVEAU_GEM_DOMAIN_GART; | 45 | flags = NOUVEAU_GEM_DOMAIN_GART; |
46 | ttmpl = TTM_PL_FLAG_TT; | ||
47 | } | ||
45 | 48 | ||
46 | ret = nouveau_gem_new(dev, NULL, PAGE_SIZE, 0, flags, 0, 0, &ntfy); | 49 | ret = nouveau_gem_new(dev, NULL, PAGE_SIZE, 0, flags, 0, 0, &ntfy); |
47 | if (ret) | 50 | if (ret) |
48 | return ret; | 51 | return ret; |
49 | 52 | ||
50 | ret = nouveau_bo_pin(ntfy, flags); | 53 | ret = nouveau_bo_pin(ntfy, ttmpl); |
51 | if (ret) | 54 | if (ret) |
52 | goto out_err; | 55 | goto out_err; |
53 | 56 | ||
diff --git a/drivers/gpu/drm/nouveau/nouveau_object.c b/drivers/gpu/drm/nouveau/nouveau_object.c index 4f00c87ed86e..67a16e01ffa6 100644 --- a/drivers/gpu/drm/nouveau/nouveau_object.c +++ b/drivers/gpu/drm/nouveau/nouveau_object.c | |||
@@ -1039,19 +1039,20 @@ nv_ro32(struct nouveau_gpuobj *gpuobj, u32 offset) | |||
1039 | { | 1039 | { |
1040 | struct drm_nouveau_private *dev_priv = gpuobj->dev->dev_private; | 1040 | struct drm_nouveau_private *dev_priv = gpuobj->dev->dev_private; |
1041 | struct drm_device *dev = gpuobj->dev; | 1041 | struct drm_device *dev = gpuobj->dev; |
1042 | unsigned long flags; | ||
1042 | 1043 | ||
1043 | if (gpuobj->pinst == ~0 || !dev_priv->ramin_available) { | 1044 | if (gpuobj->pinst == ~0 || !dev_priv->ramin_available) { |
1044 | u64 ptr = gpuobj->vinst + offset; | 1045 | u64 ptr = gpuobj->vinst + offset; |
1045 | u32 base = ptr >> 16; | 1046 | u32 base = ptr >> 16; |
1046 | u32 val; | 1047 | u32 val; |
1047 | 1048 | ||
1048 | spin_lock(&dev_priv->ramin_lock); | 1049 | spin_lock_irqsave(&dev_priv->vm_lock, flags); |
1049 | if (dev_priv->ramin_base != base) { | 1050 | if (dev_priv->ramin_base != base) { |
1050 | dev_priv->ramin_base = base; | 1051 | dev_priv->ramin_base = base; |
1051 | nv_wr32(dev, 0x001700, dev_priv->ramin_base); | 1052 | nv_wr32(dev, 0x001700, dev_priv->ramin_base); |
1052 | } | 1053 | } |
1053 | val = nv_rd32(dev, 0x700000 + (ptr & 0xffff)); | 1054 | val = nv_rd32(dev, 0x700000 + (ptr & 0xffff)); |
1054 | spin_unlock(&dev_priv->ramin_lock); | 1055 | spin_unlock_irqrestore(&dev_priv->vm_lock, flags); |
1055 | return val; | 1056 | return val; |
1056 | } | 1057 | } |
1057 | 1058 | ||
@@ -1063,18 +1064,19 @@ nv_wo32(struct nouveau_gpuobj *gpuobj, u32 offset, u32 val) | |||
1063 | { | 1064 | { |
1064 | struct drm_nouveau_private *dev_priv = gpuobj->dev->dev_private; | 1065 | struct drm_nouveau_private *dev_priv = gpuobj->dev->dev_private; |
1065 | struct drm_device *dev = gpuobj->dev; | 1066 | struct drm_device *dev = gpuobj->dev; |
1067 | unsigned long flags; | ||
1066 | 1068 | ||
1067 | if (gpuobj->pinst == ~0 || !dev_priv->ramin_available) { | 1069 | if (gpuobj->pinst == ~0 || !dev_priv->ramin_available) { |
1068 | u64 ptr = gpuobj->vinst + offset; | 1070 | u64 ptr = gpuobj->vinst + offset; |
1069 | u32 base = ptr >> 16; | 1071 | u32 base = ptr >> 16; |
1070 | 1072 | ||
1071 | spin_lock(&dev_priv->ramin_lock); | 1073 | spin_lock_irqsave(&dev_priv->vm_lock, flags); |
1072 | if (dev_priv->ramin_base != base) { | 1074 | if (dev_priv->ramin_base != base) { |
1073 | dev_priv->ramin_base = base; | 1075 | dev_priv->ramin_base = base; |
1074 | nv_wr32(dev, 0x001700, dev_priv->ramin_base); | 1076 | nv_wr32(dev, 0x001700, dev_priv->ramin_base); |
1075 | } | 1077 | } |
1076 | nv_wr32(dev, 0x700000 + (ptr & 0xffff), val); | 1078 | nv_wr32(dev, 0x700000 + (ptr & 0xffff), val); |
1077 | spin_unlock(&dev_priv->ramin_lock); | 1079 | spin_unlock_irqrestore(&dev_priv->vm_lock, flags); |
1078 | return; | 1080 | return; |
1079 | } | 1081 | } |
1080 | 1082 | ||
diff --git a/drivers/gpu/drm/nouveau/nouveau_perf.c b/drivers/gpu/drm/nouveau/nouveau_perf.c index ac62a1b8c4fc..670e3cb697ec 100644 --- a/drivers/gpu/drm/nouveau/nouveau_perf.c +++ b/drivers/gpu/drm/nouveau/nouveau_perf.c | |||
@@ -134,7 +134,7 @@ nouveau_perf_init(struct drm_device *dev) | |||
134 | case 0x13: | 134 | case 0x13: |
135 | case 0x15: | 135 | case 0x15: |
136 | perflvl->fanspeed = entry[55]; | 136 | perflvl->fanspeed = entry[55]; |
137 | perflvl->voltage = entry[56]; | 137 | perflvl->voltage = (recordlen > 56) ? entry[56] : 0; |
138 | perflvl->core = ROM32(entry[1]) * 10; | 138 | perflvl->core = ROM32(entry[1]) * 10; |
139 | perflvl->memory = ROM32(entry[5]) * 20; | 139 | perflvl->memory = ROM32(entry[5]) * 20; |
140 | break; | 140 | break; |
diff --git a/drivers/gpu/drm/nouveau/nouveau_sgdma.c b/drivers/gpu/drm/nouveau/nouveau_sgdma.c index a33fe4019286..4bce801bc588 100644 --- a/drivers/gpu/drm/nouveau/nouveau_sgdma.c +++ b/drivers/gpu/drm/nouveau/nouveau_sgdma.c | |||
@@ -55,6 +55,7 @@ nouveau_sgdma_populate(struct ttm_backend *be, unsigned long num_pages, | |||
55 | be->func->clear(be); | 55 | be->func->clear(be); |
56 | return -EFAULT; | 56 | return -EFAULT; |
57 | } | 57 | } |
58 | nvbe->ttm_alloced[nvbe->nr_pages] = false; | ||
58 | } | 59 | } |
59 | 60 | ||
60 | nvbe->nr_pages++; | 61 | nvbe->nr_pages++; |
@@ -427,7 +428,7 @@ nouveau_sgdma_init(struct drm_device *dev) | |||
427 | u32 aper_size, align; | 428 | u32 aper_size, align; |
428 | int ret; | 429 | int ret; |
429 | 430 | ||
430 | if (dev_priv->card_type >= NV_50 || drm_pci_device_is_pcie(dev)) | 431 | if (dev_priv->card_type >= NV_40 && drm_pci_device_is_pcie(dev)) |
431 | aper_size = 512 * 1024 * 1024; | 432 | aper_size = 512 * 1024 * 1024; |
432 | else | 433 | else |
433 | aper_size = 64 * 1024 * 1024; | 434 | aper_size = 64 * 1024 * 1024; |
@@ -457,7 +458,7 @@ nouveau_sgdma_init(struct drm_device *dev) | |||
457 | dev_priv->gart_info.func = &nv50_sgdma_backend; | 458 | dev_priv->gart_info.func = &nv50_sgdma_backend; |
458 | } else | 459 | } else |
459 | if (drm_pci_device_is_pcie(dev) && | 460 | if (drm_pci_device_is_pcie(dev) && |
460 | dev_priv->chipset != 0x40 && dev_priv->chipset != 0x45) { | 461 | dev_priv->chipset > 0x40 && dev_priv->chipset != 0x45) { |
461 | if (nv44_graph_class(dev)) { | 462 | if (nv44_graph_class(dev)) { |
462 | dev_priv->gart_info.func = &nv44_sgdma_backend; | 463 | dev_priv->gart_info.func = &nv44_sgdma_backend; |
463 | align = 512 * 1024; | 464 | align = 512 * 1024; |
diff --git a/drivers/gpu/drm/nouveau/nouveau_state.c b/drivers/gpu/drm/nouveau/nouveau_state.c index 05294910e135..a30adec5beaa 100644 --- a/drivers/gpu/drm/nouveau/nouveau_state.c +++ b/drivers/gpu/drm/nouveau/nouveau_state.c | |||
@@ -376,15 +376,11 @@ static int nouveau_init_engine_ptrs(struct drm_device *dev) | |||
376 | engine->graph.destroy_context = nv50_graph_destroy_context; | 376 | engine->graph.destroy_context = nv50_graph_destroy_context; |
377 | engine->graph.load_context = nv50_graph_load_context; | 377 | engine->graph.load_context = nv50_graph_load_context; |
378 | engine->graph.unload_context = nv50_graph_unload_context; | 378 | engine->graph.unload_context = nv50_graph_unload_context; |
379 | if (dev_priv->chipset != 0x86) | 379 | if (dev_priv->chipset == 0x50 || |
380 | dev_priv->chipset == 0xac) | ||
380 | engine->graph.tlb_flush = nv50_graph_tlb_flush; | 381 | engine->graph.tlb_flush = nv50_graph_tlb_flush; |
381 | else { | 382 | else |
382 | /* from what i can see nvidia do this on every | 383 | engine->graph.tlb_flush = nv84_graph_tlb_flush; |
383 | * pre-NVA3 board except NVAC, but, we've only | ||
384 | * ever seen problems on NV86 | ||
385 | */ | ||
386 | engine->graph.tlb_flush = nv86_graph_tlb_flush; | ||
387 | } | ||
388 | engine->fifo.channels = 128; | 384 | engine->fifo.channels = 128; |
389 | engine->fifo.init = nv50_fifo_init; | 385 | engine->fifo.init = nv50_fifo_init; |
390 | engine->fifo.takedown = nv50_fifo_takedown; | 386 | engine->fifo.takedown = nv50_fifo_takedown; |
@@ -612,6 +608,7 @@ nouveau_card_init(struct drm_device *dev) | |||
612 | spin_lock_init(&dev_priv->channels.lock); | 608 | spin_lock_init(&dev_priv->channels.lock); |
613 | spin_lock_init(&dev_priv->tile.lock); | 609 | spin_lock_init(&dev_priv->tile.lock); |
614 | spin_lock_init(&dev_priv->context_switch_lock); | 610 | spin_lock_init(&dev_priv->context_switch_lock); |
611 | spin_lock_init(&dev_priv->vm_lock); | ||
615 | 612 | ||
616 | /* Make the CRTCs and I2C buses accessible */ | 613 | /* Make the CRTCs and I2C buses accessible */ |
617 | ret = engine->display.early_init(dev); | 614 | ret = engine->display.early_init(dev); |
@@ -704,10 +701,6 @@ nouveau_card_init(struct drm_device *dev) | |||
704 | goto out_fence; | 701 | goto out_fence; |
705 | } | 702 | } |
706 | 703 | ||
707 | ret = nouveau_backlight_init(dev); | ||
708 | if (ret) | ||
709 | NV_ERROR(dev, "Error %d registering backlight\n", ret); | ||
710 | |||
711 | nouveau_fbcon_init(dev); | 704 | nouveau_fbcon_init(dev); |
712 | drm_kms_helper_poll_init(dev); | 705 | drm_kms_helper_poll_init(dev); |
713 | return 0; | 706 | return 0; |
@@ -759,8 +752,6 @@ static void nouveau_card_takedown(struct drm_device *dev) | |||
759 | struct drm_nouveau_private *dev_priv = dev->dev_private; | 752 | struct drm_nouveau_private *dev_priv = dev->dev_private; |
760 | struct nouveau_engine *engine = &dev_priv->engine; | 753 | struct nouveau_engine *engine = &dev_priv->engine; |
761 | 754 | ||
762 | nouveau_backlight_exit(dev); | ||
763 | |||
764 | if (!engine->graph.accel_blocked) { | 755 | if (!engine->graph.accel_blocked) { |
765 | nouveau_fence_fini(dev); | 756 | nouveau_fence_fini(dev); |
766 | nouveau_channel_put_unlocked(&dev_priv->channel); | 757 | nouveau_channel_put_unlocked(&dev_priv->channel); |
@@ -969,7 +960,7 @@ int nouveau_load(struct drm_device *dev, unsigned long flags) | |||
969 | if (ret) | 960 | if (ret) |
970 | goto err_mmio; | 961 | goto err_mmio; |
971 | 962 | ||
972 | /* Map PRAMIN BAR, or on older cards, the aperture withing BAR0 */ | 963 | /* Map PRAMIN BAR, or on older cards, the aperture within BAR0 */ |
973 | if (dev_priv->card_type >= NV_40) { | 964 | if (dev_priv->card_type >= NV_40) { |
974 | int ramin_bar = 2; | 965 | int ramin_bar = 2; |
975 | if (pci_resource_len(dev->pdev, ramin_bar) == 0) | 966 | if (pci_resource_len(dev->pdev, ramin_bar) == 0) |
diff --git a/drivers/gpu/drm/nouveau/nv04_crtc.c b/drivers/gpu/drm/nouveau/nv04_crtc.c index a260fbbe3d9b..748b9d9c2949 100644 --- a/drivers/gpu/drm/nouveau/nv04_crtc.c +++ b/drivers/gpu/drm/nouveau/nv04_crtc.c | |||
@@ -164,7 +164,7 @@ nv_crtc_dpms(struct drm_crtc *crtc, int mode) | |||
164 | NV_DEBUG_KMS(dev, "Setting dpms mode %d on CRTC %d\n", mode, | 164 | NV_DEBUG_KMS(dev, "Setting dpms mode %d on CRTC %d\n", mode, |
165 | nv_crtc->index); | 165 | nv_crtc->index); |
166 | 166 | ||
167 | if (nv_crtc->last_dpms == mode) /* Don't do unnecesary mode changes. */ | 167 | if (nv_crtc->last_dpms == mode) /* Don't do unnecessary mode changes. */ |
168 | return; | 168 | return; |
169 | 169 | ||
170 | nv_crtc->last_dpms = mode; | 170 | nv_crtc->last_dpms = mode; |
@@ -677,7 +677,7 @@ static void nv_crtc_prepare(struct drm_crtc *crtc) | |||
677 | 677 | ||
678 | NVBlankScreen(dev, nv_crtc->index, true); | 678 | NVBlankScreen(dev, nv_crtc->index, true); |
679 | 679 | ||
680 | /* Some more preperation. */ | 680 | /* Some more preparation. */ |
681 | NVWriteCRTC(dev, nv_crtc->index, NV_PCRTC_CONFIG, NV_PCRTC_CONFIG_START_ADDRESS_NON_VGA); | 681 | NVWriteCRTC(dev, nv_crtc->index, NV_PCRTC_CONFIG, NV_PCRTC_CONFIG_START_ADDRESS_NON_VGA); |
682 | if (dev_priv->card_type == NV_40) { | 682 | if (dev_priv->card_type == NV_40) { |
683 | uint32_t reg900 = NVReadRAMDAC(dev, nv_crtc->index, NV_PRAMDAC_900); | 683 | uint32_t reg900 = NVReadRAMDAC(dev, nv_crtc->index, NV_PRAMDAC_900); |
diff --git a/drivers/gpu/drm/nouveau/nv04_dfp.c b/drivers/gpu/drm/nouveau/nv04_dfp.c index c82db37d9f41..12098bf839c4 100644 --- a/drivers/gpu/drm/nouveau/nv04_dfp.c +++ b/drivers/gpu/drm/nouveau/nv04_dfp.c | |||
@@ -581,12 +581,13 @@ static void nv04_dfp_restore(struct drm_encoder *encoder) | |||
581 | int head = nv_encoder->restore.head; | 581 | int head = nv_encoder->restore.head; |
582 | 582 | ||
583 | if (nv_encoder->dcb->type == OUTPUT_LVDS) { | 583 | if (nv_encoder->dcb->type == OUTPUT_LVDS) { |
584 | struct drm_display_mode *native_mode = nouveau_encoder_connector_get(nv_encoder)->native_mode; | 584 | struct nouveau_connector *connector = |
585 | if (native_mode) | 585 | nouveau_encoder_connector_get(nv_encoder); |
586 | call_lvds_script(dev, nv_encoder->dcb, head, LVDS_PANEL_ON, | 586 | |
587 | native_mode->clock); | 587 | if (connector && connector->native_mode) |
588 | else | 588 | call_lvds_script(dev, nv_encoder->dcb, head, |
589 | NV_ERROR(dev, "Not restoring LVDS without native mode\n"); | 589 | LVDS_PANEL_ON, |
590 | connector->native_mode->clock); | ||
590 | 591 | ||
591 | } else if (nv_encoder->dcb->type == OUTPUT_TMDS) { | 592 | } else if (nv_encoder->dcb->type == OUTPUT_TMDS) { |
592 | int clock = nouveau_hw_pllvals_to_clk | 593 | int clock = nouveau_hw_pllvals_to_clk |
diff --git a/drivers/gpu/drm/nouveau/nv40_graph.c b/drivers/gpu/drm/nouveau/nv40_graph.c index 18d30c2c1aa6..fceb44c0ec74 100644 --- a/drivers/gpu/drm/nouveau/nv40_graph.c +++ b/drivers/gpu/drm/nouveau/nv40_graph.c | |||
@@ -181,7 +181,7 @@ nv40_graph_load_context(struct nouveau_channel *chan) | |||
181 | NV40_PGRAPH_CTXCTL_CUR_LOADED); | 181 | NV40_PGRAPH_CTXCTL_CUR_LOADED); |
182 | /* 0x32E0 records the instance address of the active FIFO's PGRAPH | 182 | /* 0x32E0 records the instance address of the active FIFO's PGRAPH |
183 | * context. If at any time this doesn't match 0x40032C, you will | 183 | * context. If at any time this doesn't match 0x40032C, you will |
184 | * recieve PGRAPH_INTR_CONTEXT_SWITCH | 184 | * receive PGRAPH_INTR_CONTEXT_SWITCH |
185 | */ | 185 | */ |
186 | nv_wr32(dev, NV40_PFIFO_GRCTX_INSTANCE, inst); | 186 | nv_wr32(dev, NV40_PFIFO_GRCTX_INSTANCE, inst); |
187 | return 0; | 187 | return 0; |
diff --git a/drivers/gpu/drm/nouveau/nv50_crtc.c b/drivers/gpu/drm/nouveau/nv50_crtc.c index 2b9984027f41..a19ccaa025b3 100644 --- a/drivers/gpu/drm/nouveau/nv50_crtc.c +++ b/drivers/gpu/drm/nouveau/nv50_crtc.c | |||
@@ -469,9 +469,6 @@ nv50_crtc_wait_complete(struct drm_crtc *crtc) | |||
469 | 469 | ||
470 | start = ptimer->read(dev); | 470 | start = ptimer->read(dev); |
471 | do { | 471 | do { |
472 | nv_wr32(dev, 0x61002c, 0x370); | ||
473 | nv_wr32(dev, 0x000140, 1); | ||
474 | |||
475 | if (nv_ro32(disp->ntfy, 0x000)) | 472 | if (nv_ro32(disp->ntfy, 0x000)) |
476 | return 0; | 473 | return 0; |
477 | } while (ptimer->read(dev) - start < 2000000000ULL); | 474 | } while (ptimer->read(dev) - start < 2000000000ULL); |
diff --git a/drivers/gpu/drm/nouveau/nv50_evo.c b/drivers/gpu/drm/nouveau/nv50_evo.c index a2cfaa691e9b..c8e83c1a4de8 100644 --- a/drivers/gpu/drm/nouveau/nv50_evo.c +++ b/drivers/gpu/drm/nouveau/nv50_evo.c | |||
@@ -186,6 +186,7 @@ nv50_evo_channel_init(struct nouveau_channel *evo) | |||
186 | nv_mask(dev, 0x610028, 0x00000000, 0x00010001 << id); | 186 | nv_mask(dev, 0x610028, 0x00000000, 0x00010001 << id); |
187 | 187 | ||
188 | evo->dma.max = (4096/4) - 2; | 188 | evo->dma.max = (4096/4) - 2; |
189 | evo->dma.max &= ~7; | ||
189 | evo->dma.put = 0; | 190 | evo->dma.put = 0; |
190 | evo->dma.cur = evo->dma.put; | 191 | evo->dma.cur = evo->dma.put; |
191 | evo->dma.free = evo->dma.max - evo->dma.cur; | 192 | evo->dma.free = evo->dma.max - evo->dma.cur; |
diff --git a/drivers/gpu/drm/nouveau/nv50_graph.c b/drivers/gpu/drm/nouveau/nv50_graph.c index 8675b00caf18..b02a5b1e7d37 100644 --- a/drivers/gpu/drm/nouveau/nv50_graph.c +++ b/drivers/gpu/drm/nouveau/nv50_graph.c | |||
@@ -503,7 +503,7 @@ nv50_graph_tlb_flush(struct drm_device *dev) | |||
503 | } | 503 | } |
504 | 504 | ||
505 | void | 505 | void |
506 | nv86_graph_tlb_flush(struct drm_device *dev) | 506 | nv84_graph_tlb_flush(struct drm_device *dev) |
507 | { | 507 | { |
508 | struct drm_nouveau_private *dev_priv = dev->dev_private; | 508 | struct drm_nouveau_private *dev_priv = dev->dev_private; |
509 | struct nouveau_timer_engine *ptimer = &dev_priv->engine.timer; | 509 | struct nouveau_timer_engine *ptimer = &dev_priv->engine.timer; |
diff --git a/drivers/gpu/drm/nouveau/nv50_instmem.c b/drivers/gpu/drm/nouveau/nv50_instmem.c index a6f8aa651fc6..4f95a1e5822e 100644 --- a/drivers/gpu/drm/nouveau/nv50_instmem.c +++ b/drivers/gpu/drm/nouveau/nv50_instmem.c | |||
@@ -404,23 +404,25 @@ void | |||
404 | nv50_instmem_flush(struct drm_device *dev) | 404 | nv50_instmem_flush(struct drm_device *dev) |
405 | { | 405 | { |
406 | struct drm_nouveau_private *dev_priv = dev->dev_private; | 406 | struct drm_nouveau_private *dev_priv = dev->dev_private; |
407 | unsigned long flags; | ||
407 | 408 | ||
408 | spin_lock(&dev_priv->ramin_lock); | 409 | spin_lock_irqsave(&dev_priv->vm_lock, flags); |
409 | nv_wr32(dev, 0x00330c, 0x00000001); | 410 | nv_wr32(dev, 0x00330c, 0x00000001); |
410 | if (!nv_wait(dev, 0x00330c, 0x00000002, 0x00000000)) | 411 | if (!nv_wait(dev, 0x00330c, 0x00000002, 0x00000000)) |
411 | NV_ERROR(dev, "PRAMIN flush timeout\n"); | 412 | NV_ERROR(dev, "PRAMIN flush timeout\n"); |
412 | spin_unlock(&dev_priv->ramin_lock); | 413 | spin_unlock_irqrestore(&dev_priv->vm_lock, flags); |
413 | } | 414 | } |
414 | 415 | ||
415 | void | 416 | void |
416 | nv84_instmem_flush(struct drm_device *dev) | 417 | nv84_instmem_flush(struct drm_device *dev) |
417 | { | 418 | { |
418 | struct drm_nouveau_private *dev_priv = dev->dev_private; | 419 | struct drm_nouveau_private *dev_priv = dev->dev_private; |
420 | unsigned long flags; | ||
419 | 421 | ||
420 | spin_lock(&dev_priv->ramin_lock); | 422 | spin_lock_irqsave(&dev_priv->vm_lock, flags); |
421 | nv_wr32(dev, 0x070000, 0x00000001); | 423 | nv_wr32(dev, 0x070000, 0x00000001); |
422 | if (!nv_wait(dev, 0x070000, 0x00000002, 0x00000000)) | 424 | if (!nv_wait(dev, 0x070000, 0x00000002, 0x00000000)) |
423 | NV_ERROR(dev, "PRAMIN flush timeout\n"); | 425 | NV_ERROR(dev, "PRAMIN flush timeout\n"); |
424 | spin_unlock(&dev_priv->ramin_lock); | 426 | spin_unlock_irqrestore(&dev_priv->vm_lock, flags); |
425 | } | 427 | } |
426 | 428 | ||
diff --git a/drivers/gpu/drm/nouveau/nv50_vm.c b/drivers/gpu/drm/nouveau/nv50_vm.c index 4fd3432b5b8d..6c2694490741 100644 --- a/drivers/gpu/drm/nouveau/nv50_vm.c +++ b/drivers/gpu/drm/nouveau/nv50_vm.c | |||
@@ -174,10 +174,11 @@ void | |||
174 | nv50_vm_flush_engine(struct drm_device *dev, int engine) | 174 | nv50_vm_flush_engine(struct drm_device *dev, int engine) |
175 | { | 175 | { |
176 | struct drm_nouveau_private *dev_priv = dev->dev_private; | 176 | struct drm_nouveau_private *dev_priv = dev->dev_private; |
177 | unsigned long flags; | ||
177 | 178 | ||
178 | spin_lock(&dev_priv->ramin_lock); | 179 | spin_lock_irqsave(&dev_priv->vm_lock, flags); |
179 | nv_wr32(dev, 0x100c80, (engine << 16) | 1); | 180 | nv_wr32(dev, 0x100c80, (engine << 16) | 1); |
180 | if (!nv_wait(dev, 0x100c80, 0x00000001, 0x00000000)) | 181 | if (!nv_wait(dev, 0x100c80, 0x00000001, 0x00000000)) |
181 | NV_ERROR(dev, "vm flush timeout: engine %d\n", engine); | 182 | NV_ERROR(dev, "vm flush timeout: engine %d\n", engine); |
182 | spin_unlock(&dev_priv->ramin_lock); | 183 | spin_unlock_irqrestore(&dev_priv->vm_lock, flags); |
183 | } | 184 | } |
diff --git a/drivers/gpu/drm/nouveau/nvc0_vm.c b/drivers/gpu/drm/nouveau/nvc0_vm.c index 69af0ba7edd3..a179e6c55afb 100644 --- a/drivers/gpu/drm/nouveau/nvc0_vm.c +++ b/drivers/gpu/drm/nouveau/nvc0_vm.c | |||
@@ -104,20 +104,27 @@ nvc0_vm_flush(struct nouveau_vm *vm) | |||
104 | struct nouveau_instmem_engine *pinstmem = &dev_priv->engine.instmem; | 104 | struct nouveau_instmem_engine *pinstmem = &dev_priv->engine.instmem; |
105 | struct drm_device *dev = vm->dev; | 105 | struct drm_device *dev = vm->dev; |
106 | struct nouveau_vm_pgd *vpgd; | 106 | struct nouveau_vm_pgd *vpgd; |
107 | u32 r100c80, engine; | 107 | unsigned long flags; |
108 | u32 engine = (dev_priv->chan_vm == vm) ? 1 : 5; | ||
108 | 109 | ||
109 | pinstmem->flush(vm->dev); | 110 | pinstmem->flush(vm->dev); |
110 | 111 | ||
111 | if (vm == dev_priv->chan_vm) | 112 | spin_lock_irqsave(&dev_priv->vm_lock, flags); |
112 | engine = 1; | ||
113 | else | ||
114 | engine = 5; | ||
115 | |||
116 | list_for_each_entry(vpgd, &vm->pgd_list, head) { | 113 | list_for_each_entry(vpgd, &vm->pgd_list, head) { |
117 | r100c80 = nv_rd32(dev, 0x100c80); | 114 | /* looks like maybe a "free flush slots" counter, the |
115 | * faster you write to 0x100cbc to more it decreases | ||
116 | */ | ||
117 | if (!nv_wait_ne(dev, 0x100c80, 0x00ff0000, 0x00000000)) { | ||
118 | NV_ERROR(dev, "vm timeout 0: 0x%08x %d\n", | ||
119 | nv_rd32(dev, 0x100c80), engine); | ||
120 | } | ||
118 | nv_wr32(dev, 0x100cb8, vpgd->obj->vinst >> 8); | 121 | nv_wr32(dev, 0x100cb8, vpgd->obj->vinst >> 8); |
119 | nv_wr32(dev, 0x100cbc, 0x80000000 | engine); | 122 | nv_wr32(dev, 0x100cbc, 0x80000000 | engine); |
120 | if (!nv_wait(dev, 0x100c80, 0xffffffff, r100c80)) | 123 | /* wait for flush to be queued? */ |
121 | NV_ERROR(dev, "vm flush timeout eng %d\n", engine); | 124 | if (!nv_wait(dev, 0x100c80, 0x00008000, 0x00008000)) { |
125 | NV_ERROR(dev, "vm timeout 1: 0x%08x %d\n", | ||
126 | nv_rd32(dev, 0x100c80), engine); | ||
127 | } | ||
122 | } | 128 | } |
129 | spin_unlock_irqrestore(&dev_priv->vm_lock, flags); | ||
123 | } | 130 | } |
diff --git a/drivers/gpu/drm/radeon/Kconfig b/drivers/gpu/drm/radeon/Kconfig index 1c02d23f6fcc..9746fee59f56 100644 --- a/drivers/gpu/drm/radeon/Kconfig +++ b/drivers/gpu/drm/radeon/Kconfig | |||
@@ -1,6 +1,7 @@ | |||
1 | config DRM_RADEON_KMS | 1 | config DRM_RADEON_KMS |
2 | bool "Enable modesetting on radeon by default - NEW DRIVER" | 2 | bool "Enable modesetting on radeon by default - NEW DRIVER" |
3 | depends on DRM_RADEON | 3 | depends on DRM_RADEON |
4 | select BACKLIGHT_CLASS_DEVICE | ||
4 | help | 5 | help |
5 | Choose this option if you want kernel modesetting enabled by default. | 6 | Choose this option if you want kernel modesetting enabled by default. |
6 | 7 | ||
diff --git a/drivers/gpu/drm/radeon/atom.c b/drivers/gpu/drm/radeon/atom.c index 258fa5e7a2d9..7bd745689097 100644 --- a/drivers/gpu/drm/radeon/atom.c +++ b/drivers/gpu/drm/radeon/atom.c | |||
@@ -32,6 +32,7 @@ | |||
32 | #include "atom.h" | 32 | #include "atom.h" |
33 | #include "atom-names.h" | 33 | #include "atom-names.h" |
34 | #include "atom-bits.h" | 34 | #include "atom-bits.h" |
35 | #include "radeon.h" | ||
35 | 36 | ||
36 | #define ATOM_COND_ABOVE 0 | 37 | #define ATOM_COND_ABOVE 0 |
37 | #define ATOM_COND_ABOVEOREQUAL 1 | 38 | #define ATOM_COND_ABOVEOREQUAL 1 |
@@ -101,7 +102,9 @@ static void debug_print_spaces(int n) | |||
101 | static uint32_t atom_iio_execute(struct atom_context *ctx, int base, | 102 | static uint32_t atom_iio_execute(struct atom_context *ctx, int base, |
102 | uint32_t index, uint32_t data) | 103 | uint32_t index, uint32_t data) |
103 | { | 104 | { |
105 | struct radeon_device *rdev = ctx->card->dev->dev_private; | ||
104 | uint32_t temp = 0xCDCDCDCD; | 106 | uint32_t temp = 0xCDCDCDCD; |
107 | |||
105 | while (1) | 108 | while (1) |
106 | switch (CU8(base)) { | 109 | switch (CU8(base)) { |
107 | case ATOM_IIO_NOP: | 110 | case ATOM_IIO_NOP: |
@@ -112,7 +115,8 @@ static uint32_t atom_iio_execute(struct atom_context *ctx, int base, | |||
112 | base += 3; | 115 | base += 3; |
113 | break; | 116 | break; |
114 | case ATOM_IIO_WRITE: | 117 | case ATOM_IIO_WRITE: |
115 | (void)ctx->card->ioreg_read(ctx->card, CU16(base + 1)); | 118 | if (rdev->family == CHIP_RV515) |
119 | (void)ctx->card->ioreg_read(ctx->card, CU16(base + 1)); | ||
116 | ctx->card->ioreg_write(ctx->card, CU16(base + 1), temp); | 120 | ctx->card->ioreg_write(ctx->card, CU16(base + 1), temp); |
117 | base += 3; | 121 | base += 3; |
118 | break; | 122 | break; |
@@ -131,7 +135,7 @@ static uint32_t atom_iio_execute(struct atom_context *ctx, int base, | |||
131 | case ATOM_IIO_MOVE_INDEX: | 135 | case ATOM_IIO_MOVE_INDEX: |
132 | temp &= | 136 | temp &= |
133 | ~((0xFFFFFFFF >> (32 - CU8(base + 1))) << | 137 | ~((0xFFFFFFFF >> (32 - CU8(base + 1))) << |
134 | CU8(base + 2)); | 138 | CU8(base + 3)); |
135 | temp |= | 139 | temp |= |
136 | ((index >> CU8(base + 2)) & | 140 | ((index >> CU8(base + 2)) & |
137 | (0xFFFFFFFF >> (32 - CU8(base + 1)))) << CU8(base + | 141 | (0xFFFFFFFF >> (32 - CU8(base + 1)))) << CU8(base + |
@@ -141,7 +145,7 @@ static uint32_t atom_iio_execute(struct atom_context *ctx, int base, | |||
141 | case ATOM_IIO_MOVE_DATA: | 145 | case ATOM_IIO_MOVE_DATA: |
142 | temp &= | 146 | temp &= |
143 | ~((0xFFFFFFFF >> (32 - CU8(base + 1))) << | 147 | ~((0xFFFFFFFF >> (32 - CU8(base + 1))) << |
144 | CU8(base + 2)); | 148 | CU8(base + 3)); |
145 | temp |= | 149 | temp |= |
146 | ((data >> CU8(base + 2)) & | 150 | ((data >> CU8(base + 2)) & |
147 | (0xFFFFFFFF >> (32 - CU8(base + 1)))) << CU8(base + | 151 | (0xFFFFFFFF >> (32 - CU8(base + 1)))) << CU8(base + |
@@ -151,7 +155,7 @@ static uint32_t atom_iio_execute(struct atom_context *ctx, int base, | |||
151 | case ATOM_IIO_MOVE_ATTR: | 155 | case ATOM_IIO_MOVE_ATTR: |
152 | temp &= | 156 | temp &= |
153 | ~((0xFFFFFFFF >> (32 - CU8(base + 1))) << | 157 | ~((0xFFFFFFFF >> (32 - CU8(base + 1))) << |
154 | CU8(base + 2)); | 158 | CU8(base + 3)); |
155 | temp |= | 159 | temp |= |
156 | ((ctx-> | 160 | ((ctx-> |
157 | io_attr >> CU8(base + 2)) & (0xFFFFFFFF >> (32 - | 161 | io_attr >> CU8(base + 2)) & (0xFFFFFFFF >> (32 - |
diff --git a/drivers/gpu/drm/radeon/atombios.h b/drivers/gpu/drm/radeon/atombios.h index 04b269d14a59..7fd88497b930 100644 --- a/drivers/gpu/drm/radeon/atombios.h +++ b/drivers/gpu/drm/radeon/atombios.h | |||
@@ -738,13 +738,13 @@ typedef struct _ATOM_DIG_ENCODER_CONFIG_V3 | |||
738 | { | 738 | { |
739 | #if ATOM_BIG_ENDIAN | 739 | #if ATOM_BIG_ENDIAN |
740 | UCHAR ucReserved1:1; | 740 | UCHAR ucReserved1:1; |
741 | UCHAR ucDigSel:3; // =0/1/2/3/4/5: DIG0/1/2/3/4/5 (In register spec also refered as DIGA/B/C/D/E/F) | 741 | UCHAR ucDigSel:3; // =0/1/2/3/4/5: DIG0/1/2/3/4/5 (In register spec also referred as DIGA/B/C/D/E/F) |
742 | UCHAR ucReserved:3; | 742 | UCHAR ucReserved:3; |
743 | UCHAR ucDPLinkRate:1; // =0: 1.62Ghz, =1: 2.7Ghz | 743 | UCHAR ucDPLinkRate:1; // =0: 1.62Ghz, =1: 2.7Ghz |
744 | #else | 744 | #else |
745 | UCHAR ucDPLinkRate:1; // =0: 1.62Ghz, =1: 2.7Ghz | 745 | UCHAR ucDPLinkRate:1; // =0: 1.62Ghz, =1: 2.7Ghz |
746 | UCHAR ucReserved:3; | 746 | UCHAR ucReserved:3; |
747 | UCHAR ucDigSel:3; // =0/1/2/3/4/5: DIG0/1/2/3/4/5 (In register spec also refered as DIGA/B/C/D/E/F) | 747 | UCHAR ucDigSel:3; // =0/1/2/3/4/5: DIG0/1/2/3/4/5 (In register spec also referred as DIGA/B/C/D/E/F) |
748 | UCHAR ucReserved1:1; | 748 | UCHAR ucReserved1:1; |
749 | #endif | 749 | #endif |
750 | }ATOM_DIG_ENCODER_CONFIG_V3; | 750 | }ATOM_DIG_ENCODER_CONFIG_V3; |
@@ -785,13 +785,13 @@ typedef struct _ATOM_DIG_ENCODER_CONFIG_V4 | |||
785 | { | 785 | { |
786 | #if ATOM_BIG_ENDIAN | 786 | #if ATOM_BIG_ENDIAN |
787 | UCHAR ucReserved1:1; | 787 | UCHAR ucReserved1:1; |
788 | UCHAR ucDigSel:3; // =0/1/2/3/4/5: DIG0/1/2/3/4/5 (In register spec also refered as DIGA/B/C/D/E/F) | 788 | UCHAR ucDigSel:3; // =0/1/2/3/4/5: DIG0/1/2/3/4/5 (In register spec also referred as DIGA/B/C/D/E/F) |
789 | UCHAR ucReserved:2; | 789 | UCHAR ucReserved:2; |
790 | UCHAR ucDPLinkRate:2; // =0: 1.62Ghz, =1: 2.7Ghz, 2=5.4Ghz <= Changed comparing to previous version | 790 | UCHAR ucDPLinkRate:2; // =0: 1.62Ghz, =1: 2.7Ghz, 2=5.4Ghz <= Changed comparing to previous version |
791 | #else | 791 | #else |
792 | UCHAR ucDPLinkRate:2; // =0: 1.62Ghz, =1: 2.7Ghz, 2=5.4Ghz <= Changed comparing to previous version | 792 | UCHAR ucDPLinkRate:2; // =0: 1.62Ghz, =1: 2.7Ghz, 2=5.4Ghz <= Changed comparing to previous version |
793 | UCHAR ucReserved:2; | 793 | UCHAR ucReserved:2; |
794 | UCHAR ucDigSel:3; // =0/1/2/3/4/5: DIG0/1/2/3/4/5 (In register spec also refered as DIGA/B/C/D/E/F) | 794 | UCHAR ucDigSel:3; // =0/1/2/3/4/5: DIG0/1/2/3/4/5 (In register spec also referred as DIGA/B/C/D/E/F) |
795 | UCHAR ucReserved1:1; | 795 | UCHAR ucReserved1:1; |
796 | #endif | 796 | #endif |
797 | }ATOM_DIG_ENCODER_CONFIG_V4; | 797 | }ATOM_DIG_ENCODER_CONFIG_V4; |
@@ -2126,7 +2126,7 @@ typedef struct _ATOM_MULTIMEDIA_CONFIG_INFO | |||
2126 | // Structures used in FirmwareInfoTable | 2126 | // Structures used in FirmwareInfoTable |
2127 | /****************************************************************************/ | 2127 | /****************************************************************************/ |
2128 | 2128 | ||
2129 | // usBIOSCapability Defintion: | 2129 | // usBIOSCapability Definition: |
2130 | // Bit 0 = 0: Bios image is not Posted, =1:Bios image is Posted; | 2130 | // Bit 0 = 0: Bios image is not Posted, =1:Bios image is Posted; |
2131 | // Bit 1 = 0: Dual CRTC is not supported, =1: Dual CRTC is supported; | 2131 | // Bit 1 = 0: Dual CRTC is not supported, =1: Dual CRTC is supported; |
2132 | // Bit 2 = 0: Extended Desktop is not supported, =1: Extended Desktop is supported; | 2132 | // Bit 2 = 0: Extended Desktop is not supported, =1: Extended Desktop is supported; |
@@ -3341,7 +3341,7 @@ typedef struct _ATOM_SPREAD_SPECTRUM_INFO | |||
3341 | /****************************************************************************/ | 3341 | /****************************************************************************/ |
3342 | // Structure used in AnalogTV_InfoTable (Top level) | 3342 | // Structure used in AnalogTV_InfoTable (Top level) |
3343 | /****************************************************************************/ | 3343 | /****************************************************************************/ |
3344 | //ucTVBootUpDefaultStd definiton: | 3344 | //ucTVBootUpDefaultStd definition: |
3345 | 3345 | ||
3346 | //ATOM_TV_NTSC 1 | 3346 | //ATOM_TV_NTSC 1 |
3347 | //ATOM_TV_NTSCJ 2 | 3347 | //ATOM_TV_NTSCJ 2 |
@@ -3816,7 +3816,7 @@ typedef struct _ATOM_EXTERNAL_DISPLAY_CONNECTION_INFO | |||
3816 | UCHAR Reserved [6]; // for potential expansion | 3816 | UCHAR Reserved [6]; // for potential expansion |
3817 | }ATOM_EXTERNAL_DISPLAY_CONNECTION_INFO; | 3817 | }ATOM_EXTERNAL_DISPLAY_CONNECTION_INFO; |
3818 | 3818 | ||
3819 | //Related definitions, all records are differnt but they have a commond header | 3819 | //Related definitions, all records are different but they have a commond header |
3820 | typedef struct _ATOM_COMMON_RECORD_HEADER | 3820 | typedef struct _ATOM_COMMON_RECORD_HEADER |
3821 | { | 3821 | { |
3822 | UCHAR ucRecordType; //An emun to indicate the record type | 3822 | UCHAR ucRecordType; //An emun to indicate the record type |
@@ -4365,14 +4365,14 @@ ucUMAChannelNumber: System memory channel numbers. | |||
4365 | ulCSR_M3_ARB_CNTL_DEFAULT[10]: Arrays with values for CSR M3 arbiter for default | 4365 | ulCSR_M3_ARB_CNTL_DEFAULT[10]: Arrays with values for CSR M3 arbiter for default |
4366 | ulCSR_M3_ARB_CNTL_UVD[10]: Arrays with values for CSR M3 arbiter for UVD playback. | 4366 | ulCSR_M3_ARB_CNTL_UVD[10]: Arrays with values for CSR M3 arbiter for UVD playback. |
4367 | ulCSR_M3_ARB_CNTL_FS3D[10]: Arrays with values for CSR M3 arbiter for Full Screen 3D applications. | 4367 | ulCSR_M3_ARB_CNTL_FS3D[10]: Arrays with values for CSR M3 arbiter for Full Screen 3D applications. |
4368 | sAvail_SCLK[5]: Arrays to provide availabe list of SLCK and corresponding voltage, order from low to high | 4368 | sAvail_SCLK[5]: Arrays to provide available list of SLCK and corresponding voltage, order from low to high |
4369 | ulGMCRestoreResetTime: GMC power restore and GMC reset time to calculate data reconnection latency. Unit in ns. | 4369 | ulGMCRestoreResetTime: GMC power restore and GMC reset time to calculate data reconnection latency. Unit in ns. |
4370 | ulMinimumNClk: Minimum NCLK speed among all NB-Pstates to calcualte data reconnection latency. Unit in 10kHz. | 4370 | ulMinimumNClk: Minimum NCLK speed among all NB-Pstates to calcualte data reconnection latency. Unit in 10kHz. |
4371 | ulIdleNClk: NCLK speed while memory runs in self-refresh state. Unit in 10kHz. | 4371 | ulIdleNClk: NCLK speed while memory runs in self-refresh state. Unit in 10kHz. |
4372 | ulDDR_DLL_PowerUpTime: DDR PHY DLL power up time. Unit in ns. | 4372 | ulDDR_DLL_PowerUpTime: DDR PHY DLL power up time. Unit in ns. |
4373 | ulDDR_PLL_PowerUpTime: DDR PHY PLL power up time. Unit in ns. | 4373 | ulDDR_PLL_PowerUpTime: DDR PHY PLL power up time. Unit in ns. |
4374 | usPCIEClkSSPercentage: PCIE Clock Spred Spectrum Percentage in unit 0.01%; 100 mean 1%. | 4374 | usPCIEClkSSPercentage: PCIE Clock Spread Spectrum Percentage in unit 0.01%; 100 mean 1%. |
4375 | usPCIEClkSSType: PCIE Clock Spred Spectrum Type. 0 for Down spread(default); 1 for Center spread. | 4375 | usPCIEClkSSType: PCIE Clock Spread Spectrum Type. 0 for Down spread(default); 1 for Center spread. |
4376 | usLvdsSSPercentage: LVDS panel ( not include eDP ) Spread Spectrum Percentage in unit of 0.01%, =0, use VBIOS default setting. | 4376 | usLvdsSSPercentage: LVDS panel ( not include eDP ) Spread Spectrum Percentage in unit of 0.01%, =0, use VBIOS default setting. |
4377 | usLvdsSSpreadRateIn10Hz: LVDS panel ( not include eDP ) Spread Spectrum frequency in unit of 10Hz, =0, use VBIOS default setting. | 4377 | usLvdsSSpreadRateIn10Hz: LVDS panel ( not include eDP ) Spread Spectrum frequency in unit of 10Hz, =0, use VBIOS default setting. |
4378 | usHDMISSPercentage: HDMI Spread Spectrum Percentage in unit 0.01%; 100 mean 1%, =0, use VBIOS default setting. | 4378 | usHDMISSPercentage: HDMI Spread Spectrum Percentage in unit 0.01%; 100 mean 1%, =0, use VBIOS default setting. |
@@ -4555,7 +4555,7 @@ typedef struct _ATOM_ASIC_INTERNAL_SS_INFO_V3 | |||
4555 | #define ATOM_S0_SYSTEM_POWER_STATE_VALUE_LITEAC 3 | 4555 | #define ATOM_S0_SYSTEM_POWER_STATE_VALUE_LITEAC 3 |
4556 | #define ATOM_S0_SYSTEM_POWER_STATE_VALUE_LIT2AC 4 | 4556 | #define ATOM_S0_SYSTEM_POWER_STATE_VALUE_LIT2AC 4 |
4557 | 4557 | ||
4558 | //Byte aligned defintion for BIOS usage | 4558 | //Byte aligned definition for BIOS usage |
4559 | #define ATOM_S0_CRT1_MONOb0 0x01 | 4559 | #define ATOM_S0_CRT1_MONOb0 0x01 |
4560 | #define ATOM_S0_CRT1_COLORb0 0x02 | 4560 | #define ATOM_S0_CRT1_COLORb0 0x02 |
4561 | #define ATOM_S0_CRT1_MASKb0 (ATOM_S0_CRT1_MONOb0+ATOM_S0_CRT1_COLORb0) | 4561 | #define ATOM_S0_CRT1_MASKb0 (ATOM_S0_CRT1_MONOb0+ATOM_S0_CRT1_COLORb0) |
@@ -4621,7 +4621,7 @@ typedef struct _ATOM_ASIC_INTERNAL_SS_INFO_V3 | |||
4621 | #define ATOM_S2_DISPLAY_ROTATION_ANGLE_MASK 0xC0000000L | 4621 | #define ATOM_S2_DISPLAY_ROTATION_ANGLE_MASK 0xC0000000L |
4622 | 4622 | ||
4623 | 4623 | ||
4624 | //Byte aligned defintion for BIOS usage | 4624 | //Byte aligned definition for BIOS usage |
4625 | #define ATOM_S2_TV1_STANDARD_MASKb0 0x0F | 4625 | #define ATOM_S2_TV1_STANDARD_MASKb0 0x0F |
4626 | #define ATOM_S2_CURRENT_BL_LEVEL_MASKb1 0xFF | 4626 | #define ATOM_S2_CURRENT_BL_LEVEL_MASKb1 0xFF |
4627 | #define ATOM_S2_DEVICE_DPMS_STATEb2 0x01 | 4627 | #define ATOM_S2_DEVICE_DPMS_STATEb2 0x01 |
@@ -4671,7 +4671,7 @@ typedef struct _ATOM_ASIC_INTERNAL_SS_INFO_V3 | |||
4671 | #define ATOM_S3_ALLOW_FAST_PWR_SWITCH 0x40000000L | 4671 | #define ATOM_S3_ALLOW_FAST_PWR_SWITCH 0x40000000L |
4672 | #define ATOM_S3_RQST_GPU_USE_MIN_PWR 0x80000000L | 4672 | #define ATOM_S3_RQST_GPU_USE_MIN_PWR 0x80000000L |
4673 | 4673 | ||
4674 | //Byte aligned defintion for BIOS usage | 4674 | //Byte aligned definition for BIOS usage |
4675 | #define ATOM_S3_CRT1_ACTIVEb0 0x01 | 4675 | #define ATOM_S3_CRT1_ACTIVEb0 0x01 |
4676 | #define ATOM_S3_LCD1_ACTIVEb0 0x02 | 4676 | #define ATOM_S3_LCD1_ACTIVEb0 0x02 |
4677 | #define ATOM_S3_TV1_ACTIVEb0 0x04 | 4677 | #define ATOM_S3_TV1_ACTIVEb0 0x04 |
@@ -4707,7 +4707,7 @@ typedef struct _ATOM_ASIC_INTERNAL_SS_INFO_V3 | |||
4707 | #define ATOM_S4_LCD1_REFRESH_MASK 0x0000FF00L | 4707 | #define ATOM_S4_LCD1_REFRESH_MASK 0x0000FF00L |
4708 | #define ATOM_S4_LCD1_REFRESH_SHIFT 8 | 4708 | #define ATOM_S4_LCD1_REFRESH_SHIFT 8 |
4709 | 4709 | ||
4710 | //Byte aligned defintion for BIOS usage | 4710 | //Byte aligned definition for BIOS usage |
4711 | #define ATOM_S4_LCD1_PANEL_ID_MASKb0 0x0FF | 4711 | #define ATOM_S4_LCD1_PANEL_ID_MASKb0 0x0FF |
4712 | #define ATOM_S4_LCD1_REFRESH_MASKb1 ATOM_S4_LCD1_PANEL_ID_MASKb0 | 4712 | #define ATOM_S4_LCD1_REFRESH_MASKb1 ATOM_S4_LCD1_PANEL_ID_MASKb0 |
4713 | #define ATOM_S4_VRAM_INFO_MASKb2 ATOM_S4_LCD1_PANEL_ID_MASKb0 | 4713 | #define ATOM_S4_VRAM_INFO_MASKb2 ATOM_S4_LCD1_PANEL_ID_MASKb0 |
@@ -4786,7 +4786,7 @@ typedef struct _ATOM_ASIC_INTERNAL_SS_INFO_V3 | |||
4786 | #define ATOM_S6_VRI_BRIGHTNESS_CHANGE 0x40000000L | 4786 | #define ATOM_S6_VRI_BRIGHTNESS_CHANGE 0x40000000L |
4787 | #define ATOM_S6_CONFIG_DISPLAY_CHANGE_MASK 0x80000000L | 4787 | #define ATOM_S6_CONFIG_DISPLAY_CHANGE_MASK 0x80000000L |
4788 | 4788 | ||
4789 | //Byte aligned defintion for BIOS usage | 4789 | //Byte aligned definition for BIOS usage |
4790 | #define ATOM_S6_DEVICE_CHANGEb0 0x01 | 4790 | #define ATOM_S6_DEVICE_CHANGEb0 0x01 |
4791 | #define ATOM_S6_SCALER_CHANGEb0 0x02 | 4791 | #define ATOM_S6_SCALER_CHANGEb0 0x02 |
4792 | #define ATOM_S6_LID_CHANGEb0 0x04 | 4792 | #define ATOM_S6_LID_CHANGEb0 0x04 |
@@ -5027,7 +5027,7 @@ typedef struct _ENABLE_GRAPH_SURFACE_PS_ALLOCATION | |||
5027 | 5027 | ||
5028 | typedef struct _MEMORY_CLEAN_UP_PARAMETERS | 5028 | typedef struct _MEMORY_CLEAN_UP_PARAMETERS |
5029 | { | 5029 | { |
5030 | USHORT usMemoryStart; //in 8Kb boundry, offset from memory base address | 5030 | USHORT usMemoryStart; //in 8Kb boundary, offset from memory base address |
5031 | USHORT usMemorySize; //8Kb blocks aligned | 5031 | USHORT usMemorySize; //8Kb blocks aligned |
5032 | }MEMORY_CLEAN_UP_PARAMETERS; | 5032 | }MEMORY_CLEAN_UP_PARAMETERS; |
5033 | #define MEMORY_CLEAN_UP_PS_ALLOCATION MEMORY_CLEAN_UP_PARAMETERS | 5033 | #define MEMORY_CLEAN_UP_PS_ALLOCATION MEMORY_CLEAN_UP_PARAMETERS |
@@ -6855,7 +6855,7 @@ typedef struct _ATOM_PPLIB_Clock_Voltage_Limit_Table | |||
6855 | /**************************************************************************/ | 6855 | /**************************************************************************/ |
6856 | 6856 | ||
6857 | 6857 | ||
6858 | // Following definitions are for compatiblity issue in different SW components. | 6858 | // Following definitions are for compatibility issue in different SW components. |
6859 | #define ATOM_MASTER_DATA_TABLE_REVISION 0x01 | 6859 | #define ATOM_MASTER_DATA_TABLE_REVISION 0x01 |
6860 | #define Object_Info Object_Header | 6860 | #define Object_Info Object_Header |
6861 | #define AdjustARB_SEQ MC_InitParameter | 6861 | #define AdjustARB_SEQ MC_InitParameter |
diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c index 3cd3234ba0af..529a3a704731 100644 --- a/drivers/gpu/drm/radeon/atombios_crtc.c +++ b/drivers/gpu/drm/radeon/atombios_crtc.c | |||
@@ -531,6 +531,9 @@ static u32 atombios_adjust_pll(struct drm_crtc *crtc, | |||
531 | pll->flags |= RADEON_PLL_PREFER_HIGH_FB_DIV; | 531 | pll->flags |= RADEON_PLL_PREFER_HIGH_FB_DIV; |
532 | else | 532 | else |
533 | pll->flags |= RADEON_PLL_PREFER_LOW_REF_DIV; | 533 | pll->flags |= RADEON_PLL_PREFER_LOW_REF_DIV; |
534 | |||
535 | if (rdev->family < CHIP_RV770) | ||
536 | pll->flags |= RADEON_PLL_PREFER_MINM_OVER_MAXP; | ||
534 | } else { | 537 | } else { |
535 | pll->flags |= RADEON_PLL_LEGACY; | 538 | pll->flags |= RADEON_PLL_LEGACY; |
536 | 539 | ||
@@ -559,7 +562,6 @@ static u32 atombios_adjust_pll(struct drm_crtc *crtc, | |||
559 | if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) { | 562 | if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) { |
560 | if (ss_enabled) { | 563 | if (ss_enabled) { |
561 | if (ss->refdiv) { | 564 | if (ss->refdiv) { |
562 | pll->flags |= RADEON_PLL_PREFER_MINM_OVER_MAXP; | ||
563 | pll->flags |= RADEON_PLL_USE_REF_DIV; | 565 | pll->flags |= RADEON_PLL_USE_REF_DIV; |
564 | pll->reference_div = ss->refdiv; | 566 | pll->reference_div = ss->refdiv; |
565 | if (ASIC_IS_AVIVO(rdev)) | 567 | if (ASIC_IS_AVIVO(rdev)) |
@@ -957,7 +959,11 @@ static void atombios_crtc_set_pll(struct drm_crtc *crtc, struct drm_display_mode | |||
957 | /* adjust pixel clock as needed */ | 959 | /* adjust pixel clock as needed */ |
958 | adjusted_clock = atombios_adjust_pll(crtc, mode, pll, ss_enabled, &ss); | 960 | adjusted_clock = atombios_adjust_pll(crtc, mode, pll, ss_enabled, &ss); |
959 | 961 | ||
960 | if (ASIC_IS_AVIVO(rdev)) | 962 | if (radeon_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT)) |
963 | /* TV seems to prefer the legacy algo on some boards */ | ||
964 | radeon_compute_pll_legacy(pll, adjusted_clock, &pll_clock, &fb_div, &frac_fb_div, | ||
965 | &ref_div, &post_div); | ||
966 | else if (ASIC_IS_AVIVO(rdev)) | ||
961 | radeon_compute_pll_avivo(pll, adjusted_clock, &pll_clock, &fb_div, &frac_fb_div, | 967 | radeon_compute_pll_avivo(pll, adjusted_clock, &pll_clock, &fb_div, &frac_fb_div, |
962 | &ref_div, &post_div); | 968 | &ref_div, &post_div); |
963 | else | 969 | else |
@@ -1005,6 +1011,7 @@ static int dce4_crtc_do_set_base(struct drm_crtc *crtc, | |||
1005 | uint64_t fb_location; | 1011 | uint64_t fb_location; |
1006 | uint32_t fb_format, fb_pitch_pixels, tiling_flags; | 1012 | uint32_t fb_format, fb_pitch_pixels, tiling_flags; |
1007 | u32 fb_swap = EVERGREEN_GRPH_ENDIAN_SWAP(EVERGREEN_GRPH_ENDIAN_NONE); | 1013 | u32 fb_swap = EVERGREEN_GRPH_ENDIAN_SWAP(EVERGREEN_GRPH_ENDIAN_NONE); |
1014 | u32 tmp; | ||
1008 | int r; | 1015 | int r; |
1009 | 1016 | ||
1010 | /* no fb bound */ | 1017 | /* no fb bound */ |
@@ -1133,6 +1140,15 @@ static int dce4_crtc_do_set_base(struct drm_crtc *crtc, | |||
1133 | WREG32(EVERGREEN_VIEWPORT_SIZE + radeon_crtc->crtc_offset, | 1140 | WREG32(EVERGREEN_VIEWPORT_SIZE + radeon_crtc->crtc_offset, |
1134 | (crtc->mode.hdisplay << 16) | crtc->mode.vdisplay); | 1141 | (crtc->mode.hdisplay << 16) | crtc->mode.vdisplay); |
1135 | 1142 | ||
1143 | /* pageflip setup */ | ||
1144 | /* make sure flip is at vb rather than hb */ | ||
1145 | tmp = RREG32(EVERGREEN_GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset); | ||
1146 | tmp &= ~EVERGREEN_GRPH_SURFACE_UPDATE_H_RETRACE_EN; | ||
1147 | WREG32(EVERGREEN_GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset, tmp); | ||
1148 | |||
1149 | /* set pageflip to happen anywhere in vblank interval */ | ||
1150 | WREG32(EVERGREEN_MASTER_UPDATE_MODE + radeon_crtc->crtc_offset, 0); | ||
1151 | |||
1136 | if (!atomic && fb && fb != crtc->fb) { | 1152 | if (!atomic && fb && fb != crtc->fb) { |
1137 | radeon_fb = to_radeon_framebuffer(fb); | 1153 | radeon_fb = to_radeon_framebuffer(fb); |
1138 | rbo = gem_to_radeon_bo(radeon_fb->obj); | 1154 | rbo = gem_to_radeon_bo(radeon_fb->obj); |
@@ -1163,6 +1179,7 @@ static int avivo_crtc_do_set_base(struct drm_crtc *crtc, | |||
1163 | uint64_t fb_location; | 1179 | uint64_t fb_location; |
1164 | uint32_t fb_format, fb_pitch_pixels, tiling_flags; | 1180 | uint32_t fb_format, fb_pitch_pixels, tiling_flags; |
1165 | u32 fb_swap = R600_D1GRPH_SWAP_ENDIAN_NONE; | 1181 | u32 fb_swap = R600_D1GRPH_SWAP_ENDIAN_NONE; |
1182 | u32 tmp; | ||
1166 | int r; | 1183 | int r; |
1167 | 1184 | ||
1168 | /* no fb bound */ | 1185 | /* no fb bound */ |
@@ -1290,6 +1307,15 @@ static int avivo_crtc_do_set_base(struct drm_crtc *crtc, | |||
1290 | WREG32(AVIVO_D1MODE_VIEWPORT_SIZE + radeon_crtc->crtc_offset, | 1307 | WREG32(AVIVO_D1MODE_VIEWPORT_SIZE + radeon_crtc->crtc_offset, |
1291 | (crtc->mode.hdisplay << 16) | crtc->mode.vdisplay); | 1308 | (crtc->mode.hdisplay << 16) | crtc->mode.vdisplay); |
1292 | 1309 | ||
1310 | /* pageflip setup */ | ||
1311 | /* make sure flip is at vb rather than hb */ | ||
1312 | tmp = RREG32(AVIVO_D1GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset); | ||
1313 | tmp &= ~AVIVO_D1GRPH_SURFACE_UPDATE_H_RETRACE_EN; | ||
1314 | WREG32(AVIVO_D1GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset, tmp); | ||
1315 | |||
1316 | /* set pageflip to happen anywhere in vblank interval */ | ||
1317 | WREG32(AVIVO_D1MODE_MASTER_UPDATE_MODE + radeon_crtc->crtc_offset, 0); | ||
1318 | |||
1293 | if (!atomic && fb && fb != crtc->fb) { | 1319 | if (!atomic && fb && fb != crtc->fb) { |
1294 | radeon_fb = to_radeon_framebuffer(fb); | 1320 | radeon_fb = to_radeon_framebuffer(fb); |
1295 | rbo = gem_to_radeon_bo(radeon_fb->obj); | 1321 | rbo = gem_to_radeon_bo(radeon_fb->obj); |
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c index 941080a77940..e9bc135d9189 100644 --- a/drivers/gpu/drm/radeon/evergreen.c +++ b/drivers/gpu/drm/radeon/evergreen.c | |||
@@ -43,17 +43,6 @@ static void evergreen_pcie_gen2_enable(struct radeon_device *rdev); | |||
43 | 43 | ||
44 | void evergreen_pre_page_flip(struct radeon_device *rdev, int crtc) | 44 | void evergreen_pre_page_flip(struct radeon_device *rdev, int crtc) |
45 | { | 45 | { |
46 | struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc]; | ||
47 | u32 tmp; | ||
48 | |||
49 | /* make sure flip is at vb rather than hb */ | ||
50 | tmp = RREG32(EVERGREEN_GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset); | ||
51 | tmp &= ~EVERGREEN_GRPH_SURFACE_UPDATE_H_RETRACE_EN; | ||
52 | WREG32(EVERGREEN_GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset, tmp); | ||
53 | |||
54 | /* set pageflip to happen anywhere in vblank interval */ | ||
55 | WREG32(EVERGREEN_MASTER_UPDATE_MODE + radeon_crtc->crtc_offset, 0); | ||
56 | |||
57 | /* enable the pflip int */ | 46 | /* enable the pflip int */ |
58 | radeon_irq_kms_pflip_irq_get(rdev, crtc); | 47 | radeon_irq_kms_pflip_irq_get(rdev, crtc); |
59 | } | 48 | } |
@@ -131,11 +120,16 @@ void evergreen_pm_misc(struct radeon_device *rdev) | |||
131 | struct radeon_power_state *ps = &rdev->pm.power_state[req_ps_idx]; | 120 | struct radeon_power_state *ps = &rdev->pm.power_state[req_ps_idx]; |
132 | struct radeon_voltage *voltage = &ps->clock_info[req_cm_idx].voltage; | 121 | struct radeon_voltage *voltage = &ps->clock_info[req_cm_idx].voltage; |
133 | 122 | ||
134 | if ((voltage->type == VOLTAGE_SW) && voltage->voltage) { | 123 | if (voltage->type == VOLTAGE_SW) { |
135 | if (voltage->voltage != rdev->pm.current_vddc) { | 124 | if (voltage->voltage && (voltage->voltage != rdev->pm.current_vddc)) { |
136 | radeon_atom_set_voltage(rdev, voltage->voltage); | 125 | radeon_atom_set_voltage(rdev, voltage->voltage, SET_VOLTAGE_TYPE_ASIC_VDDC); |
137 | rdev->pm.current_vddc = voltage->voltage; | 126 | rdev->pm.current_vddc = voltage->voltage; |
138 | DRM_DEBUG("Setting: v: %d\n", voltage->voltage); | 127 | DRM_DEBUG("Setting: vddc: %d\n", voltage->voltage); |
128 | } | ||
129 | if (voltage->vddci && (voltage->vddci != rdev->pm.current_vddci)) { | ||
130 | radeon_atom_set_voltage(rdev, voltage->vddci, SET_VOLTAGE_TYPE_ASIC_VDDCI); | ||
131 | rdev->pm.current_vddci = voltage->vddci; | ||
132 | DRM_DEBUG("Setting: vddci: %d\n", voltage->vddci); | ||
139 | } | 133 | } |
140 | } | 134 | } |
141 | } | 135 | } |
@@ -359,7 +353,7 @@ static u32 evergreen_line_buffer_adjust(struct radeon_device *rdev, | |||
359 | struct drm_display_mode *mode, | 353 | struct drm_display_mode *mode, |
360 | struct drm_display_mode *other_mode) | 354 | struct drm_display_mode *other_mode) |
361 | { | 355 | { |
362 | u32 tmp = 0; | 356 | u32 tmp; |
363 | /* | 357 | /* |
364 | * Line Buffer Setup | 358 | * Line Buffer Setup |
365 | * There are 3 line buffers, each one shared by 2 display controllers. | 359 | * There are 3 line buffers, each one shared by 2 display controllers. |
@@ -369,64 +363,63 @@ static u32 evergreen_line_buffer_adjust(struct radeon_device *rdev, | |||
369 | * first display controller | 363 | * first display controller |
370 | * 0 - first half of lb (3840 * 2) | 364 | * 0 - first half of lb (3840 * 2) |
371 | * 1 - first 3/4 of lb (5760 * 2) | 365 | * 1 - first 3/4 of lb (5760 * 2) |
372 | * 2 - whole lb (7680 * 2) | 366 | * 2 - whole lb (7680 * 2), other crtc must be disabled |
373 | * 3 - first 1/4 of lb (1920 * 2) | 367 | * 3 - first 1/4 of lb (1920 * 2) |
374 | * second display controller | 368 | * second display controller |
375 | * 4 - second half of lb (3840 * 2) | 369 | * 4 - second half of lb (3840 * 2) |
376 | * 5 - second 3/4 of lb (5760 * 2) | 370 | * 5 - second 3/4 of lb (5760 * 2) |
377 | * 6 - whole lb (7680 * 2) | 371 | * 6 - whole lb (7680 * 2), other crtc must be disabled |
378 | * 7 - last 1/4 of lb (1920 * 2) | 372 | * 7 - last 1/4 of lb (1920 * 2) |
379 | */ | 373 | */ |
380 | if (mode && other_mode) { | 374 | /* this can get tricky if we have two large displays on a paired group |
381 | if (mode->hdisplay > other_mode->hdisplay) { | 375 | * of crtcs. Ideally for multiple large displays we'd assign them to |
382 | if (mode->hdisplay > 2560) | 376 | * non-linked crtcs for maximum line buffer allocation. |
383 | tmp = 1; /* 3/4 */ | 377 | */ |
384 | else | 378 | if (radeon_crtc->base.enabled && mode) { |
385 | tmp = 0; /* 1/2 */ | 379 | if (other_mode) |
386 | } else if (other_mode->hdisplay > mode->hdisplay) { | ||
387 | if (other_mode->hdisplay > 2560) | ||
388 | tmp = 3; /* 1/4 */ | ||
389 | else | ||
390 | tmp = 0; /* 1/2 */ | ||
391 | } else | ||
392 | tmp = 0; /* 1/2 */ | 380 | tmp = 0; /* 1/2 */ |
393 | } else if (mode) | 381 | else |
394 | tmp = 2; /* whole */ | 382 | tmp = 2; /* whole */ |
395 | else if (other_mode) | 383 | } else |
396 | tmp = 3; /* 1/4 */ | 384 | tmp = 0; |
397 | 385 | ||
398 | /* second controller of the pair uses second half of the lb */ | 386 | /* second controller of the pair uses second half of the lb */ |
399 | if (radeon_crtc->crtc_id % 2) | 387 | if (radeon_crtc->crtc_id % 2) |
400 | tmp += 4; | 388 | tmp += 4; |
401 | WREG32(DC_LB_MEMORY_SPLIT + radeon_crtc->crtc_offset, tmp); | 389 | WREG32(DC_LB_MEMORY_SPLIT + radeon_crtc->crtc_offset, tmp); |
402 | 390 | ||
403 | switch (tmp) { | 391 | if (radeon_crtc->base.enabled && mode) { |
404 | case 0: | 392 | switch (tmp) { |
405 | case 4: | 393 | case 0: |
406 | default: | 394 | case 4: |
407 | if (ASIC_IS_DCE5(rdev)) | 395 | default: |
408 | return 4096 * 2; | 396 | if (ASIC_IS_DCE5(rdev)) |
409 | else | 397 | return 4096 * 2; |
410 | return 3840 * 2; | 398 | else |
411 | case 1: | 399 | return 3840 * 2; |
412 | case 5: | 400 | case 1: |
413 | if (ASIC_IS_DCE5(rdev)) | 401 | case 5: |
414 | return 6144 * 2; | 402 | if (ASIC_IS_DCE5(rdev)) |
415 | else | 403 | return 6144 * 2; |
416 | return 5760 * 2; | 404 | else |
417 | case 2: | 405 | return 5760 * 2; |
418 | case 6: | 406 | case 2: |
419 | if (ASIC_IS_DCE5(rdev)) | 407 | case 6: |
420 | return 8192 * 2; | 408 | if (ASIC_IS_DCE5(rdev)) |
421 | else | 409 | return 8192 * 2; |
422 | return 7680 * 2; | 410 | else |
423 | case 3: | 411 | return 7680 * 2; |
424 | case 7: | 412 | case 3: |
425 | if (ASIC_IS_DCE5(rdev)) | 413 | case 7: |
426 | return 2048 * 2; | 414 | if (ASIC_IS_DCE5(rdev)) |
427 | else | 415 | return 2048 * 2; |
428 | return 1920 * 2; | 416 | else |
417 | return 1920 * 2; | ||
418 | } | ||
429 | } | 419 | } |
420 | |||
421 | /* controller not enabled, so no lb used */ | ||
422 | return 0; | ||
430 | } | 423 | } |
431 | 424 | ||
432 | static u32 evergreen_get_number_of_dram_channels(struct radeon_device *rdev) | 425 | static u32 evergreen_get_number_of_dram_channels(struct radeon_device *rdev) |
@@ -2587,7 +2580,7 @@ static inline u32 evergreen_get_ih_wptr(struct radeon_device *rdev) | |||
2587 | u32 wptr, tmp; | 2580 | u32 wptr, tmp; |
2588 | 2581 | ||
2589 | if (rdev->wb.enabled) | 2582 | if (rdev->wb.enabled) |
2590 | wptr = rdev->wb.wb[R600_WB_IH_WPTR_OFFSET/4]; | 2583 | wptr = le32_to_cpu(rdev->wb.wb[R600_WB_IH_WPTR_OFFSET/4]); |
2591 | else | 2584 | else |
2592 | wptr = RREG32(IH_RB_WPTR); | 2585 | wptr = RREG32(IH_RB_WPTR); |
2593 | 2586 | ||
@@ -3047,9 +3040,6 @@ int evergreen_init(struct radeon_device *rdev) | |||
3047 | { | 3040 | { |
3048 | int r; | 3041 | int r; |
3049 | 3042 | ||
3050 | r = radeon_dummy_page_init(rdev); | ||
3051 | if (r) | ||
3052 | return r; | ||
3053 | /* This don't do much */ | 3043 | /* This don't do much */ |
3054 | r = radeon_gem_init(rdev); | 3044 | r = radeon_gem_init(rdev); |
3055 | if (r) | 3045 | if (r) |
@@ -3161,7 +3151,6 @@ void evergreen_fini(struct radeon_device *rdev) | |||
3161 | radeon_atombios_fini(rdev); | 3151 | radeon_atombios_fini(rdev); |
3162 | kfree(rdev->bios); | 3152 | kfree(rdev->bios); |
3163 | rdev->bios = NULL; | 3153 | rdev->bios = NULL; |
3164 | radeon_dummy_page_fini(rdev); | ||
3165 | } | 3154 | } |
3166 | 3155 | ||
3167 | static void evergreen_pcie_gen2_enable(struct radeon_device *rdev) | 3156 | static void evergreen_pcie_gen2_enable(struct radeon_device *rdev) |
diff --git a/drivers/gpu/drm/radeon/evergreen_cs.c b/drivers/gpu/drm/radeon/evergreen_cs.c index edde90b37554..23d36417158d 100644 --- a/drivers/gpu/drm/radeon/evergreen_cs.c +++ b/drivers/gpu/drm/radeon/evergreen_cs.c | |||
@@ -442,7 +442,7 @@ static inline int evergreen_cs_check_reg(struct radeon_cs_parser *p, u32 reg, u3 | |||
442 | } | 442 | } |
443 | ib = p->ib->ptr; | 443 | ib = p->ib->ptr; |
444 | switch (reg) { | 444 | switch (reg) { |
445 | /* force following reg to 0 in an attemp to disable out buffer | 445 | /* force following reg to 0 in an attempt to disable out buffer |
446 | * which will need us to better understand how it works to perform | 446 | * which will need us to better understand how it works to perform |
447 | * security check on it (Jerome) | 447 | * security check on it (Jerome) |
448 | */ | 448 | */ |
diff --git a/drivers/gpu/drm/radeon/r300.c b/drivers/gpu/drm/radeon/r300.c index 8713731fa014..55a7f190027e 100644 --- a/drivers/gpu/drm/radeon/r300.c +++ b/drivers/gpu/drm/radeon/r300.c | |||
@@ -437,7 +437,7 @@ int r300_asic_reset(struct radeon_device *rdev) | |||
437 | status = RREG32(R_000E40_RBBM_STATUS); | 437 | status = RREG32(R_000E40_RBBM_STATUS); |
438 | dev_info(rdev->dev, "(%s:%d) RBBM_STATUS=0x%08X\n", __func__, __LINE__, status); | 438 | dev_info(rdev->dev, "(%s:%d) RBBM_STATUS=0x%08X\n", __func__, __LINE__, status); |
439 | /* resetting the CP seems to be problematic sometimes it end up | 439 | /* resetting the CP seems to be problematic sometimes it end up |
440 | * hard locking the computer, but it's necessary for successfull | 440 | * hard locking the computer, but it's necessary for successful |
441 | * reset more test & playing is needed on R3XX/R4XX to find a | 441 | * reset more test & playing is needed on R3XX/R4XX to find a |
442 | * reliable (if any solution) | 442 | * reliable (if any solution) |
443 | */ | 443 | */ |
diff --git a/drivers/gpu/drm/radeon/r300_reg.h b/drivers/gpu/drm/radeon/r300_reg.h index f0bce399c9f3..00c0d2ba22d3 100644 --- a/drivers/gpu/drm/radeon/r300_reg.h +++ b/drivers/gpu/drm/radeon/r300_reg.h | |||
@@ -608,7 +608,7 @@ | |||
608 | * My guess is that there are two bits for each zbias primitive | 608 | * My guess is that there are two bits for each zbias primitive |
609 | * (FILL, LINE, POINT). | 609 | * (FILL, LINE, POINT). |
610 | * One to enable depth test and one for depth write. | 610 | * One to enable depth test and one for depth write. |
611 | * Yet this doesnt explain why depth writes work ... | 611 | * Yet this doesn't explain why depth writes work ... |
612 | */ | 612 | */ |
613 | #define R300_RE_OCCLUSION_CNTL 0x42B4 | 613 | #define R300_RE_OCCLUSION_CNTL 0x42B4 |
614 | # define R300_OCCLUSION_ON (1<<1) | 614 | # define R300_OCCLUSION_ON (1<<1) |
@@ -817,7 +817,7 @@ | |||
817 | # define R300_TX_MIN_FILTER_LINEAR_MIP_NEAREST (6 << 11) | 817 | # define R300_TX_MIN_FILTER_LINEAR_MIP_NEAREST (6 << 11) |
818 | # define R300_TX_MIN_FILTER_LINEAR_MIP_LINEAR (10 << 11) | 818 | # define R300_TX_MIN_FILTER_LINEAR_MIP_LINEAR (10 << 11) |
819 | 819 | ||
820 | /* NOTE: NEAREST doesnt seem to exist. | 820 | /* NOTE: NEAREST doesn't seem to exist. |
821 | * Im not seting MAG_FILTER_MASK and (3 << 11) on for all | 821 | * Im not seting MAG_FILTER_MASK and (3 << 11) on for all |
822 | * anisotropy modes because that would void selected mag filter | 822 | * anisotropy modes because that would void selected mag filter |
823 | */ | 823 | */ |
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c index be271c42de4d..6f27593901c7 100644 --- a/drivers/gpu/drm/radeon/r600.c +++ b/drivers/gpu/drm/radeon/r600.c | |||
@@ -587,7 +587,7 @@ void r600_pm_misc(struct radeon_device *rdev) | |||
587 | 587 | ||
588 | if ((voltage->type == VOLTAGE_SW) && voltage->voltage) { | 588 | if ((voltage->type == VOLTAGE_SW) && voltage->voltage) { |
589 | if (voltage->voltage != rdev->pm.current_vddc) { | 589 | if (voltage->voltage != rdev->pm.current_vddc) { |
590 | radeon_atom_set_voltage(rdev, voltage->voltage); | 590 | radeon_atom_set_voltage(rdev, voltage->voltage, SET_VOLTAGE_TYPE_ASIC_VDDC); |
591 | rdev->pm.current_vddc = voltage->voltage; | 591 | rdev->pm.current_vddc = voltage->voltage; |
592 | DRM_DEBUG_DRIVER("Setting: v: %d\n", voltage->voltage); | 592 | DRM_DEBUG_DRIVER("Setting: v: %d\n", voltage->voltage); |
593 | } | 593 | } |
@@ -2509,9 +2509,6 @@ int r600_init(struct radeon_device *rdev) | |||
2509 | { | 2509 | { |
2510 | int r; | 2510 | int r; |
2511 | 2511 | ||
2512 | r = radeon_dummy_page_init(rdev); | ||
2513 | if (r) | ||
2514 | return r; | ||
2515 | if (r600_debugfs_mc_info_init(rdev)) { | 2512 | if (r600_debugfs_mc_info_init(rdev)) { |
2516 | DRM_ERROR("Failed to register debugfs file for mc !\n"); | 2513 | DRM_ERROR("Failed to register debugfs file for mc !\n"); |
2517 | } | 2514 | } |
@@ -2625,7 +2622,6 @@ void r600_fini(struct radeon_device *rdev) | |||
2625 | radeon_atombios_fini(rdev); | 2622 | radeon_atombios_fini(rdev); |
2626 | kfree(rdev->bios); | 2623 | kfree(rdev->bios); |
2627 | rdev->bios = NULL; | 2624 | rdev->bios = NULL; |
2628 | radeon_dummy_page_fini(rdev); | ||
2629 | } | 2625 | } |
2630 | 2626 | ||
2631 | 2627 | ||
@@ -3235,7 +3231,7 @@ static inline u32 r600_get_ih_wptr(struct radeon_device *rdev) | |||
3235 | u32 wptr, tmp; | 3231 | u32 wptr, tmp; |
3236 | 3232 | ||
3237 | if (rdev->wb.enabled) | 3233 | if (rdev->wb.enabled) |
3238 | wptr = rdev->wb.wb[R600_WB_IH_WPTR_OFFSET/4]; | 3234 | wptr = le32_to_cpu(rdev->wb.wb[R600_WB_IH_WPTR_OFFSET/4]); |
3239 | else | 3235 | else |
3240 | wptr = RREG32(IH_RB_WPTR); | 3236 | wptr = RREG32(IH_RB_WPTR); |
3241 | 3237 | ||
diff --git a/drivers/gpu/drm/radeon/r600_cs.c b/drivers/gpu/drm/radeon/r600_cs.c index 3324620b2db6..fd18be9871ab 100644 --- a/drivers/gpu/drm/radeon/r600_cs.c +++ b/drivers/gpu/drm/radeon/r600_cs.c | |||
@@ -921,7 +921,7 @@ static inline int r600_cs_check_reg(struct radeon_cs_parser *p, u32 reg, u32 idx | |||
921 | return 0; | 921 | return 0; |
922 | ib = p->ib->ptr; | 922 | ib = p->ib->ptr; |
923 | switch (reg) { | 923 | switch (reg) { |
924 | /* force following reg to 0 in an attemp to disable out buffer | 924 | /* force following reg to 0 in an attempt to disable out buffer |
925 | * which will need us to better understand how it works to perform | 925 | * which will need us to better understand how it works to perform |
926 | * security check on it (Jerome) | 926 | * security check on it (Jerome) |
927 | */ | 927 | */ |
diff --git a/drivers/gpu/drm/radeon/r600_hdmi.c b/drivers/gpu/drm/radeon/r600_hdmi.c index 50db6d62eec2..f5ac7e788d81 100644 --- a/drivers/gpu/drm/radeon/r600_hdmi.c +++ b/drivers/gpu/drm/radeon/r600_hdmi.c | |||
@@ -334,7 +334,7 @@ void r600_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode *mod | |||
334 | r600_hdmi_videoinfoframe(encoder, RGB, 0, 0, 0, 0, | 334 | r600_hdmi_videoinfoframe(encoder, RGB, 0, 0, 0, 0, |
335 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); | 335 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); |
336 | 336 | ||
337 | /* it's unknown what these bits do excatly, but it's indeed quite usefull for debugging */ | 337 | /* it's unknown what these bits do excatly, but it's indeed quite useful for debugging */ |
338 | WREG32(offset+R600_HDMI_AUDIO_DEBUG_0, 0x00FFFFFF); | 338 | WREG32(offset+R600_HDMI_AUDIO_DEBUG_0, 0x00FFFFFF); |
339 | WREG32(offset+R600_HDMI_AUDIO_DEBUG_1, 0x007FFFFF); | 339 | WREG32(offset+R600_HDMI_AUDIO_DEBUG_1, 0x007FFFFF); |
340 | WREG32(offset+R600_HDMI_AUDIO_DEBUG_2, 0x00000001); | 340 | WREG32(offset+R600_HDMI_AUDIO_DEBUG_2, 0x00000001); |
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h index cfe3af1a7935..ba643b576054 100644 --- a/drivers/gpu/drm/radeon/radeon.h +++ b/drivers/gpu/drm/radeon/radeon.h | |||
@@ -177,7 +177,7 @@ void radeon_pm_suspend(struct radeon_device *rdev); | |||
177 | void radeon_pm_resume(struct radeon_device *rdev); | 177 | void radeon_pm_resume(struct radeon_device *rdev); |
178 | void radeon_combios_get_power_modes(struct radeon_device *rdev); | 178 | void radeon_combios_get_power_modes(struct radeon_device *rdev); |
179 | void radeon_atombios_get_power_modes(struct radeon_device *rdev); | 179 | void radeon_atombios_get_power_modes(struct radeon_device *rdev); |
180 | void radeon_atom_set_voltage(struct radeon_device *rdev, u16 level); | 180 | void radeon_atom_set_voltage(struct radeon_device *rdev, u16 voltage_level, u8 voltage_type); |
181 | void rs690_pm_info(struct radeon_device *rdev); | 181 | void rs690_pm_info(struct radeon_device *rdev); |
182 | extern int rv6xx_get_temp(struct radeon_device *rdev); | 182 | extern int rv6xx_get_temp(struct radeon_device *rdev); |
183 | extern int rv770_get_temp(struct radeon_device *rdev); | 183 | extern int rv770_get_temp(struct radeon_device *rdev); |
@@ -679,11 +679,11 @@ struct radeon_wb { | |||
679 | * @sideport_bandwidth: sideport bandwidth the gpu has (MByte/s) (IGP) | 679 | * @sideport_bandwidth: sideport bandwidth the gpu has (MByte/s) (IGP) |
680 | * @ht_bandwidth: ht bandwidth the gpu has (MByte/s) (IGP) | 680 | * @ht_bandwidth: ht bandwidth the gpu has (MByte/s) (IGP) |
681 | * @core_bandwidth: core GPU bandwidth the gpu has (MByte/s) (IGP) | 681 | * @core_bandwidth: core GPU bandwidth the gpu has (MByte/s) (IGP) |
682 | * @sclk: GPU clock Mhz (core bandwith depends of this clock) | 682 | * @sclk: GPU clock Mhz (core bandwidth depends of this clock) |
683 | * @needed_bandwidth: current bandwidth needs | 683 | * @needed_bandwidth: current bandwidth needs |
684 | * | 684 | * |
685 | * It keeps track of various data needed to take powermanagement decision. | 685 | * It keeps track of various data needed to take powermanagement decision. |
686 | * Bandwith need is used to determine minimun clock of the GPU and memory. | 686 | * Bandwidth need is used to determine minimun clock of the GPU and memory. |
687 | * Equation between gpu/memory clock and available bandwidth is hw dependent | 687 | * Equation between gpu/memory clock and available bandwidth is hw dependent |
688 | * (type of memory, bus size, efficiency, ...) | 688 | * (type of memory, bus size, efficiency, ...) |
689 | */ | 689 | */ |
@@ -767,7 +767,9 @@ struct radeon_voltage { | |||
767 | u8 vddci_id; /* index into vddci voltage table */ | 767 | u8 vddci_id; /* index into vddci voltage table */ |
768 | bool vddci_enabled; | 768 | bool vddci_enabled; |
769 | /* r6xx+ sw */ | 769 | /* r6xx+ sw */ |
770 | u32 voltage; | 770 | u16 voltage; |
771 | /* evergreen+ vddci */ | ||
772 | u16 vddci; | ||
771 | }; | 773 | }; |
772 | 774 | ||
773 | /* clock mode flags */ | 775 | /* clock mode flags */ |
@@ -835,10 +837,12 @@ struct radeon_pm { | |||
835 | int default_power_state_index; | 837 | int default_power_state_index; |
836 | u32 current_sclk; | 838 | u32 current_sclk; |
837 | u32 current_mclk; | 839 | u32 current_mclk; |
838 | u32 current_vddc; | 840 | u16 current_vddc; |
841 | u16 current_vddci; | ||
839 | u32 default_sclk; | 842 | u32 default_sclk; |
840 | u32 default_mclk; | 843 | u32 default_mclk; |
841 | u32 default_vddc; | 844 | u16 default_vddc; |
845 | u16 default_vddci; | ||
842 | struct radeon_i2c_chan *i2c_bus; | 846 | struct radeon_i2c_chan *i2c_bus; |
843 | /* selected pm method */ | 847 | /* selected pm method */ |
844 | enum radeon_pm_method pm_method; | 848 | enum radeon_pm_method pm_method; |
diff --git a/drivers/gpu/drm/radeon/radeon_asic.c b/drivers/gpu/drm/radeon/radeon_asic.c index eb888ee5f674..ca576191d058 100644 --- a/drivers/gpu/drm/radeon/radeon_asic.c +++ b/drivers/gpu/drm/radeon/radeon_asic.c | |||
@@ -94,7 +94,7 @@ static void radeon_register_accessor_init(struct radeon_device *rdev) | |||
94 | rdev->mc_rreg = &rs600_mc_rreg; | 94 | rdev->mc_rreg = &rs600_mc_rreg; |
95 | rdev->mc_wreg = &rs600_mc_wreg; | 95 | rdev->mc_wreg = &rs600_mc_wreg; |
96 | } | 96 | } |
97 | if ((rdev->family >= CHIP_R600) && (rdev->family <= CHIP_HEMLOCK)) { | 97 | if (rdev->family >= CHIP_R600) { |
98 | rdev->pciep_rreg = &r600_pciep_rreg; | 98 | rdev->pciep_rreg = &r600_pciep_rreg; |
99 | rdev->pciep_wreg = &r600_pciep_wreg; | 99 | rdev->pciep_wreg = &r600_pciep_wreg; |
100 | } | 100 | } |
diff --git a/drivers/gpu/drm/radeon/radeon_atombios.c b/drivers/gpu/drm/radeon/radeon_atombios.c index 02d5c415f499..f5d12fb103fa 100644 --- a/drivers/gpu/drm/radeon/radeon_atombios.c +++ b/drivers/gpu/drm/radeon/radeon_atombios.c | |||
@@ -675,7 +675,8 @@ bool radeon_get_atom_connector_info_from_object_table(struct drm_device *dev) | |||
675 | ATOM_ENCODER_CAP_RECORD *cap_record; | 675 | ATOM_ENCODER_CAP_RECORD *cap_record; |
676 | u16 caps = 0; | 676 | u16 caps = 0; |
677 | 677 | ||
678 | while (record->ucRecordType > 0 && | 678 | while (record->ucRecordSize > 0 && |
679 | record->ucRecordType > 0 && | ||
679 | record->ucRecordType <= ATOM_MAX_OBJECT_RECORD_NUMBER) { | 680 | record->ucRecordType <= ATOM_MAX_OBJECT_RECORD_NUMBER) { |
680 | switch (record->ucRecordType) { | 681 | switch (record->ucRecordType) { |
681 | case ATOM_ENCODER_CAP_RECORD_TYPE: | 682 | case ATOM_ENCODER_CAP_RECORD_TYPE: |
@@ -720,7 +721,8 @@ bool radeon_get_atom_connector_info_from_object_table(struct drm_device *dev) | |||
720 | break; | 721 | break; |
721 | } | 722 | } |
722 | 723 | ||
723 | while (record->ucRecordType > 0 && | 724 | while (record->ucRecordSize > 0 && |
725 | record->ucRecordType > 0 && | ||
724 | record->ucRecordType <= ATOM_MAX_OBJECT_RECORD_NUMBER) { | 726 | record->ucRecordType <= ATOM_MAX_OBJECT_RECORD_NUMBER) { |
725 | switch (record->ucRecordType) { | 727 | switch (record->ucRecordType) { |
726 | case ATOM_I2C_RECORD_TYPE: | 728 | case ATOM_I2C_RECORD_TYPE: |
@@ -782,10 +784,9 @@ bool radeon_get_atom_connector_info_from_object_table(struct drm_device *dev) | |||
782 | ATOM_HPD_INT_RECORD *hpd_record; | 784 | ATOM_HPD_INT_RECORD *hpd_record; |
783 | ATOM_I2C_ID_CONFIG_ACCESS *i2c_config; | 785 | ATOM_I2C_ID_CONFIG_ACCESS *i2c_config; |
784 | 786 | ||
785 | while (record->ucRecordType > 0 | 787 | while (record->ucRecordSize > 0 && |
786 | && record-> | 788 | record->ucRecordType > 0 && |
787 | ucRecordType <= | 789 | record->ucRecordType <= ATOM_MAX_OBJECT_RECORD_NUMBER) { |
788 | ATOM_MAX_OBJECT_RECORD_NUMBER) { | ||
789 | switch (record->ucRecordType) { | 790 | switch (record->ucRecordType) { |
790 | case ATOM_I2C_RECORD_TYPE: | 791 | case ATOM_I2C_RECORD_TYPE: |
791 | i2c_record = | 792 | i2c_record = |
@@ -2175,24 +2176,27 @@ static void radeon_atombios_add_pplib_thermal_controller(struct radeon_device *r | |||
2175 | } | 2176 | } |
2176 | } | 2177 | } |
2177 | 2178 | ||
2178 | static u16 radeon_atombios_get_default_vddc(struct radeon_device *rdev) | 2179 | static void radeon_atombios_get_default_voltages(struct radeon_device *rdev, |
2180 | u16 *vddc, u16 *vddci) | ||
2179 | { | 2181 | { |
2180 | struct radeon_mode_info *mode_info = &rdev->mode_info; | 2182 | struct radeon_mode_info *mode_info = &rdev->mode_info; |
2181 | int index = GetIndexIntoMasterTable(DATA, FirmwareInfo); | 2183 | int index = GetIndexIntoMasterTable(DATA, FirmwareInfo); |
2182 | u8 frev, crev; | 2184 | u8 frev, crev; |
2183 | u16 data_offset; | 2185 | u16 data_offset; |
2184 | union firmware_info *firmware_info; | 2186 | union firmware_info *firmware_info; |
2185 | u16 vddc = 0; | 2187 | |
2188 | *vddc = 0; | ||
2189 | *vddci = 0; | ||
2186 | 2190 | ||
2187 | if (atom_parse_data_header(mode_info->atom_context, index, NULL, | 2191 | if (atom_parse_data_header(mode_info->atom_context, index, NULL, |
2188 | &frev, &crev, &data_offset)) { | 2192 | &frev, &crev, &data_offset)) { |
2189 | firmware_info = | 2193 | firmware_info = |
2190 | (union firmware_info *)(mode_info->atom_context->bios + | 2194 | (union firmware_info *)(mode_info->atom_context->bios + |
2191 | data_offset); | 2195 | data_offset); |
2192 | vddc = le16_to_cpu(firmware_info->info_14.usBootUpVDDCVoltage); | 2196 | *vddc = le16_to_cpu(firmware_info->info_14.usBootUpVDDCVoltage); |
2197 | if ((frev == 2) && (crev >= 2)) | ||
2198 | *vddci = le16_to_cpu(firmware_info->info_22.usBootUpVDDCIVoltage); | ||
2193 | } | 2199 | } |
2194 | |||
2195 | return vddc; | ||
2196 | } | 2200 | } |
2197 | 2201 | ||
2198 | static void radeon_atombios_parse_pplib_non_clock_info(struct radeon_device *rdev, | 2202 | static void radeon_atombios_parse_pplib_non_clock_info(struct radeon_device *rdev, |
@@ -2202,7 +2206,9 @@ static void radeon_atombios_parse_pplib_non_clock_info(struct radeon_device *rde | |||
2202 | int j; | 2206 | int j; |
2203 | u32 misc = le32_to_cpu(non_clock_info->ulCapsAndSettings); | 2207 | u32 misc = le32_to_cpu(non_clock_info->ulCapsAndSettings); |
2204 | u32 misc2 = le16_to_cpu(non_clock_info->usClassification); | 2208 | u32 misc2 = le16_to_cpu(non_clock_info->usClassification); |
2205 | u16 vddc = radeon_atombios_get_default_vddc(rdev); | 2209 | u16 vddc, vddci; |
2210 | |||
2211 | radeon_atombios_get_default_voltages(rdev, &vddc, &vddci); | ||
2206 | 2212 | ||
2207 | rdev->pm.power_state[state_index].misc = misc; | 2213 | rdev->pm.power_state[state_index].misc = misc; |
2208 | rdev->pm.power_state[state_index].misc2 = misc2; | 2214 | rdev->pm.power_state[state_index].misc2 = misc2; |
@@ -2243,6 +2249,7 @@ static void radeon_atombios_parse_pplib_non_clock_info(struct radeon_device *rde | |||
2243 | rdev->pm.default_sclk = rdev->pm.power_state[state_index].clock_info[0].sclk; | 2249 | rdev->pm.default_sclk = rdev->pm.power_state[state_index].clock_info[0].sclk; |
2244 | rdev->pm.default_mclk = rdev->pm.power_state[state_index].clock_info[0].mclk; | 2250 | rdev->pm.default_mclk = rdev->pm.power_state[state_index].clock_info[0].mclk; |
2245 | rdev->pm.default_vddc = rdev->pm.power_state[state_index].clock_info[0].voltage.voltage; | 2251 | rdev->pm.default_vddc = rdev->pm.power_state[state_index].clock_info[0].voltage.voltage; |
2252 | rdev->pm.default_vddci = rdev->pm.power_state[state_index].clock_info[0].voltage.vddci; | ||
2246 | } else { | 2253 | } else { |
2247 | /* patch the table values with the default slck/mclk from firmware info */ | 2254 | /* patch the table values with the default slck/mclk from firmware info */ |
2248 | for (j = 0; j < mode_index; j++) { | 2255 | for (j = 0; j < mode_index; j++) { |
@@ -2285,6 +2292,8 @@ static bool radeon_atombios_parse_pplib_clock_info(struct radeon_device *rdev, | |||
2285 | VOLTAGE_SW; | 2292 | VOLTAGE_SW; |
2286 | rdev->pm.power_state[state_index].clock_info[mode_index].voltage.voltage = | 2293 | rdev->pm.power_state[state_index].clock_info[mode_index].voltage.voltage = |
2287 | le16_to_cpu(clock_info->evergreen.usVDDC); | 2294 | le16_to_cpu(clock_info->evergreen.usVDDC); |
2295 | rdev->pm.power_state[state_index].clock_info[mode_index].voltage.vddci = | ||
2296 | le16_to_cpu(clock_info->evergreen.usVDDCI); | ||
2288 | } else { | 2297 | } else { |
2289 | sclk = le16_to_cpu(clock_info->r600.usEngineClockLow); | 2298 | sclk = le16_to_cpu(clock_info->r600.usEngineClockLow); |
2290 | sclk |= clock_info->r600.ucEngineClockHigh << 16; | 2299 | sclk |= clock_info->r600.ucEngineClockHigh << 16; |
@@ -2576,25 +2585,25 @@ union set_voltage { | |||
2576 | struct _SET_VOLTAGE_PARAMETERS_V2 v2; | 2585 | struct _SET_VOLTAGE_PARAMETERS_V2 v2; |
2577 | }; | 2586 | }; |
2578 | 2587 | ||
2579 | void radeon_atom_set_voltage(struct radeon_device *rdev, u16 level) | 2588 | void radeon_atom_set_voltage(struct radeon_device *rdev, u16 voltage_level, u8 voltage_type) |
2580 | { | 2589 | { |
2581 | union set_voltage args; | 2590 | union set_voltage args; |
2582 | int index = GetIndexIntoMasterTable(COMMAND, SetVoltage); | 2591 | int index = GetIndexIntoMasterTable(COMMAND, SetVoltage); |
2583 | u8 frev, crev, volt_index = level; | 2592 | u8 frev, crev, volt_index = voltage_level; |
2584 | 2593 | ||
2585 | if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev)) | 2594 | if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev)) |
2586 | return; | 2595 | return; |
2587 | 2596 | ||
2588 | switch (crev) { | 2597 | switch (crev) { |
2589 | case 1: | 2598 | case 1: |
2590 | args.v1.ucVoltageType = SET_VOLTAGE_TYPE_ASIC_VDDC; | 2599 | args.v1.ucVoltageType = voltage_type; |
2591 | args.v1.ucVoltageMode = SET_ASIC_VOLTAGE_MODE_ALL_SOURCE; | 2600 | args.v1.ucVoltageMode = SET_ASIC_VOLTAGE_MODE_ALL_SOURCE; |
2592 | args.v1.ucVoltageIndex = volt_index; | 2601 | args.v1.ucVoltageIndex = volt_index; |
2593 | break; | 2602 | break; |
2594 | case 2: | 2603 | case 2: |
2595 | args.v2.ucVoltageType = SET_VOLTAGE_TYPE_ASIC_VDDC; | 2604 | args.v2.ucVoltageType = voltage_type; |
2596 | args.v2.ucVoltageMode = SET_ASIC_VOLTAGE_MODE_SET_VOLTAGE; | 2605 | args.v2.ucVoltageMode = SET_ASIC_VOLTAGE_MODE_SET_VOLTAGE; |
2597 | args.v2.usVoltageLevel = cpu_to_le16(level); | 2606 | args.v2.usVoltageLevel = cpu_to_le16(voltage_level); |
2598 | break; | 2607 | break; |
2599 | default: | 2608 | default: |
2600 | DRM_ERROR("Unknown table version %d, %d\n", frev, crev); | 2609 | DRM_ERROR("Unknown table version %d, %d\n", frev, crev); |
diff --git a/drivers/gpu/drm/radeon/radeon_combios.c b/drivers/gpu/drm/radeon/radeon_combios.c index cf7c8d5b4ec2..8caf546c8e92 100644 --- a/drivers/gpu/drm/radeon/radeon_combios.c +++ b/drivers/gpu/drm/radeon/radeon_combios.c | |||
@@ -448,7 +448,7 @@ static uint16_t combios_get_table_offset(struct drm_device *dev, | |||
448 | 448 | ||
449 | bool radeon_combios_check_hardcoded_edid(struct radeon_device *rdev) | 449 | bool radeon_combios_check_hardcoded_edid(struct radeon_device *rdev) |
450 | { | 450 | { |
451 | int edid_info; | 451 | int edid_info, size; |
452 | struct edid *edid; | 452 | struct edid *edid; |
453 | unsigned char *raw; | 453 | unsigned char *raw; |
454 | edid_info = combios_get_table_offset(rdev->ddev, COMBIOS_HARDCODED_EDID_TABLE); | 454 | edid_info = combios_get_table_offset(rdev->ddev, COMBIOS_HARDCODED_EDID_TABLE); |
@@ -456,11 +456,12 @@ bool radeon_combios_check_hardcoded_edid(struct radeon_device *rdev) | |||
456 | return false; | 456 | return false; |
457 | 457 | ||
458 | raw = rdev->bios + edid_info; | 458 | raw = rdev->bios + edid_info; |
459 | edid = kmalloc(EDID_LENGTH * (raw[0x7e] + 1), GFP_KERNEL); | 459 | size = EDID_LENGTH * (raw[0x7e] + 1); |
460 | edid = kmalloc(size, GFP_KERNEL); | ||
460 | if (edid == NULL) | 461 | if (edid == NULL) |
461 | return false; | 462 | return false; |
462 | 463 | ||
463 | memcpy((unsigned char *)edid, raw, EDID_LENGTH * (raw[0x7e] + 1)); | 464 | memcpy((unsigned char *)edid, raw, size); |
464 | 465 | ||
465 | if (!drm_edid_is_valid(edid)) { | 466 | if (!drm_edid_is_valid(edid)) { |
466 | kfree(edid); | 467 | kfree(edid); |
@@ -468,6 +469,7 @@ bool radeon_combios_check_hardcoded_edid(struct radeon_device *rdev) | |||
468 | } | 469 | } |
469 | 470 | ||
470 | rdev->mode_info.bios_hardcoded_edid = edid; | 471 | rdev->mode_info.bios_hardcoded_edid = edid; |
472 | rdev->mode_info.bios_hardcoded_edid_size = size; | ||
471 | return true; | 473 | return true; |
472 | } | 474 | } |
473 | 475 | ||
@@ -475,8 +477,17 @@ bool radeon_combios_check_hardcoded_edid(struct radeon_device *rdev) | |||
475 | struct edid * | 477 | struct edid * |
476 | radeon_bios_get_hardcoded_edid(struct radeon_device *rdev) | 478 | radeon_bios_get_hardcoded_edid(struct radeon_device *rdev) |
477 | { | 479 | { |
478 | if (rdev->mode_info.bios_hardcoded_edid) | 480 | struct edid *edid; |
479 | return rdev->mode_info.bios_hardcoded_edid; | 481 | |
482 | if (rdev->mode_info.bios_hardcoded_edid) { | ||
483 | edid = kmalloc(rdev->mode_info.bios_hardcoded_edid_size, GFP_KERNEL); | ||
484 | if (edid) { | ||
485 | memcpy((unsigned char *)edid, | ||
486 | (unsigned char *)rdev->mode_info.bios_hardcoded_edid, | ||
487 | rdev->mode_info.bios_hardcoded_edid_size); | ||
488 | return edid; | ||
489 | } | ||
490 | } | ||
480 | return NULL; | 491 | return NULL; |
481 | } | 492 | } |
482 | 493 | ||
@@ -2068,6 +2079,19 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev) | |||
2068 | DRM_MODE_CONNECTOR_DVII, &ddc_i2c, | 2079 | DRM_MODE_CONNECTOR_DVII, &ddc_i2c, |
2069 | CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_I, | 2080 | CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_I, |
2070 | &hpd); | 2081 | &hpd); |
2082 | /* TV - TV DAC */ | ||
2083 | ddc_i2c.valid = false; | ||
2084 | hpd.hpd = RADEON_HPD_NONE; | ||
2085 | radeon_add_legacy_encoder(dev, | ||
2086 | radeon_get_encoder_enum(dev, | ||
2087 | ATOM_DEVICE_TV1_SUPPORT, | ||
2088 | 2), | ||
2089 | ATOM_DEVICE_TV1_SUPPORT); | ||
2090 | radeon_add_legacy_connector(dev, 2, ATOM_DEVICE_TV1_SUPPORT, | ||
2091 | DRM_MODE_CONNECTOR_SVIDEO, | ||
2092 | &ddc_i2c, | ||
2093 | CONNECTOR_OBJECT_ID_SVIDEO, | ||
2094 | &hpd); | ||
2071 | break; | 2095 | break; |
2072 | default: | 2096 | default: |
2073 | DRM_INFO("Connector table: %d (invalid)\n", | 2097 | DRM_INFO("Connector table: %d (invalid)\n", |
diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c index 3f3c9aac46cc..5f45fa12bb8b 100644 --- a/drivers/gpu/drm/radeon/radeon_connectors.c +++ b/drivers/gpu/drm/radeon/radeon_connectors.c | |||
@@ -40,6 +40,10 @@ radeon_atombios_connected_scratch_regs(struct drm_connector *connector, | |||
40 | struct drm_encoder *encoder, | 40 | struct drm_encoder *encoder, |
41 | bool connected); | 41 | bool connected); |
42 | 42 | ||
43 | extern void | ||
44 | radeon_legacy_backlight_init(struct radeon_encoder *radeon_encoder, | ||
45 | struct drm_connector *drm_connector); | ||
46 | |||
43 | void radeon_connector_hotplug(struct drm_connector *connector) | 47 | void radeon_connector_hotplug(struct drm_connector *connector) |
44 | { | 48 | { |
45 | struct drm_device *dev = connector->dev; | 49 | struct drm_device *dev = connector->dev; |
@@ -629,6 +633,8 @@ static int radeon_vga_mode_valid(struct drm_connector *connector, | |||
629 | static enum drm_connector_status | 633 | static enum drm_connector_status |
630 | radeon_vga_detect(struct drm_connector *connector, bool force) | 634 | radeon_vga_detect(struct drm_connector *connector, bool force) |
631 | { | 635 | { |
636 | struct drm_device *dev = connector->dev; | ||
637 | struct radeon_device *rdev = dev->dev_private; | ||
632 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); | 638 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); |
633 | struct drm_encoder *encoder; | 639 | struct drm_encoder *encoder; |
634 | struct drm_encoder_helper_funcs *encoder_funcs; | 640 | struct drm_encoder_helper_funcs *encoder_funcs; |
@@ -679,6 +685,17 @@ radeon_vga_detect(struct drm_connector *connector, bool force) | |||
679 | 685 | ||
680 | if (ret == connector_status_connected) | 686 | if (ret == connector_status_connected) |
681 | ret = radeon_connector_analog_encoder_conflict_solve(connector, encoder, ret, true); | 687 | ret = radeon_connector_analog_encoder_conflict_solve(connector, encoder, ret, true); |
688 | |||
689 | /* RN50 and some RV100 asics in servers often have a hardcoded EDID in the | ||
690 | * vbios to deal with KVMs. If we have one and are not able to detect a monitor | ||
691 | * by other means, assume the CRT is connected and use that EDID. | ||
692 | */ | ||
693 | if ((!rdev->is_atom_bios) && | ||
694 | (ret == connector_status_disconnected) && | ||
695 | rdev->mode_info.bios_hardcoded_edid_size) { | ||
696 | ret = connector_status_connected; | ||
697 | } | ||
698 | |||
682 | radeon_connector_update_scratch_regs(connector, ret); | 699 | radeon_connector_update_scratch_regs(connector, ret); |
683 | return ret; | 700 | return ret; |
684 | } | 701 | } |
@@ -790,6 +807,8 @@ static int radeon_dvi_get_modes(struct drm_connector *connector) | |||
790 | static enum drm_connector_status | 807 | static enum drm_connector_status |
791 | radeon_dvi_detect(struct drm_connector *connector, bool force) | 808 | radeon_dvi_detect(struct drm_connector *connector, bool force) |
792 | { | 809 | { |
810 | struct drm_device *dev = connector->dev; | ||
811 | struct radeon_device *rdev = dev->dev_private; | ||
793 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); | 812 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); |
794 | struct drm_encoder *encoder = NULL; | 813 | struct drm_encoder *encoder = NULL; |
795 | struct drm_encoder_helper_funcs *encoder_funcs; | 814 | struct drm_encoder_helper_funcs *encoder_funcs; |
@@ -829,8 +848,6 @@ radeon_dvi_detect(struct drm_connector *connector, bool force) | |||
829 | * you don't really know what's connected to which port as both are digital. | 848 | * you don't really know what's connected to which port as both are digital. |
830 | */ | 849 | */ |
831 | if (radeon_connector->shared_ddc && (ret == connector_status_connected)) { | 850 | if (radeon_connector->shared_ddc && (ret == connector_status_connected)) { |
832 | struct drm_device *dev = connector->dev; | ||
833 | struct radeon_device *rdev = dev->dev_private; | ||
834 | struct drm_connector *list_connector; | 851 | struct drm_connector *list_connector; |
835 | struct radeon_connector *list_radeon_connector; | 852 | struct radeon_connector *list_radeon_connector; |
836 | list_for_each_entry(list_connector, &dev->mode_config.connector_list, head) { | 853 | list_for_each_entry(list_connector, &dev->mode_config.connector_list, head) { |
@@ -895,6 +912,19 @@ radeon_dvi_detect(struct drm_connector *connector, bool force) | |||
895 | ret = radeon_connector_analog_encoder_conflict_solve(connector, encoder, ret, true); | 912 | ret = radeon_connector_analog_encoder_conflict_solve(connector, encoder, ret, true); |
896 | } | 913 | } |
897 | 914 | ||
915 | /* RN50 and some RV100 asics in servers often have a hardcoded EDID in the | ||
916 | * vbios to deal with KVMs. If we have one and are not able to detect a monitor | ||
917 | * by other means, assume the DFP is connected and use that EDID. In most | ||
918 | * cases the DVI port is actually a virtual KVM port connected to the service | ||
919 | * processor. | ||
920 | */ | ||
921 | if ((!rdev->is_atom_bios) && | ||
922 | (ret == connector_status_disconnected) && | ||
923 | rdev->mode_info.bios_hardcoded_edid_size) { | ||
924 | radeon_connector->use_digital = true; | ||
925 | ret = connector_status_connected; | ||
926 | } | ||
927 | |||
898 | out: | 928 | out: |
899 | /* updated in get modes as well since we need to know if it's analog or digital */ | 929 | /* updated in get modes as well since we need to know if it's analog or digital */ |
900 | radeon_connector_update_scratch_regs(connector, ret); | 930 | radeon_connector_update_scratch_regs(connector, ret); |
@@ -1169,7 +1199,7 @@ radeon_add_atom_connector(struct drm_device *dev, | |||
1169 | if (router->ddc_valid || router->cd_valid) { | 1199 | if (router->ddc_valid || router->cd_valid) { |
1170 | radeon_connector->router_bus = radeon_i2c_lookup(rdev, &router->i2c_info); | 1200 | radeon_connector->router_bus = radeon_i2c_lookup(rdev, &router->i2c_info); |
1171 | if (!radeon_connector->router_bus) | 1201 | if (!radeon_connector->router_bus) |
1172 | goto failed; | 1202 | DRM_ERROR("Failed to assign router i2c bus! Check dmesg for i2c errors.\n"); |
1173 | } | 1203 | } |
1174 | switch (connector_type) { | 1204 | switch (connector_type) { |
1175 | case DRM_MODE_CONNECTOR_VGA: | 1205 | case DRM_MODE_CONNECTOR_VGA: |
@@ -1178,7 +1208,7 @@ radeon_add_atom_connector(struct drm_device *dev, | |||
1178 | if (i2c_bus->valid) { | 1208 | if (i2c_bus->valid) { |
1179 | radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus); | 1209 | radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus); |
1180 | if (!radeon_connector->ddc_bus) | 1210 | if (!radeon_connector->ddc_bus) |
1181 | goto failed; | 1211 | DRM_ERROR("VGA: Failed to assign ddc bus! Check dmesg for i2c errors.\n"); |
1182 | } | 1212 | } |
1183 | radeon_connector->dac_load_detect = true; | 1213 | radeon_connector->dac_load_detect = true; |
1184 | drm_connector_attach_property(&radeon_connector->base, | 1214 | drm_connector_attach_property(&radeon_connector->base, |
@@ -1196,7 +1226,7 @@ radeon_add_atom_connector(struct drm_device *dev, | |||
1196 | if (i2c_bus->valid) { | 1226 | if (i2c_bus->valid) { |
1197 | radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus); | 1227 | radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus); |
1198 | if (!radeon_connector->ddc_bus) | 1228 | if (!radeon_connector->ddc_bus) |
1199 | goto failed; | 1229 | DRM_ERROR("DVIA: Failed to assign ddc bus! Check dmesg for i2c errors.\n"); |
1200 | } | 1230 | } |
1201 | radeon_connector->dac_load_detect = true; | 1231 | radeon_connector->dac_load_detect = true; |
1202 | drm_connector_attach_property(&radeon_connector->base, | 1232 | drm_connector_attach_property(&radeon_connector->base, |
@@ -1219,7 +1249,7 @@ radeon_add_atom_connector(struct drm_device *dev, | |||
1219 | if (i2c_bus->valid) { | 1249 | if (i2c_bus->valid) { |
1220 | radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus); | 1250 | radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus); |
1221 | if (!radeon_connector->ddc_bus) | 1251 | if (!radeon_connector->ddc_bus) |
1222 | goto failed; | 1252 | DRM_ERROR("DVI: Failed to assign ddc bus! Check dmesg for i2c errors.\n"); |
1223 | } | 1253 | } |
1224 | subpixel_order = SubPixelHorizontalRGB; | 1254 | subpixel_order = SubPixelHorizontalRGB; |
1225 | drm_connector_attach_property(&radeon_connector->base, | 1255 | drm_connector_attach_property(&radeon_connector->base, |
@@ -1260,7 +1290,7 @@ radeon_add_atom_connector(struct drm_device *dev, | |||
1260 | if (i2c_bus->valid) { | 1290 | if (i2c_bus->valid) { |
1261 | radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus); | 1291 | radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus); |
1262 | if (!radeon_connector->ddc_bus) | 1292 | if (!radeon_connector->ddc_bus) |
1263 | goto failed; | 1293 | DRM_ERROR("HDMI: Failed to assign ddc bus! Check dmesg for i2c errors.\n"); |
1264 | } | 1294 | } |
1265 | drm_connector_attach_property(&radeon_connector->base, | 1295 | drm_connector_attach_property(&radeon_connector->base, |
1266 | rdev->mode_info.coherent_mode_property, | 1296 | rdev->mode_info.coherent_mode_property, |
@@ -1299,10 +1329,10 @@ radeon_add_atom_connector(struct drm_device *dev, | |||
1299 | else | 1329 | else |
1300 | radeon_dig_connector->dp_i2c_bus = radeon_i2c_create_dp(dev, i2c_bus, "DP-auxch"); | 1330 | radeon_dig_connector->dp_i2c_bus = radeon_i2c_create_dp(dev, i2c_bus, "DP-auxch"); |
1301 | if (!radeon_dig_connector->dp_i2c_bus) | 1331 | if (!radeon_dig_connector->dp_i2c_bus) |
1302 | goto failed; | 1332 | DRM_ERROR("DP: Failed to assign dp ddc bus! Check dmesg for i2c errors.\n"); |
1303 | radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus); | 1333 | radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus); |
1304 | if (!radeon_connector->ddc_bus) | 1334 | if (!radeon_connector->ddc_bus) |
1305 | goto failed; | 1335 | DRM_ERROR("DP: Failed to assign ddc bus! Check dmesg for i2c errors.\n"); |
1306 | } | 1336 | } |
1307 | subpixel_order = SubPixelHorizontalRGB; | 1337 | subpixel_order = SubPixelHorizontalRGB; |
1308 | drm_connector_attach_property(&radeon_connector->base, | 1338 | drm_connector_attach_property(&radeon_connector->base, |
@@ -1351,7 +1381,7 @@ radeon_add_atom_connector(struct drm_device *dev, | |||
1351 | if (i2c_bus->valid) { | 1381 | if (i2c_bus->valid) { |
1352 | radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus); | 1382 | radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus); |
1353 | if (!radeon_connector->ddc_bus) | 1383 | if (!radeon_connector->ddc_bus) |
1354 | goto failed; | 1384 | DRM_ERROR("LVDS: Failed to assign ddc bus! Check dmesg for i2c errors.\n"); |
1355 | } | 1385 | } |
1356 | drm_connector_attach_property(&radeon_connector->base, | 1386 | drm_connector_attach_property(&radeon_connector->base, |
1357 | dev->mode_config.scaling_mode_property, | 1387 | dev->mode_config.scaling_mode_property, |
@@ -1427,7 +1457,7 @@ radeon_add_legacy_connector(struct drm_device *dev, | |||
1427 | if (i2c_bus->valid) { | 1457 | if (i2c_bus->valid) { |
1428 | radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus); | 1458 | radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus); |
1429 | if (!radeon_connector->ddc_bus) | 1459 | if (!radeon_connector->ddc_bus) |
1430 | goto failed; | 1460 | DRM_ERROR("VGA: Failed to assign ddc bus! Check dmesg for i2c errors.\n"); |
1431 | } | 1461 | } |
1432 | radeon_connector->dac_load_detect = true; | 1462 | radeon_connector->dac_load_detect = true; |
1433 | drm_connector_attach_property(&radeon_connector->base, | 1463 | drm_connector_attach_property(&radeon_connector->base, |
@@ -1445,7 +1475,7 @@ radeon_add_legacy_connector(struct drm_device *dev, | |||
1445 | if (i2c_bus->valid) { | 1475 | if (i2c_bus->valid) { |
1446 | radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus); | 1476 | radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus); |
1447 | if (!radeon_connector->ddc_bus) | 1477 | if (!radeon_connector->ddc_bus) |
1448 | goto failed; | 1478 | DRM_ERROR("DVIA: Failed to assign ddc bus! Check dmesg for i2c errors.\n"); |
1449 | } | 1479 | } |
1450 | radeon_connector->dac_load_detect = true; | 1480 | radeon_connector->dac_load_detect = true; |
1451 | drm_connector_attach_property(&radeon_connector->base, | 1481 | drm_connector_attach_property(&radeon_connector->base, |
@@ -1463,7 +1493,7 @@ radeon_add_legacy_connector(struct drm_device *dev, | |||
1463 | if (i2c_bus->valid) { | 1493 | if (i2c_bus->valid) { |
1464 | radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus); | 1494 | radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus); |
1465 | if (!radeon_connector->ddc_bus) | 1495 | if (!radeon_connector->ddc_bus) |
1466 | goto failed; | 1496 | DRM_ERROR("DVI: Failed to assign ddc bus! Check dmesg for i2c errors.\n"); |
1467 | } | 1497 | } |
1468 | if (connector_type == DRM_MODE_CONNECTOR_DVII) { | 1498 | if (connector_type == DRM_MODE_CONNECTOR_DVII) { |
1469 | radeon_connector->dac_load_detect = true; | 1499 | radeon_connector->dac_load_detect = true; |
@@ -1508,7 +1538,7 @@ radeon_add_legacy_connector(struct drm_device *dev, | |||
1508 | if (i2c_bus->valid) { | 1538 | if (i2c_bus->valid) { |
1509 | radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus); | 1539 | radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus); |
1510 | if (!radeon_connector->ddc_bus) | 1540 | if (!radeon_connector->ddc_bus) |
1511 | goto failed; | 1541 | DRM_ERROR("LVDS: Failed to assign ddc bus! Check dmesg for i2c errors.\n"); |
1512 | } | 1542 | } |
1513 | drm_connector_attach_property(&radeon_connector->base, | 1543 | drm_connector_attach_property(&radeon_connector->base, |
1514 | dev->mode_config.scaling_mode_property, | 1544 | dev->mode_config.scaling_mode_property, |
@@ -1526,9 +1556,15 @@ radeon_add_legacy_connector(struct drm_device *dev, | |||
1526 | connector->polled = DRM_CONNECTOR_POLL_HPD; | 1556 | connector->polled = DRM_CONNECTOR_POLL_HPD; |
1527 | connector->display_info.subpixel_order = subpixel_order; | 1557 | connector->display_info.subpixel_order = subpixel_order; |
1528 | drm_sysfs_connector_add(connector); | 1558 | drm_sysfs_connector_add(connector); |
1529 | return; | 1559 | if (connector_type == DRM_MODE_CONNECTOR_LVDS) { |
1560 | struct drm_encoder *drm_encoder; | ||
1530 | 1561 | ||
1531 | failed: | 1562 | list_for_each_entry(drm_encoder, &dev->mode_config.encoder_list, head) { |
1532 | drm_connector_cleanup(connector); | 1563 | struct radeon_encoder *radeon_encoder; |
1533 | kfree(connector); | 1564 | |
1565 | radeon_encoder = to_radeon_encoder(drm_encoder); | ||
1566 | if (radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_LVDS) | ||
1567 | radeon_legacy_backlight_init(radeon_encoder, connector); | ||
1568 | } | ||
1569 | } | ||
1534 | } | 1570 | } |
diff --git a/drivers/gpu/drm/radeon/radeon_cp.c b/drivers/gpu/drm/radeon/radeon_cp.c index 3d599e33b9cc..75867792a4e2 100644 --- a/drivers/gpu/drm/radeon/radeon_cp.c +++ b/drivers/gpu/drm/radeon/radeon_cp.c | |||
@@ -244,7 +244,7 @@ void radeon_write_agp_base(drm_radeon_private_t *dev_priv, u64 agp_base) | |||
244 | u32 agp_base_lo = agp_base & 0xffffffff; | 244 | u32 agp_base_lo = agp_base & 0xffffffff; |
245 | u32 r6xx_agp_base = (agp_base >> 22) & 0x3ffff; | 245 | u32 r6xx_agp_base = (agp_base >> 22) & 0x3ffff; |
246 | 246 | ||
247 | /* R6xx/R7xx must be aligned to a 4MB boundry */ | 247 | /* R6xx/R7xx must be aligned to a 4MB boundary */ |
248 | if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_RV770) | 248 | if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_RV770) |
249 | RADEON_WRITE(R700_MC_VM_AGP_BASE, r6xx_agp_base); | 249 | RADEON_WRITE(R700_MC_VM_AGP_BASE, r6xx_agp_base); |
250 | else if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600) | 250 | else if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600) |
diff --git a/drivers/gpu/drm/radeon/radeon_cursor.c b/drivers/gpu/drm/radeon/radeon_cursor.c index 017ac54920fb..bdf2fa1189ae 100644 --- a/drivers/gpu/drm/radeon/radeon_cursor.c +++ b/drivers/gpu/drm/radeon/radeon_cursor.c | |||
@@ -226,7 +226,7 @@ int radeon_crtc_cursor_move(struct drm_crtc *crtc, | |||
226 | y += crtc->y; | 226 | y += crtc->y; |
227 | DRM_DEBUG("x %d y %d c->x %d c->y %d\n", x, y, crtc->x, crtc->y); | 227 | DRM_DEBUG("x %d y %d c->x %d c->y %d\n", x, y, crtc->x, crtc->y); |
228 | 228 | ||
229 | /* avivo cursor image can't end on 128 pixel boundry or | 229 | /* avivo cursor image can't end on 128 pixel boundary or |
230 | * go past the end of the frame if both crtcs are enabled | 230 | * go past the end of the frame if both crtcs are enabled |
231 | */ | 231 | */ |
232 | list_for_each_entry(crtc_p, &crtc->dev->mode_config.crtc_list, head) { | 232 | list_for_each_entry(crtc_p, &crtc->dev->mode_config.crtc_list, head) { |
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c index f0209be7a34b..890217e678d3 100644 --- a/drivers/gpu/drm/radeon/radeon_device.c +++ b/drivers/gpu/drm/radeon/radeon_device.c | |||
@@ -262,7 +262,7 @@ int radeon_wb_init(struct radeon_device *rdev) | |||
262 | * Note: GTT start, end, size should be initialized before calling this | 262 | * Note: GTT start, end, size should be initialized before calling this |
263 | * function on AGP platform. | 263 | * function on AGP platform. |
264 | * | 264 | * |
265 | * Note: We don't explictly enforce VRAM start to be aligned on VRAM size, | 265 | * Note: We don't explicitly enforce VRAM start to be aligned on VRAM size, |
266 | * this shouldn't be a problem as we are using the PCI aperture as a reference. | 266 | * this shouldn't be a problem as we are using the PCI aperture as a reference. |
267 | * Otherwise this would be needed for rv280, all r3xx, and all r4xx, but | 267 | * Otherwise this would be needed for rv280, all r3xx, and all r4xx, but |
268 | * not IGP. | 268 | * not IGP. |
diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c index 4be58793dc17..bdbab5c43bdc 100644 --- a/drivers/gpu/drm/radeon/radeon_display.c +++ b/drivers/gpu/drm/radeon/radeon_display.c | |||
@@ -1492,7 +1492,7 @@ bool radeon_crtc_scaling_mode_fixup(struct drm_crtc *crtc, | |||
1492 | * | 1492 | * |
1493 | * \return Flags, or'ed together as follows: | 1493 | * \return Flags, or'ed together as follows: |
1494 | * | 1494 | * |
1495 | * DRM_SCANOUTPOS_VALID = Query successfull. | 1495 | * DRM_SCANOUTPOS_VALID = Query successful. |
1496 | * DRM_SCANOUTPOS_INVBL = Inside vblank. | 1496 | * DRM_SCANOUTPOS_INVBL = Inside vblank. |
1497 | * DRM_SCANOUTPOS_ACCURATE = Returned position is accurate. A lack of | 1497 | * DRM_SCANOUTPOS_ACCURATE = Returned position is accurate. A lack of |
1498 | * this flag means that returned position may be offset by a constant but | 1498 | * this flag means that returned position may be offset by a constant but |
diff --git a/drivers/gpu/drm/radeon/radeon_drv.h b/drivers/gpu/drm/radeon/radeon_drv.h index 5cba46b9779a..a1b59ca96d01 100644 --- a/drivers/gpu/drm/radeon/radeon_drv.h +++ b/drivers/gpu/drm/radeon/radeon_drv.h | |||
@@ -271,7 +271,7 @@ typedef struct drm_radeon_private { | |||
271 | 271 | ||
272 | int have_z_offset; | 272 | int have_z_offset; |
273 | 273 | ||
274 | /* starting from here on, data is preserved accross an open */ | 274 | /* starting from here on, data is preserved across an open */ |
275 | uint32_t flags; /* see radeon_chip_flags */ | 275 | uint32_t flags; /* see radeon_chip_flags */ |
276 | resource_size_t fb_aper_offset; | 276 | resource_size_t fb_aper_offset; |
277 | 277 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_fence.c b/drivers/gpu/drm/radeon/radeon_fence.c index ab83472553c6..1f8229436570 100644 --- a/drivers/gpu/drm/radeon/radeon_fence.c +++ b/drivers/gpu/drm/radeon/radeon_fence.c | |||
@@ -79,7 +79,7 @@ static bool radeon_fence_poll_locked(struct radeon_device *rdev) | |||
79 | scratch_index = R600_WB_EVENT_OFFSET + rdev->fence_drv.scratch_reg - rdev->scratch.reg_base; | 79 | scratch_index = R600_WB_EVENT_OFFSET + rdev->fence_drv.scratch_reg - rdev->scratch.reg_base; |
80 | else | 80 | else |
81 | scratch_index = RADEON_WB_SCRATCH_OFFSET + rdev->fence_drv.scratch_reg - rdev->scratch.reg_base; | 81 | scratch_index = RADEON_WB_SCRATCH_OFFSET + rdev->fence_drv.scratch_reg - rdev->scratch.reg_base; |
82 | seq = rdev->wb.wb[scratch_index/4]; | 82 | seq = le32_to_cpu(rdev->wb.wb[scratch_index/4]); |
83 | } else | 83 | } else |
84 | seq = RREG32(rdev->fence_drv.scratch_reg); | 84 | seq = RREG32(rdev->fence_drv.scratch_reg); |
85 | if (seq != rdev->fence_drv.last_seq) { | 85 | if (seq != rdev->fence_drv.last_seq) { |
diff --git a/drivers/gpu/drm/radeon/radeon_gart.c b/drivers/gpu/drm/radeon/radeon_gart.c index f0534ef2f331..8a955bbdb608 100644 --- a/drivers/gpu/drm/radeon/radeon_gart.c +++ b/drivers/gpu/drm/radeon/radeon_gart.c | |||
@@ -285,4 +285,6 @@ void radeon_gart_fini(struct radeon_device *rdev) | |||
285 | rdev->gart.pages = NULL; | 285 | rdev->gart.pages = NULL; |
286 | rdev->gart.pages_addr = NULL; | 286 | rdev->gart.pages_addr = NULL; |
287 | rdev->gart.ttm_alloced = NULL; | 287 | rdev->gart.ttm_alloced = NULL; |
288 | |||
289 | radeon_dummy_page_fini(rdev); | ||
288 | } | 290 | } |
diff --git a/drivers/gpu/drm/radeon/radeon_i2c.c b/drivers/gpu/drm/radeon/radeon_i2c.c index ded2a45bc95c..983cbac75af0 100644 --- a/drivers/gpu/drm/radeon/radeon_i2c.c +++ b/drivers/gpu/drm/radeon/radeon_i2c.c | |||
@@ -1062,7 +1062,7 @@ void radeon_i2c_get_byte(struct radeon_i2c_chan *i2c_bus, | |||
1062 | *val = in_buf[0]; | 1062 | *val = in_buf[0]; |
1063 | DRM_DEBUG("val = 0x%02x\n", *val); | 1063 | DRM_DEBUG("val = 0x%02x\n", *val); |
1064 | } else { | 1064 | } else { |
1065 | DRM_ERROR("i2c 0x%02x 0x%02x read failed\n", | 1065 | DRM_DEBUG("i2c 0x%02x 0x%02x read failed\n", |
1066 | addr, *val); | 1066 | addr, *val); |
1067 | } | 1067 | } |
1068 | } | 1068 | } |
@@ -1084,7 +1084,7 @@ void radeon_i2c_put_byte(struct radeon_i2c_chan *i2c_bus, | |||
1084 | out_buf[1] = val; | 1084 | out_buf[1] = val; |
1085 | 1085 | ||
1086 | if (i2c_transfer(&i2c_bus->adapter, &msg, 1) != 1) | 1086 | if (i2c_transfer(&i2c_bus->adapter, &msg, 1) != 1) |
1087 | DRM_ERROR("i2c 0x%02x 0x%02x write failed\n", | 1087 | DRM_DEBUG("i2c 0x%02x 0x%02x write failed\n", |
1088 | addr, val); | 1088 | addr, val); |
1089 | } | 1089 | } |
1090 | 1090 | ||
@@ -1096,6 +1096,9 @@ void radeon_router_select_ddc_port(struct radeon_connector *radeon_connector) | |||
1096 | if (!radeon_connector->router.ddc_valid) | 1096 | if (!radeon_connector->router.ddc_valid) |
1097 | return; | 1097 | return; |
1098 | 1098 | ||
1099 | if (!radeon_connector->router_bus) | ||
1100 | return; | ||
1101 | |||
1099 | radeon_i2c_get_byte(radeon_connector->router_bus, | 1102 | radeon_i2c_get_byte(radeon_connector->router_bus, |
1100 | radeon_connector->router.i2c_addr, | 1103 | radeon_connector->router.i2c_addr, |
1101 | 0x3, &val); | 1104 | 0x3, &val); |
@@ -1121,6 +1124,9 @@ void radeon_router_select_cd_port(struct radeon_connector *radeon_connector) | |||
1121 | if (!radeon_connector->router.cd_valid) | 1124 | if (!radeon_connector->router.cd_valid) |
1122 | return; | 1125 | return; |
1123 | 1126 | ||
1127 | if (!radeon_connector->router_bus) | ||
1128 | return; | ||
1129 | |||
1124 | radeon_i2c_get_byte(radeon_connector->router_bus, | 1130 | radeon_i2c_get_byte(radeon_connector->router_bus, |
1125 | radeon_connector->router.i2c_addr, | 1131 | radeon_connector->router.i2c_addr, |
1126 | 0x3, &val); | 1132 | 0x3, &val); |
diff --git a/drivers/gpu/drm/radeon/radeon_legacy_crtc.c b/drivers/gpu/drm/radeon/radeon_legacy_crtc.c index 66c9af1b3d96..41a5d48e657b 100644 --- a/drivers/gpu/drm/radeon/radeon_legacy_crtc.c +++ b/drivers/gpu/drm/radeon/radeon_legacy_crtc.c | |||
@@ -889,7 +889,7 @@ static void radeon_set_pll(struct drm_crtc *crtc, struct drm_display_mode *mode) | |||
889 | } | 889 | } |
890 | 890 | ||
891 | if (rdev->flags & RADEON_IS_MOBILITY) { | 891 | if (rdev->flags & RADEON_IS_MOBILITY) { |
892 | /* A temporal workaround for the occational blanking on certain laptop panels. | 892 | /* A temporal workaround for the occasional blanking on certain laptop panels. |
893 | This appears to related to the PLL divider registers (fail to lock?). | 893 | This appears to related to the PLL divider registers (fail to lock?). |
894 | It occurs even when all dividers are the same with their old settings. | 894 | It occurs even when all dividers are the same with their old settings. |
895 | In this case we really don't need to fiddle with PLL registers. | 895 | In this case we really don't need to fiddle with PLL registers. |
diff --git a/drivers/gpu/drm/radeon/radeon_legacy_encoders.c b/drivers/gpu/drm/radeon/radeon_legacy_encoders.c index 59f834ba283d..2f46e0c8df53 100644 --- a/drivers/gpu/drm/radeon/radeon_legacy_encoders.c +++ b/drivers/gpu/drm/radeon/radeon_legacy_encoders.c | |||
@@ -28,6 +28,10 @@ | |||
28 | #include "radeon_drm.h" | 28 | #include "radeon_drm.h" |
29 | #include "radeon.h" | 29 | #include "radeon.h" |
30 | #include "atom.h" | 30 | #include "atom.h" |
31 | #include <linux/backlight.h> | ||
32 | #ifdef CONFIG_PMAC_BACKLIGHT | ||
33 | #include <asm/backlight.h> | ||
34 | #endif | ||
31 | 35 | ||
32 | static void radeon_legacy_encoder_disable(struct drm_encoder *encoder) | 36 | static void radeon_legacy_encoder_disable(struct drm_encoder *encoder) |
33 | { | 37 | { |
@@ -39,7 +43,7 @@ static void radeon_legacy_encoder_disable(struct drm_encoder *encoder) | |||
39 | radeon_encoder->active_device = 0; | 43 | radeon_encoder->active_device = 0; |
40 | } | 44 | } |
41 | 45 | ||
42 | static void radeon_legacy_lvds_dpms(struct drm_encoder *encoder, int mode) | 46 | static void radeon_legacy_lvds_update(struct drm_encoder *encoder, int mode) |
43 | { | 47 | { |
44 | struct drm_device *dev = encoder->dev; | 48 | struct drm_device *dev = encoder->dev; |
45 | struct radeon_device *rdev = dev->dev_private; | 49 | struct radeon_device *rdev = dev->dev_private; |
@@ -47,15 +51,23 @@ static void radeon_legacy_lvds_dpms(struct drm_encoder *encoder, int mode) | |||
47 | uint32_t lvds_gen_cntl, lvds_pll_cntl, pixclks_cntl, disp_pwr_man; | 51 | uint32_t lvds_gen_cntl, lvds_pll_cntl, pixclks_cntl, disp_pwr_man; |
48 | int panel_pwr_delay = 2000; | 52 | int panel_pwr_delay = 2000; |
49 | bool is_mac = false; | 53 | bool is_mac = false; |
54 | uint8_t backlight_level; | ||
50 | DRM_DEBUG_KMS("\n"); | 55 | DRM_DEBUG_KMS("\n"); |
51 | 56 | ||
57 | lvds_gen_cntl = RREG32(RADEON_LVDS_GEN_CNTL); | ||
58 | backlight_level = (lvds_gen_cntl >> RADEON_LVDS_BL_MOD_LEVEL_SHIFT) & 0xff; | ||
59 | |||
52 | if (radeon_encoder->enc_priv) { | 60 | if (radeon_encoder->enc_priv) { |
53 | if (rdev->is_atom_bios) { | 61 | if (rdev->is_atom_bios) { |
54 | struct radeon_encoder_atom_dig *lvds = radeon_encoder->enc_priv; | 62 | struct radeon_encoder_atom_dig *lvds = radeon_encoder->enc_priv; |
55 | panel_pwr_delay = lvds->panel_pwr_delay; | 63 | panel_pwr_delay = lvds->panel_pwr_delay; |
64 | if (lvds->bl_dev) | ||
65 | backlight_level = lvds->backlight_level; | ||
56 | } else { | 66 | } else { |
57 | struct radeon_encoder_lvds *lvds = radeon_encoder->enc_priv; | 67 | struct radeon_encoder_lvds *lvds = radeon_encoder->enc_priv; |
58 | panel_pwr_delay = lvds->panel_pwr_delay; | 68 | panel_pwr_delay = lvds->panel_pwr_delay; |
69 | if (lvds->bl_dev) | ||
70 | backlight_level = lvds->backlight_level; | ||
59 | } | 71 | } |
60 | } | 72 | } |
61 | 73 | ||
@@ -82,11 +94,13 @@ static void radeon_legacy_lvds_dpms(struct drm_encoder *encoder, int mode) | |||
82 | lvds_pll_cntl &= ~RADEON_LVDS_PLL_RESET; | 94 | lvds_pll_cntl &= ~RADEON_LVDS_PLL_RESET; |
83 | WREG32(RADEON_LVDS_PLL_CNTL, lvds_pll_cntl); | 95 | WREG32(RADEON_LVDS_PLL_CNTL, lvds_pll_cntl); |
84 | 96 | ||
85 | lvds_gen_cntl = RREG32(RADEON_LVDS_GEN_CNTL); | 97 | lvds_gen_cntl &= ~(RADEON_LVDS_DISPLAY_DIS | |
86 | lvds_gen_cntl |= (RADEON_LVDS_ON | RADEON_LVDS_EN | RADEON_LVDS_DIGON | RADEON_LVDS_BLON); | 98 | RADEON_LVDS_BL_MOD_LEVEL_MASK); |
99 | lvds_gen_cntl |= (RADEON_LVDS_ON | RADEON_LVDS_EN | | ||
100 | RADEON_LVDS_DIGON | RADEON_LVDS_BLON | | ||
101 | (backlight_level << RADEON_LVDS_BL_MOD_LEVEL_SHIFT)); | ||
87 | if (is_mac) | 102 | if (is_mac) |
88 | lvds_gen_cntl |= RADEON_LVDS_BL_MOD_EN; | 103 | lvds_gen_cntl |= RADEON_LVDS_BL_MOD_EN; |
89 | lvds_gen_cntl &= ~(RADEON_LVDS_DISPLAY_DIS); | ||
90 | udelay(panel_pwr_delay * 1000); | 104 | udelay(panel_pwr_delay * 1000); |
91 | WREG32(RADEON_LVDS_GEN_CNTL, lvds_gen_cntl); | 105 | WREG32(RADEON_LVDS_GEN_CNTL, lvds_gen_cntl); |
92 | break; | 106 | break; |
@@ -95,7 +109,6 @@ static void radeon_legacy_lvds_dpms(struct drm_encoder *encoder, int mode) | |||
95 | case DRM_MODE_DPMS_OFF: | 109 | case DRM_MODE_DPMS_OFF: |
96 | pixclks_cntl = RREG32_PLL(RADEON_PIXCLKS_CNTL); | 110 | pixclks_cntl = RREG32_PLL(RADEON_PIXCLKS_CNTL); |
97 | WREG32_PLL_P(RADEON_PIXCLKS_CNTL, 0, ~RADEON_PIXCLK_LVDS_ALWAYS_ONb); | 111 | WREG32_PLL_P(RADEON_PIXCLKS_CNTL, 0, ~RADEON_PIXCLK_LVDS_ALWAYS_ONb); |
98 | lvds_gen_cntl = RREG32(RADEON_LVDS_GEN_CNTL); | ||
99 | lvds_gen_cntl |= RADEON_LVDS_DISPLAY_DIS; | 112 | lvds_gen_cntl |= RADEON_LVDS_DISPLAY_DIS; |
100 | if (is_mac) { | 113 | if (is_mac) { |
101 | lvds_gen_cntl &= ~RADEON_LVDS_BL_MOD_EN; | 114 | lvds_gen_cntl &= ~RADEON_LVDS_BL_MOD_EN; |
@@ -119,6 +132,25 @@ static void radeon_legacy_lvds_dpms(struct drm_encoder *encoder, int mode) | |||
119 | 132 | ||
120 | } | 133 | } |
121 | 134 | ||
135 | static void radeon_legacy_lvds_dpms(struct drm_encoder *encoder, int mode) | ||
136 | { | ||
137 | struct radeon_device *rdev = encoder->dev->dev_private; | ||
138 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); | ||
139 | DRM_DEBUG("\n"); | ||
140 | |||
141 | if (radeon_encoder->enc_priv) { | ||
142 | if (rdev->is_atom_bios) { | ||
143 | struct radeon_encoder_atom_dig *lvds = radeon_encoder->enc_priv; | ||
144 | lvds->dpms_mode = mode; | ||
145 | } else { | ||
146 | struct radeon_encoder_lvds *lvds = radeon_encoder->enc_priv; | ||
147 | lvds->dpms_mode = mode; | ||
148 | } | ||
149 | } | ||
150 | |||
151 | radeon_legacy_lvds_update(encoder, mode); | ||
152 | } | ||
153 | |||
122 | static void radeon_legacy_lvds_prepare(struct drm_encoder *encoder) | 154 | static void radeon_legacy_lvds_prepare(struct drm_encoder *encoder) |
123 | { | 155 | { |
124 | struct radeon_device *rdev = encoder->dev->dev_private; | 156 | struct radeon_device *rdev = encoder->dev->dev_private; |
@@ -237,9 +269,222 @@ static const struct drm_encoder_helper_funcs radeon_legacy_lvds_helper_funcs = { | |||
237 | .disable = radeon_legacy_encoder_disable, | 269 | .disable = radeon_legacy_encoder_disable, |
238 | }; | 270 | }; |
239 | 271 | ||
272 | #if defined(CONFIG_BACKLIGHT_CLASS_DEVICE) || defined(CONFIG_BACKLIGHT_CLASS_DEVICE_MODULE) | ||
273 | |||
274 | #define MAX_RADEON_LEVEL 0xFF | ||
275 | |||
276 | struct radeon_backlight_privdata { | ||
277 | struct radeon_encoder *encoder; | ||
278 | uint8_t negative; | ||
279 | }; | ||
280 | |||
281 | static uint8_t radeon_legacy_lvds_level(struct backlight_device *bd) | ||
282 | { | ||
283 | struct radeon_backlight_privdata *pdata = bl_get_data(bd); | ||
284 | uint8_t level; | ||
285 | |||
286 | /* Convert brightness to hardware level */ | ||
287 | if (bd->props.brightness < 0) | ||
288 | level = 0; | ||
289 | else if (bd->props.brightness > MAX_RADEON_LEVEL) | ||
290 | level = MAX_RADEON_LEVEL; | ||
291 | else | ||
292 | level = bd->props.brightness; | ||
293 | |||
294 | if (pdata->negative) | ||
295 | level = MAX_RADEON_LEVEL - level; | ||
296 | |||
297 | return level; | ||
298 | } | ||
299 | |||
300 | static int radeon_legacy_backlight_update_status(struct backlight_device *bd) | ||
301 | { | ||
302 | struct radeon_backlight_privdata *pdata = bl_get_data(bd); | ||
303 | struct radeon_encoder *radeon_encoder = pdata->encoder; | ||
304 | struct drm_device *dev = radeon_encoder->base.dev; | ||
305 | struct radeon_device *rdev = dev->dev_private; | ||
306 | int dpms_mode = DRM_MODE_DPMS_ON; | ||
307 | |||
308 | if (radeon_encoder->enc_priv) { | ||
309 | if (rdev->is_atom_bios) { | ||
310 | struct radeon_encoder_atom_dig *lvds = radeon_encoder->enc_priv; | ||
311 | dpms_mode = lvds->dpms_mode; | ||
312 | lvds->backlight_level = radeon_legacy_lvds_level(bd); | ||
313 | } else { | ||
314 | struct radeon_encoder_lvds *lvds = radeon_encoder->enc_priv; | ||
315 | dpms_mode = lvds->dpms_mode; | ||
316 | lvds->backlight_level = radeon_legacy_lvds_level(bd); | ||
317 | } | ||
318 | } | ||
319 | |||
320 | if (bd->props.brightness > 0) | ||
321 | radeon_legacy_lvds_update(&radeon_encoder->base, dpms_mode); | ||
322 | else | ||
323 | radeon_legacy_lvds_update(&radeon_encoder->base, DRM_MODE_DPMS_OFF); | ||
324 | |||
325 | return 0; | ||
326 | } | ||
327 | |||
328 | static int radeon_legacy_backlight_get_brightness(struct backlight_device *bd) | ||
329 | { | ||
330 | struct radeon_backlight_privdata *pdata = bl_get_data(bd); | ||
331 | struct radeon_encoder *radeon_encoder = pdata->encoder; | ||
332 | struct drm_device *dev = radeon_encoder->base.dev; | ||
333 | struct radeon_device *rdev = dev->dev_private; | ||
334 | uint8_t backlight_level; | ||
335 | |||
336 | backlight_level = (RREG32(RADEON_LVDS_GEN_CNTL) >> | ||
337 | RADEON_LVDS_BL_MOD_LEVEL_SHIFT) & 0xff; | ||
338 | |||
339 | return pdata->negative ? MAX_RADEON_LEVEL - backlight_level : backlight_level; | ||
340 | } | ||
341 | |||
342 | static const struct backlight_ops radeon_backlight_ops = { | ||
343 | .get_brightness = radeon_legacy_backlight_get_brightness, | ||
344 | .update_status = radeon_legacy_backlight_update_status, | ||
345 | }; | ||
346 | |||
347 | void radeon_legacy_backlight_init(struct radeon_encoder *radeon_encoder, | ||
348 | struct drm_connector *drm_connector) | ||
349 | { | ||
350 | struct drm_device *dev = radeon_encoder->base.dev; | ||
351 | struct radeon_device *rdev = dev->dev_private; | ||
352 | struct backlight_device *bd; | ||
353 | struct backlight_properties props; | ||
354 | struct radeon_backlight_privdata *pdata; | ||
355 | uint8_t backlight_level; | ||
356 | |||
357 | if (!radeon_encoder->enc_priv) | ||
358 | return; | ||
359 | |||
360 | #ifdef CONFIG_PMAC_BACKLIGHT | ||
361 | if (!pmac_has_backlight_type("ati") && | ||
362 | !pmac_has_backlight_type("mnca")) | ||
363 | return; | ||
364 | #endif | ||
365 | |||
366 | pdata = kmalloc(sizeof(struct radeon_backlight_privdata), GFP_KERNEL); | ||
367 | if (!pdata) { | ||
368 | DRM_ERROR("Memory allocation failed\n"); | ||
369 | goto error; | ||
370 | } | ||
371 | |||
372 | props.max_brightness = MAX_RADEON_LEVEL; | ||
373 | props.type = BACKLIGHT_RAW; | ||
374 | bd = backlight_device_register("radeon_bl", &drm_connector->kdev, | ||
375 | pdata, &radeon_backlight_ops, &props); | ||
376 | if (IS_ERR(bd)) { | ||
377 | DRM_ERROR("Backlight registration failed\n"); | ||
378 | goto error; | ||
379 | } | ||
380 | |||
381 | pdata->encoder = radeon_encoder; | ||
382 | |||
383 | backlight_level = (RREG32(RADEON_LVDS_GEN_CNTL) >> | ||
384 | RADEON_LVDS_BL_MOD_LEVEL_SHIFT) & 0xff; | ||
385 | |||
386 | /* First, try to detect backlight level sense based on the assumption | ||
387 | * that firmware set it up at full brightness | ||
388 | */ | ||
389 | if (backlight_level == 0) | ||
390 | pdata->negative = true; | ||
391 | else if (backlight_level == 0xff) | ||
392 | pdata->negative = false; | ||
393 | else { | ||
394 | /* XXX hack... maybe some day we can figure out in what direction | ||
395 | * backlight should work on a given panel? | ||
396 | */ | ||
397 | pdata->negative = (rdev->family != CHIP_RV200 && | ||
398 | rdev->family != CHIP_RV250 && | ||
399 | rdev->family != CHIP_RV280 && | ||
400 | rdev->family != CHIP_RV350); | ||
401 | |||
402 | #ifdef CONFIG_PMAC_BACKLIGHT | ||
403 | pdata->negative = (pdata->negative || | ||
404 | of_machine_is_compatible("PowerBook4,3") || | ||
405 | of_machine_is_compatible("PowerBook6,3") || | ||
406 | of_machine_is_compatible("PowerBook6,5")); | ||
407 | #endif | ||
408 | } | ||
409 | |||
410 | if (rdev->is_atom_bios) { | ||
411 | struct radeon_encoder_atom_dig *lvds = radeon_encoder->enc_priv; | ||
412 | lvds->bl_dev = bd; | ||
413 | } else { | ||
414 | struct radeon_encoder_lvds *lvds = radeon_encoder->enc_priv; | ||
415 | lvds->bl_dev = bd; | ||
416 | } | ||
417 | |||
418 | bd->props.brightness = radeon_legacy_backlight_get_brightness(bd); | ||
419 | bd->props.power = FB_BLANK_UNBLANK; | ||
420 | backlight_update_status(bd); | ||
421 | |||
422 | DRM_INFO("radeon legacy LVDS backlight initialized\n"); | ||
423 | |||
424 | return; | ||
425 | |||
426 | error: | ||
427 | kfree(pdata); | ||
428 | return; | ||
429 | } | ||
430 | |||
431 | static void radeon_legacy_backlight_exit(struct radeon_encoder *radeon_encoder) | ||
432 | { | ||
433 | struct drm_device *dev = radeon_encoder->base.dev; | ||
434 | struct radeon_device *rdev = dev->dev_private; | ||
435 | struct backlight_device *bd = NULL; | ||
436 | |||
437 | if (!radeon_encoder->enc_priv) | ||
438 | return; | ||
439 | |||
440 | if (rdev->is_atom_bios) { | ||
441 | struct radeon_encoder_atom_dig *lvds = radeon_encoder->enc_priv; | ||
442 | bd = lvds->bl_dev; | ||
443 | lvds->bl_dev = NULL; | ||
444 | } else { | ||
445 | struct radeon_encoder_lvds *lvds = radeon_encoder->enc_priv; | ||
446 | bd = lvds->bl_dev; | ||
447 | lvds->bl_dev = NULL; | ||
448 | } | ||
449 | |||
450 | if (bd) { | ||
451 | struct radeon_legacy_backlight_privdata *pdata; | ||
452 | |||
453 | pdata = bl_get_data(bd); | ||
454 | backlight_device_unregister(bd); | ||
455 | kfree(pdata); | ||
456 | |||
457 | DRM_INFO("radeon legacy LVDS backlight unloaded\n"); | ||
458 | } | ||
459 | } | ||
460 | |||
461 | #else /* !CONFIG_BACKLIGHT_CLASS_DEVICE */ | ||
462 | |||
463 | void radeon_legacy_backlight_init(struct radeon_encoder *encoder) | ||
464 | { | ||
465 | } | ||
466 | |||
467 | static void radeon_legacy_backlight_exit(struct radeon_encoder *encoder) | ||
468 | { | ||
469 | } | ||
470 | |||
471 | #endif | ||
472 | |||
473 | |||
474 | static void radeon_lvds_enc_destroy(struct drm_encoder *encoder) | ||
475 | { | ||
476 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); | ||
477 | |||
478 | if (radeon_encoder->enc_priv) { | ||
479 | radeon_legacy_backlight_exit(radeon_encoder); | ||
480 | kfree(radeon_encoder->enc_priv); | ||
481 | } | ||
482 | drm_encoder_cleanup(encoder); | ||
483 | kfree(radeon_encoder); | ||
484 | } | ||
240 | 485 | ||
241 | static const struct drm_encoder_funcs radeon_legacy_lvds_enc_funcs = { | 486 | static const struct drm_encoder_funcs radeon_legacy_lvds_enc_funcs = { |
242 | .destroy = radeon_enc_destroy, | 487 | .destroy = radeon_lvds_enc_destroy, |
243 | }; | 488 | }; |
244 | 489 | ||
245 | static void radeon_legacy_primary_dac_dpms(struct drm_encoder *encoder, int mode) | 490 | static void radeon_legacy_primary_dac_dpms(struct drm_encoder *encoder, int mode) |
diff --git a/drivers/gpu/drm/radeon/radeon_mode.h b/drivers/gpu/drm/radeon/radeon_mode.h index 5067d18d0009..9c57538231d5 100644 --- a/drivers/gpu/drm/radeon/radeon_mode.h +++ b/drivers/gpu/drm/radeon/radeon_mode.h | |||
@@ -239,6 +239,7 @@ struct radeon_mode_info { | |||
239 | struct drm_property *underscan_vborder_property; | 239 | struct drm_property *underscan_vborder_property; |
240 | /* hardcoded DFP edid from BIOS */ | 240 | /* hardcoded DFP edid from BIOS */ |
241 | struct edid *bios_hardcoded_edid; | 241 | struct edid *bios_hardcoded_edid; |
242 | int bios_hardcoded_edid_size; | ||
242 | 243 | ||
243 | /* pointer to fbdev info structure */ | 244 | /* pointer to fbdev info structure */ |
244 | struct radeon_fbdev *rfbdev; | 245 | struct radeon_fbdev *rfbdev; |
@@ -302,6 +303,9 @@ struct radeon_encoder_lvds { | |||
302 | uint32_t lvds_gen_cntl; | 303 | uint32_t lvds_gen_cntl; |
303 | /* panel mode */ | 304 | /* panel mode */ |
304 | struct drm_display_mode native_mode; | 305 | struct drm_display_mode native_mode; |
306 | struct backlight_device *bl_dev; | ||
307 | int dpms_mode; | ||
308 | uint8_t backlight_level; | ||
305 | }; | 309 | }; |
306 | 310 | ||
307 | struct radeon_encoder_tv_dac { | 311 | struct radeon_encoder_tv_dac { |
@@ -355,6 +359,9 @@ struct radeon_encoder_atom_dig { | |||
355 | uint32_t lcd_ss_id; | 359 | uint32_t lcd_ss_id; |
356 | /* panel mode */ | 360 | /* panel mode */ |
357 | struct drm_display_mode native_mode; | 361 | struct drm_display_mode native_mode; |
362 | struct backlight_device *bl_dev; | ||
363 | int dpms_mode; | ||
364 | uint8_t backlight_level; | ||
358 | }; | 365 | }; |
359 | 366 | ||
360 | struct radeon_encoder_atom_dac { | 367 | struct radeon_encoder_atom_dac { |
diff --git a/drivers/gpu/drm/radeon/radeon_object.h b/drivers/gpu/drm/radeon/radeon_object.h index 7f8e778dba46..ede6c13628f2 100644 --- a/drivers/gpu/drm/radeon/radeon_object.h +++ b/drivers/gpu/drm/radeon/radeon_object.h | |||
@@ -87,7 +87,7 @@ static inline void radeon_bo_unreserve(struct radeon_bo *bo) | |||
87 | * Returns current GPU offset of the object. | 87 | * Returns current GPU offset of the object. |
88 | * | 88 | * |
89 | * Note: object should either be pinned or reserved when calling this | 89 | * Note: object should either be pinned or reserved when calling this |
90 | * function, it might be usefull to add check for this for debugging. | 90 | * function, it might be useful to add check for this for debugging. |
91 | */ | 91 | */ |
92 | static inline u64 radeon_bo_gpu_offset(struct radeon_bo *bo) | 92 | static inline u64 radeon_bo_gpu_offset(struct radeon_bo *bo) |
93 | { | 93 | { |
diff --git a/drivers/gpu/drm/radeon/radeon_pm.c b/drivers/gpu/drm/radeon/radeon_pm.c index 2aed03bde4b2..86eda1ea94df 100644 --- a/drivers/gpu/drm/radeon/radeon_pm.c +++ b/drivers/gpu/drm/radeon/radeon_pm.c | |||
@@ -23,6 +23,7 @@ | |||
23 | #include "drmP.h" | 23 | #include "drmP.h" |
24 | #include "radeon.h" | 24 | #include "radeon.h" |
25 | #include "avivod.h" | 25 | #include "avivod.h" |
26 | #include "atom.h" | ||
26 | #ifdef CONFIG_ACPI | 27 | #ifdef CONFIG_ACPI |
27 | #include <linux/acpi.h> | 28 | #include <linux/acpi.h> |
28 | #endif | 29 | #endif |
@@ -365,12 +366,14 @@ static ssize_t radeon_set_pm_profile(struct device *dev, | |||
365 | else if (strncmp("high", buf, strlen("high")) == 0) | 366 | else if (strncmp("high", buf, strlen("high")) == 0) |
366 | rdev->pm.profile = PM_PROFILE_HIGH; | 367 | rdev->pm.profile = PM_PROFILE_HIGH; |
367 | else { | 368 | else { |
368 | DRM_ERROR("invalid power profile!\n"); | 369 | count = -EINVAL; |
369 | goto fail; | 370 | goto fail; |
370 | } | 371 | } |
371 | radeon_pm_update_profile(rdev); | 372 | radeon_pm_update_profile(rdev); |
372 | radeon_pm_set_clocks(rdev); | 373 | radeon_pm_set_clocks(rdev); |
373 | } | 374 | } else |
375 | count = -EINVAL; | ||
376 | |||
374 | fail: | 377 | fail: |
375 | mutex_unlock(&rdev->pm.mutex); | 378 | mutex_unlock(&rdev->pm.mutex); |
376 | 379 | ||
@@ -413,7 +416,7 @@ static ssize_t radeon_set_pm_method(struct device *dev, | |||
413 | mutex_unlock(&rdev->pm.mutex); | 416 | mutex_unlock(&rdev->pm.mutex); |
414 | cancel_delayed_work_sync(&rdev->pm.dynpm_idle_work); | 417 | cancel_delayed_work_sync(&rdev->pm.dynpm_idle_work); |
415 | } else { | 418 | } else { |
416 | DRM_ERROR("invalid power method!\n"); | 419 | count = -EINVAL; |
417 | goto fail; | 420 | goto fail; |
418 | } | 421 | } |
419 | radeon_pm_compute_clocks(rdev); | 422 | radeon_pm_compute_clocks(rdev); |
@@ -533,7 +536,11 @@ void radeon_pm_resume(struct radeon_device *rdev) | |||
533 | /* set up the default clocks if the MC ucode is loaded */ | 536 | /* set up the default clocks if the MC ucode is loaded */ |
534 | if (ASIC_IS_DCE5(rdev) && rdev->mc_fw) { | 537 | if (ASIC_IS_DCE5(rdev) && rdev->mc_fw) { |
535 | if (rdev->pm.default_vddc) | 538 | if (rdev->pm.default_vddc) |
536 | radeon_atom_set_voltage(rdev, rdev->pm.default_vddc); | 539 | radeon_atom_set_voltage(rdev, rdev->pm.default_vddc, |
540 | SET_VOLTAGE_TYPE_ASIC_VDDC); | ||
541 | if (rdev->pm.default_vddci) | ||
542 | radeon_atom_set_voltage(rdev, rdev->pm.default_vddci, | ||
543 | SET_VOLTAGE_TYPE_ASIC_VDDCI); | ||
537 | if (rdev->pm.default_sclk) | 544 | if (rdev->pm.default_sclk) |
538 | radeon_set_engine_clock(rdev, rdev->pm.default_sclk); | 545 | radeon_set_engine_clock(rdev, rdev->pm.default_sclk); |
539 | if (rdev->pm.default_mclk) | 546 | if (rdev->pm.default_mclk) |
@@ -546,6 +553,7 @@ void radeon_pm_resume(struct radeon_device *rdev) | |||
546 | rdev->pm.current_sclk = rdev->pm.default_sclk; | 553 | rdev->pm.current_sclk = rdev->pm.default_sclk; |
547 | rdev->pm.current_mclk = rdev->pm.default_mclk; | 554 | rdev->pm.current_mclk = rdev->pm.default_mclk; |
548 | rdev->pm.current_vddc = rdev->pm.power_state[rdev->pm.default_power_state_index].clock_info[0].voltage.voltage; | 555 | rdev->pm.current_vddc = rdev->pm.power_state[rdev->pm.default_power_state_index].clock_info[0].voltage.voltage; |
556 | rdev->pm.current_vddci = rdev->pm.power_state[rdev->pm.default_power_state_index].clock_info[0].voltage.vddci; | ||
549 | if (rdev->pm.pm_method == PM_METHOD_DYNPM | 557 | if (rdev->pm.pm_method == PM_METHOD_DYNPM |
550 | && rdev->pm.dynpm_state == DYNPM_STATE_SUSPENDED) { | 558 | && rdev->pm.dynpm_state == DYNPM_STATE_SUSPENDED) { |
551 | rdev->pm.dynpm_state = DYNPM_STATE_ACTIVE; | 559 | rdev->pm.dynpm_state = DYNPM_STATE_ACTIVE; |
@@ -583,7 +591,8 @@ int radeon_pm_init(struct radeon_device *rdev) | |||
583 | /* set up the default clocks if the MC ucode is loaded */ | 591 | /* set up the default clocks if the MC ucode is loaded */ |
584 | if (ASIC_IS_DCE5(rdev) && rdev->mc_fw) { | 592 | if (ASIC_IS_DCE5(rdev) && rdev->mc_fw) { |
585 | if (rdev->pm.default_vddc) | 593 | if (rdev->pm.default_vddc) |
586 | radeon_atom_set_voltage(rdev, rdev->pm.default_vddc); | 594 | radeon_atom_set_voltage(rdev, rdev->pm.default_vddc, |
595 | SET_VOLTAGE_TYPE_ASIC_VDDC); | ||
587 | if (rdev->pm.default_sclk) | 596 | if (rdev->pm.default_sclk) |
588 | radeon_set_engine_clock(rdev, rdev->pm.default_sclk); | 597 | radeon_set_engine_clock(rdev, rdev->pm.default_sclk); |
589 | if (rdev->pm.default_mclk) | 598 | if (rdev->pm.default_mclk) |
diff --git a/drivers/gpu/drm/radeon/radeon_ring.c b/drivers/gpu/drm/radeon/radeon_ring.c index d86254d7f80a..08c0233db1b8 100644 --- a/drivers/gpu/drm/radeon/radeon_ring.c +++ b/drivers/gpu/drm/radeon/radeon_ring.c | |||
@@ -248,7 +248,7 @@ void radeon_ib_pool_fini(struct radeon_device *rdev) | |||
248 | void radeon_ring_free_size(struct radeon_device *rdev) | 248 | void radeon_ring_free_size(struct radeon_device *rdev) |
249 | { | 249 | { |
250 | if (rdev->wb.enabled) | 250 | if (rdev->wb.enabled) |
251 | rdev->cp.rptr = rdev->wb.wb[RADEON_WB_CP_RPTR_OFFSET/4]; | 251 | rdev->cp.rptr = le32_to_cpu(rdev->wb.wb[RADEON_WB_CP_RPTR_OFFSET/4]); |
252 | else { | 252 | else { |
253 | if (rdev->family >= CHIP_R600) | 253 | if (rdev->family >= CHIP_R600) |
254 | rdev->cp.rptr = RREG32(R600_CP_RB_RPTR); | 254 | rdev->cp.rptr = RREG32(R600_CP_RB_RPTR); |
diff --git a/drivers/gpu/drm/radeon/radeon_state.c b/drivers/gpu/drm/radeon/radeon_state.c index 4ae5a3d1074e..92e7ea73b7c5 100644 --- a/drivers/gpu/drm/radeon/radeon_state.c +++ b/drivers/gpu/drm/radeon/radeon_state.c | |||
@@ -980,7 +980,7 @@ static void radeon_cp_dispatch_clear(struct drm_device * dev, | |||
980 | } | 980 | } |
981 | 981 | ||
982 | /* hyper z clear */ | 982 | /* hyper z clear */ |
983 | /* no docs available, based on reverse engeneering by Stephane Marchesin */ | 983 | /* no docs available, based on reverse engineering by Stephane Marchesin */ |
984 | if ((flags & (RADEON_DEPTH | RADEON_STENCIL)) | 984 | if ((flags & (RADEON_DEPTH | RADEON_STENCIL)) |
985 | && (flags & RADEON_CLEAR_FASTZ)) { | 985 | && (flags & RADEON_CLEAR_FASTZ)) { |
986 | 986 | ||
diff --git a/drivers/gpu/drm/radeon/rs600.c b/drivers/gpu/drm/radeon/rs600.c index 19763f5df5e1..6e3b11e5abbe 100644 --- a/drivers/gpu/drm/radeon/rs600.c +++ b/drivers/gpu/drm/radeon/rs600.c | |||
@@ -48,17 +48,6 @@ int rs600_mc_wait_for_idle(struct radeon_device *rdev); | |||
48 | 48 | ||
49 | void rs600_pre_page_flip(struct radeon_device *rdev, int crtc) | 49 | void rs600_pre_page_flip(struct radeon_device *rdev, int crtc) |
50 | { | 50 | { |
51 | struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc]; | ||
52 | u32 tmp; | ||
53 | |||
54 | /* make sure flip is at vb rather than hb */ | ||
55 | tmp = RREG32(AVIVO_D1GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset); | ||
56 | tmp &= ~AVIVO_D1GRPH_SURFACE_UPDATE_H_RETRACE_EN; | ||
57 | WREG32(AVIVO_D1GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset, tmp); | ||
58 | |||
59 | /* set pageflip to happen anywhere in vblank interval */ | ||
60 | WREG32(AVIVO_D1MODE_MASTER_UPDATE_MODE + radeon_crtc->crtc_offset, 0); | ||
61 | |||
62 | /* enable the pflip int */ | 51 | /* enable the pflip int */ |
63 | radeon_irq_kms_pflip_irq_get(rdev, crtc); | 52 | radeon_irq_kms_pflip_irq_get(rdev, crtc); |
64 | } | 53 | } |
@@ -125,7 +114,7 @@ void rs600_pm_misc(struct radeon_device *rdev) | |||
125 | udelay(voltage->delay); | 114 | udelay(voltage->delay); |
126 | } | 115 | } |
127 | } else if (voltage->type == VOLTAGE_VDDC) | 116 | } else if (voltage->type == VOLTAGE_VDDC) |
128 | radeon_atom_set_voltage(rdev, voltage->vddc_id); | 117 | radeon_atom_set_voltage(rdev, voltage->vddc_id, SET_VOLTAGE_TYPE_ASIC_VDDC); |
129 | 118 | ||
130 | dyn_pwrmgt_sclk_length = RREG32_PLL(DYN_PWRMGT_SCLK_LENGTH); | 119 | dyn_pwrmgt_sclk_length = RREG32_PLL(DYN_PWRMGT_SCLK_LENGTH); |
131 | dyn_pwrmgt_sclk_length &= ~REDUCED_POWER_SCLK_HILEN(0xf); | 120 | dyn_pwrmgt_sclk_length &= ~REDUCED_POWER_SCLK_HILEN(0xf); |
diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv770.c index b974ac7df8df..ef8a5babe9f7 100644 --- a/drivers/gpu/drm/radeon/rv770.c +++ b/drivers/gpu/drm/radeon/rv770.c | |||
@@ -106,7 +106,7 @@ void rv770_pm_misc(struct radeon_device *rdev) | |||
106 | 106 | ||
107 | if ((voltage->type == VOLTAGE_SW) && voltage->voltage) { | 107 | if ((voltage->type == VOLTAGE_SW) && voltage->voltage) { |
108 | if (voltage->voltage != rdev->pm.current_vddc) { | 108 | if (voltage->voltage != rdev->pm.current_vddc) { |
109 | radeon_atom_set_voltage(rdev, voltage->voltage); | 109 | radeon_atom_set_voltage(rdev, voltage->voltage, SET_VOLTAGE_TYPE_ASIC_VDDC); |
110 | rdev->pm.current_vddc = voltage->voltage; | 110 | rdev->pm.current_vddc = voltage->voltage; |
111 | DRM_DEBUG("Setting: v: %d\n", voltage->voltage); | 111 | DRM_DEBUG("Setting: v: %d\n", voltage->voltage); |
112 | } | 112 | } |
@@ -1255,9 +1255,6 @@ int rv770_init(struct radeon_device *rdev) | |||
1255 | { | 1255 | { |
1256 | int r; | 1256 | int r; |
1257 | 1257 | ||
1258 | r = radeon_dummy_page_init(rdev); | ||
1259 | if (r) | ||
1260 | return r; | ||
1261 | /* This don't do much */ | 1258 | /* This don't do much */ |
1262 | r = radeon_gem_init(rdev); | 1259 | r = radeon_gem_init(rdev); |
1263 | if (r) | 1260 | if (r) |
@@ -1372,7 +1369,6 @@ void rv770_fini(struct radeon_device *rdev) | |||
1372 | radeon_atombios_fini(rdev); | 1369 | radeon_atombios_fini(rdev); |
1373 | kfree(rdev->bios); | 1370 | kfree(rdev->bios); |
1374 | rdev->bios = NULL; | 1371 | rdev->bios = NULL; |
1375 | radeon_dummy_page_fini(rdev); | ||
1376 | } | 1372 | } |
1377 | 1373 | ||
1378 | static void rv770_pcie_gen2_enable(struct radeon_device *rdev) | 1374 | static void rv770_pcie_gen2_enable(struct radeon_device *rdev) |
diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c index 0b6a55ac2f87..2e618b5ac465 100644 --- a/drivers/gpu/drm/ttm/ttm_bo.c +++ b/drivers/gpu/drm/ttm/ttm_bo.c | |||
@@ -1168,7 +1168,7 @@ int ttm_bo_init(struct ttm_bo_device *bdev, | |||
1168 | uint32_t page_alignment, | 1168 | uint32_t page_alignment, |
1169 | unsigned long buffer_start, | 1169 | unsigned long buffer_start, |
1170 | bool interruptible, | 1170 | bool interruptible, |
1171 | struct file *persistant_swap_storage, | 1171 | struct file *persistent_swap_storage, |
1172 | size_t acc_size, | 1172 | size_t acc_size, |
1173 | void (*destroy) (struct ttm_buffer_object *)) | 1173 | void (*destroy) (struct ttm_buffer_object *)) |
1174 | { | 1174 | { |
@@ -1211,7 +1211,7 @@ int ttm_bo_init(struct ttm_bo_device *bdev, | |||
1211 | bo->priv_flags = 0; | 1211 | bo->priv_flags = 0; |
1212 | bo->mem.placement = (TTM_PL_FLAG_SYSTEM | TTM_PL_FLAG_CACHED); | 1212 | bo->mem.placement = (TTM_PL_FLAG_SYSTEM | TTM_PL_FLAG_CACHED); |
1213 | bo->seq_valid = false; | 1213 | bo->seq_valid = false; |
1214 | bo->persistant_swap_storage = persistant_swap_storage; | 1214 | bo->persistent_swap_storage = persistent_swap_storage; |
1215 | bo->acc_size = acc_size; | 1215 | bo->acc_size = acc_size; |
1216 | atomic_inc(&bo->glob->bo_count); | 1216 | atomic_inc(&bo->glob->bo_count); |
1217 | 1217 | ||
@@ -1260,7 +1260,7 @@ int ttm_bo_create(struct ttm_bo_device *bdev, | |||
1260 | uint32_t page_alignment, | 1260 | uint32_t page_alignment, |
1261 | unsigned long buffer_start, | 1261 | unsigned long buffer_start, |
1262 | bool interruptible, | 1262 | bool interruptible, |
1263 | struct file *persistant_swap_storage, | 1263 | struct file *persistent_swap_storage, |
1264 | struct ttm_buffer_object **p_bo) | 1264 | struct ttm_buffer_object **p_bo) |
1265 | { | 1265 | { |
1266 | struct ttm_buffer_object *bo; | 1266 | struct ttm_buffer_object *bo; |
@@ -1282,7 +1282,7 @@ int ttm_bo_create(struct ttm_bo_device *bdev, | |||
1282 | 1282 | ||
1283 | ret = ttm_bo_init(bdev, bo, size, type, placement, page_alignment, | 1283 | ret = ttm_bo_init(bdev, bo, size, type, placement, page_alignment, |
1284 | buffer_start, interruptible, | 1284 | buffer_start, interruptible, |
1285 | persistant_swap_storage, acc_size, NULL); | 1285 | persistent_swap_storage, acc_size, NULL); |
1286 | if (likely(ret == 0)) | 1286 | if (likely(ret == 0)) |
1287 | *p_bo = bo; | 1287 | *p_bo = bo; |
1288 | 1288 | ||
@@ -1863,7 +1863,7 @@ static int ttm_bo_swapout(struct ttm_mem_shrink *shrink) | |||
1863 | if (bo->bdev->driver->swap_notify) | 1863 | if (bo->bdev->driver->swap_notify) |
1864 | bo->bdev->driver->swap_notify(bo); | 1864 | bo->bdev->driver->swap_notify(bo); |
1865 | 1865 | ||
1866 | ret = ttm_tt_swapout(bo->ttm, bo->persistant_swap_storage); | 1866 | ret = ttm_tt_swapout(bo->ttm, bo->persistent_swap_storage); |
1867 | out: | 1867 | out: |
1868 | 1868 | ||
1869 | /** | 1869 | /** |
diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc.c b/drivers/gpu/drm/ttm/ttm_page_alloc.c index 737a2a2e46a5..9d9d92945f8c 100644 --- a/drivers/gpu/drm/ttm/ttm_page_alloc.c +++ b/drivers/gpu/drm/ttm/ttm_page_alloc.c | |||
@@ -683,22 +683,14 @@ int ttm_get_pages(struct list_head *pages, int flags, | |||
683 | gfp_flags |= GFP_HIGHUSER; | 683 | gfp_flags |= GFP_HIGHUSER; |
684 | 684 | ||
685 | for (r = 0; r < count; ++r) { | 685 | for (r = 0; r < count; ++r) { |
686 | if ((flags & TTM_PAGE_FLAG_DMA32) && dma_address) { | 686 | p = alloc_page(gfp_flags); |
687 | void *addr; | ||
688 | addr = dma_alloc_coherent(NULL, PAGE_SIZE, | ||
689 | &dma_address[r], | ||
690 | gfp_flags); | ||
691 | if (addr == NULL) | ||
692 | return -ENOMEM; | ||
693 | p = virt_to_page(addr); | ||
694 | } else | ||
695 | p = alloc_page(gfp_flags); | ||
696 | if (!p) { | 687 | if (!p) { |
697 | 688 | ||
698 | printk(KERN_ERR TTM_PFX | 689 | printk(KERN_ERR TTM_PFX |
699 | "Unable to allocate page."); | 690 | "Unable to allocate page."); |
700 | return -ENOMEM; | 691 | return -ENOMEM; |
701 | } | 692 | } |
693 | |||
702 | list_add(&p->lru, pages); | 694 | list_add(&p->lru, pages); |
703 | } | 695 | } |
704 | return 0; | 696 | return 0; |
@@ -746,24 +738,12 @@ void ttm_put_pages(struct list_head *pages, unsigned page_count, int flags, | |||
746 | unsigned long irq_flags; | 738 | unsigned long irq_flags; |
747 | struct ttm_page_pool *pool = ttm_get_pool(flags, cstate); | 739 | struct ttm_page_pool *pool = ttm_get_pool(flags, cstate); |
748 | struct page *p, *tmp; | 740 | struct page *p, *tmp; |
749 | unsigned r; | ||
750 | 741 | ||
751 | if (pool == NULL) { | 742 | if (pool == NULL) { |
752 | /* No pool for this memory type so free the pages */ | 743 | /* No pool for this memory type so free the pages */ |
753 | 744 | ||
754 | r = page_count-1; | ||
755 | list_for_each_entry_safe(p, tmp, pages, lru) { | 745 | list_for_each_entry_safe(p, tmp, pages, lru) { |
756 | if ((flags & TTM_PAGE_FLAG_DMA32) && dma_address) { | 746 | __free_page(p); |
757 | void *addr = page_address(p); | ||
758 | WARN_ON(!addr || !dma_address[r]); | ||
759 | if (addr) | ||
760 | dma_free_coherent(NULL, PAGE_SIZE, | ||
761 | addr, | ||
762 | dma_address[r]); | ||
763 | dma_address[r] = 0; | ||
764 | } else | ||
765 | __free_page(p); | ||
766 | r--; | ||
767 | } | 747 | } |
768 | /* Make the pages list empty */ | 748 | /* Make the pages list empty */ |
769 | INIT_LIST_HEAD(pages); | 749 | INIT_LIST_HEAD(pages); |
diff --git a/drivers/gpu/drm/ttm/ttm_tt.c b/drivers/gpu/drm/ttm/ttm_tt.c index 86d5b1745a45..90e23e0bfadb 100644 --- a/drivers/gpu/drm/ttm/ttm_tt.c +++ b/drivers/gpu/drm/ttm/ttm_tt.c | |||
@@ -332,7 +332,7 @@ void ttm_tt_destroy(struct ttm_tt *ttm) | |||
332 | ttm_tt_free_page_directory(ttm); | 332 | ttm_tt_free_page_directory(ttm); |
333 | } | 333 | } |
334 | 334 | ||
335 | if (!(ttm->page_flags & TTM_PAGE_FLAG_PERSISTANT_SWAP) && | 335 | if (!(ttm->page_flags & TTM_PAGE_FLAG_PERSISTENT_SWAP) && |
336 | ttm->swap_storage) | 336 | ttm->swap_storage) |
337 | fput(ttm->swap_storage); | 337 | fput(ttm->swap_storage); |
338 | 338 | ||
@@ -503,7 +503,7 @@ static int ttm_tt_swapin(struct ttm_tt *ttm) | |||
503 | page_cache_release(from_page); | 503 | page_cache_release(from_page); |
504 | } | 504 | } |
505 | 505 | ||
506 | if (!(ttm->page_flags & TTM_PAGE_FLAG_PERSISTANT_SWAP)) | 506 | if (!(ttm->page_flags & TTM_PAGE_FLAG_PERSISTENT_SWAP)) |
507 | fput(swap_storage); | 507 | fput(swap_storage); |
508 | ttm->swap_storage = NULL; | 508 | ttm->swap_storage = NULL; |
509 | ttm->page_flags &= ~TTM_PAGE_FLAG_SWAPPED; | 509 | ttm->page_flags &= ~TTM_PAGE_FLAG_SWAPPED; |
@@ -514,7 +514,7 @@ out_err: | |||
514 | return ret; | 514 | return ret; |
515 | } | 515 | } |
516 | 516 | ||
517 | int ttm_tt_swapout(struct ttm_tt *ttm, struct file *persistant_swap_storage) | 517 | int ttm_tt_swapout(struct ttm_tt *ttm, struct file *persistent_swap_storage) |
518 | { | 518 | { |
519 | struct address_space *swap_space; | 519 | struct address_space *swap_space; |
520 | struct file *swap_storage; | 520 | struct file *swap_storage; |
@@ -540,7 +540,7 @@ int ttm_tt_swapout(struct ttm_tt *ttm, struct file *persistant_swap_storage) | |||
540 | return 0; | 540 | return 0; |
541 | } | 541 | } |
542 | 542 | ||
543 | if (!persistant_swap_storage) { | 543 | if (!persistent_swap_storage) { |
544 | swap_storage = shmem_file_setup("ttm swap", | 544 | swap_storage = shmem_file_setup("ttm swap", |
545 | ttm->num_pages << PAGE_SHIFT, | 545 | ttm->num_pages << PAGE_SHIFT, |
546 | 0); | 546 | 0); |
@@ -549,7 +549,7 @@ int ttm_tt_swapout(struct ttm_tt *ttm, struct file *persistant_swap_storage) | |||
549 | return PTR_ERR(swap_storage); | 549 | return PTR_ERR(swap_storage); |
550 | } | 550 | } |
551 | } else | 551 | } else |
552 | swap_storage = persistant_swap_storage; | 552 | swap_storage = persistent_swap_storage; |
553 | 553 | ||
554 | swap_space = swap_storage->f_path.dentry->d_inode->i_mapping; | 554 | swap_space = swap_storage->f_path.dentry->d_inode->i_mapping; |
555 | 555 | ||
@@ -577,12 +577,12 @@ int ttm_tt_swapout(struct ttm_tt *ttm, struct file *persistant_swap_storage) | |||
577 | ttm_tt_free_alloced_pages(ttm); | 577 | ttm_tt_free_alloced_pages(ttm); |
578 | ttm->swap_storage = swap_storage; | 578 | ttm->swap_storage = swap_storage; |
579 | ttm->page_flags |= TTM_PAGE_FLAG_SWAPPED; | 579 | ttm->page_flags |= TTM_PAGE_FLAG_SWAPPED; |
580 | if (persistant_swap_storage) | 580 | if (persistent_swap_storage) |
581 | ttm->page_flags |= TTM_PAGE_FLAG_PERSISTANT_SWAP; | 581 | ttm->page_flags |= TTM_PAGE_FLAG_PERSISTENT_SWAP; |
582 | 582 | ||
583 | return 0; | 583 | return 0; |
584 | out_err: | 584 | out_err: |
585 | if (!persistant_swap_storage) | 585 | if (!persistent_swap_storage) |
586 | fput(swap_storage); | 586 | fput(swap_storage); |
587 | 587 | ||
588 | return ret; | 588 | return ret; |
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c index cceeb42789b6..dfe32e62bd90 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c | |||
@@ -245,7 +245,7 @@ void vmw_kms_cursor_snoop(struct vmw_surface *srf, | |||
245 | /* TODO handle none page aligned offsets */ | 245 | /* TODO handle none page aligned offsets */ |
246 | /* TODO handle partial uploads and pitch != 256 */ | 246 | /* TODO handle partial uploads and pitch != 256 */ |
247 | /* TODO handle more then one copy (size != 64) */ | 247 | /* TODO handle more then one copy (size != 64) */ |
248 | DRM_ERROR("lazy programer, cant handle wierd stuff\n"); | 248 | DRM_ERROR("lazy programmer, can't handle weird stuff\n"); |
249 | return; | 249 | return; |
250 | } | 250 | } |
251 | 251 | ||
diff --git a/drivers/gpu/stub/Kconfig b/drivers/gpu/stub/Kconfig index 70e60a4bb678..419917955bf6 100644 --- a/drivers/gpu/stub/Kconfig +++ b/drivers/gpu/stub/Kconfig | |||
@@ -5,6 +5,7 @@ config STUB_POULSBO | |||
5 | # Poulsbo stub depends on ACPI_VIDEO when ACPI is enabled | 5 | # Poulsbo stub depends on ACPI_VIDEO when ACPI is enabled |
6 | # but for select to work, need to select ACPI_VIDEO's dependencies, ick | 6 | # but for select to work, need to select ACPI_VIDEO's dependencies, ick |
7 | select BACKLIGHT_CLASS_DEVICE if ACPI | 7 | select BACKLIGHT_CLASS_DEVICE if ACPI |
8 | select VIDEO_OUTPUT_CONTROL if ACPI | ||
8 | select INPUT if ACPI | 9 | select INPUT if ACPI |
9 | select ACPI_VIDEO if ACPI | 10 | select ACPI_VIDEO if ACPI |
10 | select THERMAL if ACPI | 11 | select THERMAL if ACPI |
diff --git a/drivers/gpu/vga/vgaarb.c b/drivers/gpu/vga/vgaarb.c index ace2b1623b21..be8d4cb5861c 100644 --- a/drivers/gpu/vga/vgaarb.c +++ b/drivers/gpu/vga/vgaarb.c | |||
@@ -151,7 +151,7 @@ static inline void vga_irq_set_state(struct vga_device *vgadev, bool state) | |||
151 | static void vga_check_first_use(void) | 151 | static void vga_check_first_use(void) |
152 | { | 152 | { |
153 | /* we should inform all GPUs in the system that | 153 | /* we should inform all GPUs in the system that |
154 | * VGA arb has occured and to try and disable resources | 154 | * VGA arb has occurred and to try and disable resources |
155 | * if they can */ | 155 | * if they can */ |
156 | if (!vga_arbiter_used) { | 156 | if (!vga_arbiter_used) { |
157 | vga_arbiter_used = true; | 157 | vga_arbiter_used = true; |
@@ -774,7 +774,7 @@ static ssize_t vga_arb_read(struct file *file, char __user * buf, | |||
774 | */ | 774 | */ |
775 | spin_lock_irqsave(&vga_lock, flags); | 775 | spin_lock_irqsave(&vga_lock, flags); |
776 | 776 | ||
777 | /* If we are targetting the default, use it */ | 777 | /* If we are targeting the default, use it */ |
778 | pdev = priv->target; | 778 | pdev = priv->target; |
779 | if (pdev == NULL || pdev == PCI_INVALID_CARD) { | 779 | if (pdev == NULL || pdev == PCI_INVALID_CARD) { |
780 | spin_unlock_irqrestore(&vga_lock, flags); | 780 | spin_unlock_irqrestore(&vga_lock, flags); |