[Skiboot] [PATCH v5 20/27] libflash: ecc endian conversions
Nicholas Piggin
npiggin at gmail.com
Tue Oct 15 14:07:10 AEDT 2019
Signed-off-by: Nicholas Piggin <npiggin at gmail.com>
---
libflash/ecc.c | 36 ++++++++++++++++++++----------------
libflash/ecc.h | 8 ++++----
2 files changed, 24 insertions(+), 20 deletions(-)
diff --git a/libflash/ecc.c b/libflash/ecc.c
index 0b85fb3ea..fde6d8900 100644
--- a/libflash/ecc.c
+++ b/libflash/ecc.c
@@ -142,30 +142,34 @@ static inline uint64_t eccflipbit(uint64_t data, uint8_t bit)
return data ^ (1ul << (63 - bit));
}
-static int eccbyte(uint64_t *dst, struct ecc64 *src)
+static int eccbyte(beint64_t *dst, struct ecc64 *src)
{
uint8_t ecc, badbit;
uint64_t data;
- data = src->data;
+ data = be64_to_cpu(src->data);
ecc = src->ecc;
- badbit = eccverify(be64_to_cpu(data), ecc);
+ badbit = eccverify(data, ecc);
if (badbit == UE) {
- FL_ERR("ECC: uncorrectable error: %016lx %02x\n",
- (long unsigned int)be64_to_cpu(data), ecc);
+ FL_ERR("ECC: uncorrectable error: %016llx %02x\n", data, ecc);
return badbit;
}
- *dst = data;
if (badbit <= UE)
FL_INF("ECC: correctable error: %i\n", badbit);
if (badbit < 64)
- *dst = (uint64_t)be64_to_cpu(eccflipbit(be64_to_cpu(data),
- badbit));
+ *dst = cpu_to_be64(eccflipbit(data, badbit));
+ else
+ *dst = cpu_to_be64(data);
return 0;
}
+static beint64_t *inc_beint64_by(const void *p, uint64_t i)
+{
+ return (beint64_t *)(((char *)p) + i);
+}
+
static uint64_t *inc_uint64_by(const void *p, uint64_t i)
{
return (uint64_t *)(((char *)p) + i);
@@ -200,7 +204,7 @@ static uint64_t whole_ecc_structs(uint64_t i)
* @retval: 0 - success
* @retfal: other - fail
*/
-int memcpy_from_ecc(uint64_t *dst, struct ecc64 *src, uint64_t len)
+int memcpy_from_ecc(beint64_t *dst, struct ecc64 *src, uint64_t len)
{
uint32_t i;
@@ -256,7 +260,7 @@ int memcpy_from_ecc(uint64_t *dst, struct ecc64 *src, uint64_t len)
* @retval: 0 - success
* @retfal: other - fail
*/
-int memcpy_from_ecc_unaligned(uint64_t *dst, struct ecc64 *src,
+int memcpy_from_ecc_unaligned(beint64_t *dst, struct ecc64 *src,
uint64_t len, uint8_t alignment)
{
char data[BYTES_PER_ECC];
@@ -273,14 +277,14 @@ int memcpy_from_ecc_unaligned(uint64_t *dst, struct ecc64 *src,
* required - otherwise jump straight to memcpy_from_ecc()
*/
if (alignment) {
- rc = eccbyte((uint64_t *)data, src);
+ rc = eccbyte((beint64_t *)data, src);
if (rc)
return rc;
memcpy(dst, &data[alignment], bytes_wanted);
src = inc_ecc64_by(src, sizeof(struct ecc64));
- dst = inc_uint64_by(dst, bytes_wanted);
+ dst = inc_beint64_by(dst, bytes_wanted);
len -= bytes_wanted;
}
@@ -299,7 +303,7 @@ int memcpy_from_ecc_unaligned(uint64_t *dst, struct ecc64 *src,
}
if (len) {
- rc = eccbyte((uint64_t *)data, src);
+ rc = eccbyte((beint64_t *)data, src);
if (rc)
return rc;
@@ -323,7 +327,7 @@ int memcpy_from_ecc_unaligned(uint64_t *dst, struct ecc64 *src,
* @retval: 0 - success
* @retfal: other - fail
*/
-int memcpy_to_ecc(struct ecc64 *dst, const uint64_t *src, uint64_t len)
+int memcpy_to_ecc(struct ecc64 *dst, const beint64_t *src, uint64_t len)
{
struct ecc64 ecc_word;
uint64_t i;
@@ -390,7 +394,7 @@ int memcpy_to_ecc(struct ecc64 *dst, const uint64_t *src, uint64_t len)
* @retfal: other - fail
*/
-int memcpy_to_ecc_unaligned(struct ecc64 *dst, const uint64_t *src,
+int memcpy_to_ecc_unaligned(struct ecc64 *dst, const beint64_t *src,
uint64_t len, uint8_t alignment)
{
struct ecc64 ecc_word;
@@ -412,7 +416,7 @@ int memcpy_to_ecc_unaligned(struct ecc64 *dst, const uint64_t *src,
sizeof(struct ecc64) - alignment);
dst = inc_ecc64_by(dst, sizeof(struct ecc64) - alignment);
- src = inc_uint64_by(src, bytes_wanted);
+ src = inc_beint64_by(src, bytes_wanted);
len -= bytes_wanted;
}
diff --git a/libflash/ecc.h b/libflash/ecc.h
index 608d50008..75c3adf22 100644
--- a/libflash/ecc.h
+++ b/libflash/ecc.h
@@ -16,12 +16,12 @@ struct ecc64 {
uint8_t ecc;
} __attribute__((__packed__));
-extern int memcpy_from_ecc(uint64_t *dst, struct ecc64 *src, uint64_t len);
-extern int memcpy_from_ecc_unaligned(uint64_t *dst, struct ecc64 *src, uint64_t len,
+extern int memcpy_from_ecc(beint64_t *dst, struct ecc64 *src, uint64_t len);
+extern int memcpy_from_ecc_unaligned(beint64_t *dst, struct ecc64 *src, uint64_t len,
uint8_t alignment);
-extern int memcpy_to_ecc(struct ecc64 *dst, const uint64_t *src, uint64_t len);
-extern int memcpy_to_ecc_unaligned(struct ecc64 *dst, const uint64_t *src, uint64_t len,
+extern int memcpy_to_ecc(struct ecc64 *dst, const beint64_t *src, uint64_t len);
+extern int memcpy_to_ecc_unaligned(struct ecc64 *dst, const beint64_t *src, uint64_t len,
uint8_t alignment);
/*
--
2.23.0
More information about the Skiboot
mailing list