hc
2023-11-06 e3e12f52b214121840b44c91de5b3e5af5d3eb84
kernel/drivers/video/rockchip/rga3/rga_drv.c
....@@ -26,20 +26,6 @@
2626 static struct hrtimer timer;
2727 static ktime_t kt;
2828
29
-static const struct rga_backend_ops rga3_ops = {
30
- .get_version = rga3_get_version,
31
- .set_reg = rga3_set_reg,
32
- .init_reg = rga3_init_reg,
33
- .soft_reset = rga3_soft_reset
34
-};
35
-
36
-static const struct rga_backend_ops rga2_ops = {
37
- .get_version = rga2_get_version,
38
- .set_reg = rga2_set_reg,
39
- .init_reg = rga2_init_reg,
40
- .soft_reset = rga2_soft_reset
41
-};
42
-
4329 static struct rga_session *rga_session_init(void);
4430 static int rga_session_deinit(struct rga_session *session);
4531
....@@ -49,6 +35,7 @@
4935 {
5036 struct rga_external_buffer buffer;
5137
38
+ memset(&buffer, 0x0, sizeof(buffer));
5239 buffer.memory = (unsigned long)dma_buf;
5340 buffer.type = RGA_DMA_BUFFER_PTR;
5441 buffer.memory_parm.width = channel_info->vir_w;
....@@ -270,8 +257,8 @@
270257 struct rga_pending_request_manager *request_manager = rga_drvdata->pend_request_manager;
271258
272259 session = rga_session_init();
273
- if (!session)
274
- return -ENOMEM;
260
+ if (IS_ERR(session))
261
+ return PTR_ERR(session);
275262
276263 request_id = rga_request_alloc(0, session);
277264 if (request_id < 0) {
....@@ -561,22 +548,38 @@
561548
562549 static struct rga_session *rga_session_init(void)
563550 {
551
+ int new_id;
552
+
564553 struct rga_session_manager *session_manager = NULL;
565
- struct rga_session *session = kzalloc(sizeof(*session), GFP_KERNEL);
554
+ struct rga_session *session = NULL;
566555
567556 session_manager = rga_drvdata->session_manager;
568557 if (session_manager == NULL) {
569558 pr_err("rga_session_manager is null!\n");
570
- kfree(session);
571
- return NULL;
559
+ return ERR_PTR(-EFAULT);
560
+ }
561
+
562
+ session = kzalloc(sizeof(*session), GFP_KERNEL);
563
+ if (!session) {
564
+ pr_err("rga_session alloc failed\n");
565
+ return ERR_PTR(-ENOMEM);
572566 }
573567
574568 mutex_lock(&session_manager->lock);
575569
576570 idr_preload(GFP_KERNEL);
577
- session->id = idr_alloc(&session_manager->ctx_id_idr, session, 1, 0, GFP_ATOMIC);
578
- session_manager->session_cnt++;
571
+ new_id = idr_alloc_cyclic(&session_manager->ctx_id_idr, session, 1, 0, GFP_NOWAIT);
579572 idr_preload_end();
573
+ if (new_id < 0) {
574
+ mutex_unlock(&session_manager->lock);
575
+
576
+ pr_err("rga_session alloc id failed!\n");
577
+ kfree(session);
578
+ return ERR_PTR(new_id);
579
+ }
580
+
581
+ session->id = new_id;
582
+ session_manager->session_cnt++;
580583
581584 mutex_unlock(&session_manager->lock);
582585
....@@ -588,29 +591,7 @@
588591
589592 static int rga_session_deinit(struct rga_session *session)
590593 {
591
- pid_t pid;
592
- int request_id;
593
- struct rga_pending_request_manager *request_manager;
594
- struct rga_request *request;
595
-
596
- pid = current->pid;
597
-
598
- request_manager = rga_drvdata->pend_request_manager;
599
-
600
- mutex_lock(&request_manager->lock);
601
-
602
- idr_for_each_entry(&request_manager->request_idr, request, request_id) {
603
-
604
- if (session == request->session) {
605
- pr_err("[pid:%d] destroy request[%d] when the user exits",
606
- pid, request->id);
607
- rga_request_put(request);
608
- }
609
- }
610
-
611
- mutex_unlock(&request_manager->lock);
612
-
613
- rga_job_session_destroy(session);
594
+ rga_request_session_destroy_abort(session);
614595 rga_mm_session_release_buffer(session);
615596
616597 rga_session_free_remove_idr(session);
....@@ -670,8 +651,9 @@
670651
671652 ret = rga_mm_import_buffer(&external_buffer[i], session);
672653 if (ret == 0) {
673
- pr_err("buffer[%d] mm import buffer failed! memory = 0x%lx, type = 0x%x\n",
654
+ pr_err("buffer[%d] mm import buffer failed! memory = 0x%lx, type = %s(0x%x)\n",
674655 i, (unsigned long)external_buffer[i].memory,
656
+ rga_get_memory_type_str(external_buffer[i].type),
675657 external_buffer[i].type);
676658
677659 goto err_free_external_buffer;
....@@ -741,7 +723,8 @@
741723
742724 ret = rga_mm_release_buffer(external_buffer[i].handle);
743725 if (ret < 0) {
744
- pr_err("buffer[%d] mm release buffer failed!\n", i);
726
+ pr_err("buffer[%d] mm release buffer failed! handle = %d\n",
727
+ i, external_buffer[i].handle);
745728
746729 goto err_free_external_buffer;
747730 }
....@@ -1140,8 +1123,8 @@
11401123 struct rga_session *session = NULL;
11411124
11421125 session = rga_session_init();
1143
- if (!session)
1144
- return -ENOMEM;
1126
+ if (IS_ERR(session))
1127
+ return PTR_ERR(session);
11451128
11461129 file->private_data = (void *)session;
11471130
....@@ -1157,97 +1140,39 @@
11571140 return 0;
11581141 }
11591142
1160
-static irqreturn_t rga3_irq_handler(int irq, void *data)
1143
+static irqreturn_t rga_irq_handler(int irq, void *data)
11611144 {
1145
+ irqreturn_t irq_ret = IRQ_NONE;
11621146 struct rga_scheduler_t *scheduler = data;
11631147
1164
- if (DEBUGGER_EN(INT_FLAG))
1165
- pr_info("irqthread INT[%x],STATS0[%x], STATS1[%x]\n",
1166
- rga_read(RGA3_INT_RAW, scheduler),
1167
- rga_read(RGA3_STATUS0, scheduler),
1168
- rga_read(RGA3_STATUS1, scheduler));
1148
+ if (scheduler->ops->irq)
1149
+ irq_ret = scheduler->ops->irq(scheduler);
11691150
1170
- /* TODO: if error interrupt then soft reset hardware */
1171
- //scheduler->ops->soft_reset(job->core);
1172
-
1173
- /*clear INT */
1174
- rga_write(1, RGA3_INT_CLR, scheduler);
1175
-
1176
- return IRQ_WAKE_THREAD;
1151
+ return irq_ret;
11771152 }
11781153
1179
-static irqreturn_t rga3_irq_thread(int irq, void *data)
1154
+static irqreturn_t rga_isr_thread(int irq, void *data)
11801155 {
1156
+ irqreturn_t irq_ret = IRQ_NONE;
11811157 struct rga_scheduler_t *scheduler = data;
11821158 struct rga_job *job;
11831159
1184
- job = scheduler->running_job;
1185
-
1186
- if (!job) {
1187
- pr_err("running job is invaild on irq thread\n");
1160
+ job = rga_job_done(scheduler);
1161
+ if (job == NULL) {
1162
+ pr_err("isr thread invalid job!\n");
11881163 return IRQ_HANDLED;
11891164 }
11901165
1191
- if (DEBUGGER_EN(INT_FLAG))
1192
- pr_info("irq INT[%x], STATS0[%x], STATS1[%x]\n",
1193
- rga_read(RGA3_INT_RAW, scheduler),
1194
- rga_read(RGA3_STATUS0, scheduler),
1195
- rga_read(RGA3_STATUS1, scheduler));
1166
+ if (scheduler->ops->isr_thread)
1167
+ irq_ret = scheduler->ops->isr_thread(job, scheduler);
11961168
1197
- rga_job_done(scheduler, 0);
1169
+ rga_request_release_signal(scheduler, job);
11981170
1199
- return IRQ_HANDLED;
1200
-}
1171
+ rga_job_next(scheduler);
12011172
1202
-static irqreturn_t rga2_irq_handler(int irq, void *data)
1203
-{
1204
- struct rga_scheduler_t *scheduler = data;
1173
+ rga_power_disable(scheduler);
12051174
1206
- if (DEBUGGER_EN(INT_FLAG))
1207
- pr_info("irqthread INT[%x],STATS0[%x]\n",
1208
- rga_read(RGA2_INT, scheduler), rga_read(RGA2_STATUS,
1209
- scheduler));
1210
-
1211
- /*if error interrupt then soft reset hardware */
1212
- //warning
1213
- if (rga_read(RGA2_INT, scheduler) & 0x01) {
1214
- pr_err("err irq! INT[%x],STATS0[%x]\n",
1215
- rga_read(RGA2_INT, scheduler),
1216
- rga_read(RGA2_STATUS, scheduler));
1217
- scheduler->ops->soft_reset(scheduler);
1218
- }
1219
-
1220
- /*clear INT */
1221
- rga_write(rga_read(RGA2_INT, scheduler) |
1222
- (0x1 << 4) | (0x1 << 5) | (0x1 << 6) | (0x1 << 7) |
1223
- (0x1 << 15) | (0x1 << 16), RGA2_INT, scheduler);
1224
-
1225
- return IRQ_WAKE_THREAD;
1226
-}
1227
-
1228
-static irqreturn_t rga2_irq_thread(int irq, void *data)
1229
-{
1230
- struct rga_scheduler_t *scheduler = data;
1231
- struct rga_job *job;
1232
-
1233
- job = scheduler->running_job;
1234
-
1235
- if (!job)
1236
- return IRQ_HANDLED;
1237
-
1238
- if (DEBUGGER_EN(INT_FLAG))
1239
- pr_info("irq INT[%x], STATS0[%x]\n",
1240
- rga_read(RGA2_INT, scheduler), rga_read(RGA2_STATUS,
1241
- scheduler));
1242
-
1243
- job->rga_command_base.osd_info.cur_flags0 = rga_read(RGA2_OSD_CUR_FLAGS0_OFFSET,
1244
- scheduler);
1245
- job->rga_command_base.osd_info.cur_flags1 = rga_read(RGA2_OSD_CUR_FLAGS1_OFFSET,
1246
- scheduler);
1247
-
1248
- rga_job_done(scheduler, 0);
1249
-
1250
- return IRQ_HANDLED;
1175
+ return irq_ret;
12511176 }
12521177
12531178 const struct file_operations rga_fops = {
....@@ -1290,44 +1215,24 @@
12901215 "clk_rga3_1",
12911216 };
12921217
1293
-static const struct rga_irqs_data_t single_rga2_irqs[] = {
1294
- {"rga2_irq", rga2_irq_handler, rga2_irq_thread}
1295
-};
1296
-
1297
-static const struct rga_irqs_data_t rga3_core0_irqs[] = {
1298
- {"rga3_core0_irq", rga3_irq_handler, rga3_irq_thread}
1299
-};
1300
-
1301
-static const struct rga_irqs_data_t rga3_core1_irqs[] = {
1302
- {"rga3_core1_irq", rga3_irq_handler, rga3_irq_thread}
1303
-};
1304
-
13051218 static const struct rga_match_data_t old_rga2_match_data = {
13061219 .clks = old_rga2_clks,
13071220 .num_clks = ARRAY_SIZE(old_rga2_clks),
1308
- .irqs = single_rga2_irqs,
1309
- .num_irqs = ARRAY_SIZE(single_rga2_irqs)
13101221 };
13111222
13121223 static const struct rga_match_data_t rk3588_rga2_match_data = {
13131224 .clks = rk3588_rga2_clks,
13141225 .num_clks = ARRAY_SIZE(rk3588_rga2_clks),
1315
- .irqs = single_rga2_irqs,
1316
- .num_irqs = ARRAY_SIZE(single_rga2_irqs)
13171226 };
13181227
13191228 static const struct rga_match_data_t rga3_core0_match_data = {
13201229 .clks = rga3_core_0_clks,
13211230 .num_clks = ARRAY_SIZE(rga3_core_0_clks),
1322
- .irqs = rga3_core0_irqs,
1323
- .num_irqs = ARRAY_SIZE(rga3_core0_irqs)
13241231 };
13251232
13261233 static const struct rga_match_data_t rga3_core1_match_data = {
13271234 .clks = rga3_core_1_clks,
13281235 .num_clks = ARRAY_SIZE(rga3_core_1_clks),
1329
- .irqs = rga3_core1_irqs,
1330
- .num_irqs = ARRAY_SIZE(rga3_core1_irqs)
13311236 };
13321237
13331238 static const struct of_device_id rga3_core0_dt_ids[] = {
....@@ -1439,21 +1344,21 @@
14391344 /* there are irq names in dts */
14401345 irq = platform_get_irq(pdev, 0);
14411346 if (irq < 0) {
1442
- dev_err(dev, "no irq %s in dts\n", match_data->irqs[0].name);
1347
+ dev_err(dev, "no irq %s in dts\n", dev_driver_string(dev));
14431348 return irq;
14441349 }
14451350
14461351 scheduler->irq = irq;
14471352
1448
- pr_info("%s, irq = %d, match scheduler\n", match_data->irqs[0].name, irq);
1353
+ pr_info("%s, irq = %d, match scheduler\n", dev_driver_string(dev), irq);
14491354
14501355 ret = devm_request_threaded_irq(dev, irq,
1451
- match_data->irqs[0].irq_hdl,
1452
- match_data->irqs[0].irq_thread,
1356
+ rga_irq_handler,
1357
+ rga_isr_thread,
14531358 IRQF_SHARED,
14541359 dev_driver_string(dev), scheduler);
14551360 if (ret < 0) {
1456
- pr_err("request irq name: %s failed: %d\n", match_data->irqs[0].name, ret);
1361
+ pr_err("request irq name: %s failed: %d\n", dev_driver_string(dev), ret);
14571362 return ret;
14581363 }
14591364
....@@ -1695,6 +1600,8 @@
16951600 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 0))
16961601 #ifdef CONFIG_ROCKCHIP_THUNDER_BOOT
16971602 module_init(rga_init);
1603
+#elif defined CONFIG_VIDEO_REVERSE_IMAGE
1604
+fs_initcall(rga_init);
16981605 #else
16991606 late_initcall(rga_init);
17001607 #endif