forked from ~ljy/RK356X_SDK_RELEASE

hc
2023-12-11 6778948f9de86c3cfaf36725a7c87dcff9ba247f
kernel/drivers/media/platform/qcom/venus/core.c
....@@ -1,20 +1,12 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * Copyright (c) 2012-2016, The Linux Foundation. All rights reserved.
34 * Copyright (C) 2017 Linaro Ltd.
4
- *
5
- * This program is free software; you can redistribute it and/or modify
6
- * it under the terms of the GNU General Public License version 2 and
7
- * only version 2 as published by the Free Software Foundation.
8
- *
9
- * This program is distributed in the hope that it will be useful,
10
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
11
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
- * GNU General Public License for more details.
13
- *
145 */
15
-#include <linux/clk.h>
166 #include <linux/init.h>
7
+#include <linux/interconnect.h>
178 #include <linux/ioctl.h>
9
+#include <linux/delay.h>
1810 #include <linux/list.h>
1911 #include <linux/module.h>
2012 #include <linux/of_device.h>
....@@ -27,9 +19,8 @@
2719 #include <media/v4l2-ioctl.h>
2820
2921 #include "core.h"
30
-#include "vdec.h"
31
-#include "venc.h"
3222 #include "firmware.h"
23
+#include "pm_helpers.h"
3324
3425 static void venus_event_notify(struct venus_core *core, u32 event)
3526 {
....@@ -50,106 +41,96 @@
5041 mutex_unlock(&core->lock);
5142
5243 disable_irq_nosync(core->irq);
53
-
54
- /*
55
- * Delay recovery to ensure venus has completed any pending cache
56
- * operations. Without this sleep, we see device reset when firmware is
57
- * unloaded after a system error.
58
- */
59
- schedule_delayed_work(&core->work, msecs_to_jiffies(100));
44
+ schedule_delayed_work(&core->work, msecs_to_jiffies(10));
6045 }
6146
6247 static const struct hfi_core_ops venus_core_ops = {
6348 .event_notify = venus_event_notify,
6449 };
6550
51
+#define RPM_WAIT_FOR_IDLE_MAX_ATTEMPTS 10
52
+
6653 static void venus_sys_error_handler(struct work_struct *work)
6754 {
6855 struct venus_core *core =
6956 container_of(work, struct venus_core, work.work);
70
- int ret = 0;
57
+ int ret, i, max_attempts = RPM_WAIT_FOR_IDLE_MAX_ATTEMPTS;
58
+ const char *err_msg = "";
59
+ bool failed = false;
7160
72
- dev_warn(core->dev, "system error has occurred, starting recovery!\n");
73
-
74
- pm_runtime_get_sync(core->dev);
61
+ ret = pm_runtime_get_sync(core->dev);
62
+ if (ret < 0) {
63
+ err_msg = "resume runtime PM";
64
+ max_attempts = 0;
65
+ failed = true;
66
+ }
7567
7668 hfi_core_deinit(core, true);
77
- hfi_destroy(core);
69
+
7870 mutex_lock(&core->lock);
79
- venus_shutdown(core->dev);
71
+
72
+ for (i = 0; i < max_attempts; i++) {
73
+ if (!pm_runtime_active(core->dev_dec) && !pm_runtime_active(core->dev_enc))
74
+ break;
75
+ msleep(10);
76
+ }
77
+
78
+ venus_shutdown(core);
8079
8180 pm_runtime_put_sync(core->dev);
8281
83
- ret |= hfi_create(core, &venus_core_ops);
82
+ for (i = 0; i < max_attempts; i++) {
83
+ if (!core->pmdomains[0] || !pm_runtime_active(core->pmdomains[0]))
84
+ break;
85
+ usleep_range(1000, 1500);
86
+ }
8487
85
- pm_runtime_get_sync(core->dev);
88
+ hfi_reinit(core);
8689
87
- ret |= venus_boot(core->dev, core->res->fwname);
90
+ ret = pm_runtime_get_sync(core->dev);
91
+ if (ret < 0) {
92
+ err_msg = "resume runtime PM";
93
+ failed = true;
94
+ }
8895
89
- ret |= hfi_core_resume(core, true);
96
+ ret = venus_boot(core);
97
+ if (ret && !failed) {
98
+ err_msg = "boot Venus";
99
+ failed = true;
100
+ }
101
+
102
+ ret = hfi_core_resume(core, true);
103
+ if (ret && !failed) {
104
+ err_msg = "resume HFI";
105
+ failed = true;
106
+ }
90107
91108 enable_irq(core->irq);
92109
93110 mutex_unlock(&core->lock);
94111
95
- ret |= hfi_core_init(core);
112
+ ret = hfi_core_init(core);
113
+ if (ret && !failed) {
114
+ err_msg = "init HFI";
115
+ failed = true;
116
+ }
96117
97118 pm_runtime_put_sync(core->dev);
98119
99
- if (ret) {
120
+ if (failed) {
100121 disable_irq_nosync(core->irq);
101
- dev_warn(core->dev, "recovery failed (%d)\n", ret);
122
+ dev_warn_ratelimited(core->dev,
123
+ "System error has occurred, recovery failed to %s\n",
124
+ err_msg);
102125 schedule_delayed_work(&core->work, msecs_to_jiffies(10));
103126 return;
104127 }
105128
129
+ dev_warn(core->dev, "system error has occurred (recovered)\n");
130
+
106131 mutex_lock(&core->lock);
107132 core->sys_error = false;
108133 mutex_unlock(&core->lock);
109
-}
110
-
111
-static int venus_clks_get(struct venus_core *core)
112
-{
113
- const struct venus_resources *res = core->res;
114
- struct device *dev = core->dev;
115
- unsigned int i;
116
-
117
- for (i = 0; i < res->clks_num; i++) {
118
- core->clks[i] = devm_clk_get(dev, res->clks[i]);
119
- if (IS_ERR(core->clks[i]))
120
- return PTR_ERR(core->clks[i]);
121
- }
122
-
123
- return 0;
124
-}
125
-
126
-static int venus_clks_enable(struct venus_core *core)
127
-{
128
- const struct venus_resources *res = core->res;
129
- unsigned int i;
130
- int ret;
131
-
132
- for (i = 0; i < res->clks_num; i++) {
133
- ret = clk_prepare_enable(core->clks[i]);
134
- if (ret)
135
- goto err;
136
- }
137
-
138
- return 0;
139
-err:
140
- while (i--)
141
- clk_disable_unprepare(core->clks[i]);
142
-
143
- return ret;
144
-}
145
-
146
-static void venus_clks_disable(struct venus_core *core)
147
-{
148
- const struct venus_resources *res = core->res;
149
- unsigned int i = res->clks_num;
150
-
151
- while (i--)
152
- clk_disable_unprepare(core->clks[i]);
153134 }
154135
155136 static u32 to_v4l2_codec_type(u32 codec)
....@@ -207,7 +188,7 @@
207188 goto err;
208189
209190 for (i = 0; i < MAX_CODEC_NUM; i++) {
210
- codec = (1 << i) & codecs;
191
+ codec = (1UL << i) & codecs;
211192 if (!codec)
212193 continue;
213194
....@@ -241,12 +222,19 @@
241222 return -ENOMEM;
242223
243224 core->dev = dev;
244
- platform_set_drvdata(pdev, core);
245225
246226 r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
247227 core->base = devm_ioremap_resource(dev, r);
248228 if (IS_ERR(core->base))
249229 return PTR_ERR(core->base);
230
+
231
+ core->video_path = devm_of_icc_get(dev, "video-mem");
232
+ if (IS_ERR(core->video_path))
233
+ return PTR_ERR(core->video_path);
234
+
235
+ core->cpucfg_path = devm_of_icc_get(dev, "cpu-cfg");
236
+ if (IS_ERR(core->cpucfg_path))
237
+ return PTR_ERR(core->cpucfg_path);
250238
251239 core->irq = platform_get_irq(pdev, 0);
252240 if (core->irq < 0)
....@@ -256,21 +244,23 @@
256244 if (!core->res)
257245 return -ENODEV;
258246
259
- ret = venus_clks_get(core);
260
- if (ret)
261
- return ret;
247
+ mutex_init(&core->pm_lock);
248
+
249
+ core->pm_ops = venus_pm_get(core->res->hfi_version);
250
+ if (!core->pm_ops)
251
+ return -ENODEV;
252
+
253
+ if (core->pm_ops->core_get) {
254
+ ret = core->pm_ops->core_get(core);
255
+ if (ret)
256
+ return ret;
257
+ }
262258
263259 ret = dma_set_mask_and_coherent(dev, core->res->dma_mask);
264260 if (ret)
265
- return ret;
261
+ goto err_core_put;
266262
267
- if (!dev->dma_parms) {
268
- dev->dma_parms = devm_kzalloc(dev, sizeof(*dev->dma_parms),
269
- GFP_KERNEL);
270
- if (!dev->dma_parms)
271
- return -ENOMEM;
272
- }
273
- dma_set_max_seg_size(dev, DMA_BIT_MASK(32));
263
+ dma_set_max_seg_size(dev, UINT_MAX);
274264
275265 INIT_LIST_HEAD(&core->instances);
276266 mutex_init(&core->lock);
....@@ -280,11 +270,17 @@
280270 IRQF_TRIGGER_HIGH | IRQF_ONESHOT,
281271 "venus", core);
282272 if (ret)
283
- return ret;
273
+ goto err_core_put;
284274
285275 ret = hfi_create(core, &venus_core_ops);
286276 if (ret)
287
- return ret;
277
+ goto err_core_put;
278
+
279
+ ret = v4l2_device_register(dev, &core->v4l2_dev);
280
+ if (ret)
281
+ goto err_core_deinit;
282
+
283
+ platform_set_drvdata(pdev, core);
288284
289285 pm_runtime_enable(dev);
290286
....@@ -292,9 +288,17 @@
292288 if (ret < 0)
293289 goto err_runtime_disable;
294290
295
- ret = venus_boot(dev, core->res->fwname);
291
+ ret = of_platform_populate(dev->of_node, NULL, NULL, dev);
296292 if (ret)
297293 goto err_runtime_disable;
294
+
295
+ ret = venus_firmware_init(core);
296
+ if (ret)
297
+ goto err_of_depopulate;
298
+
299
+ ret = venus_boot(core);
300
+ if (ret)
301
+ goto err_firmware_deinit;
298302
299303 ret = hfi_core_resume(core, true);
300304 if (ret)
....@@ -312,39 +316,41 @@
312316 if (ret)
313317 goto err_venus_shutdown;
314318
315
- ret = v4l2_device_register(dev, &core->v4l2_dev);
316
- if (ret)
317
- goto err_core_deinit;
318
-
319
- ret = of_platform_populate(dev->of_node, NULL, NULL, dev);
320
- if (ret)
321
- goto err_dev_unregister;
322
-
323319 ret = pm_runtime_put_sync(dev);
324320 if (ret) {
325321 pm_runtime_get_noresume(dev);
326322 goto err_dev_unregister;
327323 }
328324
325
+ venus_dbgfs_init(core);
326
+
329327 return 0;
330328
331329 err_dev_unregister:
332330 v4l2_device_unregister(&core->v4l2_dev);
333
-err_core_deinit:
334
- hfi_core_deinit(core, false);
335331 err_venus_shutdown:
336
- venus_shutdown(dev);
332
+ venus_shutdown(core);
333
+err_firmware_deinit:
334
+ venus_firmware_deinit(core);
335
+err_of_depopulate:
336
+ of_platform_depopulate(dev);
337337 err_runtime_disable:
338338 pm_runtime_put_noidle(dev);
339339 pm_runtime_set_suspended(dev);
340340 pm_runtime_disable(dev);
341341 hfi_destroy(core);
342
+err_core_deinit:
343
+ hfi_core_deinit(core, false);
344
+err_core_put:
345
+ if (core->pm_ops->core_put)
346
+ core->pm_ops->core_put(core);
342347 return ret;
343348 }
344349
345350 static int venus_remove(struct platform_device *pdev)
346351 {
347352 struct venus_core *core = platform_get_drvdata(pdev);
353
+ const struct venus_pm_ops *pm_ops = core->pm_ops;
348354 struct device *dev = core->dev;
349355 int ret;
350356
....@@ -354,14 +360,24 @@
354360 ret = hfi_core_deinit(core, true);
355361 WARN_ON(ret);
356362
357
- hfi_destroy(core);
358
- venus_shutdown(dev);
363
+ venus_shutdown(core);
359364 of_platform_depopulate(dev);
365
+
366
+ venus_firmware_deinit(core);
360367
361368 pm_runtime_put_sync(dev);
362369 pm_runtime_disable(dev);
363370
371
+ if (pm_ops->core_put)
372
+ pm_ops->core_put(core);
373
+
364374 v4l2_device_unregister(&core->v4l2_dev);
375
+
376
+ hfi_destroy(core);
377
+
378
+ mutex_destroy(&core->pm_lock);
379
+ mutex_destroy(&core->lock);
380
+ venus_dbgfs_deinit(core);
365381
366382 return ret;
367383 }
....@@ -369,11 +385,34 @@
369385 static __maybe_unused int venus_runtime_suspend(struct device *dev)
370386 {
371387 struct venus_core *core = dev_get_drvdata(dev);
388
+ const struct venus_pm_ops *pm_ops = core->pm_ops;
372389 int ret;
373390
374391 ret = hfi_core_suspend(core);
392
+ if (ret)
393
+ return ret;
375394
376
- venus_clks_disable(core);
395
+ if (pm_ops->core_power) {
396
+ ret = pm_ops->core_power(core, POWER_OFF);
397
+ if (ret)
398
+ return ret;
399
+ }
400
+
401
+ ret = icc_set_bw(core->cpucfg_path, 0, 0);
402
+ if (ret)
403
+ goto err_cpucfg_path;
404
+
405
+ ret = icc_set_bw(core->video_path, 0, 0);
406
+ if (ret)
407
+ goto err_video_path;
408
+
409
+ return ret;
410
+
411
+err_video_path:
412
+ icc_set_bw(core->cpucfg_path, kbps_to_icc(1000), 0);
413
+err_cpucfg_path:
414
+ if (pm_ops->core_power)
415
+ pm_ops->core_power(core, POWER_ON);
377416
378417 return ret;
379418 }
....@@ -381,21 +420,24 @@
381420 static __maybe_unused int venus_runtime_resume(struct device *dev)
382421 {
383422 struct venus_core *core = dev_get_drvdata(dev);
423
+ const struct venus_pm_ops *pm_ops = core->pm_ops;
384424 int ret;
385425
386
- ret = venus_clks_enable(core);
426
+ ret = icc_set_bw(core->video_path, kbps_to_icc(20000), 0);
387427 if (ret)
388428 return ret;
389429
390
- ret = hfi_core_resume(core, false);
430
+ ret = icc_set_bw(core->cpucfg_path, kbps_to_icc(1000), 0);
391431 if (ret)
392
- goto err_clks_disable;
432
+ return ret;
393433
394
- return 0;
434
+ if (pm_ops->core_power) {
435
+ ret = pm_ops->core_power(core, POWER_ON);
436
+ if (ret)
437
+ return ret;
438
+ }
395439
396
-err_clks_disable:
397
- venus_clks_disable(core);
398
- return ret;
440
+ return hfi_core_resume(core, false);
399441 }
400442
401443 static const struct dev_pm_ops venus_pm_ops = {
....@@ -453,6 +495,9 @@
453495 .reg_tbl_size = ARRAY_SIZE(msm8996_reg_preset),
454496 .clks = {"core", "iface", "bus", "mbus" },
455497 .clks_num = 4,
498
+ .vcodec0_clks = { "core" },
499
+ .vcodec1_clks = { "core" },
500
+ .vcodec_clks_num = 1,
456501 .max_load = 2563200,
457502 .hfi_version = HFI_VERSION_3XX,
458503 .vmem_id = VIDC_RESOURCE_NONE,
....@@ -463,18 +508,54 @@
463508 };
464509
465510 static const struct freq_tbl sdm845_freq_table[] = {
466
- { 1944000, 380000000 }, /* 4k UHD @ 60 */
467
- { 972000, 320000000 }, /* 4k UHD @ 30 */
468
- { 489600, 200000000 }, /* 1080p @ 60 */
469
- { 244800, 100000000 }, /* 1080p @ 30 */
511
+ { 3110400, 533000000 }, /* 4096x2160@90 */
512
+ { 2073600, 444000000 }, /* 4096x2160@60 */
513
+ { 1944000, 404000000 }, /* 3840x2160@60 */
514
+ { 972000, 330000000 }, /* 3840x2160@30 */
515
+ { 489600, 200000000 }, /* 1920x1080@60 */
516
+ { 244800, 100000000 }, /* 1920x1080@30 */
517
+};
518
+
519
+static const struct codec_freq_data sdm845_codec_freq_data[] = {
520
+ { V4L2_PIX_FMT_H264, VIDC_SESSION_TYPE_ENC, 675, 10 },
521
+ { V4L2_PIX_FMT_HEVC, VIDC_SESSION_TYPE_ENC, 675, 10 },
522
+ { V4L2_PIX_FMT_VP8, VIDC_SESSION_TYPE_ENC, 675, 10 },
523
+ { V4L2_PIX_FMT_MPEG2, VIDC_SESSION_TYPE_DEC, 200, 10 },
524
+ { V4L2_PIX_FMT_H264, VIDC_SESSION_TYPE_DEC, 200, 10 },
525
+ { V4L2_PIX_FMT_HEVC, VIDC_SESSION_TYPE_DEC, 200, 10 },
526
+ { V4L2_PIX_FMT_VP8, VIDC_SESSION_TYPE_DEC, 200, 10 },
527
+ { V4L2_PIX_FMT_VP9, VIDC_SESSION_TYPE_DEC, 200, 10 },
528
+};
529
+
530
+static const struct bw_tbl sdm845_bw_table_enc[] = {
531
+ { 1944000, 1612000, 0, 2416000, 0 }, /* 3840x2160@60 */
532
+ { 972000, 951000, 0, 1434000, 0 }, /* 3840x2160@30 */
533
+ { 489600, 723000, 0, 973000, 0 }, /* 1920x1080@60 */
534
+ { 244800, 370000, 0, 495000, 0 }, /* 1920x1080@30 */
535
+};
536
+
537
+static const struct bw_tbl sdm845_bw_table_dec[] = {
538
+ { 2073600, 3929000, 0, 5551000, 0 }, /* 4096x2160@60 */
539
+ { 1036800, 1987000, 0, 2797000, 0 }, /* 4096x2160@30 */
540
+ { 489600, 1040000, 0, 1298000, 0 }, /* 1920x1080@60 */
541
+ { 244800, 530000, 0, 659000, 0 }, /* 1920x1080@30 */
470542 };
471543
472544 static const struct venus_resources sdm845_res = {
473545 .freq_tbl = sdm845_freq_table,
474546 .freq_tbl_size = ARRAY_SIZE(sdm845_freq_table),
547
+ .bw_tbl_enc = sdm845_bw_table_enc,
548
+ .bw_tbl_enc_size = ARRAY_SIZE(sdm845_bw_table_enc),
549
+ .bw_tbl_dec = sdm845_bw_table_dec,
550
+ .bw_tbl_dec_size = ARRAY_SIZE(sdm845_bw_table_dec),
551
+ .codec_freq_data = sdm845_codec_freq_data,
552
+ .codec_freq_data_size = ARRAY_SIZE(sdm845_codec_freq_data),
475553 .clks = {"core", "iface", "bus" },
476554 .clks_num = 3,
477
- .max_load = 2563200,
555
+ .vcodec0_clks = { "core", "bus" },
556
+ .vcodec1_clks = { "core", "bus" },
557
+ .vcodec_clks_num = 2,
558
+ .max_load = 3110400, /* 4096x2160@90 */
478559 .hfi_version = HFI_VERSION_4XX,
479560 .vmem_id = VIDC_RESOURCE_NONE,
480561 .vmem_size = 0,
....@@ -483,10 +564,88 @@
483564 .fwname = "qcom/venus-5.2/venus.mdt",
484565 };
485566
567
+static const struct venus_resources sdm845_res_v2 = {
568
+ .freq_tbl = sdm845_freq_table,
569
+ .freq_tbl_size = ARRAY_SIZE(sdm845_freq_table),
570
+ .bw_tbl_enc = sdm845_bw_table_enc,
571
+ .bw_tbl_enc_size = ARRAY_SIZE(sdm845_bw_table_enc),
572
+ .bw_tbl_dec = sdm845_bw_table_dec,
573
+ .bw_tbl_dec_size = ARRAY_SIZE(sdm845_bw_table_dec),
574
+ .codec_freq_data = sdm845_codec_freq_data,
575
+ .codec_freq_data_size = ARRAY_SIZE(sdm845_codec_freq_data),
576
+ .clks = {"core", "iface", "bus" },
577
+ .clks_num = 3,
578
+ .vcodec0_clks = { "vcodec0_core", "vcodec0_bus" },
579
+ .vcodec1_clks = { "vcodec1_core", "vcodec1_bus" },
580
+ .vcodec_clks_num = 2,
581
+ .vcodec_pmdomains = { "venus", "vcodec0", "vcodec1" },
582
+ .vcodec_pmdomains_num = 3,
583
+ .opp_pmdomain = (const char *[]) { "cx", NULL },
584
+ .vcodec_num = 2,
585
+ .max_load = 3110400, /* 4096x2160@90 */
586
+ .hfi_version = HFI_VERSION_4XX,
587
+ .vmem_id = VIDC_RESOURCE_NONE,
588
+ .vmem_size = 0,
589
+ .vmem_addr = 0,
590
+ .dma_mask = 0xe0000000 - 1,
591
+ .cp_start = 0,
592
+ .cp_size = 0x70800000,
593
+ .cp_nonpixel_start = 0x1000000,
594
+ .cp_nonpixel_size = 0x24800000,
595
+ .fwname = "qcom/venus-5.2/venus.mdt",
596
+};
597
+
598
+static const struct freq_tbl sc7180_freq_table[] = {
599
+ { 0, 500000000 },
600
+ { 0, 434000000 },
601
+ { 0, 340000000 },
602
+ { 0, 270000000 },
603
+ { 0, 150000000 },
604
+};
605
+
606
+static const struct bw_tbl sc7180_bw_table_enc[] = {
607
+ { 972000, 750000, 0, 0, 0 }, /* 3840x2160@30 */
608
+ { 489600, 451000, 0, 0, 0 }, /* 1920x1080@60 */
609
+ { 244800, 234000, 0, 0, 0 }, /* 1920x1080@30 */
610
+};
611
+
612
+static const struct bw_tbl sc7180_bw_table_dec[] = {
613
+ { 1036800, 1386000, 0, 1875000, 0 }, /* 4096x2160@30 */
614
+ { 489600, 865000, 0, 1146000, 0 }, /* 1920x1080@60 */
615
+ { 244800, 530000, 0, 583000, 0 }, /* 1920x1080@30 */
616
+};
617
+
618
+static const struct venus_resources sc7180_res = {
619
+ .freq_tbl = sc7180_freq_table,
620
+ .freq_tbl_size = ARRAY_SIZE(sc7180_freq_table),
621
+ .bw_tbl_enc = sc7180_bw_table_enc,
622
+ .bw_tbl_enc_size = ARRAY_SIZE(sc7180_bw_table_enc),
623
+ .bw_tbl_dec = sc7180_bw_table_dec,
624
+ .bw_tbl_dec_size = ARRAY_SIZE(sc7180_bw_table_dec),
625
+ .codec_freq_data = sdm845_codec_freq_data,
626
+ .codec_freq_data_size = ARRAY_SIZE(sdm845_codec_freq_data),
627
+ .clks = {"core", "iface", "bus" },
628
+ .clks_num = 3,
629
+ .vcodec0_clks = { "vcodec0_core", "vcodec0_bus" },
630
+ .vcodec_clks_num = 2,
631
+ .vcodec_pmdomains = { "venus", "vcodec0" },
632
+ .vcodec_pmdomains_num = 2,
633
+ .opp_pmdomain = (const char *[]) { "cx", NULL },
634
+ .vcodec_num = 1,
635
+ .hfi_version = HFI_VERSION_4XX,
636
+ .vmem_id = VIDC_RESOURCE_NONE,
637
+ .vmem_size = 0,
638
+ .vmem_addr = 0,
639
+ .dma_mask = 0xe0000000 - 1,
640
+ .fwname = "qcom/venus-5.4/venus.mdt",
641
+};
642
+
486643 static const struct of_device_id venus_dt_match[] = {
487644 { .compatible = "qcom,msm8916-venus", .data = &msm8916_res, },
488645 { .compatible = "qcom,msm8996-venus", .data = &msm8996_res, },
489646 { .compatible = "qcom,sdm845-venus", .data = &sdm845_res, },
647
+ { .compatible = "qcom,sdm845-venus-v2", .data = &sdm845_res_v2, },
648
+ { .compatible = "qcom,sc7180-venus", .data = &sc7180_res, },
490649 { }
491650 };
492651 MODULE_DEVICE_TABLE(of, venus_dt_match);