183d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
282e0646aSWenyou Yang /*
382e0646aSWenyou Yang  * Copyright (C) 2017 Microchip
482e0646aSWenyou Yang  *		      Wenyou Yang <wenyou.yang@microchip.com>
582e0646aSWenyou Yang  */
682e0646aSWenyou Yang 
782e0646aSWenyou Yang #include <common.h>
882e0646aSWenyou Yang #include <atmel_lcd.h>
982e0646aSWenyou Yang #include <dm.h>
1082e0646aSWenyou Yang #include <nand.h>
1182e0646aSWenyou Yang #include <version.h>
1282e0646aSWenyou Yang #include <video.h>
1382e0646aSWenyou Yang #include <video_console.h>
1482e0646aSWenyou Yang #include <asm/io.h>
1582e0646aSWenyou Yang #include <asm/arch/clk.h>
1682e0646aSWenyou Yang 
1782e0646aSWenyou Yang DECLARE_GLOBAL_DATA_PTR;
1882e0646aSWenyou Yang 
at91_video_show_board_info(void)1982e0646aSWenyou Yang int at91_video_show_board_info(void)
2082e0646aSWenyou Yang {
21*9949ee87SSimon Glass 	struct vidconsole_priv *priv;
2282e0646aSWenyou Yang 	ulong dram_size, nand_size;
2382e0646aSWenyou Yang 	int i;
2482e0646aSWenyou Yang 	u32 len = 0;
2582e0646aSWenyou Yang 	char buf[255];
2682e0646aSWenyou Yang 	char *corp = "2017 Microchip Technology Inc.\n";
2782e0646aSWenyou Yang 	char temp[32];
2882e0646aSWenyou Yang 	struct udevice *dev, *con;
2982e0646aSWenyou Yang 	const char *s;
3082e0646aSWenyou Yang 	vidinfo_t logo_info;
3182e0646aSWenyou Yang 	int ret;
3282e0646aSWenyou Yang 
3382e0646aSWenyou Yang 	len += sprintf(&buf[len], "%s\n", U_BOOT_VERSION);
3482e0646aSWenyou Yang 	memcpy(&buf[len], corp, strlen(corp));
3582e0646aSWenyou Yang 	len += strlen(corp);
3682e0646aSWenyou Yang 	len += sprintf(&buf[len], "%s CPU at %s MHz\n", get_cpu_name(),
3782e0646aSWenyou Yang 			strmhz(temp, get_cpu_clk_rate()));
3882e0646aSWenyou Yang 
3982e0646aSWenyou Yang 	dram_size = 0;
4082e0646aSWenyou Yang 	for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++)
4182e0646aSWenyou Yang 		dram_size += gd->bd->bi_dram[i].size;
4282e0646aSWenyou Yang 
4382e0646aSWenyou Yang 	nand_size = 0;
4482e0646aSWenyou Yang #ifdef CONFIG_NAND_ATMEL
4582e0646aSWenyou Yang 	for (i = 0; i < CONFIG_SYS_MAX_NAND_DEVICE; i++)
46e974b081SWenyou Yang 		nand_size += get_nand_dev_by_index(i)->size;
4782e0646aSWenyou Yang #endif
4882e0646aSWenyou Yang 
4982e0646aSWenyou Yang 	len += sprintf(&buf[len], "%ld MB SDRAM, %ld MB NAND\n",
5082e0646aSWenyou Yang 		       dram_size >> 20, nand_size >> 20);
5182e0646aSWenyou Yang 
5282e0646aSWenyou Yang 	ret = uclass_get_device(UCLASS_VIDEO, 0, &dev);
5382e0646aSWenyou Yang 	if (ret)
5482e0646aSWenyou Yang 		return ret;
5582e0646aSWenyou Yang 
5682e0646aSWenyou Yang 	microchip_logo_info(&logo_info);
5782e0646aSWenyou Yang 	ret = video_bmp_display(dev, logo_info.logo_addr,
5882e0646aSWenyou Yang 				logo_info.logo_x_offset,
5982e0646aSWenyou Yang 				logo_info.logo_y_offset, false);
6082e0646aSWenyou Yang 	if (ret)
6182e0646aSWenyou Yang 		return ret;
6282e0646aSWenyou Yang 
6382e0646aSWenyou Yang 	ret = uclass_get_device(UCLASS_VIDEO_CONSOLE, 0, &con);
6482e0646aSWenyou Yang 	if (ret)
6582e0646aSWenyou Yang 		return ret;
6682e0646aSWenyou Yang 
67*9949ee87SSimon Glass 	priv = dev_get_uclass_priv(con);
68*9949ee87SSimon Glass 	vidconsole_position_cursor(con, 0, (logo_info.logo_height +
69*9949ee87SSimon Glass 				   priv->y_charsize - 1) / priv->y_charsize);
7082e0646aSWenyou Yang 	for (s = buf, i = 0; i < len; s++, i++)
7182e0646aSWenyou Yang 		vidconsole_put_char(con, *s);
7282e0646aSWenyou Yang 
7382e0646aSWenyou Yang 	return 0;
7482e0646aSWenyou Yang }
75