summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGeert Uytterhoeven <geert@linux-m68k.org>2010-07-03 19:42:53 +0200
committerGeert Uytterhoeven <geert@linux-m68k.org>2010-07-03 19:52:12 +0200
commit6775ed16239cbf40d3ee7aab39a04bbc3c4bd577 (patch)
treef9d2ea27fe06a52193497d155f34cef115afed14
parent39b64b1cdc46ff369767d2228f34708e0520de5f (diff)
downloadamiga-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.c52
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)