Example #1
0
/* Setup MCHBAR if possible, return true if we should disable it again */
static bool
intel_setup_mchbar(struct drm_device *dev)
{
    struct pci_dev *bridge_dev;
    int mchbar_reg = IS_I965G(dev) ? MCHBAR_I965 : MCHBAR_I915;
    u32 temp;
    bool need_disable = false, enabled;

    bridge_dev = pci_get_bus_and_slot(0, PCI_DEVFN(0,0));
    if (!bridge_dev) {
        DRM_DEBUG("no bridge dev?!\n");
        goto out;
    }

    if (IS_I915G(dev) || IS_I915GM(dev)) {
        pci_read_config_dword(bridge_dev, DEVEN_REG, &temp);
        enabled = !!(temp & DEVEN_MCHBAR_EN);
    } else {
        pci_read_config_dword(bridge_dev, mchbar_reg, &temp);
        enabled = temp & 1;
    }

    /* If it's already enabled, don't have to do anything */
    if (enabled)
        goto out_put;

    if (intel_alloc_mchbar_resource(dev))
        goto out_put;

    need_disable = true;

    /* Space is allocated or reserved, so enable it. */
    if (IS_I915G(dev) || IS_I915GM(dev)) {
        pci_write_config_dword(bridge_dev, DEVEN_REG,
                               temp | DEVEN_MCHBAR_EN);
    } else {
        pci_read_config_dword(bridge_dev, mchbar_reg, &temp);
        pci_write_config_dword(bridge_dev, mchbar_reg, temp | 1);
    }
out_put:
    pci_dev_put(bridge_dev);
out:
    return need_disable;
}
Example #2
0
/* Setup MCHBAR if possible, return true if we should disable it again */
static void
intel_setup_mchbar(struct drm_device *dev)
{
	struct drm_i915_private *dev_priv = dev->dev_private;
	int mchbar_reg = INTEL_INFO(dev)->gen >= 4 ? MCHBAR_I965 : MCHBAR_I915;
	u32 temp;
	bool enabled;

	if (IS_VALLEYVIEW(dev))
		return;

	dev_priv->mchbar_need_disable = false;

	if (IS_I915G(dev) || IS_I915GM(dev)) {
		pci_read_config_dword(dev_priv->bridge_dev, DEVEN_REG, &temp);
		enabled = !!(temp & DEVEN_MCHBAR_EN);
	} else {
		pci_read_config_dword(dev_priv->bridge_dev, mchbar_reg, &temp);
		enabled = temp & 1;
	}

	/* If it's already enabled, don't have to do anything */
	if (enabled)
		return;

	if (intel_alloc_mchbar_resource(dev))
		return;

	dev_priv->mchbar_need_disable = true;

	/* Space is allocated or reserved, so enable it. */
	if (IS_I915G(dev) || IS_I915GM(dev)) {
		pci_write_config_dword(dev_priv->bridge_dev, DEVEN_REG,
				       temp | DEVEN_MCHBAR_EN);
	} else {
		pci_read_config_dword(dev_priv->bridge_dev, mchbar_reg, &temp);
		pci_write_config_dword(dev_priv->bridge_dev, mchbar_reg, temp | 1);
	}
}
/* Setup MCHBAR if possible, return true if we should disable it again */
static bool
intel_setup_mchbar(struct drm_device *dev)
{
	drm_i915_private_t *dev_priv = dev->dev_private;
	int mchbar_reg = IS_I965G(dev) ? MCHBAR_I965 : MCHBAR_I915;
	u32 temp;
	bool need_disable = false, enabled;

	if (IS_I915G(dev) || IS_I915GM(dev)) {
		pci_read_config_dword(dev_priv->bridge_dev, DEVEN_REG, &temp);
		enabled = !!(temp & DEVEN_MCHBAR_EN);
	} else {
		pci_read_config_dword(dev_priv->bridge_dev, mchbar_reg, &temp);
		enabled = temp & 1;
	}

	/* If it's already enabled, don't have to do anything */
	if (enabled)
		goto out;

	if (intel_alloc_mchbar_resource(dev))
		goto out;

	need_disable = true;

	/* Space is allocated or reserved, so enable it. */
	if (IS_I915G(dev) || IS_I915GM(dev)) {
		pci_write_config_dword(dev_priv->bridge_dev, DEVEN_REG,
				       temp | DEVEN_MCHBAR_EN);
	} else {
		pci_read_config_dword(dev_priv->bridge_dev, mchbar_reg, &temp);
		pci_write_config_dword(dev_priv->bridge_dev, mchbar_reg, temp | 1);
	}
out:
	return need_disable;
}