diff options
Diffstat (limited to 'drivers/gpu')
38 files changed, 736 insertions, 385 deletions
diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c index 33be210d6723..2f631c75f704 100644 --- a/drivers/gpu/drm/drm_crtc.c +++ b/drivers/gpu/drm/drm_crtc.c | |||
| @@ -258,31 +258,6 @@ void *drm_mode_object_find(struct drm_device *dev, uint32_t id, uint32_t type) | |||
| 258 | EXPORT_SYMBOL(drm_mode_object_find); | 258 | EXPORT_SYMBOL(drm_mode_object_find); |
| 259 | 259 | ||
| 260 | /** | 260 | /** |
| 261 | * drm_crtc_from_fb - find the CRTC structure associated with an fb | ||
| 262 | * @dev: DRM device | ||
| 263 | * @fb: framebuffer in question | ||
| 264 | * | ||
| 265 | * LOCKING: | ||
| 266 | * Caller must hold mode_config lock. | ||
| 267 | * | ||
| 268 | * Find CRTC in the mode_config structure that matches @fb. | ||
| 269 | * | ||
| 270 | * RETURNS: | ||
| 271 | * Pointer to the CRTC or NULL if it wasn't found. | ||
| 272 | */ | ||
| 273 | struct drm_crtc *drm_crtc_from_fb(struct drm_device *dev, | ||
| 274 | struct drm_framebuffer *fb) | ||
| 275 | { | ||
| 276 | struct drm_crtc *crtc; | ||
| 277 | |||
| 278 | list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { | ||
| 279 | if (crtc->fb == fb) | ||
| 280 | return crtc; | ||
| 281 | } | ||
| 282 | return NULL; | ||
| 283 | } | ||
| 284 | |||
| 285 | /** | ||
| 286 | * drm_framebuffer_init - initialize a framebuffer | 261 | * drm_framebuffer_init - initialize a framebuffer |
| 287 | * @dev: DRM device | 262 | * @dev: DRM device |
| 288 | * | 263 | * |
| @@ -328,11 +303,20 @@ void drm_framebuffer_cleanup(struct drm_framebuffer *fb) | |||
| 328 | { | 303 | { |
| 329 | struct drm_device *dev = fb->dev; | 304 | struct drm_device *dev = fb->dev; |
| 330 | struct drm_crtc *crtc; | 305 | struct drm_crtc *crtc; |
| 306 | struct drm_mode_set set; | ||
| 307 | int ret; | ||
| 331 | 308 | ||
| 332 | /* remove from any CRTC */ | 309 | /* remove from any CRTC */ |
| 333 | list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { | 310 | list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { |
| 334 | if (crtc->fb == fb) | 311 | if (crtc->fb == fb) { |
| 335 | crtc->fb = NULL; | 312 | /* should turn off the crtc */ |
| 313 | memset(&set, 0, sizeof(struct drm_mode_set)); | ||
| 314 | set.crtc = crtc; | ||
| 315 | set.fb = NULL; | ||
| 316 | ret = crtc->funcs->set_config(&set); | ||
| 317 | if (ret) | ||
| 318 | DRM_ERROR("failed to reset crtc %p when fb was deleted\n", crtc); | ||
| 319 | } | ||
| 336 | } | 320 | } |
| 337 | 321 | ||
| 338 | drm_mode_object_put(dev, &fb->base); | 322 | drm_mode_object_put(dev, &fb->base); |
| @@ -1511,7 +1495,7 @@ int drm_mode_setcrtc(struct drm_device *dev, void *data, | |||
| 1511 | set.mode = mode; | 1495 | set.mode = mode; |
| 1512 | set.connectors = connector_set; | 1496 | set.connectors = connector_set; |
| 1513 | set.num_connectors = crtc_req->count_connectors; | 1497 | set.num_connectors = crtc_req->count_connectors; |
| 1514 | set.fb =fb; | 1498 | set.fb = fb; |
| 1515 | ret = crtc->funcs->set_config(&set); | 1499 | ret = crtc->funcs->set_config(&set); |
| 1516 | 1500 | ||
| 1517 | out: | 1501 | out: |
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c index 80cc6d06d61b..7f2728bbc16c 100644 --- a/drivers/gpu/drm/drm_edid.c +++ b/drivers/gpu/drm/drm_edid.c | |||
| @@ -502,12 +502,40 @@ static int add_detailed_info(struct drm_connector *connector, | |||
| 502 | struct detailed_non_pixel *data = &timing->data.other_data; | 502 | struct detailed_non_pixel *data = &timing->data.other_data; |
| 503 | struct drm_display_mode *newmode; | 503 | struct drm_display_mode *newmode; |
| 504 | 504 | ||
| 505 | /* EDID up to and including 1.2 may put monitor info here */ | 505 | /* X server check is version 1.1 or higher */ |
| 506 | if (edid->version == 1 && edid->revision < 3) | 506 | if (edid->version == 1 && edid->revision >= 1 && |
| 507 | continue; | 507 | !timing->pixel_clock) { |
| 508 | 508 | /* Other timing or info */ | |
| 509 | /* Detailed mode timing */ | 509 | switch (data->type) { |
| 510 | if (timing->pixel_clock) { | 510 | case EDID_DETAIL_MONITOR_SERIAL: |
| 511 | break; | ||
| 512 | case EDID_DETAIL_MONITOR_STRING: | ||
| 513 | break; | ||
| 514 | case EDID_DETAIL_MONITOR_RANGE: | ||
| 515 | /* Get monitor range data */ | ||
| 516 | break; | ||
| 517 | case EDID_DETAIL_MONITOR_NAME: | ||
| 518 | break; | ||
| 519 | case EDID_DETAIL_MONITOR_CPDATA: | ||
| 520 | break; | ||
| 521 | case EDID_DETAIL_STD_MODES: | ||
| 522 | /* Five modes per detailed section */ | ||
| 523 | for (j = 0; j < 5; i++) { | ||
| 524 | struct std_timing *std; | ||
| 525 | struct drm_display_mode *newmode; | ||
| 526 | |||
| 527 | std = &data->data.timings[j]; | ||
| 528 | newmode = drm_mode_std(dev, std); | ||
| 529 | if (newmode) { | ||
| 530 | drm_mode_probed_add(connector, newmode); | ||
| 531 | modes++; | ||
| 532 | } | ||
| 533 | } | ||
| 534 | break; | ||
| 535 | default: | ||
| 536 | break; | ||
| 537 | } | ||
| 538 | } else { | ||
| 511 | newmode = drm_mode_detailed(dev, edid, timing, quirks); | 539 | newmode = drm_mode_detailed(dev, edid, timing, quirks); |
| 512 | if (!newmode) | 540 | if (!newmode) |
| 513 | continue; | 541 | continue; |
| @@ -518,38 +546,6 @@ static int add_detailed_info(struct drm_connector *connector, | |||
| 518 | drm_mode_probed_add(connector, newmode); | 546 | drm_mode_probed_add(connector, newmode); |
| 519 | 547 | ||
| 520 | modes++; | 548 | modes++; |
| 521 | continue; | ||
| 522 | } | ||
| 523 | |||
| 524 | /* Other timing or info */ | ||
| 525 | switch (data->type) { | ||
| 526 | case EDID_DETAIL_MONITOR_SERIAL: | ||
| 527 | break; | ||
| 528 | case EDID_DETAIL_MONITOR_STRING: | ||
| 529 | break; | ||
| 530 | case EDID_DETAIL_MONITOR_RANGE: | ||
| 531 | /* Get monitor range data */ | ||
| 532 | break; | ||
| 533 | case EDID_DETAIL_MONITOR_NAME: | ||
| 534 | break; | ||
| 535 | case EDID_DETAIL_MONITOR_CPDATA: | ||
| 536 | break; | ||
| 537 | case EDID_DETAIL_STD_MODES: | ||
| 538 | /* Five modes per detailed section */ | ||
| 539 | for (j = 0; j < 5; i++) { | ||
| 540 | struct std_timing *std; | ||
| 541 | struct drm_display_mode *newmode; | ||
| 542 | |||
| 543 | std = &data->data.timings[j]; | ||
| 544 | newmode = drm_mode_std(dev, std); | ||
| 545 | if (newmode) { | ||
| 546 | drm_mode_probed_add(connector, newmode); | ||
| 547 | modes++; | ||
| 548 | } | ||
| 549 | } | ||
| 550 | break; | ||
| 551 | default: | ||
| 552 | break; | ||
| 553 | } | 549 | } |
| 554 | } | 550 | } |
| 555 | 551 | ||
diff --git a/drivers/gpu/drm/drm_sysfs.c b/drivers/gpu/drm/drm_sysfs.c index 85ec31b3ff00..f7a615b80c70 100644 --- a/drivers/gpu/drm/drm_sysfs.c +++ b/drivers/gpu/drm/drm_sysfs.c | |||
| @@ -22,44 +22,50 @@ | |||
| 22 | #define to_drm_minor(d) container_of(d, struct drm_minor, kdev) | 22 | #define to_drm_minor(d) container_of(d, struct drm_minor, kdev) |
| 23 | #define to_drm_connector(d) container_of(d, struct drm_connector, kdev) | 23 | #define to_drm_connector(d) container_of(d, struct drm_connector, kdev) |
| 24 | 24 | ||
| 25 | static struct device_type drm_sysfs_device_minor = { | ||
| 26 | .name = "drm_minor" | ||
| 27 | }; | ||
| 28 | |||
| 25 | /** | 29 | /** |
| 26 | * drm_sysfs_suspend - DRM class suspend hook | 30 | * drm_class_suspend - DRM class suspend hook |
| 27 | * @dev: Linux device to suspend | 31 | * @dev: Linux device to suspend |
| 28 | * @state: power state to enter | 32 | * @state: power state to enter |
| 29 | * | 33 | * |
| 30 | * Just figures out what the actual struct drm_device associated with | 34 | * Just figures out what the actual struct drm_device associated with |
| 31 | * @dev is and calls its suspend hook, if present. | 35 | * @dev is and calls its suspend hook, if present. |
| 32 | */ | 36 | */ |
| 33 | static int drm_sysfs_suspend(struct device *dev, pm_message_t state) | 37 | static int drm_class_suspend(struct device *dev, pm_message_t state) |
| 34 | { | 38 | { |
| 35 | struct drm_minor *drm_minor = to_drm_minor(dev); | 39 | if (dev->type == &drm_sysfs_device_minor) { |
| 36 | struct drm_device *drm_dev = drm_minor->dev; | 40 | struct drm_minor *drm_minor = to_drm_minor(dev); |
| 37 | 41 | struct drm_device *drm_dev = drm_minor->dev; | |
| 38 | if (drm_minor->type == DRM_MINOR_LEGACY && | 42 | |
| 39 | !drm_core_check_feature(drm_dev, DRIVER_MODESET) && | 43 | if (drm_minor->type == DRM_MINOR_LEGACY && |
| 40 | drm_dev->driver->suspend) | 44 | !drm_core_check_feature(drm_dev, DRIVER_MODESET) && |
| 41 | return drm_dev->driver->suspend(drm_dev, state); | 45 | drm_dev->driver->suspend) |
| 42 | 46 | return drm_dev->driver->suspend(drm_dev, state); | |
| 47 | } | ||
| 43 | return 0; | 48 | return 0; |
| 44 | } | 49 | } |
| 45 | 50 | ||
| 46 | /** | 51 | /** |
| 47 | * drm_sysfs_resume - DRM class resume hook | 52 | * drm_class_resume - DRM class resume hook |
| 48 | * @dev: Linux device to resume | 53 | * @dev: Linux device to resume |
| 49 | * | 54 | * |
| 50 | * Just figures out what the actual struct drm_device associated with | 55 | * Just figures out what the actual struct drm_device associated with |
| 51 | * @dev is and calls its resume hook, if present. | 56 | * @dev is and calls its resume hook, if present. |
| 52 | */ | 57 | */ |
| 53 | static int drm_sysfs_resume(struct device *dev) | 58 | static int drm_class_resume(struct device *dev) |
| 54 | { | 59 | { |
| 55 | struct drm_minor *drm_minor = to_drm_minor(dev); | 60 | if (dev->type == &drm_sysfs_device_minor) { |
| 56 | struct drm_device *drm_dev = drm_minor->dev; | 61 | struct drm_minor *drm_minor = to_drm_minor(dev); |
| 57 | 62 | struct drm_device *drm_dev = drm_minor->dev; | |
| 58 | if (drm_minor->type == DRM_MINOR_LEGACY && | 63 | |
| 59 | !drm_core_check_feature(drm_dev, DRIVER_MODESET) && | 64 | if (drm_minor->type == DRM_MINOR_LEGACY && |
| 60 | drm_dev->driver->resume) | 65 | !drm_core_check_feature(drm_dev, DRIVER_MODESET) && |
| 61 | return drm_dev->driver->resume(drm_dev); | 66 | drm_dev->driver->resume) |
| 62 | 67 | return drm_dev->driver->resume(drm_dev); | |
| 68 | } | ||
| 63 | return 0; | 69 | return 0; |
| 64 | } | 70 | } |
| 65 | 71 | ||
| @@ -99,8 +105,8 @@ struct class *drm_sysfs_create(struct module *owner, char *name) | |||
| 99 | goto err_out; | 105 | goto err_out; |
| 100 | } | 106 | } |
| 101 | 107 | ||
| 102 | class->suspend = drm_sysfs_suspend; | 108 | class->suspend = drm_class_suspend; |
| 103 | class->resume = drm_sysfs_resume; | 109 | class->resume = drm_class_resume; |
| 104 | 110 | ||
| 105 | err = class_create_file(class, &class_attr_version); | 111 | err = class_create_file(class, &class_attr_version); |
| 106 | if (err) | 112 | if (err) |
| @@ -480,6 +486,7 @@ int drm_sysfs_device_add(struct drm_minor *minor) | |||
| 480 | minor->kdev.class = drm_class; | 486 | minor->kdev.class = drm_class; |
| 481 | minor->kdev.release = drm_sysfs_device_release; | 487 | minor->kdev.release = drm_sysfs_device_release; |
| 482 | minor->kdev.devt = minor->device; | 488 | minor->kdev.devt = minor->device; |
| 489 | minor->kdev.type = &drm_sysfs_device_minor; | ||
| 483 | if (minor->type == DRM_MINOR_CONTROL) | 490 | if (minor->type == DRM_MINOR_CONTROL) |
| 484 | minor_str = "controlD%d"; | 491 | minor_str = "controlD%d"; |
| 485 | else if (minor->type == DRM_MINOR_RENDER) | 492 | else if (minor->type == DRM_MINOR_RENDER) |
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 7537f57d8a87..5b4f87e55621 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h | |||
| @@ -222,6 +222,7 @@ typedef struct drm_i915_private { | |||
| 222 | unsigned int edp_support:1; | 222 | unsigned int edp_support:1; |
| 223 | int lvds_ssc_freq; | 223 | int lvds_ssc_freq; |
| 224 | 224 | ||
| 225 | int crt_ddc_bus; /* -1 = unknown, else GPIO to use for CRT DDC */ | ||
| 225 | struct drm_i915_fence_reg fence_regs[16]; /* assume 965 */ | 226 | struct drm_i915_fence_reg fence_regs[16]; /* assume 965 */ |
| 226 | int fence_reg_start; /* 4 if userland hasn't ioctl'd us yet */ | 227 | int fence_reg_start; /* 4 if userland hasn't ioctl'd us yet */ |
| 227 | int num_fence_regs; /* 8 on pre-965, 16 otherwise */ | 228 | int num_fence_regs; /* 8 on pre-965, 16 otherwise */ |
| @@ -384,6 +385,9 @@ typedef struct drm_i915_private { | |||
| 384 | */ | 385 | */ |
| 385 | struct list_head inactive_list; | 386 | struct list_head inactive_list; |
| 386 | 387 | ||
| 388 | /** LRU list of objects with fence regs on them. */ | ||
| 389 | struct list_head fence_list; | ||
| 390 | |||
| 387 | /** | 391 | /** |
| 388 | * List of breadcrumbs associated with GPU requests currently | 392 | * List of breadcrumbs associated with GPU requests currently |
| 389 | * outstanding. | 393 | * outstanding. |
| @@ -451,6 +455,9 @@ struct drm_i915_gem_object { | |||
| 451 | /** This object's place on the active/flushing/inactive lists */ | 455 | /** This object's place on the active/flushing/inactive lists */ |
| 452 | struct list_head list; | 456 | struct list_head list; |
| 453 | 457 | ||
| 458 | /** This object's place on the fenced object LRU */ | ||
| 459 | struct list_head fence_list; | ||
| 460 | |||
| 454 | /** | 461 | /** |
| 455 | * This is set if the object is on the active or flushing lists | 462 | * This is set if the object is on the active or flushing lists |
| 456 | * (has pending rendering), and is not set if it's on inactive (ready | 463 | * (has pending rendering), and is not set if it's on inactive (ready |
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 140bee142fc2..0c07a755b3a3 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
| @@ -978,6 +978,7 @@ int | |||
| 978 | i915_gem_set_domain_ioctl(struct drm_device *dev, void *data, | 978 | i915_gem_set_domain_ioctl(struct drm_device *dev, void *data, |
| 979 | struct drm_file *file_priv) | 979 | struct drm_file *file_priv) |
| 980 | { | 980 | { |
| 981 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
| 981 | struct drm_i915_gem_set_domain *args = data; | 982 | struct drm_i915_gem_set_domain *args = data; |
| 982 | struct drm_gem_object *obj; | 983 | struct drm_gem_object *obj; |
| 983 | uint32_t read_domains = args->read_domains; | 984 | uint32_t read_domains = args->read_domains; |
| @@ -1010,8 +1011,18 @@ i915_gem_set_domain_ioctl(struct drm_device *dev, void *data, | |||
| 1010 | obj, obj->size, read_domains, write_domain); | 1011 | obj, obj->size, read_domains, write_domain); |
| 1011 | #endif | 1012 | #endif |
| 1012 | if (read_domains & I915_GEM_DOMAIN_GTT) { | 1013 | if (read_domains & I915_GEM_DOMAIN_GTT) { |
| 1014 | struct drm_i915_gem_object *obj_priv = obj->driver_private; | ||
| 1015 | |||
| 1013 | ret = i915_gem_object_set_to_gtt_domain(obj, write_domain != 0); | 1016 | ret = i915_gem_object_set_to_gtt_domain(obj, write_domain != 0); |
| 1014 | 1017 | ||
| 1018 | /* Update the LRU on the fence for the CPU access that's | ||
| 1019 | * about to occur. | ||
| 1020 | */ | ||
| 1021 | if (obj_priv->fence_reg != I915_FENCE_REG_NONE) { | ||
| 1022 | list_move_tail(&obj_priv->fence_list, | ||
| 1023 | &dev_priv->mm.fence_list); | ||
| 1024 | } | ||
| 1025 | |||
| 1015 | /* Silently promote "you're not bound, there was nothing to do" | 1026 | /* Silently promote "you're not bound, there was nothing to do" |
| 1016 | * to success, since the client was just asking us to | 1027 | * to success, since the client was just asking us to |
| 1017 | * make sure everything was done. | 1028 | * make sure everything was done. |
| @@ -1155,8 +1166,7 @@ int i915_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf) | |||
| 1155 | } | 1166 | } |
| 1156 | 1167 | ||
| 1157 | /* Need a new fence register? */ | 1168 | /* Need a new fence register? */ |
| 1158 | if (obj_priv->fence_reg == I915_FENCE_REG_NONE && | 1169 | if (obj_priv->tiling_mode != I915_TILING_NONE) { |
| 1159 | obj_priv->tiling_mode != I915_TILING_NONE) { | ||
| 1160 | ret = i915_gem_object_get_fence_reg(obj); | 1170 | ret = i915_gem_object_get_fence_reg(obj); |
| 1161 | if (ret) { | 1171 | if (ret) { |
| 1162 | mutex_unlock(&dev->struct_mutex); | 1172 | mutex_unlock(&dev->struct_mutex); |
| @@ -2208,6 +2218,12 @@ i915_gem_object_get_fence_reg(struct drm_gem_object *obj) | |||
| 2208 | struct drm_i915_gem_object *old_obj_priv = NULL; | 2218 | struct drm_i915_gem_object *old_obj_priv = NULL; |
| 2209 | int i, ret, avail; | 2219 | int i, ret, avail; |
| 2210 | 2220 | ||
| 2221 | /* Just update our place in the LRU if our fence is getting used. */ | ||
| 2222 | if (obj_priv->fence_reg != I915_FENCE_REG_NONE) { | ||
| 2223 | list_move_tail(&obj_priv->fence_list, &dev_priv->mm.fence_list); | ||
| 2224 | return 0; | ||
| 2225 | } | ||
| 2226 | |||
| 2211 | switch (obj_priv->tiling_mode) { | 2227 | switch (obj_priv->tiling_mode) { |
| 2212 | case I915_TILING_NONE: | 2228 | case I915_TILING_NONE: |
| 2213 | WARN(1, "allocating a fence for non-tiled object?\n"); | 2229 | WARN(1, "allocating a fence for non-tiled object?\n"); |
| @@ -2229,7 +2245,6 @@ i915_gem_object_get_fence_reg(struct drm_gem_object *obj) | |||
| 2229 | } | 2245 | } |
| 2230 | 2246 | ||
| 2231 | /* First try to find a free reg */ | 2247 | /* First try to find a free reg */ |
| 2232 | try_again: | ||
| 2233 | avail = 0; | 2248 | avail = 0; |
| 2234 | for (i = dev_priv->fence_reg_start; i < dev_priv->num_fence_regs; i++) { | 2249 | for (i = dev_priv->fence_reg_start; i < dev_priv->num_fence_regs; i++) { |
| 2235 | reg = &dev_priv->fence_regs[i]; | 2250 | reg = &dev_priv->fence_regs[i]; |
| @@ -2243,52 +2258,41 @@ try_again: | |||
| 2243 | 2258 | ||
| 2244 | /* None available, try to steal one or wait for a user to finish */ | 2259 | /* None available, try to steal one or wait for a user to finish */ |
| 2245 | if (i == dev_priv->num_fence_regs) { | 2260 | if (i == dev_priv->num_fence_regs) { |
| 2246 | uint32_t seqno = dev_priv->mm.next_gem_seqno; | 2261 | struct drm_gem_object *old_obj = NULL; |
| 2247 | 2262 | ||
| 2248 | if (avail == 0) | 2263 | if (avail == 0) |
| 2249 | return -ENOSPC; | 2264 | return -ENOSPC; |
| 2250 | 2265 | ||
| 2251 | for (i = dev_priv->fence_reg_start; | 2266 | list_for_each_entry(old_obj_priv, &dev_priv->mm.fence_list, |
| 2252 | i < dev_priv->num_fence_regs; i++) { | 2267 | fence_list) { |
| 2253 | uint32_t this_seqno; | 2268 | old_obj = old_obj_priv->obj; |
| 2254 | 2269 | ||
| 2255 | reg = &dev_priv->fence_regs[i]; | 2270 | reg = &dev_priv->fence_regs[old_obj_priv->fence_reg]; |
| 2256 | old_obj_priv = reg->obj->driver_private; | ||
| 2257 | 2271 | ||
| 2258 | if (old_obj_priv->pin_count) | 2272 | if (old_obj_priv->pin_count) |
| 2259 | continue; | 2273 | continue; |
| 2260 | 2274 | ||
| 2275 | /* Take a reference, as otherwise the wait_rendering | ||
| 2276 | * below may cause the object to get freed out from | ||
| 2277 | * under us. | ||
| 2278 | */ | ||
| 2279 | drm_gem_object_reference(old_obj); | ||
| 2280 | |||
| 2261 | /* i915 uses fences for GPU access to tiled buffers */ | 2281 | /* i915 uses fences for GPU access to tiled buffers */ |
| 2262 | if (IS_I965G(dev) || !old_obj_priv->active) | 2282 | if (IS_I965G(dev) || !old_obj_priv->active) |
| 2263 | break; | 2283 | break; |
| 2264 | 2284 | ||
| 2265 | /* find the seqno of the first available fence */ | 2285 | /* This brings the object to the head of the LRU if it |
| 2266 | this_seqno = old_obj_priv->last_rendering_seqno; | 2286 | * had been written to. The only way this should |
| 2267 | if (this_seqno != 0 && | 2287 | * result in us waiting longer than the expected |
| 2268 | reg->obj->write_domain == 0 && | 2288 | * optimal amount of time is if there was a |
| 2269 | i915_seqno_passed(seqno, this_seqno)) | 2289 | * fence-using buffer later that was read-only. |
| 2270 | seqno = this_seqno; | 2290 | */ |
| 2271 | } | 2291 | i915_gem_object_flush_gpu_write_domain(old_obj); |
| 2272 | 2292 | ret = i915_gem_object_wait_rendering(old_obj); | |
| 2273 | /* | 2293 | if (ret != 0) |
| 2274 | * Now things get ugly... we have to wait for one of the | ||
| 2275 | * objects to finish before trying again. | ||
| 2276 | */ | ||
| 2277 | if (i == dev_priv->num_fence_regs) { | ||
| 2278 | if (seqno == dev_priv->mm.next_gem_seqno) { | ||
| 2279 | i915_gem_flush(dev, | ||
| 2280 | I915_GEM_GPU_DOMAINS, | ||
| 2281 | I915_GEM_GPU_DOMAINS); | ||
| 2282 | seqno = i915_add_request(dev, NULL, | ||
| 2283 | I915_GEM_GPU_DOMAINS); | ||
| 2284 | if (seqno == 0) | ||
| 2285 | return -ENOMEM; | ||
| 2286 | } | ||
| 2287 | |||
| 2288 | ret = i915_wait_request(dev, seqno); | ||
| 2289 | if (ret) | ||
| 2290 | return ret; | 2294 | return ret; |
| 2291 | goto try_again; | 2295 | break; |
| 2292 | } | 2296 | } |
| 2293 | 2297 | ||
| 2294 | /* | 2298 | /* |
| @@ -2296,10 +2300,15 @@ try_again: | |||
| 2296 | * for this object next time we need it. | 2300 | * for this object next time we need it. |
| 2297 | */ | 2301 | */ |
| 2298 | i915_gem_release_mmap(reg->obj); | 2302 | i915_gem_release_mmap(reg->obj); |
| 2303 | i = old_obj_priv->fence_reg; | ||
| 2299 | old_obj_priv->fence_reg = I915_FENCE_REG_NONE; | 2304 | old_obj_priv->fence_reg = I915_FENCE_REG_NONE; |
| 2305 | list_del_init(&old_obj_priv->fence_list); | ||
| 2306 | drm_gem_object_unreference(old_obj); | ||
| 2300 | } | 2307 | } |
| 2301 | 2308 | ||
| 2302 | obj_priv->fence_reg = i; | 2309 | obj_priv->fence_reg = i; |
| 2310 | list_add_tail(&obj_priv->fence_list, &dev_priv->mm.fence_list); | ||
| 2311 | |||
| 2303 | reg->obj = obj; | 2312 | reg->obj = obj; |
| 2304 | 2313 | ||
| 2305 | if (IS_I965G(dev)) | 2314 | if (IS_I965G(dev)) |
| @@ -2342,6 +2351,7 @@ i915_gem_clear_fence_reg(struct drm_gem_object *obj) | |||
| 2342 | 2351 | ||
| 2343 | dev_priv->fence_regs[obj_priv->fence_reg].obj = NULL; | 2352 | dev_priv->fence_regs[obj_priv->fence_reg].obj = NULL; |
| 2344 | obj_priv->fence_reg = I915_FENCE_REG_NONE; | 2353 | obj_priv->fence_reg = I915_FENCE_REG_NONE; |
| 2354 | list_del_init(&obj_priv->fence_list); | ||
| 2345 | } | 2355 | } |
| 2346 | 2356 | ||
| 2347 | /** | 2357 | /** |
| @@ -3595,9 +3605,7 @@ i915_gem_object_pin(struct drm_gem_object *obj, uint32_t alignment) | |||
| 3595 | * Pre-965 chips need a fence register set up in order to | 3605 | * Pre-965 chips need a fence register set up in order to |
| 3596 | * properly handle tiled surfaces. | 3606 | * properly handle tiled surfaces. |
| 3597 | */ | 3607 | */ |
| 3598 | if (!IS_I965G(dev) && | 3608 | if (!IS_I965G(dev) && obj_priv->tiling_mode != I915_TILING_NONE) { |
| 3599 | obj_priv->fence_reg == I915_FENCE_REG_NONE && | ||
| 3600 | obj_priv->tiling_mode != I915_TILING_NONE) { | ||
| 3601 | ret = i915_gem_object_get_fence_reg(obj); | 3609 | ret = i915_gem_object_get_fence_reg(obj); |
| 3602 | if (ret != 0) { | 3610 | if (ret != 0) { |
| 3603 | if (ret != -EBUSY && ret != -ERESTARTSYS) | 3611 | if (ret != -EBUSY && ret != -ERESTARTSYS) |
| @@ -3806,6 +3814,7 @@ int i915_gem_init_object(struct drm_gem_object *obj) | |||
| 3806 | obj_priv->obj = obj; | 3814 | obj_priv->obj = obj; |
| 3807 | obj_priv->fence_reg = I915_FENCE_REG_NONE; | 3815 | obj_priv->fence_reg = I915_FENCE_REG_NONE; |
| 3808 | INIT_LIST_HEAD(&obj_priv->list); | 3816 | INIT_LIST_HEAD(&obj_priv->list); |
| 3817 | INIT_LIST_HEAD(&obj_priv->fence_list); | ||
| 3809 | 3818 | ||
| 3810 | return 0; | 3819 | return 0; |
| 3811 | } | 3820 | } |
| @@ -4253,6 +4262,7 @@ i915_gem_load(struct drm_device *dev) | |||
| 4253 | INIT_LIST_HEAD(&dev_priv->mm.flushing_list); | 4262 | INIT_LIST_HEAD(&dev_priv->mm.flushing_list); |
| 4254 | INIT_LIST_HEAD(&dev_priv->mm.inactive_list); | 4263 | INIT_LIST_HEAD(&dev_priv->mm.inactive_list); |
| 4255 | INIT_LIST_HEAD(&dev_priv->mm.request_list); | 4264 | INIT_LIST_HEAD(&dev_priv->mm.request_list); |
| 4265 | INIT_LIST_HEAD(&dev_priv->mm.fence_list); | ||
| 4256 | INIT_DELAYED_WORK(&dev_priv->mm.retire_work, | 4266 | INIT_DELAYED_WORK(&dev_priv->mm.retire_work, |
| 4257 | i915_gem_retire_work_handler); | 4267 | i915_gem_retire_work_handler); |
| 4258 | dev_priv->mm.next_gem_seqno = 1; | 4268 | dev_priv->mm.next_gem_seqno = 1; |
diff --git a/drivers/gpu/drm/i915/intel_bios.c b/drivers/gpu/drm/i915/intel_bios.c index 300aee3296c2..f806fcc54e09 100644 --- a/drivers/gpu/drm/i915/intel_bios.c +++ b/drivers/gpu/drm/i915/intel_bios.c | |||
| @@ -59,6 +59,16 @@ find_section(struct bdb_header *bdb, int section_id) | |||
| 59 | return NULL; | 59 | return NULL; |
| 60 | } | 60 | } |
| 61 | 61 | ||
| 62 | static u16 | ||
| 63 | get_blocksize(void *p) | ||
| 64 | { | ||
| 65 | u16 *block_ptr, block_size; | ||
| 66 | |||
| 67 | block_ptr = (u16 *)((char *)p - 2); | ||
| 68 | block_size = *block_ptr; | ||
| 69 | return block_size; | ||
| 70 | } | ||
| 71 | |||
| 62 | static void | 72 | static void |
| 63 | fill_detail_timing_data(struct drm_display_mode *panel_fixed_mode, | 73 | fill_detail_timing_data(struct drm_display_mode *panel_fixed_mode, |
| 64 | struct lvds_dvo_timing *dvo_timing) | 74 | struct lvds_dvo_timing *dvo_timing) |
| @@ -215,6 +225,41 @@ parse_general_features(struct drm_i915_private *dev_priv, | |||
| 215 | } | 225 | } |
| 216 | 226 | ||
| 217 | static void | 227 | static void |
| 228 | parse_general_definitions(struct drm_i915_private *dev_priv, | ||
| 229 | struct bdb_header *bdb) | ||
| 230 | { | ||
| 231 | struct bdb_general_definitions *general; | ||
| 232 | const int crt_bus_map_table[] = { | ||
| 233 | GPIOB, | ||
| 234 | GPIOA, | ||
| 235 | GPIOC, | ||
| 236 | GPIOD, | ||
| 237 | GPIOE, | ||
| 238 | GPIOF, | ||
| 239 | }; | ||
| 240 | |||
| 241 | /* Set sensible defaults in case we can't find the general block | ||
| 242 | or it is the wrong chipset */ | ||
| 243 | dev_priv->crt_ddc_bus = -1; | ||
| 244 | |||
| 245 | general = find_section(bdb, BDB_GENERAL_DEFINITIONS); | ||
| 246 | if (general) { | ||
| 247 | u16 block_size = get_blocksize(general); | ||
| 248 | if (block_size >= sizeof(*general)) { | ||
| 249 | int bus_pin = general->crt_ddc_gmbus_pin; | ||
| 250 | DRM_DEBUG("crt_ddc_bus_pin: %d\n", bus_pin); | ||
| 251 | if ((bus_pin >= 1) && (bus_pin <= 6)) { | ||
| 252 | dev_priv->crt_ddc_bus = | ||
| 253 | crt_bus_map_table[bus_pin-1]; | ||
| 254 | } | ||
| 255 | } else { | ||
| 256 | DRM_DEBUG("BDB_GD too small (%d). Invalid.\n", | ||
| 257 | block_size); | ||
| 258 | } | ||
| 259 | } | ||
| 260 | } | ||
| 261 | |||
| 262 | static void | ||
| 218 | parse_sdvo_device_mapping(struct drm_i915_private *dev_priv, | 263 | parse_sdvo_device_mapping(struct drm_i915_private *dev_priv, |
| 219 | struct bdb_header *bdb) | 264 | struct bdb_header *bdb) |
| 220 | { | 265 | { |
| @@ -222,7 +267,7 @@ parse_sdvo_device_mapping(struct drm_i915_private *dev_priv, | |||
| 222 | struct bdb_general_definitions *p_defs; | 267 | struct bdb_general_definitions *p_defs; |
| 223 | struct child_device_config *p_child; | 268 | struct child_device_config *p_child; |
| 224 | int i, child_device_num, count; | 269 | int i, child_device_num, count; |
| 225 | u16 block_size, *block_ptr; | 270 | u16 block_size; |
| 226 | 271 | ||
| 227 | p_defs = find_section(bdb, BDB_GENERAL_DEFINITIONS); | 272 | p_defs = find_section(bdb, BDB_GENERAL_DEFINITIONS); |
| 228 | if (!p_defs) { | 273 | if (!p_defs) { |
| @@ -240,8 +285,7 @@ parse_sdvo_device_mapping(struct drm_i915_private *dev_priv, | |||
| 240 | return; | 285 | return; |
| 241 | } | 286 | } |
| 242 | /* get the block size of general definitions */ | 287 | /* get the block size of general definitions */ |
| 243 | block_ptr = (u16 *)((char *)p_defs - 2); | 288 | block_size = get_blocksize(p_defs); |
| 244 | block_size = *block_ptr; | ||
| 245 | /* get the number of child device */ | 289 | /* get the number of child device */ |
| 246 | child_device_num = (block_size - sizeof(*p_defs)) / | 290 | child_device_num = (block_size - sizeof(*p_defs)) / |
| 247 | sizeof(*p_child); | 291 | sizeof(*p_child); |
| @@ -362,6 +406,7 @@ intel_init_bios(struct drm_device *dev) | |||
| 362 | 406 | ||
| 363 | /* Grab useful general definitions */ | 407 | /* Grab useful general definitions */ |
| 364 | parse_general_features(dev_priv, bdb); | 408 | parse_general_features(dev_priv, bdb); |
| 409 | parse_general_definitions(dev_priv, bdb); | ||
| 365 | parse_lfp_panel_data(dev_priv, bdb); | 410 | parse_lfp_panel_data(dev_priv, bdb); |
| 366 | parse_sdvo_panel_data(dev_priv, bdb); | 411 | parse_sdvo_panel_data(dev_priv, bdb); |
| 367 | parse_sdvo_device_mapping(dev_priv, bdb); | 412 | parse_sdvo_device_mapping(dev_priv, bdb); |
diff --git a/drivers/gpu/drm/i915/intel_crt.c b/drivers/gpu/drm/i915/intel_crt.c index 4cf8e2e88a40..590f81c8f594 100644 --- a/drivers/gpu/drm/i915/intel_crt.c +++ b/drivers/gpu/drm/i915/intel_crt.c | |||
| @@ -508,6 +508,7 @@ void intel_crt_init(struct drm_device *dev) | |||
| 508 | { | 508 | { |
| 509 | struct drm_connector *connector; | 509 | struct drm_connector *connector; |
| 510 | struct intel_output *intel_output; | 510 | struct intel_output *intel_output; |
| 511 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
| 511 | u32 i2c_reg; | 512 | u32 i2c_reg; |
| 512 | 513 | ||
| 513 | intel_output = kzalloc(sizeof(struct intel_output), GFP_KERNEL); | 514 | intel_output = kzalloc(sizeof(struct intel_output), GFP_KERNEL); |
| @@ -527,8 +528,12 @@ void intel_crt_init(struct drm_device *dev) | |||
| 527 | /* Set up the DDC bus. */ | 528 | /* Set up the DDC bus. */ |
| 528 | if (IS_IGDNG(dev)) | 529 | if (IS_IGDNG(dev)) |
| 529 | i2c_reg = PCH_GPIOA; | 530 | i2c_reg = PCH_GPIOA; |
| 530 | else | 531 | else { |
| 531 | i2c_reg = GPIOA; | 532 | i2c_reg = GPIOA; |
| 533 | /* Use VBT information for CRT DDC if available */ | ||
| 534 | if (dev_priv->crt_ddc_bus != -1) | ||
| 535 | i2c_reg = dev_priv->crt_ddc_bus; | ||
| 536 | } | ||
| 532 | intel_output->ddc_bus = intel_i2c_create(dev, i2c_reg, "CRTDDC_A"); | 537 | intel_output->ddc_bus = intel_i2c_create(dev, i2c_reg, "CRTDDC_A"); |
| 533 | if (!intel_output->ddc_bus) { | 538 | if (!intel_output->ddc_bus) { |
| 534 | dev_printk(KERN_ERR, &dev->pdev->dev, "DDC bus registration " | 539 | dev_printk(KERN_ERR, &dev->pdev->dev, "DDC bus registration " |
| @@ -537,6 +542,10 @@ void intel_crt_init(struct drm_device *dev) | |||
| 537 | } | 542 | } |
| 538 | 543 | ||
| 539 | intel_output->type = INTEL_OUTPUT_ANALOG; | 544 | intel_output->type = INTEL_OUTPUT_ANALOG; |
| 545 | intel_output->clone_mask = (1 << INTEL_SDVO_NON_TV_CLONE_BIT) | | ||
| 546 | (1 << INTEL_ANALOG_CLONE_BIT) | | ||
| 547 | (1 << INTEL_SDVO_LVDS_CLONE_BIT); | ||
| 548 | intel_output->crtc_mask = (1 << 0) | (1 << 1); | ||
| 540 | connector->interlace_allowed = 0; | 549 | connector->interlace_allowed = 0; |
| 541 | connector->doublescan_allowed = 0; | 550 | connector->doublescan_allowed = 0; |
| 542 | 551 | ||
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index d6fce2133413..3fadb5358858 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
| @@ -666,7 +666,7 @@ intel_find_best_PLL(const intel_limit_t *limit, struct drm_crtc *crtc, | |||
| 666 | intel_clock_t clock; | 666 | intel_clock_t clock; |
| 667 | int err = target; | 667 | int err = target; |
| 668 | 668 | ||
| 669 | if (IS_I9XX(dev) && intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS) && | 669 | if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS) && |
| 670 | (I915_READ(LVDS)) != 0) { | 670 | (I915_READ(LVDS)) != 0) { |
| 671 | /* | 671 | /* |
| 672 | * For LVDS, if the panel is on, just rely on its current | 672 | * For LVDS, if the panel is on, just rely on its current |
| @@ -2396,7 +2396,7 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc, | |||
| 2396 | if (is_sdvo) { | 2396 | if (is_sdvo) { |
| 2397 | dpll |= DPLL_DVO_HIGH_SPEED; | 2397 | dpll |= DPLL_DVO_HIGH_SPEED; |
| 2398 | sdvo_pixel_multiply = adjusted_mode->clock / mode->clock; | 2398 | sdvo_pixel_multiply = adjusted_mode->clock / mode->clock; |
| 2399 | if (IS_I945G(dev) || IS_I945GM(dev)) | 2399 | if (IS_I945G(dev) || IS_I945GM(dev) || IS_G33(dev)) |
| 2400 | dpll |= (sdvo_pixel_multiply - 1) << SDVO_MULTIPLIER_SHIFT_HIRES; | 2400 | dpll |= (sdvo_pixel_multiply - 1) << SDVO_MULTIPLIER_SHIFT_HIRES; |
| 2401 | else if (IS_IGDNG(dev)) | 2401 | else if (IS_IGDNG(dev)) |
| 2402 | dpll |= (sdvo_pixel_multiply - 1) << PLL_REF_SDVO_HDMI_MULTIPLIER_SHIFT; | 2402 | dpll |= (sdvo_pixel_multiply - 1) << PLL_REF_SDVO_HDMI_MULTIPLIER_SHIFT; |
| @@ -3170,7 +3170,7 @@ static int intel_connector_clones(struct drm_device *dev, int type_mask) | |||
| 3170 | 3170 | ||
| 3171 | list_for_each_entry(connector, &dev->mode_config.connector_list, head) { | 3171 | list_for_each_entry(connector, &dev->mode_config.connector_list, head) { |
| 3172 | struct intel_output *intel_output = to_intel_output(connector); | 3172 | struct intel_output *intel_output = to_intel_output(connector); |
| 3173 | if (type_mask & (1 << intel_output->type)) | 3173 | if (type_mask & intel_output->clone_mask) |
| 3174 | index_mask |= (1 << entry); | 3174 | index_mask |= (1 << entry); |
| 3175 | entry++; | 3175 | entry++; |
| 3176 | } | 3176 | } |
| @@ -3218,30 +3218,30 @@ static void intel_setup_outputs(struct drm_device *dev) | |||
| 3218 | intel_dp_init(dev, PCH_DP_D); | 3218 | intel_dp_init(dev, PCH_DP_D); |
| 3219 | 3219 | ||
| 3220 | } else if (IS_I9XX(dev)) { | 3220 | } else if (IS_I9XX(dev)) { |
| 3221 | int found; | 3221 | bool found = false; |
| 3222 | u32 reg; | ||
| 3223 | 3222 | ||
| 3224 | if (I915_READ(SDVOB) & SDVO_DETECTED) { | 3223 | if (I915_READ(SDVOB) & SDVO_DETECTED) { |
| 3225 | found = intel_sdvo_init(dev, SDVOB); | 3224 | found = intel_sdvo_init(dev, SDVOB); |
| 3226 | if (!found && SUPPORTS_INTEGRATED_HDMI(dev)) | 3225 | if (!found && SUPPORTS_INTEGRATED_HDMI(dev)) |
| 3227 | intel_hdmi_init(dev, SDVOB); | 3226 | intel_hdmi_init(dev, SDVOB); |
| 3227 | |||
| 3228 | if (!found && SUPPORTS_INTEGRATED_DP(dev)) | 3228 | if (!found && SUPPORTS_INTEGRATED_DP(dev)) |
| 3229 | intel_dp_init(dev, DP_B); | 3229 | intel_dp_init(dev, DP_B); |
| 3230 | } | 3230 | } |
| 3231 | 3231 | ||
| 3232 | /* Before G4X SDVOC doesn't have its own detect register */ | 3232 | /* Before G4X SDVOC doesn't have its own detect register */ |
| 3233 | if (IS_G4X(dev)) | ||
| 3234 | reg = SDVOC; | ||
| 3235 | else | ||
| 3236 | reg = SDVOB; | ||
| 3237 | 3233 | ||
| 3238 | if (I915_READ(reg) & SDVO_DETECTED) { | 3234 | if (I915_READ(SDVOB) & SDVO_DETECTED) |
| 3239 | found = intel_sdvo_init(dev, SDVOC); | 3235 | found = intel_sdvo_init(dev, SDVOC); |
| 3240 | if (!found && SUPPORTS_INTEGRATED_HDMI(dev)) | 3236 | |
| 3237 | if (!found && (I915_READ(SDVOC) & SDVO_DETECTED)) { | ||
| 3238 | |||
| 3239 | if (SUPPORTS_INTEGRATED_HDMI(dev)) | ||
| 3241 | intel_hdmi_init(dev, SDVOC); | 3240 | intel_hdmi_init(dev, SDVOC); |
| 3242 | if (!found && SUPPORTS_INTEGRATED_DP(dev)) | 3241 | if (SUPPORTS_INTEGRATED_DP(dev)) |
| 3243 | intel_dp_init(dev, DP_C); | 3242 | intel_dp_init(dev, DP_C); |
| 3244 | } | 3243 | } |
| 3244 | |||
| 3245 | if (SUPPORTS_INTEGRATED_DP(dev) && (I915_READ(DP_D) & DP_DETECTED)) | 3245 | if (SUPPORTS_INTEGRATED_DP(dev) && (I915_READ(DP_D) & DP_DETECTED)) |
| 3246 | intel_dp_init(dev, DP_D); | 3246 | intel_dp_init(dev, DP_D); |
| 3247 | } else | 3247 | } else |
| @@ -3253,51 +3253,10 @@ static void intel_setup_outputs(struct drm_device *dev) | |||
| 3253 | list_for_each_entry(connector, &dev->mode_config.connector_list, head) { | 3253 | list_for_each_entry(connector, &dev->mode_config.connector_list, head) { |
| 3254 | struct intel_output *intel_output = to_intel_output(connector); | 3254 | struct intel_output *intel_output = to_intel_output(connector); |
| 3255 | struct drm_encoder *encoder = &intel_output->enc; | 3255 | struct drm_encoder *encoder = &intel_output->enc; |
| 3256 | int crtc_mask = 0, clone_mask = 0; | ||
| 3257 | 3256 | ||
| 3258 | /* valid crtcs */ | 3257 | encoder->possible_crtcs = intel_output->crtc_mask; |
| 3259 | switch(intel_output->type) { | 3258 | encoder->possible_clones = intel_connector_clones(dev, |
| 3260 | case INTEL_OUTPUT_HDMI: | 3259 | intel_output->clone_mask); |
| 3261 | crtc_mask = ((1 << 0)| | ||
| 3262 | (1 << 1)); | ||
| 3263 | clone_mask = ((1 << INTEL_OUTPUT_HDMI)); | ||
| 3264 | break; | ||
| 3265 | case INTEL_OUTPUT_DVO: | ||
| 3266 | case INTEL_OUTPUT_SDVO: | ||
| 3267 | crtc_mask = ((1 << 0)| | ||
| 3268 | (1 << 1)); | ||
| 3269 | clone_mask = ((1 << INTEL_OUTPUT_ANALOG) | | ||
| 3270 | (1 << INTEL_OUTPUT_DVO) | | ||
| 3271 | (1 << INTEL_OUTPUT_SDVO)); | ||
| 3272 | break; | ||
| 3273 | case INTEL_OUTPUT_ANALOG: | ||
| 3274 | crtc_mask = ((1 << 0)| | ||
| 3275 | (1 << 1)); | ||
| 3276 | clone_mask = ((1 << INTEL_OUTPUT_ANALOG) | | ||
| 3277 | (1 << INTEL_OUTPUT_DVO) | | ||
| 3278 | (1 << INTEL_OUTPUT_SDVO)); | ||
| 3279 | break; | ||
| 3280 | case INTEL_OUTPUT_LVDS: | ||
| 3281 | crtc_mask = (1 << 1); | ||
| 3282 | clone_mask = (1 << INTEL_OUTPUT_LVDS); | ||
| 3283 | break; | ||
| 3284 | case INTEL_OUTPUT_TVOUT: | ||
| 3285 | crtc_mask = ((1 << 0) | | ||
| 3286 | (1 << 1)); | ||
| 3287 | clone_mask = (1 << INTEL_OUTPUT_TVOUT); | ||
| 3288 | break; | ||
| 3289 | case INTEL_OUTPUT_DISPLAYPORT: | ||
| 3290 | crtc_mask = ((1 << 0) | | ||
| 3291 | (1 << 1)); | ||
| 3292 | clone_mask = (1 << INTEL_OUTPUT_DISPLAYPORT); | ||
| 3293 | break; | ||
| 3294 | case INTEL_OUTPUT_EDP: | ||
| 3295 | crtc_mask = (1 << 1); | ||
| 3296 | clone_mask = (1 << INTEL_OUTPUT_EDP); | ||
| 3297 | break; | ||
| 3298 | } | ||
| 3299 | encoder->possible_crtcs = crtc_mask; | ||
| 3300 | encoder->possible_clones = intel_connector_clones(dev, clone_mask); | ||
| 3301 | } | 3260 | } |
| 3302 | } | 3261 | } |
| 3303 | 3262 | ||
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index a6ff15ac548a..f2afc4af4bc9 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c | |||
| @@ -1254,6 +1254,18 @@ intel_dp_init(struct drm_device *dev, int output_reg) | |||
| 1254 | else | 1254 | else |
| 1255 | intel_output->type = INTEL_OUTPUT_DISPLAYPORT; | 1255 | intel_output->type = INTEL_OUTPUT_DISPLAYPORT; |
| 1256 | 1256 | ||
| 1257 | if (output_reg == DP_B) | ||
| 1258 | intel_output->clone_mask = (1 << INTEL_DP_B_CLONE_BIT); | ||
| 1259 | else if (output_reg == DP_C) | ||
| 1260 | intel_output->clone_mask = (1 << INTEL_DP_C_CLONE_BIT); | ||
| 1261 | else if (output_reg == DP_D) | ||
| 1262 | intel_output->clone_mask = (1 << INTEL_DP_D_CLONE_BIT); | ||
| 1263 | |||
| 1264 | if (IS_eDP(intel_output)) { | ||
| 1265 | intel_output->crtc_mask = (1 << 1); | ||
| 1266 | intel_output->clone_mask = (1 << INTEL_OUTPUT_EDP); | ||
| 1267 | } else | ||
| 1268 | intel_output->crtc_mask = (1 << 0) | (1 << 1); | ||
| 1257 | connector->interlace_allowed = true; | 1269 | connector->interlace_allowed = true; |
| 1258 | connector->doublescan_allowed = 0; | 1270 | connector->doublescan_allowed = 0; |
| 1259 | 1271 | ||
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h index d6f92ea1b553..25aa6facc12d 100644 --- a/drivers/gpu/drm/i915/intel_drv.h +++ b/drivers/gpu/drm/i915/intel_drv.h | |||
| @@ -57,6 +57,24 @@ | |||
| 57 | #define INTEL_OUTPUT_DISPLAYPORT 7 | 57 | #define INTEL_OUTPUT_DISPLAYPORT 7 |
| 58 | #define INTEL_OUTPUT_EDP 8 | 58 | #define INTEL_OUTPUT_EDP 8 |
| 59 | 59 | ||
| 60 | /* Intel Pipe Clone Bit */ | ||
| 61 | #define INTEL_HDMIB_CLONE_BIT 1 | ||
| 62 | #define INTEL_HDMIC_CLONE_BIT 2 | ||
| 63 | #define INTEL_HDMID_CLONE_BIT 3 | ||
| 64 | #define INTEL_HDMIE_CLONE_BIT 4 | ||
| 65 | #define INTEL_HDMIF_CLONE_BIT 5 | ||
| 66 | #define INTEL_SDVO_NON_TV_CLONE_BIT 6 | ||
| 67 | #define INTEL_SDVO_TV_CLONE_BIT 7 | ||
| 68 | #define INTEL_SDVO_LVDS_CLONE_BIT 8 | ||
| 69 | #define INTEL_ANALOG_CLONE_BIT 9 | ||
| 70 | #define INTEL_TV_CLONE_BIT 10 | ||
| 71 | #define INTEL_DP_B_CLONE_BIT 11 | ||
| 72 | #define INTEL_DP_C_CLONE_BIT 12 | ||
| 73 | #define INTEL_DP_D_CLONE_BIT 13 | ||
| 74 | #define INTEL_LVDS_CLONE_BIT 14 | ||
| 75 | #define INTEL_DVO_TMDS_CLONE_BIT 15 | ||
| 76 | #define INTEL_DVO_LVDS_CLONE_BIT 16 | ||
| 77 | |||
| 60 | #define INTEL_DVO_CHIP_NONE 0 | 78 | #define INTEL_DVO_CHIP_NONE 0 |
| 61 | #define INTEL_DVO_CHIP_LVDS 1 | 79 | #define INTEL_DVO_CHIP_LVDS 1 |
| 62 | #define INTEL_DVO_CHIP_TMDS 2 | 80 | #define INTEL_DVO_CHIP_TMDS 2 |
| @@ -86,6 +104,8 @@ struct intel_output { | |||
| 86 | bool needs_tv_clock; | 104 | bool needs_tv_clock; |
| 87 | void *dev_priv; | 105 | void *dev_priv; |
| 88 | void (*hot_plug)(struct intel_output *); | 106 | void (*hot_plug)(struct intel_output *); |
| 107 | int crtc_mask; | ||
| 108 | int clone_mask; | ||
| 89 | }; | 109 | }; |
| 90 | 110 | ||
| 91 | struct intel_crtc { | 111 | struct intel_crtc { |
diff --git a/drivers/gpu/drm/i915/intel_dvo.c b/drivers/gpu/drm/i915/intel_dvo.c index 13bff20930e8..a4d2606de778 100644 --- a/drivers/gpu/drm/i915/intel_dvo.c +++ b/drivers/gpu/drm/i915/intel_dvo.c | |||
| @@ -435,14 +435,20 @@ void intel_dvo_init(struct drm_device *dev) | |||
| 435 | continue; | 435 | continue; |
| 436 | 436 | ||
| 437 | intel_output->type = INTEL_OUTPUT_DVO; | 437 | intel_output->type = INTEL_OUTPUT_DVO; |
| 438 | intel_output->crtc_mask = (1 << 0) | (1 << 1); | ||
| 438 | switch (dvo->type) { | 439 | switch (dvo->type) { |
| 439 | case INTEL_DVO_CHIP_TMDS: | 440 | case INTEL_DVO_CHIP_TMDS: |
| 441 | intel_output->clone_mask = | ||
| 442 | (1 << INTEL_DVO_TMDS_CLONE_BIT) | | ||
| 443 | (1 << INTEL_ANALOG_CLONE_BIT); | ||
| 440 | drm_connector_init(dev, connector, | 444 | drm_connector_init(dev, connector, |
| 441 | &intel_dvo_connector_funcs, | 445 | &intel_dvo_connector_funcs, |
| 442 | DRM_MODE_CONNECTOR_DVII); | 446 | DRM_MODE_CONNECTOR_DVII); |
| 443 | encoder_type = DRM_MODE_ENCODER_TMDS; | 447 | encoder_type = DRM_MODE_ENCODER_TMDS; |
| 444 | break; | 448 | break; |
| 445 | case INTEL_DVO_CHIP_LVDS: | 449 | case INTEL_DVO_CHIP_LVDS: |
| 450 | intel_output->clone_mask = | ||
| 451 | (1 << INTEL_DVO_LVDS_CLONE_BIT); | ||
| 446 | drm_connector_init(dev, connector, | 452 | drm_connector_init(dev, connector, |
| 447 | &intel_dvo_connector_funcs, | 453 | &intel_dvo_connector_funcs, |
| 448 | DRM_MODE_CONNECTOR_LVDS); | 454 | DRM_MODE_CONNECTOR_LVDS); |
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c index 1842290cded3..fa304e136010 100644 --- a/drivers/gpu/drm/i915/intel_hdmi.c +++ b/drivers/gpu/drm/i915/intel_hdmi.c | |||
| @@ -230,22 +230,28 @@ void intel_hdmi_init(struct drm_device *dev, int sdvox_reg) | |||
| 230 | 230 | ||
| 231 | connector->interlace_allowed = 0; | 231 | connector->interlace_allowed = 0; |
| 232 | connector->doublescan_allowed = 0; | 232 | connector->doublescan_allowed = 0; |
| 233 | intel_output->crtc_mask = (1 << 0) | (1 << 1); | ||
| 233 | 234 | ||
| 234 | /* Set up the DDC bus. */ | 235 | /* Set up the DDC bus. */ |
| 235 | if (sdvox_reg == SDVOB) | 236 | if (sdvox_reg == SDVOB) { |
| 237 | intel_output->clone_mask = (1 << INTEL_HDMIB_CLONE_BIT); | ||
| 236 | intel_output->ddc_bus = intel_i2c_create(dev, GPIOE, "HDMIB"); | 238 | intel_output->ddc_bus = intel_i2c_create(dev, GPIOE, "HDMIB"); |
| 237 | else if (sdvox_reg == SDVOC) | 239 | } else if (sdvox_reg == SDVOC) { |
| 240 | intel_output->clone_mask = (1 << INTEL_HDMIC_CLONE_BIT); | ||
| 238 | intel_output->ddc_bus = intel_i2c_create(dev, GPIOD, "HDMIC"); | 241 | intel_output->ddc_bus = intel_i2c_create(dev, GPIOD, "HDMIC"); |
| 239 | else if (sdvox_reg == HDMIB) | 242 | } else if (sdvox_reg == HDMIB) { |
| 243 | intel_output->clone_mask = (1 << INTEL_HDMID_CLONE_BIT); | ||
| 240 | intel_output->ddc_bus = intel_i2c_create(dev, PCH_GPIOE, | 244 | intel_output->ddc_bus = intel_i2c_create(dev, PCH_GPIOE, |
| 241 | "HDMIB"); | 245 | "HDMIB"); |
| 242 | else if (sdvox_reg == HDMIC) | 246 | } else if (sdvox_reg == HDMIC) { |
| 247 | intel_output->clone_mask = (1 << INTEL_HDMIE_CLONE_BIT); | ||
| 243 | intel_output->ddc_bus = intel_i2c_create(dev, PCH_GPIOD, | 248 | intel_output->ddc_bus = intel_i2c_create(dev, PCH_GPIOD, |
| 244 | "HDMIC"); | 249 | "HDMIC"); |
| 245 | else if (sdvox_reg == HDMID) | 250 | } else if (sdvox_reg == HDMID) { |
| 251 | intel_output->clone_mask = (1 << INTEL_HDMIF_CLONE_BIT); | ||
| 246 | intel_output->ddc_bus = intel_i2c_create(dev, PCH_GPIOF, | 252 | intel_output->ddc_bus = intel_i2c_create(dev, PCH_GPIOF, |
| 247 | "HDMID"); | 253 | "HDMID"); |
| 248 | 254 | } | |
| 249 | if (!intel_output->ddc_bus) | 255 | if (!intel_output->ddc_bus) |
| 250 | goto err_connector; | 256 | goto err_connector; |
| 251 | 257 | ||
diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c index 3f445a80c552..8df02ef89261 100644 --- a/drivers/gpu/drm/i915/intel_lvds.c +++ b/drivers/gpu/drm/i915/intel_lvds.c | |||
| @@ -916,6 +916,8 @@ void intel_lvds_init(struct drm_device *dev) | |||
| 916 | drm_mode_connector_attach_encoder(&intel_output->base, &intel_output->enc); | 916 | drm_mode_connector_attach_encoder(&intel_output->base, &intel_output->enc); |
| 917 | intel_output->type = INTEL_OUTPUT_LVDS; | 917 | intel_output->type = INTEL_OUTPUT_LVDS; |
| 918 | 918 | ||
| 919 | intel_output->clone_mask = (1 << INTEL_LVDS_CLONE_BIT); | ||
| 920 | intel_output->crtc_mask = (1 << 1); | ||
| 919 | drm_encoder_helper_add(encoder, &intel_lvds_helper_funcs); | 921 | drm_encoder_helper_add(encoder, &intel_lvds_helper_funcs); |
| 920 | drm_connector_helper_add(connector, &intel_lvds_connector_helper_funcs); | 922 | drm_connector_helper_add(connector, &intel_lvds_connector_helper_funcs); |
| 921 | connector->display_info.subpixel_order = SubPixelHorizontalRGB; | 923 | connector->display_info.subpixel_order = SubPixelHorizontalRGB; |
diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c index 5371d9332554..d3b74ba62b4a 100644 --- a/drivers/gpu/drm/i915/intel_sdvo.c +++ b/drivers/gpu/drm/i915/intel_sdvo.c | |||
| @@ -1458,7 +1458,7 @@ intel_sdvo_multifunc_encoder(struct intel_output *intel_output) | |||
| 1458 | (SDVO_OUTPUT_RGB0 | SDVO_OUTPUT_RGB1)) | 1458 | (SDVO_OUTPUT_RGB0 | SDVO_OUTPUT_RGB1)) |
| 1459 | caps++; | 1459 | caps++; |
| 1460 | if (sdvo_priv->caps.output_flags & | 1460 | if (sdvo_priv->caps.output_flags & |
| 1461 | (SDVO_OUTPUT_SVID0 | SDVO_OUTPUT_SVID0)) | 1461 | (SDVO_OUTPUT_SVID0 | SDVO_OUTPUT_SVID1)) |
| 1462 | caps++; | 1462 | caps++; |
| 1463 | if (sdvo_priv->caps.output_flags & | 1463 | if (sdvo_priv->caps.output_flags & |
| 1464 | (SDVO_OUTPUT_CVBS0 | SDVO_OUTPUT_CVBS1)) | 1464 | (SDVO_OUTPUT_CVBS0 | SDVO_OUTPUT_CVBS1)) |
| @@ -1967,6 +1967,9 @@ intel_sdvo_output_setup(struct intel_output *intel_output, uint16_t flags) | |||
| 1967 | intel_sdvo_set_colorimetry(intel_output, | 1967 | intel_sdvo_set_colorimetry(intel_output, |
| 1968 | SDVO_COLORIMETRY_RGB256); | 1968 | SDVO_COLORIMETRY_RGB256); |
| 1969 | connector->connector_type = DRM_MODE_CONNECTOR_HDMIA; | 1969 | connector->connector_type = DRM_MODE_CONNECTOR_HDMIA; |
| 1970 | intel_output->clone_mask = | ||
| 1971 | (1 << INTEL_SDVO_NON_TV_CLONE_BIT) | | ||
| 1972 | (1 << INTEL_ANALOG_CLONE_BIT); | ||
| 1970 | } | 1973 | } |
| 1971 | } else if (flags & SDVO_OUTPUT_SVID0) { | 1974 | } else if (flags & SDVO_OUTPUT_SVID0) { |
| 1972 | 1975 | ||
| @@ -1975,11 +1978,14 @@ intel_sdvo_output_setup(struct intel_output *intel_output, uint16_t flags) | |||
| 1975 | connector->connector_type = DRM_MODE_CONNECTOR_SVIDEO; | 1978 | connector->connector_type = DRM_MODE_CONNECTOR_SVIDEO; |
| 1976 | sdvo_priv->is_tv = true; | 1979 | sdvo_priv->is_tv = true; |
| 1977 | intel_output->needs_tv_clock = true; | 1980 | intel_output->needs_tv_clock = true; |
| 1981 | intel_output->clone_mask = 1 << INTEL_SDVO_TV_CLONE_BIT; | ||
| 1978 | } else if (flags & SDVO_OUTPUT_RGB0) { | 1982 | } else if (flags & SDVO_OUTPUT_RGB0) { |
| 1979 | 1983 | ||
| 1980 | sdvo_priv->controlled_output = SDVO_OUTPUT_RGB0; | 1984 | sdvo_priv->controlled_output = SDVO_OUTPUT_RGB0; |
| 1981 | encoder->encoder_type = DRM_MODE_ENCODER_DAC; | 1985 | encoder->encoder_type = DRM_MODE_ENCODER_DAC; |
| 1982 | connector->connector_type = DRM_MODE_CONNECTOR_VGA; | 1986 | connector->connector_type = DRM_MODE_CONNECTOR_VGA; |
| 1987 | intel_output->clone_mask = (1 << INTEL_SDVO_NON_TV_CLONE_BIT) | | ||
| 1988 | (1 << INTEL_ANALOG_CLONE_BIT); | ||
| 1983 | } else if (flags & SDVO_OUTPUT_RGB1) { | 1989 | } else if (flags & SDVO_OUTPUT_RGB1) { |
| 1984 | 1990 | ||
| 1985 | sdvo_priv->controlled_output = SDVO_OUTPUT_RGB1; | 1991 | sdvo_priv->controlled_output = SDVO_OUTPUT_RGB1; |
| @@ -1991,12 +1997,16 @@ intel_sdvo_output_setup(struct intel_output *intel_output, uint16_t flags) | |||
| 1991 | encoder->encoder_type = DRM_MODE_ENCODER_LVDS; | 1997 | encoder->encoder_type = DRM_MODE_ENCODER_LVDS; |
| 1992 | connector->connector_type = DRM_MODE_CONNECTOR_LVDS; | 1998 | connector->connector_type = DRM_MODE_CONNECTOR_LVDS; |
| 1993 | sdvo_priv->is_lvds = true; | 1999 | sdvo_priv->is_lvds = true; |
| 2000 | intel_output->clone_mask = (1 << INTEL_ANALOG_CLONE_BIT) | | ||
| 2001 | (1 << INTEL_SDVO_LVDS_CLONE_BIT); | ||
| 1994 | } else if (flags & SDVO_OUTPUT_LVDS1) { | 2002 | } else if (flags & SDVO_OUTPUT_LVDS1) { |
| 1995 | 2003 | ||
| 1996 | sdvo_priv->controlled_output = SDVO_OUTPUT_LVDS1; | 2004 | sdvo_priv->controlled_output = SDVO_OUTPUT_LVDS1; |
| 1997 | encoder->encoder_type = DRM_MODE_ENCODER_LVDS; | 2005 | encoder->encoder_type = DRM_MODE_ENCODER_LVDS; |
| 1998 | connector->connector_type = DRM_MODE_CONNECTOR_LVDS; | 2006 | connector->connector_type = DRM_MODE_CONNECTOR_LVDS; |
| 1999 | sdvo_priv->is_lvds = true; | 2007 | sdvo_priv->is_lvds = true; |
| 2008 | intel_output->clone_mask = (1 << INTEL_ANALOG_CLONE_BIT) | | ||
| 2009 | (1 << INTEL_SDVO_LVDS_CLONE_BIT); | ||
| 2000 | } else { | 2010 | } else { |
| 2001 | 2011 | ||
| 2002 | unsigned char bytes[2]; | 2012 | unsigned char bytes[2]; |
| @@ -2009,6 +2019,7 @@ intel_sdvo_output_setup(struct intel_output *intel_output, uint16_t flags) | |||
| 2009 | bytes[0], bytes[1]); | 2019 | bytes[0], bytes[1]); |
| 2010 | ret = false; | 2020 | ret = false; |
| 2011 | } | 2021 | } |
| 2022 | intel_output->crtc_mask = (1 << 0) | (1 << 1); | ||
| 2012 | 2023 | ||
| 2013 | if (ret && registered) | 2024 | if (ret && registered) |
| 2014 | ret = drm_sysfs_connector_add(connector) == 0 ? true : false; | 2025 | ret = drm_sysfs_connector_add(connector) == 0 ? true : false; |
diff --git a/drivers/gpu/drm/i915/intel_tv.c b/drivers/gpu/drm/i915/intel_tv.c index da4ab4dc1630..2fbe13a0de81 100644 --- a/drivers/gpu/drm/i915/intel_tv.c +++ b/drivers/gpu/drm/i915/intel_tv.c | |||
| @@ -1718,6 +1718,7 @@ intel_tv_init(struct drm_device *dev) | |||
| 1718 | if (!intel_output) { | 1718 | if (!intel_output) { |
| 1719 | return; | 1719 | return; |
| 1720 | } | 1720 | } |
| 1721 | |||
| 1721 | connector = &intel_output->base; | 1722 | connector = &intel_output->base; |
| 1722 | 1723 | ||
| 1723 | drm_connector_init(dev, connector, &intel_tv_connector_funcs, | 1724 | drm_connector_init(dev, connector, &intel_tv_connector_funcs, |
| @@ -1729,6 +1730,7 @@ intel_tv_init(struct drm_device *dev) | |||
| 1729 | drm_mode_connector_attach_encoder(&intel_output->base, &intel_output->enc); | 1730 | drm_mode_connector_attach_encoder(&intel_output->base, &intel_output->enc); |
| 1730 | tv_priv = (struct intel_tv_priv *)(intel_output + 1); | 1731 | tv_priv = (struct intel_tv_priv *)(intel_output + 1); |
| 1731 | intel_output->type = INTEL_OUTPUT_TVOUT; | 1732 | intel_output->type = INTEL_OUTPUT_TVOUT; |
| 1733 | intel_output->clone_mask = (1 << INTEL_TV_CLONE_BIT); | ||
| 1732 | intel_output->enc.possible_crtcs = ((1 << 0) | (1 << 1)); | 1734 | intel_output->enc.possible_crtcs = ((1 << 0) | (1 << 1)); |
| 1733 | intel_output->enc.possible_clones = (1 << INTEL_OUTPUT_TVOUT); | 1735 | intel_output->enc.possible_clones = (1 << INTEL_OUTPUT_TVOUT); |
| 1734 | intel_output->dev_priv = tv_priv; | 1736 | intel_output->dev_priv = tv_priv; |
diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c index f1ba8ff41130..68e728e8be4d 100644 --- a/drivers/gpu/drm/radeon/r100.c +++ b/drivers/gpu/drm/radeon/r100.c | |||
| @@ -254,6 +254,72 @@ void r100_mc_fini(struct radeon_device *rdev) | |||
| 254 | 254 | ||
| 255 | 255 | ||
| 256 | /* | 256 | /* |
| 257 | * Interrupts | ||
| 258 | */ | ||
| 259 | int r100_irq_set(struct radeon_device *rdev) | ||
| 260 | { | ||
| 261 | uint32_t tmp = 0; | ||
| 262 | |||
| 263 | if (rdev->irq.sw_int) { | ||
| 264 | tmp |= RADEON_SW_INT_ENABLE; | ||
| 265 | } | ||
| 266 | if (rdev->irq.crtc_vblank_int[0]) { | ||
| 267 | tmp |= RADEON_CRTC_VBLANK_MASK; | ||
| 268 | } | ||
| 269 | if (rdev->irq.crtc_vblank_int[1]) { | ||
| 270 | tmp |= RADEON_CRTC2_VBLANK_MASK; | ||
| 271 | } | ||
| 272 | WREG32(RADEON_GEN_INT_CNTL, tmp); | ||
| 273 | return 0; | ||
| 274 | } | ||
| 275 | |||
| 276 | static inline uint32_t r100_irq_ack(struct radeon_device *rdev) | ||
| 277 | { | ||
| 278 | uint32_t irqs = RREG32(RADEON_GEN_INT_STATUS); | ||
| 279 | uint32_t irq_mask = RADEON_SW_INT_TEST | RADEON_CRTC_VBLANK_STAT | | ||
| 280 | RADEON_CRTC2_VBLANK_STAT; | ||
| 281 | |||
| 282 | if (irqs) { | ||
| 283 | WREG32(RADEON_GEN_INT_STATUS, irqs); | ||
| 284 | } | ||
| 285 | return irqs & irq_mask; | ||
| 286 | } | ||
| 287 | |||
| 288 | int r100_irq_process(struct radeon_device *rdev) | ||
| 289 | { | ||
| 290 | uint32_t status; | ||
| 291 | |||
| 292 | status = r100_irq_ack(rdev); | ||
| 293 | if (!status) { | ||
| 294 | return IRQ_NONE; | ||
| 295 | } | ||
| 296 | while (status) { | ||
| 297 | /* SW interrupt */ | ||
| 298 | if (status & RADEON_SW_INT_TEST) { | ||
| 299 | radeon_fence_process(rdev); | ||
| 300 | } | ||
| 301 | /* Vertical blank interrupts */ | ||
| 302 | if (status & RADEON_CRTC_VBLANK_STAT) { | ||
| 303 | drm_handle_vblank(rdev->ddev, 0); | ||
| 304 | } | ||
| 305 | if (status & RADEON_CRTC2_VBLANK_STAT) { | ||
| 306 | drm_handle_vblank(rdev->ddev, 1); | ||
| 307 | } | ||
| 308 | status = r100_irq_ack(rdev); | ||
| 309 | } | ||
| 310 | return IRQ_HANDLED; | ||
| 311 | } | ||
| 312 | |||
| 313 | u32 r100_get_vblank_counter(struct radeon_device *rdev, int crtc) | ||
| 314 | { | ||
| 315 | if (crtc == 0) | ||
| 316 | return RREG32(RADEON_CRTC_CRNT_FRAME); | ||
| 317 | else | ||
| 318 | return RREG32(RADEON_CRTC2_CRNT_FRAME); | ||
| 319 | } | ||
| 320 | |||
| 321 | |||
| 322 | /* | ||
| 257 | * Fence emission | 323 | * Fence emission |
| 258 | */ | 324 | */ |
| 259 | void r100_fence_ring_emit(struct radeon_device *rdev, | 325 | void r100_fence_ring_emit(struct radeon_device *rdev, |
| @@ -1025,6 +1091,16 @@ static int r100_packet0_check(struct radeon_cs_parser *p, | |||
| 1025 | tmp |= tile_flags; | 1091 | tmp |= tile_flags; |
| 1026 | ib[idx] = tmp; | 1092 | ib[idx] = tmp; |
| 1027 | break; | 1093 | break; |
| 1094 | case RADEON_RB3D_ZPASS_ADDR: | ||
| 1095 | r = r100_cs_packet_next_reloc(p, &reloc); | ||
| 1096 | if (r) { | ||
| 1097 | DRM_ERROR("No reloc for ib[%d]=0x%04X\n", | ||
| 1098 | idx, reg); | ||
| 1099 | r100_cs_dump_packet(p, pkt); | ||
| 1100 | return r; | ||
| 1101 | } | ||
| 1102 | ib[idx] = ib_chunk->kdata[idx] + ((u32)reloc->lobj.gpu_offset); | ||
| 1103 | break; | ||
| 1028 | default: | 1104 | default: |
| 1029 | /* FIXME: we don't want to allow anyothers packet */ | 1105 | /* FIXME: we don't want to allow anyothers packet */ |
| 1030 | break; | 1106 | break; |
| @@ -1556,26 +1632,6 @@ void r100_pll_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v) | |||
| 1556 | r100_pll_errata_after_data(rdev); | 1632 | r100_pll_errata_after_data(rdev); |
| 1557 | } | 1633 | } |
| 1558 | 1634 | ||
| 1559 | uint32_t r100_mm_rreg(struct radeon_device *rdev, uint32_t reg) | ||
| 1560 | { | ||
| 1561 | if (reg < 0x10000) | ||
| 1562 | return readl(((void __iomem *)rdev->rmmio) + reg); | ||
| 1563 | else { | ||
| 1564 | writel(reg, ((void __iomem *)rdev->rmmio) + RADEON_MM_INDEX); | ||
| 1565 | return readl(((void __iomem *)rdev->rmmio) + RADEON_MM_DATA); | ||
| 1566 | } | ||
| 1567 | } | ||
| 1568 | |||
| 1569 | void r100_mm_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v) | ||
| 1570 | { | ||
| 1571 | if (reg < 0x10000) | ||
| 1572 | writel(v, ((void __iomem *)rdev->rmmio) + reg); | ||
| 1573 | else { | ||
| 1574 | writel(reg, ((void __iomem *)rdev->rmmio) + RADEON_MM_INDEX); | ||
| 1575 | writel(v, ((void __iomem *)rdev->rmmio) + RADEON_MM_DATA); | ||
| 1576 | } | ||
| 1577 | } | ||
| 1578 | |||
| 1579 | int r100_init(struct radeon_device *rdev) | 1635 | int r100_init(struct radeon_device *rdev) |
| 1580 | { | 1636 | { |
| 1581 | return 0; | 1637 | return 0; |
diff --git a/drivers/gpu/drm/radeon/r300.c b/drivers/gpu/drm/radeon/r300.c index 9c8d41534a5d..053f4ec397f7 100644 --- a/drivers/gpu/drm/radeon/r300.c +++ b/drivers/gpu/drm/radeon/r300.c | |||
| @@ -83,8 +83,8 @@ void rv370_pcie_gart_tlb_flush(struct radeon_device *rdev) | |||
| 83 | WREG32_PCIE(RADEON_PCIE_TX_GART_CNTL, tmp | RADEON_PCIE_TX_GART_INVALIDATE_TLB); | 83 | WREG32_PCIE(RADEON_PCIE_TX_GART_CNTL, tmp | RADEON_PCIE_TX_GART_INVALIDATE_TLB); |
| 84 | (void)RREG32_PCIE(RADEON_PCIE_TX_GART_CNTL); | 84 | (void)RREG32_PCIE(RADEON_PCIE_TX_GART_CNTL); |
| 85 | WREG32_PCIE(RADEON_PCIE_TX_GART_CNTL, tmp); | 85 | WREG32_PCIE(RADEON_PCIE_TX_GART_CNTL, tmp); |
| 86 | mb(); | ||
| 87 | } | 86 | } |
| 87 | mb(); | ||
| 88 | } | 88 | } |
| 89 | 89 | ||
| 90 | int rv370_pcie_gart_enable(struct radeon_device *rdev) | 90 | int rv370_pcie_gart_enable(struct radeon_device *rdev) |
| @@ -448,6 +448,7 @@ void r300_gpu_init(struct radeon_device *rdev) | |||
| 448 | /* rv350,rv370,rv380 */ | 448 | /* rv350,rv370,rv380 */ |
| 449 | rdev->num_gb_pipes = 1; | 449 | rdev->num_gb_pipes = 1; |
| 450 | } | 450 | } |
| 451 | rdev->num_z_pipes = 1; | ||
| 451 | gb_tile_config = (R300_ENABLE_TILING | R300_TILE_SIZE_16); | 452 | gb_tile_config = (R300_ENABLE_TILING | R300_TILE_SIZE_16); |
| 452 | switch (rdev->num_gb_pipes) { | 453 | switch (rdev->num_gb_pipes) { |
| 453 | case 2: | 454 | case 2: |
| @@ -486,7 +487,8 @@ void r300_gpu_init(struct radeon_device *rdev) | |||
| 486 | printk(KERN_WARNING "Failed to wait MC idle while " | 487 | printk(KERN_WARNING "Failed to wait MC idle while " |
| 487 | "programming pipes. Bad things might happen.\n"); | 488 | "programming pipes. Bad things might happen.\n"); |
| 488 | } | 489 | } |
| 489 | DRM_INFO("radeon: %d pipes initialized.\n", rdev->num_gb_pipes); | 490 | DRM_INFO("radeon: %d quad pipes, %d Z pipes initialized.\n", |
| 491 | rdev->num_gb_pipes, rdev->num_z_pipes); | ||
| 490 | } | 492 | } |
| 491 | 493 | ||
| 492 | int r300_ga_reset(struct radeon_device *rdev) | 494 | int r300_ga_reset(struct radeon_device *rdev) |
| @@ -593,27 +595,6 @@ void r300_vram_info(struct radeon_device *rdev) | |||
| 593 | 595 | ||
| 594 | 596 | ||
| 595 | /* | 597 | /* |
| 596 | * Indirect registers accessor | ||
| 597 | */ | ||
| 598 | uint32_t rv370_pcie_rreg(struct radeon_device *rdev, uint32_t reg) | ||
| 599 | { | ||
| 600 | uint32_t r; | ||
| 601 | |||
| 602 | WREG8(RADEON_PCIE_INDEX, ((reg) & 0xff)); | ||
| 603 | (void)RREG32(RADEON_PCIE_INDEX); | ||
| 604 | r = RREG32(RADEON_PCIE_DATA); | ||
| 605 | return r; | ||
| 606 | } | ||
| 607 | |||
| 608 | void rv370_pcie_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v) | ||
| 609 | { | ||
| 610 | WREG8(RADEON_PCIE_INDEX, ((reg) & 0xff)); | ||
| 611 | (void)RREG32(RADEON_PCIE_INDEX); | ||
| 612 | WREG32(RADEON_PCIE_DATA, (v)); | ||
| 613 | (void)RREG32(RADEON_PCIE_DATA); | ||
| 614 | } | ||
| 615 | |||
| 616 | /* | ||
| 617 | * PCIE Lanes | 598 | * PCIE Lanes |
| 618 | */ | 599 | */ |
| 619 | 600 | ||
| @@ -1403,6 +1384,21 @@ static int r300_packet0_check(struct radeon_cs_parser *p, | |||
| 1403 | tmp = (ib_chunk->kdata[idx] >> 22) & 0xF; | 1384 | tmp = (ib_chunk->kdata[idx] >> 22) & 0xF; |
| 1404 | track->textures[i].txdepth = tmp; | 1385 | track->textures[i].txdepth = tmp; |
| 1405 | break; | 1386 | break; |
| 1387 | case R300_ZB_ZPASS_ADDR: | ||
| 1388 | r = r100_cs_packet_next_reloc(p, &reloc); | ||
| 1389 | if (r) { | ||
| 1390 | DRM_ERROR("No reloc for ib[%d]=0x%04X\n", | ||
| 1391 | idx, reg); | ||
| 1392 | r100_cs_dump_packet(p, pkt); | ||
| 1393 | return r; | ||
| 1394 | } | ||
| 1395 | ib[idx] = ib_chunk->kdata[idx] + ((u32)reloc->lobj.gpu_offset); | ||
| 1396 | break; | ||
| 1397 | case 0x4be8: | ||
| 1398 | /* valid register only on RV530 */ | ||
| 1399 | if (p->rdev->family == CHIP_RV530) | ||
| 1400 | break; | ||
| 1401 | /* fallthrough do not move */ | ||
| 1406 | default: | 1402 | default: |
| 1407 | printk(KERN_ERR "Forbidden register 0x%04X in cs at %d\n", | 1403 | printk(KERN_ERR "Forbidden register 0x%04X in cs at %d\n", |
| 1408 | reg, idx); | 1404 | reg, idx); |
diff --git a/drivers/gpu/drm/radeon/r420.c b/drivers/gpu/drm/radeon/r420.c index dea497a979f2..97426a6f370f 100644 --- a/drivers/gpu/drm/radeon/r420.c +++ b/drivers/gpu/drm/radeon/r420.c | |||
| @@ -165,7 +165,18 @@ void r420_pipes_init(struct radeon_device *rdev) | |||
| 165 | printk(KERN_WARNING "Failed to wait GUI idle while " | 165 | printk(KERN_WARNING "Failed to wait GUI idle while " |
| 166 | "programming pipes. Bad things might happen.\n"); | 166 | "programming pipes. Bad things might happen.\n"); |
| 167 | } | 167 | } |
| 168 | DRM_INFO("radeon: %d pipes initialized.\n", rdev->num_gb_pipes); | 168 | |
| 169 | if (rdev->family == CHIP_RV530) { | ||
| 170 | tmp = RREG32(RV530_GB_PIPE_SELECT2); | ||
| 171 | if ((tmp & 3) == 3) | ||
| 172 | rdev->num_z_pipes = 2; | ||
| 173 | else | ||
| 174 | rdev->num_z_pipes = 1; | ||
| 175 | } else | ||
| 176 | rdev->num_z_pipes = 1; | ||
| 177 | |||
| 178 | DRM_INFO("radeon: %d quad pipes, %d z pipes initialized.\n", | ||
| 179 | rdev->num_gb_pipes, rdev->num_z_pipes); | ||
| 169 | } | 180 | } |
| 170 | 181 | ||
| 171 | void r420_gpu_init(struct radeon_device *rdev) | 182 | void r420_gpu_init(struct radeon_device *rdev) |
diff --git a/drivers/gpu/drm/radeon/r500_reg.h b/drivers/gpu/drm/radeon/r500_reg.h index 036691b38cb7..e1d5e0331e19 100644 --- a/drivers/gpu/drm/radeon/r500_reg.h +++ b/drivers/gpu/drm/radeon/r500_reg.h | |||
| @@ -350,6 +350,7 @@ | |||
| 350 | #define AVIVO_D1CRTC_BLANK_CONTROL 0x6084 | 350 | #define AVIVO_D1CRTC_BLANK_CONTROL 0x6084 |
| 351 | #define AVIVO_D1CRTC_INTERLACE_CONTROL 0x6088 | 351 | #define AVIVO_D1CRTC_INTERLACE_CONTROL 0x6088 |
| 352 | #define AVIVO_D1CRTC_INTERLACE_STATUS 0x608c | 352 | #define AVIVO_D1CRTC_INTERLACE_STATUS 0x608c |
| 353 | #define AVIVO_D1CRTC_FRAME_COUNT 0x60a4 | ||
| 353 | #define AVIVO_D1CRTC_STEREO_CONTROL 0x60c4 | 354 | #define AVIVO_D1CRTC_STEREO_CONTROL 0x60c4 |
| 354 | 355 | ||
| 355 | /* master controls */ | 356 | /* master controls */ |
| @@ -438,14 +439,15 @@ | |||
| 438 | # define AVIVO_DC_LB_DISP1_END_ADR_SHIFT 4 | 439 | # define AVIVO_DC_LB_DISP1_END_ADR_SHIFT 4 |
| 439 | # define AVIVO_DC_LB_DISP1_END_ADR_MASK 0x7ff | 440 | # define AVIVO_DC_LB_DISP1_END_ADR_MASK 0x7ff |
| 440 | 441 | ||
| 441 | #define R500_DxMODE_INT_MASK 0x6540 | ||
| 442 | #define R500_D1MODE_INT_MASK (1<<0) | ||
| 443 | #define R500_D2MODE_INT_MASK (1<<8) | ||
| 444 | |||
| 445 | #define AVIVO_D1MODE_DATA_FORMAT 0x6528 | 442 | #define AVIVO_D1MODE_DATA_FORMAT 0x6528 |
| 446 | # define AVIVO_D1MODE_INTERLEAVE_EN (1 << 0) | 443 | # define AVIVO_D1MODE_INTERLEAVE_EN (1 << 0) |
| 447 | #define AVIVO_D1MODE_DESKTOP_HEIGHT 0x652C | 444 | #define AVIVO_D1MODE_DESKTOP_HEIGHT 0x652C |
| 445 | #define AVIVO_D1MODE_VBLANK_STATUS 0x6534 | ||
| 446 | # define AVIVO_VBLANK_ACK (1 << 4) | ||
| 448 | #define AVIVO_D1MODE_VLINE_START_END 0x6538 | 447 | #define AVIVO_D1MODE_VLINE_START_END 0x6538 |
| 448 | #define AVIVO_DxMODE_INT_MASK 0x6540 | ||
| 449 | # define AVIVO_D1MODE_INT_MASK (1 << 0) | ||
| 450 | # define AVIVO_D2MODE_INT_MASK (1 << 8) | ||
| 449 | #define AVIVO_D1MODE_VIEWPORT_START 0x6580 | 451 | #define AVIVO_D1MODE_VIEWPORT_START 0x6580 |
| 450 | #define AVIVO_D1MODE_VIEWPORT_SIZE 0x6584 | 452 | #define AVIVO_D1MODE_VIEWPORT_SIZE 0x6584 |
| 451 | #define AVIVO_D1MODE_EXT_OVERSCAN_LEFT_RIGHT 0x6588 | 453 | #define AVIVO_D1MODE_EXT_OVERSCAN_LEFT_RIGHT 0x6588 |
| @@ -475,6 +477,7 @@ | |||
| 475 | #define AVIVO_D2CRTC_BLANK_CONTROL 0x6884 | 477 | #define AVIVO_D2CRTC_BLANK_CONTROL 0x6884 |
| 476 | #define AVIVO_D2CRTC_INTERLACE_CONTROL 0x6888 | 478 | #define AVIVO_D2CRTC_INTERLACE_CONTROL 0x6888 |
| 477 | #define AVIVO_D2CRTC_INTERLACE_STATUS 0x688c | 479 | #define AVIVO_D2CRTC_INTERLACE_STATUS 0x688c |
| 480 | #define AVIVO_D2CRTC_FRAME_COUNT 0x68a4 | ||
| 478 | #define AVIVO_D2CRTC_STEREO_CONTROL 0x68c4 | 481 | #define AVIVO_D2CRTC_STEREO_CONTROL 0x68c4 |
| 479 | 482 | ||
| 480 | #define AVIVO_D2GRPH_ENABLE 0x6900 | 483 | #define AVIVO_D2GRPH_ENABLE 0x6900 |
| @@ -497,6 +500,7 @@ | |||
| 497 | #define AVIVO_D2CUR_SIZE 0x6c10 | 500 | #define AVIVO_D2CUR_SIZE 0x6c10 |
| 498 | #define AVIVO_D2CUR_POSITION 0x6c14 | 501 | #define AVIVO_D2CUR_POSITION 0x6c14 |
| 499 | 502 | ||
| 503 | #define AVIVO_D2MODE_VBLANK_STATUS 0x6d34 | ||
| 500 | #define AVIVO_D2MODE_VLINE_START_END 0x6d38 | 504 | #define AVIVO_D2MODE_VLINE_START_END 0x6d38 |
| 501 | #define AVIVO_D2MODE_VIEWPORT_START 0x6d80 | 505 | #define AVIVO_D2MODE_VIEWPORT_START 0x6d80 |
| 502 | #define AVIVO_D2MODE_VIEWPORT_SIZE 0x6d84 | 506 | #define AVIVO_D2MODE_VIEWPORT_SIZE 0x6d84 |
| @@ -748,4 +752,8 @@ | |||
| 748 | # define AVIVO_I2C_EN (1 << 0) | 752 | # define AVIVO_I2C_EN (1 << 0) |
| 749 | # define AVIVO_I2C_RESET (1 << 8) | 753 | # define AVIVO_I2C_RESET (1 << 8) |
| 750 | 754 | ||
| 755 | #define AVIVO_DISP_INTERRUPT_STATUS 0x7edc | ||
| 756 | # define AVIVO_D1_VBLANK_INTERRUPT (1 << 4) | ||
| 757 | # define AVIVO_D2_VBLANK_INTERRUPT (1 << 5) | ||
| 758 | |||
| 751 | #endif | 759 | #endif |
diff --git a/drivers/gpu/drm/radeon/r520.c b/drivers/gpu/drm/radeon/r520.c index 09fb0b6ec7dd..ebd6b0f7bdff 100644 --- a/drivers/gpu/drm/radeon/r520.c +++ b/drivers/gpu/drm/radeon/r520.c | |||
| @@ -177,7 +177,6 @@ void r520_gpu_init(struct radeon_device *rdev) | |||
| 177 | */ | 177 | */ |
| 178 | /* workaround for RV530 */ | 178 | /* workaround for RV530 */ |
| 179 | if (rdev->family == CHIP_RV530) { | 179 | if (rdev->family == CHIP_RV530) { |
| 180 | WREG32(0x4124, 1); | ||
| 181 | WREG32(0x4128, 0xFF); | 180 | WREG32(0x4128, 0xFF); |
| 182 | } | 181 | } |
| 183 | r420_pipes_init(rdev); | 182 | r420_pipes_init(rdev); |
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h index b1d945b8ed6c..b519fb2fecbb 100644 --- a/drivers/gpu/drm/radeon/radeon.h +++ b/drivers/gpu/drm/radeon/radeon.h | |||
| @@ -242,6 +242,7 @@ int radeon_object_pin(struct radeon_object *robj, uint32_t domain, | |||
| 242 | uint64_t *gpu_addr); | 242 | uint64_t *gpu_addr); |
| 243 | void radeon_object_unpin(struct radeon_object *robj); | 243 | void radeon_object_unpin(struct radeon_object *robj); |
| 244 | int radeon_object_wait(struct radeon_object *robj); | 244 | int radeon_object_wait(struct radeon_object *robj); |
| 245 | int radeon_object_busy_domain(struct radeon_object *robj, uint32_t *cur_placement); | ||
| 245 | int radeon_object_evict_vram(struct radeon_device *rdev); | 246 | int radeon_object_evict_vram(struct radeon_device *rdev); |
| 246 | int radeon_object_mmap(struct radeon_object *robj, uint64_t *offset); | 247 | int radeon_object_mmap(struct radeon_object *robj, uint64_t *offset); |
| 247 | void radeon_object_force_delete(struct radeon_device *rdev); | 248 | void radeon_object_force_delete(struct radeon_device *rdev); |
| @@ -574,6 +575,7 @@ struct radeon_asic { | |||
| 574 | void (*ring_start)(struct radeon_device *rdev); | 575 | void (*ring_start)(struct radeon_device *rdev); |
| 575 | int (*irq_set)(struct radeon_device *rdev); | 576 | int (*irq_set)(struct radeon_device *rdev); |
| 576 | int (*irq_process)(struct radeon_device *rdev); | 577 | int (*irq_process)(struct radeon_device *rdev); |
| 578 | u32 (*get_vblank_counter)(struct radeon_device *rdev, int crtc); | ||
| 577 | void (*fence_ring_emit)(struct radeon_device *rdev, struct radeon_fence *fence); | 579 | void (*fence_ring_emit)(struct radeon_device *rdev, struct radeon_fence *fence); |
| 578 | int (*cs_parse)(struct radeon_cs_parser *p); | 580 | int (*cs_parse)(struct radeon_cs_parser *p); |
| 579 | int (*copy_blit)(struct radeon_device *rdev, | 581 | int (*copy_blit)(struct radeon_device *rdev, |
| @@ -653,6 +655,7 @@ struct radeon_device { | |||
| 653 | int usec_timeout; | 655 | int usec_timeout; |
| 654 | enum radeon_pll_errata pll_errata; | 656 | enum radeon_pll_errata pll_errata; |
| 655 | int num_gb_pipes; | 657 | int num_gb_pipes; |
| 658 | int num_z_pipes; | ||
| 656 | int disp_priority; | 659 | int disp_priority; |
| 657 | /* BIOS */ | 660 | /* BIOS */ |
| 658 | uint8_t *bios; | 661 | uint8_t *bios; |
| @@ -666,14 +669,11 @@ struct radeon_device { | |||
| 666 | resource_size_t rmmio_base; | 669 | resource_size_t rmmio_base; |
| 667 | resource_size_t rmmio_size; | 670 | resource_size_t rmmio_size; |
| 668 | void *rmmio; | 671 | void *rmmio; |
| 669 | radeon_rreg_t mm_rreg; | ||
| 670 | radeon_wreg_t mm_wreg; | ||
| 671 | radeon_rreg_t mc_rreg; | 672 | radeon_rreg_t mc_rreg; |
| 672 | radeon_wreg_t mc_wreg; | 673 | radeon_wreg_t mc_wreg; |
| 673 | radeon_rreg_t pll_rreg; | 674 | radeon_rreg_t pll_rreg; |
| 674 | radeon_wreg_t pll_wreg; | 675 | radeon_wreg_t pll_wreg; |
| 675 | radeon_rreg_t pcie_rreg; | 676 | uint32_t pcie_reg_mask; |
| 676 | radeon_wreg_t pcie_wreg; | ||
| 677 | radeon_rreg_t pciep_rreg; | 677 | radeon_rreg_t pciep_rreg; |
| 678 | radeon_wreg_t pciep_wreg; | 678 | radeon_wreg_t pciep_wreg; |
| 679 | struct radeon_clock clock; | 679 | struct radeon_clock clock; |
| @@ -705,22 +705,42 @@ int radeon_device_init(struct radeon_device *rdev, | |||
| 705 | void radeon_device_fini(struct radeon_device *rdev); | 705 | void radeon_device_fini(struct radeon_device *rdev); |
| 706 | int radeon_gpu_wait_for_idle(struct radeon_device *rdev); | 706 | int radeon_gpu_wait_for_idle(struct radeon_device *rdev); |
| 707 | 707 | ||
| 708 | static inline uint32_t r100_mm_rreg(struct radeon_device *rdev, uint32_t reg) | ||
| 709 | { | ||
| 710 | if (reg < 0x10000) | ||
| 711 | return readl(((void __iomem *)rdev->rmmio) + reg); | ||
| 712 | else { | ||
| 713 | writel(reg, ((void __iomem *)rdev->rmmio) + RADEON_MM_INDEX); | ||
| 714 | return readl(((void __iomem *)rdev->rmmio) + RADEON_MM_DATA); | ||
| 715 | } | ||
| 716 | } | ||
| 717 | |||
| 718 | static inline void r100_mm_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v) | ||
| 719 | { | ||
| 720 | if (reg < 0x10000) | ||
| 721 | writel(v, ((void __iomem *)rdev->rmmio) + reg); | ||
| 722 | else { | ||
| 723 | writel(reg, ((void __iomem *)rdev->rmmio) + RADEON_MM_INDEX); | ||
| 724 | writel(v, ((void __iomem *)rdev->rmmio) + RADEON_MM_DATA); | ||
| 725 | } | ||
| 726 | } | ||
| 727 | |||
| 708 | 728 | ||
| 709 | /* | 729 | /* |
| 710 | * Registers read & write functions. | 730 | * Registers read & write functions. |
| 711 | */ | 731 | */ |
| 712 | #define RREG8(reg) readb(((void __iomem *)rdev->rmmio) + (reg)) | 732 | #define RREG8(reg) readb(((void __iomem *)rdev->rmmio) + (reg)) |
| 713 | #define WREG8(reg, v) writeb(v, ((void __iomem *)rdev->rmmio) + (reg)) | 733 | #define WREG8(reg, v) writeb(v, ((void __iomem *)rdev->rmmio) + (reg)) |
| 714 | #define RREG32(reg) rdev->mm_rreg(rdev, (reg)) | 734 | #define RREG32(reg) r100_mm_rreg(rdev, (reg)) |
| 715 | #define WREG32(reg, v) rdev->mm_wreg(rdev, (reg), (v)) | 735 | #define WREG32(reg, v) r100_mm_wreg(rdev, (reg), (v)) |
| 716 | #define REG_SET(FIELD, v) (((v) << FIELD##_SHIFT) & FIELD##_MASK) | 736 | #define REG_SET(FIELD, v) (((v) << FIELD##_SHIFT) & FIELD##_MASK) |
| 717 | #define REG_GET(FIELD, v) (((v) << FIELD##_SHIFT) & FIELD##_MASK) | 737 | #define REG_GET(FIELD, v) (((v) << FIELD##_SHIFT) & FIELD##_MASK) |
| 718 | #define RREG32_PLL(reg) rdev->pll_rreg(rdev, (reg)) | 738 | #define RREG32_PLL(reg) rdev->pll_rreg(rdev, (reg)) |
| 719 | #define WREG32_PLL(reg, v) rdev->pll_wreg(rdev, (reg), (v)) | 739 | #define WREG32_PLL(reg, v) rdev->pll_wreg(rdev, (reg), (v)) |
| 720 | #define RREG32_MC(reg) rdev->mc_rreg(rdev, (reg)) | 740 | #define RREG32_MC(reg) rdev->mc_rreg(rdev, (reg)) |
| 721 | #define WREG32_MC(reg, v) rdev->mc_wreg(rdev, (reg), (v)) | 741 | #define WREG32_MC(reg, v) rdev->mc_wreg(rdev, (reg), (v)) |
| 722 | #define RREG32_PCIE(reg) rdev->pcie_rreg(rdev, (reg)) | 742 | #define RREG32_PCIE(reg) rv370_pcie_rreg(rdev, (reg)) |
| 723 | #define WREG32_PCIE(reg, v) rdev->pcie_wreg(rdev, (reg), (v)) | 743 | #define WREG32_PCIE(reg, v) rv370_pcie_wreg(rdev, (reg), (v)) |
| 724 | #define WREG32_P(reg, val, mask) \ | 744 | #define WREG32_P(reg, val, mask) \ |
| 725 | do { \ | 745 | do { \ |
| 726 | uint32_t tmp_ = RREG32(reg); \ | 746 | uint32_t tmp_ = RREG32(reg); \ |
| @@ -736,6 +756,24 @@ int radeon_gpu_wait_for_idle(struct radeon_device *rdev); | |||
| 736 | WREG32_PLL(reg, tmp_); \ | 756 | WREG32_PLL(reg, tmp_); \ |
| 737 | } while (0) | 757 | } while (0) |
| 738 | 758 | ||
| 759 | /* | ||
| 760 | * Indirect registers accessor | ||
| 761 | */ | ||
| 762 | static inline uint32_t rv370_pcie_rreg(struct radeon_device *rdev, uint32_t reg) | ||
| 763 | { | ||
| 764 | uint32_t r; | ||
| 765 | |||
| 766 | WREG32(RADEON_PCIE_INDEX, ((reg) & rdev->pcie_reg_mask)); | ||
| 767 | r = RREG32(RADEON_PCIE_DATA); | ||
| 768 | return r; | ||
| 769 | } | ||
| 770 | |||
| 771 | static inline void rv370_pcie_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v) | ||
| 772 | { | ||
| 773 | WREG32(RADEON_PCIE_INDEX, ((reg) & rdev->pcie_reg_mask)); | ||
| 774 | WREG32(RADEON_PCIE_DATA, (v)); | ||
| 775 | } | ||
| 776 | |||
| 739 | void r100_pll_errata_after_index(struct radeon_device *rdev); | 777 | void r100_pll_errata_after_index(struct radeon_device *rdev); |
| 740 | 778 | ||
| 741 | 779 | ||
| @@ -862,6 +900,7 @@ static inline void radeon_ring_write(struct radeon_device *rdev, uint32_t v) | |||
| 862 | #define radeon_ring_start(rdev) (rdev)->asic->ring_start((rdev)) | 900 | #define radeon_ring_start(rdev) (rdev)->asic->ring_start((rdev)) |
| 863 | #define radeon_irq_set(rdev) (rdev)->asic->irq_set((rdev)) | 901 | #define radeon_irq_set(rdev) (rdev)->asic->irq_set((rdev)) |
| 864 | #define radeon_irq_process(rdev) (rdev)->asic->irq_process((rdev)) | 902 | #define radeon_irq_process(rdev) (rdev)->asic->irq_process((rdev)) |
| 903 | #define radeon_get_vblank_counter(rdev, crtc) (rdev)->asic->get_vblank_counter((rdev), (crtc)) | ||
| 865 | #define radeon_fence_ring_emit(rdev, fence) (rdev)->asic->fence_ring_emit((rdev), (fence)) | 904 | #define radeon_fence_ring_emit(rdev, fence) (rdev)->asic->fence_ring_emit((rdev), (fence)) |
| 866 | #define radeon_copy_blit(rdev, s, d, np, f) (rdev)->asic->copy_blit((rdev), (s), (d), (np), (f)) | 905 | #define radeon_copy_blit(rdev, s, d, np, f) (rdev)->asic->copy_blit((rdev), (s), (d), (np), (f)) |
| 867 | #define radeon_copy_dma(rdev, s, d, np, f) (rdev)->asic->copy_dma((rdev), (s), (d), (np), (f)) | 906 | #define radeon_copy_dma(rdev, s, d, np, f) (rdev)->asic->copy_dma((rdev), (s), (d), (np), (f)) |
diff --git a/drivers/gpu/drm/radeon/radeon_asic.h b/drivers/gpu/drm/radeon/radeon_asic.h index 9a75876e0c3b..7ca6c13569b5 100644 --- a/drivers/gpu/drm/radeon/radeon_asic.h +++ b/drivers/gpu/drm/radeon/radeon_asic.h | |||
| @@ -49,6 +49,7 @@ void r100_vram_info(struct radeon_device *rdev); | |||
| 49 | int r100_gpu_reset(struct radeon_device *rdev); | 49 | int r100_gpu_reset(struct radeon_device *rdev); |
| 50 | int r100_mc_init(struct radeon_device *rdev); | 50 | int r100_mc_init(struct radeon_device *rdev); |
| 51 | void r100_mc_fini(struct radeon_device *rdev); | 51 | void r100_mc_fini(struct radeon_device *rdev); |
| 52 | u32 r100_get_vblank_counter(struct radeon_device *rdev, int crtc); | ||
| 52 | int r100_wb_init(struct radeon_device *rdev); | 53 | int r100_wb_init(struct radeon_device *rdev); |
| 53 | void r100_wb_fini(struct radeon_device *rdev); | 54 | void r100_wb_fini(struct radeon_device *rdev); |
| 54 | int r100_gart_enable(struct radeon_device *rdev); | 55 | int r100_gart_enable(struct radeon_device *rdev); |
| @@ -96,6 +97,7 @@ static struct radeon_asic r100_asic = { | |||
| 96 | .ring_start = &r100_ring_start, | 97 | .ring_start = &r100_ring_start, |
| 97 | .irq_set = &r100_irq_set, | 98 | .irq_set = &r100_irq_set, |
| 98 | .irq_process = &r100_irq_process, | 99 | .irq_process = &r100_irq_process, |
| 100 | .get_vblank_counter = &r100_get_vblank_counter, | ||
| 99 | .fence_ring_emit = &r100_fence_ring_emit, | 101 | .fence_ring_emit = &r100_fence_ring_emit, |
| 100 | .cs_parse = &r100_cs_parse, | 102 | .cs_parse = &r100_cs_parse, |
| 101 | .copy_blit = &r100_copy_blit, | 103 | .copy_blit = &r100_copy_blit, |
| @@ -156,6 +158,7 @@ static struct radeon_asic r300_asic = { | |||
| 156 | .ring_start = &r300_ring_start, | 158 | .ring_start = &r300_ring_start, |
| 157 | .irq_set = &r100_irq_set, | 159 | .irq_set = &r100_irq_set, |
| 158 | .irq_process = &r100_irq_process, | 160 | .irq_process = &r100_irq_process, |
| 161 | .get_vblank_counter = &r100_get_vblank_counter, | ||
| 159 | .fence_ring_emit = &r300_fence_ring_emit, | 162 | .fence_ring_emit = &r300_fence_ring_emit, |
| 160 | .cs_parse = &r300_cs_parse, | 163 | .cs_parse = &r300_cs_parse, |
| 161 | .copy_blit = &r100_copy_blit, | 164 | .copy_blit = &r100_copy_blit, |
| @@ -196,6 +199,7 @@ static struct radeon_asic r420_asic = { | |||
| 196 | .ring_start = &r300_ring_start, | 199 | .ring_start = &r300_ring_start, |
| 197 | .irq_set = &r100_irq_set, | 200 | .irq_set = &r100_irq_set, |
| 198 | .irq_process = &r100_irq_process, | 201 | .irq_process = &r100_irq_process, |
| 202 | .get_vblank_counter = &r100_get_vblank_counter, | ||
| 199 | .fence_ring_emit = &r300_fence_ring_emit, | 203 | .fence_ring_emit = &r300_fence_ring_emit, |
| 200 | .cs_parse = &r300_cs_parse, | 204 | .cs_parse = &r300_cs_parse, |
| 201 | .copy_blit = &r100_copy_blit, | 205 | .copy_blit = &r100_copy_blit, |
| @@ -243,6 +247,7 @@ static struct radeon_asic rs400_asic = { | |||
| 243 | .ring_start = &r300_ring_start, | 247 | .ring_start = &r300_ring_start, |
| 244 | .irq_set = &r100_irq_set, | 248 | .irq_set = &r100_irq_set, |
| 245 | .irq_process = &r100_irq_process, | 249 | .irq_process = &r100_irq_process, |
| 250 | .get_vblank_counter = &r100_get_vblank_counter, | ||
| 246 | .fence_ring_emit = &r300_fence_ring_emit, | 251 | .fence_ring_emit = &r300_fence_ring_emit, |
| 247 | .cs_parse = &r300_cs_parse, | 252 | .cs_parse = &r300_cs_parse, |
| 248 | .copy_blit = &r100_copy_blit, | 253 | .copy_blit = &r100_copy_blit, |
| @@ -266,6 +271,8 @@ void rs600_vram_info(struct radeon_device *rdev); | |||
| 266 | int rs600_mc_init(struct radeon_device *rdev); | 271 | int rs600_mc_init(struct radeon_device *rdev); |
| 267 | void rs600_mc_fini(struct radeon_device *rdev); | 272 | void rs600_mc_fini(struct radeon_device *rdev); |
| 268 | int rs600_irq_set(struct radeon_device *rdev); | 273 | int rs600_irq_set(struct radeon_device *rdev); |
| 274 | int rs600_irq_process(struct radeon_device *rdev); | ||
| 275 | u32 rs600_get_vblank_counter(struct radeon_device *rdev, int crtc); | ||
| 269 | int rs600_gart_enable(struct radeon_device *rdev); | 276 | int rs600_gart_enable(struct radeon_device *rdev); |
| 270 | void rs600_gart_disable(struct radeon_device *rdev); | 277 | void rs600_gart_disable(struct radeon_device *rdev); |
| 271 | void rs600_gart_tlb_flush(struct radeon_device *rdev); | 278 | void rs600_gart_tlb_flush(struct radeon_device *rdev); |
| @@ -291,7 +298,8 @@ static struct radeon_asic rs600_asic = { | |||
| 291 | .cp_disable = &r100_cp_disable, | 298 | .cp_disable = &r100_cp_disable, |
| 292 | .ring_start = &r300_ring_start, | 299 | .ring_start = &r300_ring_start, |
| 293 | .irq_set = &rs600_irq_set, | 300 | .irq_set = &rs600_irq_set, |
| 294 | .irq_process = &r100_irq_process, | 301 | .irq_process = &rs600_irq_process, |
| 302 | .get_vblank_counter = &rs600_get_vblank_counter, | ||
| 295 | .fence_ring_emit = &r300_fence_ring_emit, | 303 | .fence_ring_emit = &r300_fence_ring_emit, |
| 296 | .cs_parse = &r300_cs_parse, | 304 | .cs_parse = &r300_cs_parse, |
| 297 | .copy_blit = &r100_copy_blit, | 305 | .copy_blit = &r100_copy_blit, |
| @@ -308,6 +316,7 @@ static struct radeon_asic rs600_asic = { | |||
| 308 | /* | 316 | /* |
| 309 | * rs690,rs740 | 317 | * rs690,rs740 |
| 310 | */ | 318 | */ |
| 319 | int rs690_init(struct radeon_device *rdev); | ||
| 311 | void rs690_errata(struct radeon_device *rdev); | 320 | void rs690_errata(struct radeon_device *rdev); |
| 312 | void rs690_vram_info(struct radeon_device *rdev); | 321 | void rs690_vram_info(struct radeon_device *rdev); |
| 313 | int rs690_mc_init(struct radeon_device *rdev); | 322 | int rs690_mc_init(struct radeon_device *rdev); |
| @@ -316,7 +325,7 @@ uint32_t rs690_mc_rreg(struct radeon_device *rdev, uint32_t reg); | |||
| 316 | void rs690_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v); | 325 | void rs690_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v); |
| 317 | void rs690_bandwidth_update(struct radeon_device *rdev); | 326 | void rs690_bandwidth_update(struct radeon_device *rdev); |
| 318 | static struct radeon_asic rs690_asic = { | 327 | static struct radeon_asic rs690_asic = { |
| 319 | .init = &r300_init, | 328 | .init = &rs690_init, |
| 320 | .errata = &rs690_errata, | 329 | .errata = &rs690_errata, |
| 321 | .vram_info = &rs690_vram_info, | 330 | .vram_info = &rs690_vram_info, |
| 322 | .gpu_reset = &r300_gpu_reset, | 331 | .gpu_reset = &r300_gpu_reset, |
| @@ -333,7 +342,8 @@ static struct radeon_asic rs690_asic = { | |||
| 333 | .cp_disable = &r100_cp_disable, | 342 | .cp_disable = &r100_cp_disable, |
| 334 | .ring_start = &r300_ring_start, | 343 | .ring_start = &r300_ring_start, |
| 335 | .irq_set = &rs600_irq_set, | 344 | .irq_set = &rs600_irq_set, |
| 336 | .irq_process = &r100_irq_process, | 345 | .irq_process = &rs600_irq_process, |
| 346 | .get_vblank_counter = &rs600_get_vblank_counter, | ||
| 337 | .fence_ring_emit = &r300_fence_ring_emit, | 347 | .fence_ring_emit = &r300_fence_ring_emit, |
| 338 | .cs_parse = &r300_cs_parse, | 348 | .cs_parse = &r300_cs_parse, |
| 339 | .copy_blit = &r100_copy_blit, | 349 | .copy_blit = &r100_copy_blit, |
| @@ -381,8 +391,9 @@ static struct radeon_asic rv515_asic = { | |||
| 381 | .cp_fini = &r100_cp_fini, | 391 | .cp_fini = &r100_cp_fini, |
| 382 | .cp_disable = &r100_cp_disable, | 392 | .cp_disable = &r100_cp_disable, |
| 383 | .ring_start = &rv515_ring_start, | 393 | .ring_start = &rv515_ring_start, |
| 384 | .irq_set = &r100_irq_set, | 394 | .irq_set = &rs600_irq_set, |
| 385 | .irq_process = &r100_irq_process, | 395 | .irq_process = &rs600_irq_process, |
| 396 | .get_vblank_counter = &rs600_get_vblank_counter, | ||
| 386 | .fence_ring_emit = &r300_fence_ring_emit, | 397 | .fence_ring_emit = &r300_fence_ring_emit, |
| 387 | .cs_parse = &r300_cs_parse, | 398 | .cs_parse = &r300_cs_parse, |
| 388 | .copy_blit = &r100_copy_blit, | 399 | .copy_blit = &r100_copy_blit, |
| @@ -423,8 +434,9 @@ static struct radeon_asic r520_asic = { | |||
| 423 | .cp_fini = &r100_cp_fini, | 434 | .cp_fini = &r100_cp_fini, |
| 424 | .cp_disable = &r100_cp_disable, | 435 | .cp_disable = &r100_cp_disable, |
| 425 | .ring_start = &rv515_ring_start, | 436 | .ring_start = &rv515_ring_start, |
| 426 | .irq_set = &r100_irq_set, | 437 | .irq_set = &rs600_irq_set, |
| 427 | .irq_process = &r100_irq_process, | 438 | .irq_process = &rs600_irq_process, |
| 439 | .get_vblank_counter = &rs600_get_vblank_counter, | ||
| 428 | .fence_ring_emit = &r300_fence_ring_emit, | 440 | .fence_ring_emit = &r300_fence_ring_emit, |
| 429 | .cs_parse = &r300_cs_parse, | 441 | .cs_parse = &r300_cs_parse, |
| 430 | .copy_blit = &r100_copy_blit, | 442 | .copy_blit = &r100_copy_blit, |
diff --git a/drivers/gpu/drm/radeon/radeon_combios.c b/drivers/gpu/drm/radeon/radeon_combios.c index afc4db280b94..2a027e00762a 100644 --- a/drivers/gpu/drm/radeon/radeon_combios.c +++ b/drivers/gpu/drm/radeon/radeon_combios.c | |||
| @@ -685,23 +685,15 @@ static const uint32_t default_tvdac_adj[CHIP_LAST] = { | |||
| 685 | 0x00780000, /* rs480 */ | 685 | 0x00780000, /* rs480 */ |
| 686 | }; | 686 | }; |
| 687 | 687 | ||
| 688 | static struct radeon_encoder_tv_dac | 688 | static void radeon_legacy_get_tv_dac_info_from_table(struct radeon_device *rdev, |
| 689 | *radeon_legacy_get_tv_dac_info_from_table(struct radeon_device *rdev) | 689 | struct radeon_encoder_tv_dac *tv_dac) |
| 690 | { | 690 | { |
| 691 | struct radeon_encoder_tv_dac *tv_dac = NULL; | ||
| 692 | |||
| 693 | tv_dac = kzalloc(sizeof(struct radeon_encoder_tv_dac), GFP_KERNEL); | ||
| 694 | |||
| 695 | if (!tv_dac) | ||
| 696 | return NULL; | ||
| 697 | |||
| 698 | tv_dac->ps2_tvdac_adj = default_tvdac_adj[rdev->family]; | 691 | tv_dac->ps2_tvdac_adj = default_tvdac_adj[rdev->family]; |
| 699 | if ((rdev->flags & RADEON_IS_MOBILITY) && (rdev->family == CHIP_RV250)) | 692 | if ((rdev->flags & RADEON_IS_MOBILITY) && (rdev->family == CHIP_RV250)) |
| 700 | tv_dac->ps2_tvdac_adj = 0x00880000; | 693 | tv_dac->ps2_tvdac_adj = 0x00880000; |
| 701 | tv_dac->pal_tvdac_adj = tv_dac->ps2_tvdac_adj; | 694 | tv_dac->pal_tvdac_adj = tv_dac->ps2_tvdac_adj; |
| 702 | tv_dac->ntsc_tvdac_adj = tv_dac->ps2_tvdac_adj; | 695 | tv_dac->ntsc_tvdac_adj = tv_dac->ps2_tvdac_adj; |
| 703 | 696 | return; | |
| 704 | return tv_dac; | ||
| 705 | } | 697 | } |
| 706 | 698 | ||
| 707 | struct radeon_encoder_tv_dac *radeon_combios_get_tv_dac_info(struct | 699 | struct radeon_encoder_tv_dac *radeon_combios_get_tv_dac_info(struct |
| @@ -713,19 +705,18 @@ struct radeon_encoder_tv_dac *radeon_combios_get_tv_dac_info(struct | |||
| 713 | uint16_t dac_info; | 705 | uint16_t dac_info; |
| 714 | uint8_t rev, bg, dac; | 706 | uint8_t rev, bg, dac; |
| 715 | struct radeon_encoder_tv_dac *tv_dac = NULL; | 707 | struct radeon_encoder_tv_dac *tv_dac = NULL; |
| 708 | int found = 0; | ||
| 709 | |||
| 710 | tv_dac = kzalloc(sizeof(struct radeon_encoder_tv_dac), GFP_KERNEL); | ||
| 711 | if (!tv_dac) | ||
| 712 | return NULL; | ||
| 716 | 713 | ||
| 717 | if (rdev->bios == NULL) | 714 | if (rdev->bios == NULL) |
| 718 | return radeon_legacy_get_tv_dac_info_from_table(rdev); | 715 | goto out; |
| 719 | 716 | ||
| 720 | /* first check TV table */ | 717 | /* first check TV table */ |
| 721 | dac_info = combios_get_table_offset(dev, COMBIOS_TV_INFO_TABLE); | 718 | dac_info = combios_get_table_offset(dev, COMBIOS_TV_INFO_TABLE); |
| 722 | if (dac_info) { | 719 | if (dac_info) { |
| 723 | tv_dac = | ||
| 724 | kzalloc(sizeof(struct radeon_encoder_tv_dac), GFP_KERNEL); | ||
| 725 | |||
| 726 | if (!tv_dac) | ||
| 727 | return NULL; | ||
| 728 | |||
| 729 | rev = RBIOS8(dac_info + 0x3); | 720 | rev = RBIOS8(dac_info + 0x3); |
| 730 | if (rev > 4) { | 721 | if (rev > 4) { |
| 731 | bg = RBIOS8(dac_info + 0xc) & 0xf; | 722 | bg = RBIOS8(dac_info + 0xc) & 0xf; |
| @@ -739,6 +730,7 @@ struct radeon_encoder_tv_dac *radeon_combios_get_tv_dac_info(struct | |||
| 739 | bg = RBIOS8(dac_info + 0x10) & 0xf; | 730 | bg = RBIOS8(dac_info + 0x10) & 0xf; |
| 740 | dac = RBIOS8(dac_info + 0x11) & 0xf; | 731 | dac = RBIOS8(dac_info + 0x11) & 0xf; |
| 741 | tv_dac->ntsc_tvdac_adj = (bg << 16) | (dac << 20); | 732 | tv_dac->ntsc_tvdac_adj = (bg << 16) | (dac << 20); |
| 733 | found = 1; | ||
| 742 | } else if (rev > 1) { | 734 | } else if (rev > 1) { |
| 743 | bg = RBIOS8(dac_info + 0xc) & 0xf; | 735 | bg = RBIOS8(dac_info + 0xc) & 0xf; |
| 744 | dac = (RBIOS8(dac_info + 0xc) >> 4) & 0xf; | 736 | dac = (RBIOS8(dac_info + 0xc) >> 4) & 0xf; |
| @@ -751,22 +743,15 @@ struct radeon_encoder_tv_dac *radeon_combios_get_tv_dac_info(struct | |||
| 751 | bg = RBIOS8(dac_info + 0xe) & 0xf; | 743 | bg = RBIOS8(dac_info + 0xe) & 0xf; |
| 752 | dac = (RBIOS8(dac_info + 0xe) >> 4) & 0xf; | 744 | dac = (RBIOS8(dac_info + 0xe) >> 4) & 0xf; |
| 753 | tv_dac->ntsc_tvdac_adj = (bg << 16) | (dac << 20); | 745 | tv_dac->ntsc_tvdac_adj = (bg << 16) | (dac << 20); |
| 746 | found = 1; | ||
| 754 | } | 747 | } |
| 755 | |||
| 756 | tv_dac->tv_std = radeon_combios_get_tv_info(encoder); | 748 | tv_dac->tv_std = radeon_combios_get_tv_info(encoder); |
| 757 | 749 | } | |
| 758 | } else { | 750 | if (!found) { |
| 759 | /* then check CRT table */ | 751 | /* then check CRT table */ |
| 760 | dac_info = | 752 | dac_info = |
| 761 | combios_get_table_offset(dev, COMBIOS_CRT_INFO_TABLE); | 753 | combios_get_table_offset(dev, COMBIOS_CRT_INFO_TABLE); |
| 762 | if (dac_info) { | 754 | if (dac_info) { |
| 763 | tv_dac = | ||
| 764 | kzalloc(sizeof(struct radeon_encoder_tv_dac), | ||
| 765 | GFP_KERNEL); | ||
| 766 | |||
| 767 | if (!tv_dac) | ||
| 768 | return NULL; | ||
| 769 | |||
| 770 | rev = RBIOS8(dac_info) & 0x3; | 755 | rev = RBIOS8(dac_info) & 0x3; |
| 771 | if (rev < 2) { | 756 | if (rev < 2) { |
| 772 | bg = RBIOS8(dac_info + 0x3) & 0xf; | 757 | bg = RBIOS8(dac_info + 0x3) & 0xf; |
| @@ -775,6 +760,7 @@ struct radeon_encoder_tv_dac *radeon_combios_get_tv_dac_info(struct | |||
| 775 | (bg << 16) | (dac << 20); | 760 | (bg << 16) | (dac << 20); |
| 776 | tv_dac->pal_tvdac_adj = tv_dac->ps2_tvdac_adj; | 761 | tv_dac->pal_tvdac_adj = tv_dac->ps2_tvdac_adj; |
| 777 | tv_dac->ntsc_tvdac_adj = tv_dac->ps2_tvdac_adj; | 762 | tv_dac->ntsc_tvdac_adj = tv_dac->ps2_tvdac_adj; |
| 763 | found = 1; | ||
| 778 | } else { | 764 | } else { |
| 779 | bg = RBIOS8(dac_info + 0x4) & 0xf; | 765 | bg = RBIOS8(dac_info + 0x4) & 0xf; |
| 780 | dac = RBIOS8(dac_info + 0x5) & 0xf; | 766 | dac = RBIOS8(dac_info + 0x5) & 0xf; |
| @@ -782,13 +768,17 @@ struct radeon_encoder_tv_dac *radeon_combios_get_tv_dac_info(struct | |||
| 782 | (bg << 16) | (dac << 20); | 768 | (bg << 16) | (dac << 20); |
| 783 | tv_dac->pal_tvdac_adj = tv_dac->ps2_tvdac_adj; | 769 | tv_dac->pal_tvdac_adj = tv_dac->ps2_tvdac_adj; |
| 784 | tv_dac->ntsc_tvdac_adj = tv_dac->ps2_tvdac_adj; | 770 | tv_dac->ntsc_tvdac_adj = tv_dac->ps2_tvdac_adj; |
| 771 | found = 1; | ||
| 785 | } | 772 | } |
| 786 | } else { | 773 | } else { |
| 787 | DRM_INFO("No TV DAC info found in BIOS\n"); | 774 | DRM_INFO("No TV DAC info found in BIOS\n"); |
| 788 | return radeon_legacy_get_tv_dac_info_from_table(rdev); | ||
| 789 | } | 775 | } |
| 790 | } | 776 | } |
| 791 | 777 | ||
| 778 | out: | ||
| 779 | if (!found) /* fallback to defaults */ | ||
| 780 | radeon_legacy_get_tv_dac_info_from_table(rdev, tv_dac); | ||
| 781 | |||
| 792 | return tv_dac; | 782 | return tv_dac; |
| 793 | } | 783 | } |
| 794 | 784 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_cp.c b/drivers/gpu/drm/radeon/radeon_cp.c index d8356827ef17..7a52c461145c 100644 --- a/drivers/gpu/drm/radeon/radeon_cp.c +++ b/drivers/gpu/drm/radeon/radeon_cp.c | |||
| @@ -406,6 +406,15 @@ static void radeon_init_pipes(drm_radeon_private_t *dev_priv) | |||
| 406 | { | 406 | { |
| 407 | uint32_t gb_tile_config, gb_pipe_sel = 0; | 407 | uint32_t gb_tile_config, gb_pipe_sel = 0; |
| 408 | 408 | ||
| 409 | if ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV530) { | ||
| 410 | uint32_t z_pipe_sel = RADEON_READ(RV530_GB_PIPE_SELECT2); | ||
| 411 | if ((z_pipe_sel & 3) == 3) | ||
| 412 | dev_priv->num_z_pipes = 2; | ||
| 413 | else | ||
| 414 | dev_priv->num_z_pipes = 1; | ||
| 415 | } else | ||
| 416 | dev_priv->num_z_pipes = 1; | ||
| 417 | |||
| 409 | /* RS4xx/RS6xx/R4xx/R5xx */ | 418 | /* RS4xx/RS6xx/R4xx/R5xx */ |
| 410 | if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R420) { | 419 | if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R420) { |
| 411 | gb_pipe_sel = RADEON_READ(R400_GB_PIPE_SELECT); | 420 | gb_pipe_sel = RADEON_READ(R400_GB_PIPE_SELECT); |
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c index 9ff6dcb97f9d..7693f7c67bd3 100644 --- a/drivers/gpu/drm/radeon/radeon_device.c +++ b/drivers/gpu/drm/radeon/radeon_device.c | |||
| @@ -225,25 +225,18 @@ void radeon_invalid_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v) | |||
| 225 | 225 | ||
| 226 | void radeon_register_accessor_init(struct radeon_device *rdev) | 226 | void radeon_register_accessor_init(struct radeon_device *rdev) |
| 227 | { | 227 | { |
| 228 | rdev->mm_rreg = &r100_mm_rreg; | ||
| 229 | rdev->mm_wreg = &r100_mm_wreg; | ||
| 230 | rdev->mc_rreg = &radeon_invalid_rreg; | 228 | rdev->mc_rreg = &radeon_invalid_rreg; |
| 231 | rdev->mc_wreg = &radeon_invalid_wreg; | 229 | rdev->mc_wreg = &radeon_invalid_wreg; |
| 232 | rdev->pll_rreg = &radeon_invalid_rreg; | 230 | rdev->pll_rreg = &radeon_invalid_rreg; |
| 233 | rdev->pll_wreg = &radeon_invalid_wreg; | 231 | rdev->pll_wreg = &radeon_invalid_wreg; |
| 234 | rdev->pcie_rreg = &radeon_invalid_rreg; | ||
| 235 | rdev->pcie_wreg = &radeon_invalid_wreg; | ||
| 236 | rdev->pciep_rreg = &radeon_invalid_rreg; | 232 | rdev->pciep_rreg = &radeon_invalid_rreg; |
| 237 | rdev->pciep_wreg = &radeon_invalid_wreg; | 233 | rdev->pciep_wreg = &radeon_invalid_wreg; |
| 238 | 234 | ||
| 239 | /* Don't change order as we are overridding accessor. */ | 235 | /* Don't change order as we are overridding accessor. */ |
| 240 | if (rdev->family < CHIP_RV515) { | 236 | if (rdev->family < CHIP_RV515) { |
| 241 | rdev->pcie_rreg = &rv370_pcie_rreg; | 237 | rdev->pcie_reg_mask = 0xff; |
| 242 | rdev->pcie_wreg = &rv370_pcie_wreg; | 238 | } else { |
| 243 | } | 239 | rdev->pcie_reg_mask = 0x7ff; |
| 244 | if (rdev->family >= CHIP_RV515) { | ||
| 245 | rdev->pcie_rreg = &rv515_pcie_rreg; | ||
| 246 | rdev->pcie_wreg = &rv515_pcie_wreg; | ||
| 247 | } | 240 | } |
| 248 | /* FIXME: not sure here */ | 241 | /* FIXME: not sure here */ |
| 249 | if (rdev->family <= CHIP_R580) { | 242 | if (rdev->family <= CHIP_R580) { |
diff --git a/drivers/gpu/drm/radeon/radeon_drv.h b/drivers/gpu/drm/radeon/radeon_drv.h index 3933f8216a34..6fa32dac4e97 100644 --- a/drivers/gpu/drm/radeon/radeon_drv.h +++ b/drivers/gpu/drm/radeon/radeon_drv.h | |||
| @@ -100,9 +100,10 @@ | |||
| 100 | * 1.28- Add support for VBL on CRTC2 | 100 | * 1.28- Add support for VBL on CRTC2 |
| 101 | * 1.29- R500 3D cmd buffer support | 101 | * 1.29- R500 3D cmd buffer support |
| 102 | * 1.30- Add support for occlusion queries | 102 | * 1.30- Add support for occlusion queries |
| 103 | * 1.31- Add support for num Z pipes from GET_PARAM | ||
| 103 | */ | 104 | */ |
| 104 | #define DRIVER_MAJOR 1 | 105 | #define DRIVER_MAJOR 1 |
| 105 | #define DRIVER_MINOR 30 | 106 | #define DRIVER_MINOR 31 |
| 106 | #define DRIVER_PATCHLEVEL 0 | 107 | #define DRIVER_PATCHLEVEL 0 |
| 107 | 108 | ||
| 108 | /* | 109 | /* |
| @@ -329,6 +330,7 @@ typedef struct drm_radeon_private { | |||
| 329 | resource_size_t fb_aper_offset; | 330 | resource_size_t fb_aper_offset; |
| 330 | 331 | ||
| 331 | int num_gb_pipes; | 332 | int num_gb_pipes; |
| 333 | int num_z_pipes; | ||
| 332 | int track_flush; | 334 | int track_flush; |
| 333 | drm_local_map_t *mmio; | 335 | drm_local_map_t *mmio; |
| 334 | 336 | ||
| @@ -689,6 +691,7 @@ extern void r600_page_table_cleanup(struct drm_device *dev, struct drm_ati_pciga | |||
| 689 | 691 | ||
| 690 | /* pipe config regs */ | 692 | /* pipe config regs */ |
| 691 | #define R400_GB_PIPE_SELECT 0x402c | 693 | #define R400_GB_PIPE_SELECT 0x402c |
| 694 | #define RV530_GB_PIPE_SELECT2 0x4124 | ||
| 692 | #define R500_DYN_SCLK_PWMEM_PIPE 0x000d /* PLL */ | 695 | #define R500_DYN_SCLK_PWMEM_PIPE 0x000d /* PLL */ |
| 693 | #define R300_GB_TILE_CONFIG 0x4018 | 696 | #define R300_GB_TILE_CONFIG 0x4018 |
| 694 | # define R300_ENABLE_TILING (1 << 0) | 697 | # define R300_ENABLE_TILING (1 << 0) |
diff --git a/drivers/gpu/drm/radeon/radeon_fb.c b/drivers/gpu/drm/radeon/radeon_fb.c index 3206c0ad7b6c..ec383edf5f38 100644 --- a/drivers/gpu/drm/radeon/radeon_fb.c +++ b/drivers/gpu/drm/radeon/radeon_fb.c | |||
| @@ -574,6 +574,8 @@ int radeonfb_create(struct radeon_device *rdev, | |||
| 574 | goto out_unref; | 574 | goto out_unref; |
| 575 | } | 575 | } |
| 576 | 576 | ||
| 577 | memset_io(fbptr, 0, aligned_size); | ||
| 578 | |||
| 577 | strcpy(info->fix.id, "radeondrmfb"); | 579 | strcpy(info->fix.id, "radeondrmfb"); |
| 578 | info->fix.type = FB_TYPE_PACKED_PIXELS; | 580 | info->fix.type = FB_TYPE_PACKED_PIXELS; |
| 579 | info->fix.visual = FB_VISUAL_TRUECOLOR; | 581 | info->fix.visual = FB_VISUAL_TRUECOLOR; |
diff --git a/drivers/gpu/drm/radeon/radeon_gem.c b/drivers/gpu/drm/radeon/radeon_gem.c index cded5180c752..d880edf254db 100644 --- a/drivers/gpu/drm/radeon/radeon_gem.c +++ b/drivers/gpu/drm/radeon/radeon_gem.c | |||
| @@ -262,8 +262,34 @@ int radeon_gem_mmap_ioctl(struct drm_device *dev, void *data, | |||
| 262 | int radeon_gem_busy_ioctl(struct drm_device *dev, void *data, | 262 | int radeon_gem_busy_ioctl(struct drm_device *dev, void *data, |
| 263 | struct drm_file *filp) | 263 | struct drm_file *filp) |
| 264 | { | 264 | { |
| 265 | /* FIXME: implement */ | 265 | struct drm_radeon_gem_busy *args = data; |
| 266 | return 0; | 266 | struct drm_gem_object *gobj; |
| 267 | struct radeon_object *robj; | ||
| 268 | int r; | ||
| 269 | uint32_t cur_placement; | ||
| 270 | |||
| 271 | gobj = drm_gem_object_lookup(dev, filp, args->handle); | ||
| 272 | if (gobj == NULL) { | ||
| 273 | return -EINVAL; | ||
| 274 | } | ||
| 275 | robj = gobj->driver_private; | ||
| 276 | r = radeon_object_busy_domain(robj, &cur_placement); | ||
| 277 | switch (cur_placement) { | ||
| 278 | case TTM_PL_VRAM: | ||
| 279 | args->domain = RADEON_GEM_DOMAIN_VRAM; | ||
| 280 | break; | ||
| 281 | case TTM_PL_TT: | ||
| 282 | args->domain = RADEON_GEM_DOMAIN_GTT; | ||
| 283 | break; | ||
| 284 | case TTM_PL_SYSTEM: | ||
| 285 | args->domain = RADEON_GEM_DOMAIN_CPU; | ||
| 286 | default: | ||
| 287 | break; | ||
| 288 | } | ||
| 289 | mutex_lock(&dev->struct_mutex); | ||
| 290 | drm_gem_object_unreference(gobj); | ||
| 291 | mutex_unlock(&dev->struct_mutex); | ||
| 292 | return r; | ||
| 267 | } | 293 | } |
| 268 | 294 | ||
| 269 | int radeon_gem_wait_idle_ioctl(struct drm_device *dev, void *data, | 295 | int radeon_gem_wait_idle_ioctl(struct drm_device *dev, void *data, |
diff --git a/drivers/gpu/drm/radeon/radeon_irq_kms.c b/drivers/gpu/drm/radeon/radeon_irq_kms.c index 491d569deb0e..9805e4b6ca1b 100644 --- a/drivers/gpu/drm/radeon/radeon_irq_kms.c +++ b/drivers/gpu/drm/radeon/radeon_irq_kms.c | |||
| @@ -32,60 +32,6 @@ | |||
| 32 | #include "radeon.h" | 32 | #include "radeon.h" |
| 33 | #include "atom.h" | 33 | #include "atom.h" |
| 34 | 34 | ||
| 35 | static inline uint32_t r100_irq_ack(struct radeon_device *rdev) | ||
| 36 | { | ||
| 37 | uint32_t irqs = RREG32(RADEON_GEN_INT_STATUS); | ||
| 38 | uint32_t irq_mask = RADEON_SW_INT_TEST; | ||
| 39 | |||
| 40 | if (irqs) { | ||
| 41 | WREG32(RADEON_GEN_INT_STATUS, irqs); | ||
| 42 | } | ||
| 43 | return irqs & irq_mask; | ||
| 44 | } | ||
| 45 | |||
| 46 | int r100_irq_set(struct radeon_device *rdev) | ||
| 47 | { | ||
| 48 | uint32_t tmp = 0; | ||
| 49 | |||
| 50 | if (rdev->irq.sw_int) { | ||
| 51 | tmp |= RADEON_SW_INT_ENABLE; | ||
| 52 | } | ||
| 53 | /* Todo go through CRTC and enable vblank int or not */ | ||
| 54 | WREG32(RADEON_GEN_INT_CNTL, tmp); | ||
| 55 | return 0; | ||
| 56 | } | ||
| 57 | |||
| 58 | int r100_irq_process(struct radeon_device *rdev) | ||
| 59 | { | ||
| 60 | uint32_t status; | ||
| 61 | |||
| 62 | status = r100_irq_ack(rdev); | ||
| 63 | if (!status) { | ||
| 64 | return IRQ_NONE; | ||
| 65 | } | ||
| 66 | while (status) { | ||
| 67 | /* SW interrupt */ | ||
| 68 | if (status & RADEON_SW_INT_TEST) { | ||
| 69 | radeon_fence_process(rdev); | ||
| 70 | } | ||
| 71 | status = r100_irq_ack(rdev); | ||
| 72 | } | ||
| 73 | return IRQ_HANDLED; | ||
| 74 | } | ||
| 75 | |||
| 76 | int rs600_irq_set(struct radeon_device *rdev) | ||
| 77 | { | ||
| 78 | uint32_t tmp = 0; | ||
| 79 | |||
| 80 | if (rdev->irq.sw_int) { | ||
| 81 | tmp |= RADEON_SW_INT_ENABLE; | ||
| 82 | } | ||
| 83 | WREG32(RADEON_GEN_INT_CNTL, tmp); | ||
| 84 | /* Todo go through CRTC and enable vblank int or not */ | ||
| 85 | WREG32(R500_DxMODE_INT_MASK, 0); | ||
| 86 | return 0; | ||
| 87 | } | ||
| 88 | |||
| 89 | irqreturn_t radeon_driver_irq_handler_kms(DRM_IRQ_ARGS) | 35 | irqreturn_t radeon_driver_irq_handler_kms(DRM_IRQ_ARGS) |
| 90 | { | 36 | { |
| 91 | struct drm_device *dev = (struct drm_device *) arg; | 37 | struct drm_device *dev = (struct drm_device *) arg; |
diff --git a/drivers/gpu/drm/radeon/radeon_kms.c b/drivers/gpu/drm/radeon/radeon_kms.c index 3357110e30ce..dce09ada32bc 100644 --- a/drivers/gpu/drm/radeon/radeon_kms.c +++ b/drivers/gpu/drm/radeon/radeon_kms.c | |||
| @@ -95,6 +95,9 @@ int radeon_info_ioctl(struct drm_device *dev, void *data, struct drm_file *filp) | |||
| 95 | case RADEON_INFO_NUM_GB_PIPES: | 95 | case RADEON_INFO_NUM_GB_PIPES: |
| 96 | value = rdev->num_gb_pipes; | 96 | value = rdev->num_gb_pipes; |
| 97 | break; | 97 | break; |
| 98 | case RADEON_INFO_NUM_Z_PIPES: | ||
| 99 | value = rdev->num_z_pipes; | ||
| 100 | break; | ||
| 98 | default: | 101 | default: |
| 99 | DRM_DEBUG("Invalid request %d\n", info->request); | 102 | DRM_DEBUG("Invalid request %d\n", info->request); |
| 100 | return -EINVAL; | 103 | return -EINVAL; |
| @@ -141,19 +144,42 @@ void radeon_driver_preclose_kms(struct drm_device *dev, | |||
| 141 | */ | 144 | */ |
| 142 | u32 radeon_get_vblank_counter_kms(struct drm_device *dev, int crtc) | 145 | u32 radeon_get_vblank_counter_kms(struct drm_device *dev, int crtc) |
| 143 | { | 146 | { |
| 144 | /* FIXME: implement */ | 147 | struct radeon_device *rdev = dev->dev_private; |
| 145 | return 0; | 148 | |
| 149 | if (crtc < 0 || crtc > 1) { | ||
| 150 | DRM_ERROR("Invalid crtc %d\n", crtc); | ||
| 151 | return -EINVAL; | ||
| 152 | } | ||
| 153 | |||
| 154 | return radeon_get_vblank_counter(rdev, crtc); | ||
| 146 | } | 155 | } |
| 147 | 156 | ||
| 148 | int radeon_enable_vblank_kms(struct drm_device *dev, int crtc) | 157 | int radeon_enable_vblank_kms(struct drm_device *dev, int crtc) |
| 149 | { | 158 | { |
| 150 | /* FIXME: implement */ | 159 | struct radeon_device *rdev = dev->dev_private; |
| 151 | return 0; | 160 | |
| 161 | if (crtc < 0 || crtc > 1) { | ||
| 162 | DRM_ERROR("Invalid crtc %d\n", crtc); | ||
| 163 | return -EINVAL; | ||
| 164 | } | ||
| 165 | |||
| 166 | rdev->irq.crtc_vblank_int[crtc] = true; | ||
| 167 | |||
| 168 | return radeon_irq_set(rdev); | ||
| 152 | } | 169 | } |
| 153 | 170 | ||
| 154 | void radeon_disable_vblank_kms(struct drm_device *dev, int crtc) | 171 | void radeon_disable_vblank_kms(struct drm_device *dev, int crtc) |
| 155 | { | 172 | { |
| 156 | /* FIXME: implement */ | 173 | struct radeon_device *rdev = dev->dev_private; |
| 174 | |||
| 175 | if (crtc < 0 || crtc > 1) { | ||
| 176 | DRM_ERROR("Invalid crtc %d\n", crtc); | ||
| 177 | return; | ||
| 178 | } | ||
| 179 | |||
| 180 | rdev->irq.crtc_vblank_int[crtc] = false; | ||
| 181 | |||
| 182 | radeon_irq_set(rdev); | ||
| 157 | } | 183 | } |
| 158 | 184 | ||
| 159 | 185 | ||
| @@ -295,5 +321,6 @@ struct drm_ioctl_desc radeon_ioctls_kms[] = { | |||
| 295 | DRM_IOCTL_DEF(DRM_RADEON_INFO, radeon_info_ioctl, DRM_AUTH), | 321 | DRM_IOCTL_DEF(DRM_RADEON_INFO, radeon_info_ioctl, DRM_AUTH), |
| 296 | DRM_IOCTL_DEF(DRM_RADEON_GEM_SET_TILING, radeon_gem_set_tiling_ioctl, DRM_AUTH), | 322 | DRM_IOCTL_DEF(DRM_RADEON_GEM_SET_TILING, radeon_gem_set_tiling_ioctl, DRM_AUTH), |
| 297 | DRM_IOCTL_DEF(DRM_RADEON_GEM_GET_TILING, radeon_gem_get_tiling_ioctl, DRM_AUTH), | 323 | DRM_IOCTL_DEF(DRM_RADEON_GEM_GET_TILING, radeon_gem_get_tiling_ioctl, DRM_AUTH), |
| 324 | DRM_IOCTL_DEF(DRM_RADEON_GEM_BUSY, radeon_gem_busy_ioctl, DRM_AUTH), | ||
| 298 | }; | 325 | }; |
| 299 | int radeon_max_kms_ioctl = DRM_ARRAY_SIZE(radeon_ioctls_kms); | 326 | int radeon_max_kms_ioctl = DRM_ARRAY_SIZE(radeon_ioctls_kms); |
diff --git a/drivers/gpu/drm/radeon/radeon_legacy_crtc.c b/drivers/gpu/drm/radeon/radeon_legacy_crtc.c index 7d06dc98a42a..0da72f18fd3a 100644 --- a/drivers/gpu/drm/radeon/radeon_legacy_crtc.c +++ b/drivers/gpu/drm/radeon/radeon_legacy_crtc.c | |||
| @@ -310,10 +310,13 @@ void radeon_crtc_dpms(struct drm_crtc *crtc, int mode) | |||
| 310 | RADEON_CRTC_DISP_REQ_EN_B)); | 310 | RADEON_CRTC_DISP_REQ_EN_B)); |
| 311 | WREG32_P(RADEON_CRTC_EXT_CNTL, 0, ~mask); | 311 | WREG32_P(RADEON_CRTC_EXT_CNTL, 0, ~mask); |
| 312 | } | 312 | } |
| 313 | drm_vblank_post_modeset(dev, radeon_crtc->crtc_id); | ||
| 314 | radeon_crtc_load_lut(crtc); | ||
| 313 | break; | 315 | break; |
| 314 | case DRM_MODE_DPMS_STANDBY: | 316 | case DRM_MODE_DPMS_STANDBY: |
| 315 | case DRM_MODE_DPMS_SUSPEND: | 317 | case DRM_MODE_DPMS_SUSPEND: |
| 316 | case DRM_MODE_DPMS_OFF: | 318 | case DRM_MODE_DPMS_OFF: |
| 319 | drm_vblank_pre_modeset(dev, radeon_crtc->crtc_id); | ||
| 317 | if (radeon_crtc->crtc_id) | 320 | if (radeon_crtc->crtc_id) |
| 318 | WREG32_P(RADEON_CRTC2_GEN_CNTL, mask, ~mask); | 321 | WREG32_P(RADEON_CRTC2_GEN_CNTL, mask, ~mask); |
| 319 | else { | 322 | else { |
| @@ -323,10 +326,6 @@ void radeon_crtc_dpms(struct drm_crtc *crtc, int mode) | |||
| 323 | } | 326 | } |
| 324 | break; | 327 | break; |
| 325 | } | 328 | } |
| 326 | |||
| 327 | if (mode != DRM_MODE_DPMS_OFF) { | ||
| 328 | radeon_crtc_load_lut(crtc); | ||
| 329 | } | ||
| 330 | } | 329 | } |
| 331 | 330 | ||
| 332 | /* properly set crtc bpp when using atombios */ | 331 | /* properly set crtc bpp when using atombios */ |
diff --git a/drivers/gpu/drm/radeon/radeon_legacy_encoders.c b/drivers/gpu/drm/radeon/radeon_legacy_encoders.c index 34d0f58eb944..9322675ef6d0 100644 --- a/drivers/gpu/drm/radeon/radeon_legacy_encoders.c +++ b/drivers/gpu/drm/radeon/radeon_legacy_encoders.c | |||
| @@ -1066,6 +1066,7 @@ radeon_add_legacy_encoder(struct drm_device *dev, uint32_t encoder_id, uint32_t | |||
| 1066 | 1066 | ||
| 1067 | switch (radeon_encoder->encoder_id) { | 1067 | switch (radeon_encoder->encoder_id) { |
| 1068 | case ENCODER_OBJECT_ID_INTERNAL_LVDS: | 1068 | case ENCODER_OBJECT_ID_INTERNAL_LVDS: |
| 1069 | encoder->possible_crtcs = 0x1; | ||
| 1069 | drm_encoder_init(dev, encoder, &radeon_legacy_lvds_enc_funcs, DRM_MODE_ENCODER_LVDS); | 1070 | drm_encoder_init(dev, encoder, &radeon_legacy_lvds_enc_funcs, DRM_MODE_ENCODER_LVDS); |
| 1070 | drm_encoder_helper_add(encoder, &radeon_legacy_lvds_helper_funcs); | 1071 | drm_encoder_helper_add(encoder, &radeon_legacy_lvds_helper_funcs); |
| 1071 | if (rdev->is_atom_bios) | 1072 | if (rdev->is_atom_bios) |
diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c index e98cae3bf4a6..b85fb83d7ae8 100644 --- a/drivers/gpu/drm/radeon/radeon_object.c +++ b/drivers/gpu/drm/radeon/radeon_object.c | |||
| @@ -316,6 +316,25 @@ int radeon_object_wait(struct radeon_object *robj) | |||
| 316 | return r; | 316 | return r; |
| 317 | } | 317 | } |
| 318 | 318 | ||
| 319 | int radeon_object_busy_domain(struct radeon_object *robj, uint32_t *cur_placement) | ||
| 320 | { | ||
| 321 | int r = 0; | ||
| 322 | |||
| 323 | r = radeon_object_reserve(robj, true); | ||
| 324 | if (unlikely(r != 0)) { | ||
| 325 | DRM_ERROR("radeon: failed to reserve object for waiting.\n"); | ||
| 326 | return r; | ||
| 327 | } | ||
| 328 | spin_lock(&robj->tobj.lock); | ||
| 329 | *cur_placement = robj->tobj.mem.mem_type; | ||
| 330 | if (robj->tobj.sync_obj) { | ||
| 331 | r = ttm_bo_wait(&robj->tobj, true, true, true); | ||
| 332 | } | ||
| 333 | spin_unlock(&robj->tobj.lock); | ||
| 334 | radeon_object_unreserve(robj); | ||
| 335 | return r; | ||
| 336 | } | ||
| 337 | |||
| 319 | int radeon_object_evict_vram(struct radeon_device *rdev) | 338 | int radeon_object_evict_vram(struct radeon_device *rdev) |
| 320 | { | 339 | { |
| 321 | if (rdev->flags & RADEON_IS_IGP) { | 340 | if (rdev->flags & RADEON_IS_IGP) { |
diff --git a/drivers/gpu/drm/radeon/radeon_reg.h b/drivers/gpu/drm/radeon/radeon_reg.h index e1b618574461..4df43f62c678 100644 --- a/drivers/gpu/drm/radeon/radeon_reg.h +++ b/drivers/gpu/drm/radeon/radeon_reg.h | |||
| @@ -982,12 +982,15 @@ | |||
| 982 | # define RS400_TMDS2_PLLRST (1 << 1) | 982 | # define RS400_TMDS2_PLLRST (1 << 1) |
| 983 | 983 | ||
| 984 | #define RADEON_GEN_INT_CNTL 0x0040 | 984 | #define RADEON_GEN_INT_CNTL 0x0040 |
| 985 | # define RADEON_CRTC_VBLANK_MASK (1 << 0) | ||
| 986 | # define RADEON_CRTC2_VBLANK_MASK (1 << 9) | ||
| 985 | # define RADEON_SW_INT_ENABLE (1 << 25) | 987 | # define RADEON_SW_INT_ENABLE (1 << 25) |
| 986 | #define RADEON_GEN_INT_STATUS 0x0044 | 988 | #define RADEON_GEN_INT_STATUS 0x0044 |
| 987 | # define RADEON_VSYNC_INT_AK (1 << 2) | 989 | # define AVIVO_DISPLAY_INT_STATUS (1 << 0) |
| 988 | # define RADEON_VSYNC_INT (1 << 2) | 990 | # define RADEON_CRTC_VBLANK_STAT (1 << 0) |
| 989 | # define RADEON_VSYNC2_INT_AK (1 << 6) | 991 | # define RADEON_CRTC_VBLANK_STAT_ACK (1 << 0) |
| 990 | # define RADEON_VSYNC2_INT (1 << 6) | 992 | # define RADEON_CRTC2_VBLANK_STAT (1 << 9) |
| 993 | # define RADEON_CRTC2_VBLANK_STAT_ACK (1 << 9) | ||
| 991 | # define RADEON_SW_INT_FIRE (1 << 26) | 994 | # define RADEON_SW_INT_FIRE (1 << 26) |
| 992 | # define RADEON_SW_INT_TEST (1 << 25) | 995 | # define RADEON_SW_INT_TEST (1 << 25) |
| 993 | # define RADEON_SW_INT_TEST_ACK (1 << 25) | 996 | # define RADEON_SW_INT_TEST_ACK (1 << 25) |
| @@ -2334,6 +2337,9 @@ | |||
| 2334 | # define RADEON_RE_WIDTH_SHIFT 0 | 2337 | # define RADEON_RE_WIDTH_SHIFT 0 |
| 2335 | # define RADEON_RE_HEIGHT_SHIFT 16 | 2338 | # define RADEON_RE_HEIGHT_SHIFT 16 |
| 2336 | 2339 | ||
| 2340 | #define RADEON_RB3D_ZPASS_DATA 0x3290 | ||
| 2341 | #define RADEON_RB3D_ZPASS_ADDR 0x3294 | ||
| 2342 | |||
| 2337 | #define RADEON_SE_CNTL 0x1c4c | 2343 | #define RADEON_SE_CNTL 0x1c4c |
| 2338 | # define RADEON_FFACE_CULL_CW (0 << 0) | 2344 | # define RADEON_FFACE_CULL_CW (0 << 0) |
| 2339 | # define RADEON_FFACE_CULL_CCW (1 << 0) | 2345 | # define RADEON_FFACE_CULL_CCW (1 << 0) |
| @@ -3568,4 +3574,6 @@ | |||
| 3568 | #define RADEON_SCRATCH_REG4 0x15f0 | 3574 | #define RADEON_SCRATCH_REG4 0x15f0 |
| 3569 | #define RADEON_SCRATCH_REG5 0x15f4 | 3575 | #define RADEON_SCRATCH_REG5 0x15f4 |
| 3570 | 3576 | ||
| 3577 | #define RV530_GB_PIPE_SELECT2 0x4124 | ||
| 3578 | |||
| 3571 | #endif | 3579 | #endif |
diff --git a/drivers/gpu/drm/radeon/radeon_state.c b/drivers/gpu/drm/radeon/radeon_state.c index 46645f3e0328..2882f40d5ec5 100644 --- a/drivers/gpu/drm/radeon/radeon_state.c +++ b/drivers/gpu/drm/radeon/radeon_state.c | |||
| @@ -3081,6 +3081,9 @@ static int radeon_cp_getparam(struct drm_device *dev, void *data, struct drm_fil | |||
| 3081 | case RADEON_PARAM_NUM_GB_PIPES: | 3081 | case RADEON_PARAM_NUM_GB_PIPES: |
| 3082 | value = dev_priv->num_gb_pipes; | 3082 | value = dev_priv->num_gb_pipes; |
| 3083 | break; | 3083 | break; |
| 3084 | case RADEON_PARAM_NUM_Z_PIPES: | ||
| 3085 | value = dev_priv->num_z_pipes; | ||
| 3086 | break; | ||
| 3084 | default: | 3087 | default: |
| 3085 | DRM_DEBUG("Invalid parameter %d\n", param->param); | 3088 | DRM_DEBUG("Invalid parameter %d\n", param->param); |
| 3086 | return -EINVAL; | 3089 | return -EINVAL; |
diff --git a/drivers/gpu/drm/radeon/rs600.c b/drivers/gpu/drm/radeon/rs600.c index bbea6dee4a94..7e8ce983a908 100644 --- a/drivers/gpu/drm/radeon/rs600.c +++ b/drivers/gpu/drm/radeon/rs600.c | |||
| @@ -240,6 +240,88 @@ void rs600_mc_fini(struct radeon_device *rdev) | |||
| 240 | 240 | ||
| 241 | 241 | ||
| 242 | /* | 242 | /* |
| 243 | * Interrupts | ||
| 244 | */ | ||
| 245 | int rs600_irq_set(struct radeon_device *rdev) | ||
| 246 | { | ||
| 247 | uint32_t tmp = 0; | ||
| 248 | uint32_t mode_int = 0; | ||
| 249 | |||
| 250 | if (rdev->irq.sw_int) { | ||
| 251 | tmp |= RADEON_SW_INT_ENABLE; | ||
| 252 | } | ||
| 253 | if (rdev->irq.crtc_vblank_int[0]) { | ||
| 254 | tmp |= AVIVO_DISPLAY_INT_STATUS; | ||
| 255 | mode_int |= AVIVO_D1MODE_INT_MASK; | ||
| 256 | } | ||
| 257 | if (rdev->irq.crtc_vblank_int[1]) { | ||
| 258 | tmp |= AVIVO_DISPLAY_INT_STATUS; | ||
| 259 | mode_int |= AVIVO_D2MODE_INT_MASK; | ||
| 260 | } | ||
| 261 | WREG32(RADEON_GEN_INT_CNTL, tmp); | ||
| 262 | WREG32(AVIVO_DxMODE_INT_MASK, mode_int); | ||
| 263 | return 0; | ||
| 264 | } | ||
| 265 | |||
| 266 | static inline uint32_t rs600_irq_ack(struct radeon_device *rdev, u32 *r500_disp_int) | ||
| 267 | { | ||
| 268 | uint32_t irqs = RREG32(RADEON_GEN_INT_STATUS); | ||
| 269 | uint32_t irq_mask = RADEON_SW_INT_TEST; | ||
| 270 | |||
| 271 | if (irqs & AVIVO_DISPLAY_INT_STATUS) { | ||
| 272 | *r500_disp_int = RREG32(AVIVO_DISP_INTERRUPT_STATUS); | ||
| 273 | if (*r500_disp_int & AVIVO_D1_VBLANK_INTERRUPT) { | ||
| 274 | WREG32(AVIVO_D1MODE_VBLANK_STATUS, AVIVO_VBLANK_ACK); | ||
| 275 | } | ||
| 276 | if (*r500_disp_int & AVIVO_D2_VBLANK_INTERRUPT) { | ||
| 277 | WREG32(AVIVO_D2MODE_VBLANK_STATUS, AVIVO_VBLANK_ACK); | ||
| 278 | } | ||
| 279 | } else { | ||
| 280 | *r500_disp_int = 0; | ||
| 281 | } | ||
| 282 | |||
| 283 | if (irqs) { | ||
| 284 | WREG32(RADEON_GEN_INT_STATUS, irqs); | ||
| 285 | } | ||
| 286 | return irqs & irq_mask; | ||
| 287 | } | ||
| 288 | |||
| 289 | int rs600_irq_process(struct radeon_device *rdev) | ||
| 290 | { | ||
| 291 | uint32_t status; | ||
| 292 | uint32_t r500_disp_int; | ||
| 293 | |||
| 294 | status = rs600_irq_ack(rdev, &r500_disp_int); | ||
| 295 | if (!status && !r500_disp_int) { | ||
| 296 | return IRQ_NONE; | ||
| 297 | } | ||
| 298 | while (status || r500_disp_int) { | ||
| 299 | /* SW interrupt */ | ||
| 300 | if (status & RADEON_SW_INT_TEST) { | ||
| 301 | radeon_fence_process(rdev); | ||
| 302 | } | ||
| 303 | /* Vertical blank interrupts */ | ||
| 304 | if (r500_disp_int & AVIVO_D1_VBLANK_INTERRUPT) { | ||
| 305 | drm_handle_vblank(rdev->ddev, 0); | ||
| 306 | } | ||
| 307 | if (r500_disp_int & AVIVO_D2_VBLANK_INTERRUPT) { | ||
| 308 | drm_handle_vblank(rdev->ddev, 1); | ||
| 309 | } | ||
| 310 | status = rs600_irq_ack(rdev, &r500_disp_int); | ||
| 311 | } | ||
| 312 | return IRQ_HANDLED; | ||
| 313 | } | ||
| 314 | |||
| 315 | u32 rs600_get_vblank_counter(struct radeon_device *rdev, int crtc) | ||
| 316 | { | ||
| 317 | if (crtc == 0) | ||
| 318 | return RREG32(AVIVO_D1CRTC_FRAME_COUNT); | ||
| 319 | else | ||
| 320 | return RREG32(AVIVO_D2CRTC_FRAME_COUNT); | ||
| 321 | } | ||
| 322 | |||
| 323 | |||
| 324 | /* | ||
| 243 | * Global GPU functions | 325 | * Global GPU functions |
| 244 | */ | 326 | */ |
| 245 | void rs600_disable_vga(struct radeon_device *rdev) | 327 | void rs600_disable_vga(struct radeon_device *rdev) |
diff --git a/drivers/gpu/drm/radeon/rs690.c b/drivers/gpu/drm/radeon/rs690.c index 839595b00728..bc6b7c5339bc 100644 --- a/drivers/gpu/drm/radeon/rs690.c +++ b/drivers/gpu/drm/radeon/rs690.c | |||
| @@ -652,3 +652,68 @@ void rs690_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v) | |||
| 652 | WREG32(RS690_MC_DATA, v); | 652 | WREG32(RS690_MC_DATA, v); |
| 653 | WREG32(RS690_MC_INDEX, RS690_MC_INDEX_WR_ACK); | 653 | WREG32(RS690_MC_INDEX, RS690_MC_INDEX_WR_ACK); |
| 654 | } | 654 | } |
| 655 | |||
| 656 | static const unsigned rs690_reg_safe_bm[219] = { | ||
| 657 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 658 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 659 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 660 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 661 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 662 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 663 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 664 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 665 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 666 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 667 | 0x17FF1FFF,0xFFFFFFFC,0xFFFFFFFF,0xFF30FFBF, | ||
| 668 | 0xFFFFFFF8,0xC3E6FFFF,0xFFFFF6DF,0xFFFFFFFF, | ||
| 669 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 670 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 671 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFF03F, | ||
| 672 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 673 | 0xFFFFFFFF,0xFFFFEFCE,0xF00EBFFF,0x007C0000, | ||
| 674 | 0xF0000078,0xFF000009,0xFFFFFFFF,0xFFFFFFFF, | ||
| 675 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 676 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 677 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 678 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 679 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 680 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 681 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 682 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 683 | 0xFFFFF7FF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 684 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 685 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 686 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 687 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 688 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 689 | 0xFFFFFC78,0xFFFFFFFF,0xFFFFFFFE,0xFFFFFFFF, | ||
| 690 | 0x38FF8F50,0xFFF88082,0xF000000C,0xFAE009FF, | ||
| 691 | 0x0000FFFF,0xFFFFFFFF,0xFFFFFFFF,0x00000000, | ||
| 692 | 0x00000000,0x0000C100,0x00000000,0x00000000, | ||
| 693 | 0x00000000,0x00000000,0x00000000,0x00000000, | ||
| 694 | 0x00000000,0xFFFF0000,0xFFFFFFFF,0xFF80FFFF, | ||
| 695 | 0x00000000,0x00000000,0x00000000,0x00000000, | ||
| 696 | 0x0003FC01,0xFFFFFFF8,0xFE800B19,0xFFFFFFFF, | ||
| 697 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 698 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 699 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 700 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 701 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 702 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 703 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 704 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 705 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 706 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 707 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 708 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 709 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 710 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 711 | 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, | ||
| 712 | }; | ||
| 713 | |||
| 714 | int rs690_init(struct radeon_device *rdev) | ||
| 715 | { | ||
| 716 | rdev->config.r300.reg_safe_bm = rs690_reg_safe_bm; | ||
| 717 | rdev->config.r300.reg_safe_bm_size = ARRAY_SIZE(rs690_reg_safe_bm); | ||
| 718 | return 0; | ||
| 719 | } | ||
diff --git a/drivers/gpu/drm/radeon/rv515.c b/drivers/gpu/drm/radeon/rv515.c index fd8f3ca716ea..31a7f668ae5a 100644 --- a/drivers/gpu/drm/radeon/rv515.c +++ b/drivers/gpu/drm/radeon/rv515.c | |||
| @@ -400,25 +400,6 @@ void rv515_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v) | |||
| 400 | WREG32(MC_IND_INDEX, 0); | 400 | WREG32(MC_IND_INDEX, 0); |
| 401 | } | 401 | } |
| 402 | 402 | ||
| 403 | uint32_t rv515_pcie_rreg(struct radeon_device *rdev, uint32_t reg) | ||
| 404 | { | ||
| 405 | uint32_t r; | ||
| 406 | |||
| 407 | WREG32(PCIE_INDEX, ((reg) & 0x7ff)); | ||
| 408 | (void)RREG32(PCIE_INDEX); | ||
| 409 | r = RREG32(PCIE_DATA); | ||
| 410 | return r; | ||
| 411 | } | ||
| 412 | |||
| 413 | void rv515_pcie_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v) | ||
| 414 | { | ||
| 415 | WREG32(PCIE_INDEX, ((reg) & 0x7ff)); | ||
| 416 | (void)RREG32(PCIE_INDEX); | ||
| 417 | WREG32(PCIE_DATA, (v)); | ||
| 418 | (void)RREG32(PCIE_DATA); | ||
| 419 | } | ||
| 420 | |||
| 421 | |||
| 422 | /* | 403 | /* |
| 423 | * Debugfs info | 404 | * Debugfs info |
| 424 | */ | 405 | */ |
