ARM64: zynqmp: Add support for chip ID detection
Chip ID needs to be known for loading bitstream because U-Boot checks ID from bitstream header in BIT format. BIN format is completely unchecked. The chipid is get from ATF via SMC. Signed-off-by: Siva Durga Prasad Paladugu <sivadur@xilinx.com> Signed-off-by: Michal Simek <michal.simek@xilinx.com>
This commit is contained in:
parent
6b24501438
commit
47e60cbdf8
|
@ -16,15 +16,114 @@
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
#include <usb.h>
|
#include <usb.h>
|
||||||
#include <dwc3-uboot.h>
|
#include <dwc3-uboot.h>
|
||||||
|
#include <zynqmppl.h>
|
||||||
#include <i2c.h>
|
#include <i2c.h>
|
||||||
#include <g_dnl.h>
|
#include <g_dnl.h>
|
||||||
|
|
||||||
DECLARE_GLOBAL_DATA_PTR;
|
DECLARE_GLOBAL_DATA_PTR;
|
||||||
|
|
||||||
|
#if defined(CONFIG_FPGA) && defined(CONFIG_FPGA_ZYNQMPPL) && \
|
||||||
|
!defined(CONFIG_SPL_BUILD)
|
||||||
|
static xilinx_desc zynqmppl = XILINX_ZYNQMP_DESC;
|
||||||
|
|
||||||
|
static const struct {
|
||||||
|
uint32_t id;
|
||||||
|
char *name;
|
||||||
|
} zynqmp_devices[] = {
|
||||||
|
{
|
||||||
|
.id = 0x10,
|
||||||
|
.name = "3eg",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.id = 0x11,
|
||||||
|
.name = "2eg",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.id = 0x20,
|
||||||
|
.name = "5ev",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.id = 0x21,
|
||||||
|
.name = "4ev",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.id = 0x30,
|
||||||
|
.name = "7ev",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.id = 0x38,
|
||||||
|
.name = "9eg",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.id = 0x39,
|
||||||
|
.name = "6eg",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.id = 0x40,
|
||||||
|
.name = "11eg",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.id = 0x50,
|
||||||
|
.name = "15eg",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.id = 0x58,
|
||||||
|
.name = "19eg",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.id = 0x59,
|
||||||
|
.name = "17eg",
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static int chip_id(void)
|
||||||
|
{
|
||||||
|
struct pt_regs regs;
|
||||||
|
regs.regs[0] = ZYNQMP_SIP_SVC_CSU_DMA_CHIPID;
|
||||||
|
regs.regs[1] = 0;
|
||||||
|
regs.regs[2] = 0;
|
||||||
|
regs.regs[3] = 0;
|
||||||
|
|
||||||
|
smc_call(®s);
|
||||||
|
|
||||||
|
return regs.regs[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
static char *zynqmp_get_silicon_idcode_name(void)
|
||||||
|
{
|
||||||
|
uint32_t i, id;
|
||||||
|
|
||||||
|
id = chip_id();
|
||||||
|
for (i = 0; i < ARRAY_SIZE(zynqmp_devices); i++) {
|
||||||
|
if (zynqmp_devices[i].id == id)
|
||||||
|
return zynqmp_devices[i].name;
|
||||||
|
}
|
||||||
|
return "unknown";
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define ZYNQMP_VERSION_SIZE 9
|
||||||
|
|
||||||
int board_init(void)
|
int board_init(void)
|
||||||
{
|
{
|
||||||
printf("EL Level:\tEL%d\n", current_el());
|
printf("EL Level:\tEL%d\n", current_el());
|
||||||
|
|
||||||
|
#if defined(CONFIG_FPGA) && defined(CONFIG_FPGA_ZYNQMPPL) && \
|
||||||
|
!defined(CONFIG_SPL_BUILD) || (defined(CONFIG_SPL_FPGA_SUPPORT) && \
|
||||||
|
defined(CONFIG_SPL_BUILD))
|
||||||
|
if (current_el() != 3) {
|
||||||
|
static char version[ZYNQMP_VERSION_SIZE];
|
||||||
|
|
||||||
|
strncat(version, "xczu", ZYNQMP_VERSION_SIZE);
|
||||||
|
zynqmppl.name = strncat(version,
|
||||||
|
zynqmp_get_silicon_idcode_name(),
|
||||||
|
ZYNQMP_VERSION_SIZE);
|
||||||
|
printf("Chip ID:\t%s\n", zynqmppl.name);
|
||||||
|
fpga_init();
|
||||||
|
fpga_add(fpga_xilinx, &zynqmppl);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
|
|
||||||
#include <xilinx.h>
|
#include <xilinx.h>
|
||||||
|
|
||||||
|
#define ZYNQMP_SIP_SVC_CSU_DMA_CHIPID 0xC2000018
|
||||||
#define ZYNQMP_SIP_SVC_PM_FPGA_LOAD 0xC2000016
|
#define ZYNQMP_SIP_SVC_PM_FPGA_LOAD 0xC2000016
|
||||||
#define ZYNQMP_FPGA_OP_INIT (1 << 0)
|
#define ZYNQMP_FPGA_OP_INIT (1 << 0)
|
||||||
#define ZYNQMP_FPGA_OP_LOAD (1 << 1)
|
#define ZYNQMP_FPGA_OP_LOAD (1 << 1)
|
||||||
|
|
Loading…
Reference in New Issue