Skip to content

Commit

Permalink
renesas_rz: RAM size auto-detection
Browse files Browse the repository at this point in the history
- Code now iterates through RAM at 512kB intervals to detect the supported OCRAM for a given CPU.
  • Loading branch information
litui committed Aug 27, 2024
1 parent 8328e11 commit 10a3f6d
Showing 1 changed file with 24 additions and 13 deletions.
37 changes: 24 additions & 13 deletions src/target/renesas_rz.c
Original file line number Diff line number Diff line change
Expand Up @@ -73,11 +73,16 @@
* except for pnrs stored in 'FIXED_PNR1', where the code is stored in reverse order (but the last 3 bytes are still 0x20 aka ' ')
*/

/* Base address and size for the 4 OCRAM regions + their mirrors (includes RETRAM) */
/* Base address for the RZ-series, including mirror */
#define RENESAS_OCRAM_BASE 0x20000000U
#define RENESAS_OCRAM_MIRROR_BASE 0x60000000U
#define RENESAS_OCRAM_SIZE 0x00200000U
#define RENESAS_OCRAM_SIZE_A1L 0x00300000U

/* Maximum known OCRAM size for the RZ series (10MB on the RZ/A1H?) */
#define RENESAS_OCRAM_MAX_SIZE 0x00a00000U

/* RAM scanning increment (512k default to speed things up) */
#define RENESAS_OCRAM_SCAN_INCREMENT 0x00080000U

/* Base address and max size for the SPI Flash XIP region */
#define RENESAS_SPI_FLASH_BASE 0x18000000U
#define RENESAS_SPI_FLASH_SIZE 0x04000000U
Expand Down Expand Up @@ -140,7 +145,7 @@
#define ID_RZ_A1 0x012U

static const char *renesas_rz_part_name(uint32_t part_id);
static uint32_t renesas_rz_ram_size(const uint32_t part_id);
static uint32_t renesas_rz_ram_size(target_s *target);
static bool renesas_rz_flash_prepare(target_s *target);
static bool renesas_rz_flash_resume(target_s *target);
static void renesas_rz_spi_read(target_s *target, uint16_t command, target_addr_t address, void *buffer, size_t length);
Expand Down Expand Up @@ -185,8 +190,10 @@ bool renesas_rz_probe(target_s *const target)
if (boot_mode == RENESAS_BSCAN_BOOT_MODE_SPI)
renesas_rz_add_flash(target);

target_add_ram32(target, RENESAS_OCRAM_BASE, renesas_rz_ram_size(part_id));
target_add_ram32(target, RENESAS_OCRAM_MIRROR_BASE, renesas_rz_ram_size(part_id));
/* Determine RAM size by attempting to read in 512MB increments */
uint32_t ram_size = renesas_rz_ram_size(target);
target_add_ram32(target, RENESAS_OCRAM_BASE, ram_size);
target_add_ram32(target, RENESAS_OCRAM_MIRROR_BASE, ram_size);
return true;
}

Expand All @@ -204,15 +211,19 @@ static const char *renesas_rz_part_name(const uint32_t part_id)
return "Unknown";
}

static uint32_t renesas_rz_ram_size(const uint32_t part_id)
/*
* Function to read RAM incrementally to determine the size of it for the given model.
*/
static uint32_t renesas_rz_ram_size(target_s *target)
{
switch (part_id) {
case RENESAS_BSCAN_BSID_RZ_A1L:
return RENESAS_OCRAM_SIZE_A1L;
case RENESAS_BSCAN_BSID_RZ_A1LU:
return RENESAS_OCRAM_SIZE_A1L;
uint32_t result = 0;
for (uint32_t addr = RENESAS_OCRAM_BASE; addr < RENESAS_OCRAM_BASE + RENESAS_OCRAM_MAX_SIZE;
addr += RENESAS_OCRAM_SCAN_INCREMENT) {
/* Read ahead by one scan increment and if there's an error, return the current size. */
if (target_mem32_read(target, &result, addr + RENESAS_OCRAM_SCAN_INCREMENT - 8U, sizeof(result)))
return addr - RENESAS_OCRAM_BASE;
}
return RENESAS_OCRAM_SIZE;
return RENESAS_OCRAM_MAX_SIZE;
}

static bool renesas_rz_flash_prepare(target_s *const target)
Expand Down

0 comments on commit 10a3f6d

Please sign in to comment.