xref: /freebsd/sys/dev/bhnd/nvram/bhnd_nvram_data.h (revision 2ff63af9b88c7413b7d71715b5532625752a248e)
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