|
@@ -32,8 +32,6 @@
|
|
#include "nouveau_encoder.h"
|
|
#include "nouveau_encoder.h"
|
|
#include "nouveau_connector.h"
|
|
#include "nouveau_connector.h"
|
|
|
|
|
|
-#define MULTIPLE_ENCODERS(e) (e & (e - 1))
|
|
|
|
-
|
|
|
|
static void
|
|
static void
|
|
nv04_display_store_initial_head_owner(struct drm_device *dev)
|
|
nv04_display_store_initial_head_owner(struct drm_device *dev)
|
|
{
|
|
{
|
|
@@ -41,7 +39,7 @@ nv04_display_store_initial_head_owner(struct drm_device *dev)
|
|
|
|
|
|
if (dev_priv->chipset != 0x11) {
|
|
if (dev_priv->chipset != 0x11) {
|
|
dev_priv->crtc_owner = NVReadVgaCrtc(dev, 0, NV_CIO_CRE_44);
|
|
dev_priv->crtc_owner = NVReadVgaCrtc(dev, 0, NV_CIO_CRE_44);
|
|
- goto ownerknown;
|
|
|
|
|
|
+ return;
|
|
}
|
|
}
|
|
|
|
|
|
/* reading CR44 is broken on nv11, so we attempt to infer it */
|
|
/* reading CR44 is broken on nv11, so we attempt to infer it */
|
|
@@ -52,8 +50,6 @@ nv04_display_store_initial_head_owner(struct drm_device *dev)
|
|
bool tvA = false;
|
|
bool tvA = false;
|
|
bool tvB = false;
|
|
bool tvB = false;
|
|
|
|
|
|
- NVLockVgaCrtcs(dev, false);
|
|
|
|
-
|
|
|
|
slaved_on_B = NVReadVgaCrtc(dev, 1, NV_CIO_CRE_PIXEL_INDEX) &
|
|
slaved_on_B = NVReadVgaCrtc(dev, 1, NV_CIO_CRE_PIXEL_INDEX) &
|
|
0x80;
|
|
0x80;
|
|
if (slaved_on_B)
|
|
if (slaved_on_B)
|
|
@@ -66,8 +62,6 @@ nv04_display_store_initial_head_owner(struct drm_device *dev)
|
|
tvA = !(NVReadVgaCrtc(dev, 0, NV_CIO_CRE_LCD__INDEX) &
|
|
tvA = !(NVReadVgaCrtc(dev, 0, NV_CIO_CRE_LCD__INDEX) &
|
|
MASK(NV_CIO_CRE_LCD_LCD_SELECT));
|
|
MASK(NV_CIO_CRE_LCD_LCD_SELECT));
|
|
|
|
|
|
- NVLockVgaCrtcs(dev, true);
|
|
|
|
-
|
|
|
|
if (slaved_on_A && !tvA)
|
|
if (slaved_on_A && !tvA)
|
|
dev_priv->crtc_owner = 0x0;
|
|
dev_priv->crtc_owner = 0x0;
|
|
else if (slaved_on_B && !tvB)
|
|
else if (slaved_on_B && !tvB)
|
|
@@ -79,12 +73,6 @@ nv04_display_store_initial_head_owner(struct drm_device *dev)
|
|
else
|
|
else
|
|
dev_priv->crtc_owner = 0x0;
|
|
dev_priv->crtc_owner = 0x0;
|
|
}
|
|
}
|
|
-
|
|
|
|
-ownerknown:
|
|
|
|
- /* we need to ensure the heads are not tied henceforth, or reading any
|
|
|
|
- * 8 bit reg on head B will fail
|
|
|
|
- * setting a single arbitrary head solves that */
|
|
|
|
- NVSetOwner(dev, 0);
|
|
|
|
}
|
|
}
|
|
|
|
|
|
int
|
|
int
|
|
@@ -99,8 +87,13 @@ nv04_display_create(struct drm_device *dev)
|
|
|
|
|
|
NV_DEBUG_KMS(dev, "\n");
|
|
NV_DEBUG_KMS(dev, "\n");
|
|
|
|
|
|
- if (nv_two_heads(dev))
|
|
|
|
|
|
+ NVLockVgaCrtcs(dev, false);
|
|
|
|
+
|
|
|
|
+ if (nv_two_heads(dev)) {
|
|
nv04_display_store_initial_head_owner(dev);
|
|
nv04_display_store_initial_head_owner(dev);
|
|
|
|
+ NVSetOwner(dev, 0);
|
|
|
|
+ }
|
|
|
|
+
|
|
nouveau_hw_save_vga_fonts(dev, 1);
|
|
nouveau_hw_save_vga_fonts(dev, 1);
|
|
|
|
|
|
drm_mode_config_init(dev);
|
|
drm_mode_config_init(dev);
|
|
@@ -168,8 +161,6 @@ nv04_display_create(struct drm_device *dev)
|
|
}
|
|
}
|
|
|
|
|
|
/* Save previous state */
|
|
/* Save previous state */
|
|
- NVLockVgaCrtcs(dev, false);
|
|
|
|
-
|
|
|
|
list_for_each_entry(crtc, &dev->mode_config.crtc_list, head)
|
|
list_for_each_entry(crtc, &dev->mode_config.crtc_list, head)
|
|
crtc->funcs->save(crtc);
|
|
crtc->funcs->save(crtc);
|
|
|
|
|
|
@@ -185,6 +176,7 @@ nv04_display_create(struct drm_device *dev)
|
|
void
|
|
void
|
|
nv04_display_destroy(struct drm_device *dev)
|
|
nv04_display_destroy(struct drm_device *dev)
|
|
{
|
|
{
|
|
|
|
+ struct drm_nouveau_private *dev_priv = dev->dev_private;
|
|
struct drm_encoder *encoder;
|
|
struct drm_encoder *encoder;
|
|
struct drm_crtc *crtc;
|
|
struct drm_crtc *crtc;
|
|
|
|
|
|
@@ -200,8 +192,6 @@ nv04_display_destroy(struct drm_device *dev)
|
|
}
|
|
}
|
|
|
|
|
|
/* Restore state */
|
|
/* Restore state */
|
|
- NVLockVgaCrtcs(dev, false);
|
|
|
|
-
|
|
|
|
list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
|
|
list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
|
|
struct drm_encoder_helper_funcs *func = encoder->helper_private;
|
|
struct drm_encoder_helper_funcs *func = encoder->helper_private;
|
|
|
|
|
|
@@ -214,12 +204,15 @@ nv04_display_destroy(struct drm_device *dev)
|
|
drm_mode_config_cleanup(dev);
|
|
drm_mode_config_cleanup(dev);
|
|
|
|
|
|
nouveau_hw_save_vga_fonts(dev, 0);
|
|
nouveau_hw_save_vga_fonts(dev, 0);
|
|
|
|
+
|
|
|
|
+ if (nv_two_heads(dev))
|
|
|
|
+ NVSetOwner(dev, dev_priv->crtc_owner);
|
|
|
|
+ NVLockVgaCrtcs(dev, true);
|
|
}
|
|
}
|
|
|
|
|
|
void
|
|
void
|
|
nv04_display_restore(struct drm_device *dev)
|
|
nv04_display_restore(struct drm_device *dev)
|
|
{
|
|
{
|
|
- struct drm_nouveau_private *dev_priv = dev->dev_private;
|
|
|
|
struct drm_encoder *encoder;
|
|
struct drm_encoder *encoder;
|
|
struct drm_crtc *crtc;
|
|
struct drm_crtc *crtc;
|
|
|
|
|
|
@@ -241,10 +234,5 @@ nv04_display_restore(struct drm_device *dev)
|
|
|
|
|
|
list_for_each_entry(crtc, &dev->mode_config.crtc_list, head)
|
|
list_for_each_entry(crtc, &dev->mode_config.crtc_list, head)
|
|
crtc->funcs->restore(crtc);
|
|
crtc->funcs->restore(crtc);
|
|
-
|
|
|
|
- if (nv_two_heads(dev))
|
|
|
|
- NVSetOwner(dev, dev_priv->crtc_owner);
|
|
|
|
-
|
|
|
|
- NVLockVgaCrtcs(dev, true);
|
|
|
|
}
|
|
}
|
|
|
|
|