Skip to content

Commit fca3ec0

Browse files
ickleairlied
authored andcommitted
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 <[email protected]> Cc: Eric Anholt <[email protected]> Signed-off-by: Dave Airlie <[email protected]>
1 parent 430f70d commit fca3ec0

File tree

4 files changed

+22
-16
lines changed

4 files changed

+22
-16
lines changed

drivers/gpu/drm/i915/i915_gem.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -496,10 +496,10 @@ fast_user_write(struct io_mapping *mapping,
496496
char *vaddr_atomic;
497497
unsigned long unwritten;
498498

499-
vaddr_atomic = io_mapping_map_atomic_wc(mapping, page_base);
499+
vaddr_atomic = io_mapping_map_atomic_wc(mapping, page_base, KM_USER0);
500500
unwritten = __copy_from_user_inatomic_nocache(vaddr_atomic + page_offset,
501501
user_data, length);
502-
io_mapping_unmap_atomic(vaddr_atomic);
502+
io_mapping_unmap_atomic(vaddr_atomic, KM_USER0);
503503
if (unwritten)
504504
return -EFAULT;
505505
return 0;
@@ -3487,7 +3487,8 @@ i915_gem_object_pin_and_relocate(struct drm_gem_object *obj,
34873487
reloc_offset = obj_priv->gtt_offset + reloc->offset;
34883488
reloc_page = io_mapping_map_atomic_wc(dev_priv->mm.gtt_mapping,
34893489
(reloc_offset &
3490-
~(PAGE_SIZE - 1)));
3490+
~(PAGE_SIZE - 1)),
3491+
KM_USER0);
34913492
reloc_entry = (uint32_t __iomem *)(reloc_page +
34923493
(reloc_offset & (PAGE_SIZE - 1)));
34933494
reloc_val = target_obj_priv->gtt_offset + reloc->delta;
@@ -3498,7 +3499,7 @@ i915_gem_object_pin_and_relocate(struct drm_gem_object *obj,
34983499
readl(reloc_entry), reloc_val);
34993500
#endif
35003501
writel(reloc_val, reloc_entry);
3501-
io_mapping_unmap_atomic(reloc_page);
3502+
io_mapping_unmap_atomic(reloc_page, KM_USER0);
35023503

35033504
/* The updated presumed offset for this entry will be
35043505
* copied back out to the user.

drivers/gpu/drm/i915/intel_overlay.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,8 @@ static struct overlay_registers *intel_overlay_map_regs_atomic(struct intel_over
185185

186186
if (OVERLAY_NONPHYSICAL(overlay->dev)) {
187187
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);
189190

190191
if (!regs) {
191192
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
200201
static void intel_overlay_unmap_regs_atomic(struct intel_overlay *overlay)
201202
{
202203
if (OVERLAY_NONPHYSICAL(overlay->dev))
203-
io_mapping_unmap_atomic(overlay->virt_addr);
204+
io_mapping_unmap_atomic(overlay->virt_addr, KM_USER0);
204205

205206
overlay->virt_addr = NULL;
206207

drivers/gpu/drm/nouveau/nouveau_bios.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2083,11 +2083,11 @@ peek_fb(struct drm_device *dev, struct io_mapping *fb,
20832083
uint32_t val = 0;
20842084

20852085
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);
20872087

20882088
val = ioread32(p);
20892089

2090-
io_mapping_unmap_atomic(p);
2090+
io_mapping_unmap_atomic(p, KM_USER0);
20912091
}
20922092

20932093
return val;
@@ -2098,12 +2098,12 @@ poke_fb(struct drm_device *dev, struct io_mapping *fb,
20982098
uint32_t off, uint32_t val)
20992099
{
21002100
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);
21022102

21032103
iowrite32(val, p);
21042104
wmb();
21052105

2106-
io_mapping_unmap_atomic(p);
2106+
io_mapping_unmap_atomic(p, KM_USER0);
21072107
}
21082108
}
21092109

include/linux/io-mapping.h

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -79,21 +79,23 @@ io_mapping_free(struct io_mapping *mapping)
7979

8080
/* Atomic map/unmap */
8181
static inline void *
82-
io_mapping_map_atomic_wc(struct io_mapping *mapping, unsigned long offset)
82+
io_mapping_map_atomic_wc(struct io_mapping *mapping,
83+
unsigned long offset,
84+
int slot)
8385
{
8486
resource_size_t phys_addr;
8587
unsigned long pfn;
8688

8789
BUG_ON(offset >= mapping->size);
8890
phys_addr = mapping->base + offset;
8991
pfn = (unsigned long) (phys_addr >> PAGE_SHIFT);
90-
return iomap_atomic_prot_pfn(pfn, KM_USER0, mapping->prot);
92+
return iomap_atomic_prot_pfn(pfn, slot, mapping->prot);
9193
}
9294

9395
static inline void
94-
io_mapping_unmap_atomic(void *vaddr)
96+
io_mapping_unmap_atomic(void *vaddr, int slot)
9597
{
96-
iounmap_atomic(vaddr, KM_USER0);
98+
iounmap_atomic(vaddr, slot);
9799
}
98100

99101
static inline void *
@@ -133,13 +135,15 @@ io_mapping_free(struct io_mapping *mapping)
133135

134136
/* Atomic map/unmap */
135137
static inline void *
136-
io_mapping_map_atomic_wc(struct io_mapping *mapping, unsigned long offset)
138+
io_mapping_map_atomic_wc(struct io_mapping *mapping,
139+
unsigned long offset,
140+
int slot)
137141
{
138142
return ((char *) mapping) + offset;
139143
}
140144

141145
static inline void
142-
io_mapping_unmap_atomic(void *vaddr)
146+
io_mapping_unmap_atomic(void *vaddr, int slot)
143147
{
144148
}
145149

0 commit comments

Comments
 (0)