]>
Commit | Line | Data |
---|---|---|
3863585b WD |
1 | /* |
2 | * (C) Copyright 2001 | |
3 | * Erik Theisen, Wave 7 Optics, [email protected]. | |
4 | * | |
1a459660 | 5 | * SPDX-License-Identifier: GPL-2.0+ |
3863585b WD |
6 | */ |
7 | ||
8 | /* | |
0c8721a4 | 9 | * AMCC 4XX DCR Functions |
3863585b WD |
10 | */ |
11 | ||
12 | #include <common.h> | |
18d66533 | 13 | #include <cli.h> |
3863585b WD |
14 | #include <config.h> |
15 | #include <command.h> | |
24b852a7 | 16 | #include <console.h> |
3863585b | 17 | |
af9e1f5b SR |
18 | unsigned long get_dcr (unsigned short); |
19 | unsigned long set_dcr (unsigned short, unsigned long); | |
20 | ||
0c8721a4 WD |
21 | /* ======================================================================= |
22 | * Interpreter command to retrieve an AMCC PPC 4xx Device Control Register | |
23 | * ======================================================================= | |
3863585b | 24 | */ |
54841ab5 | 25 | int do_getdcr ( cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[] ) |
3863585b | 26 | { |
0c8721a4 WD |
27 | unsigned short dcrn; /* Device Control Register Num */ |
28 | unsigned long value; /* DCR's value */ | |
3863585b | 29 | |
0c8721a4 | 30 | unsigned long get_dcr (unsigned short); |
8bde7f77 | 31 | |
0c8721a4 | 32 | /* Validate arguments */ |
47e26b1b | 33 | if (argc < 2) |
4c12eeb8 | 34 | return CMD_RET_USAGE; |
3863585b | 35 | |
0c8721a4 WD |
36 | /* Get a DCR */ |
37 | dcrn = (unsigned short) simple_strtoul (argv[1], NULL, 16); | |
38 | value = get_dcr (dcrn); | |
3863585b | 39 | |
0c8721a4 | 40 | printf ("%04x: %08lx\n", dcrn, value); |
3863585b | 41 | |
0c8721a4 WD |
42 | return 0; |
43 | } | |
3863585b WD |
44 | |
45 | ||
46 | /* ====================================================================== | |
0c8721a4 | 47 | * Interpreter command to set an AMCC PPC 4xx Device Control Register |
3863585b WD |
48 | * ====================================================================== |
49 | */ | |
54841ab5 | 50 | int do_setdcr (cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[]) |
3863585b | 51 | { |
0c8721a4 WD |
52 | unsigned short dcrn; /* Device Control Register Num */ |
53 | unsigned long value; | |
54 | ||
55 | /* DCR's value */ | |
56 | int nbytes; | |
0c8721a4 WD |
57 | |
58 | /* Validate arguments */ | |
47e26b1b | 59 | if (argc < 2) |
4c12eeb8 | 60 | return CMD_RET_USAGE; |
3863585b | 61 | |
0c8721a4 WD |
62 | /* Set a DCR */ |
63 | dcrn = (unsigned short) simple_strtoul (argv[1], NULL, 16); | |
64 | do { | |
65 | value = get_dcr (dcrn); | |
66 | printf ("%04x: %08lx", dcrn, value); | |
e1bf824d | 67 | nbytes = cli_readline(" ? "); |
0c8721a4 WD |
68 | if (nbytes == 0) { |
69 | /* | |
70 | * <CR> pressed as only input, don't modify current | |
71 | * location and exit command. | |
72 | */ | |
73 | nbytes = 1; | |
74 | return 0; | |
75 | } else { | |
76 | unsigned long i; | |
77 | char *endp; | |
78 | ||
79 | i = simple_strtoul (console_buffer, &endp, 16); | |
80 | nbytes = endp - console_buffer; | |
81 | if (nbytes) | |
82 | set_dcr (dcrn, i); | |
83 | } | |
84 | } while (nbytes); | |
85 | ||
86 | return 0; | |
87 | } | |
3863585b | 88 | |
af9e1f5b SR |
89 | /* ======================================================================= |
90 | * Interpreter command to retrieve an register value through AMCC PPC 4xx | |
91 | * Device Control Register inderect addressing. | |
92 | * ======================================================================= | |
93 | */ | |
54841ab5 | 94 | int do_getidcr (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) |
af9e1f5b SR |
95 | { |
96 | unsigned short adr_dcrn; /* Device Control Register Num for Address */ | |
97 | unsigned short dat_dcrn; /* Device Control Register Num for Data */ | |
98 | unsigned short offset; /* Register's offset */ | |
99 | unsigned long value; /* Register's value */ | |
100 | char *ptr = NULL; | |
101 | char buf[80]; | |
102 | ||
103 | /* Validate arguments */ | |
47e26b1b | 104 | if (argc < 3) |
4c12eeb8 | 105 | return CMD_RET_USAGE; |
af9e1f5b SR |
106 | |
107 | /* Find out whether ther is '.' (dot) symbol in the first parameter. */ | |
108 | strncpy (buf, argv[1], sizeof(buf)-1); | |
109 | buf[sizeof(buf)-1] = 0; /* will guarantee zero-end string */ | |
110 | ptr = strchr (buf, '.'); | |
111 | ||
112 | if (ptr != NULL) { | |
113 | /* First parameter has format adr_dcrn.dat_dcrn */ | |
114 | *ptr++ = 0; /* erase '.', create zero-end string */ | |
115 | adr_dcrn = (unsigned short) simple_strtoul (buf, NULL, 16); | |
116 | dat_dcrn = (unsigned short) simple_strtoul (ptr, NULL, 16); | |
117 | } else { | |
118 | /* | |
119 | * First parameter has format adr_dcrn; dat_dcrn will be | |
120 | * calculated as adr_dcrn+1. | |
121 | */ | |
122 | adr_dcrn = (unsigned short) simple_strtoul (buf, NULL, 16); | |
123 | dat_dcrn = adr_dcrn+1; | |
124 | } | |
125 | ||
126 | /* Register's offset */ | |
127 | offset = (unsigned short) simple_strtoul (argv[2], NULL, 16); | |
128 | ||
129 | /* Disable interrupts */ | |
130 | disable_interrupts (); | |
131 | /* Set offset */ | |
132 | set_dcr (adr_dcrn, offset); | |
133 | /* get data */ | |
134 | value = get_dcr (dat_dcrn); | |
135 | /* Enable interrupts */ | |
136 | enable_interrupts (); | |
137 | ||
138 | printf ("%04x.%04x-%04x Read %08lx\n", adr_dcrn, dat_dcrn, offset, value); | |
139 | ||
140 | return 0; | |
141 | } | |
142 | ||
143 | /* ======================================================================= | |
144 | * Interpreter command to update an register value through AMCC PPC 4xx | |
145 | * Device Control Register inderect addressing. | |
146 | * ======================================================================= | |
147 | */ | |
54841ab5 | 148 | int do_setidcr (cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[]) |
af9e1f5b SR |
149 | { |
150 | unsigned short adr_dcrn; /* Device Control Register Num for Address */ | |
151 | unsigned short dat_dcrn; /* Device Control Register Num for Data */ | |
152 | unsigned short offset; /* Register's offset */ | |
153 | unsigned long value; /* Register's value */ | |
154 | char *ptr = NULL; | |
155 | char buf[80]; | |
156 | ||
157 | /* Validate arguments */ | |
47e26b1b | 158 | if (argc < 4) |
4c12eeb8 | 159 | return CMD_RET_USAGE; |
af9e1f5b SR |
160 | |
161 | /* Find out whether ther is '.' (dot) symbol in the first parameter. */ | |
162 | strncpy (buf, argv[1], sizeof(buf)-1); | |
163 | buf[sizeof(buf)-1] = 0; /* will guarantee zero-end string */ | |
164 | ptr = strchr (buf, '.'); | |
165 | ||
166 | if (ptr != NULL) { | |
167 | /* First parameter has format adr_dcrn.dat_dcrn */ | |
168 | *ptr++ = 0; /* erase '.', create zero-end string */ | |
169 | adr_dcrn = (unsigned short) simple_strtoul (buf, NULL, 16); | |
170 | dat_dcrn = (unsigned short) simple_strtoul (ptr, NULL, 16); | |
171 | } else { | |
172 | /* | |
173 | * First parameter has format adr_dcrn; dat_dcrn will be | |
174 | * calculated as adr_dcrn+1. | |
175 | */ | |
2b2a40be WD |
176 | adr_dcrn = (unsigned short) simple_strtoul (buf, NULL, 16); |
177 | dat_dcrn = adr_dcrn+1; | |
178 | } | |
af9e1f5b SR |
179 | |
180 | /* Register's offset */ | |
181 | offset = (unsigned short) simple_strtoul (argv[2], NULL, 16); | |
182 | /* New value */ | |
183 | value = (unsigned long) simple_strtoul (argv[3], NULL, 16); | |
184 | ||
185 | /* Disable interrupts */ | |
186 | disable_interrupts (); | |
187 | /* Set offset */ | |
188 | set_dcr (adr_dcrn, offset); | |
189 | /* set data */ | |
190 | set_dcr (dat_dcrn, value); | |
191 | /* Enable interrupts */ | |
192 | enable_interrupts (); | |
193 | ||
194 | printf ("%04x.%04x-%04x Write %08lx\n", adr_dcrn, dat_dcrn, offset, value); | |
195 | ||
196 | return 0; | |
197 | } | |
198 | ||
8bde7f77 WD |
199 | /***************************************************/ |
200 | ||
0d498393 WD |
201 | U_BOOT_CMD( |
202 | getdcr, 2, 1, do_getdcr, | |
2fb2604d | 203 | "Get an AMCC PPC 4xx DCR's value", |
a89c33db | 204 | "dcrn - return a DCR's value." |
8bde7f77 | 205 | ); |
0d498393 WD |
206 | U_BOOT_CMD( |
207 | setdcr, 2, 1, do_setdcr, | |
2fb2604d | 208 | "Set an AMCC PPC 4xx DCR's value", |
a89c33db | 209 | "dcrn - set a DCR's value." |
8bde7f77 WD |
210 | ); |
211 | ||
af9e1f5b SR |
212 | U_BOOT_CMD( |
213 | getidcr, 3, 1, do_getidcr, | |
2fb2604d | 214 | "Get a register value via indirect DCR addressing", |
a89c33db | 215 | "adr_dcrn[.dat_dcrn] offset - write offset to adr_dcrn, read value from dat_dcrn." |
af9e1f5b SR |
216 | ); |
217 | ||
218 | U_BOOT_CMD( | |
219 | setidcr, 4, 1, do_setidcr, | |
2fb2604d | 220 | "Set a register value via indirect DCR addressing", |
a89c33db | 221 | "adr_dcrn[.dat_dcrn] offset value - write offset to adr_dcrn, write value to dat_dcrn." |
af9e1f5b | 222 | ); |