[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(®isters_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_;