[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",