blob: e38524f315a32a75e21b2f19b4ffd10370209004 [file] [log] [blame]
Gopikrishnaiah Anandan7e3e3f52016-12-22 11:13:05 -08001/* Copyright (c) 2017, The Linux Foundation. All rights reserved.
2 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 */
12
13#include "sde_reg_dma.h"
14#include "sde_hw_reg_dma_v1.h"
Gopikrishnaiah Anandanbc5aa792017-08-23 18:30:08 -070015#include "sde_dbg.h"
Gopikrishnaiah Anandan7e3e3f52016-12-22 11:13:05 -080016
17static int default_check_support(enum sde_reg_dma_features feature,
18 enum sde_reg_dma_blk blk,
19 bool *is_supported)
20{
21
22 if (!is_supported)
23 return -EINVAL;
24
25 *is_supported = false;
26 return 0;
27}
28
29static int default_setup_payload(struct sde_reg_dma_setup_ops_cfg *cfg)
30{
31 DRM_ERROR("not implemented\n");
32 return -EINVAL;
33}
34
35static int default_kick_off(struct sde_reg_dma_kickoff_cfg *cfg)
36{
37 DRM_ERROR("not implemented\n");
38 return -EINVAL;
39
40}
41
42static int default_reset(struct sde_hw_ctl *ctl)
43{
44 DRM_ERROR("not implemented\n");
45 return -EINVAL;
46}
47
48struct sde_reg_dma_buffer *default_alloc_reg_dma_buf(u32 size)
49{
50 DRM_ERROR("not implemented\n");
51 return ERR_PTR(-EINVAL);
52}
53
54int default_dealloc_reg_dma(struct sde_reg_dma_buffer *lut_buf)
55{
56 DRM_ERROR("not implemented\n");
57 return -EINVAL;
58}
59
60static int default_buf_reset_reg_dma(struct sde_reg_dma_buffer *lut_buf)
61{
62 DRM_ERROR("not implemented\n");
63 return -EINVAL;
64}
65
Gopikrishnaiah Anandandb90fa12017-05-09 17:56:08 -070066static int default_last_command(struct sde_hw_ctl *ctl,
67 enum sde_reg_dma_queue q)
68{
69 return 0;
70}
71
Gopikrishnaiah Anandan7e3e3f52016-12-22 11:13:05 -080072static struct sde_hw_reg_dma reg_dma = {
73 .ops = {default_check_support, default_setup_payload,
74 default_kick_off, default_reset, default_alloc_reg_dma_buf,
Gopikrishnaiah Anandandb90fa12017-05-09 17:56:08 -070075 default_dealloc_reg_dma, default_buf_reset_reg_dma,
76 default_last_command},
Gopikrishnaiah Anandan7e3e3f52016-12-22 11:13:05 -080077};
78
79int sde_reg_dma_init(void __iomem *addr, struct sde_mdss_cfg *m,
80 struct drm_device *dev)
81{
82 int rc = 0;
83
84 if (!addr || !m || !dev) {
85 DRM_DEBUG("invalid addr %pK catalog %pK dev %pK\n", addr, m,
86 dev);
87 return 0;
88 }
89
90 reg_dma.drm_dev = dev;
91 reg_dma.caps = &m->dma_cfg;
92 reg_dma.addr = addr;
93
94 if (!m->reg_dma_count)
95 return 0;
96
97 switch (reg_dma.caps->version) {
98 case 1:
99 rc = init_v1(&reg_dma);
100 if (rc)
101 DRM_DEBUG("init v1 dma ops failed\n");
Gopikrishnaiah Anandanbc5aa792017-08-23 18:30:08 -0700102 else
103 sde_dbg_reg_register_base("reg_dma", addr,
104 reg_dma.caps->len);
Gopikrishnaiah Anandan7e3e3f52016-12-22 11:13:05 -0800105 break;
106 default:
107 break;
108 }
109
110 return 0;
111}
112
113struct sde_hw_reg_dma_ops *sde_reg_dma_get_ops(void)
114{
115 return &reg_dma.ops;
116}
Gopikrishnaiah Anandandb90fa12017-05-09 17:56:08 -0700117
118void sde_reg_dma_deinit(void)
119{
120 struct sde_hw_reg_dma op = {
121 .ops = {default_check_support, default_setup_payload,
122 default_kick_off, default_reset, default_alloc_reg_dma_buf,
123 default_dealloc_reg_dma, default_buf_reset_reg_dma,
124 default_last_command},
125 };
126
127 if (!reg_dma.drm_dev || !reg_dma.caps)
128 return;
129
130 switch (reg_dma.caps->version) {
131 case 1:
132 deinit_v1();
133 break;
134 default:
135 break;
136 }
137 memset(&reg_dma, 0, sizeof(reg_dma));
138 memcpy(&reg_dma.ops, &op.ops, sizeof(op.ops));
139}