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 <ddk/debug.h>
6 #include <ddk/device.h>
7 #include <ddk/platform-defs.h>
8 #include "sherlock.h"
9 
10 namespace sherlock {
11 
12 namespace {
13 constexpr pbus_mmio_t display_mmios[] = {
14     {
15         // VBUS/VPU
16         .base = T931_VPU_BASE,
17         .length = T931_VPU_LENGTH,
18     },
19 };
20 
21 static const pbus_irq_t display_irqs[] = {
22     {
23         .irq = T931_VIU1_VSYNC_IRQ,
24         .mode = ZX_INTERRUPT_MODE_EDGE_HIGH,
25     },
26     {
27         .irq = T931_RDMA_DONE,
28         .mode = ZX_INTERRUPT_MODE_EDGE_HIGH,
29     },
30 };
31 
32 static const pbus_bti_t display_btis[] = {
33     {
34         .iommu_index = 0,
35         .bti_id = BTI_DISPLAY,
36     },
37 };
38 
39 static const uint32_t display_protocols[] = {
40     ZX_PROTOCOL_AMLOGIC_CANVAS,
41 };
42 
__anon11ad39fd0202() 43 static pbus_dev_t display_dev = []() {
44     pbus_dev_t dev;
45     dev.name = "display";
46     dev.vid = PDEV_VID_AMLOGIC;
47     dev.pid = PDEV_PID_AMLOGIC_S905D2;
48     dev.did = PDEV_DID_AMLOGIC_DISPLAY;
49     dev.mmio_list = display_mmios;
50     dev.mmio_count = countof(display_mmios);
51     dev.irq_list = display_irqs;
52     dev.irq_count = countof(display_irqs);
53     dev.bti_list = display_btis;
54     dev.bti_count = countof(display_btis);
55     dev.protocol_list = display_protocols;
56     dev.protocol_count = countof(display_protocols);
57     return dev;
58 }();
59 
60 } // namespace
61 
DisplayInit()62 zx_status_t Sherlock::DisplayInit() {
63 
64     zx_status_t status = pbus_.DeviceAdd(&display_dev);
65     if (status != ZX_OK) {
66         zxlogf(ERROR, "%s: DeviceAdd failed %d\n", __func__, status);
67         return status;
68     }
69 
70     return status;
71 }
72 
73 } // namespace sherlock