2 * Rockchip RK3288 VPU codec driver
4 * Copyright (c) 2014 Rockchip Electronics Co., Ltd.
5 * Hertz Wong <hertz.wong@rock-chips.com>
6 * Herman Chen <herman.chen@rock-chips.com>
8 * Copyright (C) 2014 Google, Inc.
9 * Tomasz Figa <tfiga@chromium.org>
11 * This software is licensed under the terms of the GNU General Public
12 * License version 2, as published by the Free Software Foundation, and
13 * may be copied, distributed, and modified under those terms.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
21 #include "rockchip_vpu_common.h"
23 #include <linux/types.h>
24 #include <linux/sort.h>
26 #include "rockchip_vpu_hw.h"
27 #include "rk3288_vpu_regs.h"
29 /* Max. number of DPB pictures supported by hardware. */
30 #define RK3288_VPU_H264_NUM_DPB 16
32 /* Size with u32 units. */
33 #define CABAC_INIT_BUFFER_SIZE (460 * 2)
34 #define POC_BUFFER_SIZE 34
35 #define SCALING_LIST_SIZE ((6 * 16 + 6 * 64) / 4)
37 /* Data structure describing auxilliary buffer format. */
38 struct rk3288_vpu_h264d_priv_tbl {
39 u32 cabac_table[CABAC_INIT_BUFFER_SIZE];
40 u32 poc[POC_BUFFER_SIZE];
41 u32 scaling_list[SCALING_LIST_SIZE];
44 /* Constant CABAC table. */
45 static const u32 h264_cabac_table[] = {
46 0x14f10236, 0x034a14f1, 0x0236034a, 0xe47fe968, 0xfa35ff36, 0x07330000,
47 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
48 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
49 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
50 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
51 0x0029003f, 0x003f003f, 0xf7530456, 0x0061f948, 0x0d29033e, 0x000b0137,
52 0x0045ef7f, 0xf3660052, 0xf94aeb6b, 0xe57fe17f, 0xe87fee5f, 0xe57feb72,
53 0xe27fef7b, 0xf473f07a, 0xf573f43f, 0xfe44f154, 0xf368fd46, 0xf85df65a,
54 0xe27fff4a, 0xfa61f95b, 0xec7ffc38, 0xfb52f94c, 0xea7df95d, 0xf557fd4d,
55 0xfb47fc3f, 0xfc44f454, 0xf93ef941, 0x083d0538, 0xfe420140, 0x003dfe4e,
56 0x01320734, 0x0a23002c, 0x0b26012d, 0x002e052c, 0x1f110133, 0x07321c13,
57 0x10210e3e, 0xf36cf164, 0xf365f35b, 0xf45ef658, 0xf054f656, 0xf953f357,
58 0xed5e0146, 0x0048fb4a, 0x123bf866, 0xf164005f, 0xfc4b0248, 0xf54bfd47,
59 0x0f2ef345, 0x003e0041, 0x1525f148, 0x09391036, 0x003e0c48, 0x18000f09,
60 0x08190d12, 0x0f090d13, 0x0a250c12, 0x061d1421, 0x0f1e042d, 0x013a003e,
61 0x073d0c26, 0x0b2d0f27, 0x0b2a0d2c, 0x102d0c29, 0x0a311e22, 0x122a0a37,
62 0x1133112e, 0x00591aed, 0x16ef1aef, 0x1ee71cec, 0x21e925e5, 0x21e928e4,
63 0x26ef21f5, 0x28f129fa, 0x26012911, 0x1efa1b03, 0x1a1625f0, 0x23fc26f8,
64 0x26fd2503, 0x26052a00, 0x23102716, 0x0e301b25, 0x153c0c44, 0x0261fd47,
65 0xfa2afb32, 0xfd36fe3e, 0x003a013f, 0xfe48ff4a, 0xf75bfb43, 0xfb1bfd27,
66 0xfe2c002e, 0xf040f844, 0xf64efa4d, 0xf656f45c, 0xf137f63c, 0xfa3efc41,
67 0xf449f84c, 0xf950f758, 0xef6ef561, 0xec54f54f, 0xfa49fc4a, 0xf356f360,
68 0xf561ed75, 0xf84efb21, 0xfc30fe35, 0xfd3ef347, 0xf64ff456, 0xf35af261,
69 0x0000fa5d, 0xfa54f84f, 0x0042ff47, 0x003efe3c, 0xfe3bfb4b, 0xfd3efc3a,
70 0xf742ff4f, 0x00470344, 0x0a2cf93e, 0x0f240e28, 0x101b0c1d, 0x012c1424,
71 0x1220052a, 0x01300a3e, 0x112e0940, 0xf468f561, 0xf060f958, 0xf855f955,
72 0xf755f358, 0x0442fd4d, 0xfd4cfa4c, 0x0a3aff4c, 0xff53f963, 0xf25f025f,
73 0x004cfb4a, 0x0046f54b, 0x01440041, 0xf249033e, 0x043eff44, 0xf34b0b37,
74 0x05400c46, 0x0f060613, 0x07100c0e, 0x120d0d0b, 0x0d0f0f10, 0x0c170d17,
75 0x0f140e1a, 0x0e2c1128, 0x112f1811, 0x15151916, 0x1f1b161d, 0x13230e32,
76 0x0a39073f, 0xfe4dfc52, 0xfd5e0945, 0xf46d24dd, 0x24de20e6, 0x25e22ce0,
77 0x22ee22f1, 0x28f121f9, 0x23fb2100, 0x2602210d, 0x17230d3a, 0x1dfd1a00,
78 0x161e1ff9, 0x23f122fd, 0x220324ff, 0x2205200b, 0x2305220c, 0x270b1e1d,
79 0x221a1d27, 0x13421f15, 0x1f1f1932, 0xef78ec70, 0xee72f555, 0xf15cf259,
80 0xe647f151, 0xf2500044, 0xf246e838, 0xe944e832, 0xf54a17f3, 0x1af328f1,
81 0x31f22c03, 0x2d062c22, 0x21361352, 0xfd4bff17, 0x0122012b, 0x0036fe37,
82 0x003d0140, 0x0044f75c, 0xf26af361, 0xf15af45a, 0xee58f649, 0xf74ff256,
83 0xf649f646, 0xf645fb42, 0xf740fb3a, 0x023b15f6, 0x18f51cf8, 0x1cff1d03,
84 0x1d092314, 0x1d240e43, 0x14f10236, 0x034a14f1, 0x0236034a, 0xe47fe968,
85 0xfa35ff36, 0x07331721, 0x17021500, 0x01090031, 0xdb760539, 0xf34ef541,
86 0x013e0c31, 0xfc491132, 0x1240092b, 0x1d001a43, 0x105a0968, 0xd27fec68,
87 0x0143f34e, 0xf541013e, 0xfa56ef5f, 0xfa3d092d, 0xfd45fa51, 0xf5600637,
88 0x0743fb56, 0x0258003a, 0xfd4cf65e, 0x05360445, 0xfd510058, 0xf943fb4a,
89 0xfc4afb50, 0xf948013a, 0x0029003f, 0x003f003f, 0xf7530456, 0x0061f948,
90 0x0d29033e, 0x002dfc4e, 0xfd60e57e, 0xe462e765, 0xe943e452, 0xec5ef053,
91 0xea6eeb5b, 0xee66f35d, 0xe37ff95c, 0xfb59f960, 0xf36cfd2e, 0xff41ff39,
92 0xf75dfd4a, 0xf75cf857, 0xe97e0536, 0x063c063b, 0x0645ff30, 0x0044fc45,
93 0xf858fe55, 0xfa4eff4b, 0xf94d0236, 0x0532fd44, 0x0132062a, 0xfc51013f,
94 0xfc460043, 0x0239fe4c, 0x0b230440, 0x013d0b23, 0x12190c18, 0x0d1d0d24,
95 0xf65df949, 0xfe490d2e, 0x0931f964, 0x09350235, 0x0535fe3d, 0x00380038,
96 0xf33ffb3c, 0xff3e0439, 0xfa450439, 0x0e270433, 0x0d440340, 0x013d093f,
97 0x07321027, 0x052c0434, 0x0b30fb3c, 0xff3b003b, 0x1621052c, 0x0e2bff4e,
98 0x003c0945, 0x0b1c0228, 0x032c0031, 0x002e022c, 0x0233002f, 0x0427023e,
99 0x062e0036, 0x0336023a, 0x043f0633, 0x06390735, 0x06340637, 0x0b2d0e24,
100 0x0835ff52, 0x0737fd4e, 0x0f2e161f, 0xff541907, 0x1ef91c03, 0x1c042000,
101 0x22ff1e06, 0x1e062009, 0x1f131a1b, 0x1a1e2514, 0x1c221146, 0x0143053b,
102 0x0943101e, 0x12201223, 0x161d181f, 0x1726122b, 0x14290b3f, 0x093b0940,
103 0xff5efe59, 0xf76cfa4c, 0xfe2c002d, 0x0034fd40, 0xfe3bfc46, 0xfc4bf852,
104 0xef66f74d, 0x0318002a, 0x00300037, 0xfa3bf947, 0xf453f557, 0xe277013a,
105 0xfd1dff24, 0x0126022b, 0xfa37003a, 0x0040fd4a, 0xf65a0046, 0xfc1d051f,
106 0x072a013b, 0xfe3afd48, 0xfd51f561, 0x003a0805, 0x0a0e0e12, 0x0d1b0228,
107 0x003afd46, 0xfa4ff855, 0x0000f36a, 0xf06af657, 0xeb72ee6e, 0xf262ea6e,
108 0xeb6aee67, 0xeb6be96c, 0xe670f660, 0xf45ffb5b, 0xf75dea5e, 0xfb560943,
109 0xfc50f655, 0xff46073c, 0x093a053d, 0x0c320f32, 0x12311136, 0x0a29072e,
110 0xff330731, 0x08340929, 0x062f0237, 0x0d290a2c, 0x06320535, 0x0d31043f,
111 0x0640fe45, 0xfe3b0646, 0x0a2c091f, 0x0c2b0335, 0x0e220a26, 0xfd340d28,
112 0x1120072c, 0x07260d32, 0x0a391a2b, 0x0e0b0b0e, 0x090b120b, 0x150917fe,
113 0x20f120f1, 0x22eb27e9, 0x2adf29e1, 0x2ee426f4, 0x151d2de8, 0x35d330e6,
114 0x41d52bed, 0x27f61e09, 0x121a141b, 0x0039f252, 0xfb4bed61, 0xdd7d1b00,
115 0x1c001ffc, 0x1b062208, 0x1e0a1816, 0x21131620, 0x1a1f1529, 0x1a2c172f,
116 0x10410e47, 0x083c063f, 0x11411518, 0x17141a17, 0x1b201c17, 0x1c181728,
117 0x18201c1d, 0x172a1339, 0x1635163d, 0x0b560c28, 0x0b330e3b, 0xfc4ff947,
118 0xfb45f746, 0xf842f644, 0xed49f445, 0xf046f143, 0xec3eed46, 0xf042ea41,
119 0xec3f09fe, 0x1af721f7, 0x27f929fe, 0x2d033109, 0x2d1b243b, 0xfa42f923,
120 0xf92af82d, 0xfb30f438, 0xfa3cfb3e, 0xf842f84c, 0xfb55fa51, 0xf64df951,
121 0xef50ee49, 0xfc4af653, 0xf747f743, 0xff3df842, 0xf242003b, 0x023b15f3,
122 0x21f227f9, 0x2efe3302, 0x3c063d11, 0x37222a3e, 0x14f10236, 0x034a14f1,
123 0x0236034a, 0xe47fe968, 0xfa35ff36, 0x07331619, 0x22001000, 0xfe090429,
124 0xe3760241, 0xfa47f34f, 0x05340932, 0xfd460a36, 0x1a221316, 0x28003902,
125 0x29241a45, 0xd37ff165, 0xfc4cfa47, 0xf34f0534, 0x0645f35a, 0x0034082b,
126 0xfe45fb52, 0xf660023b, 0x024bfd57, 0xfd640138, 0xfd4afa55, 0x003bfd51,
127 0xf956fb5f, 0xff42ff4d, 0x0146fe56, 0xfb48003d, 0x0029003f, 0x003f003f,
128 0xf7530456, 0x0061f948, 0x0d29033e, 0x0d0f0733, 0x0250d97f, 0xee5bef60,
129 0xe651dd62, 0xe866e961, 0xe577e863, 0xeb6eee66, 0xdc7f0050, 0xfb59f95e,
130 0xfc5c0027, 0x0041f154, 0xdd7ffe49, 0xf468f75b, 0xe17f0337, 0x07380737,
131 0x083dfd35, 0x0044f94a, 0xf758f367, 0xf35bf759, 0xf25cf84c, 0xf457e96e,
132 0xe869f64e, 0xec70ef63, 0xb27fba7f, 0xce7fd27f, 0xfc42fb4e, 0xfc47f848,
133 0x023bff37, 0xf946fa4b, 0xf859de77, 0xfd4b2014, 0x1e16d47f, 0x0036fb3d,
134 0x003aff3c, 0xfd3df843, 0xe754f24a, 0xfb410534, 0x0239003d, 0xf745f546,
135 0x1237fc47, 0x003a073d, 0x09291219, 0x0920052b, 0x092f002c, 0x0033022e,
136 0x1326fc42, 0x0f260c2a, 0x09220059, 0x042d0a1c, 0x0a1f21f5, 0x34d5120f,
137 0x1c0023ea, 0x26e72200, 0x27ee20f4, 0x66a20000, 0x38f121fc, 0x1d0a25fb,
138 0x33e327f7, 0x34de45c6, 0x43c12cfb, 0x200737e3, 0x20010000, 0x1b2421e7,
139 0x22e224e4, 0x26e426e5, 0x22ee23f0, 0x22f220f8, 0x25fa2300, 0x1e0a1c12,
140 0x1a191d29, 0x004b0248, 0x084d0e23, 0x121f1123, 0x151e112d, 0x142a122d,
141 0x1b1a1036, 0x07421038, 0x0b490a43, 0xf674e970, 0xf147f93d, 0x0035fb42,
142 0xf54df750, 0xf754f657, 0xde7feb65, 0xfd27fb35, 0xf93df54b, 0xf14def5b,
143 0xe76be76f, 0xe47af54c, 0xf62cf634, 0xf639f73a, 0xf048f945, 0xfc45fb4a,
144 0xf7560242, 0xf7220120, 0x0b1f0534, 0xfe37fe43, 0x0049f859, 0x03340704,
145 0x0a081108, 0x10130325, 0xff3dfb49, 0xff46fc4e, 0x0000eb7e, 0xe97cec6e,
146 0xe67ee77c, 0xef69e579, 0xe575ef66, 0xe675e574, 0xdf7af65f, 0xf264f85f,
147 0xef6fe472, 0xfa59fe50, 0xfc52f755, 0xf851ff48, 0x05400143, 0x09380045,
148 0x01450745, 0xf945fa43, 0xf04dfe40, 0x023dfa43, 0xfd400239, 0xfd41fd42,
149 0x003e0933, 0xff42fe47, 0xfe4bff46, 0xf7480e3c, 0x1025002f, 0x12230b25,
150 0x0c290a29, 0x02300c29, 0x0d29003b, 0x03321328, 0x03421232, 0x13fa12fa,
151 0x0e001af4, 0x1ff021e7, 0x21ea25e4, 0x27e22ae2, 0x2fd62ddc, 0x31de29ef,
152 0x200945b9, 0x3fc142c0, 0x4db636d9, 0x34dd29f6, 0x240028ff, 0x1e0e1c1a,
153 0x17250c37, 0x0b4125df, 0x27dc28db, 0x26e22edf, 0x2ae228e8, 0x31e326f4,
154 0x28f626fd, 0x2efb1f14, 0x1d1e192c, 0x0c300b31, 0x1a2d1616, 0x17161b15,
155 0x21141a1c, 0x1e181b22, 0x122a1927, 0x12320c46, 0x15360e47, 0x0b531920,
156 0x15311536, 0xfb55fa51, 0xf64df951, 0xef50ee49, 0xfc4af653, 0xf747f743,
157 0xff3df842, 0xf242003b, 0x023b11f6, 0x20f32af7, 0x31fb3500, 0x4003440a,
158 0x421b2f39, 0xfb470018, 0xff24fe2a, 0xfe34f739, 0xfa3ffc41, 0xfc43f952,
159 0xfd51fd4c, 0xf948fa4e, 0xf448f244, 0xfd46fa4c, 0xfb42fb3e, 0x0039fc3d,
160 0xf73c0136, 0x023a11f6, 0x20f32af7, 0x31fb3500, 0x4003440a, 0x421b2f39,
161 0x14f10236, 0x034a14f1, 0x0236034a, 0xe47fe968, 0xfa35ff36, 0x07331d10,
162 0x19000e00, 0xf633fd3e, 0xe5631a10, 0xfc55e866, 0x05390639, 0xef490e39,
163 0x1428140a, 0x1d003600, 0x252a0c61, 0xe07fea75, 0xfe4afc55, 0xe8660539,
164 0xfa5df258, 0xfa2c0437, 0xf559f167, 0xeb741339, 0x143a0454, 0x0660013f,
165 0xfb55f36a, 0x053f064b, 0xfd5aff65, 0x0337fc4f, 0xfe4bf461, 0xf932013c,
166 0x0029003f, 0x003f003f, 0xf7530456, 0x0061f948, 0x0d29033e, 0x0722f758,
167 0xec7fdc7f, 0xef5bf25f, 0xe754e756, 0xf459ef5b, 0xe17ff24c, 0xee67f35a,
168 0xdb7f0b50, 0x054c0254, 0x054efa37, 0x043df253, 0xdb7ffb4f, 0xf568f55b,
169 0xe27f0041, 0xfe4f0048, 0xfc5cfa38, 0x0344f847, 0xf362fc56, 0xf458fb52,
170 0xfd48fc43, 0xf848f059, 0xf745ff3b, 0x05420439, 0xfc47fe47, 0x023aff4a,
171 0xfc2cff45, 0x003ef933, 0xfc2ffa2a, 0xfd29fa35, 0x084cf74e, 0xf5530934,
172 0x0043fb5a, 0x0143f148, 0xfb4bf850, 0xeb53eb40, 0xf31fe740, 0xe35e094b,
173 0x113ff84a, 0xfb23fe1b, 0x0d5b0341, 0xf945084d, 0xf642033e, 0xfd44ec51,
174 0x001e0107, 0xfd17eb4a, 0x1042e97c, 0x11252cee, 0x32deea7f, 0x0427002a,
175 0x07220b1d, 0x081f0625, 0x072a0328, 0x08210d2b, 0x0d24042f, 0x0337023a,
176 0x063c082c, 0x0b2c0e2a, 0x07300438, 0x04340d25, 0x0931133a, 0x0a300c2d,
177 0x00451421, 0x083f23ee, 0x21e71cfd, 0x180a1b00, 0x22f234d4, 0x27e81311,
178 0x1f19241d, 0x1821220f, 0x1e141649, 0x1422131f, 0x1b2c1310, 0x0f240f24,
179 0x151c1915, 0x1e141f0c, 0x1b10182a, 0x005d0e38, 0x0f391a26, 0xe87fe873,
180 0xea52f73e, 0x0035003b, 0xf255f359, 0xf35ef55c, 0xe37feb64, 0xf239f443,
181 0xf547f64d, 0xeb55f058, 0xe968f162, 0xdb7ff652, 0xf830f83d, 0xf842f946,
182 0xf24bf64f, 0xf753f45c, 0xee6cfc4f, 0xea45f04b, 0xfe3a013a, 0xf34ef753,
183 0xfc51f363, 0xf351fa26, 0xf33efa3a, 0xfe3bf049, 0xf64cf356, 0xf753f657,
184 0x0000ea7f, 0xe77fe778, 0xe57fed72, 0xe975e776, 0xe675e871, 0xe476e178,
185 0xdb7cf65e, 0xf166f663, 0xf36ace7f, 0xfb5c1139, 0xfb56f35e, 0xf45bfe4d,
186 0x0047ff49, 0x0440f951, 0x05400f39, 0x01430044, 0xf6430144, 0x004d0240,
187 0x0044fb4e, 0x0737053b, 0x02410e36, 0x0f2c053c, 0x0246fe4c, 0xee560c46,
188 0x0540f446, 0x0b370538, 0x00450241, 0xfa4a0536, 0x0736fa4c, 0xf552fe4d,
189 0xfe4d192a, 0x11f310f7, 0x11f41beb, 0x25e229d8, 0x2ad730d1, 0x27e02ed8,
190 0x34cd2ed7, 0x34d92bed, 0x200b3dc9, 0x38d23ece, 0x51bd2dec, 0x23fe1c0f,
191 0x22012701, 0x1e111426, 0x122d0f36, 0x004f24f0, 0x25f225ef, 0x2001220f,
192 0x1d0f1819, 0x22161f10, 0x23121f1c, 0x2129241c, 0x1b2f153e, 0x121f131a,
193 0x24181817, 0x1b10181e, 0x1f1d1629, 0x162a103c, 0x0f340e3c, 0x034ef07b,
194 0x15351638, 0x193d1521, 0x1332113d, 0xfd4ef84a, 0xf748f648, 0xee4bf447,
195 0xf53ffb46, 0xef4bf248, 0xf043f835, 0xf23bf734, 0xf54409fe, 0x1ef61ffc,
196 0x21ff2107, 0x1f0c2517, 0x1f261440, 0xf747f925, 0xf82cf531, 0xf638f43b,
197 0xf83ff743, 0xfa44f64f, 0xfd4ef84a, 0xf748f648, 0xee4bf447, 0xf53ffb46,
198 0xef4bf248, 0xf043f835, 0xf23bf734, 0xf54409fe, 0x1ef61ffc, 0x21ff2107,
199 0x1f0c2517, 0x1f261440
202 int rk3288_vpu_h264d_init(struct rockchip_vpu_ctx *ctx)
204 struct rockchip_vpu_dev *vpu = ctx->dev;
207 ret = rockchip_vpu_aux_buf_alloc(vpu, &ctx->hw.h264d.priv_tbl,
208 sizeof(struct rk3288_vpu_h264d_priv_tbl));
210 vpu_err("allocate h264 priv_tbl failed\n");
217 void rk3288_vpu_h264d_exit(struct rockchip_vpu_ctx *ctx)
219 rockchip_vpu_aux_buf_free(ctx->dev, &ctx->hw.h264d.priv_tbl);
222 static void rk3288_vpu_h264d_prepare_table(struct rockchip_vpu_ctx *ctx)
224 struct rk3288_vpu_h264d_priv_tbl *tbl = ctx->hw.h264d.priv_tbl.cpu;
225 const struct v4l2_ctrl_h264_scaling_matrix *scaling =
226 ctx->run.h264d.scaling_matrix;
227 const struct v4l2_ctrl_h264_decode_param *dec_param =
228 ctx->run.h264d.decode_param;
229 const struct v4l2_h264_dpb_entry *dpb = ctx->run.h264d.dpb;
233 * Prepare auxiliary buffer.
235 * TODO: The CABAC table never changes, but maybe it would be better
236 * to have it as a control, which is set by userspace once?
238 memcpy(tbl->cabac_table, h264_cabac_table, sizeof(tbl->cabac_table));
240 for (i = 0; i < RK3288_VPU_H264_NUM_DPB; ++i) {
241 tbl->poc[i * 2 + 0] = dpb[i].top_field_order_cnt;
242 tbl->poc[i * 2 + 1] = dpb[i].bottom_field_order_cnt;
244 vpu_debug(2, "poc [%02d]: %08x %08x\n", i,
245 tbl->poc[i*2+0], tbl->poc[i*2+1]);
248 tbl->poc[32] = dec_param->top_field_order_cnt;
249 tbl->poc[33] = dec_param->bottom_field_order_cnt;
251 vpu_debug(2, "poc curr: %08x %08x\n", tbl->poc[32], tbl->poc[33]);
253 memcpy(tbl->scaling_list, scaling, sizeof(tbl->scaling_list));
256 static void rk3288_vpu_h264d_set_params(struct rockchip_vpu_ctx *ctx)
258 const struct v4l2_ctrl_h264_decode_param *dec_param =
259 ctx->run.h264d.decode_param;
260 const struct v4l2_ctrl_h264_slice_param *slice =
261 ctx->run.h264d.slice_param;
262 const struct v4l2_ctrl_h264_sps *sps = ctx->run.h264d.sps;
263 const struct v4l2_ctrl_h264_pps *pps = ctx->run.h264d.pps;
264 struct rockchip_vpu_dev *vpu = ctx->dev;
267 /* Decoder control register 0. */
268 reg = VDPU_REG_DEC_CTRL0_DEC_AXI_WR_ID(0xff);
269 if (sps->flags & V4L2_H264_SPS_FLAG_MB_ADAPTIVE_FRAME_FIELD)
270 reg |= VDPU_REG_DEC_CTRL0_SEQ_MBAFF_E;
271 if (sps->profile_idc > 66)
272 reg |= VDPU_REG_DEC_CTRL0_PICORD_COUNT_E
273 | VDPU_REG_DEC_CTRL0_WRITE_MVS_E;
274 if (!(sps->flags & V4L2_H264_SPS_FLAG_FRAME_MBS_ONLY) &&
275 (sps->flags & V4L2_H264_SPS_FLAG_MB_ADAPTIVE_FRAME_FIELD ||
276 slice->flags & V4L2_SLICE_FLAG_FIELD_PIC))
277 reg |= VDPU_REG_DEC_CTRL0_PIC_INTERLACE_E;
278 if (slice->flags & V4L2_SLICE_FLAG_FIELD_PIC)
279 reg |= VDPU_REG_DEC_CTRL0_PIC_FIELDMODE_E;
280 if (!(slice->flags & V4L2_SLICE_FLAG_BOTTOM_FIELD))
281 reg |= VDPU_REG_DEC_CTRL0_PIC_TOPFIELD_E;
282 vdpu_write_relaxed(vpu, reg, VDPU_REG_DEC_CTRL0);
284 /* Decoder control register 1. */
285 reg = VDPU_REG_DEC_CTRL1_PIC_MB_WIDTH(sps->pic_width_in_mbs_minus1 + 1)
286 | VDPU_REG_DEC_CTRL1_PIC_MB_HEIGHT_P(
287 sps->pic_height_in_map_units_minus1 + 1)
288 | VDPU_REG_DEC_CTRL1_REF_FRAMES(sps->max_num_ref_frames);
289 vdpu_write_relaxed(vpu, reg, VDPU_REG_DEC_CTRL1);
291 /* Decoder control register 2. */
292 reg = VDPU_REG_DEC_CTRL2_CH_QP_OFFSET(pps->chroma_qp_index_offset)
293 | VDPU_REG_DEC_CTRL2_CH_QP_OFFSET2(
294 pps->second_chroma_qp_index_offset);
295 if (pps->flags & V4L2_H264_PPS_FLAG_PIC_SCALING_MATRIX_PRESENT)
296 reg |= VDPU_REG_DEC_CTRL2_TYPE1_QUANT_E;
297 if (slice->flags & V4L2_SLICE_FLAG_FIELD_PIC)
298 reg |= VDPU_REG_DEC_CTRL2_FIELDPIC_FLAG_E;
299 vdpu_write_relaxed(vpu, reg, VDPU_REG_DEC_CTRL2);
301 /* Decoder control register 3. */
302 reg = VDPU_REG_DEC_CTRL3_START_CODE_E
303 | VDPU_REG_DEC_CTRL3_INIT_QP(pps->pic_init_qp_minus26 + 26)
304 | VDPU_REG_DEC_CTRL3_STREAM_LEN(
305 vb2_get_plane_payload(&ctx->run.src->vb.vb2_buf, 0));
306 vdpu_write_relaxed(vpu, reg, VDPU_REG_DEC_CTRL3);
308 /* Decoder control register 4. */
309 reg = VDPU_REG_DEC_CTRL4_FRAMENUM_LEN(
310 sps->log2_max_frame_num_minus4 + 4)
311 | VDPU_REG_DEC_CTRL4_FRAMENUM(slice->frame_num)
312 | VDPU_REG_DEC_CTRL4_WEIGHT_BIPR_IDC(pps->weighted_bipred_idc);
313 if (pps->flags & V4L2_H264_PPS_FLAG_ENTROPY_CODING_MODE)
314 reg |= VDPU_REG_DEC_CTRL4_CABAC_E;
315 if (sps->flags & V4L2_H264_SPS_FLAG_DIRECT_8X8_INFERENCE)
316 reg |= VDPU_REG_DEC_CTRL4_DIR_8X8_INFER_E;
317 if (sps->profile_idc >= 0 && sps->chroma_format_idc == 0)
318 reg |= VDPU_REG_DEC_CTRL4_BLACKWHITE_E;
319 if (pps->flags & V4L2_H264_PPS_FLAG_WEIGHTED_PRED)
320 reg |= VDPU_REG_DEC_CTRL4_WEIGHT_PRED_E;
321 vdpu_write_relaxed(vpu, reg, VDPU_REG_DEC_CTRL4);
323 /* Decoder control register 5. */
324 reg = VDPU_REG_DEC_CTRL5_REFPIC_MK_LEN(
325 slice->dec_ref_pic_marking_bit_size)
326 | VDPU_REG_DEC_CTRL5_IDR_PIC_ID(slice->idr_pic_id);
327 if (pps->flags & V4L2_H264_PPS_FLAG_CONSTRAINED_INTRA_PRED)
328 reg |= VDPU_REG_DEC_CTRL5_CONST_INTRA_E;
329 if (pps->flags & V4L2_H264_PPS_FLAG_DEBLOCKING_FILTER_CONTROL_PRESENT)
330 reg |= VDPU_REG_DEC_CTRL5_FILT_CTRL_PRES;
331 if (pps->flags & V4L2_H264_PPS_FLAG_REDUNDANT_PIC_CNT_PRESENT)
332 reg |= VDPU_REG_DEC_CTRL5_RDPIC_CNT_PRES;
333 if (pps->flags & V4L2_H264_PPS_FLAG_TRANSFORM_8X8_MODE)
334 reg |= VDPU_REG_DEC_CTRL5_8X8TRANS_FLAG_E;
335 if (dec_param->idr_pic_flag)
336 reg |= VDPU_REG_DEC_CTRL5_IDR_PIC_E;
337 vdpu_write_relaxed(vpu, reg, VDPU_REG_DEC_CTRL5);
339 /* Decoder control register 6. */
340 reg = VDPU_REG_DEC_CTRL6_PPS_ID(slice->pic_parameter_set_id)
341 | VDPU_REG_DEC_CTRL6_REFIDX0_ACTIVE(
342 pps->num_ref_idx_l0_default_active_minus1 + 1)
343 | VDPU_REG_DEC_CTRL6_REFIDX1_ACTIVE(
344 pps->num_ref_idx_l1_default_active_minus1 + 1)
345 | VDPU_REG_DEC_CTRL6_POC_LENGTH(slice->pic_order_cnt_bit_size);
346 vdpu_write_relaxed(vpu, reg, VDPU_REG_DEC_CTRL6);
348 /* Error concealment register. */
349 vdpu_write_relaxed(vpu, 0, VDPU_REG_ERR_CONC);
351 /* Prediction filter tap register. */
352 vdpu_write_relaxed(vpu, VDPU_REG_PRED_FLT_PRED_BC_TAP_0_0(1)
353 | VDPU_REG_PRED_FLT_PRED_BC_TAP_0_1(-5 & 0x3ff)
354 | VDPU_REG_PRED_FLT_PRED_BC_TAP_0_2(20),
357 /* Reference picture buffer control register. */
358 vdpu_write_relaxed(vpu, 0, VDPU_REG_REF_BUF_CTRL);
360 /* Reference picture buffer control register 2. */
361 vdpu_write_relaxed(vpu, VDPU_REG_REF_BUF_CTRL2_APF_THRESHOLD(8),
362 VDPU_REG_REF_BUF_CTRL2);
366 static void rk3288_vpu_h264d_set_ref(struct rockchip_vpu_ctx *ctx)
368 const struct v4l2_ctrl_h264_decode_param *dec_param =
369 ctx->run.h264d.decode_param;
370 const struct v4l2_h264_dpb_entry *dpb = ctx->run.h264d.dpb;
371 const u8 *dpb_map = ctx->run.h264d.dpb_map;
372 struct rockchip_vpu_dev *vpu = ctx->dev;
373 u32 dpb_longterm = 0;
380 * Set up bit maps of valid and long term DPBs.
381 * NOTE: The bits are reversed, i.e. MSb is DPB 0.
383 for (i = 0; i < RK3288_VPU_H264_NUM_DPB; ++i) {
384 if (dpb[i].flags & V4L2_H264_DPB_ENTRY_FLAG_ACTIVE)
385 dpb_valid |= BIT(RK3288_VPU_H264_NUM_DPB - 1 - i);
387 if (dpb[i].flags & V4L2_H264_DPB_ENTRY_FLAG_LONG_TERM)
388 dpb_longterm |= BIT(RK3288_VPU_H264_NUM_DPB - 1 - i);
390 vdpu_write_relaxed(vpu, dpb_valid << 16, VDPU_REG_VALID_REF);
391 vdpu_write_relaxed(vpu, dpb_longterm << 16, VDPU_REG_LT_REF);
394 * Set up reference frame picture numbers.
396 * Each VDPU_REG_REF_PIC(x) register contains numbers of two
397 * subsequential reference pictures.
399 for (i = 0; i < RK3288_VPU_H264_NUM_DPB; i += 2) {
402 if (dpb[i].flags & V4L2_H264_DPB_ENTRY_FLAG_LONG_TERM)
403 reg |= VDPU_REG_REF_PIC_REFER0_NBR(dpb[i].pic_num);
405 reg |= VDPU_REG_REF_PIC_REFER0_NBR(dpb[i].frame_num);
407 if (dpb[i + 1].flags & V4L2_H264_DPB_ENTRY_FLAG_LONG_TERM)
408 reg |= VDPU_REG_REF_PIC_REFER1_NBR(dpb[i + 1].pic_num);
410 reg |= VDPU_REG_REF_PIC_REFER1_NBR(
411 dpb[i + 1].frame_num);
413 vdpu_write_relaxed(vpu, reg, VDPU_REG_REF_PIC(i / 2));
417 * Each VDPU_REG_BD_REF_PIC(x) register contains three entries
418 * of each forward and backward picture list.
421 for (i = 0; i < 15; i += 3) {
422 reg = VDPU_REG_BD_REF_PIC_BINIT_RLIST_F0(
423 dpb_map[dec_param->ref_pic_list_b0[i + 0]])
424 | VDPU_REG_BD_REF_PIC_BINIT_RLIST_F1(
425 dpb_map[dec_param->ref_pic_list_b0[i + 1]])
426 | VDPU_REG_BD_REF_PIC_BINIT_RLIST_F2(
427 dpb_map[dec_param->ref_pic_list_b0[i + 2]])
428 | VDPU_REG_BD_REF_PIC_BINIT_RLIST_B0(
429 dpb_map[dec_param->ref_pic_list_b1[i + 0]])
430 | VDPU_REG_BD_REF_PIC_BINIT_RLIST_B1(
431 dpb_map[dec_param->ref_pic_list_b1[i + 1]])
432 | VDPU_REG_BD_REF_PIC_BINIT_RLIST_B2(
433 dpb_map[dec_param->ref_pic_list_b1[i + 2]]);
434 vdpu_write_relaxed(vpu, reg, VDPU_REG_BD_REF_PIC(reg_num++));
438 * VDPU_REG_BD_P_REF_PIC register contains last entries (index 15)
439 * of forward and backward reference picture lists and first 4 entries
440 * of P forward picture list.
442 reg = VDPU_REG_BD_P_REF_PIC_BINIT_RLIST_F15(
443 dpb_map[dec_param->ref_pic_list_b0[15]])
444 | VDPU_REG_BD_P_REF_PIC_BINIT_RLIST_B15(
445 dpb_map[dec_param->ref_pic_list_b1[15]])
446 | VDPU_REG_BD_P_REF_PIC_PINIT_RLIST_F0(
447 dpb_map[dec_param->ref_pic_list_p0[0]])
448 | VDPU_REG_BD_P_REF_PIC_PINIT_RLIST_F1(
449 dpb_map[dec_param->ref_pic_list_p0[1]])
450 | VDPU_REG_BD_P_REF_PIC_PINIT_RLIST_F2(
451 dpb_map[dec_param->ref_pic_list_p0[2]])
452 | VDPU_REG_BD_P_REF_PIC_PINIT_RLIST_F3(
453 dpb_map[dec_param->ref_pic_list_p0[3]]);
454 vdpu_write_relaxed(vpu, reg, VDPU_REG_BD_P_REF_PIC);
457 * Each VDPU_REG_FWD_PIC(x) register contains six consecutive
458 * entries of P forward picture list, starting from index 4.
461 for (i = 4; i < RK3288_VPU_H264_NUM_DPB; i += 6) {
462 reg = VDPU_REG_FWD_PIC_PINIT_RLIST_F0(
463 dpb_map[dec_param->ref_pic_list_p0[i + 0]])
464 | VDPU_REG_FWD_PIC_PINIT_RLIST_F1(
465 dpb_map[dec_param->ref_pic_list_p0[i + 1]])
466 | VDPU_REG_FWD_PIC_PINIT_RLIST_F2(
467 dpb_map[dec_param->ref_pic_list_p0[i + 2]])
468 | VDPU_REG_FWD_PIC_PINIT_RLIST_F3(
469 dpb_map[dec_param->ref_pic_list_p0[i + 3]])
470 | VDPU_REG_FWD_PIC_PINIT_RLIST_F4(
471 dpb_map[dec_param->ref_pic_list_p0[i + 4]])
472 | VDPU_REG_FWD_PIC_PINIT_RLIST_F5(
473 dpb_map[dec_param->ref_pic_list_p0[i + 5]]);
474 vdpu_write_relaxed(vpu, reg, VDPU_REG_FWD_PIC(reg_num++));
478 * Set up addresses of DPB buffers.
480 * If a DPB entry is unused, address of current destination buffer
483 for (i = 0; i < RK3288_VPU_H264_NUM_DPB; ++i) {
484 struct vb2_buffer *buf;
486 if (dpb[i].flags & V4L2_H264_DPB_ENTRY_FLAG_ACTIVE
487 && dpb[i].buf_index < ctx->vq_dst.num_buffers)
488 buf = ctx->dst_bufs[dpb[i].buf_index];
490 buf = &ctx->run.dst->vb.vb2_buf;
492 vdpu_write_relaxed(vpu, vb2_dma_contig_plane_dma_addr(buf, 0),
493 VDPU_REG_ADDR_REF(i));
497 static void rk3288_vpu_h264d_set_buffers(struct rockchip_vpu_ctx *ctx)
499 const struct v4l2_ctrl_h264_sps *sps = ctx->run.h264d.sps;
500 const struct v4l2_ctrl_h264_slice_param *slice =
501 ctx->run.h264d.slice_param;
502 struct rockchip_vpu_dev *vpu = ctx->dev;
503 dma_addr_t src_dma, dst_dma;
505 /* Source (stream) buffer. */
506 src_dma = vb2_dma_contig_plane_dma_addr(&ctx->run.src->vb.vb2_buf, 0);
507 vdpu_write_relaxed(vpu, src_dma, VDPU_REG_ADDR_STR);
509 /* Destination (decoded frame) buffer. */
510 dst_dma = vb2_dma_contig_plane_dma_addr(&ctx->run.dst->vb.vb2_buf, 0);
511 vdpu_write_relaxed(vpu, dst_dma, VDPU_REG_ADDR_DST);
513 /* Higher profiles require DMV buffer appended to reference frames. */
514 if (sps->profile_idc > 66) {
515 size_t sizeimage = ctx->dst_fmt.plane_fmt[0].sizeimage;
516 size_t mv_offset = round_up(sizeimage, 8);
518 if (slice->flags & V4L2_SLICE_FLAG_BOTTOM_FIELD)
519 mv_offset += 32 * MB_WIDTH(ctx->dst_fmt.width);
521 vdpu_write_relaxed(vpu, dst_dma + mv_offset,
522 VDPU_REG_ADDR_DIR_MV);
525 /* Auxiliary buffer prepared in rk3288_vpu_h264d_prepare_table(). */
526 vdpu_write_relaxed(vpu, ctx->hw.h264d.priv_tbl.dma,
527 VDPU_REG_ADDR_QTABLE);
530 void rk3288_vpu_h264d_run(struct rockchip_vpu_ctx *ctx)
532 struct rockchip_vpu_dev *vpu = ctx->dev;
534 /* Prepare data in memory. */
535 rk3288_vpu_h264d_prepare_table(ctx);
537 rockchip_vpu_power_on(vpu);
539 /* Configure hardware registers. */
540 rk3288_vpu_h264d_set_params(ctx);
541 rk3288_vpu_h264d_set_ref(ctx);
542 rk3288_vpu_h264d_set_buffers(ctx);
544 schedule_delayed_work(&vpu->watchdog_work, msecs_to_jiffies(2000));
546 /* Start decoding! */
547 vdpu_write_relaxed(vpu, VDPU_REG_CONFIG_DEC_AXI_RD_ID(0xffu)
548 | VDPU_REG_CONFIG_DEC_TIMEOUT_E
549 | VDPU_REG_CONFIG_DEC_OUT_ENDIAN
550 | VDPU_REG_CONFIG_DEC_STRENDIAN_E
551 | VDPU_REG_CONFIG_DEC_MAX_BURST(16)
552 | VDPU_REG_CONFIG_DEC_OUTSWAP32_E
553 | VDPU_REG_CONFIG_DEC_INSWAP32_E
554 | VDPU_REG_CONFIG_DEC_STRSWAP32_E
555 | VDPU_REG_CONFIG_DEC_CLK_GATE_E,
557 vdpu_write(vpu, VDPU_REG_INTERRUPT_DEC_E, VDPU_REG_INTERRUPT);