Пример #1
0
/* Funtion to add the ram partition entries into device tree.
 * The function assumes that all the entire fixed memory regions should
 * be listed in the first bank of the passed in ddr regions.
 */
uint32_t target_dev_tree_mem(void *fdt, uint32_t memory_node_offset)
{
    struct smem_ram_ptable ram_ptable;
    uint32_t i;
	int ret = 0;

	/* Make sure RAM partition table is initialized */
	ASSERT(smem_ram_ptable_init(&ram_ptable));

     /* Calculating the size of the mem_info_ptr */
    for (i = 0 ; i < ram_ptable.len; i++)
    {
        if((ram_ptable.parts[i].category == SDRAM) &&
           (ram_ptable.parts[i].type == SYS_MEMORY))
        {

			/* Pass along all other usable memory regions to Linux */
			ret = dev_tree_add_mem_info(fdt,
										memory_node_offset,
										ram_ptable.parts[i].start,
										ram_ptable.parts[i].size);

			if (ret)
			{
				dprintf(CRITICAL, "Failed to add secondary banks memory addresses\n");
				goto target_dev_tree_mem_err;
			}

       }
    }

target_dev_tree_mem_err:

    return ret;
}
int target_add_first_mem_bank(void *fdt,
                              uint32_t offset,
                              mem_info usable_mem_map[],
                              uint32_t num_regions)
{
    uint32_t i;
    int ret;

    ASSERT(num_regions);

    dprintf(SPEW, "Number of HLOS regions in 1st bank = %u\n", num_regions);

    for (i = 0; i < num_regions; i++)
    {
        ret = dev_tree_add_mem_info(fdt,
                                    offset,
                                    usable_mem_map[i].start_addr,
                                    usable_mem_map[i].size);
    }
    return ret;
}
Пример #3
0
uint32_t target_dev_tree_mem(void *fdt, uint32_t memory_node_offset)
{
	ram_partition ptn_entry;
	unsigned int index;
	int ret = 0;
	uint32_t len = 0;

	/* Make sure RAM partition table is initialized */
	ASSERT(smem_ram_ptable_init_v1());

	len = smem_get_ram_ptable_len();

	/* Calculating the size of the mem_info_ptr */
	for (index = 0 ; index < len; index++)
	{
		smem_get_ram_ptable_entry(&ptn_entry, index);

		if((ptn_entry.category == SDRAM) &&
			(ptn_entry.type == SYS_MEMORY))
		{

			/* Pass along all other usable memory regions to Linux */
			ret = dev_tree_add_mem_info(fdt,
							memory_node_offset,
							ptn_entry.start,
							ptn_entry.size);

			if (ret)
			{
				dprintf(CRITICAL, "Failed to add secondary banks memory addresses\n");
				goto target_dev_tree_mem_err;
			}
		}
	}
target_dev_tree_mem_err:

	return ret;
}
/* Funtion to add the ram partition entries into device tree.
 * The function assumes that all the entire fixed memory regions should
 * be listed in the first bank of the passed in ddr regions.
 */
uint32_t target_dev_tree_mem(void *fdt, uint32_t memory_node_offset)
{
    uint32_t last_fixed_addr;
    int n;
    unsigned int i;
    int ret;

    n = ARRAY_SIZE(mdm9625_default_fixed_memory);

    last_fixed_addr = mdm9625_default_fixed_memory[n-1].start_addr +
                      mdm9625_default_fixed_memory[n-1].size;

    for (i = 0; i < ram_ptable.len; i++)
    {
        if((ram_ptable.parts[i].category == SDRAM) &&
                (ram_ptable.parts[i].type == SYS_MEMORY))
        {
            if((ram_ptable.parts[i].start <= last_fixed_addr) &&
                    ((ram_ptable.parts[i].start + ram_ptable.parts[i].size) >= last_fixed_addr))
            {

                /* Pass along all fixed memory regions to Linux */
                ret = target_add_first_mem_bank(fdt,
                                                memory_node_offset,
                                                mdm9625_default_fixed_memory,
                                                ARRAY_SIZE(mdm9625_default_fixed_memory));

                if (ret)
                {
                    dprintf(CRITICAL, "Failed to add first bank fixed memory addresses\n");
                    goto target_dev_tree_mem_err;
                }

                if((ram_ptable.parts[i].start + ram_ptable.parts[i].size) != last_fixed_addr)
                {
                    /* Pass the memory beyond the fixed memory present in the partition */
                    ret = dev_tree_add_mem_info(fdt,
                                                memory_node_offset,
                                                ram_ptable.parts[i].start + last_fixed_addr,
                                                ram_ptable.parts[i].size - last_fixed_addr);

                    if (ret)
                    {
                        dprintf(CRITICAL, "Failed to add first bank memory addresses\n");
                        goto target_dev_tree_mem_err;
                    }
                }
            }
            else
            {
                /* Pass along all other usable memory regions to Linux */
                ret = dev_tree_add_mem_info(fdt,
                                            memory_node_offset,
                                            ram_ptable.parts[i].start,
                                            ram_ptable.parts[i].size);

                if (ret)
                {
                    dprintf(CRITICAL, "Failed to add secondary banks memory addresses\n");
                    goto target_dev_tree_mem_err;
                }
            }
        }
    }

target_dev_tree_mem_err:

    return ret;
}