GSP
Quick Navigator

Search Site

Unix VPS
A - Starter
B - Basic
C - Preferred
D - Commercial
MPS - Dedicated
Previous VPSs
* Sign Up! *

Support
Contact Us
Online Help
Handbooks
Domain Status
Man Pages

FAQ
Virtual Servers
Pricing
Billing
Technical

Network
Facilities
Connectivity
Topology Map

Miscellaneous
Server Agreement
Year 2038
Credits
 

USA Flag

 

 

Man Pages
nvmem(9) FreeBSD Kernel Developer's Manual nvmem(9)

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,

options EXT_RESOURCES
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);

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.

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.
nvmem_write_cell_by_idx(phandle_t node, int idx, void *cell, size_t buflen)
Write 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_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.

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

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));
	...
}

The nvmem related function first appear in FreeBSD 12.0. The nvmem interface and manual page was written by Emmanuel Vadot <manu@FreeBSD.org>.
July 24, 2018 FreeBSD 13.1-RELEASE

Search for    or go to Top of page |  Section 9 |  Main Index

Powered by GSP Visit the GSP FreeBSD Man Page Interface.
Output converted with ManDoc.