diff options
author | Cyril Bur <cyril.bur@au1.ibm.com> | 2018-03-07 17:04:57 +1100 |
---|---|---|
committer | Stewart Smith <stewart@linux.ibm.com> | 2018-04-09 03:45:23 -0500 |
commit | f7713517d90a14853dc9cfb66ee33dbc084e6ddf (patch) | |
tree | c506168dc46997e30a8c75548c014bed276c0d60 /libflash | |
parent | 07c4573d06785b06ce36fd8feab28e153f4756f7 (diff) | |
download | skiboot-f7713517d90a14853dc9cfb66ee33dbc084e6ddf.zip skiboot-f7713517d90a14853dc9cfb66ee33dbc084e6ddf.tar.gz skiboot-f7713517d90a14853dc9cfb66ee33dbc084e6ddf.tar.bz2 |
libflash/ecc: Add helpers to align a position within an ecc buffer
As part of ongoing work to make ECC invisible to higher levels up the
stack this function converts a 'position' which should be ECC agnostic
to the equivalent position within an ECC region starting at a specified
location.
Signed-off-by: Cyril Bur <cyril.bur@au1.ibm.com>
Signed-off-by: Stewart Smith <stewart@linux.ibm.com>
Diffstat (limited to 'libflash')
-rw-r--r-- | libflash/ecc.h | 5 | ||||
-rw-r--r-- | libflash/test/test-ecc.c | 31 |
2 files changed, 36 insertions, 0 deletions
diff --git a/libflash/ecc.h b/libflash/ecc.h index 2ce2215..bd66948 100644 --- a/libflash/ecc.h +++ b/libflash/ecc.h @@ -67,4 +67,9 @@ static inline uint64_t ecc_buffer_size_minus_ecc(uint64_t len) return len * BYTES_PER_ECC / (BYTES_PER_ECC + 1); } +static inline uint64_t ecc_buffer_align(uint64_t start, uint64_t pos) +{ + return pos - ((pos - start) % (BYTES_PER_ECC + 1)); +} + #endif diff --git a/libflash/test/test-ecc.c b/libflash/test/test-ecc.c index fb6ee64..5ce4c57 100644 --- a/libflash/test/test-ecc.c +++ b/libflash/test/test-ecc.c @@ -487,5 +487,36 @@ int main(void) free(buf); free(ret_buf); + + /* Check that unaligned address become aligned */ + if (ecc_buffer_align(0, 5) != 0) { + ERR("ecc_buffer_align(0, 5) not 0 -> %ld\n", ecc_buffer_align(0, 5)); + exit(1); + } + + if (ecc_buffer_align(0, 8) != 0) { + ERR("ecc_buffer_align(0, 8) not 0 -> %ld\n", ecc_buffer_align(0, 8)); + exit(1); + } + if (ecc_buffer_align(0, 9) != 9) { + ERR("ecc_buffer_align(0, 9) not 9 -> %ld\n", ecc_buffer_align(0, 9)); + exit(1); + } + if (ecc_buffer_align(0, 15) != 9) { + ERR("ecc_buffer_align(0, 15) not 9 -> %ld\n", ecc_buffer_align(0, 15)); + exit(1); + } + if (ecc_buffer_align(5, 10) != 5) { + ERR("ecc_buffer_align(5, 10) not 5 -> %ld\n", ecc_buffer_align(5, 10)); + exit(1); + } + if (ecc_buffer_align(5, 18) != 14) { + ERR("ecc_buffer_align(5, 18) not 14 -> %ld\n", ecc_buffer_align(5, 18)); + exit(1); + } + if (ecc_buffer_align(0, 50) != 45) { + ERR("ecc_buffer_align(0, 50) not 45 -> %ld\n", ecc_buffer_align(0, 50)); + exit(1); + } return 0; } |