blob: 8e2d7892c4d96406bc3730eee05d3f0042ed68d7 [file] [log] [blame]
hai.cao29a00072023-02-20 16:48:15 +08001// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
2/*
3 * Copyright (c) 2019 Amlogic, Inc. All rights reserved.
4 */
5
6#include <common.h>
7#include <command.h>
8#include <amlogic/media/vpu/vpu.h>
9
10static int do_vpu_enable(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
11{
12 run_command("mw fe010130 118", 0); /* TODO */
13 run_command("mw fe000218 00080000", 0); /* TODO */
14 vpu_probe();
15 return 0;
16}
17
18static int do_vpu_disable(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
19{
20 vpu_remove();
21 return 0;
22}
23
24static int do_vpu_clk(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
25{
26 int level;
27 int ret = 0;
28
hai.cao4ec85e02024-03-21 19:39:51 +080029 if (argc == 1) {
hai.cao29a00072023-02-20 16:48:15 +080030 return -1;
hai.cao4ec85e02024-03-21 19:39:51 +080031 }
hai.cao29a00072023-02-20 16:48:15 +080032 if (strcmp(argv[1], "set") == 0) {
33 if (argc == 3) {
34 level = (int)simple_strtoul(argv[2], NULL, 10);
35 ret = vpu_clk_change(level);
36 } else {
37 ret = -1;
38 }
39 } else if (strcmp(argv[1], "get") == 0) {
40 vpu_clk_get();
41 } else {
42 ret = -1;
43 }
44 return ret;
45}
46
hai.cao4ec85e02024-03-21 19:39:51 +080047static int do_vpu_arb_l1_bind_change(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
48{
49 int level1_module;
50 int level2_module;
51 int ret = 0;
52
53 if (argc < 3) {
54 printf("vpu arb_bind1 x(index) x(bind_port)\n");
55 return -1;
56 }
57 level1_module = (int)simple_strtoul(argv[1], NULL, 10);
58 level2_module = (int)simple_strtoul(argv[2], NULL, 10);
59 ret = vpu_rdarb_bind_l1(level1_module, level2_module);
60 if (ret != -1)
61 print_bind1_change_info(level1_module, level2_module);
62 return ret;
63}
64
65static int do_vpu_arb_l2_bind_change(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
66{
67 int level2_module;
68 int vpu_prot;
69 int ret = 0;
70
71 if (argc < 3) {
72 printf("vpu arb_bind2 x(index) x(bind_port)\n");
73 return -1;
74 }
75 level2_module = (int)simple_strtoul(argv[1], NULL, 10);
76 vpu_prot = (int)simple_strtoul(argv[2], NULL, 10);
77 ret = vpu_rdarb_bind_l2(level2_module, vpu_prot);
78 if (ret != -1)
79 print_bind2_change_info(level2_module, vpu_prot);
80 return ret;
81}
82
83static int do_vpu_urgent_change(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
84{
85 int module;
86 int urgent_val;
87 int ret = 0;
88
89 if (argc < 3) {
90 printf("vpu urgent_set x(index) x(value)\n");
91 return -1;
92 }
93 module = (int)simple_strtoul(argv[1], NULL, 10);
94 urgent_val = (int)simple_strtoul(argv[2], NULL, 10);
95 /*first parameter reserve*/
96 ret = vpu_urgent_set(module, urgent_val);
97 if (ret == -1)
98 return ret;
99 print_urgent_change_info(module, urgent_val);
100 return ret;
101}
102
hai.cao29a00072023-02-20 16:48:15 +0800103static int do_vpu_test(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
104{
105 vcbus_test();
106 return 0;
107}
108
hai.cao4ec85e02024-03-21 19:39:51 +0800109static int do_vpu_arb_info(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
110{
111 get_arb_module_info();
112 return 0;
113}
114
115static int do_vpu_rdarb(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
116{
117 dump_vpu_rdarb_table();
118 return 0;
119}
120
121static int do_vpu_urgent(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
122{
123 dump_vpu_urgent_table();
124 return 0;
125}
126
hai.cao29a00072023-02-20 16:48:15 +0800127static int do_vpu_info(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
128{
129 vpu_info_print();
130 return 0;
131}
132
Evoke Zhangb67a0572023-03-06 10:08:28 +0000133static int do_vpu_secure(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
134{
135 unsigned int temp;
136
137 if (argc == 1)
138 return -1;
139
140 temp = (unsigned int)simple_strtoul(argv[1], NULL, 10);
141 vpu_sec_debug(temp);
142 return 0;
143}
144
hai.cao29a00072023-02-20 16:48:15 +0800145static cmd_tbl_t cmd_vpu_sub[] = {
146 U_BOOT_CMD_MKENT(probe, 2, 0, do_vpu_enable, "", ""),
147 U_BOOT_CMD_MKENT(remove, 2, 0, do_vpu_disable, "", ""),
148 U_BOOT_CMD_MKENT(clk, 3, 0, do_vpu_clk, "", ""),
149 U_BOOT_CMD_MKENT(test, 2, 0, do_vpu_test, "", ""),
hai.cao4ec85e02024-03-21 19:39:51 +0800150 U_BOOT_CMD_MKENT(rdarb, 2, 0, do_vpu_rdarb, "", ""),
151 U_BOOT_CMD_MKENT(urgent, 2, 0, do_vpu_urgent, "", ""),
152 U_BOOT_CMD_MKENT(arb_bind1, 3, 0, do_vpu_arb_l1_bind_change, "", ""),
153 U_BOOT_CMD_MKENT(arb_bind2, 3, 0, do_vpu_arb_l2_bind_change, "", ""),
154 U_BOOT_CMD_MKENT(urgent_set, 3, 0, do_vpu_urgent_change, "", ""),
155 U_BOOT_CMD_MKENT(arb_module_info, 2, 0, do_vpu_arb_info, "", ""),
hai.cao29a00072023-02-20 16:48:15 +0800156 U_BOOT_CMD_MKENT(info, 2, 0, do_vpu_info, "", ""),
Evoke Zhangb67a0572023-03-06 10:08:28 +0000157 U_BOOT_CMD_MKENT(sec, 2, 0, do_vpu_secure, "", ""),
hai.cao29a00072023-02-20 16:48:15 +0800158};
159
160static int do_vpu(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
161{
162 cmd_tbl_t *c;
163
164 /* Strip off leading 'bmp' command argument */
165 argc--;
166 argv++;
167
168 c = find_cmd_tbl(argv[0], &cmd_vpu_sub[0], ARRAY_SIZE(cmd_vpu_sub));
169
hai.cao4ec85e02024-03-21 19:39:51 +0800170 if (c) {
hai.cao29a00072023-02-20 16:48:15 +0800171 return c->cmd(cmdtp, flag, argc, argv);
hai.cao4ec85e02024-03-21 19:39:51 +0800172 } else {
hai.cao29a00072023-02-20 16:48:15 +0800173 cmd_usage(cmdtp);
174 return 1;
175 }
176}
177
178U_BOOT_CMD(
179 vpu, 5, 0, do_vpu,
180 "vpu sub-system",
hai.cao4ec85e02024-03-21 19:39:51 +0800181 "vpu probe - enable vpu domain\n"
182 "vpu remove - disable vpu domain\n"
183 "vpu test - test vcbus access\n"
184 "vpu rdarb - get vpu rdarb info\n"
185 "vpu arb_module_info - get vpu arb module info\n"
186 "vpu urgent - get vpu urgent info\n"
187 "vpu arb_bind1 - change level1 arb bind\n"
188 "vpu arb_bind2 - change level2 arb bind\n"
189 "vpu urgent_set - change urgent value\n"
190);