mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-12-21 02:33:07 +00:00
3a8ee3df83
This uclass is intended to provide a way to obtain information about a U-Boot board. But the concept of a U-Boot 'board' is the whole system, not just one circuit board, meaning that 'board' is something of a misnomer for this uclass. In addition, the name 'board' is a bit overused in U-Boot and we want to use the same uclass to provide SMBIOS information. The obvious name is 'system' but that is so vague as to be meaningless. Use 'sysinfo' instead, since this uclass is aimed at providing information on the system. Rename everything accordingly. Note: Due to the patch delta caused by the symbol renames, this patch shows some renamed files as being deleted in one place and created in another. Signed-off-by: Simon Glass <sjg@chromium.org> Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
185 lines
4 KiB
C
185 lines
4 KiB
C
/*
|
|
* (C) Copyright 2015
|
|
* Dirk Eibach, Guntermann & Drunck GmbH, eibach@gdsys.de
|
|
*
|
|
* SPDX-License-Identifier: GPL-2.0+
|
|
*/
|
|
|
|
#include <common.h>
|
|
#include <command.h>
|
|
#include <dm.h>
|
|
#include <env.h>
|
|
#include <fdt_support.h>
|
|
#include <fsl_esdhc.h>
|
|
#include <init.h>
|
|
#include <miiphy.h>
|
|
#include <misc.h>
|
|
#include <sysinfo.h>
|
|
#include <tpm-v1.h>
|
|
#include <video_osd.h>
|
|
|
|
#include "../common/ihs_mdio.h"
|
|
#include "../../../drivers/sysinfo/gazerbeam.h"
|
|
|
|
DECLARE_GLOBAL_DATA_PTR;
|
|
|
|
struct ihs_mdio_info ihs_mdio_info[] = {
|
|
{ .fpga = NULL, .name = "ihs0", .base = 0x58 },
|
|
{ .fpga = NULL, .name = "ihs1", .base = 0x58 },
|
|
};
|
|
|
|
static int get_tpm(struct udevice **devp)
|
|
{
|
|
int rc;
|
|
|
|
rc = uclass_first_device_err(UCLASS_TPM, devp);
|
|
if (rc) {
|
|
printf("Could not find TPM (ret=%d)\n", rc);
|
|
return CMD_RET_FAILURE;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int board_early_init_r(void)
|
|
{
|
|
struct udevice *sysinfo;
|
|
struct udevice *serdes;
|
|
int mc = 0;
|
|
int con = 0;
|
|
|
|
if (sysinfo_get(&sysinfo))
|
|
puts("Could not find sysinfo information device.\n");
|
|
|
|
/* Initialize serdes */
|
|
uclass_get_device_by_phandle(UCLASS_MISC, sysinfo, "serdes", &serdes);
|
|
|
|
if (sysinfo_detect(sysinfo))
|
|
puts("Device information detection failed.\n");
|
|
|
|
sysinfo_get_int(sysinfo, BOARD_MULTICHANNEL, &mc);
|
|
sysinfo_get_int(sysinfo, BOARD_VARIANT, &con);
|
|
|
|
if (mc == 2 || mc == 1)
|
|
dev_disable_by_path("/immr@e0000000/i2c@3100/pca9698@22");
|
|
|
|
if (mc == 4) {
|
|
dev_disable_by_path("/immr@e0000000/i2c@3100/pca9698@20");
|
|
dev_enable_by_path("/localbus@e0005000/iocon_uart@2,0");
|
|
dev_enable_by_path("/fpga1bus");
|
|
}
|
|
|
|
if (mc == 2 || con == VAR_CON) {
|
|
dev_enable_by_path("/fpga0bus/fpga0_video1");
|
|
dev_enable_by_path("/fpga0bus/fpga0_iic_video1");
|
|
dev_enable_by_path("/fpga0bus/fpga0_axi_video1");
|
|
}
|
|
|
|
if (con == VAR_CON) {
|
|
dev_enable_by_path("/fpga0bus/fpga0_video0");
|
|
dev_enable_by_path("/fpga0bus/fpga0_iic_video0");
|
|
dev_enable_by_path("/fpga0bus/fpga0_axi_video0");
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int checksysinfo(void)
|
|
{
|
|
struct udevice *sysinfo;
|
|
char *s = env_get("serial#");
|
|
int mc = 0;
|
|
int con = 0;
|
|
|
|
if (sysinfo_get(&sysinfo))
|
|
puts("Could not find sysinfo information device.\n");
|
|
|
|
sysinfo_get_int(sysinfo, BOARD_MULTICHANNEL, &mc);
|
|
sysinfo_get_int(sysinfo, BOARD_VARIANT, &con);
|
|
|
|
puts("Board: Gazerbeam ");
|
|
printf("%s ", mc == 4 ? "MC4" : mc == 2 ? "MC2" : "SC");
|
|
printf("%s", con == VAR_CON ? "CON" : "CPU");
|
|
|
|
if (s) {
|
|
puts(", serial# ");
|
|
puts(s);
|
|
}
|
|
|
|
puts("\n");
|
|
|
|
return 0;
|
|
}
|
|
|
|
static void display_osd_info(struct udevice *osd,
|
|
struct video_osd_info *osd_info)
|
|
{
|
|
printf("OSD-%s: Digital-OSD version %01d.%02d, %d x %d characters\n",
|
|
osd->name, osd_info->major_version, osd_info->minor_version,
|
|
osd_info->width, osd_info->height);
|
|
}
|
|
|
|
int last_stage_init(void)
|
|
{
|
|
int fpga_hw_rev = 0;
|
|
int i;
|
|
struct udevice *sysinfo;
|
|
struct udevice *osd;
|
|
struct video_osd_info osd_info;
|
|
struct udevice *tpm;
|
|
int ret;
|
|
|
|
if (sysinfo_get(&sysinfo))
|
|
puts("Could not find sysinfo information device.\n");
|
|
|
|
if (sysinfo) {
|
|
int res = sysinfo_get_int(sysinfo, BOARD_HWVERSION,
|
|
&fpga_hw_rev);
|
|
|
|
if (res)
|
|
printf("Could not determind FPGA HW revision (res = %d)\n",
|
|
res);
|
|
}
|
|
|
|
env_set_ulong("fpga_hw_rev", fpga_hw_rev);
|
|
|
|
ret = get_tpm(&tpm);
|
|
if (ret || tpm_init(tpm) || tpm_startup(tpm, TPM_ST_CLEAR) ||
|
|
tpm_continue_self_test(tpm)) {
|
|
printf("TPM init failed\n");
|
|
}
|
|
|
|
if (fpga_hw_rev >= 4) {
|
|
for (i = 0; i < 4; i++) {
|
|
struct udevice *rxaui;
|
|
char name[8];
|
|
|
|
snprintf(name, sizeof(name), "rxaui%d", i);
|
|
/* Disable RXAUI polarity inversion */
|
|
ret = uclass_get_device_by_phandle(UCLASS_MISC, sysinfo,
|
|
name, &rxaui);
|
|
if (!ret)
|
|
misc_set_enabled(rxaui, false);
|
|
}
|
|
}
|
|
|
|
for (uclass_first_device(UCLASS_VIDEO_OSD, &osd);
|
|
osd;
|
|
uclass_next_device(&osd)) {
|
|
video_osd_get_info(osd, &osd_info);
|
|
display_osd_info(osd, &osd_info);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
#if defined(CONFIG_OF_BOARD_SETUP)
|
|
int ft_board_setup(void *blob, struct bd_info *bd)
|
|
{
|
|
ft_cpu_setup(blob, bd);
|
|
fsl_fdt_fixup_dr_usb(blob, bd);
|
|
fdt_fixup_esdhc(blob, bd);
|
|
|
|
return 0;
|
|
}
|
|
#endif
|