77 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			77 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C
		
	
	
	
| // SPDX-License-Identifier: GPL-2.0
 | |
| /*
 | |
|  * Xilinx Versal SOC driver
 | |
|  *
 | |
|  * Copyright (C) 2021 Xilinx, Inc.
 | |
|  */
 | |
| 
 | |
| #include <common.h>
 | |
| #include <dm.h>
 | |
| #include <soc.h>
 | |
| #include <zynqmp_firmware.h>
 | |
| #include <asm/io.h>
 | |
| #include <asm/arch/hardware.h>
 | |
| 
 | |
| /*
 | |
|  * v1 -> 0x10 - ES1
 | |
|  * v2 -> 0x20 - Production
 | |
|  */
 | |
| static const char versal_family[] = "Versal";
 | |
| 
 | |
| struct soc_xilinx_versal_priv {
 | |
| 	const char *family;
 | |
| 	char revision;
 | |
| };
 | |
| 
 | |
| static int soc_xilinx_versal_get_family(struct udevice *dev, char *buf, int size)
 | |
| {
 | |
| 	struct soc_xilinx_versal_priv *priv = dev_get_priv(dev);
 | |
| 
 | |
| 	return snprintf(buf, size, "%s", priv->family);
 | |
| }
 | |
| 
 | |
| static int soc_xilinx_versal_get_revision(struct udevice *dev, char *buf, int size)
 | |
| {
 | |
| 	struct soc_xilinx_versal_priv *priv = dev_get_priv(dev);
 | |
| 
 | |
| 	return snprintf(buf, size, "v%d", priv->revision);
 | |
| }
 | |
| 
 | |
| static const struct soc_ops soc_xilinx_versal_ops = {
 | |
| 	.get_family = soc_xilinx_versal_get_family,
 | |
| 	.get_revision = soc_xilinx_versal_get_revision,
 | |
| };
 | |
| 
 | |
| static int soc_xilinx_versal_probe(struct udevice *dev)
 | |
| {
 | |
| 	struct soc_xilinx_versal_priv *priv = dev_get_priv(dev);
 | |
| 	u32 ret_payload[4];
 | |
| 	int ret;
 | |
| 
 | |
| 	priv->family = versal_family;
 | |
| 
 | |
| 	if (IS_ENABLED(CONFIG_ZYNQMP_FIRMWARE)) {
 | |
| 		ret = xilinx_pm_request(PM_GET_CHIPID, 0, 0, 0, 0,
 | |
| 					ret_payload);
 | |
| 		if (ret)
 | |
| 			return ret;
 | |
| 	} else {
 | |
| 		ret_payload[2] = readl(VERSAL_PS_PMC_VERSION);
 | |
| 		if (!ret_payload[2])
 | |
| 			return -EINVAL;
 | |
| 	}
 | |
| 
 | |
| 	priv->revision = ret_payload[2] >> VERSAL_PS_VER_SHIFT;
 | |
| 
 | |
| 	return 0;
 | |
| }
 | |
| 
 | |
| U_BOOT_DRIVER(soc_xilinx_versal) = {
 | |
| 	.name		= "soc_xilinx_versal",
 | |
| 	.id		= UCLASS_SOC,
 | |
| 	.ops		= &soc_xilinx_versal_ops,
 | |
| 	.probe		= soc_xilinx_versal_probe,
 | |
| 	.priv_auto	= sizeof(struct soc_xilinx_versal_priv),
 | |
| 	.flags		= DM_FLAG_PRE_RELOC,
 | |
| };
 |