aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/i915_dma.c
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2009-08-03 21:43:41 -0400
committerDave Airlie <airlied@redhat.com>2009-09-07 21:45:15 -0400
commitec2a4c3fdc8e82fe82a25d800e85c1ea06b74372 (patch)
treeb49f3ebe3e356fa8d17f15e9a5421851cb90024b /drivers/gpu/drm/i915/i915_dma.c
parentf1938cd6e900a85de64184e46d841efc9efd3484 (diff)
drm/i915: get the bridge device once.
The driver gets the bridge device in a number of places, upcoming vga arb code paths need the bridge device, however they need it in under a lock, and the pci lookup can allocate memory. So clean this code up before then and get the bridge once for the driver lifetime. Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/i915/i915_dma.c')
-rw-r--r--drivers/gpu/drm/i915/i915_dma.c33
1 files changed, 23 insertions, 10 deletions
diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c
index 91ef4c150193..9909505d070a 100644
--- a/drivers/gpu/drm/i915/i915_dma.c
+++ b/drivers/gpu/drm/i915/i915_dma.c
@@ -898,6 +898,18 @@ static int i915_set_status_page(struct drm_device *dev, void *data,
898 return 0; 898 return 0;
899} 899}
900 900
901static int i915_get_bridge_dev(struct drm_device *dev)
902{
903 struct drm_i915_private *dev_priv = dev->dev_private;
904
905 dev_priv->bridge_dev = pci_get_bus_and_slot(0, PCI_DEVFN(0,0));
906 if (!dev_priv->bridge_dev) {
907 DRM_ERROR("bridge device not found\n");
908 return -1;
909 }
910 return 0;
911}
912
901/** 913/**
902 * i915_probe_agp - get AGP bootup configuration 914 * i915_probe_agp - get AGP bootup configuration
903 * @pdev: PCI device 915 * @pdev: PCI device
@@ -911,20 +923,13 @@ static int i915_set_status_page(struct drm_device *dev, void *data,
911static int i915_probe_agp(struct drm_device *dev, uint32_t *aperture_size, 923static int i915_probe_agp(struct drm_device *dev, uint32_t *aperture_size,
912 uint32_t *preallocated_size) 924 uint32_t *preallocated_size)
913{ 925{
914 struct pci_dev *bridge_dev; 926 struct drm_i915_private *dev_priv = dev->dev_private;
915 u16 tmp = 0; 927 u16 tmp = 0;
916 unsigned long overhead; 928 unsigned long overhead;
917 unsigned long stolen; 929 unsigned long stolen;
918 930
919 bridge_dev = pci_get_bus_and_slot(0, PCI_DEVFN(0,0));
920 if (!bridge_dev) {
921 DRM_ERROR("bridge device not found\n");
922 return -1;
923 }
924
925 /* Get the fb aperture size and "stolen" memory amount. */ 931 /* Get the fb aperture size and "stolen" memory amount. */
926 pci_read_config_word(bridge_dev, INTEL_GMCH_CTRL, &tmp); 932 pci_read_config_word(dev_priv->bridge_dev, INTEL_GMCH_CTRL, &tmp);
927 pci_dev_put(bridge_dev);
928 933
929 *aperture_size = 1024 * 1024; 934 *aperture_size = 1024 * 1024;
930 *preallocated_size = 1024 * 1024; 935 *preallocated_size = 1024 * 1024;
@@ -1176,11 +1181,16 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)
1176 base = drm_get_resource_start(dev, mmio_bar); 1181 base = drm_get_resource_start(dev, mmio_bar);
1177 size = drm_get_resource_len(dev, mmio_bar); 1182 size = drm_get_resource_len(dev, mmio_bar);
1178 1183
1184 if (i915_get_bridge_dev(dev)) {
1185 ret = -EIO;
1186 goto free_priv;
1187 }
1188
1179 dev_priv->regs = ioremap(base, size); 1189 dev_priv->regs = ioremap(base, size);
1180 if (!dev_priv->regs) { 1190 if (!dev_priv->regs) {
1181 DRM_ERROR("failed to map registers\n"); 1191 DRM_ERROR("failed to map registers\n");
1182 ret = -EIO; 1192 ret = -EIO;
1183 goto free_priv; 1193 goto put_bridge;
1184 } 1194 }
1185 1195
1186 dev_priv->mm.gtt_mapping = 1196 dev_priv->mm.gtt_mapping =
@@ -1292,6 +1302,8 @@ out_iomapfree:
1292 io_mapping_free(dev_priv->mm.gtt_mapping); 1302 io_mapping_free(dev_priv->mm.gtt_mapping);
1293out_rmmap: 1303out_rmmap:
1294 iounmap(dev_priv->regs); 1304 iounmap(dev_priv->regs);
1305put_bridge:
1306 pci_dev_put(dev_priv->bridge_dev);
1295free_priv: 1307free_priv:
1296 kfree(dev_priv); 1308 kfree(dev_priv);
1297 return ret; 1309 return ret;
@@ -1335,6 +1347,7 @@ int i915_driver_unload(struct drm_device *dev)
1335 i915_gem_lastclose(dev); 1347 i915_gem_lastclose(dev);
1336 } 1348 }
1337 1349
1350 pci_dev_put(dev_priv->bridge_dev);
1338 kfree(dev->dev_private); 1351 kfree(dev->dev_private);
1339 1352
1340 return 0; 1353 return 0;