]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[nvs] Allow for non-volatile storage devices without block boundaries
authorMichael Brown <mcb30@ipxe.org>
Tue, 11 Jan 2011 19:56:59 +0000 (19:56 +0000)
committerMichael Brown <mcb30@ipxe.org>
Tue, 11 Jan 2011 21:24:40 +0000 (21:24 +0000)
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/drivers/nvs/nvs.c
src/drivers/nvs/nvsvpd.c

index efa49ac59911603ba5ab6df545bea2c2abfedcd6..a4a06ccff547bff4bfbd1488a7c04f5f598b19f6 100644 (file)
@@ -30,6 +30,34 @@ FILE_LICENCE ( GPL2_OR_LATER );
  *
  */
 
+/**
+ * Calculate length up to next block boundary
+ *
+ * @v nvs              NVS device
+ * @v address          Starting address
+ * @v max_len          Maximum length
+ * @ret len            Length to use, stopping at block boundaries
+ */
+static size_t nvs_frag_len ( struct nvs_device *nvs, unsigned int address,
+                            size_t max_len ) {
+       size_t frag_len;
+
+       /* If there are no block boundaries, return the maximum length */
+       if ( ! nvs->block_size )
+               return max_len;
+
+       /* Calculate space remaining up to next block boundary */
+       frag_len = ( ( nvs->block_size -
+                      ( address & ( nvs->block_size - 1 ) ) )
+                    << nvs->word_len_log2 );
+
+       /* Limit to maximum length */
+       if ( max_len < frag_len )
+               return max_len;
+
+       return frag_len;
+}
+
 /**
  * Read from non-volatile storage device
  *
@@ -51,14 +79,8 @@ int nvs_read ( struct nvs_device *nvs, unsigned int address,
 
        while ( len ) {
 
-               /* Calculate space remaining up to next block boundary */
-               frag_len = ( ( nvs->block_size -
-                              ( address & ( nvs->block_size - 1 ) ) )
-                            << nvs->word_len_log2 );
-
-               /* Limit to space remaining in buffer */
-               if ( frag_len > len )
-                       frag_len = len;
+               /* Calculate length to read, stopping at block boundaries */
+               frag_len = nvs_frag_len ( nvs, address, len );
 
                /* Read this portion of the buffer from the device */
                if ( ( rc = nvs->read ( nvs, address, data, frag_len ) ) != 0 )
@@ -122,14 +144,8 @@ int nvs_write ( struct nvs_device *nvs, unsigned int address,
 
        while ( len ) {
 
-               /* Calculate space remaining up to next block boundary */
-               frag_len = ( ( nvs->block_size -
-                              ( address & ( nvs->block_size - 1 ) ) )
-                            << nvs->word_len_log2 );
-
-               /* Limit to space remaining in buffer */
-               if ( frag_len > len )
-                       frag_len = len;
+               /* Calculate length to write, stopping at block boundaries */
+               frag_len = nvs_frag_len ( nvs, address, len );
 
                /* Write this portion of the buffer to the device */
                if ( ( rc = nvs->write ( nvs, address, data, frag_len ) ) != 0)
index 1f61a55d21090edbf754fd0d3b97253450cf1881..b53829e844c5840284e6f6ff8131e7f9b6f9791e 100644 (file)
@@ -111,7 +111,6 @@ int nvs_vpd_init ( struct nvs_vpd_device *nvsvpd, struct pci_device *pci,
        }
 
        /* Initialise NVS device */
-       nvsvpd->nvs.block_size = 1;
        nvsvpd->nvs.size = len;
        nvsvpd->nvs.read = nvs_vpd_read;
        nvsvpd->nvs.write = nvs_vpd_write;