[vim3] Add aml-nna driver
Testability:added to device-enumeration-test
Manual testing on vim3:
src/graphics/lib/magma/scripts/test.sh vsi
Change-Id: Ide4f309a4b76d2f3536a4df33cb55a278f4a7cf3
Reviewed-on: https://fuchsia-review.googlesource.com/c/fuchsia/+/404707
Commit-Queue: Craig Stout <cstout@google.com>
Reviewed-by: Jocelyn Dang <jocelyndang@google.com>
Reviewed-by: P.Y. Laligand <pylaligand@google.com>
Testability-Review: Jocelyn Dang <jocelyndang@google.com>
diff --git a/boards/vim3.gni b/boards/vim3.gni
index 0773e4e..60bee13 100644
--- a/boards/vim3.gni
+++ b/boards/vim3.gni
@@ -6,6 +6,8 @@
board_name = "vim3"
+board_package_labels += [ "//garnet/packages/prod:magma-vsl-gc" ]
+
# partitions for fx flash to flash
zircon_a_partition = "zircon-a"
zircon_r_partition = "zircon-r"
diff --git a/src/devices/board/drivers/vim3/BUILD.gn b/src/devices/board/drivers/vim3/BUILD.gn
index 4a36d02..095d6da 100644
--- a/src/devices/board/drivers/vim3/BUILD.gn
+++ b/src/devices/board/drivers/vim3/BUILD.gn
@@ -18,6 +18,7 @@
"vim3-eth.cc",
"vim3-gpio.cc",
"vim3-i2c.cc",
+ "vim3-nna.cc",
"vim3-sd.cc",
"vim3-sdio.cc",
"vim3-sysmem.cc",
diff --git a/src/devices/board/drivers/vim3/vim3-nna.cc b/src/devices/board/drivers/vim3/vim3-nna.cc
new file mode 100644
index 0000000..1545f38
--- /dev/null
+++ b/src/devices/board/drivers/vim3/vim3-nna.cc
@@ -0,0 +1,75 @@
+// Copyright 2020 The Fuchsia Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <ddk/debug.h>
+#include <ddk/device.h>
+#include <ddk/platform-defs.h>
+#include <ddk/protocol/platform/bus.h>
+#include <soc/aml-a311d/a311d-hw.h>
+
+#include "vim3.h"
+
+namespace vim3 {
+
+static pbus_mmio_t vim3_nna_mmios[] = {
+ {
+ .base = A311D_NNA_BASE,
+ .length = A311D_NNA_LENGTH,
+ },
+ // HIU for clocks.
+ {
+ .base = A311D_HIU_BASE,
+ .length = A311D_HIU_LENGTH,
+ },
+ // Power domain
+ {
+ .base = A311D_POWER_DOMAIN_BASE,
+ .length = A311D_POWER_DOMAIN_LENGTH,
+ },
+ // Memory PD
+ {
+ .base = A311D_MEMORY_PD_BASE,
+ .length = A311D_MEMORY_PD_LENGTH,
+ },
+};
+
+static pbus_bti_t nna_btis[] = {
+ {
+ .iommu_index = 0,
+ .bti_id = BTI_NNA,
+ },
+};
+
+static pbus_irq_t nna_irqs[] = {
+ {
+ .irq = A311D_NNA_IRQ,
+ .mode = ZX_INTERRUPT_MODE_LEVEL_HIGH,
+ },
+};
+
+static pbus_dev_t nna_dev = []() {
+ pbus_dev_t dev = {};
+ dev.name = "aml-nna";
+ dev.vid = PDEV_VID_AMLOGIC;
+ dev.pid = PDEV_PID_AMLOGIC_A311D;
+ dev.did = PDEV_DID_AMLOGIC_NNA;
+ dev.mmio_list = vim3_nna_mmios;
+ dev.mmio_count = countof(vim3_nna_mmios);
+ dev.bti_list = nna_btis;
+ dev.bti_count = countof(nna_btis);
+ dev.irq_list = nna_irqs;
+ dev.irq_count = countof(nna_irqs);
+ return dev;
+}();
+
+zx_status_t Vim3::NnaInit() {
+ zx_status_t status = pbus_.DeviceAdd(&nna_dev);
+ if (status != ZX_OK) {
+ zxlogf(ERROR, "Vim3::NnaInit: pbus_device_add() failed for nna: %d", status);
+ return status;
+ }
+ return ZX_OK;
+}
+
+} // namespace vim3
diff --git a/src/devices/board/drivers/vim3/vim3.cc b/src/devices/board/drivers/vim3/vim3.cc
index afc122c..5b4fbbd 100644
--- a/src/devices/board/drivers/vim3/vim3.cc
+++ b/src/devices/board/drivers/vim3/vim3.cc
@@ -99,6 +99,11 @@
init_txn_->Reply(ZX_ERR_INTERNAL);
return status;
}
+ if ((status = NnaInit()) != ZX_OK) {
+ zxlogf(ERROR, "NnaInit() failed: %d", status);
+ init_txn_->Reply(ZX_ERR_INTERNAL);
+ return status;
+ }
init_txn_->Reply(status);
return ZX_OK;
}
diff --git a/src/devices/board/drivers/vim3/vim3.h b/src/devices/board/drivers/vim3/vim3.h
index c0bb528..22f6dd3 100644
--- a/src/devices/board/drivers/vim3/vim3.h
+++ b/src/devices/board/drivers/vim3/vim3.h
@@ -27,6 +27,7 @@
BTI_SD,
BTI_SDIO,
BTI_SYSMEM,
+ BTI_NNA,
};
class Vim3;
@@ -56,6 +57,7 @@
zx_status_t SdioInit();
zx_status_t Start();
zx_status_t SysmemInit();
+ zx_status_t NnaInit();
int Thread();
diff --git a/src/devices/lib/amlogic/include/soc/aml-a311d/a311d-hw.h b/src/devices/lib/amlogic/include/soc/aml-a311d/a311d-hw.h
index 0599946..033e259 100644
--- a/src/devices/lib/amlogic/include/soc/aml-a311d/a311d-hw.h
+++ b/src/devices/lib/amlogic/include/soc/aml-a311d/a311d-hw.h
@@ -45,14 +45,26 @@
#define A311D_ETH_MAC_BASE 0xff3f0000
#define A311D_ETH_MAC_LENGTH 0x10000
-//eMMC
-#define A311D_EMMC_A_BASE 0xffe03000
+// eMMC
+#define A311D_EMMC_A_BASE 0xffe03000
#define A311D_EMMC_A_LENGTH 0x2000
-#define A311D_EMMC_B_BASE 0xffe05000
+#define A311D_EMMC_B_BASE 0xffe05000
#define A311D_EMMC_B_LENGTH 0x2000
-#define A311D_EMMC_C_BASE 0xffe07000
+#define A311D_EMMC_C_BASE 0xffe07000
#define A311D_EMMC_C_LENGTH 0x2000
+// NNA
+#define A311D_NNA_BASE 0xFF100000
+#define A311D_NNA_LENGTH 0x30000
+
+// Power domain
+#define A311D_POWER_DOMAIN_BASE 0xff800000
+#define A311D_POWER_DOMAIN_LENGTH 0x1000
+
+// Memory Power Domain
+#define A311D_MEMORY_PD_BASE 0xff63c000
+#define A311D_MEMORY_PD_LENGTH 0x1000
+
// IRQs
#define A311D_VIU1_VSYNC_IRQ 35
#define A311D_ETH_GMAC_IRQ 40
@@ -82,6 +94,7 @@
#define A311D_RDMA_DONE 121
#define A311D_SPICC1_IRQ 122
#define A311D_UART2_IRQ 125
+#define A311D_NNA_IRQ 179
#define A311D_MALI_IRQ_GP 192
#define A311D_MALI_IRQ_GPMMU 193
#define A311D_MALI_IRQ_PP 194
diff --git a/src/devices/ml/drivers/aml-nna/aml-nna.cc b/src/devices/ml/drivers/aml-nna/aml-nna.cc
index 0f25264..0cbe6e4 100644
--- a/src/devices/ml/drivers/aml-nna/aml-nna.cc
+++ b/src/devices/ml/drivers/aml-nna/aml-nna.cc
@@ -152,8 +152,9 @@
} // namespace aml_nna
// clang-format off
-ZIRCON_DRIVER_BEGIN(aml_nna, aml_nna::driver_ops, "zircon", "0.1", 3)
+ZIRCON_DRIVER_BEGIN(aml_nna, aml_nna::driver_ops, "zircon", "0.1", 4)
BI_ABORT_IF(NE, BIND_PLATFORM_DEV_VID, PDEV_VID_AMLOGIC),
- BI_ABORT_IF(NE, BIND_PLATFORM_DEV_PID, PDEV_PID_AMLOGIC_T931),
- BI_MATCH_IF(EQ, BIND_PLATFORM_DEV_DID, PDEV_DID_AMLOGIC_NNA),
+ BI_ABORT_IF(NE, BIND_PLATFORM_DEV_DID, PDEV_DID_AMLOGIC_NNA),
+ BI_MATCH_IF(EQ, BIND_PLATFORM_DEV_PID, PDEV_PID_AMLOGIC_T931),
+ BI_MATCH_IF(EQ, BIND_PLATFORM_DEV_PID, PDEV_PID_AMLOGIC_A311D),
ZIRCON_DRIVER_END(aml_nna)
diff --git a/zircon/system/utest/device-enumeration/main.cc b/zircon/system/utest/device-enumeration/main.cc
index 79a401e..fecbcc1 100644
--- a/zircon/system/utest/device-enumeration/main.cc
+++ b/zircon/system/utest/device-enumeration/main.cc
@@ -206,6 +206,7 @@
"aml_sd/aml-sd-emmc",
"aml_sdio/aml-sd-emmc/sdmmc/sdmmc-sdio/sdmmc-sdio-1",
"aml_sdio/aml-sd-emmc/sdmmc/sdmmc-sdio/sdmmc-sdio-2",
+ "sys/platform/05:06:1c/aml-nna",
};
ASSERT_NO_FATAL_FAILURES(TestRunner(kDevicePaths, std::size(kDevicePaths)));
@@ -431,7 +432,7 @@
"sherlock-sd-emmc/aml-sd-emmc/sdmmc/sdmmc-sdio/sdmmc-sdio-2",
"wifi/brcmfmac-wlanphy",
"sys/platform/05:04:15/aml-mipi",
- "sys/platform/05:04:1c", // nna
+ "sys/platform/05:04:1c/aml-nna",
"sys/platform/05:04:1d", // pwm
"gdc",
"ge2d",