コード例 #1
0
/* Allocate space for the MCH regs if needed, return nonzero on error */
static int
intel_alloc_mchbar_resource(struct drm_device *dev)
{
    struct pci_dev *bridge_dev;
    drm_i915_private_t *dev_priv = dev->dev_private;
    int reg = IS_I965G(dev) ? MCHBAR_I965 : MCHBAR_I915;
    u32 temp_lo, temp_hi = 0;
    u64 mchbar_addr;
    int ret = 0;

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

    if (IS_I965G(dev))
        pci_read_config_dword(bridge_dev, reg + 4, &temp_hi);
    pci_read_config_dword(bridge_dev, reg, &temp_lo);
    mchbar_addr = ((u64)temp_hi << 32) | temp_lo;

    /* If ACPI doesn't have it, assume we need to allocate it ourselves */
#ifdef CONFIG_PNP
    if (mchbar_addr &&
            pnp_range_reserved(mchbar_addr, mchbar_addr + MCHBAR_SIZE)) {
        ret = 0;
        goto out_put;
    }
#endif

    /* Get some space for it */
    ret = pci_bus_alloc_resource(bridge_dev->bus, &dev_priv->mch_res,
                                 MCHBAR_SIZE, MCHBAR_SIZE,
                                 PCIBIOS_MIN_MEM,
                                 0,   pcibios_align_resource,
                                 bridge_dev);
    if (ret) {
        DRM_DEBUG("failed bus alloc: %d\n", ret);
        dev_priv->mch_res.start = 0;
        goto out_put;
    }

    if (IS_I965G(dev))
        pci_write_config_dword(bridge_dev, reg + 4,
                               upper_32_bits(dev_priv->mch_res.start));

    pci_write_config_dword(bridge_dev, reg,
                           lower_32_bits(dev_priv->mch_res.start));
out_put:
    pci_dev_put(bridge_dev);
out:
    return ret;
}
コード例 #2
0
ファイル: i915_dma.c プロジェクト: titanxxh/xengt-ha-kernel
/* Allocate space for the MCH regs if needed, return nonzero on error */
static int
intel_alloc_mchbar_resource(struct drm_device *dev)
{
	struct drm_i915_private *dev_priv = dev->dev_private;
	int reg = INTEL_INFO(dev)->gen >= 4 ? MCHBAR_I965 : MCHBAR_I915;
	u32 temp_lo, temp_hi = 0;
	u64 mchbar_addr;
	int ret;

	if (INTEL_INFO(dev)->gen >= 4)
		pci_read_config_dword(dev_priv->bridge_dev, reg + 4, &temp_hi);
	pci_read_config_dword(dev_priv->bridge_dev, reg, &temp_lo);
	mchbar_addr = ((u64)temp_hi << 32) | temp_lo;

	/* If ACPI doesn't have it, assume we need to allocate it ourselves */
#ifdef CONFIG_PNP
	if (mchbar_addr &&
	    pnp_range_reserved(mchbar_addr, mchbar_addr + MCHBAR_SIZE))
		return 0;
#endif

	/* Get some space for it */
	dev_priv->mch_res.name = "i915 MCHBAR";
	dev_priv->mch_res.flags = IORESOURCE_MEM;
	ret = pci_bus_alloc_resource(dev_priv->bridge_dev->bus,
				     &dev_priv->mch_res,
				     MCHBAR_SIZE, MCHBAR_SIZE,
				     PCIBIOS_MIN_MEM,
				     0, pcibios_align_resource,
				     dev_priv->bridge_dev);
	if (ret) {
		DRM_DEBUG_DRIVER("failed bus alloc: %d\n", ret);
		dev_priv->mch_res.start = 0;
		return ret;
	}

	if (INTEL_INFO(dev)->gen >= 4)
		pci_write_config_dword(dev_priv->bridge_dev, reg + 4,
				       upper_32_bits(dev_priv->mch_res.start));

	pci_write_config_dword(dev_priv->bridge_dev, reg,
			       lower_32_bits(dev_priv->mch_res.start));
	return 0;
}