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