Skip to content

Commit 72655fb

Browse files
author
Steven Price
committed
drm/panfrost: replace endian-specific types with native ones
__le32 and __le64 types aren't portable and are not available on FreeBSD (which uses the same uAPI). Instead of attempting to always output little endian, just use native endianness in the dumps. Tools can detect the endianness in use by looking at the 'magic' field, but equally we don't expect big-endian to be used with Mali (there are no known implementations out there). Bug: https://gitlab.freedesktop.org/mesa/mesa/-/issues/7252 Fixes: 730c2bf ("drm/panfrost: Add support for devcoredump") Reviewed-by: Alyssa Rosenzweig <[email protected]> Signed-off-by: Steven Price <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
1 parent 7228d9d commit 72655fb

File tree

2 files changed

+38
-34
lines changed

2 files changed

+38
-34
lines changed

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

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 {
245249
struct {
246-
__le64 jc;
247-
__le32 gpu_id;
248-
__le32 major;
249-
__le32 minor;
250-
__le64 nbos;
250+
__u64 jc;
251+
__u32 gpu_id;
252+
__u32 major;
253+
__u32 minor;
254+
__u64 nbos;
251255
} reghdr;
252256

253-
struct {
254-
__le32 valid;
255-
__le64 iova;
256-
__le32 data[2];
257+
struct pan_bomap_hdr {
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)