drm/nouveau: implement devinit subdev, and new init table parser
v2: - make sure not to execute display scripts unless resuming Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
This commit is contained in:
@@ -35,69 +35,9 @@
|
||||
static void nv04_vblank_crtc0_isr(struct drm_device *);
|
||||
static void nv04_vblank_crtc1_isr(struct drm_device *);
|
||||
|
||||
static void
|
||||
nv04_display_store_initial_head_owner(struct drm_device *dev)
|
||||
{
|
||||
struct drm_nouveau_private *dev_priv = dev->dev_private;
|
||||
|
||||
if (dev_priv->chipset != 0x11) {
|
||||
dev_priv->crtc_owner = NVReadVgaCrtc(dev, 0, NV_CIO_CRE_44);
|
||||
return;
|
||||
}
|
||||
|
||||
/* reading CR44 is broken on nv11, so we attempt to infer it */
|
||||
if (nvReadMC(dev, NV_PBUS_DEBUG_1) & (1 << 28)) /* heads tied, restore both */
|
||||
dev_priv->crtc_owner = 0x4;
|
||||
else {
|
||||
uint8_t slaved_on_A, slaved_on_B;
|
||||
bool tvA = false;
|
||||
bool tvB = false;
|
||||
|
||||
slaved_on_B = NVReadVgaCrtc(dev, 1, NV_CIO_CRE_PIXEL_INDEX) &
|
||||
0x80;
|
||||
if (slaved_on_B)
|
||||
tvB = !(NVReadVgaCrtc(dev, 1, NV_CIO_CRE_LCD__INDEX) &
|
||||
MASK(NV_CIO_CRE_LCD_LCD_SELECT));
|
||||
|
||||
slaved_on_A = NVReadVgaCrtc(dev, 0, NV_CIO_CRE_PIXEL_INDEX) &
|
||||
0x80;
|
||||
if (slaved_on_A)
|
||||
tvA = !(NVReadVgaCrtc(dev, 0, NV_CIO_CRE_LCD__INDEX) &
|
||||
MASK(NV_CIO_CRE_LCD_LCD_SELECT));
|
||||
|
||||
if (slaved_on_A && !tvA)
|
||||
dev_priv->crtc_owner = 0x0;
|
||||
else if (slaved_on_B && !tvB)
|
||||
dev_priv->crtc_owner = 0x3;
|
||||
else if (slaved_on_A)
|
||||
dev_priv->crtc_owner = 0x0;
|
||||
else if (slaved_on_B)
|
||||
dev_priv->crtc_owner = 0x3;
|
||||
else
|
||||
dev_priv->crtc_owner = 0x0;
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
nv04_display_early_init(struct drm_device *dev)
|
||||
{
|
||||
/* Make the I2C buses accessible. */
|
||||
if (!nv_gf4_disp_arch(dev)) {
|
||||
uint32_t pmc_enable = nv_rd32(dev, NV03_PMC_ENABLE);
|
||||
|
||||
if (!(pmc_enable & 1))
|
||||
nv_wr32(dev, NV03_PMC_ENABLE, pmc_enable | 1);
|
||||
}
|
||||
|
||||
/* Unlock the VGA CRTCs. */
|
||||
NVLockVgaCrtcs(dev, false);
|
||||
|
||||
/* Make sure the CRTCs aren't in slaved mode. */
|
||||
if (nv_two_heads(dev)) {
|
||||
nv04_display_store_initial_head_owner(dev);
|
||||
NVSetOwner(dev, 0);
|
||||
}
|
||||
|
||||
/* ensure vblank interrupts are off, they can't be enabled until
|
||||
* drm_vblank has been initialised
|
||||
*/
|
||||
@@ -111,12 +51,6 @@ nv04_display_early_init(struct drm_device *dev)
|
||||
void
|
||||
nv04_display_late_takedown(struct drm_device *dev)
|
||||
{
|
||||
struct drm_nouveau_private *dev_priv = dev->dev_private;
|
||||
|
||||
if (nv_two_heads(dev))
|
||||
NVSetOwner(dev, dev_priv->crtc_owner);
|
||||
|
||||
NVLockVgaCrtcs(dev, true);
|
||||
}
|
||||
|
||||
int
|
||||
@@ -138,21 +72,21 @@ nv04_display_create(struct drm_device *dev)
|
||||
nv04_crtc_create(dev, 1);
|
||||
|
||||
for (i = 0; i < dcb->entries; i++) {
|
||||
struct dcb_entry *dcbent = &dcb->entry[i];
|
||||
struct dcb_output *dcbent = &dcb->entry[i];
|
||||
|
||||
connector = nouveau_connector_create(dev, dcbent->connector);
|
||||
if (IS_ERR(connector))
|
||||
continue;
|
||||
|
||||
switch (dcbent->type) {
|
||||
case OUTPUT_ANALOG:
|
||||
case DCB_OUTPUT_ANALOG:
|
||||
ret = nv04_dac_create(connector, dcbent);
|
||||
break;
|
||||
case OUTPUT_LVDS:
|
||||
case OUTPUT_TMDS:
|
||||
case DCB_OUTPUT_LVDS:
|
||||
case DCB_OUTPUT_TMDS:
|
||||
ret = nv04_dfp_create(connector, dcbent);
|
||||
break;
|
||||
case OUTPUT_TV:
|
||||
case DCB_OUTPUT_TV:
|
||||
if (dcbent->location == DCB_LOC_ON_CHIP)
|
||||
ret = nv17_tv_create(connector, dcbent);
|
||||
else
|
||||
|
Reference in New Issue
Block a user