diff options
| author | Jacob McDonnell <jacob@jacobmcdonnell.com> | 2026-04-25 19:55:43 -0400 |
|---|---|---|
| committer | Jacob McDonnell <jacob@jacobmcdonnell.com> | 2026-04-25 19:55:43 -0400 |
| commit | ac5e55f5f2af5b92794c2aded46c6bae85b5f5ed (patch) | |
| tree | 9367490586c84cba28652e443e3166d66c33b0d9 /static/freebsd/man9/nvmem.9 3.html | |
| parent | 253e67c8b3a72b3a4757fdbc5845297628db0a4a (diff) | |
docs: Added All FreeBSD Manuals
Diffstat (limited to 'static/freebsd/man9/nvmem.9 3.html')
| -rw-r--r-- | static/freebsd/man9/nvmem.9 3.html | 192 |
1 files changed, 192 insertions, 0 deletions
diff --git a/static/freebsd/man9/nvmem.9 3.html b/static/freebsd/man9/nvmem.9 3.html new file mode 100644 index 00000000..291f9867 --- /dev/null +++ b/static/freebsd/man9/nvmem.9 3.html @@ -0,0 +1,192 @@ +<table class="head"> + <tr> + <td class="head-ltitle">nvmem(9)</td> + <td class="head-vol">Kernel Developer's Manual</td> + <td class="head-rtitle">nvmem(9)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<p class="Pp"><code class="Nm">nvmem</code>, + <code class="Nm">nvmem_get_cell_len</code>, + <code class="Nm">nvmem_read_cell_by_name</code>, + <code class="Nm">nvmem_read_cell_by_idx</code>, + <code class="Nm">nvmem_write_cell_by_name</code>, + <code class="Nm">nvmem_write_cell_by_idx</code></p> +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<p class="Pp"><code class="Cd">options FDT</code> + <br/> + <code class="Cd">device nvmem</code> + <br/> + <code class="In">#include + <<a class="In">sys/extres/nvmem/nvmem.h</a>></code></p> +<p class="Pp"><var class="Ft">int</var> + <br/> + <code class="Fn">nvmem_get_cell_len</code>(<var class="Fa" style="white-space: nowrap;">phandle_t + node</var>, <var class="Fa" style="white-space: nowrap;">const char + *name</var>);</p> +<p class="Pp"><var class="Ft">int</var> + <br/> + <code class="Fn">nvmem_read_cell_by_name</code>(<var class="Fa" style="white-space: nowrap;">phandle_t + node</var>, <var class="Fa" style="white-space: nowrap;">const char + *name</var>, <var class="Fa" style="white-space: nowrap;">void *cell</var>, + <var class="Fa" style="white-space: nowrap;">size_t buflen</var>);</p> +<p class="Pp"><var class="Ft">int</var> + <br/> + <code class="Fn">nvmem_read_cell_by_idx</code>(<var class="Fa" style="white-space: nowrap;">phandle_t + node</var>, <var class="Fa" style="white-space: nowrap;">int idx</var>, + <var class="Fa" style="white-space: nowrap;">void *cell</var>, + <var class="Fa" style="white-space: nowrap;">size_t buflen</var>);</p> +<p class="Pp"><var class="Ft">int</var> + <br/> + <code class="Fn">nvmem_write_cell_by_name</code>(<var class="Fa" style="white-space: nowrap;">phandle_t + node</var>, <var class="Fa" style="white-space: nowrap;">const char + *name</var>, <var class="Fa" style="white-space: nowrap;">void *cell</var>, + <var class="Fa" style="white-space: nowrap;">size_t buflen</var>);</p> +<p class="Pp"><var class="Ft">int</var> + <br/> + <code class="Fn">nvmem_write_cell_by_idx</code>(<var class="Fa" style="white-space: nowrap;">phandle_t + node</var>, <var class="Fa" style="white-space: nowrap;">int idx</var>, + <var class="Fa" style="white-space: nowrap;">void *cell</var>, + <var class="Fa" style="white-space: nowrap;">size_t buflen</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +<p class="Pp">On some embedded boards, the manufacturer stored some data on a + NVMEM (Non-Volatile Memory), this is generally stored in some eeprom or + fuses.</p> +<p class="Pp">The <code class="Nm">nvmem</code> API consist of helpers functions + for consumer and device methods for providers.</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="FUNCTIONS"><a class="permalink" href="#FUNCTIONS">FUNCTIONS</a></h1> +<dl class="Bl-tag"> + <dt id="nvmem_get_cell_len"><a class="permalink" href="#nvmem_get_cell_len"><code class="Fn">nvmem_get_cell_len</code></a>(<var class="Fa">phandle_t + node</var>, <var class="Fa">const char *name</var>)</dt> + <dd>Get the size of the cell base on the reg property on the node. Return the + size or ENOENT if the cell name wasn't found</dd> + <dt id="nvmem_read_cell_by_name"><a class="permalink" href="#nvmem_read_cell_by_name"><code class="Fn">nvmem_read_cell_by_name</code></a>(<var class="Fa">phandle_t + node</var>, <var class="Fa">const char *name</var>, <var class="Fa">void + *cell</var>, <var class="Fa">size_t buflen</var>)</dt> + <dd>Get the cell content based on the name. Return 0 on success or ENOENT if + the cell doesn't exists, ENXIO if no provider device was found, EINVAL if + the size isn't correct.</dd> + <dt id="nvmem_read_cell_by_idx"><a class="permalink" href="#nvmem_read_cell_by_idx"><code class="Fn">nvmem_read_cell_by_idx</code></a>(<var class="Fa">phandle_t + node</var>, <var class="Fa">int idx</var>, <var class="Fa">void *cell</var>, + <var class="Fa">size_t buflen</var>)</dt> + <dd>Get the cell content based on the id. Return 0 on success or ENOENT if the + cell doesn't exists, ENXIO if no provider device was found, EINVAL if the + size isn't correct.</dd> + <dt id="nvmem_write_cell_by_name"><a class="permalink" href="#nvmem_write_cell_by_name"><code class="Fn">nvmem_write_cell_by_name</code></a>(<var class="Fa">phandle_t + node</var>, <var class="Fa">const char *name</var>, <var class="Fa">void + *cell</var>, <var class="Fa">size_t buflen</var>)</dt> + <dd>Write the cell content based on the name. Return 0 on success or ENOENT if + the cell doesn't exists, ENXIO if no provider device was found, EINVAL if + the size isn't correct.</dd> + <dt id="nvmem_write_cell_by_idx"><a class="permalink" href="#nvmem_write_cell_by_idx"><code class="Fn">nvmem_write_cell_by_idx</code></a>(<var class="Fa">phandle_t + node</var>, <var class="Fa">int idx</var>, <var class="Fa">void *cell</var>, + <var class="Fa">size_t buflen</var>)</dt> + <dd>Write the cell content based on the id. Return 0 on success or ENOENT if + the cell doesn't exists, ENXIO if no provider device was found, EINVAL if + the size isn't correct.</dd> +</dl> +</section> +<section class="Sh"> +<h1 class="Sh" id="DEVICE_METHODS"><a class="permalink" href="#DEVICE_METHODS">DEVICE + METHODS</a></h1> +<dl class="Bl-tag"> + <dt id="nvmem_read"><a class="permalink" href="#nvmem_read"><code class="Fn">nvmem_read</code></a>(<var class="Fa">device_t + dev</var>, <var class="Fa">uint32_t offset</var>, <var class="Fa">uint32_t + size</var>, <var class="Fa">uint8_t *buffer</var>)</dt> + <dd>Provider device method to read a cell content.</dd> + <dt id="nvmem_write"><a class="permalink" href="#nvmem_write"><code class="Fn">nvmem_write</code></a>(<var class="Fa">device_t + dev</var>, <var class="Fa">uint32_t offset</var>, <var class="Fa">uint32_t + size</var>, <var class="Fa">uint8_t *buffer</var>)</dt> + <dd>Provider device method to write a cell content.</dd> +</dl> +</section> +<section class="Sh"> +<h1 class="Sh" id="EXAMPLES"><a class="permalink" href="#EXAMPLES">EXAMPLES</a></h1> +<p class="Pp">Consider this DTS</p> +<div class="Bd Pp Li"> +<pre>/* Provider */ +eeprom: eeprom@20000 { + board_id: id@0 { + reg = <0x0 0x4>; + }; +}; +/* Consumer */ +device@30000 { + ... + + nvmem-cells = <&board_id> + nvmem-cell-names = "boardid"; +};</pre> +</div> +<p class="Pp">The device driver for eeprom@20000 needs to expose itself as a + provider</p> +<div class="Bd Pp Li"> +<pre>#include "nvmem_if.h" + +int +foo_nvmem_read(device_t dev, uint32_t offset, uint32_t size, uint8_t *buffer) +{ + /* Read the data */ +} + +int +foo_attach(device_t dev) +{ + phandle_t node; + + node = ofw_bus_get_node(dev); + ... + /* Registering the device so the consumers can find us */ + OF_device_register_xref(OF_xref_from_node(node), dev); + + ... +} + +static device_method_t foo_methods[] = { + ... + + /* nvmem interface */ + DEVMETHOD(nvmem_read, foo_nvmem_read), + + /* Terminate method list */ + DEVMETHOD_END +};</pre> +</div> +<p class="Pp">The consumer device driver for device@30000 can now read the nvmem + data</p> +<div class="Bd Pp Li"> +<pre>int +bar_attach(device_t dev) +{ + phandle_t node; + uint32_t boardid; + + ... + node = ofw_bus_get_node(dev); + nvmem_read_cell_by_name(node, "boardid", (void *)&boardid, sizeof(boardid)); + ... +}</pre> +</div> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<p class="Pp">The nvmem related function first appear in + <span class="Ux">FreeBSD 12.0</span>. The nvmem interface and manual page + was written by <span class="An">Emmanuel Vadot</span> + <<a class="Mt" href="mailto:manu@FreeBSD.org">manu@FreeBSD.org</a>>.</p> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">July 24, 2018</td> + <td class="foot-os">FreeBSD 15.0</td> + </tr> +</table> |
