Skip to content

Commit cbc543c

Browse files
committed
Merge tag 'drm-misc-fixes-2022-10-20' of git://anongit.freedesktop.org/drm/drm-misc into drm-fixes
drm-misc-fixes for v6.1-rc2: - Fix a buffer overflow in format_helper_test. - Set DDC pointer in drmm_connector_init. - Compiler fixes for panfrost. Signed-off-by: Dave Airlie <[email protected]> From: Maarten Lankhorst <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
2 parents a4294d5 + 72655fb commit cbc543c

File tree

7 files changed

+59
-38
lines changed

7 files changed

+59
-38
lines changed

drivers/gpu/drm/amd/amdgpu/amdgpu_vm_sdma.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,8 +116,15 @@ static int amdgpu_vm_sdma_commit(struct amdgpu_vm_update_params *p,
116116
DMA_RESV_USAGE_BOOKKEEP);
117117
}
118118

119-
if (fence && !p->immediate)
119+
if (fence && !p->immediate) {
120+
/*
121+
* Most hw generations now have a separate queue for page table
122+
* updates, but when the queue is shared with userspace we need
123+
* the extra CPU round trip to correctly flush the TLB.
124+
*/
125+
set_bit(DRM_SCHED_FENCE_DONT_PIPELINE, &f->flags);
120126
swap(*fence, f);
127+
}
121128
dma_fence_put(f);
122129
return 0;
123130

drivers/gpu/drm/drm_connector.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -435,7 +435,7 @@ int drmm_connector_init(struct drm_device *dev,
435435
if (drm_WARN_ON(dev, funcs && funcs->destroy))
436436
return -EINVAL;
437437

438-
ret = __drm_connector_init(dev, connector, funcs, connector_type, NULL);
438+
ret = __drm_connector_init(dev, connector, funcs, connector_type, ddc);
439439
if (ret)
440440
return ret;
441441

drivers/gpu/drm/panfrost/panfrost_dump.c

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -63,13 +63,13 @@ static void panfrost_core_dump_header(struct panfrost_dump_iterator *iter,
6363
{
6464
struct panfrost_dump_object_header *hdr = iter->hdr;
6565

66-
hdr->magic = cpu_to_le32(PANFROSTDUMP_MAGIC);
67-
hdr->type = cpu_to_le32(type);
68-
hdr->file_offset = cpu_to_le32(iter->data - iter->start);
69-
hdr->file_size = cpu_to_le32(data_end - iter->data);
66+
hdr->magic = PANFROSTDUMP_MAGIC;
67+
hdr->type = type;
68+
hdr->file_offset = iter->data - iter->start;
69+
hdr->file_size = data_end - iter->data;
7070

7171
iter->hdr++;
72-
iter->data += le32_to_cpu(hdr->file_size);
72+
iter->data += hdr->file_size;
7373
}
7474

7575
static void
@@ -93,8 +93,8 @@ panfrost_core_dump_registers(struct panfrost_dump_iterator *iter,
9393

9494
reg = panfrost_dump_registers[i] + js_as_offset;
9595

96-
dumpreg->reg = cpu_to_le32(reg);
97-
dumpreg->value = cpu_to_le32(gpu_read(pfdev, reg));
96+
dumpreg->reg = reg;
97+
dumpreg->value = gpu_read(pfdev, reg);
9898
}
9999

100100
panfrost_core_dump_header(iter, PANFROSTDUMP_BUF_REG, dumpreg);
@@ -106,7 +106,7 @@ void panfrost_core_dump(struct panfrost_job *job)
106106
struct panfrost_dump_iterator iter;
107107
struct drm_gem_object *dbo;
108108
unsigned int n_obj, n_bomap_pages;
109-
__le64 *bomap, *bomap_start;
109+
u64 *bomap, *bomap_start;
110110
size_t file_size;
111111
u32 as_nr;
112112
int slot;
@@ -177,11 +177,11 @@ void panfrost_core_dump(struct panfrost_job *job)
177177
* For now, we write the job identifier in the register dump header,
178178
* so that we can decode the entire dump later with pandecode
179179
*/
180-
iter.hdr->reghdr.jc = cpu_to_le64(job->jc);
181-
iter.hdr->reghdr.major = cpu_to_le32(PANFROSTDUMP_MAJOR);
182-
iter.hdr->reghdr.minor = cpu_to_le32(PANFROSTDUMP_MINOR);
183-
iter.hdr->reghdr.gpu_id = cpu_to_le32(pfdev->features.id);
184-
iter.hdr->reghdr.nbos = cpu_to_le64(job->bo_count);
180+
iter.hdr->reghdr.jc = job->jc;
181+
iter.hdr->reghdr.major = PANFROSTDUMP_MAJOR;
182+
iter.hdr->reghdr.minor = PANFROSTDUMP_MINOR;
183+
iter.hdr->reghdr.gpu_id = pfdev->features.id;
184+
iter.hdr->reghdr.nbos = job->bo_count;
185185

186186
panfrost_core_dump_registers(&iter, pfdev, as_nr, slot);
187187

@@ -218,27 +218,27 @@ void panfrost_core_dump(struct panfrost_job *job)
218218

219219
WARN_ON(!mapping->active);
220220

221-
iter.hdr->bomap.data[0] = cpu_to_le32((bomap - bomap_start));
221+
iter.hdr->bomap.data[0] = bomap - bomap_start;
222222

223223
for_each_sgtable_page(bo->base.sgt, &page_iter, 0) {
224224
struct page *page = sg_page_iter_page(&page_iter);
225225

226226
if (!IS_ERR(page)) {
227-
*bomap++ = cpu_to_le64(page_to_phys(page));
227+
*bomap++ = page_to_phys(page);
228228
} else {
229229
dev_err(pfdev->dev, "Panfrost Dump: wrong page\n");
230-
*bomap++ = ~cpu_to_le64(0);
230+
*bomap++ = 0;
231231
}
232232
}
233233

234-
iter.hdr->bomap.iova = cpu_to_le64(mapping->mmnode.start << PAGE_SHIFT);
234+
iter.hdr->bomap.iova = mapping->mmnode.start << PAGE_SHIFT;
235235

236236
vaddr = map.vaddr;
237237
memcpy(iter.data, vaddr, bo->base.base.size);
238238

239239
drm_gem_shmem_vunmap(&bo->base, &map);
240240

241-
iter.hdr->bomap.valid = cpu_to_le32(1);
241+
iter.hdr->bomap.valid = 1;
242242

243243
dump_header: panfrost_core_dump_header(&iter, PANFROSTDUMP_BUF_BO, iter.data +
244244
bo->base.base.size);

drivers/gpu/drm/scheduler/sched_entity.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -385,7 +385,8 @@ static bool drm_sched_entity_add_dependency_cb(struct drm_sched_entity *entity)
385385
}
386386

387387
s_fence = to_drm_sched_fence(fence);
388-
if (s_fence && s_fence->sched == sched) {
388+
if (s_fence && s_fence->sched == sched &&
389+
!test_bit(DRM_SCHED_FENCE_DONT_PIPELINE, &fence->flags)) {
389390

390391
/*
391392
* Fence is from the same scheduler, only need to wait for

drivers/gpu/drm/tests/drm_format_helper_test.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -438,7 +438,7 @@ static void drm_test_fb_xrgb8888_to_xrgb2101010(struct kunit *test)
438438
iosys_map_set_vaddr(&src, xrgb8888);
439439

440440
drm_fb_xrgb8888_to_xrgb2101010(&dst, &result->dst_pitch, &src, &fb, &params->clip);
441-
buf = le32buf_to_cpu(test, buf, TEST_BUF_SIZE);
441+
buf = le32buf_to_cpu(test, buf, dst_size / sizeof(u32));
442442
KUNIT_EXPECT_EQ(test, memcmp(buf, result->expected, dst_size), 0);
443443
}
444444

include/drm/gpu_scheduler.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,15 @@
3232

3333
#define MAX_WAIT_SCHED_ENTITY_Q_EMPTY msecs_to_jiffies(1000)
3434

35+
/**
36+
* DRM_SCHED_FENCE_DONT_PIPELINE - Prefent dependency pipelining
37+
*
38+
* Setting this flag on a scheduler fence prevents pipelining of jobs depending
39+
* on this fence. In other words we always insert a full CPU round trip before
40+
* dependen jobs are pushed to the hw queue.
41+
*/
42+
#define DRM_SCHED_FENCE_DONT_PIPELINE DMA_FENCE_FLAG_USER_BITS
43+
3544
struct drm_gem_object;
3645

3746
struct drm_gpu_scheduler;

include/uapi/drm/panfrost_drm.h

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -235,40 +235,44 @@ struct drm_panfrost_madvise {
235235
#define PANFROSTDUMP_BUF_BO (PANFROSTDUMP_BUF_BOMAP + 1)
236236
#define PANFROSTDUMP_BUF_TRAILER (PANFROSTDUMP_BUF_BO + 1)
237237

238+
/*
239+
* This structure is the native endianness of the dumping machine, tools can
240+
* detect the endianness by looking at the value in 'magic'.
241+
*/
238242
struct panfrost_dump_object_header {
239-
__le32 magic;
240-
__le32 type;
241-
__le32 file_size;
242-
__le32 file_offset;
243+
__u32 magic;
244+
__u32 type;
245+
__u32 file_size;
246+
__u32 file_offset;
243247

244248
union {
245-
struct pan_reg_hdr {
246-
__le64 jc;
247-
__le32 gpu_id;
248-
__le32 major;
249-
__le32 minor;
250-
__le64 nbos;
249+
struct {
250+
__u64 jc;
251+
__u32 gpu_id;
252+
__u32 major;
253+
__u32 minor;
254+
__u64 nbos;
251255
} reghdr;
252256

253257
struct pan_bomap_hdr {
254-
__le32 valid;
255-
__le64 iova;
256-
__le32 data[2];
258+
__u32 valid;
259+
__u64 iova;
260+
__u32 data[2];
257261
} bomap;
258262

259263
/*
260264
* Force same size in case we want to expand the header
261265
* with new fields and also keep it 512-byte aligned
262266
*/
263267

264-
__le32 sizer[496];
268+
__u32 sizer[496];
265269
};
266270
};
267271

268272
/* Registers object, an array of these */
269273
struct panfrost_dump_registers {
270-
__le32 reg;
271-
__le32 value;
274+
__u32 reg;
275+
__u32 value;
272276
};
273277

274278
#if defined(__cplusplus)

0 commit comments

Comments
 (0)