1*ccca7dfdSBenoît ThébaudeauFuse API functions and commands 2*ccca7dfdSBenoît Thébaudeau 3*ccca7dfdSBenoît ThébaudeauThe fuse API allows to control a fusebox and how it is used by the upper 4*ccca7dfdSBenoît Thébaudeauhardware layers. 5*ccca7dfdSBenoît Thébaudeau 6*ccca7dfdSBenoît ThébaudeauA fuse corresponds to a single non-volatile memory bit that can be programmed 7*ccca7dfdSBenoît Thébaudeau(i.e. blown, set to 1) only once. The programming operation is irreversible. A 8*ccca7dfdSBenoît Thébaudeaufuse that has not been programmed reads 0. 9*ccca7dfdSBenoît Thébaudeau 10*ccca7dfdSBenoît ThébaudeauFuses can be used by SoCs to store various permanent configuration and data, 11*ccca7dfdSBenoît Thébaudeaue.g. boot configuration, security configuration, MAC addresses, etc. 12*ccca7dfdSBenoît Thébaudeau 13*ccca7dfdSBenoît ThébaudeauA fuse word is the smallest group of fuses that can be read at once from the 14*ccca7dfdSBenoît Thébaudeaufusebox control IP registers. This is limited to 32 bits with the current API. 15*ccca7dfdSBenoît Thébaudeau 16*ccca7dfdSBenoît ThébaudeauA fuse bank is the smallest group of fuse words having a common ID, as defined 17*ccca7dfdSBenoît Thébaudeauby each SoC. 18*ccca7dfdSBenoît Thébaudeau 19*ccca7dfdSBenoît ThébaudeauUpon startup, the fusebox control IP reads the fuse values and stores them to a 20*ccca7dfdSBenoît Thébaudeauvolatile shadow cache. 21*ccca7dfdSBenoît Thébaudeau 22*ccca7dfdSBenoît ThébaudeauSee the README files of the drivers implementing this API in order to know the 23*ccca7dfdSBenoît ThébaudeauSoC- and implementation-specific details. 24*ccca7dfdSBenoît Thébaudeau 25*ccca7dfdSBenoît ThébaudeauFunctions / commands: 26*ccca7dfdSBenoît Thébaudeau 27*ccca7dfdSBenoît Thébaudeau int fuse_read(u32 bank, u32 word, u32 *val); 28*ccca7dfdSBenoît Thébaudeau fuse read <bank> <word> [<cnt>] 29*ccca7dfdSBenoît Thébaudeau Read fuse words from the shadow cache. 30*ccca7dfdSBenoît Thébaudeau 31*ccca7dfdSBenoît Thébaudeau int fuse_sense(u32 bank, u32 word, u32 *val); 32*ccca7dfdSBenoît Thébaudeau fuse sense <bank> <word> [<cnt>] 33*ccca7dfdSBenoît Thébaudeau Sense - i.e. read directly from the fusebox, skipping the shadow cache - 34*ccca7dfdSBenoît Thébaudeau fuse words. This operation does not update the shadow cache. 35*ccca7dfdSBenoît Thébaudeau 36*ccca7dfdSBenoît Thébaudeau This is useful to know the true value of fuses if an override has been 37*ccca7dfdSBenoît Thébaudeau performed (see below). 38*ccca7dfdSBenoît Thébaudeau 39*ccca7dfdSBenoît Thébaudeau int fuse_prog(u32 bank, u32 word, u32 val); 40*ccca7dfdSBenoît Thébaudeau fuse prog [-y] <bank> <word> <hexval> [<hexval>...] 41*ccca7dfdSBenoît Thébaudeau Program fuse words. This operation directly affects the fusebox and is 42*ccca7dfdSBenoît Thébaudeau irreversible. The shadow cache is updated accordingly or not, depending on 43*ccca7dfdSBenoît Thébaudeau each IP. 44*ccca7dfdSBenoît Thébaudeau 45*ccca7dfdSBenoît Thébaudeau Only the bits to be programmed should be set in the input value (i.e. for 46*ccca7dfdSBenoît Thébaudeau fuse bits that have already been programmed and hence should be left 47*ccca7dfdSBenoît Thébaudeau unchanged by a further programming, it is preferable to clear the 48*ccca7dfdSBenoît Thébaudeau corresponding bits in the input value in order not to perform a new 49*ccca7dfdSBenoît Thébaudeau hardware programming operation on these fuse bits). 50*ccca7dfdSBenoît Thébaudeau 51*ccca7dfdSBenoît Thébaudeau int fuse_override(u32 bank, u32 word, u32 val); 52*ccca7dfdSBenoît Thébaudeau fuse override <bank> <word> <hexval> [<hexval>...] 53*ccca7dfdSBenoît Thébaudeau Override fuse words in the shadow cache. 54*ccca7dfdSBenoît Thébaudeau 55*ccca7dfdSBenoît Thébaudeau The fusebox is unaffected, so following this operation, the shadow cache 56*ccca7dfdSBenoît Thébaudeau may differ from the fusebox values. Read or sense operations can then be 57*ccca7dfdSBenoît Thébaudeau used to get the values from the shadow cache or from the fusebox. 58*ccca7dfdSBenoît Thébaudeau 59*ccca7dfdSBenoît Thébaudeau This is useful to change the behaviors linked to some cached fuse values, 60*ccca7dfdSBenoît Thébaudeau either because this is needed only temporarily, or because some of the 61*ccca7dfdSBenoît Thébaudeau fuses have already been programmed or are locked (if the SoC allows to 62*ccca7dfdSBenoît Thébaudeau override a locked fuse). 63*ccca7dfdSBenoît Thébaudeau 64*ccca7dfdSBenoît ThébaudeauConfiguration: 65*ccca7dfdSBenoît Thébaudeau 66*ccca7dfdSBenoît Thébaudeau CONFIG_CMD_FUSE 67*ccca7dfdSBenoît Thébaudeau Define this to enable the fuse commands. 68