blob: 8a671da9a2713ba6f1356d5f9fdce2ecae9d270f [file] [log] [blame]
// Copyright 2018 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 <ddktl/pdev.h>
#include <ddk/debug.h>
#include <lib/mmio/mmio.h>
namespace ddk {
void PDev::ShowInfo() {
pdev_device_info_t info;
if (GetDeviceInfo(&info) == ZX_OK) {
zxlogf(INFO, "VID:PID:DID = %04x:%04x:%04x\n", info.vid, info.pid, info.did);
zxlogf(INFO, "mmio count = %d\n", info.mmio_count);
zxlogf(INFO, "irq count = %d\n", info.irq_count);
zxlogf(INFO, "gpio count = %d\n", info.gpio_count);
zxlogf(INFO, "clk count = %d\n", info.clk_count);
zxlogf(INFO, "bti count = %d\n", info.bti_count);
}
}
zx_status_t PDev::MapMmio(uint32_t index, std::optional<MmioBuffer>* mmio) {
pdev_mmio_t pdev_mmio;
zx_status_t status = GetMmio(index, &pdev_mmio);
if (status != ZX_OK) {
return status;
}
return MmioBuffer::Create(pdev_mmio.offset, pdev_mmio.size, zx::vmo(pdev_mmio.vmo),
ZX_CACHE_POLICY_UNCACHED_DEVICE, mmio);
}
GpioProtocolClient PDev::GetGpio(uint32_t index) {
gpio_protocol_t gpio;
size_t actual;
zx_status_t res = GetProtocol(ZX_PROTOCOL_GPIO, index, &gpio, sizeof(gpio), &actual);
if (res != ZX_OK || actual != sizeof(gpio)) {
return {};
}
return GpioProtocolClient(&gpio);
}
PowerProtocolClient PDev::GetPower(uint32_t index) {
power_protocol_t power;
size_t actual;
zx_status_t res = GetProtocol(ZX_PROTOCOL_POWER, index, &power, sizeof(power), &actual);
if (res != ZX_OK || actual != sizeof(power)) {
return {};
}
return PowerProtocolClient(&power);
}
ClockProtocolClient PDev::GetClk(uint32_t index) {
clock_protocol_t clk;
size_t actual;
zx_status_t res = GetProtocol(ZX_PROTOCOL_CLOCK, index, &clk, sizeof(clk), &actual);
if (res != ZX_OK || actual != sizeof(clk)) {
return {};
}
return ClockProtocolClient(&clk);
}
} // namespace ddk