summaryrefslogtreecommitdiffstats
path: root/src/include/gpxe
diff options
context:
space:
mode:
Diffstat (limited to 'src/include/gpxe')
-rw-r--r--src/include/gpxe/nvo.h21
-rw-r--r--src/include/gpxe/nvs.h55
-rw-r--r--src/include/gpxe/spi.h93
-rw-r--r--src/include/gpxe/spi_bit.h1
-rw-r--r--src/include/gpxe/threewire.h58
5 files changed, 115 insertions, 113 deletions
diff --git a/src/include/gpxe/nvo.h b/src/include/gpxe/nvo.h
new file mode 100644
index 00000000..b51431aa
--- /dev/null
+++ b/src/include/gpxe/nvo.h
@@ -0,0 +1,21 @@
+#ifndef _GPXE_NVO_H
+#define _GPXE_NVO_H
+
+/** @file
+ *
+ * Non-volatile stored options
+ *
+ */
+
+struct nvs_device;
+struct dhcp_option_block;
+
+struct nvs_options {
+ struct nvs_device *nvs;
+ struct dhcp_option_block *options;
+};
+
+extern int nvo_register ( struct nvs_options *nvo );
+extern void nvo_unregister ( struct nvs_options *nvo );
+
+#endif /* _GPXE_NVO_H */
diff --git a/src/include/gpxe/nvs.h b/src/include/gpxe/nvs.h
index f8a80787..38bc9c55 100644
--- a/src/include/gpxe/nvs.h
+++ b/src/include/gpxe/nvs.h
@@ -9,22 +9,53 @@
#include <stdint.h>
-struct nvs_operations;
-
+/** A non-volatile storage device */
struct nvs_device {
- struct dhcp_option_block *options;
- size_t len;
- struct nvs_operations *op;
-};
-
-struct nvs_operations {
- int ( * read ) ( struct nvs_device *nvs, unsigned int offset,
+ /** Word length, in bits */
+ unsigned int word_len;
+ /** Device size (in words) */
+ unsigned int size;
+ /** Data block size (in words)
+ *
+ * This is the block size used by the device. It must be a
+ * power of two. Data reads and writes must not cross a block
+ * boundary.
+ *
+ * Many devices allow reads to cross a block boundary, and
+ * restrict only writes. For the sake of simplicity, we
+ * assume that the same restriction applies to both reads and
+ * writes.
+ */
+ unsigned int block_size;
+ /** Read data from device
+ *
+ * @v nvs NVS device
+ * @v address Address from which to read
+ * @v data Data buffer
+ * @v len Length of data buffer
+ * @ret rc Return status code
+ *
+ * Reads may not cross a block boundary.
+ */
+ int ( * read ) ( struct nvs_device *nvs, unsigned int address,
void *data, size_t len );
- int ( * write ) ( struct nvs_device *nvs, unsigned int offset,
+ /** Write data to device
+ *
+ * @v nvs NVS device
+ * @v address Address to which to write
+ * @v data Data buffer
+ * @v len Length of data buffer
+ * @ret rc Return status code
+ *
+ * Writes may not cross a block boundary.
+ */
+ int ( * write ) ( struct nvs_device *nvs, unsigned int address,
const void *data, size_t len );
};
-extern int nvs_register ( struct nvs_device *nvs );
-extern void nvs_unregister ( struct nvs_device *nvs );
+extern int nvs_read ( struct nvs_device *nvs, unsigned int address,
+ void *data, size_t len );
+extern int nvs_write ( struct nvs_device *nvs, unsigned int address,
+ const void *data, size_t len );
#endif /* _GPXE_NVS_H */
diff --git a/src/include/gpxe/spi.h b/src/include/gpxe/spi.h
index dba4c743..bf60efc2 100644
--- a/src/include/gpxe/spi.h
+++ b/src/include/gpxe/spi.h
@@ -7,7 +7,7 @@
*
*/
-#include <gpxe/bitbash.h>
+#include <gpxe/nvs.h>
/**
* @defgroup spicmds SPI commands
@@ -75,32 +75,19 @@
/** @} */
-struct spi_device;
-
/**
- * An SPI device type
+ * An SPI device
*
- * This data structure represents all the characteristics belonging to
- * a particular type of SPI device, e.g. "an Atmel 251024 serial flash",
- * or "a Microchip 25040 serial EEPROM".
+ * This data structure represents a physical SPI device attached to an
+ * SPI bus.
*/
-struct spi_device_type {
- /** Word length, in bits */
- unsigned int word_len;
- /** Device size (in words) */
- unsigned int size;
- /** Data block size (in words)
- *
- * This is the block size used by the device. It must be a
- * power of two. Data reads and writes must not cross a block
- * boundary.
- *
- * Many devices allow reads to cross a block boundary, and
- * restrict only writes. For the sake of simplicity, we
- * assume that the same restriction applies to both reads and
- * writes.
- */
- unsigned int block_size;
+struct spi_device {
+ /** NVS device */
+ struct nvs_device nvs;
+ /** SPI bus to which device is attached */
+ struct spi_bus *bus;
+ /** Slave number */
+ unsigned int slave;
/** Command length, in bits */
unsigned int command_len;
/** Address length, in bits */
@@ -113,64 +100,18 @@ struct spi_device_type {
* commands should be munged in this way.
*/
unsigned int munge_address : 1;
- /** Read data from device
- *
- * @v device SPI device
- * @v address Address from which to read
- * @v data Data buffer
- * @v len Length of data buffer
- * @ret rc Return status code
- */
- int ( * read ) ( struct spi_device *device, unsigned int address,
- void *data, size_t len );
- /** Write data to device
- *
- * @v device SPI device
- * @v address Address to which to write
- * @v data Data buffer
- * @v len Length of data buffer
- * @ret rc Return status code
- */
- int ( * write ) ( struct spi_device *device, unsigned int address,
- const void *data, size_t len );
};
-/**
- * @defgroup spidevs SPI device types
- * @{
- */
-
-/** Atmel AT25010 serial EEPROM */
-#define AT25010 { \
- .word_len = 8, \
- .size = 128, \
- .block_size = 8, \
- .command_len = 8, \
- .address_len = 8, \
- }
-
-/** @} */
-
-/**
- * An SPI device
- *
- * This data structure represents a real, physical SPI device attached
- * to an SPI controller. It comprises the device type plus
- * instantiation-specific information such as the slave number.
- */
-struct spi_device {
- /** SPI device type */
- struct spi_device_type *type;
- /** SPI bus to which device is attached */
- struct spi_bus *bus;
- /** Slave number */
- unsigned int slave;
-};
+static inline __attribute__ (( always_inline )) struct spi_device *
+nvs_to_spi ( struct nvs_device *nvs ) {
+ return container_of ( nvs, struct spi_device, nvs );
+}
/**
* An SPI bus
*
- *
+ * This data structure represents an SPI bus controller capable of
+ * issuing commands to attached SPI devices.
*/
struct spi_bus {
/** SPI interface mode
diff --git a/src/include/gpxe/spi_bit.h b/src/include/gpxe/spi_bit.h
index 46f6af76..04af9136 100644
--- a/src/include/gpxe/spi_bit.h
+++ b/src/include/gpxe/spi_bit.h
@@ -8,6 +8,7 @@
*/
#include <gpxe/spi.h>
+#include <gpxe/bitbash.h>
/** A bit-bashing SPI bus */
struct spi_bit_basher {
diff --git a/src/include/gpxe/threewire.h b/src/include/gpxe/threewire.h
index 4277d8ab..cbf6180a 100644
--- a/src/include/gpxe/threewire.h
+++ b/src/include/gpxe/threewire.h
@@ -22,40 +22,48 @@
/** @} */
+extern int threewire_read ( struct nvs_device *nvs, unsigned int address,
+ void *data, size_t len );
+
/**
- * @defgroup spidevs SPI device types
+ * @defgroup tdevs Three-wire device types
* @{
*/
-/** Atmel AT93C46 serial EEPROM
+static inline __attribute__ (( always_inline )) void
+init_at93cx6 ( struct spi_device *device, unsigned int organisation ) {
+ device->nvs.word_len = organisation;
+ device->nvs.block_size = 1;
+ device->command_len = 3,
+ device->nvs.read = threewire_read;
+}
+
+/**
+ * Initialise Atmel AT93C46 serial EEPROM
*
- * @v org Word size (8 or 16)
+ * @v device SPI device
+ * @v organisation Word organisation (8 or 16)
*/
-#define AT93C46( org ) { \
- .word_len = (org), \
- .size = ( 1024 / (org) ), \
- .block_size = 1, \
- .command_len = 3, \
- .address_len = ( ( (org) == 8 ) ? 7 : 6 ), \
- .read = threewire_read, \
- }
-
-/** Atmel AT93C56 serial EEPROM
+static inline __attribute__ (( always_inline )) void
+init_at93c46 ( struct spi_device *device, unsigned int organisation ) {
+ device->nvs.size = ( 1024 / organisation );
+ device->address_len = ( ( organisation == 8 ) ? 7 : 6 );
+ init_at93cx6 ( device, organisation );
+}
+
+/**
+ * Initialise Atmel AT93C56 serial EEPROM
*
- * @v org Word size (8 or 16)
+ * @v device SPI device
+ * @v organisation Word organisation (8 or 16)
*/
-#define AT93C56( org ) { \
- .word_len = (org), \
- .size = ( 2048 / (org) ), \
- .block_size = 1, \
- .command_len = 3, \
- .address_len = ( ( (org) == 8 ) ? 9 : 8 ), \
- .read = threewire_read, \
- }
+static inline __attribute__ (( always_inline )) void
+init_at93c56 ( struct spi_device *device, unsigned int organisation ) {
+ device->nvs.size = ( 2048 / organisation );
+ device->address_len = ( ( organisation == 8 ) ? 9 : 8 );
+ init_at93cx6 ( device, organisation );
+}
/** @} */
-extern int threewire_read ( struct spi_device *device, unsigned int address,
- void *data, size_t len );
-
#endif /* _GPXE_THREEWIRE_H */