177cb4d3eSLandon J. Fuller /*- 277cb4d3eSLandon J. Fuller * Copyright (c) 2015-2016 Landon Fuller <landonf@FreeBSD.org> 377cb4d3eSLandon J. Fuller * All rights reserved. 477cb4d3eSLandon J. Fuller * 577cb4d3eSLandon J. Fuller * Redistribution and use in source and binary forms, with or without 677cb4d3eSLandon J. Fuller * modification, are permitted provided that the following conditions 777cb4d3eSLandon J. Fuller * are met: 877cb4d3eSLandon J. Fuller * 1. Redistributions of source code must retain the above copyright 977cb4d3eSLandon J. Fuller * notice, this list of conditions and the following disclaimer, 1077cb4d3eSLandon J. Fuller * without modification. 1177cb4d3eSLandon J. Fuller * 2. Redistributions in binary form must reproduce at minimum a disclaimer 1277cb4d3eSLandon J. Fuller * similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any 1377cb4d3eSLandon J. Fuller * redistribution must be conditioned upon including a substantially 1477cb4d3eSLandon J. Fuller * similar Disclaimer requirement for further binary redistribution. 1577cb4d3eSLandon J. Fuller * 1677cb4d3eSLandon J. Fuller * NO WARRANTY 1777cb4d3eSLandon J. Fuller * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1877cb4d3eSLandon J. Fuller * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1977cb4d3eSLandon J. Fuller * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY 2077cb4d3eSLandon J. Fuller * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL 2177cb4d3eSLandon J. Fuller * THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, 2277cb4d3eSLandon J. Fuller * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2377cb4d3eSLandon J. Fuller * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 2477cb4d3eSLandon J. Fuller * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER 2577cb4d3eSLandon J. Fuller * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 2677cb4d3eSLandon J. Fuller * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 2777cb4d3eSLandon J. Fuller * THE POSSIBILITY OF SUCH DAMAGES. 2877cb4d3eSLandon J. Fuller * 2977cb4d3eSLandon J. Fuller */ 3077cb4d3eSLandon J. Fuller 3177cb4d3eSLandon J. Fuller #ifndef _BHND_NVRAM_BHND_NVRAM_DATA_H_ 3277cb4d3eSLandon J. Fuller #define _BHND_NVRAM_BHND_NVRAM_DATA_H_ 3377cb4d3eSLandon J. Fuller 3477cb4d3eSLandon J. Fuller #ifdef _KERNEL 3577cb4d3eSLandon J. Fuller #include <sys/param.h> 3677cb4d3eSLandon J. Fuller #include <sys/bus.h> 3777cb4d3eSLandon J. Fuller #else /* !_KERNEL */ 3877cb4d3eSLandon J. Fuller #include <errno.h> 3977cb4d3eSLandon J. Fuller 4077cb4d3eSLandon J. Fuller #include <stdint.h> 4177cb4d3eSLandon J. Fuller #include <stdlib.h> 4277cb4d3eSLandon J. Fuller #endif /* _KERNEL */ 4377cb4d3eSLandon J. Fuller 4477cb4d3eSLandon J. Fuller #include "bhnd_nvram.h" 4577cb4d3eSLandon J. Fuller #include "bhnd_nvram_io.h" 46a7c43ebdSLandon J. Fuller #include "bhnd_nvram_plist.h" 4719be09f3SLandon J. Fuller #include "bhnd_nvram_value.h" 4877cb4d3eSLandon J. Fuller 4977cb4d3eSLandon J. Fuller /* NVRAM data class */ 5058efe686SLandon J. Fuller typedef struct bhnd_nvram_data_class bhnd_nvram_data_class; 5177cb4d3eSLandon J. Fuller 5277cb4d3eSLandon J. Fuller /* NVRAM data instance */ 5377cb4d3eSLandon J. Fuller struct bhnd_nvram_data; 5477cb4d3eSLandon J. Fuller 5577cb4d3eSLandon J. Fuller /** Declare a bhnd_nvram_data_class with name @p _n */ 5677cb4d3eSLandon J. Fuller #define BHND_NVRAM_DATA_CLASS_DECL(_n) \ 5777cb4d3eSLandon J. Fuller extern struct bhnd_nvram_data_class bhnd_nvram_ ## _n ## _class 5877cb4d3eSLandon J. Fuller 5977cb4d3eSLandon J. Fuller BHND_NVRAM_DATA_CLASS_DECL(bcm); 6077cb4d3eSLandon J. Fuller BHND_NVRAM_DATA_CLASS_DECL(bcmraw); 6177cb4d3eSLandon J. Fuller BHND_NVRAM_DATA_CLASS_DECL(tlv); 6277cb4d3eSLandon J. Fuller BHND_NVRAM_DATA_CLASS_DECL(btxt); 6377cb4d3eSLandon J. Fuller BHND_NVRAM_DATA_CLASS_DECL(sprom); 6477cb4d3eSLandon J. Fuller 6577cb4d3eSLandon J. Fuller /** bhnd_nvram_data capabilities */ 6677cb4d3eSLandon J. Fuller enum { 6777cb4d3eSLandon J. Fuller /** Supports efficient lookup of variables by name */ 6877cb4d3eSLandon J. Fuller BHND_NVRAM_DATA_CAP_INDEXED = (1<<0), 6977cb4d3eSLandon J. Fuller 7077cb4d3eSLandon J. Fuller /** Supports direct access to backing buffer */ 7177cb4d3eSLandon J. Fuller BHND_NVRAM_DATA_CAP_READ_PTR = (1<<1), 7277cb4d3eSLandon J. Fuller 7377cb4d3eSLandon J. Fuller /** Supports device path prefixed variables */ 7477cb4d3eSLandon J. Fuller BHND_NVRAM_DATA_CAP_DEVPATHS = (1<<2), 7577cb4d3eSLandon J. Fuller }; 7677cb4d3eSLandon J. Fuller 7777cb4d3eSLandon J. Fuller /** 7877cb4d3eSLandon J. Fuller * A standard set of probe priorities returned by bhnd_nvram_data_probe(). 7977cb4d3eSLandon J. Fuller * 8077cb4d3eSLandon J. Fuller * Priority is defined in ascending order, with 0 being the highest priority. 8177cb4d3eSLandon J. Fuller * Return values greater than zero are interpreted as regular unix error codes. 8277cb4d3eSLandon J. Fuller */ 8377cb4d3eSLandon J. Fuller enum { 8477cb4d3eSLandon J. Fuller BHND_NVRAM_DATA_PROBE_MAYBE = -40, /**< Possible match */ 8577cb4d3eSLandon J. Fuller BHND_NVRAM_DATA_PROBE_DEFAULT = -20, /**< Definite match of a base 8677cb4d3eSLandon J. Fuller OS-supplied data class */ 8777cb4d3eSLandon J. Fuller BHND_NVRAM_DATA_PROBE_SPECIFIC = 0, /**< Terminate search and use 8877cb4d3eSLandon J. Fuller this data class for 8977cb4d3eSLandon J. Fuller parsing */ 9077cb4d3eSLandon J. Fuller }; 9177cb4d3eSLandon J. Fuller 9258efe686SLandon J. Fuller const char *bhnd_nvram_data_class_desc(bhnd_nvram_data_class *cls); 93c283839dSLandon J. Fuller uint32_t bhnd_nvram_data_class_caps(bhnd_nvram_data_class *cls); 94c283839dSLandon J. Fuller 95c283839dSLandon J. Fuller int bhnd_nvram_data_serialize(bhnd_nvram_data_class *cls, 96c283839dSLandon J. Fuller bhnd_nvram_plist *props, bhnd_nvram_plist *options, 97c283839dSLandon J. Fuller void *outp, size_t *olen); 9877cb4d3eSLandon J. Fuller 9958efe686SLandon J. Fuller int bhnd_nvram_data_probe(bhnd_nvram_data_class *cls, 10077cb4d3eSLandon J. Fuller struct bhnd_nvram_io *io); 10177cb4d3eSLandon J. Fuller int bhnd_nvram_data_probe_classes( 10277cb4d3eSLandon J. Fuller struct bhnd_nvram_data **data, 10377cb4d3eSLandon J. Fuller struct bhnd_nvram_io *io, 10458efe686SLandon J. Fuller bhnd_nvram_data_class *classes[], 10577cb4d3eSLandon J. Fuller size_t num_classes); 10677cb4d3eSLandon J. Fuller 107*591e79bcSLandon J. Fuller int bhnd_nvram_data_getvar_direct( 108*591e79bcSLandon J. Fuller bhnd_nvram_data_class *cls, 109*591e79bcSLandon J. Fuller struct bhnd_nvram_io *io, const char *name, 110*591e79bcSLandon J. Fuller void *buf, size_t *len, bhnd_nvram_type type); 111*591e79bcSLandon J. Fuller 11258efe686SLandon J. Fuller int bhnd_nvram_data_new(bhnd_nvram_data_class *cls, 11377cb4d3eSLandon J. Fuller struct bhnd_nvram_data **nv, 11477cb4d3eSLandon J. Fuller struct bhnd_nvram_io *io); 11577cb4d3eSLandon J. Fuller 11677cb4d3eSLandon J. Fuller struct bhnd_nvram_data *bhnd_nvram_data_retain(struct bhnd_nvram_data *nv); 11777cb4d3eSLandon J. Fuller void bhnd_nvram_data_release(struct bhnd_nvram_data *nv); 11877cb4d3eSLandon J. Fuller 11958efe686SLandon J. Fuller bhnd_nvram_data_class *bhnd_nvram_data_get_class(struct bhnd_nvram_data *nv); 12077cb4d3eSLandon J. Fuller 12177cb4d3eSLandon J. Fuller size_t bhnd_nvram_data_count(struct bhnd_nvram_data *nv); 122a7c43ebdSLandon J. Fuller bhnd_nvram_plist *bhnd_nvram_data_options(struct bhnd_nvram_data *nv); 12377cb4d3eSLandon J. Fuller uint32_t bhnd_nvram_data_caps(struct bhnd_nvram_data *nv); 12477cb4d3eSLandon J. Fuller 12577cb4d3eSLandon J. Fuller const char *bhnd_nvram_data_next(struct bhnd_nvram_data *nv, 12677cb4d3eSLandon J. Fuller void **cookiep); 12777cb4d3eSLandon J. Fuller void *bhnd_nvram_data_find(struct bhnd_nvram_data *nv, 12877cb4d3eSLandon J. Fuller const char *name); 12977cb4d3eSLandon J. Fuller 13019be09f3SLandon J. Fuller int bhnd_nvram_data_getvar_order( 13119be09f3SLandon J. Fuller struct bhnd_nvram_data *nv, void *cookiep1, 13219be09f3SLandon J. Fuller void *cookiep2); 13319be09f3SLandon J. Fuller 13477cb4d3eSLandon J. Fuller int bhnd_nvram_data_getvar(struct bhnd_nvram_data *nv, 13577cb4d3eSLandon J. Fuller void *cookiep, void *buf, size_t *len, 13677cb4d3eSLandon J. Fuller bhnd_nvram_type type); 13777cb4d3eSLandon J. Fuller 13877cb4d3eSLandon J. Fuller const void *bhnd_nvram_data_getvar_ptr(struct bhnd_nvram_data *nv, 13977cb4d3eSLandon J. Fuller void *cookiep, size_t *len, bhnd_nvram_type *type); 14077cb4d3eSLandon J. Fuller 14177cb4d3eSLandon J. Fuller const char *bhnd_nvram_data_getvar_name(struct bhnd_nvram_data *nv, 14277cb4d3eSLandon J. Fuller void *cookiep); 14377cb4d3eSLandon J. Fuller 14419be09f3SLandon J. Fuller int bhnd_nvram_data_copy_val(struct bhnd_nvram_data *nv, 14519be09f3SLandon J. Fuller void *cookiep, bhnd_nvram_val **val); 14619be09f3SLandon J. Fuller 14719be09f3SLandon J. Fuller int bhnd_nvram_data_filter_setvar( 14819be09f3SLandon J. Fuller struct bhnd_nvram_data *nv, const char *name, 14919be09f3SLandon J. Fuller bhnd_nvram_val *value, bhnd_nvram_val **result); 15019be09f3SLandon J. Fuller int bhnd_nvram_data_filter_unsetvar( 15119be09f3SLandon J. Fuller struct bhnd_nvram_data *nv, const char *name); 15219be09f3SLandon J. Fuller 15377cb4d3eSLandon J. Fuller #endif /* _BHND_NVRAM_BHND_NVRAM_DATA_H_ */ 154