hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/media/platform/qcom/venus/hfi_venus.c
....@@ -345,16 +345,6 @@
345345 dma_free_attrs(dev, mem->size, mem->kva, mem->da, mem->attrs);
346346 }
347347
348
-static void venus_writel(struct venus_hfi_device *hdev, u32 reg, u32 value)
349
-{
350
- writel(value, hdev->core->base + reg);
351
-}
352
-
353
-static u32 venus_readl(struct venus_hfi_device *hdev, u32 reg)
354
-{
355
- return readl(hdev->core->base + reg);
356
-}
357
-
358348 static void venus_set_registers(struct venus_hfi_device *hdev)
359349 {
360350 const struct venus_resources *res = hdev->core->res;
....@@ -363,12 +353,14 @@
363353 unsigned int i;
364354
365355 for (i = 0; i < count; i++)
366
- venus_writel(hdev, tbl[i].reg, tbl[i].value);
356
+ writel(tbl[i].value, hdev->core->base + tbl[i].reg);
367357 }
368358
369359 static void venus_soft_int(struct venus_hfi_device *hdev)
370360 {
371
- venus_writel(hdev, CPU_IC_SOFTINT, BIT(CPU_IC_SOFTINT_H2A_SHIFT));
361
+ void __iomem *cpu_ic_base = hdev->core->cpu_ic_base;
362
+
363
+ writel(BIT(CPU_IC_SOFTINT_H2A_SHIFT), cpu_ic_base + CPU_IC_SOFTINT);
372364 }
373365
374366 static int venus_iface_cmdq_write_nolock(struct venus_hfi_device *hdev,
....@@ -439,16 +431,25 @@
439431 {
440432 struct device *dev = hdev->core->dev;
441433 static const unsigned int max_tries = 100;
442
- u32 ctrl_status = 0;
434
+ u32 ctrl_status = 0, mask_val;
443435 unsigned int count = 0;
436
+ void __iomem *cpu_cs_base = hdev->core->cpu_cs_base;
437
+ void __iomem *wrapper_base = hdev->core->wrapper_base;
444438 int ret = 0;
445439
446
- venus_writel(hdev, VIDC_CTRL_INIT, BIT(VIDC_CTRL_INIT_CTRL_SHIFT));
447
- venus_writel(hdev, WRAPPER_INTR_MASK, WRAPPER_INTR_MASK_A2HVCODEC_MASK);
448
- venus_writel(hdev, CPU_CS_SCIACMDARG3, 1);
440
+ if (IS_V6(hdev->core)) {
441
+ mask_val = readl(wrapper_base + WRAPPER_INTR_MASK);
442
+ mask_val &= ~(WRAPPER_INTR_MASK_A2HWD_BASK_V6 |
443
+ WRAPPER_INTR_MASK_A2HCPU_MASK);
444
+ } else {
445
+ mask_val = WRAPPER_INTR_MASK_A2HVCODEC_MASK;
446
+ }
447
+ writel(mask_val, wrapper_base + WRAPPER_INTR_MASK);
448
+ writel(1, cpu_cs_base + CPU_CS_SCIACMDARG3);
449449
450
+ writel(BIT(VIDC_CTRL_INIT_CTRL_SHIFT), cpu_cs_base + VIDC_CTRL_INIT);
450451 while (!ctrl_status && count < max_tries) {
451
- ctrl_status = venus_readl(hdev, CPU_CS_SCIACMDARG0);
452
+ ctrl_status = readl(cpu_cs_base + CPU_CS_SCIACMDARG0);
452453 if ((ctrl_status & CPU_CS_SCIACMDARG0_ERROR_STATUS_MASK) == 4) {
453454 dev_err(dev, "invalid setting for UC_REGION\n");
454455 ret = -EINVAL;
....@@ -462,15 +463,20 @@
462463 if (count >= max_tries)
463464 ret = -ETIMEDOUT;
464465
466
+ if (IS_V6(hdev->core))
467
+ writel(0x0, cpu_cs_base + CPU_CS_X2RPMH_V6);
468
+
465469 return ret;
466470 }
467471
468472 static u32 venus_hwversion(struct venus_hfi_device *hdev)
469473 {
470474 struct device *dev = hdev->core->dev;
471
- u32 ver = venus_readl(hdev, WRAPPER_HW_VERSION);
475
+ void __iomem *wrapper_base = hdev->core->wrapper_base;
476
+ u32 ver;
472477 u32 major, minor, step;
473478
479
+ ver = readl(wrapper_base + WRAPPER_HW_VERSION);
474480 major = ver & WRAPPER_HW_VERSION_MAJOR_VERSION_MASK;
475481 major = major >> WRAPPER_HW_VERSION_MAJOR_VERSION_SHIFT;
476482 minor = ver & WRAPPER_HW_VERSION_MINOR_VERSION_MASK;
....@@ -485,6 +491,7 @@
485491 static int venus_run(struct venus_hfi_device *hdev)
486492 {
487493 struct device *dev = hdev->core->dev;
494
+ void __iomem *cpu_cs_base = hdev->core->cpu_cs_base;
488495 int ret;
489496
490497 /*
....@@ -493,12 +500,12 @@
493500 */
494501 venus_set_registers(hdev);
495502
496
- venus_writel(hdev, UC_REGION_ADDR, hdev->ifaceq_table.da);
497
- venus_writel(hdev, UC_REGION_SIZE, SHARED_QSIZE);
498
- venus_writel(hdev, CPU_CS_SCIACMDARG2, hdev->ifaceq_table.da);
499
- venus_writel(hdev, CPU_CS_SCIACMDARG1, 0x01);
503
+ writel(hdev->ifaceq_table.da, cpu_cs_base + UC_REGION_ADDR);
504
+ writel(SHARED_QSIZE, cpu_cs_base + UC_REGION_SIZE);
505
+ writel(hdev->ifaceq_table.da, cpu_cs_base + CPU_CS_SCIACMDARG2);
506
+ writel(0x01, cpu_cs_base + CPU_CS_SCIACMDARG1);
500507 if (hdev->sfr.da)
501
- venus_writel(hdev, SFR_ADDR, hdev->sfr.da);
508
+ writel(hdev->sfr.da, cpu_cs_base + SFR_ADDR);
502509
503510 ret = venus_boot_core(hdev);
504511 if (ret) {
....@@ -513,17 +520,18 @@
513520
514521 static int venus_halt_axi(struct venus_hfi_device *hdev)
515522 {
516
- void __iomem *base = hdev->core->base;
523
+ void __iomem *wrapper_base = hdev->core->wrapper_base;
524
+ void __iomem *vbif_base = hdev->core->vbif_base;
517525 struct device *dev = hdev->core->dev;
518526 u32 val;
519527 int ret;
520528
521529 if (IS_V4(hdev->core)) {
522
- val = venus_readl(hdev, WRAPPER_CPU_AXI_HALT);
530
+ val = readl(wrapper_base + WRAPPER_CPU_AXI_HALT);
523531 val |= WRAPPER_CPU_AXI_HALT_HALT;
524
- venus_writel(hdev, WRAPPER_CPU_AXI_HALT, val);
532
+ writel(val, wrapper_base + WRAPPER_CPU_AXI_HALT);
525533
526
- ret = readl_poll_timeout(base + WRAPPER_CPU_AXI_HALT_STATUS,
534
+ ret = readl_poll_timeout(wrapper_base + WRAPPER_CPU_AXI_HALT_STATUS,
527535 val,
528536 val & WRAPPER_CPU_AXI_HALT_STATUS_IDLE,
529537 POLL_INTERVAL_US,
....@@ -537,12 +545,12 @@
537545 }
538546
539547 /* Halt AXI and AXI IMEM VBIF Access */
540
- val = venus_readl(hdev, VBIF_AXI_HALT_CTRL0);
548
+ val = readl(vbif_base + VBIF_AXI_HALT_CTRL0);
541549 val |= VBIF_AXI_HALT_CTRL0_HALT_REQ;
542
- venus_writel(hdev, VBIF_AXI_HALT_CTRL0, val);
550
+ writel(val, vbif_base + VBIF_AXI_HALT_CTRL0);
543551
544552 /* Request for AXI bus port halt */
545
- ret = readl_poll_timeout(base + VBIF_AXI_HALT_CTRL1, val,
553
+ ret = readl_poll_timeout(vbif_base + VBIF_AXI_HALT_CTRL1, val,
546554 val & VBIF_AXI_HALT_CTRL1_HALT_ACK,
547555 POLL_INTERVAL_US,
548556 VBIF_AXI_HALT_ACK_TIMEOUT_US);
....@@ -1035,19 +1043,21 @@
10351043 {
10361044 struct venus_hfi_device *hdev = to_hfi_priv(core);
10371045 u32 status;
1046
+ void __iomem *cpu_cs_base = hdev->core->cpu_cs_base;
1047
+ void __iomem *wrapper_base = hdev->core->wrapper_base;
10381048
10391049 if (!hdev)
10401050 return IRQ_NONE;
10411051
1042
- status = venus_readl(hdev, WRAPPER_INTR_STATUS);
1052
+ status = readl(wrapper_base + WRAPPER_INTR_STATUS);
10431053
10441054 if (status & WRAPPER_INTR_STATUS_A2H_MASK ||
10451055 status & WRAPPER_INTR_STATUS_A2HWD_MASK ||
10461056 status & CPU_CS_SCIACMDARG0_INIT_IDLE_MSG_MASK)
10471057 hdev->irq_status = status;
10481058
1049
- venus_writel(hdev, CPU_CS_A2HSOFTINTCLR, 1);
1050
- venus_writel(hdev, WRAPPER_INTR_CLEAR, status);
1059
+ writel(1, cpu_cs_base + CPU_CS_A2HSOFTINTCLR);
1060
+ writel(status, wrapper_base + WRAPPER_INTR_CLEAR);
10511061
10521062 return IRQ_WAKE_THREAD;
10531063 }
....@@ -1380,6 +1390,7 @@
13801390 {
13811391 struct venus_hfi_device *hdev = to_hfi_priv(core);
13821392 struct device *dev = core->dev;
1393
+ void __iomem *cpu_cs_base = hdev->core->cpu_cs_base;
13831394 u32 ctrl_status;
13841395 int ret;
13851396
....@@ -1414,7 +1425,7 @@
14141425 return -EINVAL;
14151426 }
14161427
1417
- ctrl_status = venus_readl(hdev, CPU_CS_SCIACMDARG0);
1428
+ ctrl_status = readl(cpu_cs_base + CPU_CS_SCIACMDARG0);
14181429 if (!(ctrl_status & CPU_CS_SCIACMDARG0_PC_READY)) {
14191430 mutex_unlock(&hdev->lock);
14201431 return -EINVAL;
....@@ -1435,10 +1446,12 @@
14351446
14361447 static bool venus_cpu_and_video_core_idle(struct venus_hfi_device *hdev)
14371448 {
1449
+ void __iomem *wrapper_base = hdev->core->wrapper_base;
1450
+ void __iomem *cpu_cs_base = hdev->core->cpu_cs_base;
14381451 u32 ctrl_status, cpu_status;
14391452
1440
- cpu_status = venus_readl(hdev, WRAPPER_CPU_STATUS);
1441
- ctrl_status = venus_readl(hdev, CPU_CS_SCIACMDARG0);
1453
+ cpu_status = readl(wrapper_base + WRAPPER_CPU_STATUS);
1454
+ ctrl_status = readl(cpu_cs_base + CPU_CS_SCIACMDARG0);
14421455
14431456 if (cpu_status & WRAPPER_CPU_STATUS_WFI &&
14441457 ctrl_status & CPU_CS_SCIACMDARG0_INIT_IDLE_MSG_MASK)
....@@ -1449,10 +1462,12 @@
14491462
14501463 static bool venus_cpu_idle_and_pc_ready(struct venus_hfi_device *hdev)
14511464 {
1465
+ void __iomem *wrapper_base = hdev->core->wrapper_base;
1466
+ void __iomem *cpu_cs_base = hdev->core->cpu_cs_base;
14521467 u32 ctrl_status, cpu_status;
14531468
1454
- cpu_status = venus_readl(hdev, WRAPPER_CPU_STATUS);
1455
- ctrl_status = venus_readl(hdev, CPU_CS_SCIACMDARG0);
1469
+ cpu_status = readl(wrapper_base + WRAPPER_CPU_STATUS);
1470
+ ctrl_status = readl(cpu_cs_base + CPU_CS_SCIACMDARG0);
14561471
14571472 if (cpu_status & WRAPPER_CPU_STATUS_WFI &&
14581473 ctrl_status & CPU_CS_SCIACMDARG0_PC_READY)
....@@ -1465,6 +1480,7 @@
14651480 {
14661481 struct venus_hfi_device *hdev = to_hfi_priv(core);
14671482 struct device *dev = core->dev;
1483
+ void __iomem *cpu_cs_base = hdev->core->cpu_cs_base;
14681484 u32 ctrl_status;
14691485 bool val;
14701486 int ret;
....@@ -1481,7 +1497,7 @@
14811497 return -EINVAL;
14821498 }
14831499
1484
- ctrl_status = venus_readl(hdev, CPU_CS_SCIACMDARG0);
1500
+ ctrl_status = readl(cpu_cs_base + CPU_CS_SCIACMDARG0);
14851501 if (ctrl_status & CPU_CS_SCIACMDARG0_PC_READY)
14861502 goto power_off;
14871503