xref: /rockchip-linux_mpp/doc/design/2.kernel_driver.txt (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
1*437bfbebSnyanmisakaHardware kernel driver design (2016.10.17)
2*437bfbebSnyanmisaka================================================================================
3*437bfbebSnyanmisaka
4*437bfbebSnyanmisakaRockchip has two sets of hardware kernel driver.
5*437bfbebSnyanmisaka
6*437bfbebSnyanmisakaThe first one is vcodec_service/vpu_service/mpp_service which is a high
7*437bfbebSnyanmisakaperformance stateless frame base hardware kernel driver. This driver supports
8*437bfbebSnyanmisakaall available codecs that hardware can provide. This driver is used on Android/
9*437bfbebSnyanmisakaLinux.
10*437bfbebSnyanmisaka
11*437bfbebSnyanmisakaHere is the vcodec_service kernel driver framework diagram.
12*437bfbebSnyanmisaka
13*437bfbebSnyanmisaka    +-------------+             +-------------+             +-------------+
14*437bfbebSnyanmisaka    |  client  A  |             |  client  B  |             |  client  C  |
15*437bfbebSnyanmisaka    +-------------+             +-------------+             +-------------+
16*437bfbebSnyanmisaka
17*437bfbebSnyanmisakauserspace
18*437bfbebSnyanmisaka+------------------------------------------------------------------------------+
19*437bfbebSnyanmisaka kernel
20*437bfbebSnyanmisaka
21*437bfbebSnyanmisaka    +-------------+             +-------------+             +-------------+
22*437bfbebSnyanmisaka    |  session A  |             |  session B  |             |  session C  |
23*437bfbebSnyanmisaka    +-------------+             +-------------+             +-------------+
24*437bfbebSnyanmisaka    |             |             |             |             |             |
25*437bfbebSnyanmisaka waiting         done        waiting         done        waiting         done
26*437bfbebSnyanmisaka    |             |             |             |             |             |
27*437bfbebSnyanmisaka+---+---+     +---+---+     +---+---+     +---+---+                   +---+---+
28*437bfbebSnyanmisaka| task3 |     | task0 |     | task1 |     | task0 |                   | task0 |
29*437bfbebSnyanmisaka+---+---+     +-------+     +-------+     +-------+                   +---+---+
30*437bfbebSnyanmisaka    |                                                                     |
31*437bfbebSnyanmisaka+---+---+                                                             +---+---+
32*437bfbebSnyanmisaka| task2 |                                                             | task1 |
33*437bfbebSnyanmisaka+-------+                                                             +-------+
34*437bfbebSnyanmisaka                                 +-----------+
35*437bfbebSnyanmisaka                                 |  service  |
36*437bfbebSnyanmisaka                       +---------+-----------+---------+
37*437bfbebSnyanmisaka                       |               |               |
38*437bfbebSnyanmisaka                    waiting         running          done
39*437bfbebSnyanmisaka                       |               |               |
40*437bfbebSnyanmisaka                 +-----+-----+   +-----+-----+   +-----+-----+
41*437bfbebSnyanmisaka                 |  task A2  |   |  task A1  |   |  task C0  |
42*437bfbebSnyanmisaka                 +-----+-----+   +-----------+   +-----+-----+
43*437bfbebSnyanmisaka                       |                               |
44*437bfbebSnyanmisaka                 +-----+-----+                   +-----+-----+
45*437bfbebSnyanmisaka                 |  task B1  |                   |  task C1  |
46*437bfbebSnyanmisaka                 +-----+-----+                   +-----+-----+
47*437bfbebSnyanmisaka                       |                               |
48*437bfbebSnyanmisaka                 +-----+-----+                   +-----+-----+
49*437bfbebSnyanmisaka                 |  task A3  |                   |  task A0  |
50*437bfbebSnyanmisaka                 +-----------+                   +-----+-----+
51*437bfbebSnyanmisaka                       |
52*437bfbebSnyanmisaka                 +-----+-----+
53*437bfbebSnyanmisaka                 |  task B0  |
54*437bfbebSnyanmisaka                 +-----------+
55*437bfbebSnyanmisaka
56*437bfbebSnyanmisakaThe principle of this design is to separate user task handling and hardware
57*437bfbebSnyanmisakaresource management and minimize the kernel serial process time between two
58*437bfbebSnyanmisakahardware process operation.
59*437bfbebSnyanmisaka
60*437bfbebSnyanmisakaThe driver uses session as communication channel. Each userspace client (client)
61*437bfbebSnyanmisakawill have a kernel session. Client will commit tasks to session. Then hardware
62*437bfbebSnyanmisakais managed by service (vpu_service/vcodec_service). Service will provide the
63*437bfbebSnyanmisakaability to process tasks in sessions.
64*437bfbebSnyanmisaka
65*437bfbebSnyanmisakaWhen client commits a task to kernel the task will be set to waiting status and
66*437bfbebSnyanmisakalink to both session waiting list and service waiting list. Then service will
67*437bfbebSnyanmisakaget task from waiting list to running list and run. When hardware finishs a task
68*437bfbebSnyanmisakathe task will be moved to done list and put to both service done list and
69*437bfbebSnyanmisakasession done list. Finally client will get the finished task from session.
70*437bfbebSnyanmisaka
71