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 "sherlock.h"
6 
7 #include <ddk/debug.h>
8 #include <ddk/device.h>
9 #include <ddk/platform-defs.h>
10 #include <ddk/protocol/platform/bus.h>
11 #include <soc/aml-t931/t931-hw.h>
12 
13 namespace sherlock {
14 
15 static pbus_mmio_t sherlock_video_mmios[] = {
16     {
17         .base = T931_CBUS_BASE,
18         .length = T931_CBUS_LENGTH,
19     },
20     {
21         .base = T931_DOS_BASE,
22         .length = T931_DOS_LENGTH,
23     },
24     {
25         .base = T931_HIU_BASE,
26         .length = T931_HIU_LENGTH,
27     },
28     {
29         .base = T931_AOBUS_BASE,
30         .length = T931_AOBUS_LENGTH,
31     },
32     {
33         .base = T931_DMC_BASE,
34         .length = T931_DMC_LENGTH,
35     },
36 };
37 
38 static const pbus_bti_t sherlock_video_btis[] = {
39     {
40         .iommu_index = 0,
41         .bti_id = BTI_VIDEO,
42     },
43 };
44 
45 static const pbus_irq_t sherlock_video_irqs[] = {
46     {
47         .irq = T931_DEMUX_IRQ,
48         .mode = ZX_INTERRUPT_MODE_EDGE_HIGH,
49     },
50     {
51         .irq = T931_PARSER_IRQ,
52         .mode = ZX_INTERRUPT_MODE_EDGE_HIGH,
53     },
54     {
55         .irq = T931_DOS_MBOX_0_IRQ,
56         .mode = ZX_INTERRUPT_MODE_EDGE_HIGH,
57     },
58     {
59         .irq = T931_DOS_MBOX_1_IRQ,
60         .mode = ZX_INTERRUPT_MODE_EDGE_HIGH,
61     },
62     {
63         .irq = T931_DOS_MBOX_2_IRQ,
64         .mode = ZX_INTERRUPT_MODE_EDGE_HIGH,
65     },
66 };
67 
68 static const uint32_t sherlock_video_protocols[] = {
69     ZX_PROTOCOL_AMLOGIC_CANVAS,
70 };
71 
__anondfc560de0102() 72 static pbus_dev_t video_dev = []() {
73     pbus_dev_t dev;
74     dev.name = "aml-video";
75     dev.vid = PDEV_VID_AMLOGIC;
76     dev.pid = PDEV_PID_AMLOGIC_T931;
77     dev.did = PDEV_DID_AMLOGIC_VIDEO;
78     dev.mmio_list = sherlock_video_mmios;
79     dev.mmio_count = countof(sherlock_video_mmios);
80     dev.bti_list = sherlock_video_btis;
81     dev.bti_count = countof(sherlock_video_btis);
82     dev.irq_list = sherlock_video_irqs;
83     dev.irq_count = countof(sherlock_video_irqs);
84     dev.protocol_list = sherlock_video_protocols;
85     dev.protocol_count = countof(sherlock_video_protocols);
86     return dev;
87 }();
88 
VideoInit()89 zx_status_t Sherlock::VideoInit() {
90     zx_status_t status = pbus_.DeviceAdd(&video_dev);
91     if (status != ZX_OK) {
92         zxlogf(ERROR, "Sherlock::VideoInit: pbus_device_add() failed for video: %d\n", status);
93         return status;
94     }
95     return ZX_OK;
96 }
97 
98 } // namespace sherlock
99