xref: /rk3399_rockchip-uboot/lib/display_options.c (revision e9015b304ad2a39a03f2684dadeabef474b7addb)
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>
1033eac2dcSSimon 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 
2633eac2dcSSimon Glass void print_freq(uint64_t freq, const char *s)
2733eac2dcSSimon Glass {
2880402f34SHeiko Schocher 	unsigned long m = 0;
2933eac2dcSSimon Glass 	uint32_t f;
3033eac2dcSSimon Glass 	static const char names[] = {'G', 'M', 'K'};
3133eac2dcSSimon Glass 	unsigned long d = 1e9;
3233eac2dcSSimon Glass 	char c = 0;
3333eac2dcSSimon Glass 	unsigned int i;
3433eac2dcSSimon Glass 
3533eac2dcSSimon Glass 	for (i = 0; i < ARRAY_SIZE(names); i++, d /= 1000) {
3633eac2dcSSimon Glass 		if (freq >= d) {
3733eac2dcSSimon Glass 			c = names[i];
3833eac2dcSSimon Glass 			break;
3933eac2dcSSimon Glass 		}
4033eac2dcSSimon Glass 	}
4133eac2dcSSimon Glass 
4233eac2dcSSimon Glass 	if (!c) {
4333eac2dcSSimon Glass 		printf("%" PRIu64 " Hz%s", freq, s);
4433eac2dcSSimon Glass 		return;
4533eac2dcSSimon Glass 	}
4633eac2dcSSimon Glass 
4733eac2dcSSimon Glass 	f = do_div(freq, d);
4833eac2dcSSimon Glass 
4933eac2dcSSimon Glass 	/* If there's a remainder, show the first few digits */
5033eac2dcSSimon Glass 	if (f) {
5133eac2dcSSimon Glass 		m = f;
5233eac2dcSSimon Glass 		while (m > 1000)
5333eac2dcSSimon Glass 			m /= 10;
5433eac2dcSSimon Glass 		while (m && !(m % 10))
5533eac2dcSSimon Glass 			m /= 10;
5633eac2dcSSimon Glass 		if (m >= 100)
5733eac2dcSSimon Glass 			m = (m / 10) + (m % 100 >= 50);
5833eac2dcSSimon Glass 	}
5933eac2dcSSimon Glass 
60*e9015b30SSuriyan Ramasami 	printf("%lu", (unsigned long) freq);
6133eac2dcSSimon Glass 	if (m)
6233eac2dcSSimon Glass 		printf(".%ld", m);
6333eac2dcSSimon Glass 	printf(" %cHz%s", c, s);
6433eac2dcSSimon Glass }
6533eac2dcSSimon Glass 
66c6da9ae8SSimon Glass void print_size(uint64_t size, const char *s)
6778acc472SPeter Tyser {
6852dbac69STimur Tabi 	unsigned long m = 0, n;
69c6da9ae8SSimon Glass 	uint64_t f;
704b42c905STimur Tabi 	static const char names[] = {'E', 'P', 'T', 'G', 'M', 'K'};
71f2d76ae4SNick Thompson 	unsigned long d = 10 * ARRAY_SIZE(names);
724b42c905STimur Tabi 	char c = 0;
734b42c905STimur Tabi 	unsigned int i;
7478acc472SPeter Tyser 
75f2d76ae4SNick Thompson 	for (i = 0; i < ARRAY_SIZE(names); i++, d -= 10) {
76f2d76ae4SNick Thompson 		if (size >> d) {
774b42c905STimur Tabi 			c = names[i];
784b42c905STimur Tabi 			break;
7978acc472SPeter Tyser 		}
8078acc472SPeter Tyser 	}
8178acc472SPeter Tyser 
824b42c905STimur Tabi 	if (!c) {
83c6da9ae8SSimon Glass 		printf("%" PRIu64 " Bytes%s", size, s);
844b42c905STimur Tabi 		return;
854b42c905STimur Tabi 	}
864b42c905STimur Tabi 
87f2d76ae4SNick Thompson 	n = size >> d;
88f2d76ae4SNick Thompson 	f = size & ((1ULL << d) - 1);
8978acc472SPeter Tyser 
9078acc472SPeter Tyser 	/* If there's a remainder, deal with it */
91f2d76ae4SNick Thompson 	if (f) {
92f2d76ae4SNick Thompson 		m = (10ULL * f + (1ULL << (d - 1))) >> d;
9378acc472SPeter Tyser 
9478acc472SPeter Tyser 		if (m >= 10) {
9578acc472SPeter Tyser 			m -= 10;
9678acc472SPeter Tyser 			n += 1;
9778acc472SPeter Tyser 		}
9878acc472SPeter Tyser 	}
9978acc472SPeter Tyser 
1004b42c905STimur Tabi 	printf ("%lu", n);
10178acc472SPeter Tyser 	if (m) {
10278acc472SPeter Tyser 		printf (".%ld", m);
10378acc472SPeter Tyser 	}
1044b42c905STimur Tabi 	printf (" %ciB%s", c, s);
10578acc472SPeter Tyser }
10678acc472SPeter Tyser 
10778acc472SPeter Tyser #define MAX_LINE_LENGTH_BYTES (64)
10878acc472SPeter Tyser #define DEFAULT_LINE_LENGTH_BYTES (16)
109bda32ffcSSimon Glass int print_buffer(ulong addr, const void *data, uint width, uint count,
110bda32ffcSSimon Glass 		 uint linelen)
11178acc472SPeter Tyser {
112150f7236SReinhard Meyer 	/* linebuf as a union causes proper alignment */
113150f7236SReinhard Meyer 	union linebuf {
1144d1fd7f1SYork Sun #ifdef CONFIG_SYS_SUPPORT_64BIT_DATA
1154d1fd7f1SYork Sun 		uint64_t uq[MAX_LINE_LENGTH_BYTES/sizeof(uint64_t) + 1];
1164d1fd7f1SYork Sun #endif
117150f7236SReinhard Meyer 		uint32_t ui[MAX_LINE_LENGTH_BYTES/sizeof(uint32_t) + 1];
118150f7236SReinhard Meyer 		uint16_t us[MAX_LINE_LENGTH_BYTES/sizeof(uint16_t) + 1];
119150f7236SReinhard Meyer 		uint8_t  uc[MAX_LINE_LENGTH_BYTES/sizeof(uint8_t) + 1];
120150f7236SReinhard Meyer 	} lb;
12178acc472SPeter Tyser 	int i;
1224d1fd7f1SYork Sun #ifdef CONFIG_SYS_SUPPORT_64BIT_DATA
12380402f34SHeiko Schocher 	uint64_t __maybe_unused x;
1244d1fd7f1SYork Sun #else
12580402f34SHeiko Schocher 	uint32_t __maybe_unused x;
1264d1fd7f1SYork Sun #endif
12778acc472SPeter Tyser 
12878acc472SPeter Tyser 	if (linelen*width > MAX_LINE_LENGTH_BYTES)
12978acc472SPeter Tyser 		linelen = MAX_LINE_LENGTH_BYTES / width;
13078acc472SPeter Tyser 	if (linelen < 1)
13178acc472SPeter Tyser 		linelen = DEFAULT_LINE_LENGTH_BYTES / width;
13278acc472SPeter Tyser 
13378acc472SPeter Tyser 	while (count) {
134efd7c114SAndreas Bießmann 		uint thislinelen = linelen;
13578acc472SPeter Tyser 		printf("%08lx:", addr);
13678acc472SPeter Tyser 
13778acc472SPeter Tyser 		/* check for overflow condition */
138efd7c114SAndreas Bießmann 		if (count < thislinelen)
139efd7c114SAndreas Bießmann 			thislinelen = count;
14078acc472SPeter Tyser 
14178acc472SPeter Tyser 		/* Copy from memory into linebuf and print hex values */
142efd7c114SAndreas Bießmann 		for (i = 0; i < thislinelen; i++) {
14364419e47SMike Frysinger 			if (width == 4)
144150f7236SReinhard Meyer 				x = lb.ui[i] = *(volatile uint32_t *)data;
1454d1fd7f1SYork Sun #ifdef CONFIG_SYS_SUPPORT_64BIT_DATA
1464d1fd7f1SYork Sun 			else if (width == 8)
1474d1fd7f1SYork Sun 				x = lb.uq[i] = *(volatile uint64_t *)data;
1484d1fd7f1SYork Sun #endif
14964419e47SMike Frysinger 			else if (width == 2)
150150f7236SReinhard Meyer 				x = lb.us[i] = *(volatile uint16_t *)data;
15164419e47SMike Frysinger 			else
152150f7236SReinhard Meyer 				x = lb.uc[i] = *(volatile uint8_t *)data;
1534d1fd7f1SYork Sun #ifdef CONFIG_SYS_SUPPORT_64BIT_DATA
15466da9bebSSimon Glass 			printf(" %0*llx", width * 2, (long long)x);
1554d1fd7f1SYork Sun #else
15664419e47SMike Frysinger 			printf(" %0*x", width * 2, x);
1574d1fd7f1SYork Sun #endif
15878acc472SPeter Tyser 			data += width;
15978acc472SPeter Tyser 		}
16078acc472SPeter Tyser 
161efd7c114SAndreas Bießmann 		while (thislinelen < linelen) {
162efd7c114SAndreas Bießmann 			/* fill line with whitespace for nice ASCII print */
163efd7c114SAndreas Bießmann 			for (i=0; i<width*2+1; i++)
164efd7c114SAndreas Bießmann 				puts(" ");
165efd7c114SAndreas Bießmann 			linelen--;
166efd7c114SAndreas Bießmann 		}
167efd7c114SAndreas Bießmann 
16878acc472SPeter Tyser 		/* Print data in ASCII characters */
169efd7c114SAndreas Bießmann 		for (i = 0; i < thislinelen * width; i++) {
170150f7236SReinhard Meyer 			if (!isprint(lb.uc[i]) || lb.uc[i] >= 0x80)
171150f7236SReinhard Meyer 				lb.uc[i] = '.';
172150f7236SReinhard Meyer 		}
173150f7236SReinhard Meyer 		lb.uc[i] = '\0';
174150f7236SReinhard Meyer 		printf("    %s\n", lb.uc);
17578acc472SPeter Tyser 
17678acc472SPeter Tyser 		/* update references */
177efd7c114SAndreas Bießmann 		addr += thislinelen * width;
178efd7c114SAndreas Bießmann 		count -= thislinelen;
17978acc472SPeter Tyser 
18078acc472SPeter Tyser 		if (ctrlc())
18178acc472SPeter Tyser 			return -1;
18278acc472SPeter Tyser 	}
18378acc472SPeter Tyser 
18478acc472SPeter Tyser 	return 0;
18578acc472SPeter Tyser }
186