FreeBSD manual
download PDF document: nvmem.9.pdf
nvmem(9) FreeBSD Kernel Developer's Manual nvmem(9)
NAME
nvmem, nvmem_get_cell_len, nvmem_read_cell_by_name,
nvmem_read_cell_by_idx, nvmem_write_cell_by_name, nvmem_write_cell_by_idx
SYNOPSIS
options FDT
device nvmem
#include <sys/extres/nvmem/nvmem.h>
int
nvmem_get_cell_len(phandle_t node, const char *name);
int
nvmem_read_cell_by_name(phandle_t node, const char *name, void *cell,
size_t buflen);
int
nvmem_read_cell_by_idx(phandle_t node, int idx, void *cell,
size_t buflen);
int
nvmem_write_cell_by_name(phandle_t node, const char *name, void *cell,
size_t buflen);
int
nvmem_write_cell_by_idx(phandle_t node, int idx, void *cell,
size_t buflen);
DESCRIPTION
On some embedded boards, the manufacturer stored some data on a NVMEM
(Non-Volatile Memory), this is generally stored in some eeprom or fuses.
The nvmem API consist of helpers functions for consumer and device
methods for providers.
FUNCTIONS
nvmem_get_cell_len(phandle_t node, const char *name)
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
nvmem_read_cell_by_name(phandle_t node, const char *name, void *cell,
size_t buflen)
Get the cell content based on the name. Return 0 on sucess or
ENOENT if the cell doesn't exists, ENXIO if no provider device
was found, EINVAL if the size isn't correct.
nvmem_read_cell_by_idx(phandle_t node, int idx, void *cell, size_t
buflen)
Get the cell content based on the id. Return 0 on sucess or
ENOENT if the cell doesn't exists, ENXIO if no provider device
was found, EINVAL if the size isn't correct.
nvmem_write_cell_by_name(phandle_t node, const char *name, void *cell,
size_t buflen)
Write the cell content based on the name. Return 0 on sucess or
ENOENT if the cell doesn't exists, ENXIO if no provider device
was found, EINVAL if the size isn't correct.
DEVICE METHODS
nvmem_read(device_t dev, uint32_t offset, uint32_t size, uint8_t *buffer)
Provider device method to read a cell content.
nvmem_write(device_t dev, uint32_t offset, uint32_t size, uint8_t
*buffer)
Provider device method to write a cell content.
EXAMPLES
Consider this DTS
/* Provider */
eeprom: eeprom@20000 {
board_id: id@0 {
reg = <0x0 0x4>;
};
};
/* Consumer */
device@30000 {
...
nvmem-cells = <&board_id>
nvmem-cell-names = "boardid";
};
The device driver for eeprom@20000 needs to expose itself as a provider
#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
};
The consumer device driver for device@30000 can now read the nvmem data
...
node = ofw_bus_get_node(dev);
nvmem_read_cell_by_name(node, "boardid", (void *)&boardid, sizeof(boardid));
...
}
HISTORY
The nvmem related function first appear in FreeBSD 12.0. The nvmem
interface and manual page was written by Emmanuel Vadot
<manu@FreeBSD.org>.
FreeBSD 14.0-RELEASE-p11 July 24, 2018 FreeBSD 14.0-RELEASE-p11