summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAmitay Isaacs <amitay@ozlabs.org>2019-01-07 15:30:16 +1100
committerAlistair Popple <alistair@popple.id.au>2019-03-26 11:52:44 +1100
commit1ababc18e41c60cd002fd217e18492f1b0c7c367 (patch)
tree60793d6ef365e49bb18d213df5319564477d7154
parent3ce2bc04c70bf6f961a62a380f7b4459445ed2da (diff)
downloadpdbg-1ababc18e41c60cd002fd217e18492f1b0c7c367.tar.gz
pdbg-1ababc18e41c60cd002fd217e18492f1b0c7c367.zip
adu: Convert __adu_{get, put}mem_blocksize to adu functions
This will help add a generic read/write methods for adu class. Signed-off-by: Amitay Isaacs <amitay@ozlabs.org>
-rw-r--r--libpdbg/adu.c76
1 files changed, 53 insertions, 23 deletions
diff --git a/libpdbg/adu.c b/libpdbg/adu.c
index 5cb1373..b2e80ee 100644
--- a/libpdbg/adu.c
+++ b/libpdbg/adu.c
@@ -110,17 +110,13 @@ uint8_t blog2(uint8_t x)
}
}
-static int __adu_getmem_blocksize(struct pdbg_target *adu_target, uint64_t start_addr,
- uint8_t *output, uint64_t size, uint8_t block_size, bool ci)
+static int adu_read(struct adu *adu, uint64_t start_addr, uint8_t *output,
+ uint64_t size, uint8_t block_size, bool ci)
{
- struct adu *adu;
uint8_t *output0;
int rc = 0;
uint64_t addr0, addr;
- assert(!strcmp(adu_target->class, "adu"));
- adu = target_to_adu(adu_target);
-
output0 = output;
/* Align start address to block_sized boundary */
@@ -164,41 +160,55 @@ static int __adu_getmem_blocksize(struct pdbg_target *adu_target, uint64_t start
int adu_getmem(struct pdbg_target *adu_target, uint64_t start_addr,
uint8_t *output, uint64_t size)
{
- return __adu_getmem_blocksize(adu_target, start_addr, output,
- size, 8, false);
+ struct adu *adu;
+
+ assert(!strcmp(adu_target->class, "adu"));
+ adu = target_to_adu(adu_target);
+
+ return adu_read(adu, start_addr, output, size, 8, false);
}
int adu_getmem_ci(struct pdbg_target *adu_target, uint64_t start_addr,
uint8_t *output, uint64_t size)
{
- return __adu_getmem_blocksize(adu_target, start_addr, output,
- size, 8, true);
+ struct adu *adu;
+
+ assert(!strcmp(adu_target->class, "adu"));
+ adu = target_to_adu(adu_target);
+
+ return adu_read(adu, start_addr, output, size, 8, true);
}
int adu_getmem_io(struct pdbg_target *adu_target, uint64_t start_addr,
uint8_t *output, uint64_t size, uint8_t blocksize)
{
+ struct adu *adu;
+
+ assert(!strcmp(adu_target->class, "adu"));
+ adu = target_to_adu(adu_target);
+
/* There is no equivalent for cachable memory as blocksize
* does not apply to cachable reads */
- return __adu_getmem_blocksize(adu_target, start_addr, output,
- size, blocksize, true);
+ return adu_read(adu, start_addr, output, size, blocksize, true);
}
int __adu_getmem(struct pdbg_target *adu_target, uint64_t start_addr,
uint8_t *output, uint64_t size, bool ci)
{
- return __adu_getmem_blocksize(adu_target, start_addr, output,
- size, 8, ci);
+ struct adu *adu;
+
+ assert(!strcmp(adu_target->class, "adu"));
+ adu = target_to_adu(adu_target);
+
+ return adu_read(adu, start_addr, output, size, 8, ci);
}
-static int __adu_putmem_blocksize(struct pdbg_target *adu_target, uint64_t start_addr,
- uint8_t *input, uint64_t size, uint8_t block_size, bool ci)
+
+static int adu_write(struct adu *adu, uint64_t start_addr, uint8_t *input,
+ uint64_t size, uint8_t block_size, bool ci)
{
- struct adu *adu;
int rc = 0, tsize;
uint64_t addr, data, end_addr;
- assert(!strcmp(adu_target->class, "adu"));
- adu = target_to_adu(adu_target);
end_addr = start_addr + size;
for (addr = start_addr; addr < end_addr; addr += tsize, input += tsize) {
if ((addr % block_size) || (addr + block_size > end_addr)) {
@@ -231,25 +241,45 @@ static int __adu_putmem_blocksize(struct pdbg_target *adu_target, uint64_t start
int adu_putmem(struct pdbg_target *adu_target, uint64_t start_addr,
uint8_t *input, uint64_t size)
{
- return __adu_putmem_blocksize(adu_target, start_addr, input, size, 8, false);
+ struct adu *adu;
+
+ assert(!strcmp(adu_target->class, "adu"));
+ adu = target_to_adu(adu_target);
+
+ return adu_write(adu, start_addr, input, size, 8, false);
}
int adu_putmem_ci(struct pdbg_target *adu_target, uint64_t start_addr,
uint8_t *input, uint64_t size)
{
- return __adu_putmem_blocksize(adu_target, start_addr, input, size, 8, true);
+ struct adu *adu;
+
+ assert(!strcmp(adu_target->class, "adu"));
+ adu = target_to_adu(adu_target);
+
+ return adu_write(adu, start_addr, input, size, 8, true);
}
int adu_putmem_io(struct pdbg_target *adu_target, uint64_t start_addr,
uint8_t *input, uint64_t size, uint8_t block_size)
{
- return __adu_putmem_blocksize(adu_target, start_addr, input, size, block_size, true);
+ struct adu *adu;
+
+ assert(!strcmp(adu_target->class, "adu"));
+ adu = target_to_adu(adu_target);
+
+ return adu_write(adu, start_addr, input, size, block_size, true);
}
int __adu_putmem(struct pdbg_target *adu_target, uint64_t start_addr,
uint8_t *input, uint64_t size, bool ci)
{
- return __adu_putmem_blocksize(adu_target, start_addr, input, size, 8, ci);
+ struct adu *adu;
+
+ assert(!strcmp(adu_target->class, "adu"));
+ adu = target_to_adu(adu_target);
+
+ return adu_write(adu, start_addr, input, size, 8, ci);
}
static int adu_lock(struct adu *adu)
OpenPOWER on IntegriCloud