|  | 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. |