[sherlock][usb-phy] move to registers device

Test: registers-test
      aml-usb-phy-test

Bug: fxb/34041

Change-Id: Iffdc20f25755629507e58904b5e75d3e50ab82f9
Reviewed-on: https://fuchsia-review.googlesource.com/c/fuchsia/+/439675
Reviewed-by: Brian Bosak <bbosak@google.com>
Reviewed-by: Suraj Malhotra <surajmalhotra@google.com>
Testability-Review: Suraj Malhotra <surajmalhotra@google.com>
Commit-Queue: Ruby Zhuang <rdzhuang@google.com>
diff --git a/src/devices/board/drivers/sherlock/BUILD.gn b/src/devices/board/drivers/sherlock/BUILD.gn
index 37688c4..345ee9a 100644
--- a/src/devices/board/drivers/sherlock/BUILD.gn
+++ b/src/devices/board/drivers/sherlock/BUILD.gn
@@ -97,6 +97,7 @@
       "//src/devices/lib/broadcom",
       "//src/devices/lib/driver",
       "//src/devices/lib/focaltech",
+      "//src/devices/lib/metadata:llcpp",
       "//src/devices/lib/mmio",
       "//src/devices/lib/thermal",
       "//src/devices/lib/ti",
diff --git a/src/devices/board/drivers/sherlock/sherlock-registers.cc b/src/devices/board/drivers/sherlock/sherlock-registers.cc
index c4451d1..54f563b 100644
--- a/src/devices/board/drivers/sherlock/sherlock-registers.cc
+++ b/src/devices/board/drivers/sherlock/sherlock-registers.cc
@@ -10,34 +10,71 @@
 #include <soc/aml-common/aml-registers.h>
 
 #include "sherlock.h"
+#include "src/devices/lib/metadata/llcpp/registers.h"
 
 namespace sherlock {
 
+namespace {
+
+enum MmioMetadataIdx {
+#ifdef FACTORY_BUILD
+  USB_FACTORY_MMIO,
+#endif  // FACTORY_BUILD
+
+  MMIO_COUNT,
+};
+
+}  // namespace
+
 zx_status_t Sherlock::RegistersInit() {
-  static const pbus_mmio_t registers_mmios[] = {};
+  const pbus_mmio_t registers_mmios[] = {
+#ifdef FACTORY_BUILD
+      {
+          .base = T931_USB_BASE,
+          .length = T931_USB_LENGTH,
+      },
+#endif  // FACTORY_BUILD
+  };
 
-  static const fidl_outgoing_msg_t metadata{};
+  auto mmio_entries = std::make_unique<registers::MmioMetadataEntry[]>(MMIO_COUNT);
+  auto register_entries =
+      std::make_unique<registers::RegistersMetadataEntry[]>(registers::REGISTER_ID_COUNT);
 
-  static const pbus_metadata_t registers_metadata[] = {
+#ifdef FACTORY_BUILD
+  mmio_entries[USB_FACTORY_MMIO] = registers::BuildMetadata(T931_USB_BASE);
+
+  register_entries[registers::REGISTER_USB_PHY_FACTORY] = registers::BuildMetadata(
+      registers::REGISTER_USB_PHY_FACTORY, T931_USB_BASE,
+      std::vector<std::pair<uint32_t, uint32_t>>{{0xFFFFFFFF, T931_USB_LENGTH / sizeof(uint32_t)}});
+#endif  // FACTORY_BUILD
+
+  auto metadata =
+      registers::BuildMetadata(std::move(mmio_entries), MMIO_COUNT, std::move(register_entries),
+                               registers::REGISTER_ID_COUNT);
+  fidl::OwnedOutgoingMessage<registers::Metadata> encoded_metadata(&metadata);
+  if (!encoded_metadata.ok() || (encoded_metadata.error() != nullptr)) {
+    zxlogf(ERROR, "%s: Could not build metadata %s\n", __FILE__, encoded_metadata.error());
+    return encoded_metadata.status();
+  }
+
+  const pbus_metadata_t registers_metadata[] = {
       {
           .type = DEVICE_METADATA_REGISTERS,
-          .data_buffer = metadata.bytes,
-          .data_size = metadata.num_bytes,
+          .data_buffer = encoded_metadata.GetOutgoingMessage().bytes(),
+          .data_size = encoded_metadata.GetOutgoingMessage().byte_actual(),
       },
   };
 
-  static pbus_dev_t registers_dev = []() {
-    pbus_dev_t dev = {};
-    dev.name = "registers";
-    dev.vid = PDEV_VID_GENERIC;
-    dev.pid = PDEV_PID_GENERIC;
-    dev.did = PDEV_DID_REGISTERS;
-    dev.mmio_list = registers_mmios;
-    dev.mmio_count = countof(registers_mmios);
-    dev.metadata_list = registers_metadata;
-    dev.metadata_count = countof(registers_metadata);
-    return dev;
-  }();
+  pbus_dev_t registers_dev{
+      .name = "registers",
+      .vid = PDEV_VID_GENERIC,
+      .pid = PDEV_PID_GENERIC,
+      .did = PDEV_DID_REGISTERS,
+      .mmio_list = registers_mmios,
+      .mmio_count = countof(registers_mmios),
+      .metadata_list = registers_metadata,
+      .metadata_count = countof(registers_metadata),
+  };
 
   zx_status_t status = pbus_.DeviceAdd(&registers_dev);
   if (status != ZX_OK) {
diff --git a/src/devices/board/drivers/sherlock/sherlock-usb.cc b/src/devices/board/drivers/sherlock/sherlock-usb.cc
index 155011c..14e17d2 100644
--- a/src/devices/board/drivers/sherlock/sherlock-usb.cc
+++ b/src/devices/board/drivers/sherlock/sherlock-usb.cc
@@ -146,12 +146,6 @@
         .base = T931_USBPHY21_BASE,
         .length = T931_USBPHY21_LENGTH,
     },
-#ifdef FACTORY_BUILD
-    {
-        .base = T931_USB_BASE,
-        .length = T931_USB_LENGTH,
-    },
-#endif  // FACTORY_BUILD
 };
 
 constexpr pbus_irq_t usb_phy_irqs[] = {
diff --git a/src/devices/lib/amlogic/include/soc/aml-common/aml-registers.h b/src/devices/lib/amlogic/include/soc/aml-common/aml-registers.h
index 14fa067..cba2f1f 100644
--- a/src/devices/lib/amlogic/include/soc/aml-common/aml-registers.h
+++ b/src/devices/lib/amlogic/include/soc/aml-common/aml-registers.h
@@ -8,6 +8,10 @@
 namespace registers {
 
 enum RegisterId : uint64_t {
+#ifdef FACTORY_BUILD
+  REGISTER_USB_PHY_FACTORY,
+#endif  // FACTORY_BUILD
+
   REGISTER_ID_COUNT,
 };
 
diff --git a/src/devices/usb/drivers/aml-usb-phy-v2/aml-usb-phy-test.cc b/src/devices/usb/drivers/aml-usb-phy-v2/aml-usb-phy-test.cc
index 4cdeef2f..fbc2e4a 100644
--- a/src/devices/usb/drivers/aml-usb-phy-v2/aml-usb-phy-test.cc
+++ b/src/devices/usb/drivers/aml-usb-phy-v2/aml-usb-phy-test.cc
@@ -284,9 +284,6 @@
                     });
 
   llcpp::fuchsia::hardware::registers::Device::SyncClient device(std::move(fidl.local()));
-  constexpr auto kUsbBaseAddress = 0xff400000;
-  ASSERT_OK(device.WriteRegister32(kUsbBaseAddress + (5 * 4), 0xFFFFFFFF, 42));
-  ASSERT_TRUE(written);
   ddk.DestroyDevices(root_device.get());
 }
 
diff --git a/src/devices/usb/drivers/aml-usb-phy-v2/aml-usb-phy.cc b/src/devices/usb/drivers/aml-usb-phy-v2/aml-usb-phy.cc
index 443b6ea..d85d043 100644
--- a/src/devices/usb/drivers/aml-usb-phy-v2/aml-usb-phy.cc
+++ b/src/devices/usb/drivers/aml-usb-phy-v2/aml-usb-phy.cc
@@ -295,27 +295,6 @@
   }
 }
 
-zx_status_t AmlUsbPhy::DdkMessage(fidl_incoming_msg_t* msg, fidl_txn_t* txn) {
-  DdkTransaction transaction(txn);
-  llcpp::fuchsia::hardware::registers::Device::Dispatch(this, msg, &transaction);
-  return transaction.Status();
-}
-
-void AmlUsbPhy::WriteRegister32(uint64_t address, uint32_t mask, uint32_t value,
-                                WriteRegister32Completer::Sync& completer) {
-  if (!factory_mmio_.has_value()) {
-    completer.ReplyError(ZX_ERR_NOT_SUPPORTED);
-    return;
-  }
-  constexpr auto kUsbBaseAddress = 0xff400000;
-  if ((address < kUsbBaseAddress) || (address >= kUsbBaseAddress + factory_mmio_->get_size())) {
-    completer.ReplyError(ZX_ERR_OUT_OF_RANGE);
-    return;
-  }
-  factory_mmio_->ModifyBits32(value, mask, address - kUsbBaseAddress);
-  completer.ReplySuccess();
-}
-
 zx_status_t AmlUsbPhy::AddDwc2Device() {
   if (dwc2_device_) {
     return ZX_ERR_BAD_STATE;
@@ -375,11 +354,6 @@
   if (status != ZX_OK) {
     return status;
   }
-  status = pdev_.MapMmio(4, &factory_mmio_);
-  if (status != ZX_OK) {
-    // Device doesn't support factory mode
-    factory_mmio_->reset();
-  }
 
   status = pdev_.GetInterrupt(0, &irq_);
   if (status != ZX_OK) {
diff --git a/src/devices/usb/drivers/aml-usb-phy-v2/aml-usb-phy.h b/src/devices/usb/drivers/aml-usb-phy-v2/aml-usb-phy.h
index 11e4980..c031877 100644
--- a/src/devices/usb/drivers/aml-usb-phy-v2/aml-usb-phy.h
+++ b/src/devices/usb/drivers/aml-usb-phy-v2/aml-usb-phy.h
@@ -22,13 +22,11 @@
 namespace aml_usb_phy {
 
 class AmlUsbPhy;
-using AmlUsbPhyType = ddk::Device<AmlUsbPhy, ddk::Initializable, ddk::Unbindable,
-                                  ddk::ChildPreReleaseable, ddk::Messageable>;
+using AmlUsbPhyType =
+    ddk::Device<AmlUsbPhy, ddk::Initializable, ddk::Unbindable, ddk::ChildPreReleaseable>;
 
 // This is the main class for the platform bus driver.
-class AmlUsbPhy : public AmlUsbPhyType,
-                  public ddk::UsbPhyProtocol<AmlUsbPhy, ddk::base_protocol>,
-                  public llcpp::fuchsia::hardware::registers::Device::Interface {
+class AmlUsbPhy : public AmlUsbPhyType, public ddk::UsbPhyProtocol<AmlUsbPhy, ddk::base_protocol> {
  public:
   // Public for testing.
   enum class UsbMode {
@@ -49,38 +47,6 @@
   void DdkUnbind(ddk::UnbindTxn txn);
   void DdkChildPreRelease(void* child_ctx);
   void DdkRelease();
-  zx_status_t DdkMessage(fidl_incoming_msg_t* msg, fidl_txn_t* txn);
-
-  void ReadRegister8(uint64_t address, uint8_t mask,
-                     ReadRegister8Completer::Sync& completer) override {
-    completer.ReplyError(ZX_ERR_NOT_SUPPORTED);
-  }
-  void ReadRegister16(uint64_t address, uint16_t mask,
-                      ReadRegister16Completer::Sync& completer) override {
-    completer.ReplyError(ZX_ERR_NOT_SUPPORTED);
-  }
-  void ReadRegister32(uint64_t address, uint32_t mask,
-                      ReadRegister32Completer::Sync& completer) override {
-    completer.ReplyError(ZX_ERR_NOT_SUPPORTED);
-  }
-  void ReadRegister64(uint64_t address, uint64_t mask,
-                      ReadRegister64Completer::Sync& completer) override {
-    completer.ReplyError(ZX_ERR_NOT_SUPPORTED);
-  }
-  void WriteRegister8(uint64_t address, uint8_t mask, uint8_t value,
-                      WriteRegister8Completer::Sync& completer) override {
-    completer.ReplyError(ZX_ERR_NOT_SUPPORTED);
-  }
-  void WriteRegister16(uint64_t address, uint16_t mask, uint16_t value,
-                       WriteRegister16Completer::Sync& completer) override {
-    completer.ReplyError(ZX_ERR_NOT_SUPPORTED);
-  }
-  void WriteRegister32(uint64_t address, uint32_t mask, uint32_t value,
-                       WriteRegister32Completer::Sync& completer) override;
-  void WriteRegister64(uint64_t address, uint64_t mask, uint64_t value,
-                       WriteRegister64Completer::Sync& completer) override {
-    completer.ReplyError(ZX_ERR_NOT_SUPPORTED);
-  }
 
   // Public for testing.
   UsbMode mode() {
@@ -112,7 +78,6 @@
   std::optional<ddk::MmioBuffer> usbctrl_mmio_;
   std::optional<ddk::MmioBuffer> usbphy20_mmio_;
   std::optional<ddk::MmioBuffer> usbphy21_mmio_;
-  std::optional<ddk::MmioBuffer> factory_mmio_;
 
   zx::interrupt irq_;
   thrd_t irq_thread_;