blob: dc3e36ffc9c77b3446aeec13dee89010e9bcc815 [file] [log] [blame]
// Copyright 2019 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 "usb-hci.h"
#include <lib/fake_ddk/fake_ddk.h>
#include <lib/mmio/mmio.h>
#include <lib/zx/vmo.h>
#include <zircon/types.h>
#include <soc/mt8167/mt8167-hw.h>
#include <soc/mt8167/mt8167-usb.h>
#include <zxtest/zxtest.h>
namespace mt_usb_hci {
namespace regs = board_mt8167;
// A testing instance which exposes the Init() method.
class TUsbHci : public UsbHci {
public:
using UsbHci::Init;
using UsbHci::UsbHci;
};
class HciTest : public zxtest::Test {
protected:
void SetUp() {
size_t sz;
zx::vmo usb;
ASSERT_OK(zx::vmo::create(MT8167_USB1_LENGTH, 0, &usb));
ASSERT_OK(usb.get_size(&sz));
ASSERT_OK(ddk::MmioBuffer::Create(0, sz, std::move(usb), ZX_CACHE_POLICY_UNCACHED, &usb_mmio_));
zx::vmo phy;
ASSERT_OK(zx::vmo::create(MT8167_USBPHY_LENGTH, 0, &phy));
ASSERT_OK(phy.get_size(&sz));
ASSERT_OK(ddk::MmioBuffer::Create(0, sz, std::move(phy), ZX_CACHE_POLICY_UNCACHED, &phy_mmio_));
ASSERT_OK(zx_interrupt_create(0, 0, ZX_INTERRUPT_VIRTUAL, intr_.reset_and_get_address()));
}
std::optional<ddk::MmioBuffer> usb_mmio_;
std::optional<ddk::MmioBuffer> phy_mmio_;
zx::interrupt intr_;
};
TEST_F(HciTest, TestReadEndpointNumber) {
ddk::MmioView v = usb_mmio_->View(0);
regs::EPINFO::Get().FromValue(0x33).WriteTo(&v);
TUsbHci hci(fake_ddk::kFakeParent, *std::move(usb_mmio_), *std::move(phy_mmio_), intr_.release());
EXPECT_OK(hci.Init());
EXPECT_EQ(3, regs::INDEX::Get().ReadFrom(&v).selected_endpoint());
hci.DdkUnbind(ddk::UnbindTxn(fake_ddk::kFakeDevice));
}
TEST_F(HciTest, DdkLifecycle) {
ddk::MmioView v = usb_mmio_->View(0);
regs::EPINFO::Get().FromValue(0x33).WriteTo(&v);
fake_ddk::Bind ddk;
TUsbHci hci(fake_ddk::kFakeParent, *std::move(usb_mmio_), *std::move(phy_mmio_), intr_.release());
EXPECT_OK(hci.Init());
hci.DdkAdd("mt-usb-host");
hci.DdkAsyncRemove();
EXPECT_OK(ddk.WaitUntilRemove());
EXPECT_TRUE(ddk.Ok());
}
} // namespace mt_usb_hci
int main(int argc, char* argv[]) { return RUN_ALL_TESTS(argc, argv); }