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