diff options
author | Ben Widawsky <ben@bwidawsk.net> | 2013-04-08 21:43:49 -0400 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2013-04-18 03:43:12 -0400 |
commit | 1e1bd0fd4ef3f74f05e4c164eb57a3b29c5f6790 (patch) | |
tree | 06d6b6df7e9bd411b47b2eba320be83cc791743f | |
parent | e7c2b58b700f467eedcbd1c8d7a3d4bada403439 (diff) |
drm/i915: Map registers before GTT init
This will allow us to read/write registers in GTT init.
Signed-off-by: Ben Widawsky <ben@bwidawsk.net>
[danvet: Fix up error handling. We really should look into devres for
this stuff ...]
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r-- | drivers/gpu/drm/i915/i915_dma.c | 47 |
1 files changed, 23 insertions, 24 deletions
diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c index 4a1a517b09e5..3b315ba85a3e 100644 --- a/drivers/gpu/drm/i915/i915_dma.c +++ b/drivers/gpu/drm/i915/i915_dma.c | |||
@@ -1518,6 +1518,28 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags) | |||
1518 | goto free_priv; | 1518 | goto free_priv; |
1519 | } | 1519 | } |
1520 | 1520 | ||
1521 | mmio_bar = IS_GEN2(dev) ? 1 : 0; | ||
1522 | /* Before gen4, the registers and the GTT are behind different BARs. | ||
1523 | * However, from gen4 onwards, the registers and the GTT are shared | ||
1524 | * in the same BAR, so we want to restrict this ioremap from | ||
1525 | * clobbering the GTT which we want ioremap_wc instead. Fortunately, | ||
1526 | * the register BAR remains the same size for all the earlier | ||
1527 | * generations up to Ironlake. | ||
1528 | */ | ||
1529 | if (info->gen < 5) | ||
1530 | mmio_size = 512*1024; | ||
1531 | else | ||
1532 | mmio_size = 2*1024*1024; | ||
1533 | |||
1534 | dev_priv->regs = pci_iomap(dev->pdev, mmio_bar, mmio_size); | ||
1535 | if (!dev_priv->regs) { | ||
1536 | DRM_ERROR("failed to map registers\n"); | ||
1537 | ret = -EIO; | ||
1538 | goto put_bridge; | ||
1539 | } | ||
1540 | |||
1541 | intel_early_sanitize_regs(dev); | ||
1542 | |||
1521 | ret = i915_gem_gtt_init(dev); | 1543 | ret = i915_gem_gtt_init(dev); |
1522 | if (ret) | 1544 | if (ret) |
1523 | goto put_bridge; | 1545 | goto put_bridge; |
@@ -1542,28 +1564,6 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags) | |||
1542 | if (IS_BROADWATER(dev) || IS_CRESTLINE(dev)) | 1564 | if (IS_BROADWATER(dev) || IS_CRESTLINE(dev)) |
1543 | dma_set_coherent_mask(&dev->pdev->dev, DMA_BIT_MASK(32)); | 1565 | dma_set_coherent_mask(&dev->pdev->dev, DMA_BIT_MASK(32)); |
1544 | 1566 | ||
1545 | mmio_bar = IS_GEN2(dev) ? 1 : 0; | ||
1546 | /* Before gen4, the registers and the GTT are behind different BARs. | ||
1547 | * However, from gen4 onwards, the registers and the GTT are shared | ||
1548 | * in the same BAR, so we want to restrict this ioremap from | ||
1549 | * clobbering the GTT which we want ioremap_wc instead. Fortunately, | ||
1550 | * the register BAR remains the same size for all the earlier | ||
1551 | * generations up to Ironlake. | ||
1552 | */ | ||
1553 | if (info->gen < 5) | ||
1554 | mmio_size = 512*1024; | ||
1555 | else | ||
1556 | mmio_size = 2*1024*1024; | ||
1557 | |||
1558 | dev_priv->regs = pci_iomap(dev->pdev, mmio_bar, mmio_size); | ||
1559 | if (!dev_priv->regs) { | ||
1560 | DRM_ERROR("failed to map registers\n"); | ||
1561 | ret = -EIO; | ||
1562 | goto put_gmch; | ||
1563 | } | ||
1564 | |||
1565 | intel_early_sanitize_regs(dev); | ||
1566 | |||
1567 | aperture_size = dev_priv->gtt.mappable_end; | 1567 | aperture_size = dev_priv->gtt.mappable_end; |
1568 | 1568 | ||
1569 | dev_priv->gtt.mappable = | 1569 | dev_priv->gtt.mappable = |
@@ -1686,10 +1686,9 @@ out_mtrrfree: | |||
1686 | dev_priv->mm.gtt_mtrr = -1; | 1686 | dev_priv->mm.gtt_mtrr = -1; |
1687 | } | 1687 | } |
1688 | io_mapping_free(dev_priv->gtt.mappable); | 1688 | io_mapping_free(dev_priv->gtt.mappable); |
1689 | dev_priv->gtt.gtt_remove(dev); | ||
1689 | out_rmmap: | 1690 | out_rmmap: |
1690 | pci_iounmap(dev->pdev, dev_priv->regs); | 1691 | pci_iounmap(dev->pdev, dev_priv->regs); |
1691 | put_gmch: | ||
1692 | dev_priv->gtt.gtt_remove(dev); | ||
1693 | put_bridge: | 1692 | put_bridge: |
1694 | pci_dev_put(dev_priv->bridge_dev); | 1693 | pci_dev_put(dev_priv->bridge_dev); |
1695 | free_priv: | 1694 | free_priv: |