int yaffs_parse_cmdline_partitions(struct mtd_partition *current, unsigned long long mastersize)
{
	unsigned long offset;
	int i;
	struct cmdline_mtd_partition *part;

	cmdline = get_mtdparts();

	/* parse command line */
	if (!cmdline_parsed) {
		mtdpart_setup_real(cmdline);

		for (i = current_part, offset = 0; i < MTDPARTITION_MAX; i ++) {
			if (realpart[i].offset == OFFSET_CONTINUOUS)
			  		realpart[i].offset = offset;
				else
			  		offset = realpart[i].offset;
			
				if (realpart[i].size == SIZE_REMAINING)
			  		realpart[i].size = mastersize - offset;

				if (offset + realpart[i].size > mastersize) {
					printf("partitioning exceeds flash size, truncating\n");
					realpart[i].size = mastersize - offset;
				}
				offset += realpart[i].size;


				/*printf("realpart %02d : offset %08x, size %08x  name %14s\n",
	     			(i - current_part),
	     			realpart[i].offset,
	     			realpart[i].size,
				realpart[i].name);*/
		}
	}

	
	for (i = current_part; i < MTDPARTITION_MAX; i ++) {
		if (realpart[i].offset == current->offset) {
			current->size = realpart[i].size;
			strcpy(current->name, realpart[i].name);
			return 0;
		}

		if (strcmp(realpart[i].name, current->name) == 0) {
			current->size = realpart[i].size;
			current->offset = realpart[i].offset;
			return 0;
		}
	}

	return 1;
}
Example #2
0
static int parse_cmdline_partitions(struct mtd_info *master,
                             struct mtd_partition **pparts,
                             unsigned long origin)
#endif
{
	unsigned long offset;
	int i;
	struct cmdline_mtd_partition *part;
	#if ((!defined(CONFIG_MSTAR_NAND) && !defined(CONFIG_MSTAR_SPI_NAND)) || MP_NAND_MTD != 1)
		const char *mtd_id = master->name;
	#endif
	/* parse command line */
	if (!cmdline_parsed)
		mtdpart_setup_real(cmdline);

	for(part = partitions; part; part = part->next)
	{
	#if (defined(CONFIG_MSTAR_NAND) || defined(CONFIG_MSTAR_SPI_NAND)) && (MP_NAND_MTD == 1)
	#else
		if ((!mtd_id) || (!strcmp(part->mtd_id, mtd_id)))
	#endif
		{
			for(i = 0, offset = 0; i < part->num_parts; i++)
			{
				if (part->parts[i].offset == OFFSET_CONTINUOUS)
				  part->parts[i].offset = offset;
				else
				  offset = part->parts[i].offset;
				if (part->parts[i].size == SIZE_REMAINING)
				  part->parts[i].size = master->size - offset;
				if (offset + part->parts[i].size > master->size)
				{
					printk(KERN_WARNING ERRP
					       "%s: partitioning exceeds flash size, truncating\n",
					       part->mtd_id);
					part->parts[i].size = master->size - offset;
					part->num_parts = i;
				}
				offset += part->parts[i].size;
			}
			*pparts = kmemdup(part->parts,
					sizeof(*part->parts) * part->num_parts,
					GFP_KERNEL);
			if (!*pparts)
				return -ENOMEM;
			return part->num_parts;
		}
	}
	return 0;
}
Example #3
0
/*
 * Main function to be called from the MTD mapping driver/device to
 * obtain the partitioning information. At this point the command line
 * arguments will actually be parsed and turned to struct mtd_partition
 * information. It returns partitions for the requested mtd device, or
 * the first one in the chain if a NULL mtd_id is passed in.
 */
static int parse_cmdline_partitions(struct mtd_info *master,
                             struct mtd_partition **pparts,
                             unsigned long origin)
{
	unsigned long offset;
	int i;
	struct cmdline_mtd_partition *part;
	char *mtd_id = master->name;

	if(!cmdline)
		return -EINVAL;

	/* parse command line */
	if (!cmdline_parsed)
		mtdpart_setup_real(cmdline);

	for(part = partitions; part; part = part->next)
	{
		if ((!mtd_id) || (!strcmp(part->mtd_id, mtd_id)))
		{
			for(i = 0, offset = 0; i < part->num_parts; i++)
			{
				if (!part->parts[i].offset)
				  part->parts[i].offset = offset;
				else
				  offset = part->parts[i].offset;
				if (part->parts[i].size == SIZE_REMAINING)
				  part->parts[i].size = master->size - offset;
				if (offset + part->parts[i].size > master->size)
				{
					printk(KERN_WARNING ERRP
					       "%s: partitioning exceeds flash size, truncating\n",
					       part->mtd_id);
					part->parts[i].size = master->size - offset;
					part->num_parts = i;
				}
				offset += part->parts[i].size;
			}
			*pparts = part->parts;
			return part->num_parts;
		}
	}
	return -EINVAL;
}
/*
 * Main function to be called from the MTD mapping driver/device to
 * obtain the partitioning information. At this point the command line
 * arguments will actually be parsed and turned to struct mtd_partition
 * information. It returns partitions for the requested mtd device, or
 * the first one in the chain if a NULL mtd_id is passed in.
 */
static int parse_cmdline_partitions(struct mtd_info *master,
				    struct mtd_partition **pparts,
				    struct mtd_part_parser_data *data)
{
	unsigned long offset;
	int i;
	struct cmdline_mtd_partition *part;
	const char *mtd_id = master->name;

	/* parse command line */
	if (!cmdline_parsed)
		mtdpart_setup_real(cmdline);
	for(part = partitions; part; part = part->next)
	{
		if ((!mtd_id) || (!strcmp(part->mtd_id, mtd_id)))
		{
			for(i = 0, offset = 0; i < part->num_parts; i++)
			{
				if (part->parts[i].offset == OFFSET_CONTINUOUS)
				  part->parts[i].offset = offset;
				else
				  offset = part->parts[i].offset;
				if (part->parts[i].size == SIZE_REMAINING)
				  part->parts[i].size = master->size - offset;
				if (offset + part->parts[i].size > master->size)
				{
					printk(KERN_WARNING ERRP
					       "%s: partitioning exceeds flash size, truncating\n",
					       part->mtd_id);
					part->parts[i].size = master->size - offset;
					part->num_parts = i;
				}
				offset += part->parts[i].size;
			}
			*pparts = kmemdup(part->parts,
					sizeof(*part->parts) * part->num_parts,
					GFP_KERNEL);
			if (!*pparts)
				return -ENOMEM;
			return part->num_parts;
		}
	}
	return 0;
}
Example #5
0
/*
 * Main function to be called from the MTD mapping driver/device to
 * obtain the partitioning information. At this point the command line
 * arguments will actually be parsed and turned to struct mtd_partition
 * information. It returns partitions for the requested mtd device, or
 * the first one in the chain if a NULL mtd_id is passed in.
 */
static int parse_cmdline_partitions(struct mtd_info *master,
				    const struct mtd_partition **pparts,
				    struct mtd_part_parser_data *data)
{
	unsigned long long offset;
	int i, err;
	struct cmdline_mtd_partition *part;
	const char *mtd_id = master->name;

	/* parse command line */
	if (!cmdline_parsed) {
		err = mtdpart_setup_real(cmdline);
		if (err)
			return err;
	}

	/*
	 * Search for the partition definition matching master->name.
	 * If master->name is not set, stop at first partition definition.
	 */
	for (part = partitions; part; part = part->next) {
		if ((!mtd_id) || (!strcmp(part->mtd_id, mtd_id)))
			break;
	}

	if (!part)
		return 0;

	for (i = 0, offset = 0; i < part->num_parts; i++) {
		if (part->parts[i].offset == OFFSET_CONTINUOUS)
			part->parts[i].offset = offset;
		else
			offset = part->parts[i].offset;

		if (part->parts[i].size == SIZE_REMAINING)
			part->parts[i].size = master->size - offset;

		if (offset + part->parts[i].size > master->size) {
			pr_warn("%s: partitioning exceeds flash size, truncating\n",
				part->mtd_id);
			part->parts[i].size = master->size - offset;
		}
		offset += part->parts[i].size;

		if (part->parts[i].size == 0) {
			pr_warn("%s: skipping zero sized partition\n",
				part->mtd_id);
			part->num_parts--;
			memmove(&part->parts[i], &part->parts[i + 1],
				sizeof(*part->parts) * (part->num_parts - i));
			i--;
		}
	}

	*pparts = kmemdup(part->parts, sizeof(*part->parts) * part->num_parts,
			  GFP_KERNEL);
	if (!*pparts)
		return -ENOMEM;

	return part->num_parts;
}