1299241Sadrian/*- 2299241Sadrian * Copyright (c) 2015-2016 Landon Fuller <landon@landonf.org> 3299241Sadrian * All rights reserved. 4299241Sadrian * 5299241Sadrian * Redistribution and use in source and binary forms, with or without 6299241Sadrian * modification, are permitted provided that the following conditions 7299241Sadrian * are met: 8299241Sadrian * 1. Redistributions of source code must retain the above copyright 9299241Sadrian * notice, this list of conditions and the following disclaimer, 10299241Sadrian * without modification. 11299241Sadrian * 2. Redistributions in binary form must reproduce at minimum a disclaimer 12299241Sadrian * similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any 13299241Sadrian * redistribution must be conditioned upon including a substantially 14299241Sadrian * similar Disclaimer requirement for further binary redistribution. 15299241Sadrian * 16299241Sadrian * NO WARRANTY 17299241Sadrian * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 18299241Sadrian * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 19299241Sadrian * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY 20299241Sadrian * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL 21299241Sadrian * THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, 22299241Sadrian * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23299241Sadrian * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 24299241Sadrian * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER 25299241Sadrian * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 26299241Sadrian * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 27299241Sadrian * THE POSSIBILITY OF SUCH DAMAGES. 28299241Sadrian * 29299241Sadrian * $FreeBSD$ 30299241Sadrian */ 31299241Sadrian 32299241Sadrian#ifndef _BHND_NVRAM_BHND_NVRAMVAR_H_ 33299241Sadrian#define _BHND_NVRAM_BHND_NVRAMVAR_H_ 34299241Sadrian 35299241Sadrian/** NVRAM Primitive data types */ 36299241Sadriantypedef enum { 37299241Sadrian BHND_NVRAM_DT_UINT8 = 0, /**< unsigned 8-bit integer */ 38299241Sadrian BHND_NVRAM_DT_UINT16 = 1, /**< unsigned 16-bit integer */ 39299241Sadrian BHND_NVRAM_DT_UINT32 = 2, /**< unsigned 32-bit integer */ 40299241Sadrian BHND_NVRAM_DT_INT8 = 3, /**< signed 8-bit integer */ 41299241Sadrian BHND_NVRAM_DT_INT16 = 4, /**< signed 16-bit integer */ 42299241Sadrian BHND_NVRAM_DT_INT32 = 5, /**< signed 32-bit integer */ 43299241Sadrian BHND_NVRAM_DT_CHAR = 6, /**< ASCII char */ 44299241Sadrian} bhnd_nvram_dt; 45299241Sadrian 46299241Sadrian/** NVRAM data type string representations */ 47299241Sadriantypedef enum { 48299241Sadrian BHND_NVRAM_VFMT_HEX = 1, /**< hex format */ 49299241Sadrian BHND_NVRAM_VFMT_DEC = 2, /**< decimal format */ 50299241Sadrian BHND_NVRAM_VFMT_MACADDR = 3, /**< mac address (canonical form, hex octets, 51299241Sadrian separated with ':') */ 52299241Sadrian BHND_NVRAM_VFMT_LEDDC = 4, /**< LED PWM duty-cycle (2 bytes -- on/off) */ 53299241Sadrian BHND_NVRAM_VFMT_CCODE = 5 /**< count code format (2-3 ASCII chars, or hex string) */ 54299241Sadrian} bhnd_nvram_fmt; 55299241Sadrian 56299241Sadrian/** NVRAM variable flags */ 57299241Sadrianenum { 58299241Sadrian BHND_NVRAM_VF_ARRAY = (1<<0), /**< variable is an array */ 59299241Sadrian BHND_NVRAM_VF_MFGINT = (1<<1), /**< mfg-internal variable; should not be externally visible */ 60299241Sadrian BHND_NVRAM_VF_IGNALL1 = (1<<2) /**< hide variable if its value has all bits set. */ 61299241Sadrian}; 62299241Sadrian 63299241Sadrian#define BHND_SPROMREV_MAX UINT8_MAX /**< maximum supported SPROM revision */ 64299241Sadrian 65299241Sadrian/** SPROM revision compatibility declaration */ 66299241Sadrianstruct bhnd_sprom_compat { 67299241Sadrian uint8_t first; /**< first compatible SPROM revision */ 68299241Sadrian uint8_t last; /**< last compatible SPROM revision, or BHND_SPROMREV_MAX */ 69299241Sadrian}; 70299241Sadrian 71299241Sadrian/** SPROM value descriptor */ 72299241Sadrianstruct bhnd_sprom_offset { 73299241Sadrian uint16_t offset; /**< byte offset within SPROM */ 74299241Sadrian bool cont:1; /**< value should be bitwise OR'd with the 75299241Sadrian * previous offset descriptor */ 76299241Sadrian bhnd_nvram_dt type:7; /**< data type */ 77299241Sadrian int8_t shift; /**< shift to be applied to the value */ 78299241Sadrian uint32_t mask; /**< mask to be applied to the value(s) */ 79299241Sadrian}; 80299241Sadrian 81299241Sadrian/** SPROM-specific variable definition */ 82299241Sadrianstruct bhnd_sprom_var { 83299241Sadrian struct bhnd_sprom_compat compat; /**< sprom compatibility declaration */ 84299241Sadrian const struct bhnd_sprom_offset *offsets; /**< offset descriptors */ 85299241Sadrian size_t num_offsets; /**< number of offset descriptors */ 86299241Sadrian}; 87299241Sadrian 88299241Sadrian/** NVRAM variable definition */ 89299241Sadrianstruct bhnd_nvram_var { 90299241Sadrian const char *name; /**< variable name */ 91299241Sadrian bhnd_nvram_dt type; /**< base data type */ 92299241Sadrian bhnd_nvram_fmt fmt; /**< string format */ 93299241Sadrian uint32_t flags; /**< BHND_NVRAM_VF_* flags */ 94299241Sadrian 95299241Sadrian const struct bhnd_sprom_var *sprom_descs; /**< SPROM-specific variable descriptors */ 96299241Sadrian size_t num_sp_descs; /**< number of sprom descriptors */ 97299241Sadrian}; 98299241Sadrian 99299241Sadriansize_t bhnd_nvram_type_width(bhnd_nvram_dt dt); 100299241Sadrianconst struct bhnd_nvram_var *bhnd_nvram_var_defn(const char *varname); 101299241Sadrian 102299241Sadrian/** Initial bhnd_nvram_crc8 value */ 103299241Sadrian#define BHND_NVRAM_CRC8_INITIAL 0xFF 104299241Sadrian 105299241Sadrian/** Valid CRC-8 checksum */ 106299241Sadrian#define BHND_NVRAM_CRC8_VALID 0x9F 107299241Sadrian 108299241Sadrianextern const uint8_t bhnd_nvram_crc8_tab[]; 109299241Sadrian 110299241Sadrian/** 111299241Sadrian * Calculate CRC-8 over @p buf. 112299241Sadrian * 113299241Sadrian * @param buf input buffer 114299241Sadrian * @param size buffer size 115299241Sadrian * @param crc last computed crc, or BHND_NVRAM_CRC8_INITIAL 116299241Sadrian */ 117299241Sadrianstatic inline uint8_t 118299241Sadrianbhnd_nvram_crc8(const void *buf, size_t size, uint8_t crc) 119299241Sadrian{ 120299241Sadrian const uint8_t *p = (const uint8_t *)buf; 121299241Sadrian while (size--) 122299241Sadrian crc = bhnd_nvram_crc8_tab[(crc ^ *p++)]; 123299241Sadrian 124299241Sadrian return (crc); 125299241Sadrian} 126299241Sadrian 127299241Sadrian 128299241Sadrian#endif /* _BHND_NVRAM_BHND_NVRAMVAR_H_ */