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 <ddk/protocol/platform/bus.h>
9 #include <soc/aml-s912/s912-hw.h>
10
11 #include "vim.h"
12
13 static pbus_mmio_t vim_video_mmios[] = {
14 {
15 .base = S912_FULL_CBUS_BASE,
16 .length = S912_FULL_CBUS_LENGTH,
17 },
18 {
19 .base = S912_DOS_BASE,
20 .length = S912_DOS_LENGTH,
21 },
22 {
23 .base = S912_HIU_BASE,
24 .length = S912_HIU_LENGTH,
25 },
26 {
27 .base = S912_AOBUS_BASE,
28 .length = S912_AOBUS_LENGTH,
29 },
30 {
31 .base = S912_DMC_REG_BASE,
32 .length = S912_DMC_REG_LENGTH,
33 },
34 };
35
36 static const pbus_bti_t vim_video_btis[] = {
37 {
38 .iommu_index = 0,
39 .bti_id = BTI_VIDEO,
40 },
41 };
42
43 static const pbus_irq_t vim_video_irqs[] = {
44 {
45 .irq = S912_DEMUX_IRQ,
46 .mode = ZX_INTERRUPT_MODE_EDGE_HIGH,
47 },
48 {
49 .irq = S912_PARSER_IRQ,
50 .mode = ZX_INTERRUPT_MODE_EDGE_HIGH,
51 },
52 {
53 .irq = S912_DOS_MBOX_0_IRQ,
54 .mode = ZX_INTERRUPT_MODE_EDGE_HIGH,
55 },
56 {
57 .irq = S912_DOS_MBOX_1_IRQ,
58 .mode = ZX_INTERRUPT_MODE_EDGE_HIGH,
59 },
60 {
61 .irq = S912_DOS_MBOX_2_IRQ,
62 .mode = ZX_INTERRUPT_MODE_EDGE_HIGH,
63 },
64 };
65
66 static const uint32_t vim_video_protocols[] = {
67 ZX_PROTOCOL_AMLOGIC_CANVAS,
68 };
69
70 static const pbus_dev_t video_dev = {
71 .name = "video",
72 .vid = PDEV_VID_AMLOGIC,
73 .pid = PDEV_PID_AMLOGIC_S912,
74 .did = PDEV_DID_AMLOGIC_VIDEO,
75 .mmio_list = vim_video_mmios,
76 .mmio_count = countof(vim_video_mmios),
77 .bti_list = vim_video_btis,
78 .bti_count = countof(vim_video_btis),
79 .irq_list = vim_video_irqs,
80 .irq_count = countof(vim_video_irqs),
81 .protocol_list = vim_video_protocols,
82 .protocol_count = countof(vim_video_protocols),
83 };
84
85
vim_video_init(vim_bus_t * bus)86 zx_status_t vim_video_init(vim_bus_t* bus) {
87 zx_status_t status;
88 if ((status = pbus_device_add(&bus->pbus, &video_dev)) != ZX_OK) {
89 zxlogf(ERROR, "vim_video_init: pbus_device_add() failed for video: %d\n", status);
90 return status;
91 }
92
93 return ZX_OK;
94 }
95