diff options
author | Geert Uytterhoeven <geert@linux-m68k.org> | 2010-07-03 19:42:53 +0200 |
---|---|---|
committer | Geert Uytterhoeven <geert@linux-m68k.org> | 2010-07-03 19:52:12 +0200 |
commit | 6775ed16239cbf40d3ee7aab39a04bbc3c4bd577 (patch) | |
tree | f9d2ea27fe06a52193497d155f34cef115afed14 | |
parent | 39b64b1cdc46ff369767d2228f34708e0520de5f (diff) | |
download | amiga-nvram-6775ed16239cbf40d3ee7aab39a04bbc3c4bd577.tar.gz |
Merge word and offset into a single addr value
Make it match with the existing definitions of fields in AmigaOS header files
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
-rw-r--r-- | amiga-nvram.c | 52 |
1 files changed, 29 insertions, 23 deletions
diff --git a/amiga-nvram.c b/amiga-nvram.c index 3358b82..c0c5654 100644 --- a/amiga-nvram.c +++ b/amiga-nvram.c @@ -47,21 +47,20 @@ static struct nvram nvram, backup; static const struct nvram_field { const char *name; - unsigned int word; - unsigned int offset; + unsigned int addr; unsigned int len; } nvram_fields[] = { - { "amiga", 0, 0, 32 }, - { "amiga.amnesia", 0, 0, 1 }, - { "amiga.scsi_timeout", 0, 1, 1 }, - { "amiga.scsi_luns", 0, 2, 1 }, - { "amix", 1, 0, 32 }, - { "shared", 2, 0, 32 }, - { "shared.amnesia", 2, 0, 1 }, - { "shared.scsi_host_id", 2, 1, 3 }, - { "shared.scsi_sync_xfer", 2, 4, 1 }, - { "shared.scsi_fast_sync", 2, 5, 1 }, - { "shared.scsi_tag_queues", 2, 6, 1 }, + { "amiga", 0, 32 }, + { "amiga.amnesia", 0, 1 }, + { "amiga.scsi_timeout", 1, 1 }, + { "amiga.scsi_luns", 2, 1 }, + { "amix", 32, 32 }, + { "shared", 64, 32 }, + { "shared.amnesia", 64, 1 }, + { "shared.scsi_host_id", 65, 3 }, + { "shared.scsi_sync_xfer", 68, 1 }, + { "shared.scsi_fast_sync", 69, 1 }, + { "shared.scsi_tag_queues", 70, 1 }, }; @@ -184,32 +183,39 @@ uint32_t be32_to_cpu(uint32_t x) static uint32_t nvram_get_field(const struct nvram_field *field) { - uint32_t val = be32_to_cpu(nvram.words[field->word]); - if (field->len == 32) + unsigned int word = field->addr / 32; + unsigned int offset = field->addr % 32; + unsigned int len = field->len; + uint32_t val = be32_to_cpu(nvram.words[word]); + + if (len == 32) return val; - val >>= 32 - field->offset - field->len; - val &= (1 << field->len) - 1; + val >>= 32 - offset - len; + val &= (1 << len) - 1; return val; } static void nvram_set_field(const struct nvram_field *field, uint32_t val) { + unsigned int word = field->addr / 32; + unsigned int offset = field->addr % 32; + unsigned int len = field->len; uint32_t mask, shift, t; - if (field->len == 32) { - nvram.words[field->word] = be32_to_cpu(val); + if (len == 32) { + nvram.words[word] = be32_to_cpu(val); return; } - mask = (1 << field->len) - 1; + mask = (1 << len) - 1; val &= mask; - shift = 32 - field->offset - field->len; + shift = 32 - offset - len; val <<= shift; mask <<= shift; - t = be32_to_cpu(nvram.words[field->word]); - nvram.words[field->word] = be32_to_cpu((t & ~mask) | val); + t = be32_to_cpu(nvram.words[word]); + nvram.words[word] = be32_to_cpu((t & ~mask) | val); } static const struct nvram_field *nvram_find_field(const char *name) |