xref: /aosp_15_r20/external/mesa3d/src/freedreno/decode/rdutil.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright © 2022 Igalia S.L.
3*61046927SAndroid Build Coastguard Worker  * SPDX-License-Identifier: MIT
4*61046927SAndroid Build Coastguard Worker  */
5*61046927SAndroid Build Coastguard Worker 
6*61046927SAndroid Build Coastguard Worker #include <stdint.h>
7*61046927SAndroid Build Coastguard Worker #include <stdio.h>
8*61046927SAndroid Build Coastguard Worker #include <string.h>
9*61046927SAndroid Build Coastguard Worker 
10*61046927SAndroid Build Coastguard Worker #include "io.h"
11*61046927SAndroid Build Coastguard Worker #include "redump.h"
12*61046927SAndroid Build Coastguard Worker 
13*61046927SAndroid Build Coastguard Worker static void
parse_addr(uint32_t * buf,int sz,unsigned int * len,uint64_t * gpuaddr)14*61046927SAndroid Build Coastguard Worker parse_addr(uint32_t *buf, int sz, unsigned int *len, uint64_t *gpuaddr)
15*61046927SAndroid Build Coastguard Worker {
16*61046927SAndroid Build Coastguard Worker    *gpuaddr = buf[0];
17*61046927SAndroid Build Coastguard Worker    *len = buf[1];
18*61046927SAndroid Build Coastguard Worker    if (sz > 8)
19*61046927SAndroid Build Coastguard Worker       *gpuaddr |= ((uint64_t)(buf[2])) << 32;
20*61046927SAndroid Build Coastguard Worker }
21*61046927SAndroid Build Coastguard Worker 
22*61046927SAndroid Build Coastguard Worker static uint32_t
parse_gpu_id(void * buf)23*61046927SAndroid Build Coastguard Worker parse_gpu_id(void *buf)
24*61046927SAndroid Build Coastguard Worker {
25*61046927SAndroid Build Coastguard Worker    return *((unsigned int *)buf);
26*61046927SAndroid Build Coastguard Worker }
27*61046927SAndroid Build Coastguard Worker 
28*61046927SAndroid Build Coastguard Worker static uint64_t
parse_chip_id(void * buf)29*61046927SAndroid Build Coastguard Worker parse_chip_id(void *buf)
30*61046927SAndroid Build Coastguard Worker {
31*61046927SAndroid Build Coastguard Worker    return *((uint64_t *)buf);
32*61046927SAndroid Build Coastguard Worker }
33*61046927SAndroid Build Coastguard Worker 
34*61046927SAndroid Build Coastguard Worker struct rd_parsed_section
35*61046927SAndroid Build Coastguard Worker {
36*61046927SAndroid Build Coastguard Worker    void *buf;
37*61046927SAndroid Build Coastguard Worker    enum rd_sect_type type;
38*61046927SAndroid Build Coastguard Worker    int sz;
39*61046927SAndroid Build Coastguard Worker    int ret;
40*61046927SAndroid Build Coastguard Worker };
41*61046927SAndroid Build Coastguard Worker 
42*61046927SAndroid Build Coastguard Worker static bool
parse_rd_section(struct io * io,struct rd_parsed_section * section)43*61046927SAndroid Build Coastguard Worker parse_rd_section(struct io *io, struct rd_parsed_section *section)
44*61046927SAndroid Build Coastguard Worker {
45*61046927SAndroid Build Coastguard Worker    uint32_t arr[2];
46*61046927SAndroid Build Coastguard Worker    int ret;
47*61046927SAndroid Build Coastguard Worker 
48*61046927SAndroid Build Coastguard Worker    ret = io_readn(io, arr, 8);
49*61046927SAndroid Build Coastguard Worker    if (ret <= 0)
50*61046927SAndroid Build Coastguard Worker       goto end;
51*61046927SAndroid Build Coastguard Worker 
52*61046927SAndroid Build Coastguard Worker    while ((arr[0] == 0xffffffff) && (arr[1] == 0xffffffff)) {
53*61046927SAndroid Build Coastguard Worker       ret = io_readn(io, arr, 8);
54*61046927SAndroid Build Coastguard Worker       if (ret <= 0)
55*61046927SAndroid Build Coastguard Worker          goto end;
56*61046927SAndroid Build Coastguard Worker    }
57*61046927SAndroid Build Coastguard Worker 
58*61046927SAndroid Build Coastguard Worker    section->type = arr[0];
59*61046927SAndroid Build Coastguard Worker    section->sz = arr[1];
60*61046927SAndroid Build Coastguard Worker 
61*61046927SAndroid Build Coastguard Worker    if (section->sz < 0) {
62*61046927SAndroid Build Coastguard Worker       ret = -1;
63*61046927SAndroid Build Coastguard Worker       goto end;
64*61046927SAndroid Build Coastguard Worker    }
65*61046927SAndroid Build Coastguard Worker 
66*61046927SAndroid Build Coastguard Worker    free(section->buf);
67*61046927SAndroid Build Coastguard Worker 
68*61046927SAndroid Build Coastguard Worker    section->buf = malloc(section->sz + 1);
69*61046927SAndroid Build Coastguard Worker    ((char *)section->buf)[section->sz] = '\0';
70*61046927SAndroid Build Coastguard Worker    ret = io_readn(io, section->buf, section->sz);
71*61046927SAndroid Build Coastguard Worker    if (ret < 0)
72*61046927SAndroid Build Coastguard Worker       goto end;
73*61046927SAndroid Build Coastguard Worker 
74*61046927SAndroid Build Coastguard Worker    section->ret = ret;
75*61046927SAndroid Build Coastguard Worker    return true;
76*61046927SAndroid Build Coastguard Worker 
77*61046927SAndroid Build Coastguard Worker end:
78*61046927SAndroid Build Coastguard Worker    section->ret = ret;
79*61046927SAndroid Build Coastguard Worker    return false;
80*61046927SAndroid Build Coastguard Worker }
81