Initial commit
[chai.git] / README.md
1 # chai
2
3 Notes on T
4
5 ## Normal operation
6
7     [ GPU ] -- [ Linux ] -- [ Shim ] -- [ Blob ]
8
9 The GPU is in hardware.
10
11 The shim is a kernel module. Therefore, it is licensed under the GPL. It
12 handles low-level communication with the GPU. It deals with registers
13 and memory. It has platform specific code. It has a generic memory
14 allocator and a job scheduler. It exposes a userspace interface.
15
16 Finally, there is a userspace library. This blob is proprietary and
17 licensed by ARM. There are various versions. For example, a similar blob
18 is published by Rockchip. These blobs implement the GPU protocol. They
19 expose standard interfaces like OpenGL ES.
20
21 ## Free operation (shim)
22
23     [ GPU ] -- [ Linux ] -- [ Shim ] -- [ Driver ]
24
25 The flow is identical as with the blob. The free shim published by ARM
26 is reused. This flow avoids duplication of effort. It might simplify
27 development.
28
29 However, it is unnatural for free drivers. It is slower than necessary
30 due to context switching. There is not a technical reason for this
31 performance cost. Rather it was to skirt the GPL and minimise maintenace
32 costs. chai drivers should be native.
33
34 ## Legal concerns
35
36 The shim is free. It can be modified as needed for chai. But the blob is
37 not. Its license bans reverse engineering.
38
39 No code from the blob is used in chai. To avoid risk, the blob is not
40 disassembled. Presently, it is not used at all.
41
42 We hope the blob is not needed for reverse-engeering. Maybe fuzzing
43 techniques could be used. The shim has access to the GPU memory. Trace
44 video memory between commands. Diff the buffers. Also trace and diff
45 registers. Run this in a loop with synthesised commands. Aggregate the
46 data for reverse engineering. Basic information about the protocol can
47 be deduced. The same idea may apply to the instruction set, but that is
48 farther out.
49
50 If necessary, communications between the shim and the blob can be
51 observed. Stubs can be added into the shim function `kbase_ioctl`. That
52 function is likely called for each message. Trace `msg` and `arg` before
53 and after calling `kbase_dispatch` for logs. They can be decoded with
54 the structures in `mali_kbase_uku.h`. If this is needed, legal risk can
55 be evaluated later.