19b61a2bcSJorge Ramirez-Ortiz /* SPDX-License-Identifier: BSD-2-Clause */ 29b61a2bcSJorge Ramirez-Ortiz /* 39b61a2bcSJorge Ramirez-Ortiz * Copyright (C) 2021 Foundries.io Ltd 49b61a2bcSJorge Ramirez-Ortiz */ 59b61a2bcSJorge Ramirez-Ortiz 69b61a2bcSJorge Ramirez-Ortiz #ifndef __DRIVERS_ZYNQMP_PM_H__ 79b61a2bcSJorge Ramirez-Ortiz #define __DRIVERS_ZYNQMP_PM_H__ 89b61a2bcSJorge Ramirez-Ortiz 99b61a2bcSJorge Ramirez-Ortiz #include <drivers/zynqmp_efuse.h> 109b61a2bcSJorge Ramirez-Ortiz #include <platform_config.h> 119b61a2bcSJorge Ramirez-Ortiz #include <tee_api_types.h> 129b61a2bcSJorge Ramirez-Ortiz #include <util.h> 139b61a2bcSJorge Ramirez-Ortiz 149b61a2bcSJorge Ramirez-Ortiz /* 159b61a2bcSJorge Ramirez-Ortiz * Information about accessing eFuses and the Physically Uncloneable Function 169b61a2bcSJorge Ramirez-Ortiz * (PUF) Support can be found at 179b61a2bcSJorge Ramirez-Ortiz * https://www.xilinx.com/support/documentation/application_notes/xapp1319-zynq-usp-prog-nvm.pdf 189b61a2bcSJorge Ramirez-Ortiz */ 199b61a2bcSJorge Ramirez-Ortiz #define ZYNQMP_NONPUF_EFUSE 0 209b61a2bcSJorge Ramirez-Ortiz #define ZYNQMP_PUF_EFUSE 1 219b61a2bcSJorge Ramirez-Ortiz 229b61a2bcSJorge Ramirez-Ortiz /* List of eFuse identifiers */ 239b61a2bcSJorge Ramirez-Ortiz enum zynqmp_efuse_id { 24*214ee971SVesa Jääskeläinen DNA = 0, IP_DISABLE, USER0, USER1, USER2, USER3, USER4, USER5, USER6, 25*214ee971SVesa Jääskeläinen USER7, MISC_USER_CTRL, SEC_CTRL, 269b61a2bcSJorge Ramirez-Ortiz }; 279b61a2bcSJorge Ramirez-Ortiz 289b61a2bcSJorge Ramirez-Ortiz /* Valid bytes in the eFuse */ 299b61a2bcSJorge Ramirez-Ortiz #define ZYNQMP_EFUSE_LEN(_id) ZYNQMP_EFUSE_##_id##_LENGTH 309b61a2bcSJorge Ramirez-Ortiz 319b61a2bcSJorge Ramirez-Ortiz /* Memory required to access the eFuse */ 329b61a2bcSJorge Ramirez-Ortiz #define ZYNQMP_EFUSE_MEM(_id) (ROUNDUP(ZYNQMP_EFUSE_LEN(_id), CACHELINE_LEN)) 339b61a2bcSJorge Ramirez-Ortiz 349b61a2bcSJorge Ramirez-Ortiz /* Alignment required in the buffers used to read the eFuse */ 359b61a2bcSJorge Ramirez-Ortiz #define __aligned_efuse __aligned(CACHELINE_LEN) 369b61a2bcSJorge Ramirez-Ortiz 379b61a2bcSJorge Ramirez-Ortiz /* 389b61a2bcSJorge Ramirez-Ortiz * Read eFuse memory 399b61a2bcSJorge Ramirez-Ortiz * @buf: buffer, where eFuse date will be stored. The data is returned 4097558570SVesa Jääskeläinen * in LE byte order. 4197558570SVesa Jääskeläinen * @buf_sz: buffer size in bytes 429b61a2bcSJorge Ramirez-Ortiz * @id: eFuse identifier. 439b61a2bcSJorge Ramirez-Ortiz * @puf: is eFuse PUF, ZYNQMP_PUF_EFUSE/ZYNQMP_NONPUF_EFUSE 449b61a2bcSJorge Ramirez-Ortiz * Return a TEE_Result compliant status 459b61a2bcSJorge Ramirez-Ortiz */ 469b61a2bcSJorge Ramirez-Ortiz TEE_Result zynqmp_efuse_read(uint8_t *buf, size_t buf_sz, 479b61a2bcSJorge Ramirez-Ortiz enum zynqmp_efuse_id id, bool puf); 489b61a2bcSJorge Ramirez-Ortiz 499b61a2bcSJorge Ramirez-Ortiz /* 506e96536eSVesa Jääskeläinen * Program eFuse memory 516e96536eSVesa Jääskeläinen * @buf: buffer where eFuse data are stored in LE byte order. 526e96536eSVesa Jääskeläinen * @buf_sz: buffer size in bytes 536e96536eSVesa Jääskeläinen * @id: eFuse identifier. 546e96536eSVesa Jääskeläinen * @puf: is eFuse PUF, ZYNQMP_PUF_EFUSE/ZYNQMP_NONPUF_EFUSE 556e96536eSVesa Jääskeläinen * Return a TEE_Result compliant status 566e96536eSVesa Jääskeläinen */ 576e96536eSVesa Jääskeläinen TEE_Result zynqmp_efuse_write(uint8_t *buf, size_t buf_sz, 586e96536eSVesa Jääskeläinen enum zynqmp_efuse_id id, bool puf); 596e96536eSVesa Jääskeläinen 606e96536eSVesa Jääskeläinen /* 619b61a2bcSJorge Ramirez-Ortiz * Read the SoC version number: 629b61a2bcSJorge Ramirez-Ortiz * Different eFuse bitfields carry different meaning depending on this version. 639b61a2bcSJorge Ramirez-Ortiz */ 649b61a2bcSJorge Ramirez-Ortiz TEE_Result zynqmp_soc_version(uint32_t *version); 659b61a2bcSJorge Ramirez-Ortiz 669b61a2bcSJorge Ramirez-Ortiz #endif /*__DRIVERS_ZYNQMP_PM_H__*/ 67