diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2010-08-04 09:34:24 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2010-08-04 18:48:53 -0400 |
commit | fca3ec01e0b40cab82cac7745e154b01969e6219 (patch) | |
tree | 731d6cdc321c8c1f8b2c4e8f0fdb0df59b5abbc9 /drivers/gpu | |
parent | 430f70d59da643f1aa7c9cf3493423a76550b110 (diff) |
drm,io-mapping: Specify slot to use for atomic mappings
This is required should we ever attempt to use an io-mapping where
KM_USER0 is verboten, such as inside an IRQ context.
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Eric Anholt <eric@anholt.net>
Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers/gpu')
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem.c | 9 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_overlay.c | 5 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_bios.c | 8 |
3 files changed, 12 insertions, 10 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 4efd4fd3b340..2a4ed7ca8b4e 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
@@ -496,10 +496,10 @@ fast_user_write(struct io_mapping *mapping, | |||
496 | char *vaddr_atomic; | 496 | char *vaddr_atomic; |
497 | unsigned long unwritten; | 497 | unsigned long unwritten; |
498 | 498 | ||
499 | vaddr_atomic = io_mapping_map_atomic_wc(mapping, page_base); | 499 | vaddr_atomic = io_mapping_map_atomic_wc(mapping, page_base, KM_USER0); |
500 | unwritten = __copy_from_user_inatomic_nocache(vaddr_atomic + page_offset, | 500 | unwritten = __copy_from_user_inatomic_nocache(vaddr_atomic + page_offset, |
501 | user_data, length); | 501 | user_data, length); |
502 | io_mapping_unmap_atomic(vaddr_atomic); | 502 | io_mapping_unmap_atomic(vaddr_atomic, KM_USER0); |
503 | if (unwritten) | 503 | if (unwritten) |
504 | return -EFAULT; | 504 | return -EFAULT; |
505 | return 0; | 505 | return 0; |
@@ -3487,7 +3487,8 @@ i915_gem_object_pin_and_relocate(struct drm_gem_object *obj, | |||
3487 | reloc_offset = obj_priv->gtt_offset + reloc->offset; | 3487 | reloc_offset = obj_priv->gtt_offset + reloc->offset; |
3488 | reloc_page = io_mapping_map_atomic_wc(dev_priv->mm.gtt_mapping, | 3488 | reloc_page = io_mapping_map_atomic_wc(dev_priv->mm.gtt_mapping, |
3489 | (reloc_offset & | 3489 | (reloc_offset & |
3490 | ~(PAGE_SIZE - 1))); | 3490 | ~(PAGE_SIZE - 1)), |
3491 | KM_USER0); | ||
3491 | reloc_entry = (uint32_t __iomem *)(reloc_page + | 3492 | reloc_entry = (uint32_t __iomem *)(reloc_page + |
3492 | (reloc_offset & (PAGE_SIZE - 1))); | 3493 | (reloc_offset & (PAGE_SIZE - 1))); |
3493 | reloc_val = target_obj_priv->gtt_offset + reloc->delta; | 3494 | reloc_val = target_obj_priv->gtt_offset + reloc->delta; |
@@ -3498,7 +3499,7 @@ i915_gem_object_pin_and_relocate(struct drm_gem_object *obj, | |||
3498 | readl(reloc_entry), reloc_val); | 3499 | readl(reloc_entry), reloc_val); |
3499 | #endif | 3500 | #endif |
3500 | writel(reloc_val, reloc_entry); | 3501 | writel(reloc_val, reloc_entry); |
3501 | io_mapping_unmap_atomic(reloc_page); | 3502 | io_mapping_unmap_atomic(reloc_page, KM_USER0); |
3502 | 3503 | ||
3503 | /* The updated presumed offset for this entry will be | 3504 | /* The updated presumed offset for this entry will be |
3504 | * copied back out to the user. | 3505 | * copied back out to the user. |
diff --git a/drivers/gpu/drm/i915/intel_overlay.c b/drivers/gpu/drm/i915/intel_overlay.c index f26ec2f27d36..d39aea24eabe 100644 --- a/drivers/gpu/drm/i915/intel_overlay.c +++ b/drivers/gpu/drm/i915/intel_overlay.c | |||
@@ -185,7 +185,8 @@ static struct overlay_registers *intel_overlay_map_regs_atomic(struct intel_over | |||
185 | 185 | ||
186 | if (OVERLAY_NONPHYSICAL(overlay->dev)) { | 186 | if (OVERLAY_NONPHYSICAL(overlay->dev)) { |
187 | regs = io_mapping_map_atomic_wc(dev_priv->mm.gtt_mapping, | 187 | regs = io_mapping_map_atomic_wc(dev_priv->mm.gtt_mapping, |
188 | overlay->reg_bo->gtt_offset); | 188 | overlay->reg_bo->gtt_offset, |
189 | KM_USER0); | ||
189 | 190 | ||
190 | if (!regs) { | 191 | if (!regs) { |
191 | DRM_ERROR("failed to map overlay regs in GTT\n"); | 192 | DRM_ERROR("failed to map overlay regs in GTT\n"); |
@@ -200,7 +201,7 @@ static struct overlay_registers *intel_overlay_map_regs_atomic(struct intel_over | |||
200 | static void intel_overlay_unmap_regs_atomic(struct intel_overlay *overlay) | 201 | static void intel_overlay_unmap_regs_atomic(struct intel_overlay *overlay) |
201 | { | 202 | { |
202 | if (OVERLAY_NONPHYSICAL(overlay->dev)) | 203 | if (OVERLAY_NONPHYSICAL(overlay->dev)) |
203 | io_mapping_unmap_atomic(overlay->virt_addr); | 204 | io_mapping_unmap_atomic(overlay->virt_addr, KM_USER0); |
204 | 205 | ||
205 | overlay->virt_addr = NULL; | 206 | overlay->virt_addr = NULL; |
206 | 207 | ||
diff --git a/drivers/gpu/drm/nouveau/nouveau_bios.c b/drivers/gpu/drm/nouveau/nouveau_bios.c index b59f348f14fc..7369b5e73649 100644 --- a/drivers/gpu/drm/nouveau/nouveau_bios.c +++ b/drivers/gpu/drm/nouveau/nouveau_bios.c | |||
@@ -2083,11 +2083,11 @@ peek_fb(struct drm_device *dev, struct io_mapping *fb, | |||
2083 | uint32_t val = 0; | 2083 | uint32_t val = 0; |
2084 | 2084 | ||
2085 | if (off < pci_resource_len(dev->pdev, 1)) { | 2085 | if (off < pci_resource_len(dev->pdev, 1)) { |
2086 | uint32_t __iomem *p = io_mapping_map_atomic_wc(fb, off); | 2086 | uint32_t __iomem *p = io_mapping_map_atomic_wc(fb, off, KM_USER0); |
2087 | 2087 | ||
2088 | val = ioread32(p); | 2088 | val = ioread32(p); |
2089 | 2089 | ||
2090 | io_mapping_unmap_atomic(p); | 2090 | io_mapping_unmap_atomic(p, KM_USER0); |
2091 | } | 2091 | } |
2092 | 2092 | ||
2093 | return val; | 2093 | return val; |
@@ -2098,12 +2098,12 @@ poke_fb(struct drm_device *dev, struct io_mapping *fb, | |||
2098 | uint32_t off, uint32_t val) | 2098 | uint32_t off, uint32_t val) |
2099 | { | 2099 | { |
2100 | if (off < pci_resource_len(dev->pdev, 1)) { | 2100 | if (off < pci_resource_len(dev->pdev, 1)) { |
2101 | uint32_t __iomem *p = io_mapping_map_atomic_wc(fb, off); | 2101 | uint32_t __iomem *p = io_mapping_map_atomic_wc(fb, off, KM_USER0); |
2102 | 2102 | ||
2103 | iowrite32(val, p); | 2103 | iowrite32(val, p); |
2104 | wmb(); | 2104 | wmb(); |
2105 | 2105 | ||
2106 | io_mapping_unmap_atomic(p); | 2106 | io_mapping_unmap_atomic(p, KM_USER0); |
2107 | } | 2107 | } |
2108 | } | 2108 | } |
2109 | 2109 | ||