.. | .. |
---|
345 | 345 | dma_free_attrs(dev, mem->size, mem->kva, mem->da, mem->attrs); |
---|
346 | 346 | } |
---|
347 | 347 | |
---|
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 | | - |
---|
358 | 348 | static void venus_set_registers(struct venus_hfi_device *hdev) |
---|
359 | 349 | { |
---|
360 | 350 | const struct venus_resources *res = hdev->core->res; |
---|
.. | .. |
---|
363 | 353 | unsigned int i; |
---|
364 | 354 | |
---|
365 | 355 | 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); |
---|
367 | 357 | } |
---|
368 | 358 | |
---|
369 | 359 | static void venus_soft_int(struct venus_hfi_device *hdev) |
---|
370 | 360 | { |
---|
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); |
---|
372 | 364 | } |
---|
373 | 365 | |
---|
374 | 366 | static int venus_iface_cmdq_write_nolock(struct venus_hfi_device *hdev, |
---|
.. | .. |
---|
439 | 431 | { |
---|
440 | 432 | struct device *dev = hdev->core->dev; |
---|
441 | 433 | static const unsigned int max_tries = 100; |
---|
442 | | - u32 ctrl_status = 0; |
---|
| 434 | + u32 ctrl_status = 0, mask_val; |
---|
443 | 435 | unsigned int count = 0; |
---|
| 436 | + void __iomem *cpu_cs_base = hdev->core->cpu_cs_base; |
---|
| 437 | + void __iomem *wrapper_base = hdev->core->wrapper_base; |
---|
444 | 438 | int ret = 0; |
---|
445 | 439 | |
---|
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); |
---|
449 | 449 | |
---|
| 450 | + writel(BIT(VIDC_CTRL_INIT_CTRL_SHIFT), cpu_cs_base + VIDC_CTRL_INIT); |
---|
450 | 451 | 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); |
---|
452 | 453 | if ((ctrl_status & CPU_CS_SCIACMDARG0_ERROR_STATUS_MASK) == 4) { |
---|
453 | 454 | dev_err(dev, "invalid setting for UC_REGION\n"); |
---|
454 | 455 | ret = -EINVAL; |
---|
.. | .. |
---|
462 | 463 | if (count >= max_tries) |
---|
463 | 464 | ret = -ETIMEDOUT; |
---|
464 | 465 | |
---|
| 466 | + if (IS_V6(hdev->core)) |
---|
| 467 | + writel(0x0, cpu_cs_base + CPU_CS_X2RPMH_V6); |
---|
| 468 | + |
---|
465 | 469 | return ret; |
---|
466 | 470 | } |
---|
467 | 471 | |
---|
468 | 472 | static u32 venus_hwversion(struct venus_hfi_device *hdev) |
---|
469 | 473 | { |
---|
470 | 474 | 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; |
---|
472 | 477 | u32 major, minor, step; |
---|
473 | 478 | |
---|
| 479 | + ver = readl(wrapper_base + WRAPPER_HW_VERSION); |
---|
474 | 480 | major = ver & WRAPPER_HW_VERSION_MAJOR_VERSION_MASK; |
---|
475 | 481 | major = major >> WRAPPER_HW_VERSION_MAJOR_VERSION_SHIFT; |
---|
476 | 482 | minor = ver & WRAPPER_HW_VERSION_MINOR_VERSION_MASK; |
---|
.. | .. |
---|
485 | 491 | static int venus_run(struct venus_hfi_device *hdev) |
---|
486 | 492 | { |
---|
487 | 493 | struct device *dev = hdev->core->dev; |
---|
| 494 | + void __iomem *cpu_cs_base = hdev->core->cpu_cs_base; |
---|
488 | 495 | int ret; |
---|
489 | 496 | |
---|
490 | 497 | /* |
---|
.. | .. |
---|
493 | 500 | */ |
---|
494 | 501 | venus_set_registers(hdev); |
---|
495 | 502 | |
---|
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); |
---|
500 | 507 | if (hdev->sfr.da) |
---|
501 | | - venus_writel(hdev, SFR_ADDR, hdev->sfr.da); |
---|
| 508 | + writel(hdev->sfr.da, cpu_cs_base + SFR_ADDR); |
---|
502 | 509 | |
---|
503 | 510 | ret = venus_boot_core(hdev); |
---|
504 | 511 | if (ret) { |
---|
.. | .. |
---|
513 | 520 | |
---|
514 | 521 | static int venus_halt_axi(struct venus_hfi_device *hdev) |
---|
515 | 522 | { |
---|
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; |
---|
517 | 525 | struct device *dev = hdev->core->dev; |
---|
518 | 526 | u32 val; |
---|
519 | 527 | int ret; |
---|
520 | 528 | |
---|
521 | 529 | if (IS_V4(hdev->core)) { |
---|
522 | | - val = venus_readl(hdev, WRAPPER_CPU_AXI_HALT); |
---|
| 530 | + val = readl(wrapper_base + WRAPPER_CPU_AXI_HALT); |
---|
523 | 531 | val |= WRAPPER_CPU_AXI_HALT_HALT; |
---|
524 | | - venus_writel(hdev, WRAPPER_CPU_AXI_HALT, val); |
---|
| 532 | + writel(val, wrapper_base + WRAPPER_CPU_AXI_HALT); |
---|
525 | 533 | |
---|
526 | | - ret = readl_poll_timeout(base + WRAPPER_CPU_AXI_HALT_STATUS, |
---|
| 534 | + ret = readl_poll_timeout(wrapper_base + WRAPPER_CPU_AXI_HALT_STATUS, |
---|
527 | 535 | val, |
---|
528 | 536 | val & WRAPPER_CPU_AXI_HALT_STATUS_IDLE, |
---|
529 | 537 | POLL_INTERVAL_US, |
---|
.. | .. |
---|
537 | 545 | } |
---|
538 | 546 | |
---|
539 | 547 | /* 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); |
---|
541 | 549 | 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); |
---|
543 | 551 | |
---|
544 | 552 | /* 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, |
---|
546 | 554 | val & VBIF_AXI_HALT_CTRL1_HALT_ACK, |
---|
547 | 555 | POLL_INTERVAL_US, |
---|
548 | 556 | VBIF_AXI_HALT_ACK_TIMEOUT_US); |
---|
.. | .. |
---|
1035 | 1043 | { |
---|
1036 | 1044 | struct venus_hfi_device *hdev = to_hfi_priv(core); |
---|
1037 | 1045 | u32 status; |
---|
| 1046 | + void __iomem *cpu_cs_base = hdev->core->cpu_cs_base; |
---|
| 1047 | + void __iomem *wrapper_base = hdev->core->wrapper_base; |
---|
1038 | 1048 | |
---|
1039 | 1049 | if (!hdev) |
---|
1040 | 1050 | return IRQ_NONE; |
---|
1041 | 1051 | |
---|
1042 | | - status = venus_readl(hdev, WRAPPER_INTR_STATUS); |
---|
| 1052 | + status = readl(wrapper_base + WRAPPER_INTR_STATUS); |
---|
1043 | 1053 | |
---|
1044 | 1054 | if (status & WRAPPER_INTR_STATUS_A2H_MASK || |
---|
1045 | 1055 | status & WRAPPER_INTR_STATUS_A2HWD_MASK || |
---|
1046 | 1056 | status & CPU_CS_SCIACMDARG0_INIT_IDLE_MSG_MASK) |
---|
1047 | 1057 | hdev->irq_status = status; |
---|
1048 | 1058 | |
---|
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); |
---|
1051 | 1061 | |
---|
1052 | 1062 | return IRQ_WAKE_THREAD; |
---|
1053 | 1063 | } |
---|
.. | .. |
---|
1380 | 1390 | { |
---|
1381 | 1391 | struct venus_hfi_device *hdev = to_hfi_priv(core); |
---|
1382 | 1392 | struct device *dev = core->dev; |
---|
| 1393 | + void __iomem *cpu_cs_base = hdev->core->cpu_cs_base; |
---|
1383 | 1394 | u32 ctrl_status; |
---|
1384 | 1395 | int ret; |
---|
1385 | 1396 | |
---|
.. | .. |
---|
1414 | 1425 | return -EINVAL; |
---|
1415 | 1426 | } |
---|
1416 | 1427 | |
---|
1417 | | - ctrl_status = venus_readl(hdev, CPU_CS_SCIACMDARG0); |
---|
| 1428 | + ctrl_status = readl(cpu_cs_base + CPU_CS_SCIACMDARG0); |
---|
1418 | 1429 | if (!(ctrl_status & CPU_CS_SCIACMDARG0_PC_READY)) { |
---|
1419 | 1430 | mutex_unlock(&hdev->lock); |
---|
1420 | 1431 | return -EINVAL; |
---|
.. | .. |
---|
1435 | 1446 | |
---|
1436 | 1447 | static bool venus_cpu_and_video_core_idle(struct venus_hfi_device *hdev) |
---|
1437 | 1448 | { |
---|
| 1449 | + void __iomem *wrapper_base = hdev->core->wrapper_base; |
---|
| 1450 | + void __iomem *cpu_cs_base = hdev->core->cpu_cs_base; |
---|
1438 | 1451 | u32 ctrl_status, cpu_status; |
---|
1439 | 1452 | |
---|
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); |
---|
1442 | 1455 | |
---|
1443 | 1456 | if (cpu_status & WRAPPER_CPU_STATUS_WFI && |
---|
1444 | 1457 | ctrl_status & CPU_CS_SCIACMDARG0_INIT_IDLE_MSG_MASK) |
---|
.. | .. |
---|
1449 | 1462 | |
---|
1450 | 1463 | static bool venus_cpu_idle_and_pc_ready(struct venus_hfi_device *hdev) |
---|
1451 | 1464 | { |
---|
| 1465 | + void __iomem *wrapper_base = hdev->core->wrapper_base; |
---|
| 1466 | + void __iomem *cpu_cs_base = hdev->core->cpu_cs_base; |
---|
1452 | 1467 | u32 ctrl_status, cpu_status; |
---|
1453 | 1468 | |
---|
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); |
---|
1456 | 1471 | |
---|
1457 | 1472 | if (cpu_status & WRAPPER_CPU_STATUS_WFI && |
---|
1458 | 1473 | ctrl_status & CPU_CS_SCIACMDARG0_PC_READY) |
---|
.. | .. |
---|
1465 | 1480 | { |
---|
1466 | 1481 | struct venus_hfi_device *hdev = to_hfi_priv(core); |
---|
1467 | 1482 | struct device *dev = core->dev; |
---|
| 1483 | + void __iomem *cpu_cs_base = hdev->core->cpu_cs_base; |
---|
1468 | 1484 | u32 ctrl_status; |
---|
1469 | 1485 | bool val; |
---|
1470 | 1486 | int ret; |
---|
.. | .. |
---|
1481 | 1497 | return -EINVAL; |
---|
1482 | 1498 | } |
---|
1483 | 1499 | |
---|
1484 | | - ctrl_status = venus_readl(hdev, CPU_CS_SCIACMDARG0); |
---|
| 1500 | + ctrl_status = readl(cpu_cs_base + CPU_CS_SCIACMDARG0); |
---|
1485 | 1501 | if (ctrl_status & CPU_CS_SCIACMDARG0_PC_READY) |
---|
1486 | 1502 | goto power_off; |
---|
1487 | 1503 | |
---|