Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'topic/connector-locking-2015-07-23' of git://anongit.freedesktop.org/drm-intel into drm-next

connector hotplug locking cleanup and fixes to make it save against
atomic. Note that because of depencies this is based on top of the
drm-intel-next pull, so that one needs to go in before this one.

I've also thrown in the mode_group removal on top since it's defunct,
never worked really, no one seems to care and the code can be resurrected
easily.

* tag 'topic/connector-locking-2015-07-23' of git://anongit.freedesktop.org/drm-intel:
drm: gc now dead mode_group code
drm: Stop filtering according to mode_group in getresources
drm: Roll out drm_for_each_{plane,crtc,encoder}
drm/cma-helper: Fix locking in drm_fb_cma_debugfs_show
drm: Roll out drm_for_each_connector more
drm: Amend connector list locking rules
drm/radeon: Take all modeset locks for DP MST hotplug
drm/i915: Take all modeset locks for DP MST hotplug
drm: Check locking in drm_for_each_fb
drm/i915: Use drm_for_each_fb in i915_debugfs.c
drm: Check locking in drm_for_each_connector
drm/fbdev-helper: Grab mode_config.mutex in drm_fb_helper_single_add_all_connectors
drm/probe-helper: Grab mode_config.mutex in poll_init/enable
drm: Add modeset object iterators
drm: Simplify drm_for_each_legacy_plane arguments

+172 -295
+1 -1
drivers/gpu/drm/drm_atomic.c
··· 1063 1063 * Changed connectors are already in @state, so only need to look at the 1064 1064 * current configuration. 1065 1065 */ 1066 - list_for_each_entry(connector, &config->connector_list, head) { 1066 + drm_for_each_connector(connector, state->dev) { 1067 1067 if (connector->state->crtc != crtc) 1068 1068 continue; 1069 1069
+2 -2
drivers/gpu/drm/drm_atomic_helper.c
··· 89 89 90 90 WARN_ON(!drm_modeset_is_locked(&config->connection_mutex)); 91 91 92 - list_for_each_entry(connector, &config->connector_list, head) { 92 + drm_for_each_connector(connector, dev) { 93 93 if (connector->state->best_encoder != encoder) 94 94 continue; 95 95 ··· 1988 1988 1989 1989 WARN_ON(!drm_modeset_is_locked(&config->connection_mutex)); 1990 1990 1991 - list_for_each_entry(tmp_connector, &config->connector_list, head) { 1991 + drm_for_each_connector(tmp_connector, connector->dev) { 1992 1992 if (tmp_connector->state->crtc != crtc) 1993 1993 continue; 1994 1994
+45 -161
drivers/gpu/drm/drm_crtc.c
··· 615 615 if (atomic_read(&fb->refcount.refcount) > 1) { 616 616 drm_modeset_lock_all(dev); 617 617 /* remove from any CRTC */ 618 - list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { 618 + drm_for_each_crtc(crtc, dev) { 619 619 if (crtc->primary->fb == fb) { 620 620 /* should turn off the crtc */ 621 621 memset(&set, 0, sizeof(struct drm_mode_set)); ··· 627 627 } 628 628 } 629 629 630 - list_for_each_entry(plane, &dev->mode_config.plane_list, head) { 630 + drm_for_each_plane(plane, dev) { 631 631 if (plane->fb == fb) 632 632 drm_plane_force_disable(plane); 633 633 } ··· 736 736 unsigned int index = 0; 737 737 struct drm_crtc *tmp; 738 738 739 - list_for_each_entry(tmp, &crtc->dev->mode_config.crtc_list, head) { 739 + drm_for_each_crtc(tmp, crtc->dev) { 740 740 if (tmp == crtc) 741 741 return index; 742 742 ··· 988 988 989 989 WARN_ON(!drm_modeset_is_locked(&config->connection_mutex)); 990 990 991 - list_for_each_entry(tmp, &connector->dev->mode_config.connector_list, head) { 991 + drm_for_each_connector(tmp, connector->dev) { 992 992 if (tmp == connector) 993 993 return index; 994 994 ··· 1054 1054 { 1055 1055 struct drm_connector *connector; 1056 1056 1057 - /* taking the mode config mutex ends up in a clash with sysfs */ 1057 + /* FIXME: taking the mode config mutex ends up in a clash with sysfs */ 1058 1058 list_for_each_entry(connector, &dev->mode_config.connector_list, head) 1059 1059 drm_connector_unregister(connector); 1060 1060 ··· 1280 1280 unsigned int index = 0; 1281 1281 struct drm_plane *tmp; 1282 1282 1283 - list_for_each_entry(tmp, &plane->dev->mode_config.plane_list, head) { 1283 + drm_for_each_plane(tmp, plane->dev) { 1284 1284 if (tmp == plane) 1285 1285 return index; 1286 1286 ··· 1305 1305 struct drm_plane *plane; 1306 1306 unsigned int i = 0; 1307 1307 1308 - list_for_each_entry(plane, &dev->mode_config.plane_list, head) { 1308 + drm_for_each_plane(plane, dev) { 1309 1309 if (i == idx) 1310 1310 return plane; 1311 1311 i++; ··· 1679 1679 } 1680 1680 EXPORT_SYMBOL(drm_mode_create_suggested_offset_properties); 1681 1681 1682 - static int drm_mode_group_init(struct drm_device *dev, struct drm_mode_group *group) 1683 - { 1684 - uint32_t total_objects = 0; 1685 - 1686 - total_objects += dev->mode_config.num_crtc; 1687 - total_objects += dev->mode_config.num_connector; 1688 - total_objects += dev->mode_config.num_encoder; 1689 - 1690 - group->id_list = kcalloc(total_objects, sizeof(uint32_t), GFP_KERNEL); 1691 - if (!group->id_list) 1692 - return -ENOMEM; 1693 - 1694 - group->num_crtcs = 0; 1695 - group->num_connectors = 0; 1696 - group->num_encoders = 0; 1697 - return 0; 1698 - } 1699 - 1700 - void drm_mode_group_destroy(struct drm_mode_group *group) 1701 - { 1702 - kfree(group->id_list); 1703 - group->id_list = NULL; 1704 - } 1705 - 1706 - /* 1707 - * NOTE: Driver's shouldn't ever call drm_mode_group_init_legacy_group - it is 1708 - * the drm core's responsibility to set up mode control groups. 1709 - */ 1710 - int drm_mode_group_init_legacy_group(struct drm_device *dev, 1711 - struct drm_mode_group *group) 1712 - { 1713 - struct drm_crtc *crtc; 1714 - struct drm_encoder *encoder; 1715 - struct drm_connector *connector; 1716 - int ret; 1717 - 1718 - ret = drm_mode_group_init(dev, group); 1719 - if (ret) 1720 - return ret; 1721 - 1722 - list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) 1723 - group->id_list[group->num_crtcs++] = crtc->base.id; 1724 - 1725 - list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) 1726 - group->id_list[group->num_crtcs + group->num_encoders++] = 1727 - encoder->base.id; 1728 - 1729 - list_for_each_entry(connector, &dev->mode_config.connector_list, head) 1730 - group->id_list[group->num_crtcs + group->num_encoders + 1731 - group->num_connectors++] = connector->base.id; 1732 - 1733 - return 0; 1734 - } 1735 - EXPORT_SYMBOL(drm_mode_group_init_legacy_group); 1736 - 1737 - void drm_reinit_primary_mode_group(struct drm_device *dev) 1738 - { 1739 - drm_modeset_lock_all(dev); 1740 - drm_mode_group_destroy(&dev->primary->mode_group); 1741 - drm_mode_group_init_legacy_group(dev, &dev->primary->mode_group); 1742 - drm_modeset_unlock_all(dev); 1743 - } 1744 - EXPORT_SYMBOL(drm_reinit_primary_mode_group); 1745 - 1746 1682 /** 1747 1683 * drm_mode_getresources - get graphics configuration 1748 1684 * @dev: drm device for the ioctl ··· 1707 1771 int crtc_count = 0; 1708 1772 int fb_count = 0; 1709 1773 int encoder_count = 0; 1710 - int copied = 0, i; 1774 + int copied = 0; 1711 1775 uint32_t __user *fb_id; 1712 1776 uint32_t __user *crtc_id; 1713 1777 uint32_t __user *connector_id; 1714 1778 uint32_t __user *encoder_id; 1715 - struct drm_mode_group *mode_group; 1716 1779 1717 1780 if (!drm_core_check_feature(dev, DRIVER_MODESET)) 1718 1781 return -EINVAL; ··· 1744 1809 /* mode_config.mutex protects the connector list against e.g. DP MST 1745 1810 * connector hot-adding. CRTC/Plane lists are invariant. */ 1746 1811 mutex_lock(&dev->mode_config.mutex); 1747 - if (!drm_is_primary_client(file_priv)) { 1812 + drm_for_each_crtc(crtc, dev) 1813 + crtc_count++; 1748 1814 1749 - mode_group = NULL; 1750 - list_for_each(lh, &dev->mode_config.crtc_list) 1751 - crtc_count++; 1815 + drm_for_each_connector(connector, dev) 1816 + connector_count++; 1752 1817 1753 - list_for_each(lh, &dev->mode_config.connector_list) 1754 - connector_count++; 1755 - 1756 - list_for_each(lh, &dev->mode_config.encoder_list) 1757 - encoder_count++; 1758 - } else { 1759 - 1760 - mode_group = &file_priv->master->minor->mode_group; 1761 - crtc_count = mode_group->num_crtcs; 1762 - connector_count = mode_group->num_connectors; 1763 - encoder_count = mode_group->num_encoders; 1764 - } 1818 + drm_for_each_encoder(encoder, dev) 1819 + encoder_count++; 1765 1820 1766 1821 card_res->max_height = dev->mode_config.max_height; 1767 1822 card_res->min_height = dev->mode_config.min_height; ··· 1762 1837 if (card_res->count_crtcs >= crtc_count) { 1763 1838 copied = 0; 1764 1839 crtc_id = (uint32_t __user *)(unsigned long)card_res->crtc_id_ptr; 1765 - if (!mode_group) { 1766 - list_for_each_entry(crtc, &dev->mode_config.crtc_list, 1767 - head) { 1768 - DRM_DEBUG_KMS("[CRTC:%d]\n", crtc->base.id); 1769 - if (put_user(crtc->base.id, crtc_id + copied)) { 1770 - ret = -EFAULT; 1771 - goto out; 1772 - } 1773 - copied++; 1840 + drm_for_each_crtc(crtc, dev) { 1841 + DRM_DEBUG_KMS("[CRTC:%d]\n", crtc->base.id); 1842 + if (put_user(crtc->base.id, crtc_id + copied)) { 1843 + ret = -EFAULT; 1844 + goto out; 1774 1845 } 1775 - } else { 1776 - for (i = 0; i < mode_group->num_crtcs; i++) { 1777 - if (put_user(mode_group->id_list[i], 1778 - crtc_id + copied)) { 1779 - ret = -EFAULT; 1780 - goto out; 1781 - } 1782 - copied++; 1783 - } 1846 + copied++; 1784 1847 } 1785 1848 } 1786 1849 card_res->count_crtcs = crtc_count; ··· 1777 1864 if (card_res->count_encoders >= encoder_count) { 1778 1865 copied = 0; 1779 1866 encoder_id = (uint32_t __user *)(unsigned long)card_res->encoder_id_ptr; 1780 - if (!mode_group) { 1781 - list_for_each_entry(encoder, 1782 - &dev->mode_config.encoder_list, 1783 - head) { 1784 - DRM_DEBUG_KMS("[ENCODER:%d:%s]\n", encoder->base.id, 1785 - encoder->name); 1786 - if (put_user(encoder->base.id, encoder_id + 1787 - copied)) { 1788 - ret = -EFAULT; 1789 - goto out; 1790 - } 1791 - copied++; 1867 + drm_for_each_encoder(encoder, dev) { 1868 + DRM_DEBUG_KMS("[ENCODER:%d:%s]\n", encoder->base.id, 1869 + encoder->name); 1870 + if (put_user(encoder->base.id, encoder_id + 1871 + copied)) { 1872 + ret = -EFAULT; 1873 + goto out; 1792 1874 } 1793 - } else { 1794 - for (i = mode_group->num_crtcs; i < mode_group->num_crtcs + mode_group->num_encoders; i++) { 1795 - if (put_user(mode_group->id_list[i], 1796 - encoder_id + copied)) { 1797 - ret = -EFAULT; 1798 - goto out; 1799 - } 1800 - copied++; 1801 - } 1802 - 1875 + copied++; 1803 1876 } 1804 1877 } 1805 1878 card_res->count_encoders = encoder_count; ··· 1794 1895 if (card_res->count_connectors >= connector_count) { 1795 1896 copied = 0; 1796 1897 connector_id = (uint32_t __user *)(unsigned long)card_res->connector_id_ptr; 1797 - if (!mode_group) { 1798 - list_for_each_entry(connector, 1799 - &dev->mode_config.connector_list, 1800 - head) { 1801 - DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n", 1802 - connector->base.id, 1803 - connector->name); 1804 - if (put_user(connector->base.id, 1805 - connector_id + copied)) { 1806 - ret = -EFAULT; 1807 - goto out; 1808 - } 1809 - copied++; 1898 + drm_for_each_connector(connector, dev) { 1899 + DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n", 1900 + connector->base.id, 1901 + connector->name); 1902 + if (put_user(connector->base.id, 1903 + connector_id + copied)) { 1904 + ret = -EFAULT; 1905 + goto out; 1810 1906 } 1811 - } else { 1812 - int start = mode_group->num_crtcs + 1813 - mode_group->num_encoders; 1814 - for (i = start; i < start + mode_group->num_connectors; i++) { 1815 - if (put_user(mode_group->id_list[i], 1816 - connector_id + copied)) { 1817 - ret = -EFAULT; 1818 - goto out; 1819 - } 1820 - copied++; 1821 - } 1907 + copied++; 1822 1908 } 1823 1909 } 1824 1910 card_res->count_connectors = connector_count; ··· 2071 2187 2072 2188 /* For atomic drivers only state objects are synchronously updated and 2073 2189 * protected by modeset locks, so check those first. */ 2074 - list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 2190 + drm_for_each_connector(connector, dev) { 2075 2191 if (!connector->state) 2076 2192 continue; 2077 2193 ··· 2175 2291 plane_ptr = (uint32_t __user *)(unsigned long)plane_resp->plane_id_ptr; 2176 2292 2177 2293 /* Plane lists are invariant, no locking needed. */ 2178 - list_for_each_entry(plane, &config->plane_list, head) { 2294 + drm_for_each_plane(plane, dev) { 2179 2295 /* 2180 2296 * Unless userspace set the 'universal planes' 2181 2297 * capability bit, only advertise overlays. ··· 2480 2596 * connectors from it), hence we need to refcount the fbs across all 2481 2597 * crtcs. Atomic modeset will have saner semantics ... 2482 2598 */ 2483 - list_for_each_entry(tmp, &crtc->dev->mode_config.crtc_list, head) 2599 + drm_for_each_crtc(tmp, crtc->dev) 2484 2600 tmp->primary->old_fb = tmp->primary->fb; 2485 2601 2486 2602 fb = set->fb; ··· 2491 2607 crtc->primary->fb = fb; 2492 2608 } 2493 2609 2494 - list_for_each_entry(tmp, &crtc->dev->mode_config.crtc_list, head) { 2610 + drm_for_each_crtc(tmp, crtc->dev) { 2495 2611 if (tmp->primary->fb) 2496 2612 drm_framebuffer_reference(tmp->primary->fb); 2497 2613 if (tmp->primary->old_fb) ··· 5261 5377 struct drm_encoder *encoder; 5262 5378 struct drm_connector *connector; 5263 5379 5264 - list_for_each_entry(plane, &dev->mode_config.plane_list, head) 5380 + drm_for_each_plane(plane, dev) 5265 5381 if (plane->funcs->reset) 5266 5382 plane->funcs->reset(plane); 5267 5383 5268 - list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) 5384 + drm_for_each_crtc(crtc, dev) 5269 5385 if (crtc->funcs->reset) 5270 5386 crtc->funcs->reset(crtc); 5271 5387 5272 - list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) 5388 + drm_for_each_encoder(encoder, dev) 5273 5389 if (encoder->funcs->reset) 5274 5390 encoder->funcs->reset(encoder); 5275 5391 5276 - list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 5392 + drm_for_each_connector(connector, dev) { 5277 5393 connector->status = connector_status_unknown; 5278 5394 5279 5395 if (connector->funcs->reset)
+21 -21
drivers/gpu/drm/drm_crtc_helper.c
··· 121 121 WARN_ON(!drm_modeset_is_locked(&dev->mode_config.connection_mutex)); 122 122 } 123 123 124 - list_for_each_entry(connector, &dev->mode_config.connector_list, head) 124 + drm_for_each_connector(connector, dev) 125 125 if (connector->encoder == encoder) 126 126 return true; 127 127 return false; ··· 151 151 if (!oops_in_progress) 152 152 WARN_ON(!mutex_is_locked(&dev->mode_config.mutex)); 153 153 154 - list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) 154 + drm_for_each_encoder(encoder, dev) 155 155 if (encoder->crtc == crtc && drm_helper_encoder_in_use(encoder)) 156 156 return true; 157 157 return false; ··· 180 180 181 181 drm_warn_on_modeset_not_all_locked(dev); 182 182 183 - list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { 183 + drm_for_each_encoder(encoder, dev) { 184 184 if (!drm_helper_encoder_in_use(encoder)) { 185 185 drm_encoder_disable(encoder); 186 186 /* disconnect encoder from any connector */ ··· 188 188 } 189 189 } 190 190 191 - list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { 191 + drm_for_each_crtc(crtc, dev) { 192 192 const struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private; 193 193 crtc->enabled = drm_helper_crtc_in_use(crtc); 194 194 if (!crtc->enabled) { ··· 230 230 const struct drm_encoder_helper_funcs *encoder_funcs; 231 231 struct drm_encoder *encoder; 232 232 233 - list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { 233 + drm_for_each_encoder(encoder, dev) { 234 234 encoder_funcs = encoder->helper_private; 235 235 /* Disable unused encoders */ 236 236 if (encoder->crtc == NULL) ··· 305 305 * adjust it according to limitations or connector properties, and also 306 306 * a chance to reject the mode entirely. 307 307 */ 308 - list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { 308 + drm_for_each_encoder(encoder, dev) { 309 309 310 310 if (encoder->crtc != crtc) 311 311 continue; ··· 334 334 crtc->hwmode = *adjusted_mode; 335 335 336 336 /* Prepare the encoders and CRTCs before setting the mode. */ 337 - list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { 337 + drm_for_each_encoder(encoder, dev) { 338 338 339 339 if (encoder->crtc != crtc) 340 340 continue; ··· 359 359 if (!ret) 360 360 goto done; 361 361 362 - list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { 362 + drm_for_each_encoder(encoder, dev) { 363 363 364 364 if (encoder->crtc != crtc) 365 365 continue; ··· 376 376 /* Now enable the clocks, plane, pipe, and connectors that we set up. */ 377 377 crtc_funcs->commit(crtc); 378 378 379 - list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { 379 + drm_for_each_encoder(encoder, dev) { 380 380 381 381 if (encoder->crtc != crtc) 382 382 continue; ··· 418 418 struct drm_encoder *encoder; 419 419 420 420 /* Decouple all encoders and their attached connectors from this crtc */ 421 - list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { 421 + drm_for_each_encoder(encoder, dev) { 422 422 if (encoder->crtc != crtc) 423 423 continue; 424 424 425 - list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 425 + drm_for_each_connector(connector, dev) { 426 426 if (connector->encoder != encoder) 427 427 continue; 428 428 ··· 519 519 * restored, not the drivers personal bookkeeping. 520 520 */ 521 521 count = 0; 522 - list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { 522 + drm_for_each_encoder(encoder, dev) { 523 523 save_encoders[count++] = *encoder; 524 524 } 525 525 526 526 count = 0; 527 - list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 527 + drm_for_each_connector(connector, dev) { 528 528 save_connectors[count++] = *connector; 529 529 } 530 530 ··· 562 562 563 563 /* a) traverse passed in connector list and get encoders for them */ 564 564 count = 0; 565 - list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 565 + drm_for_each_connector(connector, dev) { 566 566 const struct drm_connector_helper_funcs *connector_funcs = 567 567 connector->helper_private; 568 568 new_encoder = connector->encoder; ··· 602 602 } 603 603 604 604 count = 0; 605 - list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 605 + drm_for_each_connector(connector, dev) { 606 606 if (!connector->encoder) 607 607 continue; 608 608 ··· 685 685 fail: 686 686 /* Restore all previous data. */ 687 687 count = 0; 688 - list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { 688 + drm_for_each_encoder(encoder, dev) { 689 689 *encoder = save_encoders[count++]; 690 690 } 691 691 692 692 count = 0; 693 - list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 693 + drm_for_each_connector(connector, dev) { 694 694 *connector = save_connectors[count++]; 695 695 } 696 696 ··· 712 712 struct drm_connector *connector; 713 713 struct drm_device *dev = encoder->dev; 714 714 715 - list_for_each_entry(connector, &dev->mode_config.connector_list, head) 715 + drm_for_each_connector(connector, dev) 716 716 if (connector->encoder == encoder) 717 717 if (connector->dpms < dpms) 718 718 dpms = connector->dpms; ··· 746 746 struct drm_connector *connector; 747 747 struct drm_device *dev = crtc->dev; 748 748 749 - list_for_each_entry(connector, &dev->mode_config.connector_list, head) 749 + drm_for_each_connector(connector, dev) 750 750 if (connector->encoder && connector->encoder->crtc == crtc) 751 751 if (connector->dpms < dpms) 752 752 dpms = connector->dpms; ··· 862 862 bool ret; 863 863 864 864 drm_modeset_lock_all(dev); 865 - list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { 865 + drm_for_each_crtc(crtc, dev) { 866 866 867 867 if (!crtc->enabled) 868 868 continue; ··· 876 876 877 877 /* Turn off outputs that were already powered off */ 878 878 if (drm_helper_choose_crtc_dpms(crtc)) { 879 - list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { 879 + drm_for_each_encoder(encoder, dev) { 880 880 881 881 if(encoder->crtc != crtc) 882 882 continue;
-12
drivers/gpu/drm/drm_drv.c
··· 285 285 if (!minor) 286 286 return; 287 287 288 - drm_mode_group_destroy(&minor->mode_group); 289 288 put_device(minor->kdev); 290 289 291 290 spin_lock_irqsave(&drm_minor_lock, flags); ··· 699 700 goto err_minors; 700 701 } 701 702 702 - /* setup grouping for legacy outputs */ 703 - if (drm_core_check_feature(dev, DRIVER_MODESET)) { 704 - ret = drm_mode_group_init_legacy_group(dev, 705 - &dev->primary->mode_group); 706 - if (ret) 707 - goto err_unload; 708 - } 709 - 710 703 ret = 0; 711 704 goto out_unlock; 712 705 713 - err_unload: 714 - if (dev->driver->unload) 715 - dev->driver->unload(dev); 716 706 err_minors: 717 707 drm_minor_unregister(dev, DRM_MINOR_LEGACY); 718 708 drm_minor_unregister(dev, DRM_MINOR_RENDER);
+1 -1
drivers/gpu/drm/drm_edid.c
··· 3413 3413 WARN_ON(!mutex_is_locked(&dev->mode_config.mutex)); 3414 3414 WARN_ON(!drm_modeset_is_locked(&dev->mode_config.connection_mutex)); 3415 3415 3416 - list_for_each_entry(connector, &dev->mode_config.connector_list, head) 3416 + drm_for_each_connector(connector, dev) 3417 3417 if (connector->encoder == encoder && connector->eld[0]) 3418 3418 return connector; 3419 3419
+3 -15
drivers/gpu/drm/drm_fb_cma_helper.c
··· 209 209 struct drm_info_node *node = (struct drm_info_node *) m->private; 210 210 struct drm_device *dev = node->minor->dev; 211 211 struct drm_framebuffer *fb; 212 - int ret; 213 212 214 - ret = mutex_lock_interruptible(&dev->mode_config.mutex); 215 - if (ret) 216 - return ret; 217 - 218 - ret = mutex_lock_interruptible(&dev->struct_mutex); 219 - if (ret) { 220 - mutex_unlock(&dev->mode_config.mutex); 221 - return ret; 222 - } 223 - 224 - list_for_each_entry(fb, &dev->mode_config.fb_list, head) 213 + mutex_lock(&dev->mode_config.fb_lock); 214 + drm_for_each_fb(fb, dev) 225 215 drm_fb_cma_describe(fb, m); 226 - 227 - mutex_unlock(&dev->struct_mutex); 228 - mutex_unlock(&dev->mode_config.mutex); 216 + mutex_unlock(&dev->mode_config.fb_lock); 229 217 230 218 return 0; 231 219 }
+12 -7
drivers/gpu/drm/drm_fb_helper.c
··· 89 89 * connectors to the fbdev, e.g. if some are reserved for special purposes or 90 90 * not adequate to be used for the fbcon. 91 91 * 92 - * Since this is part of the initial setup before the fbdev is published, no 93 - * locking is required. 92 + * This function is protected against concurrent connector hotadds/removals 93 + * using drm_fb_helper_add_one_connector() and 94 + * drm_fb_helper_remove_one_connector(). 94 95 */ 95 96 int drm_fb_helper_single_add_all_connectors(struct drm_fb_helper *fb_helper) 96 97 { ··· 99 98 struct drm_connector *connector; 100 99 int i; 101 100 102 - list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 101 + mutex_lock(&dev->mode_config.mutex); 102 + drm_for_each_connector(connector, dev) { 103 103 struct drm_fb_helper_connector *fb_helper_connector; 104 104 105 105 fb_helper_connector = kzalloc(sizeof(struct drm_fb_helper_connector), GFP_KERNEL); ··· 110 108 fb_helper_connector->connector = connector; 111 109 fb_helper->connector_info[fb_helper->connector_count++] = fb_helper_connector; 112 110 } 111 + mutex_unlock(&dev->mode_config.mutex); 113 112 return 0; 114 113 fail: 115 114 for (i = 0; i < fb_helper->connector_count; i++) { ··· 118 115 fb_helper->connector_info[i] = NULL; 119 116 } 120 117 fb_helper->connector_count = 0; 118 + mutex_unlock(&dev->mode_config.mutex); 119 + 121 120 return -ENOMEM; 122 121 } 123 122 EXPORT_SYMBOL(drm_fb_helper_single_add_all_connectors); ··· 274 269 struct drm_device *dev = crtc->dev; 275 270 struct drm_crtc *c; 276 271 277 - list_for_each_entry(c, &dev->mode_config.crtc_list, head) { 272 + drm_for_each_crtc(c, dev) { 278 273 if (crtc->base.id == c->base.id) 279 274 return c->primary->fb; 280 275 } ··· 326 321 327 322 drm_warn_on_modeset_not_all_locked(dev); 328 323 329 - list_for_each_entry(plane, &dev->mode_config.plane_list, head) { 324 + drm_for_each_plane(plane, dev) { 330 325 if (plane->type != DRM_PLANE_TYPE_PRIMARY) 331 326 drm_plane_force_disable(plane); 332 327 ··· 445 440 if (dev->primary->master) 446 441 return false; 447 442 448 - list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { 443 + drm_for_each_crtc(crtc, dev) { 449 444 if (crtc->primary->fb) 450 445 crtcs_bound++; 451 446 if (crtc->primary->fb == fb_helper->fb) ··· 642 637 } 643 638 644 639 i = 0; 645 - list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { 640 + drm_for_each_crtc(crtc, dev) { 646 641 fb_helper->crtc_info[i].mode_set.crtc = crtc; 647 642 i++; 648 643 }
-3
drivers/gpu/drm/drm_gem_cma_helper.c
··· 381 381 struct seq_file *m) 382 382 { 383 383 struct drm_gem_object *obj = &cma_obj->base; 384 - struct drm_device *dev = obj->dev; 385 384 uint64_t off; 386 - 387 - WARN_ON(!mutex_is_locked(&dev->struct_mutex)); 388 385 389 386 off = drm_vma_node_start(&obj->vma_node); 390 387
+3 -4
drivers/gpu/drm/drm_modeset_lock.c
··· 276 276 if (oops_in_progress) 277 277 return; 278 278 279 - list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) 279 + drm_for_each_crtc(crtc, dev) 280 280 WARN_ON(!drm_modeset_is_locked(&crtc->mutex)); 281 281 282 282 WARN_ON(!drm_modeset_is_locked(&dev->mode_config.connection_mutex)); ··· 464 464 int drm_modeset_lock_all_crtcs(struct drm_device *dev, 465 465 struct drm_modeset_acquire_ctx *ctx) 466 466 { 467 - struct drm_mode_config *config = &dev->mode_config; 468 467 struct drm_crtc *crtc; 469 468 struct drm_plane *plane; 470 469 int ret = 0; 471 470 472 - list_for_each_entry(crtc, &config->crtc_list, head) { 471 + drm_for_each_crtc(crtc, dev) { 473 472 ret = drm_modeset_lock(&crtc->mutex, ctx); 474 473 if (ret) 475 474 return ret; 476 475 } 477 476 478 - list_for_each_entry(plane, &config->plane_list, head) { 477 + drm_for_each_plane(plane, dev) { 479 478 ret = drm_modeset_lock(&plane->mutex, ctx); 480 479 if (ret) 481 480 return ret;
+1 -1
drivers/gpu/drm/drm_of.c
··· 19 19 unsigned int index = 0; 20 20 struct drm_crtc *tmp; 21 21 22 - list_for_each_entry(tmp, &dev->mode_config.crtc_list, head) { 22 + drm_for_each_crtc(tmp, dev) { 23 23 if (tmp->port == port) 24 24 return 1 << index; 25 25
+2 -1
drivers/gpu/drm/drm_plane_helper.c
··· 91 91 */ 92 92 WARN_ON(!drm_modeset_is_locked(&dev->mode_config.connection_mutex)); 93 93 94 - list_for_each_entry(connector, &dev->mode_config.connector_list, head) 94 + drm_for_each_connector(connector, dev) { 95 95 if (connector->encoder && connector->encoder->crtc == crtc) { 96 96 if (connector_list != NULL && count < num_connectors) 97 97 *(connector_list++) = connector; 98 98 99 99 count++; 100 100 } 101 + } 101 102 102 103 return count; 103 104 }
+27 -18
drivers/gpu/drm/drm_probe_helper.c
··· 93 93 return 1; 94 94 } 95 95 96 + #define DRM_OUTPUT_POLL_PERIOD (10*HZ) 97 + static void __drm_kms_helper_poll_enable(struct drm_device *dev) 98 + { 99 + bool poll = false; 100 + struct drm_connector *connector; 101 + 102 + WARN_ON(!mutex_is_locked(&dev->mode_config.mutex)); 103 + 104 + if (!dev->mode_config.poll_enabled || !drm_kms_helper_poll) 105 + return; 106 + 107 + drm_for_each_connector(connector, dev) { 108 + if (connector->polled & (DRM_CONNECTOR_POLL_CONNECT | 109 + DRM_CONNECTOR_POLL_DISCONNECT)) 110 + poll = true; 111 + } 112 + 113 + if (poll) 114 + schedule_delayed_work(&dev->mode_config.output_poll_work, DRM_OUTPUT_POLL_PERIOD); 115 + } 116 + 96 117 static int drm_helper_probe_single_connector_modes_merge_bits(struct drm_connector *connector, 97 118 uint32_t maxX, uint32_t maxY, bool merge_type_bits) 98 119 { ··· 174 153 175 154 /* Re-enable polling in case the global poll config changed. */ 176 155 if (drm_kms_helper_poll != dev->mode_config.poll_running) 177 - drm_kms_helper_poll_enable(dev); 156 + __drm_kms_helper_poll_enable(dev); 178 157 179 158 dev->mode_config.poll_running = drm_kms_helper_poll; 180 159 ··· 316 295 } 317 296 EXPORT_SYMBOL(drm_kms_helper_hotplug_event); 318 297 319 - #define DRM_OUTPUT_POLL_PERIOD (10*HZ) 320 298 static void output_poll_execute(struct work_struct *work) 321 299 { 322 300 struct delayed_work *delayed_work = to_delayed_work(work); ··· 332 312 goto out; 333 313 334 314 mutex_lock(&dev->mode_config.mutex); 335 - list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 315 + drm_for_each_connector(connector, dev) { 336 316 337 317 /* Ignore forced connectors. */ 338 318 if (connector->force) ··· 427 407 */ 428 408 void drm_kms_helper_poll_enable(struct drm_device *dev) 429 409 { 430 - bool poll = false; 431 - struct drm_connector *connector; 432 - 433 - if (!dev->mode_config.poll_enabled || !drm_kms_helper_poll) 434 - return; 435 - 436 - list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 437 - if (connector->polled & (DRM_CONNECTOR_POLL_CONNECT | 438 - DRM_CONNECTOR_POLL_DISCONNECT)) 439 - poll = true; 440 - } 441 - 442 - if (poll) 443 - schedule_delayed_work(&dev->mode_config.output_poll_work, DRM_OUTPUT_POLL_PERIOD); 410 + mutex_lock(&dev->mode_config.mutex); 411 + __drm_kms_helper_poll_enable(dev); 412 + mutex_unlock(&dev->mode_config.mutex); 444 413 } 445 414 EXPORT_SYMBOL(drm_kms_helper_poll_enable); 446 415 ··· 504 495 return false; 505 496 506 497 mutex_lock(&dev->mode_config.mutex); 507 - list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 498 + drm_for_each_connector(connector, dev) { 508 499 509 500 /* Only handle HPD capable connectors. */ 510 501 if (!(connector->polled & DRM_CONNECTOR_POLL_HPD))
+3 -1
drivers/gpu/drm/i915/i915_debugfs.c
··· 1866 1866 struct drm_device *dev = node->minor->dev; 1867 1867 struct intel_fbdev *ifbdev = NULL; 1868 1868 struct intel_framebuffer *fb; 1869 + struct drm_framebuffer *drm_fb; 1869 1870 1870 1871 #ifdef CONFIG_DRM_I915_FBDEV 1871 1872 struct drm_i915_private *dev_priv = dev->dev_private; ··· 1886 1885 #endif 1887 1886 1888 1887 mutex_lock(&dev->mode_config.fb_lock); 1889 - list_for_each_entry(fb, &dev->mode_config.fb_list, base.head) { 1888 + drm_for_each_fb(drm_fb, dev) { 1889 + fb = to_intel_framebuffer(drm_fb); 1890 1890 if (ifbdev && &fb->base == ifbdev->helper.fb) 1891 1891 continue; 1892 1892
+6 -9
drivers/gpu/drm/i915/intel_dp_mst.c
··· 441 441 drm_object_attach_property(&connector->base, dev->mode_config.tile_property, 0); 442 442 443 443 drm_mode_connector_set_path_property(connector, pathprop); 444 - drm_reinit_primary_mode_group(dev); 445 - mutex_lock(&dev->mode_config.mutex); 444 + drm_modeset_lock_all(dev); 446 445 intel_connector_add_to_fbdev(intel_connector); 447 - mutex_unlock(&dev->mode_config.mutex); 446 + drm_modeset_unlock_all(dev); 448 447 drm_connector_register(&intel_connector->base); 449 448 return connector; 450 449 } ··· 454 455 struct intel_connector *intel_connector = to_intel_connector(connector); 455 456 struct drm_device *dev = connector->dev; 456 457 /* need to nuke the connector */ 457 - mutex_lock(&dev->mode_config.mutex); 458 + drm_modeset_lock_all(dev); 458 459 intel_connector_dpms(connector, DRM_MODE_DPMS_OFF); 459 - mutex_unlock(&dev->mode_config.mutex); 460 + drm_modeset_unlock_all(dev); 460 461 461 462 intel_connector->unregister(intel_connector); 462 463 463 - mutex_lock(&dev->mode_config.mutex); 464 + drm_modeset_lock_all(dev); 464 465 intel_connector_remove_from_fbdev(intel_connector); 465 466 drm_connector_cleanup(connector); 466 - mutex_unlock(&dev->mode_config.mutex); 467 - 468 - drm_reinit_primary_mode_group(dev); 467 + drm_modeset_unlock_all(dev); 469 468 470 469 kfree(intel_connector); 471 470 DRM_DEBUG_KMS("\n");
+1 -1
drivers/gpu/drm/i915/intel_pm.c
··· 2356 2356 p->pri.horiz_pixels = intel_crtc->config->pipe_src_w; 2357 2357 p->cur.horiz_pixels = intel_crtc->base.cursor->state->crtc_w; 2358 2358 2359 - drm_for_each_legacy_plane(plane, &dev->mode_config.plane_list) { 2359 + drm_for_each_legacy_plane(plane, dev) { 2360 2360 struct intel_plane *intel_plane = to_intel_plane(plane); 2361 2361 2362 2362 if (intel_plane->pipe == pipe) {
+4 -7
drivers/gpu/drm/radeon/radeon_dp_mst.c
··· 284 284 285 285 drm_object_attach_property(&connector->base, dev->mode_config.path_property, 0); 286 286 drm_mode_connector_set_path_property(connector, pathprop); 287 - drm_reinit_primary_mode_group(dev); 288 287 289 - mutex_lock(&dev->mode_config.mutex); 288 + drm_modeset_lock_all(dev); 290 289 radeon_fb_add_connector(rdev, connector); 291 - mutex_unlock(&dev->mode_config.mutex); 290 + drm_modeset_unlock_all(dev); 292 291 293 292 drm_connector_register(connector); 294 293 return connector; ··· 302 303 303 304 drm_connector_unregister(connector); 304 305 /* need to nuke the connector */ 305 - mutex_lock(&dev->mode_config.mutex); 306 + drm_modeset_lock_all(dev); 306 307 /* dpms off */ 307 308 radeon_fb_remove_connector(rdev, connector); 308 309 309 310 drm_connector_cleanup(connector); 310 - mutex_unlock(&dev->mode_config.mutex); 311 - drm_reinit_primary_mode_group(dev); 312 - 311 + drm_modeset_unlock_all(dev); 313 312 314 313 kfree(connector); 315 314 DRM_DEBUG_KMS("\n");
+1 -1
drivers/gpu/drm/shmobile/shmob_drm_crtc.c
··· 248 248 lcdc_write(sdev, LDDDSR, value); 249 249 250 250 /* Setup planes. */ 251 - drm_for_each_legacy_plane(plane, &dev->mode_config.plane_list) { 251 + drm_for_each_legacy_plane(plane, dev) { 252 252 if (plane->crtc == crtc) 253 253 shmob_drm_plane_setup(plane); 254 254 }
-1
include/drm/drmP.h
··· 676 676 677 677 /* currently active master for this node. Protected by master_mutex */ 678 678 struct drm_master *master; 679 - struct drm_mode_group mode_group; 680 679 }; 681 680 682 681
+39 -28
include/drm/drm_crtc.h
··· 1018 1018 }; 1019 1019 1020 1020 /** 1021 - * struct drm_mode_group - group of mode setting resources for potential sub-grouping 1022 - * @num_crtcs: CRTC count 1023 - * @num_encoders: encoder count 1024 - * @num_connectors: connector count 1025 - * @num_bridges: bridge count 1026 - * @id_list: list of KMS object IDs in this group 1027 - * 1028 - * Currently this simply tracks the global mode setting state. But in the 1029 - * future it could allow groups of objects to be set aside into independent 1030 - * control groups for use by different user level processes (e.g. two X servers 1031 - * running simultaneously on different heads, each with their own mode 1032 - * configuration and freedom of mode setting). 1033 - */ 1034 - struct drm_mode_group { 1035 - uint32_t num_crtcs; 1036 - uint32_t num_encoders; 1037 - uint32_t num_connectors; 1038 - 1039 - /* list of object IDs for this group */ 1040 - uint32_t *id_list; 1041 - }; 1042 - 1043 - /** 1044 1021 * struct drm_mode_config - Mode configuration control structure 1045 1022 * @mutex: mutex protecting KMS related lists and structures 1046 1023 * @connection_mutex: ww mutex protecting connector state and routing ··· 1301 1324 extern void drm_fb_release(struct drm_file *file_priv); 1302 1325 extern void drm_property_destroy_user_blobs(struct drm_device *dev, 1303 1326 struct drm_file *file_priv); 1304 - extern int drm_mode_group_init_legacy_group(struct drm_device *dev, struct drm_mode_group *group); 1305 - extern void drm_mode_group_destroy(struct drm_mode_group *group); 1306 - extern void drm_reinit_primary_mode_group(struct drm_device *dev); 1307 1327 extern bool drm_probe_ddc(struct i2c_adapter *adapter); 1308 1328 extern struct edid *drm_get_edid(struct drm_connector *connector, 1309 1329 struct i2c_adapter *adapter); ··· 1553 1579 } 1554 1580 1555 1581 /* Plane list iterator for legacy (overlay only) planes. */ 1556 - #define drm_for_each_legacy_plane(plane, planelist) \ 1557 - list_for_each_entry(plane, planelist, head) \ 1582 + #define drm_for_each_legacy_plane(plane, dev) \ 1583 + list_for_each_entry(plane, &(dev)->mode_config.plane_list, head) \ 1558 1584 if (plane->type == DRM_PLANE_TYPE_OVERLAY) 1585 + 1586 + #define drm_for_each_plane(plane, dev) \ 1587 + list_for_each_entry(plane, &(dev)->mode_config.plane_list, head) 1588 + 1589 + #define drm_for_each_crtc(crtc, dev) \ 1590 + list_for_each_entry(crtc, &(dev)->mode_config.crtc_list, head) 1591 + 1592 + static inline void 1593 + assert_drm_connector_list_read_locked(struct drm_mode_config *mode_config) 1594 + { 1595 + /* 1596 + * The connector hotadd/remove code currently grabs both locks when 1597 + * updating lists. Hence readers need only hold either of them to be 1598 + * safe and the check amounts to 1599 + * 1600 + * WARN_ON(not_holding(A) && not_holding(B)). 1601 + */ 1602 + WARN_ON(!mutex_is_locked(&mode_config->mutex) && 1603 + !drm_modeset_is_locked(&mode_config->connection_mutex)); 1604 + } 1605 + 1606 + #define drm_for_each_connector(connector, dev) \ 1607 + for (assert_drm_connector_list_read_locked(&(dev)->mode_config), \ 1608 + connector = list_first_entry(&(dev)->mode_config.connector_list, \ 1609 + struct drm_connector, head); \ 1610 + &connector->head != (&(dev)->mode_config.connector_list); \ 1611 + connector = list_next_entry(connector, head)) 1612 + 1613 + #define drm_for_each_encoder(encoder, dev) \ 1614 + list_for_each_entry(encoder, &(dev)->mode_config.encoder_list, head) 1615 + 1616 + #define drm_for_each_fb(fb, dev) \ 1617 + for (WARN_ON(!mutex_is_locked(&(dev)->mode_config.fb_lock)), \ 1618 + fb = list_first_entry(&(dev)->mode_config.fb_list, \ 1619 + struct drm_framebuffer, head); \ 1620 + &fb->head != (&(dev)->mode_config.fb_list); \ 1621 + fb = list_next_entry(fb, head)) 1559 1622 1560 1623 #endif /* __DRM_CRTC_H__ */