1011c182aSAndrew Mustea /* SPDX-License-Identifier: BSD-2-Clause */ 2011c182aSAndrew Mustea /* 3011c182aSAndrew Mustea * Copyright 2022 Microsoft 4011c182aSAndrew Mustea * 5011c182aSAndrew Mustea * Definitions for the NXP LX2160A-series Security Fuse Processor (SFP) driver. 6011c182aSAndrew Mustea */ 7011c182aSAndrew Mustea 8011c182aSAndrew Mustea #ifndef __DRIVERS_LS_SFP_H 9011c182aSAndrew Mustea #define __DRIVERS_LS_SFP_H 10011c182aSAndrew Mustea 11011c182aSAndrew Mustea #include <drivers/ls_gpio.h> 12011c182aSAndrew Mustea #include <stdlib.h> 13011c182aSAndrew Mustea #include <tee_api_types.h> 14011c182aSAndrew Mustea 15011c182aSAndrew Mustea /* SFP instruction register */ 16011c182aSAndrew Mustea /* SFP is big endian */ 17011c182aSAndrew Mustea #define SFP_INGR_PROGFB_CMD 0x2 18011c182aSAndrew Mustea #define SFP_INGR_ERROR_MASK 0x100 19385b0436SAndrew Mustea #define SFP_INGR_FUSE_TIMEOUT_US 150000 20011c182aSAndrew Mustea 21011c182aSAndrew Mustea /* SFP configuration register */ 22*999da91aSAndrew Mustea #define SFP_SFPCR_SB_MASK 0x20000000 23*999da91aSAndrew Mustea #define SFP_SFPCR_SB_OFFSET 29 24011c182aSAndrew Mustea 25011c182aSAndrew Mustea /* SFP OEM security policy register 0 */ 26*999da91aSAndrew Mustea #define SFP_OSPR0_WP_MASK 0x1 27*999da91aSAndrew Mustea #define SFP_OSPR0_ITS_MASK 0x4 28*999da91aSAndrew Mustea #define SFP_OSPR0_ITS_OFFSET 0x2 29011c182aSAndrew Mustea 30011c182aSAndrew Mustea /* SFP OEM security policy register 1 */ 31011c182aSAndrew Mustea #define SFP_OSPR1_DBLEV_MASK 0x7 32011c182aSAndrew Mustea #define SFP_OSPR1_DBLEV_OPEN 0x0 33011c182aSAndrew Mustea #define SFP_OSPR1_DBLEV_CLOSED_NOTIFY 0x1 34011c182aSAndrew Mustea #define SFP_OSPR1_DBLEV_CLOSED_SILENT 0x2 35011c182aSAndrew Mustea #define SFP_OSPR1_DBLEV_CLOSED 0x4 36011c182aSAndrew Mustea 37011c182aSAndrew Mustea /** 38011c182aSAndrew Mustea * struct ls_sfp_data - Compact data struct of all SFP registers. 39011c182aSAndrew Mustea * @ingr: Instruction Register. 40011c182aSAndrew Mustea * @svhesr: Secret Value Hamming Error Status Register. 41011c182aSAndrew Mustea * @sfpcr: SFP Configuration Register. 42011c182aSAndrew Mustea * @version: SFP Version Register. 43011c182aSAndrew Mustea * @ospr0: OEM Security Policy Register 0. 44011c182aSAndrew Mustea * @ospr1: OEM Security Policy Register 1. 45011c182aSAndrew Mustea * @dcvr0: Debug Challenge Value Register 0. 46011c182aSAndrew Mustea * @dcvr1: Debug Challenge Value Register 1. 47011c182aSAndrew Mustea * @drvr0: Debug Response Value Register 0. 48011c182aSAndrew Mustea * @drvr1: Debug Response Value Register 1. 49011c182aSAndrew Mustea * @fswpr: Factory Section Write Protect Register. 50011c182aSAndrew Mustea * @fuidr0: Factory Unique ID Register 0. 51011c182aSAndrew Mustea * @fuidr1: Factory Unique ID Register 1. 52011c182aSAndrew Mustea * @isbccr: ISBC Configuration Register. 53011c182aSAndrew Mustea * @fspfr[0x3]: Factory Scratch Pad Fuse Registers. 54011c182aSAndrew Mustea * @otpmkr[0x8]: One Time Programmable Master Key. 55011c182aSAndrew Mustea * @srkhr[0x8]: Super Root Key Hash Register. 56011c182aSAndrew Mustea * @ouidr[0x5]: OEM Unique ID/Scratch Pad Fuse Registers. 57011c182aSAndrew Mustea */ 58011c182aSAndrew Mustea struct ls_sfp_data { 59011c182aSAndrew Mustea uint32_t ingr; 60011c182aSAndrew Mustea uint32_t svhesr; 61011c182aSAndrew Mustea uint32_t sfpcr; 62011c182aSAndrew Mustea uint32_t version; 63011c182aSAndrew Mustea uint32_t ospr0; 64011c182aSAndrew Mustea uint32_t ospr1; 65011c182aSAndrew Mustea uint32_t dcvr0; 66011c182aSAndrew Mustea uint32_t dcvr1; 67011c182aSAndrew Mustea uint32_t drvr0; 68011c182aSAndrew Mustea uint32_t drvr1; 69011c182aSAndrew Mustea uint32_t fswpr; 70011c182aSAndrew Mustea uint32_t fuidr0; 71011c182aSAndrew Mustea uint32_t fuidr1; 72011c182aSAndrew Mustea uint32_t isbccr; 73011c182aSAndrew Mustea uint32_t fspfr[0x3]; 74011c182aSAndrew Mustea uint32_t otpmkr[0x8]; 75011c182aSAndrew Mustea uint32_t srkhr[0x8]; 76011c182aSAndrew Mustea uint32_t ouidr[0x5]; 77011c182aSAndrew Mustea }; 78011c182aSAndrew Mustea 79011c182aSAndrew Mustea /** 80011c182aSAndrew Mustea * ls_sfp_read() - Read a copy of the SFP register data if the SFP driver was 81011c182aSAndrew Mustea * successfully initialized. 82011c182aSAndrew Mustea * @data: Location to save SFP data. 83011c182aSAndrew Mustea * 84011c182aSAndrew Mustea * Return: TEE_SUCCESS or > 0 on error 85011c182aSAndrew Mustea */ 86011c182aSAndrew Mustea TEE_Result ls_sfp_read(struct ls_sfp_data *data); 87011c182aSAndrew Mustea 88011c182aSAndrew Mustea /** 89011c182aSAndrew Mustea * ls_sfp_get_debug_level() - Read the last 3 bits of the SFP OSPR1 register 90011c182aSAndrew Mustea * which denotes the debug level. 91011c182aSAndrew Mustea * @dblev: Pointer location to store the read debug level. 92011c182aSAndrew Mustea * 93011c182aSAndrew Mustea * Return: TEE_SUCCESS or > 0 on error. 94011c182aSAndrew Mustea */ 95011c182aSAndrew Mustea TEE_Result ls_sfp_get_debug_level(uint32_t *dblev); 96011c182aSAndrew Mustea 97011c182aSAndrew Mustea /** 98011c182aSAndrew Mustea * ls_sfp_get_its() - Read bit 29 of the SFP OSPR0 register which denotes the 99011c182aSAndrew Mustea * ITS flag. 100011c182aSAndrew Mustea * @its: Pointer location to store the ITS flag. 101011c182aSAndrew Mustea * 102011c182aSAndrew Mustea * Return: TEE_SUCCESS or > 0 on error. 103011c182aSAndrew Mustea */ 104011c182aSAndrew Mustea TEE_Result ls_sfp_get_its(uint32_t *its); 105011c182aSAndrew Mustea 106011c182aSAndrew Mustea /** 107011c182aSAndrew Mustea * ls_sfp_get_ouid() - Read the SFP OUID register at the given index. 108011c182aSAndrew Mustea * @index: Index of the OUID register to read. 109011c182aSAndrew Mustea * @ouid: Pointer location to store the OIUD register value. 110011c182aSAndrew Mustea * 111011c182aSAndrew Mustea * Return: TEE_SUCCESS or > 0 on error. 112011c182aSAndrew Mustea */ 113011c182aSAndrew Mustea TEE_Result ls_sfp_get_ouid(uint32_t index, uint32_t *ouid); 114011c182aSAndrew Mustea 115011c182aSAndrew Mustea /** 116011c182aSAndrew Mustea * ls_sfp_get_sb() - Read bit 2 of the SFP SFPCR register which denotes the 117011c182aSAndrew Mustea * secure boot flag. 118011c182aSAndrew Mustea * @sb: Pointer location to store the secure boot flag. 119011c182aSAndrew Mustea * 120011c182aSAndrew Mustea * Return: TEE_SUCCESS or > 0 on error. 121011c182aSAndrew Mustea */ 122011c182aSAndrew Mustea TEE_Result ls_sfp_get_sb(uint32_t *sb); 123011c182aSAndrew Mustea 124011c182aSAndrew Mustea /** 125011c182aSAndrew Mustea * ls_sfp_get_srkh() - Read the SFP SRKH register at the given index. 126011c182aSAndrew Mustea * @index: Index of the SRKH register to read. 127011c182aSAndrew Mustea * @srkh: Pointer location to store the SRKH register value. 128011c182aSAndrew Mustea * 129011c182aSAndrew Mustea * Return: TEE_SUCCESS or > 0 on error. 130011c182aSAndrew Mustea */ 131011c182aSAndrew Mustea TEE_Result ls_sfp_get_srkh(uint32_t index, uint32_t *srkh); 132011c182aSAndrew Mustea 133011c182aSAndrew Mustea /** 134011c182aSAndrew Mustea * ls_sfp_set_debug_level() - Set the last 3 bits of the SFP OSPR1 register 135011c182aSAndrew Mustea * which denotes the debug level. 136011c182aSAndrew Mustea * @dblev: Value to write into the SFP OSPR1 register. 137011c182aSAndrew Mustea * 138011c182aSAndrew Mustea * Return: TEE_SUCCESS or > 0 on error. 139011c182aSAndrew Mustea */ 140011c182aSAndrew Mustea TEE_Result ls_sfp_set_debug_level(uint32_t dblev); 141011c182aSAndrew Mustea 142011c182aSAndrew Mustea /** 143011c182aSAndrew Mustea * ls_sfp_set_its_wp() - Set bits 29 and 31 of the SFP OSPR0 register which 144011c182aSAndrew Mustea * denote the ITS and write protect flags respectively. 145011c182aSAndrew Mustea * 146011c182aSAndrew Mustea * WARNING - Setting the ITS and write protect flags will lock the mirror 147011c182aSAndrew Mustea * registers and permanently prevent any further programming of the fuse block. 148011c182aSAndrew Mustea * The system will also be forced to always attempt to secure boot which 149011c182aSAndrew Mustea * requires signature validation and the absence of any hardware security 150011c182aSAndrew Mustea * violations when booting. 151011c182aSAndrew Mustea * 152011c182aSAndrew Mustea * Return: TEE_SUCCESS or > 0 on error. 153011c182aSAndrew Mustea */ 154011c182aSAndrew Mustea TEE_Result ls_sfp_set_its_wp(void); 155011c182aSAndrew Mustea 156011c182aSAndrew Mustea /** 157011c182aSAndrew Mustea * ls_sfp_set_ouid() - Write to the SFP OUID register at the given index. 158011c182aSAndrew Mustea * @index: Index of the OUID register to write. 159011c182aSAndrew Mustea * @ouid: Value to write into the SFP OUID register. 160011c182aSAndrew Mustea * 161011c182aSAndrew Mustea * Return: TEE_SUCCESS or > 0 on error. 162011c182aSAndrew Mustea */ 163011c182aSAndrew Mustea TEE_Result ls_sfp_set_ouid(uint32_t index, uint32_t ouid); 164011c182aSAndrew Mustea 165011c182aSAndrew Mustea /** 166011c182aSAndrew Mustea * ls_sfp_status() - Check if the SFP driver was initialized successfully. 167011c182aSAndrew Mustea * 168011c182aSAndrew Mustea * Return: TEE_SUCCESS or > 0 on error. 169011c182aSAndrew Mustea */ 170011c182aSAndrew Mustea TEE_Result ls_sfp_status(void); 171011c182aSAndrew Mustea 172011c182aSAndrew Mustea #endif /* __DRIVERS_LS_SFP_H */ 173