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