Commit 2729723d authored by Tomasz Wlostowski's avatar Tomasz Wlostowski Committed by Federico Vaga

kernel: get memory size dynamically from the FPGA

parent 0b0a7f18
...@@ -177,12 +177,16 @@ static int wrnc_cpu_firmware_load(struct wrnc_cpu *cpu, void *fw_buf, ...@@ -177,12 +177,16 @@ static int wrnc_cpu_firmware_load(struct wrnc_cpu *cpu, void *fw_buf,
struct wrnc_dev *wrnc = to_wrnc_dev(cpu->dev.parent); struct wrnc_dev *wrnc = to_wrnc_dev(cpu->dev.parent);
struct fmc_device *fmc = to_fmc_dev(wrnc); struct fmc_device *fmc = to_fmc_dev(wrnc);
uint32_t *fw = fw_buf, word, word_rb; uint32_t *fw = fw_buf, word, word_rb;
int size, offset, i; int size, offset, i, cpu_memsize;
if (off + count > WRNC_CPU_MEM_SIZE_BYTE) { /* Select the CPU memory to write */
fmc_writel(fmc, cpu->index, wrnc->base_csr + WRN_CPU_CSR_REG_CORE_SEL);
cpu_memsize = fmc_readl(fmc, wrnc->base_csr + WRN_CPU_CSR_REG_CORE_MEMSIZE );
if (off + count > cpu_memsize) {
dev_err(&cpu->dev, dev_err(&cpu->dev,
"Cannot load firmware: size limit %d byte\n", "Cannot load firmware: size limit %d byte\n",
WRNC_CPU_MEM_SIZE_BYTE); cpu_memsize);
return -ENOMEM; return -ENOMEM;
} }
...@@ -193,12 +197,8 @@ static int wrnc_cpu_firmware_load(struct wrnc_cpu *cpu, void *fw_buf, ...@@ -193,12 +197,8 @@ static int wrnc_cpu_firmware_load(struct wrnc_cpu *cpu, void *fw_buf,
/* Reset the CPU before overwrite its memory */ /* Reset the CPU before overwrite its memory */
wrnc_cpu_reset_set(wrnc, (1 << cpu->index)); wrnc_cpu_reset_set(wrnc, (1 << cpu->index));
/* Select the CPU memory to write */
fmc_writel(fmc, cpu->index, wrnc->base_csr + WRN_CPU_CSR_REG_CORE_SEL);
/* Clean CPU memory */ /* Clean CPU memory */
/* FIXME get size dynamically*/ for (i = offset; i < cpu_memsize / 1024; ++i) {
for (i = offset; i < WRNC_CPU_MEM_SIZE_WORD; ++i) {
fmc_writel(fmc, i, wrnc->base_csr + WRN_CPU_CSR_REG_UADDR); fmc_writel(fmc, i, wrnc->base_csr + WRN_CPU_CSR_REG_UADDR);
fmc_writel(fmc, 0, wrnc->base_csr + WRN_CPU_CSR_REG_UDATA); fmc_writel(fmc, 0, wrnc->base_csr + WRN_CPU_CSR_REG_UDATA);
} }
...@@ -228,13 +228,8 @@ static int wrnc_cpu_firmware_dump(struct wrnc_cpu *cpu, void *fw_buf, ...@@ -228,13 +228,8 @@ static int wrnc_cpu_firmware_dump(struct wrnc_cpu *cpu, void *fw_buf,
struct wrnc_dev *wrnc = to_wrnc_dev(cpu->dev.parent); struct wrnc_dev *wrnc = to_wrnc_dev(cpu->dev.parent);
struct fmc_device *fmc = to_fmc_dev(wrnc); struct fmc_device *fmc = to_fmc_dev(wrnc);
uint32_t *fw = fw_buf, word; uint32_t *fw = fw_buf, word;
int size, offset, i; int size, offset, i, cpu_memsize;
if (off + count > WRNC_CPU_MEM_SIZE_BYTE) {
dev_err(&cpu->dev, "Cannot dump firmware: size limit %d byte\n",
WRNC_CPU_MEM_SIZE_BYTE);
return -ENOMEM;
}
/* Calculate code size in 32bit word*/ /* Calculate code size in 32bit word*/
size = (count + 3) / 4; size = (count + 3) / 4;
...@@ -243,6 +238,14 @@ static int wrnc_cpu_firmware_dump(struct wrnc_cpu *cpu, void *fw_buf, ...@@ -243,6 +238,14 @@ static int wrnc_cpu_firmware_dump(struct wrnc_cpu *cpu, void *fw_buf,
/* Select the CPU memory to write */ /* Select the CPU memory to write */
fmc_writel(fmc, cpu->index, wrnc->base_csr + WRN_CPU_CSR_REG_CORE_SEL); fmc_writel(fmc, cpu->index, wrnc->base_csr + WRN_CPU_CSR_REG_CORE_SEL);
cpu_memsize = fmc_readl(fmc, wrnc->base_csr + WRN_CPU_CSR_REG_CORE_MEMSIZE );
if (off + count > cpu_memsize) {
dev_err(&cpu->dev, "Cannot dump firmware: size limit %d byte\n",
cpu_memsize);
return -ENOMEM;
}
/* Dump the firmware */ /* Dump the firmware */
for (i = 0; i < size; ++i) { for (i = 0; i < size; ++i) {
fmc_writel(fmc, i + offset, fmc_writel(fmc, i + offset,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment