Add wait for KFuse init to prevent wrong TSEC key
This commit is contained in:
		
							
								
								
									
										61
									
								
								source/soc/kfuse.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								source/soc/kfuse.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,61 @@ | |||||||
|  | /* | ||||||
|  |  * Copyright (c) 2018 naehrwert | ||||||
|  |  * | ||||||
|  |  * This program is free software; you can redistribute it and/or modify it | ||||||
|  |  * under the terms and conditions of the GNU General Public License, | ||||||
|  |  * version 2, as published by the Free Software Foundation. | ||||||
|  |  * | ||||||
|  |  * This program is distributed in the hope it will be useful, but WITHOUT | ||||||
|  |  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||||||
|  |  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for | ||||||
|  |  * more details. | ||||||
|  |  * | ||||||
|  |  * You should have received a copy of the GNU General Public License | ||||||
|  |  * along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #include "../soc/kfuse.h" | ||||||
|  | #include "../soc/clock.h" | ||||||
|  | #include "../soc/t210.h" | ||||||
|  |  | ||||||
|  | #pragma GCC push_options | ||||||
|  | #pragma GCC optimize ("Os") | ||||||
|  |  | ||||||
|  | int kfuse_read(u32 *buf) | ||||||
|  | { | ||||||
|  | 	int res = 0; | ||||||
|  |  | ||||||
|  | 	clock_enable_kfuse(); | ||||||
|  |  | ||||||
|  | 	while (!(KFUSE(KFUSE_STATE) & KFUSE_STATE_DONE)) | ||||||
|  | 		; | ||||||
|  |  | ||||||
|  | 	if (!(KFUSE(KFUSE_STATE) & KFUSE_STATE_CRCPASS)) | ||||||
|  | 		goto out; | ||||||
|  |  | ||||||
|  | 	KFUSE(KFUSE_KEYADDR) = KFUSE_KEYADDR_AUTOINC; | ||||||
|  | 	for (int i = 0; i < KFUSE_NUM_WORDS; i++) | ||||||
|  | 		buf[i] = KFUSE(KFUSE_KEYS); | ||||||
|  |  | ||||||
|  | 	res = 1; | ||||||
|  |  | ||||||
|  | out:; | ||||||
|  | 	clock_disable_kfuse(); | ||||||
|  | 	return res; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int kfuse_wait_ready() | ||||||
|  | { | ||||||
|  |     // Wait for KFUSE to finish init and verification of data. | ||||||
|  |     while (!(KFUSE(KFUSE_STATE) & KFUSE_STATE_DONE)) | ||||||
|  |     { | ||||||
|  |         usleep(500); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     if (!(KFUSE(KFUSE_STATE) & KFUSE_STATE_CRCPASS)) | ||||||
|  |         return 0; | ||||||
|  |  | ||||||
|  |     return 1; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #pragma GCC pop_options | ||||||
							
								
								
									
										42
									
								
								source/soc/kfuse.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								source/soc/kfuse.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,42 @@ | |||||||
|  | /* | ||||||
|  |  * Copyright (c) 2018 naehrwert | ||||||
|  |  * | ||||||
|  |  * This program is free software; you can redistribute it and/or modify it | ||||||
|  |  * under the terms and conditions of the GNU General Public License, | ||||||
|  |  * version 2, as published by the Free Software Foundation. | ||||||
|  |  * | ||||||
|  |  * This program is distributed in the hope it will be useful, but WITHOUT | ||||||
|  |  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||||||
|  |  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for | ||||||
|  |  * more details. | ||||||
|  |  * | ||||||
|  |  * You should have received a copy of the GNU General Public License | ||||||
|  |  * along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #ifndef _KFUSE_H_ | ||||||
|  | #define _KFUSE_H_ | ||||||
|  |  | ||||||
|  | #include "../utils/types.h" | ||||||
|  |  | ||||||
|  | #define KFUSE_STATE_SOFTRESET      (1 << 31) | ||||||
|  | #define KFUSE_STATE_STOP           (1 << 25) | ||||||
|  | #define KFUSE_STATE_RESTART        (1 << 24) | ||||||
|  | #define KFUSE_STATE_CRCPASS        (1 << 17) | ||||||
|  | #define KFUSE_STATE_DONE           (1 << 16) | ||||||
|  | #define KFUSE_STATE_ERRBLOCK_MASK  0x3F00 | ||||||
|  | #define KFUSE_STATE_ERRBLOCK_SHIFT 8 | ||||||
|  | #define KFUSE_STATE_CURBLOCK_MASK  0x3F | ||||||
|  |  | ||||||
|  | #define KFUSE_KEYADDR_AUTOINC (1<<16) | ||||||
|  |  | ||||||
|  | #define KFUSE_STATE 0x80 | ||||||
|  | #define KFUSE_KEYADDR 0x88 | ||||||
|  | #define KFUSE_KEYS 0x8C | ||||||
|  |  | ||||||
|  | #define KFUSE_NUM_WORDS 144 | ||||||
|  |  | ||||||
|  | int kfuse_read(u32 *buf); | ||||||
|  | int kfuse_wait_ready(); | ||||||
|  |  | ||||||
|  | #endif | ||||||
		Reference in New Issue
	
	Block a user