1 // Copyright 2018 The Fuchsia Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include <ddktl/pdev.h>
6 
7 #include <ddk/debug.h>
8 #include <optional>
9 
10 namespace ddk {
11 
ShowInfo()12 void PDev::ShowInfo() {
13     pdev_device_info_t info;
14     if (GetDeviceInfo(&info) == ZX_OK) {
15         zxlogf(INFO, "VID:PID:DID         = %04x:%04x:%04x\n", info.vid, info.pid, info.did);
16         zxlogf(INFO, "mmio count          = %d\n", info.mmio_count);
17         zxlogf(INFO, "irq count           = %d\n", info.irq_count);
18         zxlogf(INFO, "gpio count          = %d\n", info.gpio_count);
19         zxlogf(INFO, "i2c channel count   = %d\n", info.i2c_channel_count);
20         zxlogf(INFO, "clk count           = %d\n", info.clk_count);
21         zxlogf(INFO, "bti count           = %d\n", info.bti_count);
22     }
23 }
24 
MapMmio(uint32_t index,std::optional<MmioBuffer> * mmio)25 zx_status_t PDev::MapMmio(uint32_t index, std::optional<MmioBuffer>* mmio) {
26     pdev_mmio_t pdev_mmio;
27 
28     zx_status_t status = GetMmio(index, &pdev_mmio);
29     if (status != ZX_OK) {
30         return status;
31     }
32     return MmioBuffer::Create(pdev_mmio.offset, pdev_mmio.size, zx::vmo(pdev_mmio.vmo),
33                               ZX_CACHE_POLICY_UNCACHED_DEVICE, mmio);
34 }
35 
GetI2c(uint32_t index)36 std::optional<I2cChannel> PDev::GetI2c(uint32_t index) {
37     i2c_protocol_t i2c;
38     size_t actual;
39     zx_status_t res = GetProtocol(ZX_PROTOCOL_I2C, index, &i2c, sizeof(i2c), &actual);
40     if (res != ZX_OK || actual != sizeof(i2c)) {
41         return {};
42     }
43     return std::optional<I2cChannel>(&i2c);
44 }
45 
GetGpio(uint32_t index)46 std::optional<GpioProtocolClient> PDev::GetGpio(uint32_t index) {
47     gpio_protocol_t gpio;
48     size_t actual;
49     zx_status_t res = GetProtocol(ZX_PROTOCOL_GPIO, index, &gpio, sizeof(gpio), &actual);
50     if (res != ZX_OK || actual != sizeof(gpio)) {
51         return {};
52     }
53     return std::optional<GpioProtocolClient>(&gpio);
54 }
55 
56 } // namespace ddk
57