xref: /rk3399_rockchip-uboot/lib/display_options.c (revision 80402f34f8e1f46134a0272ff4d34be64ff7380b)
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 {
28*80402f34SHeiko Schocher 	unsigned long m = 0;
29*80402f34SHeiko Schocher #if defined(CONFIG_SPL_SERIAL_SUPPORT)
30*80402f34SHeiko Schocher 	unsigned long n;
31*80402f34SHeiko Schocher #endif
3233eac2dcSSimon Glass 	uint32_t f;
3333eac2dcSSimon Glass 	static const char names[] = {'G', 'M', 'K'};
3433eac2dcSSimon Glass 	unsigned long d = 1e9;
3533eac2dcSSimon Glass 	char c = 0;
3633eac2dcSSimon Glass 	unsigned int i;
3733eac2dcSSimon Glass 
3833eac2dcSSimon Glass 	for (i = 0; i < ARRAY_SIZE(names); i++, d /= 1000) {
3933eac2dcSSimon Glass 		if (freq >= d) {
4033eac2dcSSimon Glass 			c = names[i];
4133eac2dcSSimon Glass 			break;
4233eac2dcSSimon Glass 		}
4333eac2dcSSimon Glass 	}
4433eac2dcSSimon Glass 
4533eac2dcSSimon Glass 	if (!c) {
4633eac2dcSSimon Glass 		printf("%" PRIu64 " Hz%s", freq, s);
4733eac2dcSSimon Glass 		return;
4833eac2dcSSimon Glass 	}
4933eac2dcSSimon Glass 
5033eac2dcSSimon Glass 	f = do_div(freq, d);
51*80402f34SHeiko Schocher #if defined(CONFIG_SPL_SERIAL_SUPPORT)
5233eac2dcSSimon Glass 	n = freq;
53*80402f34SHeiko Schocher #endif
5433eac2dcSSimon Glass 
5533eac2dcSSimon Glass 	/* If there's a remainder, show the first few digits */
5633eac2dcSSimon Glass 	if (f) {
5733eac2dcSSimon Glass 		m = f;
5833eac2dcSSimon Glass 		while (m > 1000)
5933eac2dcSSimon Glass 			m /= 10;
6033eac2dcSSimon Glass 		while (m && !(m % 10))
6133eac2dcSSimon Glass 			m /= 10;
6233eac2dcSSimon Glass 		if (m >= 100)
6333eac2dcSSimon Glass 			m = (m / 10) + (m % 100 >= 50);
6433eac2dcSSimon Glass 	}
6533eac2dcSSimon Glass 
66*80402f34SHeiko Schocher #if defined(CONFIG_SPL_SERIAL_SUPPORT)
6733eac2dcSSimon Glass 	printf("%lu", n);
68*80402f34SHeiko Schocher #endif
6933eac2dcSSimon Glass 	if (m)
7033eac2dcSSimon Glass 		printf(".%ld", m);
7133eac2dcSSimon Glass 	printf(" %cHz%s", c, s);
7233eac2dcSSimon Glass }
7333eac2dcSSimon Glass 
74c6da9ae8SSimon Glass void print_size(uint64_t size, const char *s)
7578acc472SPeter Tyser {
7652dbac69STimur Tabi 	unsigned long m = 0, n;
77c6da9ae8SSimon Glass 	uint64_t f;
784b42c905STimur Tabi 	static const char names[] = {'E', 'P', 'T', 'G', 'M', 'K'};
79f2d76ae4SNick Thompson 	unsigned long d = 10 * ARRAY_SIZE(names);
804b42c905STimur Tabi 	char c = 0;
814b42c905STimur Tabi 	unsigned int i;
8278acc472SPeter Tyser 
83f2d76ae4SNick Thompson 	for (i = 0; i < ARRAY_SIZE(names); i++, d -= 10) {
84f2d76ae4SNick Thompson 		if (size >> d) {
854b42c905STimur Tabi 			c = names[i];
864b42c905STimur Tabi 			break;
8778acc472SPeter Tyser 		}
8878acc472SPeter Tyser 	}
8978acc472SPeter Tyser 
904b42c905STimur Tabi 	if (!c) {
91c6da9ae8SSimon Glass 		printf("%" PRIu64 " Bytes%s", size, s);
924b42c905STimur Tabi 		return;
934b42c905STimur Tabi 	}
944b42c905STimur Tabi 
95f2d76ae4SNick Thompson 	n = size >> d;
96f2d76ae4SNick Thompson 	f = size & ((1ULL << d) - 1);
9778acc472SPeter Tyser 
9878acc472SPeter Tyser 	/* If there's a remainder, deal with it */
99f2d76ae4SNick Thompson 	if (f) {
100f2d76ae4SNick Thompson 		m = (10ULL * f + (1ULL << (d - 1))) >> d;
10178acc472SPeter Tyser 
10278acc472SPeter Tyser 		if (m >= 10) {
10378acc472SPeter Tyser 			m -= 10;
10478acc472SPeter Tyser 			n += 1;
10578acc472SPeter Tyser 		}
10678acc472SPeter Tyser 	}
10778acc472SPeter Tyser 
1084b42c905STimur Tabi 	printf ("%lu", n);
10978acc472SPeter Tyser 	if (m) {
11078acc472SPeter Tyser 		printf (".%ld", m);
11178acc472SPeter Tyser 	}
1124b42c905STimur Tabi 	printf (" %ciB%s", c, s);
11378acc472SPeter Tyser }
11478acc472SPeter Tyser 
11578acc472SPeter Tyser #define MAX_LINE_LENGTH_BYTES (64)
11678acc472SPeter Tyser #define DEFAULT_LINE_LENGTH_BYTES (16)
117bda32ffcSSimon Glass int print_buffer(ulong addr, const void *data, uint width, uint count,
118bda32ffcSSimon Glass 		 uint linelen)
11978acc472SPeter Tyser {
120150f7236SReinhard Meyer 	/* linebuf as a union causes proper alignment */
121150f7236SReinhard Meyer 	union linebuf {
1224d1fd7f1SYork Sun #ifdef CONFIG_SYS_SUPPORT_64BIT_DATA
1234d1fd7f1SYork Sun 		uint64_t uq[MAX_LINE_LENGTH_BYTES/sizeof(uint64_t) + 1];
1244d1fd7f1SYork Sun #endif
125150f7236SReinhard Meyer 		uint32_t ui[MAX_LINE_LENGTH_BYTES/sizeof(uint32_t) + 1];
126150f7236SReinhard Meyer 		uint16_t us[MAX_LINE_LENGTH_BYTES/sizeof(uint16_t) + 1];
127150f7236SReinhard Meyer 		uint8_t  uc[MAX_LINE_LENGTH_BYTES/sizeof(uint8_t) + 1];
128150f7236SReinhard Meyer 	} lb;
12978acc472SPeter Tyser 	int i;
1304d1fd7f1SYork Sun #ifdef CONFIG_SYS_SUPPORT_64BIT_DATA
131*80402f34SHeiko Schocher 	uint64_t __maybe_unused x;
1324d1fd7f1SYork Sun #else
133*80402f34SHeiko Schocher 	uint32_t __maybe_unused x;
1344d1fd7f1SYork Sun #endif
13578acc472SPeter Tyser 
13678acc472SPeter Tyser 	if (linelen*width > MAX_LINE_LENGTH_BYTES)
13778acc472SPeter Tyser 		linelen = MAX_LINE_LENGTH_BYTES / width;
13878acc472SPeter Tyser 	if (linelen < 1)
13978acc472SPeter Tyser 		linelen = DEFAULT_LINE_LENGTH_BYTES / width;
14078acc472SPeter Tyser 
14178acc472SPeter Tyser 	while (count) {
142efd7c114SAndreas Bießmann 		uint thislinelen = linelen;
14378acc472SPeter Tyser 		printf("%08lx:", addr);
14478acc472SPeter Tyser 
14578acc472SPeter Tyser 		/* check for overflow condition */
146efd7c114SAndreas Bießmann 		if (count < thislinelen)
147efd7c114SAndreas Bießmann 			thislinelen = count;
14878acc472SPeter Tyser 
14978acc472SPeter Tyser 		/* Copy from memory into linebuf and print hex values */
150efd7c114SAndreas Bießmann 		for (i = 0; i < thislinelen; i++) {
15164419e47SMike Frysinger 			if (width == 4)
152150f7236SReinhard Meyer 				x = lb.ui[i] = *(volatile uint32_t *)data;
1534d1fd7f1SYork Sun #ifdef CONFIG_SYS_SUPPORT_64BIT_DATA
1544d1fd7f1SYork Sun 			else if (width == 8)
1554d1fd7f1SYork Sun 				x = lb.uq[i] = *(volatile uint64_t *)data;
1564d1fd7f1SYork Sun #endif
15764419e47SMike Frysinger 			else if (width == 2)
158150f7236SReinhard Meyer 				x = lb.us[i] = *(volatile uint16_t *)data;
15964419e47SMike Frysinger 			else
160150f7236SReinhard Meyer 				x = lb.uc[i] = *(volatile uint8_t *)data;
1614d1fd7f1SYork Sun #ifdef CONFIG_SYS_SUPPORT_64BIT_DATA
16266da9bebSSimon Glass 			printf(" %0*llx", width * 2, (long long)x);
1634d1fd7f1SYork Sun #else
16464419e47SMike Frysinger 			printf(" %0*x", width * 2, x);
1654d1fd7f1SYork Sun #endif
16678acc472SPeter Tyser 			data += width;
16778acc472SPeter Tyser 		}
16878acc472SPeter Tyser 
169efd7c114SAndreas Bießmann 		while (thislinelen < linelen) {
170efd7c114SAndreas Bießmann 			/* fill line with whitespace for nice ASCII print */
171efd7c114SAndreas Bießmann 			for (i=0; i<width*2+1; i++)
172efd7c114SAndreas Bießmann 				puts(" ");
173efd7c114SAndreas Bießmann 			linelen--;
174efd7c114SAndreas Bießmann 		}
175efd7c114SAndreas Bießmann 
17678acc472SPeter Tyser 		/* Print data in ASCII characters */
177efd7c114SAndreas Bießmann 		for (i = 0; i < thislinelen * width; i++) {
178150f7236SReinhard Meyer 			if (!isprint(lb.uc[i]) || lb.uc[i] >= 0x80)
179150f7236SReinhard Meyer 				lb.uc[i] = '.';
180150f7236SReinhard Meyer 		}
181150f7236SReinhard Meyer 		lb.uc[i] = '\0';
182150f7236SReinhard Meyer 		printf("    %s\n", lb.uc);
18378acc472SPeter Tyser 
18478acc472SPeter Tyser 		/* update references */
185efd7c114SAndreas Bießmann 		addr += thislinelen * width;
186efd7c114SAndreas Bießmann 		count -= thislinelen;
18778acc472SPeter Tyser 
18878acc472SPeter Tyser 		if (ctrlc())
18978acc472SPeter Tyser 			return -1;
19078acc472SPeter Tyser 	}
19178acc472SPeter Tyser 
19278acc472SPeter Tyser 	return 0;
19378acc472SPeter Tyser }
194