hw/nvram: Avoid unnecessary Xilinx eFuse backstore write
Add a check in the bit-set operation to write the backstore only if the affected bit is 0 before. With this in place, there will be no need for callers to do the checking in order to avoid unnecessary writes. Signed-off-by: Tong Ho <tong.ho@amd.com> Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Reviewed-by: Francisco Iglesias <frasse.iglesias@gmail.com> Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
e60a7d0d4d
commit
c2c1c4a35c
@ -143,6 +143,8 @@ static bool efuse_ro_bits_find(XlnxEFuse *s, uint32_t k)
|
|||||||
|
|
||||||
bool xlnx_efuse_set_bit(XlnxEFuse *s, unsigned int bit)
|
bool xlnx_efuse_set_bit(XlnxEFuse *s, unsigned int bit)
|
||||||
{
|
{
|
||||||
|
uint32_t set, *row;
|
||||||
|
|
||||||
if (efuse_ro_bits_find(s, bit)) {
|
if (efuse_ro_bits_find(s, bit)) {
|
||||||
g_autofree char *path = object_get_canonical_path(OBJECT(s));
|
g_autofree char *path = object_get_canonical_path(OBJECT(s));
|
||||||
|
|
||||||
@ -152,8 +154,13 @@ bool xlnx_efuse_set_bit(XlnxEFuse *s, unsigned int bit)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
s->fuse32[bit / 32] |= 1 << (bit % 32);
|
/* Avoid back-end write unless there is a real update */
|
||||||
efuse_bdrv_sync(s, bit);
|
row = &s->fuse32[bit / 32];
|
||||||
|
set = 1 << (bit % 32);
|
||||||
|
if (!(set & *row)) {
|
||||||
|
*row |= set;
|
||||||
|
efuse_bdrv_sync(s, bit);
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user