xref: /rk3399_rockchip-uboot/lib/display_options.c (revision 33eac2dc25eb8b38d2991c61036d20f707fdd54f)
178acc472SPeter Tyser /*
278acc472SPeter Tyser  * (C) Copyright 2000-2002
378acc472SPeter Tyser  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
478acc472SPeter Tyser  *
51a459660SWolfgang Denk  * SPDX-License-Identifier:	GPL-2.0+
678acc472SPeter Tyser  */
778acc472SPeter Tyser 
878acc472SPeter Tyser #include <config.h>
978acc472SPeter Tyser #include <common.h>
10*33eac2dcSSimon Glass #include <div64.h>
11c6da9ae8SSimon Glass #include <inttypes.h>
1209c2e90cSAndreas Bießmann #include <version.h>
1378acc472SPeter Tyser #include <linux/ctype.h>
1478acc472SPeter Tyser #include <asm/io.h>
1578acc472SPeter Tyser 
1678acc472SPeter Tyser int display_options (void)
1778acc472SPeter Tyser {
1878acc472SPeter Tyser #if defined(BUILD_TAG)
1978acc472SPeter Tyser 	printf ("\n\n%s, Build: %s\n\n", version_string, BUILD_TAG);
2078acc472SPeter Tyser #else
2178acc472SPeter Tyser 	printf ("\n\n%s\n\n", version_string);
2278acc472SPeter Tyser #endif
2378acc472SPeter Tyser 	return 0;
2478acc472SPeter Tyser }
2578acc472SPeter Tyser 
26*33eac2dcSSimon Glass void print_freq(uint64_t freq, const char *s)
27*33eac2dcSSimon Glass {
28*33eac2dcSSimon Glass 	unsigned long m = 0, n;
29*33eac2dcSSimon Glass 	uint32_t f;
30*33eac2dcSSimon Glass 	static const char names[] = {'G', 'M', 'K'};
31*33eac2dcSSimon Glass 	unsigned long d = 1e9;
32*33eac2dcSSimon Glass 	char c = 0;
33*33eac2dcSSimon Glass 	unsigned int i;
34*33eac2dcSSimon Glass 
35*33eac2dcSSimon Glass 	for (i = 0; i < ARRAY_SIZE(names); i++, d /= 1000) {
36*33eac2dcSSimon Glass 		if (freq >= d) {
37*33eac2dcSSimon Glass 			c = names[i];
38*33eac2dcSSimon Glass 			break;
39*33eac2dcSSimon Glass 		}
40*33eac2dcSSimon Glass 	}
41*33eac2dcSSimon Glass 
42*33eac2dcSSimon Glass 	if (!c) {
43*33eac2dcSSimon Glass 		printf("%" PRIu64 " Hz%s", freq, s);
44*33eac2dcSSimon Glass 		return;
45*33eac2dcSSimon Glass 	}
46*33eac2dcSSimon Glass 
47*33eac2dcSSimon Glass 	f = do_div(freq, d);
48*33eac2dcSSimon Glass 	n = freq;
49*33eac2dcSSimon Glass 
50*33eac2dcSSimon Glass 	/* If there's a remainder, show the first few digits */
51*33eac2dcSSimon Glass 	if (f) {
52*33eac2dcSSimon Glass 		m = f;
53*33eac2dcSSimon Glass 		while (m > 1000)
54*33eac2dcSSimon Glass 			m /= 10;
55*33eac2dcSSimon Glass 		while (m && !(m % 10))
56*33eac2dcSSimon Glass 			m /= 10;
57*33eac2dcSSimon Glass 		if (m >= 100)
58*33eac2dcSSimon Glass 			m = (m / 10) + (m % 100 >= 50);
59*33eac2dcSSimon Glass 	}
60*33eac2dcSSimon Glass 
61*33eac2dcSSimon Glass 	printf("%lu", n);
62*33eac2dcSSimon Glass 	if (m)
63*33eac2dcSSimon Glass 		printf(".%ld", m);
64*33eac2dcSSimon Glass 	printf(" %cHz%s", c, s);
65*33eac2dcSSimon Glass }
66*33eac2dcSSimon Glass 
67c6da9ae8SSimon Glass void print_size(uint64_t size, const char *s)
6878acc472SPeter Tyser {
6952dbac69STimur Tabi 	unsigned long m = 0, n;
70c6da9ae8SSimon Glass 	uint64_t f;
714b42c905STimur Tabi 	static const char names[] = {'E', 'P', 'T', 'G', 'M', 'K'};
72f2d76ae4SNick Thompson 	unsigned long d = 10 * ARRAY_SIZE(names);
734b42c905STimur Tabi 	char c = 0;
744b42c905STimur Tabi 	unsigned int i;
7578acc472SPeter Tyser 
76f2d76ae4SNick Thompson 	for (i = 0; i < ARRAY_SIZE(names); i++, d -= 10) {
77f2d76ae4SNick Thompson 		if (size >> d) {
784b42c905STimur Tabi 			c = names[i];
794b42c905STimur Tabi 			break;
8078acc472SPeter Tyser 		}
8178acc472SPeter Tyser 	}
8278acc472SPeter Tyser 
834b42c905STimur Tabi 	if (!c) {
84c6da9ae8SSimon Glass 		printf("%" PRIu64 " Bytes%s", size, s);
854b42c905STimur Tabi 		return;
864b42c905STimur Tabi 	}
874b42c905STimur Tabi 
88f2d76ae4SNick Thompson 	n = size >> d;
89f2d76ae4SNick Thompson 	f = size & ((1ULL << d) - 1);
9078acc472SPeter Tyser 
9178acc472SPeter Tyser 	/* If there's a remainder, deal with it */
92f2d76ae4SNick Thompson 	if (f) {
93f2d76ae4SNick Thompson 		m = (10ULL * f + (1ULL << (d - 1))) >> d;
9478acc472SPeter Tyser 
9578acc472SPeter Tyser 		if (m >= 10) {
9678acc472SPeter Tyser 			m -= 10;
9778acc472SPeter Tyser 			n += 1;
9878acc472SPeter Tyser 		}
9978acc472SPeter Tyser 	}
10078acc472SPeter Tyser 
1014b42c905STimur Tabi 	printf ("%lu", n);
10278acc472SPeter Tyser 	if (m) {
10378acc472SPeter Tyser 		printf (".%ld", m);
10478acc472SPeter Tyser 	}
1054b42c905STimur Tabi 	printf (" %ciB%s", c, s);
10678acc472SPeter Tyser }
10778acc472SPeter Tyser 
10878acc472SPeter Tyser #define MAX_LINE_LENGTH_BYTES (64)
10978acc472SPeter Tyser #define DEFAULT_LINE_LENGTH_BYTES (16)
110bda32ffcSSimon Glass int print_buffer(ulong addr, const void *data, uint width, uint count,
111bda32ffcSSimon Glass 		 uint linelen)
11278acc472SPeter Tyser {
113150f7236SReinhard Meyer 	/* linebuf as a union causes proper alignment */
114150f7236SReinhard Meyer 	union linebuf {
1154d1fd7f1SYork Sun #ifdef CONFIG_SYS_SUPPORT_64BIT_DATA
1164d1fd7f1SYork Sun 		uint64_t uq[MAX_LINE_LENGTH_BYTES/sizeof(uint64_t) + 1];
1174d1fd7f1SYork Sun #endif
118150f7236SReinhard Meyer 		uint32_t ui[MAX_LINE_LENGTH_BYTES/sizeof(uint32_t) + 1];
119150f7236SReinhard Meyer 		uint16_t us[MAX_LINE_LENGTH_BYTES/sizeof(uint16_t) + 1];
120150f7236SReinhard Meyer 		uint8_t  uc[MAX_LINE_LENGTH_BYTES/sizeof(uint8_t) + 1];
121150f7236SReinhard Meyer 	} lb;
12278acc472SPeter Tyser 	int i;
1234d1fd7f1SYork Sun #ifdef CONFIG_SYS_SUPPORT_64BIT_DATA
1244d1fd7f1SYork Sun 	uint64_t x;
1254d1fd7f1SYork Sun #else
1264d1fd7f1SYork Sun 	uint32_t x;
1274d1fd7f1SYork Sun #endif
12878acc472SPeter Tyser 
12978acc472SPeter Tyser 	if (linelen*width > MAX_LINE_LENGTH_BYTES)
13078acc472SPeter Tyser 		linelen = MAX_LINE_LENGTH_BYTES / width;
13178acc472SPeter Tyser 	if (linelen < 1)
13278acc472SPeter Tyser 		linelen = DEFAULT_LINE_LENGTH_BYTES / width;
13378acc472SPeter Tyser 
13478acc472SPeter Tyser 	while (count) {
135efd7c114SAndreas Bießmann 		uint thislinelen = linelen;
13678acc472SPeter Tyser 		printf("%08lx:", addr);
13778acc472SPeter Tyser 
13878acc472SPeter Tyser 		/* check for overflow condition */
139efd7c114SAndreas Bießmann 		if (count < thislinelen)
140efd7c114SAndreas Bießmann 			thislinelen = count;
14178acc472SPeter Tyser 
14278acc472SPeter Tyser 		/* Copy from memory into linebuf and print hex values */
143efd7c114SAndreas Bießmann 		for (i = 0; i < thislinelen; i++) {
14464419e47SMike Frysinger 			if (width == 4)
145150f7236SReinhard Meyer 				x = lb.ui[i] = *(volatile uint32_t *)data;
1464d1fd7f1SYork Sun #ifdef CONFIG_SYS_SUPPORT_64BIT_DATA
1474d1fd7f1SYork Sun 			else if (width == 8)
1484d1fd7f1SYork Sun 				x = lb.uq[i] = *(volatile uint64_t *)data;
1494d1fd7f1SYork Sun #endif
15064419e47SMike Frysinger 			else if (width == 2)
151150f7236SReinhard Meyer 				x = lb.us[i] = *(volatile uint16_t *)data;
15264419e47SMike Frysinger 			else
153150f7236SReinhard Meyer 				x = lb.uc[i] = *(volatile uint8_t *)data;
1544d1fd7f1SYork Sun #ifdef CONFIG_SYS_SUPPORT_64BIT_DATA
155c6da9ae8SSimon Glass 			printf(" %0*" PRIx64, width * 2, x);
1564d1fd7f1SYork Sun #else
15764419e47SMike Frysinger 			printf(" %0*x", width * 2, x);
1584d1fd7f1SYork Sun #endif
15978acc472SPeter Tyser 			data += width;
16078acc472SPeter Tyser 		}
16178acc472SPeter Tyser 
162efd7c114SAndreas Bießmann 		while (thislinelen < linelen) {
163efd7c114SAndreas Bießmann 			/* fill line with whitespace for nice ASCII print */
164efd7c114SAndreas Bießmann 			for (i=0; i<width*2+1; i++)
165efd7c114SAndreas Bießmann 				puts(" ");
166efd7c114SAndreas Bießmann 			linelen--;
167efd7c114SAndreas Bießmann 		}
168efd7c114SAndreas Bießmann 
16978acc472SPeter Tyser 		/* Print data in ASCII characters */
170efd7c114SAndreas Bießmann 		for (i = 0; i < thislinelen * width; i++) {
171150f7236SReinhard Meyer 			if (!isprint(lb.uc[i]) || lb.uc[i] >= 0x80)
172150f7236SReinhard Meyer 				lb.uc[i] = '.';
173150f7236SReinhard Meyer 		}
174150f7236SReinhard Meyer 		lb.uc[i] = '\0';
175150f7236SReinhard Meyer 		printf("    %s\n", lb.uc);
17678acc472SPeter Tyser 
17778acc472SPeter Tyser 		/* update references */
178efd7c114SAndreas Bießmann 		addr += thislinelen * width;
179efd7c114SAndreas Bießmann 		count -= thislinelen;
18078acc472SPeter Tyser 
18178acc472SPeter Tyser 		if (ctrlc())
18278acc472SPeter Tyser 			return -1;
18378acc472SPeter Tyser 	}
18478acc472SPeter Tyser 
18578acc472SPeter Tyser 	return 0;
18678acc472SPeter Tyser }
187