diff options
author | Dave Airlie <airlied@redhat.com> | 2009-08-03 21:43:41 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2009-09-07 21:45:15 -0400 |
commit | ec2a4c3fdc8e82fe82a25d800e85c1ea06b74372 (patch) | |
tree | b49f3ebe3e356fa8d17f15e9a5421851cb90024b /drivers/gpu/drm/i915/i915_dma.c | |
parent | f1938cd6e900a85de64184e46d841efc9efd3484 (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.c | 33 |
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 | ||
901 | static 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, | |||
911 | static int i915_probe_agp(struct drm_device *dev, uint32_t *aperture_size, | 923 | static 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); |
1293 | out_rmmap: | 1303 | out_rmmap: |
1294 | iounmap(dev_priv->regs); | 1304 | iounmap(dev_priv->regs); |
1305 | put_bridge: | ||
1306 | pci_dev_put(dev_priv->bridge_dev); | ||
1295 | free_priv: | 1307 | free_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; |