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