mirror of
https://github.com/AsahiLinux/u-boot
synced 2025-02-16 22:18:52 +00:00
driver: net: fsl-mc: Update calculation of MC RAM
Since the reserved RAM is tracked by gd->arch.resv_ram, calculation of MC memory blocks can be simplified. The MC RAM is guaranteed to be aligned by the reservation process. Signed-off-by: York Sun <york.sun@nxp.com> CC: Priyanka Jain <priyanka.jain@nxp.com> Acked-by: Joe Hershberger <joe.hershberger@ni.com>
This commit is contained in:
parent
36cc0de0b9
commit
437858b620
1 changed files with 8 additions and 51 deletions
|
@ -154,48 +154,6 @@ int parse_mc_firmware_fit_image(u64 mc_fw_addr,
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
|
||||||
* Calculates the values to be used to specify the address range
|
|
||||||
* for the MC private DRAM block, in the MCFBALR/MCFBAHR registers.
|
|
||||||
* It returns the highest 512MB-aligned address within the given
|
|
||||||
* address range, in '*aligned_base_addr', and the number of 256 MiB
|
|
||||||
* blocks in it, in 'num_256mb_blocks'.
|
|
||||||
*/
|
|
||||||
static int calculate_mc_private_ram_params(u64 mc_private_ram_start_addr,
|
|
||||||
size_t mc_ram_size,
|
|
||||||
u64 *aligned_base_addr,
|
|
||||||
u8 *num_256mb_blocks)
|
|
||||||
{
|
|
||||||
u64 addr;
|
|
||||||
u16 num_blocks;
|
|
||||||
|
|
||||||
if (mc_ram_size % MC_RAM_SIZE_ALIGNMENT != 0) {
|
|
||||||
printf("fsl-mc: ERROR: invalid MC private RAM size (%lu)\n",
|
|
||||||
mc_ram_size);
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
num_blocks = mc_ram_size / MC_RAM_SIZE_ALIGNMENT;
|
|
||||||
if (num_blocks < 1 || num_blocks > 0xff) {
|
|
||||||
printf("fsl-mc: ERROR: invalid MC private RAM size (%lu)\n",
|
|
||||||
mc_ram_size);
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
addr = (mc_private_ram_start_addr + mc_ram_size - 1) &
|
|
||||||
MC_RAM_BASE_ADDR_ALIGNMENT_MASK;
|
|
||||||
|
|
||||||
if (addr < mc_private_ram_start_addr) {
|
|
||||||
printf("fsl-mc: ERROR: bad start address %#llx\n",
|
|
||||||
mc_private_ram_start_addr);
|
|
||||||
return -EFAULT;
|
|
||||||
}
|
|
||||||
|
|
||||||
*aligned_base_addr = addr;
|
|
||||||
*num_256mb_blocks = num_blocks;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int mc_fixup_dpc_mac_addr(void *blob, int noff, int dpmac_id,
|
static int mc_fixup_dpc_mac_addr(void *blob, int noff, int dpmac_id,
|
||||||
struct eth_device *eth_dev)
|
struct eth_device *eth_dev)
|
||||||
{
|
{
|
||||||
|
@ -550,17 +508,16 @@ int mc_init(u64 mc_fw_addr, u64 mc_dpc_addr)
|
||||||
size_t raw_image_size = 0;
|
size_t raw_image_size = 0;
|
||||||
#endif
|
#endif
|
||||||
struct mc_version mc_ver_info;
|
struct mc_version mc_ver_info;
|
||||||
u64 mc_ram_aligned_base_addr;
|
|
||||||
u8 mc_ram_num_256mb_blocks;
|
u8 mc_ram_num_256mb_blocks;
|
||||||
size_t mc_ram_size = mc_get_dram_block_size();
|
size_t mc_ram_size = mc_get_dram_block_size();
|
||||||
|
|
||||||
|
mc_ram_num_256mb_blocks = mc_ram_size / MC_RAM_SIZE_ALIGNMENT;
|
||||||
error = calculate_mc_private_ram_params(mc_ram_addr,
|
if (mc_ram_num_256mb_blocks < 1 || mc_ram_num_256mb_blocks > 0xff) {
|
||||||
mc_ram_size,
|
error = -EINVAL;
|
||||||
&mc_ram_aligned_base_addr,
|
printf("fsl-mc: ERROR: invalid MC private RAM size (%lu)\n",
|
||||||
&mc_ram_num_256mb_blocks);
|
mc_ram_size);
|
||||||
if (error != 0)
|
|
||||||
goto out;
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Management Complex cores should be held at reset out of POR.
|
* Management Complex cores should be held at reset out of POR.
|
||||||
|
@ -602,11 +559,11 @@ int mc_init(u64 mc_fw_addr, u64 mc_dpc_addr)
|
||||||
/*
|
/*
|
||||||
* Tell MC what is the address range of the DRAM block assigned to it:
|
* Tell MC what is the address range of the DRAM block assigned to it:
|
||||||
*/
|
*/
|
||||||
reg_mcfbalr = (u32)mc_ram_aligned_base_addr |
|
reg_mcfbalr = (u32)mc_ram_addr |
|
||||||
(mc_ram_num_256mb_blocks - 1);
|
(mc_ram_num_256mb_blocks - 1);
|
||||||
out_le32(&mc_ccsr_regs->reg_mcfbalr, reg_mcfbalr);
|
out_le32(&mc_ccsr_regs->reg_mcfbalr, reg_mcfbalr);
|
||||||
out_le32(&mc_ccsr_regs->reg_mcfbahr,
|
out_le32(&mc_ccsr_regs->reg_mcfbahr,
|
||||||
(u32)(mc_ram_aligned_base_addr >> 32));
|
(u32)(mc_ram_addr >> 32));
|
||||||
out_le32(&mc_ccsr_regs->reg_mcfapr, FSL_BYPASS_AMQ);
|
out_le32(&mc_ccsr_regs->reg_mcfapr, FSL_BYPASS_AMQ);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Add table
Reference in a new issue