| Fuse API functions and commands | |
| The fuse API allows to control a fusebox and how it is used by the upper | |
| hardware layers. | |
| A fuse corresponds to a single non-volatile memory bit that can be programmed | |
| (i.e. blown, set to 1) only once. The programming operation is irreversible. A | |
| fuse that has not been programmed reads 0. | |
| Fuses can be used by SoCs to store various permanent configuration and data, | |
| e.g. boot configuration, security configuration, MAC addresses, etc. | |
| A fuse word is the smallest group of fuses that can be read at once from the | |
| fusebox control IP registers. This is limited to 32 bits with the current API. | |
| A fuse bank is the smallest group of fuse words having a common ID, as defined | |
| by each SoC. | |
| Upon startup, the fusebox control IP reads the fuse values and stores them to a | |
| volatile shadow cache. | |
| See the README files of the drivers implementing this API in order to know the | |
| SoC- and implementation-specific details. | |
| Functions / commands: | |
| int fuse_read(u32 bank, u32 word, u32 *val); | |
| fuse read <bank> <word> [<cnt>] | |
| Read fuse words from the shadow cache. | |
| int fuse_sense(u32 bank, u32 word, u32 *val); | |
| fuse sense <bank> <word> [<cnt>] | |
| Sense - i.e. read directly from the fusebox, skipping the shadow cache - | |
| fuse words. This operation does not update the shadow cache. | |
| This is useful to know the true value of fuses if an override has been | |
| performed (see below). | |
| int fuse_prog(u32 bank, u32 word, u32 val); | |
| fuse prog [-y] <bank> <word> <hexval> [<hexval>...] | |
| Program fuse words. This operation directly affects the fusebox and is | |
| irreversible. The shadow cache is updated accordingly or not, depending on | |
| each IP. | |
| Only the bits to be programmed should be set in the input value (i.e. for | |
| fuse bits that have already been programmed and hence should be left | |
| unchanged by a further programming, it is preferable to clear the | |
| corresponding bits in the input value in order not to perform a new | |
| hardware programming operation on these fuse bits). | |
| int fuse_override(u32 bank, u32 word, u32 val); | |
| fuse override <bank> <word> <hexval> [<hexval>...] | |
| Override fuse words in the shadow cache. | |
| The fusebox is unaffected, so following this operation, the shadow cache | |
| may differ from the fusebox values. Read or sense operations can then be | |
| used to get the values from the shadow cache or from the fusebox. | |
| This is useful to change the behaviors linked to some cached fuse values, | |
| either because this is needed only temporarily, or because some of the | |
| fuses have already been programmed or are locked (if the SoC allows to | |
| override a locked fuse). | |
| Configuration: | |
| CONFIG_CMD_FUSE | |
| Define this to enable the fuse commands. |