Skip to content

Commit aa31461

Browse files
icklejnikula
authored andcommitted
drm/i915: Wean off drm_pci_alloc/drm_pci_free
drm_pci_alloc and drm_pci_free are just very thin wrappers around dma_alloc_coherent, with a note that we should be removing them. Furthermore since commit de09d31 Author: Kirill A. Shutemov <[email protected]> Date: Fri Jan 15 16:51:42 2016 -0800 page-flags: define PG_reserved behavior on compound pages As far as I can see there's no users of PG_reserved on compound pages. Let's use PF_NO_COMPOUND here. drm_pci_alloc has been declared broken since it mixes GFP_COMP and SetPageReserved. Avoid this conflict by weaning ourselves off using the abstraction and using the dma functions directly. Reported-by: Taketo Kabe Closes: https://gitlab.freedesktop.org/drm/intel/issues/1027 Fixes: de09d31 ("page-flags: define PG_reserved behavior on compound pages") Signed-off-by: Chris Wilson <[email protected]> Cc: <[email protected]> # v4.5+ Reviewed-by: Daniel Vetter <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected] (cherry picked from commit c6790dc) Signed-off-by: Jani Nikula <[email protected]>
1 parent 19b5f3b commit aa31461

File tree

4 files changed

+55
-56
lines changed

4 files changed

+55
-56
lines changed

drivers/gpu/drm/i915/display/intel_display.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11087,7 +11087,7 @@ static u32 intel_cursor_base(const struct intel_plane_state *plane_state)
1108711087
u32 base;
1108811088

1108911089
if (INTEL_INFO(dev_priv)->display.cursor_needs_physical)
11090-
base = obj->phys_handle->busaddr;
11090+
base = sg_dma_address(obj->mm.pages->sgl);
1109111091
else
1109211092
base = intel_plane_ggtt_offset(plane_state);
1109311093

drivers/gpu/drm/i915/gem/i915_gem_object_types.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -285,9 +285,6 @@ struct drm_i915_gem_object {
285285

286286
void *gvt_info;
287287
};
288-
289-
/** for phys allocated objects */
290-
struct drm_dma_handle *phys_handle;
291288
};
292289

293290
static inline struct drm_i915_gem_object *

drivers/gpu/drm/i915/gem/i915_gem_phys.c

Lines changed: 50 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -22,88 +22,87 @@
2222
static int i915_gem_object_get_pages_phys(struct drm_i915_gem_object *obj)
2323
{
2424
struct address_space *mapping = obj->base.filp->f_mapping;
25-
struct drm_dma_handle *phys;
26-
struct sg_table *st;
2725
struct scatterlist *sg;
28-
char *vaddr;
26+
struct sg_table *st;
27+
dma_addr_t dma;
28+
void *vaddr;
29+
void *dst;
2930
int i;
30-
int err;
3131

3232
if (WARN_ON(i915_gem_object_needs_bit17_swizzle(obj)))
3333
return -EINVAL;
3434

35-
/* Always aligning to the object size, allows a single allocation
35+
/*
36+
* Always aligning to the object size, allows a single allocation
3637
* to handle all possible callers, and given typical object sizes,
3738
* the alignment of the buddy allocation will naturally match.
3839
*/
39-
phys = drm_pci_alloc(obj->base.dev,
40-
roundup_pow_of_two(obj->base.size),
41-
roundup_pow_of_two(obj->base.size));
42-
if (!phys)
40+
vaddr = dma_alloc_coherent(&obj->base.dev->pdev->dev,
41+
roundup_pow_of_two(obj->base.size),
42+
&dma, GFP_KERNEL);
43+
if (!vaddr)
4344
return -ENOMEM;
4445

45-
vaddr = phys->vaddr;
46+
st = kmalloc(sizeof(*st), GFP_KERNEL);
47+
if (!st)
48+
goto err_pci;
49+
50+
if (sg_alloc_table(st, 1, GFP_KERNEL))
51+
goto err_st;
52+
53+
sg = st->sgl;
54+
sg->offset = 0;
55+
sg->length = obj->base.size;
56+
57+
sg_assign_page(sg, (struct page *)vaddr);
58+
sg_dma_address(sg) = dma;
59+
sg_dma_len(sg) = obj->base.size;
60+
61+
dst = vaddr;
4662
for (i = 0; i < obj->base.size / PAGE_SIZE; i++) {
4763
struct page *page;
48-
char *src;
64+
void *src;
4965

5066
page = shmem_read_mapping_page(mapping, i);
51-
if (IS_ERR(page)) {
52-
err = PTR_ERR(page);
53-
goto err_phys;
54-
}
67+
if (IS_ERR(page))
68+
goto err_st;
5569

5670
src = kmap_atomic(page);
57-
memcpy(vaddr, src, PAGE_SIZE);
58-
drm_clflush_virt_range(vaddr, PAGE_SIZE);
71+
memcpy(dst, src, PAGE_SIZE);
72+
drm_clflush_virt_range(dst, PAGE_SIZE);
5973
kunmap_atomic(src);
6074

6175
put_page(page);
62-
vaddr += PAGE_SIZE;
76+
dst += PAGE_SIZE;
6377
}
6478

6579
intel_gt_chipset_flush(&to_i915(obj->base.dev)->gt);
6680

67-
st = kmalloc(sizeof(*st), GFP_KERNEL);
68-
if (!st) {
69-
err = -ENOMEM;
70-
goto err_phys;
71-
}
72-
73-
if (sg_alloc_table(st, 1, GFP_KERNEL)) {
74-
kfree(st);
75-
err = -ENOMEM;
76-
goto err_phys;
77-
}
78-
79-
sg = st->sgl;
80-
sg->offset = 0;
81-
sg->length = obj->base.size;
82-
83-
sg_dma_address(sg) = phys->busaddr;
84-
sg_dma_len(sg) = obj->base.size;
85-
86-
obj->phys_handle = phys;
87-
8881
__i915_gem_object_set_pages(obj, st, sg->length);
8982

9083
return 0;
9184

92-
err_phys:
93-
drm_pci_free(obj->base.dev, phys);
94-
95-
return err;
85+
err_st:
86+
kfree(st);
87+
err_pci:
88+
dma_free_coherent(&obj->base.dev->pdev->dev,
89+
roundup_pow_of_two(obj->base.size),
90+
vaddr, dma);
91+
return -ENOMEM;
9692
}
9793

9894
static void
9995
i915_gem_object_put_pages_phys(struct drm_i915_gem_object *obj,
10096
struct sg_table *pages)
10197
{
98+
dma_addr_t dma = sg_dma_address(pages->sgl);
99+
void *vaddr = sg_page(pages->sgl);
100+
102101
__i915_gem_object_release_shmem(obj, pages, false);
103102

104103
if (obj->mm.dirty) {
105104
struct address_space *mapping = obj->base.filp->f_mapping;
106-
char *vaddr = obj->phys_handle->vaddr;
105+
void *src = vaddr;
107106
int i;
108107

109108
for (i = 0; i < obj->base.size / PAGE_SIZE; i++) {
@@ -115,23 +114,26 @@ i915_gem_object_put_pages_phys(struct drm_i915_gem_object *obj,
115114
continue;
116115

117116
dst = kmap_atomic(page);
118-
drm_clflush_virt_range(vaddr, PAGE_SIZE);
119-
memcpy(dst, vaddr, PAGE_SIZE);
117+
drm_clflush_virt_range(src, PAGE_SIZE);
118+
memcpy(dst, src, PAGE_SIZE);
120119
kunmap_atomic(dst);
121120

122121
set_page_dirty(page);
123122
if (obj->mm.madv == I915_MADV_WILLNEED)
124123
mark_page_accessed(page);
125124
put_page(page);
126-
vaddr += PAGE_SIZE;
125+
126+
src += PAGE_SIZE;
127127
}
128128
obj->mm.dirty = false;
129129
}
130130

131131
sg_free_table(pages);
132132
kfree(pages);
133133

134-
drm_pci_free(obj->base.dev, obj->phys_handle);
134+
dma_free_coherent(&obj->base.dev->pdev->dev,
135+
roundup_pow_of_two(obj->base.size),
136+
vaddr, dma);
135137
}
136138

137139
static void phys_release(struct drm_i915_gem_object *obj)

drivers/gpu/drm/i915/i915_gem.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ i915_gem_phys_pwrite(struct drm_i915_gem_object *obj,
180180
struct drm_i915_gem_pwrite *args,
181181
struct drm_file *file)
182182
{
183-
void *vaddr = obj->phys_handle->vaddr + args->offset;
183+
void *vaddr = sg_page(obj->mm.pages->sgl) + args->offset;
184184
char __user *user_data = u64_to_user_ptr(args->data_ptr);
185185

186186
/*
@@ -844,10 +844,10 @@ i915_gem_pwrite_ioctl(struct drm_device *dev, void *data,
844844
ret = i915_gem_gtt_pwrite_fast(obj, args);
845845

846846
if (ret == -EFAULT || ret == -ENOSPC) {
847-
if (obj->phys_handle)
848-
ret = i915_gem_phys_pwrite(obj, args, file);
849-
else
847+
if (i915_gem_object_has_struct_page(obj))
850848
ret = i915_gem_shmem_pwrite(obj, args);
849+
else
850+
ret = i915_gem_phys_pwrite(obj, args, file);
851851
}
852852

853853
i915_gem_object_unpin_pages(obj);

0 commit comments

Comments
 (0)