blob: ba88401f13da5841ee91cc335a095387e16ac0ce [file] [log] [blame]
Dirk Eibachd494cdb2019-03-29 10:18:19 +01001/*
2 * (C) Copyright 2015
3 * Dirk Eibach, Guntermann & Drunck GmbH, eibach@gdsys.de
4 *
5 * SPDX-License-Identifier: GPL-2.0+
6 */
7
8#include <common.h>
Simon Glass09140112020-05-10 11:40:03 -06009#include <command.h>
Dirk Eibachd494cdb2019-03-29 10:18:19 +010010#include <dm.h>
Simon Glass168068f2019-08-01 09:46:47 -060011#include <env.h>
Dirk Eibachd494cdb2019-03-29 10:18:19 +010012#include <fdt_support.h>
13#include <fsl_esdhc.h>
Simon Glass52559322019-11-14 12:57:46 -070014#include <init.h>
Dirk Eibachd494cdb2019-03-29 10:18:19 +010015#include <miiphy.h>
16#include <misc.h>
Simon Glass3a8ee3d2020-11-05 06:32:05 -070017#include <sysinfo.h>
Dirk Eibachd494cdb2019-03-29 10:18:19 +010018#include <tpm-v1.h>
19#include <video_osd.h>
Simon Glass401d1c42020-10-30 21:38:53 -060020#include <asm/global_data.h>
Dirk Eibachd494cdb2019-03-29 10:18:19 +010021
22#include "../common/ihs_mdio.h"
Simon Glass3a8ee3d2020-11-05 06:32:05 -070023#include "../../../drivers/sysinfo/gazerbeam.h"
Dirk Eibachd494cdb2019-03-29 10:18:19 +010024
25DECLARE_GLOBAL_DATA_PTR;
26
27struct ihs_mdio_info ihs_mdio_info[] = {
28 { .fpga = NULL, .name = "ihs0", .base = 0x58 },
29 { .fpga = NULL, .name = "ihs1", .base = 0x58 },
30};
31
32static int get_tpm(struct udevice **devp)
33{
34 int rc;
35
36 rc = uclass_first_device_err(UCLASS_TPM, devp);
37 if (rc) {
38 printf("Could not find TPM (ret=%d)\n", rc);
39 return CMD_RET_FAILURE;
40 }
41
42 return 0;
43}
44
45int board_early_init_r(void)
46{
Simon Glass3a8ee3d2020-11-05 06:32:05 -070047 struct udevice *sysinfo;
Dirk Eibachd494cdb2019-03-29 10:18:19 +010048 struct udevice *serdes;
49 int mc = 0;
50 int con = 0;
51
Michal Suchanek7b2aa212022-10-12 21:58:04 +020052 if (sysinfo_get(&sysinfo)) {
Simon Glass3a8ee3d2020-11-05 06:32:05 -070053 puts("Could not find sysinfo information device.\n");
Michal Suchanek7b2aa212022-10-12 21:58:04 +020054 sysinfo = NULL;
55 }
Dirk Eibachd494cdb2019-03-29 10:18:19 +010056
57 /* Initialize serdes */
Simon Glass3a8ee3d2020-11-05 06:32:05 -070058 uclass_get_device_by_phandle(UCLASS_MISC, sysinfo, "serdes", &serdes);
Dirk Eibachd494cdb2019-03-29 10:18:19 +010059
Simon Glass3a8ee3d2020-11-05 06:32:05 -070060 if (sysinfo_detect(sysinfo))
Dirk Eibachd494cdb2019-03-29 10:18:19 +010061 puts("Device information detection failed.\n");
62
Simon Glass3a8ee3d2020-11-05 06:32:05 -070063 sysinfo_get_int(sysinfo, BOARD_MULTICHANNEL, &mc);
64 sysinfo_get_int(sysinfo, BOARD_VARIANT, &con);
Dirk Eibachd494cdb2019-03-29 10:18:19 +010065
66 if (mc == 2 || mc == 1)
67 dev_disable_by_path("/immr@e0000000/i2c@3100/pca9698@22");
68
69 if (mc == 4) {
70 dev_disable_by_path("/immr@e0000000/i2c@3100/pca9698@20");
71 dev_enable_by_path("/localbus@e0005000/iocon_uart@2,0");
72 dev_enable_by_path("/fpga1bus");
73 }
74
75 if (mc == 2 || con == VAR_CON) {
76 dev_enable_by_path("/fpga0bus/fpga0_video1");
77 dev_enable_by_path("/fpga0bus/fpga0_iic_video1");
78 dev_enable_by_path("/fpga0bus/fpga0_axi_video1");
79 }
80
81 if (con == VAR_CON) {
82 dev_enable_by_path("/fpga0bus/fpga0_video0");
83 dev_enable_by_path("/fpga0bus/fpga0_iic_video0");
84 dev_enable_by_path("/fpga0bus/fpga0_axi_video0");
85 }
86
87 return 0;
88}
89
Simon Glass3a8ee3d2020-11-05 06:32:05 -070090int checksysinfo(void)
Dirk Eibachd494cdb2019-03-29 10:18:19 +010091{
Simon Glass3a8ee3d2020-11-05 06:32:05 -070092 struct udevice *sysinfo;
Dirk Eibachd494cdb2019-03-29 10:18:19 +010093 char *s = env_get("serial#");
94 int mc = 0;
95 int con = 0;
96
Michal Suchanek7b2aa212022-10-12 21:58:04 +020097 if (sysinfo_get(&sysinfo)) {
Simon Glass3a8ee3d2020-11-05 06:32:05 -070098 puts("Could not find sysinfo information device.\n");
Michal Suchanek7b2aa212022-10-12 21:58:04 +020099 sysinfo = NULL;
100 }
Dirk Eibachd494cdb2019-03-29 10:18:19 +0100101
Simon Glass3a8ee3d2020-11-05 06:32:05 -0700102 sysinfo_get_int(sysinfo, BOARD_MULTICHANNEL, &mc);
103 sysinfo_get_int(sysinfo, BOARD_VARIANT, &con);
Dirk Eibachd494cdb2019-03-29 10:18:19 +0100104
105 puts("Board: Gazerbeam ");
106 printf("%s ", mc == 4 ? "MC4" : mc == 2 ? "MC2" : "SC");
107 printf("%s", con == VAR_CON ? "CON" : "CPU");
108
109 if (s) {
110 puts(", serial# ");
111 puts(s);
112 }
113
114 puts("\n");
115
116 return 0;
117}
118
119static void display_osd_info(struct udevice *osd,
120 struct video_osd_info *osd_info)
121{
122 printf("OSD-%s: Digital-OSD version %01d.%02d, %d x %d characters\n",
123 osd->name, osd_info->major_version, osd_info->minor_version,
124 osd_info->width, osd_info->height);
125}
126
127int last_stage_init(void)
128{
129 int fpga_hw_rev = 0;
130 int i;
Simon Glass3a8ee3d2020-11-05 06:32:05 -0700131 struct udevice *sysinfo;
Dirk Eibachd494cdb2019-03-29 10:18:19 +0100132 struct udevice *osd;
133 struct video_osd_info osd_info;
134 struct udevice *tpm;
135 int ret;
136
Michal Suchanek7b2aa212022-10-12 21:58:04 +0200137 if (sysinfo_get(&sysinfo)) {
Simon Glass3a8ee3d2020-11-05 06:32:05 -0700138 puts("Could not find sysinfo information device.\n");
Michal Suchanek7b2aa212022-10-12 21:58:04 +0200139 sysinfo = NULL;
140 }
Dirk Eibachd494cdb2019-03-29 10:18:19 +0100141
Simon Glass3a8ee3d2020-11-05 06:32:05 -0700142 if (sysinfo) {
143 int res = sysinfo_get_int(sysinfo, BOARD_HWVERSION,
144 &fpga_hw_rev);
Dirk Eibachd494cdb2019-03-29 10:18:19 +0100145
146 if (res)
Simon Glass3a8ee3d2020-11-05 06:32:05 -0700147 printf("Could not determind FPGA HW revision (res = %d)\n",
148 res);
Dirk Eibachd494cdb2019-03-29 10:18:19 +0100149 }
150
151 env_set_ulong("fpga_hw_rev", fpga_hw_rev);
152
153 ret = get_tpm(&tpm);
Simon Glassd6a885f2021-02-06 14:23:36 -0700154 if (ret || tpm_init(tpm) || tpm1_startup(tpm, TPM_ST_CLEAR) ||
155 tpm1_continue_self_test(tpm)) {
Dirk Eibachd494cdb2019-03-29 10:18:19 +0100156 printf("TPM init failed\n");
157 }
158
159 if (fpga_hw_rev >= 4) {
160 for (i = 0; i < 4; i++) {
161 struct udevice *rxaui;
162 char name[8];
163
164 snprintf(name, sizeof(name), "rxaui%d", i);
165 /* Disable RXAUI polarity inversion */
Simon Glass3a8ee3d2020-11-05 06:32:05 -0700166 ret = uclass_get_device_by_phandle(UCLASS_MISC, sysinfo,
167 name, &rxaui);
Dirk Eibachd494cdb2019-03-29 10:18:19 +0100168 if (!ret)
169 misc_set_enabled(rxaui, false);
170 }
171 }
172
173 for (uclass_first_device(UCLASS_VIDEO_OSD, &osd);
174 osd;
175 uclass_next_device(&osd)) {
176 video_osd_get_info(osd, &osd_info);
177 display_osd_info(osd, &osd_info);
178 }
179
180 return 0;
181}
182
183#if defined(CONFIG_OF_BOARD_SETUP)
Masahiro Yamadab75d8dc2020-06-26 15:13:33 +0900184int ft_board_setup(void *blob, struct bd_info *bd)
Dirk Eibachd494cdb2019-03-29 10:18:19 +0100185{
186 ft_cpu_setup(blob, bd);
187 fsl_fdt_fixup_dr_usb(blob, bd);
188 fdt_fixup_esdhc(blob, bd);
189
190 return 0;
191}
192#endif