xref: /optee_os/core/include/drivers/zynqmp_pm.h (revision 214ee971badabdd9da0a45ebb5870999c0f0b291)
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