xref: /openbmc/u-boot/doc/README.fuse (revision ec7023db8dc95966919589541f1ca09355a3f7a5)
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