aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/bhnd/nvram/bhnd_sprom.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/bhnd/nvram/bhnd_sprom.c')
-rw-r--r--sys/dev/bhnd/nvram/bhnd_sprom.c98
1 files changed, 51 insertions, 47 deletions
diff --git a/sys/dev/bhnd/nvram/bhnd_sprom.c b/sys/dev/bhnd/nvram/bhnd_sprom.c
index f51e21f590ad..d830af9785d1 100644
--- a/sys/dev/bhnd/nvram/bhnd_sprom.c
+++ b/sys/dev/bhnd/nvram/bhnd_sprom.c
@@ -52,15 +52,9 @@ __FBSDID("$FreeBSD$");
#include "bhnd_nvram_if.h"
-#include "bhnd_spromvar.h"
+#include "bhnd_nvram_io.h"
-#define SPROM_LOCK_INIT(sc) \
- mtx_init(&(sc)->mtx, device_get_nameunit((sc)->dev), \
- "BHND SPROM lock", MTX_DEF)
-#define SPROM_LOCK(sc) mtx_lock(&(sc)->mtx)
-#define SPROM_UNLOCK(sc) mtx_unlock(&(sc)->mtx)
-#define SPROM_LOCK_ASSERT(sc, what) mtx_assert(&(sc)->mtx, what)
-#define SPROM_LOCK_DESTROY(sc) mtx_destroy(&(sc)->mtx)
+#include "bhnd_spromvar.h"
/**
* Default bhnd sprom driver implementation of DEVICE_PROBE().
@@ -68,9 +62,6 @@ __FBSDID("$FreeBSD$");
int
bhnd_sprom_probe(device_t dev)
{
- /* Quiet by default */
- if (!bootverbose)
- device_quiet(dev);
device_set_desc(dev, "SPROM/OTP");
/* Refuse wildcard attachments */
@@ -100,32 +91,62 @@ int
bhnd_sprom_attach(device_t dev, bus_size_t offset)
{
struct bhnd_sprom_softc *sc;
- int error;
-
+ struct bhnd_nvram_io *io;
+ struct bhnd_resource *r;
+ bus_size_t r_size, sprom_size;
+ int rid;
+ int error;
+
sc = device_get_softc(dev);
sc->dev = dev;
+ io = NULL;
+
/* Allocate SPROM resource */
- sc->sprom_rid = 0;
- sc->sprom_res = bhnd_alloc_resource_any(dev, SYS_RES_MEMORY,
- &sc->sprom_rid, RF_ACTIVE);
- if (sc->sprom_res == NULL) {
+ rid = 0;
+ r = bhnd_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, RF_ACTIVE);
+ if (r == NULL) {
device_printf(dev, "failed to allocate resources\n");
return (ENXIO);
}
- /* Initialize SPROM shadow */
- if ((error = bhnd_sprom_init(&sc->shadow, sc->sprom_res, offset)))
+ /* Determine SPROM size */
+ r_size = rman_get_size(r->res);
+ if (r_size <= offset || (r_size - offset) > BUS_SPACE_MAXSIZE) {
+ device_printf(dev, "invalid sprom offset\n");
+ error = ENXIO;
goto failed;
+ }
- /* Initialize mutex */
- SPROM_LOCK_INIT(sc);
+ sprom_size = r_size - offset;
+
+ /* Allocate an I/O context for the SPROM parser. All SPROM reads
+ * must be 16-bit aligned */
+ io = bhnd_nvram_iores_new(r, offset, sprom_size, sizeof(uint16_t));
+ if (io == NULL) {
+ error = ENXIO;
+ goto failed;
+ }
+
+ /* Initialize NVRAM data store */
+ error = bhnd_nvram_store_parse_new(&sc->store, io,
+ &bhnd_nvram_sprom_class);
+ if (error)
+ goto failed;
+
+ /* Clean up our temporary I/O context and its backing resource */
+ bhnd_nvram_io_free(io);
+ bhnd_release_resource(dev, SYS_RES_MEMORY, rid, r);
return (0);
-
+
failed:
- bhnd_release_resource(dev, SYS_RES_MEMORY, sc->sprom_rid,
- sc->sprom_res);
+ /* Clean up I/O context before releasing its backing resource */
+ if (io != NULL)
+ bhnd_nvram_io_free(io);
+
+ bhnd_release_resource(dev, SYS_RES_MEMORY, rid, r);
+
return (error);
}
@@ -157,10 +178,7 @@ bhnd_sprom_detach(device_t dev)
sc = device_get_softc(dev);
- bhnd_release_resource(dev, SYS_RES_MEMORY, sc->sprom_rid,
- sc->sprom_res);
- bhnd_sprom_fini(&sc->shadow);
- SPROM_LOCK_DESTROY(sc);
+ bhnd_nvram_store_free(sc->store);
return (0);
}
@@ -172,16 +190,9 @@ static int
bhnd_sprom_getvar_method(device_t dev, const char *name, void *buf, size_t *len,
bhnd_nvram_type type)
{
- struct bhnd_sprom_softc *sc;
- int error;
-
- sc = device_get_softc(dev);
-
- SPROM_LOCK(sc);
- error = bhnd_sprom_getvar(&sc->shadow, name, buf, len, type);
- SPROM_UNLOCK(sc);
+ struct bhnd_sprom_softc *sc = device_get_softc(dev);
- return (error);
+ return (bhnd_nvram_store_getvar(sc->store, name, buf, len, type));
}
/**
@@ -191,16 +202,9 @@ static int
bhnd_sprom_setvar_method(device_t dev, const char *name, const void *buf,
size_t len, bhnd_nvram_type type)
{
- struct bhnd_sprom_softc *sc;
- int error;
-
- sc = device_get_softc(dev);
-
- SPROM_LOCK(sc);
- error = bhnd_sprom_setvar(&sc->shadow, name, buf, len, type);
- SPROM_UNLOCK(sc);
+ struct bhnd_sprom_softc *sc = device_get_softc(dev);
- return (error);
+ return (bhnd_nvram_store_setvar(sc->store, name, buf, len, type));
}
static device_method_t bhnd_sprom_methods[] = {
@@ -218,5 +222,5 @@ static device_method_t bhnd_sprom_methods[] = {
DEVMETHOD_END
};
-DEFINE_CLASS_0(bhnd_nvram, bhnd_sprom_driver, bhnd_sprom_methods, sizeof(struct bhnd_sprom_softc));
+DEFINE_CLASS_0(bhnd_nvram_store, bhnd_sprom_driver, bhnd_sprom_methods, sizeof(struct bhnd_sprom_softc));
MODULE_VERSION(bhnd_sprom, 1);