diff options
| author | Francisco Jerez <currojerez@riseup.net> | 2010-10-21 11:43:08 -0400 |
|---|---|---|
| committer | Ben Skeggs <bskeggs@redhat.com> | 2010-11-17 23:38:41 -0500 |
| commit | 01db363979e96115a895f35c823303660f0f328d (patch) | |
| tree | 4f95a91259be2fb2f81e310bc7e8998132efae9f | |
| parent | 5794b5fdb579abf7be2c27c6e0d6106f391a26e4 (diff) | |
drm/nouveau: Use "force" to decide if analog load detection is ok or not.
Signed-off-by: Francisco Jerez <currojerez@riseup.net>
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
| -rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_connector.c | 69 | ||||
| -rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_connector.h | 3 | ||||
| -rw-r--r-- | drivers/gpu/drm/nouveau/nv04_crtc.c | 5 |
3 files changed, 28 insertions, 49 deletions
diff --git a/drivers/gpu/drm/nouveau/nouveau_connector.c b/drivers/gpu/drm/nouveau/nouveau_connector.c index 6208eedc0970..9ec2b8a81344 100644 --- a/drivers/gpu/drm/nouveau/nouveau_connector.c +++ b/drivers/gpu/drm/nouveau/nouveau_connector.c | |||
| @@ -213,6 +213,24 @@ nouveau_connector_set_encoder(struct drm_connector *connector, | |||
| 213 | } | 213 | } |
| 214 | } | 214 | } |
| 215 | 215 | ||
| 216 | static bool | ||
| 217 | nouveau_connector_poll_allowed(struct drm_connector *connector) | ||
| 218 | { | ||
| 219 | struct drm_device *dev = connector->dev; | ||
| 220 | struct drm_nouveau_private *dev_priv = dev->dev_private; | ||
| 221 | struct drm_crtc *crtc; | ||
| 222 | bool spare_crtc = false; | ||
| 223 | |||
| 224 | if (dev_priv->card_type >= NV_50) { | ||
| 225 | return true; | ||
| 226 | } else { | ||
| 227 | list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) | ||
| 228 | spare_crtc |= !crtc->enabled; | ||
| 229 | |||
| 230 | return spare_crtc; | ||
| 231 | } | ||
| 232 | } | ||
| 233 | |||
| 216 | static enum drm_connector_status | 234 | static enum drm_connector_status |
| 217 | nouveau_connector_detect(struct drm_connector *connector, bool force) | 235 | nouveau_connector_detect(struct drm_connector *connector, bool force) |
| 218 | { | 236 | { |
| @@ -281,7 +299,8 @@ detect_analog: | |||
| 281 | nv_encoder = find_encoder_by_type(connector, OUTPUT_ANALOG); | 299 | nv_encoder = find_encoder_by_type(connector, OUTPUT_ANALOG); |
| 282 | if (!nv_encoder && !nouveau_tv_disable) | 300 | if (!nv_encoder && !nouveau_tv_disable) |
| 283 | nv_encoder = find_encoder_by_type(connector, OUTPUT_TV); | 301 | nv_encoder = find_encoder_by_type(connector, OUTPUT_TV); |
| 284 | if (nv_encoder) { | 302 | if (nv_encoder && |
| 303 | (force || nouveau_connector_poll_allowed(connector))) { | ||
| 285 | struct drm_encoder *encoder = to_drm_encoder(nv_encoder); | 304 | struct drm_encoder *encoder = to_drm_encoder(nv_encoder); |
| 286 | struct drm_encoder_helper_funcs *helper = | 305 | struct drm_encoder_helper_funcs *helper = |
| 287 | encoder->helper_private; | 306 | encoder->helper_private; |
| @@ -724,44 +743,6 @@ nouveau_connector_best_encoder(struct drm_connector *connector) | |||
| 724 | return NULL; | 743 | return NULL; |
| 725 | } | 744 | } |
| 726 | 745 | ||
| 727 | void | ||
| 728 | nouveau_connector_set_polling(struct drm_connector *connector) | ||
| 729 | { | ||
| 730 | struct drm_device *dev = connector->dev; | ||
| 731 | struct drm_nouveau_private *dev_priv = dev->dev_private; | ||
| 732 | struct drm_crtc *crtc; | ||
| 733 | bool spare_crtc = false; | ||
| 734 | |||
| 735 | list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) | ||
| 736 | spare_crtc |= !crtc->enabled; | ||
| 737 | |||
| 738 | connector->polled = 0; | ||
| 739 | |||
| 740 | switch (connector->connector_type) { | ||
| 741 | case DRM_MODE_CONNECTOR_VGA: | ||
| 742 | case DRM_MODE_CONNECTOR_TV: | ||
| 743 | if (dev_priv->card_type >= NV_50 || | ||
| 744 | (nv_gf4_disp_arch(dev) && spare_crtc)) | ||
| 745 | connector->polled = DRM_CONNECTOR_POLL_CONNECT; | ||
| 746 | break; | ||
| 747 | |||
| 748 | case DRM_MODE_CONNECTOR_DVII: | ||
| 749 | case DRM_MODE_CONNECTOR_DVID: | ||
| 750 | case DRM_MODE_CONNECTOR_HDMIA: | ||
| 751 | case DRM_MODE_CONNECTOR_DisplayPort: | ||
| 752 | case DRM_MODE_CONNECTOR_eDP: | ||
| 753 | if (dev_priv->card_type >= NV_50) | ||
| 754 | connector->polled = DRM_CONNECTOR_POLL_HPD; | ||
| 755 | else if (connector->connector_type == DRM_MODE_CONNECTOR_DVID || | ||
| 756 | spare_crtc) | ||
| 757 | connector->polled = DRM_CONNECTOR_POLL_CONNECT; | ||
| 758 | break; | ||
| 759 | |||
| 760 | default: | ||
| 761 | break; | ||
| 762 | } | ||
| 763 | } | ||
| 764 | |||
| 765 | static const struct drm_connector_helper_funcs | 746 | static const struct drm_connector_helper_funcs |
| 766 | nouveau_connector_helper_funcs = { | 747 | nouveau_connector_helper_funcs = { |
| 767 | .get_modes = nouveau_connector_get_modes, | 748 | .get_modes = nouveau_connector_get_modes, |
| @@ -892,6 +873,9 @@ nouveau_connector_create(struct drm_device *dev, int index) | |||
| 892 | case DCB_CONNECTOR_TV_1: | 873 | case DCB_CONNECTOR_TV_1: |
| 893 | case DCB_CONNECTOR_TV_3: | 874 | case DCB_CONNECTOR_TV_3: |
| 894 | nv_connector->scaling_mode = DRM_MODE_SCALE_NONE; | 875 | nv_connector->scaling_mode = DRM_MODE_SCALE_NONE; |
| 876 | |||
| 877 | if (nv_gf4_disp_arch(dev)) | ||
| 878 | connector->polled = DRM_CONNECTOR_POLL_CONNECT; | ||
| 895 | break; | 879 | break; |
| 896 | default: | 880 | default: |
| 897 | nv_connector->scaling_mode = DRM_MODE_SCALE_FULLSCREEN; | 881 | nv_connector->scaling_mode = DRM_MODE_SCALE_FULLSCREEN; |
| @@ -903,11 +887,14 @@ nouveau_connector_create(struct drm_device *dev, int index) | |||
| 903 | dev->mode_config.dithering_mode_property, | 887 | dev->mode_config.dithering_mode_property, |
| 904 | nv_connector->use_dithering ? | 888 | nv_connector->use_dithering ? |
| 905 | DRM_MODE_DITHERING_ON : DRM_MODE_DITHERING_OFF); | 889 | DRM_MODE_DITHERING_ON : DRM_MODE_DITHERING_OFF); |
| 890 | |||
| 891 | if (dev_priv->card_type >= NV_50) | ||
| 892 | connector->polled = DRM_CONNECTOR_POLL_HPD; | ||
| 893 | else | ||
| 894 | connector->polled = DRM_CONNECTOR_POLL_CONNECT; | ||
| 906 | break; | 895 | break; |
| 907 | } | 896 | } |
| 908 | 897 | ||
| 909 | nouveau_connector_set_polling(connector); | ||
| 910 | |||
| 911 | drm_sysfs_connector_add(connector); | 898 | drm_sysfs_connector_add(connector); |
| 912 | dcb->drm = connector; | 899 | dcb->drm = connector; |
| 913 | return dcb->drm; | 900 | return dcb->drm; |
diff --git a/drivers/gpu/drm/nouveau/nouveau_connector.h b/drivers/gpu/drm/nouveau/nouveau_connector.h index c21ed6b16f88..711b1e9203af 100644 --- a/drivers/gpu/drm/nouveau/nouveau_connector.h +++ b/drivers/gpu/drm/nouveau/nouveau_connector.h | |||
| @@ -52,9 +52,6 @@ static inline struct nouveau_connector *nouveau_connector( | |||
| 52 | struct drm_connector * | 52 | struct drm_connector * |
| 53 | nouveau_connector_create(struct drm_device *, int index); | 53 | nouveau_connector_create(struct drm_device *, int index); |
| 54 | 54 | ||
| 55 | void | ||
| 56 | nouveau_connector_set_polling(struct drm_connector *); | ||
| 57 | |||
| 58 | int | 55 | int |
| 59 | nouveau_connector_bpp(struct drm_connector *); | 56 | nouveau_connector_bpp(struct drm_connector *); |
| 60 | 57 | ||
diff --git a/drivers/gpu/drm/nouveau/nv04_crtc.c b/drivers/gpu/drm/nouveau/nv04_crtc.c index 5b49cec528ee..40e180741629 100644 --- a/drivers/gpu/drm/nouveau/nv04_crtc.c +++ b/drivers/gpu/drm/nouveau/nv04_crtc.c | |||
| @@ -158,7 +158,6 @@ nv_crtc_dpms(struct drm_crtc *crtc, int mode) | |||
| 158 | { | 158 | { |
| 159 | struct nouveau_crtc *nv_crtc = nouveau_crtc(crtc); | 159 | struct nouveau_crtc *nv_crtc = nouveau_crtc(crtc); |
| 160 | struct drm_device *dev = crtc->dev; | 160 | struct drm_device *dev = crtc->dev; |
| 161 | struct drm_connector *connector; | ||
| 162 | unsigned char seq1 = 0, crtc17 = 0; | 161 | unsigned char seq1 = 0, crtc17 = 0; |
| 163 | unsigned char crtc1A; | 162 | unsigned char crtc1A; |
| 164 | 163 | ||
| @@ -213,10 +212,6 @@ nv_crtc_dpms(struct drm_crtc *crtc, int mode) | |||
| 213 | NVVgaSeqReset(dev, nv_crtc->index, false); | 212 | NVVgaSeqReset(dev, nv_crtc->index, false); |
| 214 | 213 | ||
| 215 | NVWriteVgaCrtc(dev, nv_crtc->index, NV_CIO_CRE_RPC1_INDEX, crtc1A); | 214 | NVWriteVgaCrtc(dev, nv_crtc->index, NV_CIO_CRE_RPC1_INDEX, crtc1A); |
| 216 | |||
| 217 | /* Update connector polling modes */ | ||
| 218 | list_for_each_entry(connector, &dev->mode_config.connector_list, head) | ||
| 219 | nouveau_connector_set_polling(connector); | ||
| 220 | } | 215 | } |
| 221 | 216 | ||
| 222 | static bool | 217 | static bool |
