blob: c84490fa108b3a0370b861e789dc99c34ac9c103 [file] [log] [blame]
Praneeth Paladugud5bf7bc2017-05-29 23:41:04 -07001/* Copyright (c) 2017, The Linux Foundation. All rights reserved.
2 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 *
12 */
13
14#include <linux/debugfs.h>
15#include <linux/dma-mapping.h>
16#include <linux/init.h>
17#include <linux/ioctl.h>
18#include <linux/list.h>
19#include <linux/module.h>
20#include <linux/of_platform.h>
21#include <linux/platform_device.h>
22#include <linux/slab.h>
23#include <linux/types.h>
24#include <linux/version.h>
25#include <linux/io.h>
26#include "msm_vidc_internal.h"
Manikanta Kanamarlapudi0ff858d2017-08-28 17:35:11 +053027#include "msm_vidc_debug.h"
Praneeth Paladugud5bf7bc2017-05-29 23:41:04 -070028
29
30#define CODEC_ENTRY(n, p, vsp, vpp, lp) \
31{ \
32 .fourcc = n, \
33 .session_type = p, \
34 .vsp_cycles = vsp, \
35 .vpp_cycles = vpp, \
36 .low_power_cycles = lp \
37}
38
Manikanta Kanamarlapudi0ff858d2017-08-28 17:35:11 +053039#define EFUSE_ENTRY(sa, s, m, sh, p) \
40{ \
41 .start_address = sa, \
42 .size = s, \
43 .mask = m, \
44 .shift = sh, \
45 .purpose = p \
46}
47
Praneeth Paladugud5bf7bc2017-05-29 23:41:04 -070048static struct msm_vidc_codec_data default_codec_data[] = {
49 CODEC_ENTRY(V4L2_PIX_FMT_H264, MSM_VIDC_ENCODER, 125, 675, 320),
50 CODEC_ENTRY(V4L2_PIX_FMT_H264, MSM_VIDC_DECODER, 125, 675, 320),
51};
52
53static struct msm_vidc_codec_data sdm845_codec_data[] = {
54 CODEC_ENTRY(V4L2_PIX_FMT_H264, MSM_VIDC_ENCODER, 125, 675, 320),
55 CODEC_ENTRY(V4L2_PIX_FMT_HEVC, MSM_VIDC_ENCODER, 125, 675, 320),
56 CODEC_ENTRY(V4L2_PIX_FMT_VP8, MSM_VIDC_ENCODER, 125, 675, 320),
Surajit Podderfbd838d2017-09-05 15:23:00 +053057 CODEC_ENTRY(V4L2_PIX_FMT_TME, MSM_VIDC_ENCODER, 0, 540, 540),
Praneeth Paladugud5bf7bc2017-05-29 23:41:04 -070058 CODEC_ENTRY(V4L2_PIX_FMT_MPEG2, MSM_VIDC_DECODER, 50, 200, 200),
59 CODEC_ENTRY(V4L2_PIX_FMT_H264, MSM_VIDC_DECODER, 50, 200, 200),
60 CODEC_ENTRY(V4L2_PIX_FMT_HEVC, MSM_VIDC_DECODER, 50, 200, 200),
61 CODEC_ENTRY(V4L2_PIX_FMT_VP8, MSM_VIDC_DECODER, 50, 200, 200),
62 CODEC_ENTRY(V4L2_PIX_FMT_VP9, MSM_VIDC_DECODER, 50, 200, 200),
63};
64
Manikanta Kanamarlapudi0ff858d2017-08-28 17:35:11 +053065static struct msm_vidc_codec_data sdm670_codec_data[] = {
66 CODEC_ENTRY(V4L2_PIX_FMT_H264, MSM_VIDC_ENCODER, 125, 675, 320),
67 CODEC_ENTRY(V4L2_PIX_FMT_HEVC, MSM_VIDC_ENCODER, 125, 675, 320),
68 CODEC_ENTRY(V4L2_PIX_FMT_VP8, MSM_VIDC_ENCODER, 125, 675, 320),
Vikash Garodia6e9d2022017-10-12 12:35:07 +053069 CODEC_ENTRY(V4L2_PIX_FMT_TME, MSM_VIDC_ENCODER, 0, 540, 540),
Manikanta Kanamarlapudi0ff858d2017-08-28 17:35:11 +053070 CODEC_ENTRY(V4L2_PIX_FMT_MPEG2, MSM_VIDC_DECODER, 50, 200, 200),
71 CODEC_ENTRY(V4L2_PIX_FMT_H264, MSM_VIDC_DECODER, 50, 200, 200),
72 CODEC_ENTRY(V4L2_PIX_FMT_HEVC, MSM_VIDC_DECODER, 50, 200, 200),
73 CODEC_ENTRY(V4L2_PIX_FMT_VP8, MSM_VIDC_DECODER, 50, 200, 200),
74 CODEC_ENTRY(V4L2_PIX_FMT_VP9, MSM_VIDC_DECODER, 50, 200, 200),
75};
76
Chinmay Sawarkarddd1d972017-08-15 10:10:06 -070077/*
78 * Custom conversion coefficients for resolution: 176x144 negative
79 * coeffs are converted to s4.9 format
80 * (e.g. -22 converted to ((1 << 13) - 22)
81 * 3x3 transformation matrix coefficients in s4.9 fixed point format
82 */
83static u32 vpe_csc_custom_matrix_coeff[HAL_MAX_MATRIX_COEFFS] = {
84 470, 8170, 8148, 0, 490, 50, 0, 34, 483
85};
86
87/* offset coefficients in s9 fixed point format */
88static u32 vpe_csc_custom_bias_coeff[HAL_MAX_BIAS_COEFFS] = {
89 34, 0, 4
90};
91
92/* clamping value for Y/U/V([min,max] for Y/U/V) */
93static u32 vpe_csc_custom_limit_coeff[HAL_MAX_LIMIT_COEFFS] = {
94 16, 235, 16, 240, 16, 240
95};
96
Praneeth Paladugud5bf7bc2017-05-29 23:41:04 -070097static struct msm_vidc_common_data default_common_data[] = {
98 {
Praneeth Paladugu68553202017-06-26 16:08:56 -070099 .key = "qcom,never-unload-fw",
Praneeth Paladugud5bf7bc2017-05-29 23:41:04 -0700100 .value = 1,
101 },
102};
103
104static struct msm_vidc_common_data sdm845_common_data[] = {
105 {
Praneeth Paladugu68553202017-06-26 16:08:56 -0700106 .key = "qcom,never-unload-fw",
Praneeth Paladugud5bf7bc2017-05-29 23:41:04 -0700107 .value = 1,
108 },
109 {
110 .key = "qcom,sw-power-collapse",
111 .value = 1,
112 },
113 {
Maheshwar Ajja9ff81a22017-08-05 13:25:55 -0700114 .key = "qcom,domain-attr-non-fatal-faults",
115 .value = 1,
116 },
117 {
Maheshwar Ajjad15194c2017-11-03 11:41:36 -0700118 .key = "qcom,domain-attr-cache-pagetables",
119 .value = 1,
120 },
121 {
Praneeth Paladugud5bf7bc2017-05-29 23:41:04 -0700122 .key = "qcom,max-secure-instances",
123 .value = 5,
124 },
125 {
126 .key = "qcom,max-hw-load",
Saurabh Kothawade5d7f7d42017-09-15 11:22:49 -0700127 .value = 3110400, /* 4096x2160@90 */
Praneeth Paladugud5bf7bc2017-05-29 23:41:04 -0700128 },
129 {
130 .key = "qcom,max-hq-mbs-per-frame",
131 .value = 8160,
132 },
133 {
134 .key = "qcom,max-hq-frames-per-sec",
135 .value = 60,
136 },
137 {
138 .key = "qcom,max-b-frame-size",
139 .value = 8160,
140 },
141 {
142 .key = "qcom,max-b-frames-per-sec",
143 .value = 60,
144 },
145 {
146 .key = "qcom,power-collapse-delay",
Maheshwar Ajja352e02e2017-10-25 17:40:26 -0700147 .value = 1500,
Praneeth Paladugud5bf7bc2017-05-29 23:41:04 -0700148 },
149 {
150 .key = "qcom,hw-resp-timeout",
Maheshwar Ajja352e02e2017-10-25 17:40:26 -0700151 .value = 1000,
Praneeth Paladugud5bf7bc2017-05-29 23:41:04 -0700152 },
Maheshwar Ajja8382bec2017-08-11 13:41:35 -0700153 {
154 .key = "qcom,debug-timeout",
155 .value = 0,
156 },
Praneeth Paladugud5bf7bc2017-05-29 23:41:04 -0700157};
158
Manikanta Kanamarlapudi0ff858d2017-08-28 17:35:11 +0530159static struct msm_vidc_common_data sdm670_common_data_v0[] = {
160 {
161 .key = "qcom,never-unload-fw",
162 .value = 1,
163 },
164 {
165 .key = "qcom,sw-power-collapse",
166 .value = 1,
167 },
168 {
Vikash Garodiac8abcae2017-10-24 18:46:20 +0530169 .key = "qcom,domain-attr-non-fatal-faults",
170 .value = 1,
171 },
172 {
Vikash Garodiab5244202017-11-14 15:17:44 +0530173 .key = "qcom,domain-attr-cache-pagetables",
174 .value = 1,
175 },
176 {
Manikanta Kanamarlapudi0ff858d2017-08-28 17:35:11 +0530177 .key = "qcom,max-secure-instances",
178 .value = 5,
179 },
180 {
181 .key = "qcom,max-hw-load",
182 .value = 1944000,
183 },
184 {
185 .key = "qcom,max-hq-mbs-per-frame",
186 .value = 8160,
187 },
188 {
189 .key = "qcom,max-hq-frames-per-sec",
190 .value = 60,
191 },
192 {
193 .key = "qcom,max-b-frame-size",
194 .value = 8160,
195 },
196 {
197 .key = "qcom,max-b-frames-per-sec",
198 .value = 60,
199 },
200 {
201 .key = "qcom,power-collapse-delay",
Surajit Podder61bb3312017-12-05 14:42:52 +0530202 .value = 1500,
Manikanta Kanamarlapudi0ff858d2017-08-28 17:35:11 +0530203 },
204 {
205 .key = "qcom,hw-resp-timeout",
Surajit Podder61bb3312017-12-05 14:42:52 +0530206 .value = 1000,
Manikanta Kanamarlapudi0ff858d2017-08-28 17:35:11 +0530207 },
208};
209
210static struct msm_vidc_common_data sdm670_common_data_v1[] = {
211 {
212 .key = "qcom,never-unload-fw",
213 .value = 1,
214 },
215 {
216 .key = "qcom,sw-power-collapse",
217 .value = 1,
218 },
219 {
Vikash Garodiac8abcae2017-10-24 18:46:20 +0530220 .key = "qcom,domain-attr-non-fatal-faults",
221 .value = 1,
222 },
223 {
Vikash Garodiab5244202017-11-14 15:17:44 +0530224 .key = "qcom,domain-attr-cache-pagetables",
225 .value = 1,
226 },
227 {
Manikanta Kanamarlapudi0ff858d2017-08-28 17:35:11 +0530228 .key = "qcom,max-secure-instances",
229 .value = 5,
230 },
231 {
232 .key = "qcom,max-hw-load",
233 .value = 1216800,
234 },
235 {
236 .key = "qcom,max-hq-mbs-per-frame",
237 .value = 8160,
238 },
239 {
240 .key = "qcom,max-hq-frames-per-sec",
241 .value = 60,
242 },
243 {
244 .key = "qcom,max-b-frame-size",
245 .value = 8160,
246 },
247 {
248 .key = "qcom,max-b-frames-per-sec",
249 .value = 60,
250 },
251 {
252 .key = "qcom,power-collapse-delay",
Surajit Podder61bb3312017-12-05 14:42:52 +0530253 .value = 1500,
Manikanta Kanamarlapudi0ff858d2017-08-28 17:35:11 +0530254 },
255 {
256 .key = "qcom,hw-resp-timeout",
Surajit Podder61bb3312017-12-05 14:42:52 +0530257 .value = 1000,
Manikanta Kanamarlapudi0ff858d2017-08-28 17:35:11 +0530258 },
259};
260
261static struct msm_vidc_efuse_data sdm670_efuse_data[] = {
262 EFUSE_ENTRY(0x007801A0, 4, 0x00008000, 0x0f, SKU_VERSION),
263};
Praneeth Paladugud5bf7bc2017-05-29 23:41:04 -0700264
265static struct msm_vidc_platform_data default_data = {
266 .codec_data = default_codec_data,
267 .codec_data_length = ARRAY_SIZE(default_codec_data),
268 .common_data = default_common_data,
269 .common_data_length = ARRAY_SIZE(default_common_data),
Chinmay Sawarkarddd1d972017-08-15 10:10:06 -0700270 .csc_data.vpe_csc_custom_bias_coeff = vpe_csc_custom_bias_coeff,
271 .csc_data.vpe_csc_custom_matrix_coeff = vpe_csc_custom_matrix_coeff,
272 .csc_data.vpe_csc_custom_limit_coeff = vpe_csc_custom_limit_coeff,
Manikanta Kanamarlapudi0ff858d2017-08-28 17:35:11 +0530273 .efuse_data = NULL,
274 .efuse_data_length = 0,
275 .sku_version = 0,
Praneeth Paladugud5bf7bc2017-05-29 23:41:04 -0700276};
277
278static struct msm_vidc_platform_data sdm845_data = {
279 .codec_data = sdm845_codec_data,
280 .codec_data_length = ARRAY_SIZE(sdm845_codec_data),
281 .common_data = sdm845_common_data,
282 .common_data_length = ARRAY_SIZE(sdm845_common_data),
Chinmay Sawarkarddd1d972017-08-15 10:10:06 -0700283 .csc_data.vpe_csc_custom_bias_coeff = vpe_csc_custom_bias_coeff,
284 .csc_data.vpe_csc_custom_matrix_coeff = vpe_csc_custom_matrix_coeff,
285 .csc_data.vpe_csc_custom_limit_coeff = vpe_csc_custom_limit_coeff,
Manikanta Kanamarlapudi0ff858d2017-08-28 17:35:11 +0530286 .efuse_data = NULL,
287 .efuse_data_length = 0,
288 .sku_version = 0,
289};
290
291static struct msm_vidc_platform_data sdm670_data = {
292 .codec_data = sdm670_codec_data,
293 .codec_data_length = ARRAY_SIZE(sdm670_codec_data),
294 .common_data = sdm670_common_data_v0,
295 .common_data_length = ARRAY_SIZE(sdm670_common_data_v0),
296 .csc_data.vpe_csc_custom_bias_coeff = vpe_csc_custom_bias_coeff,
297 .csc_data.vpe_csc_custom_matrix_coeff = vpe_csc_custom_matrix_coeff,
298 .csc_data.vpe_csc_custom_limit_coeff = vpe_csc_custom_limit_coeff,
299 .efuse_data = sdm670_efuse_data,
300 .efuse_data_length = ARRAY_SIZE(sdm670_efuse_data),
301 .sku_version = 0,
Praneeth Paladugud5bf7bc2017-05-29 23:41:04 -0700302};
303
304static const struct of_device_id msm_vidc_dt_match[] = {
305 {
306 .compatible = "qcom,sdm845-vidc",
307 .data = &sdm845_data,
308 },
Manikanta Kanamarlapudi0ff858d2017-08-28 17:35:11 +0530309 {
310 .compatible = "qcom,sdm670-vidc",
311 .data = &sdm670_data,
312 },
Manikanta Kanamarlapudice996822017-09-26 21:11:01 +0530313 {},
Praneeth Paladugud5bf7bc2017-05-29 23:41:04 -0700314};
315
316MODULE_DEVICE_TABLE(of, msm_vidc_dt_match);
317
Manikanta Kanamarlapudi0ff858d2017-08-28 17:35:11 +0530318static int msm_vidc_read_efuse(
319 struct msm_vidc_platform_data *data, struct device *dev)
320{
321 void __iomem *base;
322 uint32_t i;
323 struct msm_vidc_efuse_data *efuse_data = data->efuse_data;
324 uint32_t efuse_data_count = data->efuse_data_length;
325
326 for (i = 0; i < efuse_data_count; i++) {
327
328 switch ((efuse_data[i]).purpose) {
329
330 case SKU_VERSION:
331 base = devm_ioremap(dev, (efuse_data[i]).start_address,
332 (efuse_data[i]).size);
333 if (!base) {
334 dprintk(VIDC_ERR,
335 "failed efuse ioremap: res->start %#x, size %d\n",
336 (efuse_data[i]).start_address,
337 (efuse_data[i]).size);
338 return -EINVAL;
339 } else {
340 u32 efuse = 0;
341
342 efuse = readl_relaxed(base);
343 data->sku_version =
344 (efuse & (efuse_data[i]).mask) >>
345 (efuse_data[i]).shift;
346 dprintk(VIDC_DBG,
347 "efuse 0x%x, platform version 0x%x\n",
348 efuse, data->sku_version);
349
350 devm_iounmap(dev, base);
351 }
352 break;
353
354 default:
355 break;
356 }
357 }
358 return 0;
359}
360
Praneeth Paladugud5bf7bc2017-05-29 23:41:04 -0700361void *vidc_get_drv_data(struct device *dev)
362{
363 struct msm_vidc_platform_data *driver_data = NULL;
364 const struct of_device_id *match;
Manikanta Kanamarlapudi0ff858d2017-08-28 17:35:11 +0530365 int rc = 0;
Praneeth Paladugud5bf7bc2017-05-29 23:41:04 -0700366
367 if (!IS_ENABLED(CONFIG_OF) || !dev->of_node) {
368 driver_data = &default_data;
369 goto exit;
370 }
371
372 match = of_match_node(msm_vidc_dt_match, dev->of_node);
373
374 if (match)
375 driver_data = (struct msm_vidc_platform_data *)match->data;
376
Manikanta Kanamarlapudi0ff858d2017-08-28 17:35:11 +0530377 if (!of_find_property(dev->of_node, "sku-index", NULL) ||
378 !driver_data) {
379 goto exit;
380 } else if (!strcmp(match->compatible, "qcom,sdm670-vidc")) {
381 rc = msm_vidc_read_efuse(driver_data, dev);
382 if (rc)
383 goto exit;
384
385 if (driver_data->sku_version == SKU_VERSION_1) {
386 driver_data->common_data = sdm670_common_data_v1;
387 driver_data->common_data_length =
388 ARRAY_SIZE(sdm670_common_data_v1);
389 }
390 }
391
Praneeth Paladugud5bf7bc2017-05-29 23:41:04 -0700392exit:
393 return driver_data;
394}