int ccci_init_security(void)
{
	int ret = 0;
#ifdef ENABLE_MD_IMG_SECURITY_FEATURE
	static int security_init;	/* for multi-modem support */
	if (security_init)
		return ret;
	security_init = 1;

	ret = masp_boot_init();
	if (ret != 0) {
		CCCI_UTIL_ERR_MSG("masp_boot_init fail: %d\n", ret);
		ret = -EIO;
	}

	if (sec_lib_version_check() != 0) {
		CCCI_UTIL_ERR_MSG("sec lib version check error\n");
		ret = -EIO;
	}
	CCCI_UTIL_INF_MSG("security is on!\n");
#else
	CCCI_UTIL_INF_MSG("security is off!\n");
#endif
	return ret;
}
int ccci_get_fo_setting(char item[], unsigned int *val)
{
	char *ccci_name;
	int  ccci_value;
	int  i;

	for (i=0; i<ARRAY_SIZE(ccci_fos_default_setting); i++) {
		ccci_name = ccci_fos_default_setting[i].name;
		ccci_value = ccci_fos_default_setting[i].value;
		if(!strcmp(ccci_name, item)) {
			CCCI_UTIL_ERR_MSG("FO:%s -> %08x\n", item, ccci_value);
			*val = (unsigned int)ccci_value;
			return 0;
		}
	}
	CCCI_UTIL_ERR_MSG("FO:%s not found\n", item);
	return -CCCI_ERR_INVALID_PARAM;
}
Example #3
0
static int sec_lib_version_check(void)
{
	int ret = 0;

	int sec_lib_ver = masp_ccci_version_info();
	if(sec_lib_ver != CURR_SEC_CCCI_SYNC_VER){
		CCCI_UTIL_ERR_MSG("[Error]sec lib for ccci mismatch: sec_ver:%d, ccci_ver:%d\n", sec_lib_ver, CURR_SEC_CCCI_SYNC_VER);
		ret = -1;
	}

	return ret;
}
//--- META arguments parse -------
static int ccci_parse_meta_md_setting(unsigned char args[])
{
	unsigned char md_active_setting = args[1];
	unsigned char md_setting_flag = args[0];
	int active_id =  -1;

	if(md_active_setting & MD1_EN)
		active_id = MD_SYS1;
	else if(md_active_setting & MD2_EN)
		active_id = MD_SYS2;
	else if(md_active_setting & MD3_EN)
		active_id = MD_SYS3;
	else if(md_active_setting & MD5_EN)
		active_id = MD_SYS5;
	else
		CCCI_UTIL_ERR_MSG("META MD setting not found [%d][%d]\n", args[0], args[1]);

	switch(active_id) 
	{
	case MD_SYS1:
	case MD_SYS2:
	case MD_SYS3:
	case MD_SYS5:
		if(md_setting_flag == MD_2G_FLAG) {
			meta_md_support[active_id] = modem_2g;
		} else if(md_setting_flag == MD_WG_FLAG) {
			meta_md_support[active_id] = modem_wg;
		} else if(md_setting_flag == MD_TG_FLAG) {
			meta_md_support[active_id] = modem_tg;
		} else if(md_setting_flag == MD_LWG_FLAG){
			meta_md_support[active_id] = modem_lwg;
		} else if(md_setting_flag == MD_LTG_FLAG){
			meta_md_support[active_id] = modem_ltg;
		} else if(md_setting_flag & MD_SGLTE_FLAG){
			meta_md_support[active_id] = modem_sglte;
		}
		CCCI_UTIL_INF_MSG("META MD%d to type:%d\n", active_id+1, meta_md_support[active_id]);
		break;
	}
	return 0;	
}
Example #5
0
static void get_md_postfix(int md_id, char k[], char buf[], char buf_ex[])
{
	// name format: modem_X_YY_K_Ex.img
	int X, Ex;
	char YY_K[IMG_POSTFIX_LEN];
	unsigned int feature_val = 0;

	if ((md_id<0) || (md_id>MAX_MD_NUM)) {
		CCCI_UTIL_ERR_MSG("wrong MD ID to get postfix %d\n", md_id);
		return;
	}

	// X
	X = md_id + 1;

	// YY_
	YY_K[0] = '\0';

	//#ifndef Flyme_EDIT
	//#[email protected] for load modem firmware by hardware info
	feature_val = mz_get_operator_type();
	CCCI_UTIL_INF_MSG("mz_get_operator_type = 0x%x\n",feature_val);
	if (IS_LWG(feature_val)){
		CCCI_UTIL_INF_MSG("modem type is china unicom\n");
		feature_val = modem_lwg;
	}else if (IS_LTG(feature_val)){
		CCCI_UTIL_INF_MSG("modem type is china mobile\n");
		feature_val = modem_ltg;
	}else {
		CCCI_UTIL_INF_MSG("modem type is public\n");
		switch(md_id) {
		case MD_SYS1:
			feature_val = get_modem_support_cap(MD_SYS1);
			break;
		case MD_SYS2:
			feature_val = get_modem_support_cap(MD_SYS2);
			break;
	  	case MD_SYS5:
	  		feature_val = get_modem_support_cap(MD_SYS5);
	  		break;
	  	default:
			CCCI_UTIL_ERR_MSG("request MD ID %d not supported\n", md_id);
	  		break;
		}
	}
	//#endif /*Flyme_EDIT*/
	if((feature_val==0) || (feature_val>=MAX_IMG_NUM)) {
  		CCCI_UTIL_ERR_MSG("request MD type %d not supported\n", feature_val);
  		feature_val = md_type_invalid;
	}

	// K
	if(k == NULL)
		snprintf(YY_K, IMG_POSTFIX_LEN, "_%s_n", type_str[feature_val]);
	else
		snprintf(YY_K, IMG_POSTFIX_LEN, "_%s_%s", type_str[feature_val], k);

	// [_Ex] Get chip version
#if 0
	if(get_chip_version() == CHIP_SW_VER_01)
		Ex = 1;
	else if(get_chip_version() == CHIP_SW_VER_02)
		Ex = 2;
#else
	Ex = 1;
#endif

	// Gen post fix
	if(buf) {
		snprintf(buf, IMG_POSTFIX_LEN, "%d%s", X, YY_K);
		CCCI_UTIL_INF_MSG("MD%d image postfix=%s\n", md_id+1, buf);
	}

	if(buf_ex) {
		snprintf(buf_ex, IMG_POSTFIX_LEN, "%d%s_E%d", X, YY_K, Ex);
		CCCI_UTIL_INF_MSG("MD%d image postfix=%s\n", md_id+1, buf_ex);
	}
}
static void v1_cal_md_mem_setting(void)
{
	phys_addr_t *addr;
	unsigned int md1_en, md2_en;

	addr = md_resv_mem_list; // MD ROM start address should be 32M align as remap hardware limitation

	if( (md_usage_case&(MD1_EN|MD2_EN))==(MD1_EN|MD2_EN)) { // Both two MD enabled
		md1_en = 1;
		md2_en = 1;
		md_resv_mem_addr[MD_SYS1] = addr[0];
		md_resv_mem_addr[MD_SYS2] = addr[1];
		md_resv_smem_addr[MD_SYS1] = addr[0] + md_resv_mem_size[MD_SYS1];
		md_resv_smem_addr[MD_SYS2] = addr[1] + md_resv_mem_size[MD_SYS2];
		md_resv_smem_base = addr[0]; // attention, share memory's base is not where share memory actually starts, but the same as MD ROM, check ccci_set_mem_remap()
	} else if( (md_usage_case&(MD1_EN|MD2_EN))==(MD1_EN)) { //Only MD1 enabled
		md1_en = 1;
		md2_en = 0;
		md_resv_mem_addr[MD_SYS1] = addr[0];
		md_resv_mem_addr[MD_SYS2] = 0;
		md_resv_smem_addr[MD_SYS1] = addr[0] + md_resv_mem_size[MD_SYS1];
		md_resv_smem_addr[MD_SYS2] = 0;
		md_resv_smem_base = addr[0];
	} else if( (md_usage_case&(MD1_EN|MD2_EN))==(MD2_EN)) { //Only MD2 enabled
		md1_en = 0;
		md2_en = 1;
		md_resv_mem_addr[MD_SYS1] = 0;
		md_resv_mem_addr[MD_SYS2] = addr[0];
		md_resv_smem_addr[MD_SYS1] = 0;
		md_resv_smem_addr[MD_SYS2] = addr[0] + md_resv_mem_size[MD_SYS2];
		md_resv_smem_base = addr[0];
	} else { // No MD is enabled
		md1_en = 0;
		md2_en = 0;
		md_resv_mem_addr[MD_SYS1] = 0;
		md_resv_mem_addr[MD_SYS2] = 0;
		md_resv_smem_addr[MD_SYS1] = 0;
		md_resv_smem_addr[MD_SYS2] = 0;
		md_resv_smem_base = 0;
	}

	if (md1_en && ((md_resv_mem_addr[MD_SYS1]&(CCCI_MEM_ALIGN - 1)) != 0))
		CCCI_UTIL_ERR_MSG("md1 memory addr is not 32M align!!!\n");

	if (md2_en && ((md_resv_mem_addr[MD_SYS2]&(CCCI_MEM_ALIGN - 1)) != 0))
		CCCI_UTIL_ERR_MSG("md2 memory addr is not 32M align!!!\n");

	if (md1_en && ((md_resv_smem_addr[MD_SYS1]&(CCCI_SMEM_ALIGN_MD1 - 1)) != 0))
		CCCI_UTIL_ERR_MSG("md1 share memory addr %pa is not %x align!!\n", &md_resv_smem_addr[MD_SYS1], CCCI_SMEM_ALIGN_MD1);

	if (md2_en && ((md_resv_smem_addr[MD_SYS2]&(CCCI_SMEM_ALIGN_MD2 - 1)) != 0))
		CCCI_UTIL_ERR_MSG("md2 share memory addr %pa is not %x align!!\n", &md_resv_smem_addr[MD_SYS2], CCCI_SMEM_ALIGN_MD2);

	CCCI_UTIL_INF_MSG("MD1_EN(%d):MD2_EN(%d):MemBase(0x%pa)\n", md1_en, md2_en, &md_resv_smem_base);

	CCCI_UTIL_INF_MSG("MemStart(0x%pa:0x%pa):MemSize(0x%08X:0x%08X)\n", \
		&md_resv_mem_addr[MD_SYS1], &md_resv_mem_addr[MD_SYS2], \
		md_resv_mem_size[MD_SYS1], md_resv_mem_size[MD_SYS2]);

	CCCI_UTIL_INF_MSG("SmemStart(0x%pa:0x%pa):SmemSize(0x%08X:0x%08X)\n", \
		&md_resv_smem_addr[MD_SYS1], &md_resv_smem_addr[MD_SYS2], \
		md_resv_smem_size[MD_SYS1], md_resv_smem_size[MD_SYS2]);
}
Example #7
0
static void collect_md_settings(void)
{
	unsigned int tmp;
	unsigned int md1_en = 0;
	unsigned int md2_en = 0;
	unsigned int md3_en = 0;
	unsigned int md5_en = 0;
	md_usage_case = 0;

	printk("[ccci] collect_md_settings\n");

	// MTK_ENABLE_MD*
	if(ccci_get_fo_setting("MTK_ENABLE_MD1", &tmp) == 0) {
		if(tmp > 0)
			md1_en = 1;
	}
	if(ccci_get_fo_setting("MTK_ENABLE_MD2", &tmp) == 0) {
		if(tmp > 0) 
			md2_en = 1;
	}
	if(ccci_get_fo_setting("MTK_ENABLE_MD3", &tmp) == 0) {
		if(tmp > 0) 
			md3_en = 1;
	}
	if(ccci_get_fo_setting("MTK_ENABLE_MD5", &tmp) == 0) {
		if(tmp > 0) 
			md5_en = 1;
	}
	// MTK_MD*_SUPPORT
	if(ccci_get_fo_setting("MTK_MD1_SUPPORT", &tmp) == 0) {
		md_support[MD_SYS1] = tmp;
	}
	if(ccci_get_fo_setting("MTK_MD2_SUPPORT", &tmp) == 0) {
		md_support[MD_SYS2] = tmp;
	}
	if(ccci_get_fo_setting("MTK_MD3_SUPPORT", &tmp) == 0) {
		md_support[MD_SYS3] = tmp;
	}
	if(ccci_get_fo_setting("MTK_MD5_SUPPORT", &tmp) == 0) {
		md_support[MD_SYS5] = tmp;
	}
	// MD*_SIZE
	/*
	 * for legacy CCCI: make share memory start address to be 2MB align, as share 
	 * memory size is 2MB - requested by MD MPU.
	 * for ECCCI: ROM+RAM size will be align to 1M, and share memory is 2K,
	 * 1M alignment is also 2K alignment.
	 */
	if(ccci_get_fo_setting("MD1_SIZE", &tmp) == 0) {
		tmp = round_up(tmp, get_md_smem_align(MD_SYS1));
		md_resv_mem_size[MD_SYS1] = tmp;
	}
	if(ccci_get_fo_setting("MD2_SIZE", &tmp) == 0) {
		tmp = round_up(tmp, get_md_smem_align(MD_SYS2));
		md_resv_mem_size[MD_SYS2] = tmp;
	}
	if(ccci_get_fo_setting("MD3_SIZE", &tmp) == 0) {
		tmp = round_up(tmp, get_md_smem_align(MD_SYS3));
		md_resv_mem_size[MD_SYS3] = tmp;
	}
	// MD*_SMEM_SIZE
	#if 0
	if(ccci_get_fo_setting("MD1_SMEM_SIZE", &tmp) == 0) {
		md_resv_smem_size[MD_SYS1] = tmp;
	}
	#else
	md_resv_smem_size[MD_SYS1] = 2*1024*1024;
	#endif
	#if 0
	if(ccci_get_fo_setting("MD2_SMEM_SIZE", &tmp) == 0) {
		md_resv_smem_size[MD_SYS2] = tmp;
	}
	#else
	md_resv_smem_size[MD_SYS2] = 4*1024*1024;
	#endif
	if(ccci_get_fo_setting("MD3_SMEM_SIZE", &tmp) == 0) {
		md_resv_smem_size[MD_SYS3] = tmp;
	}
	
	// Setting conflict checking
	if(md1_en && (md_resv_smem_size[MD_SYS1]>0) && (md_resv_mem_size[MD_SYS1]>0)) {
		// Setting is OK
	} else if (md1_en && ((md_resv_smem_size[MD_SYS1]<=0) || (md_resv_mem_size[MD_SYS1]<=0))) {
		CCCI_UTIL_ERR_MSG("FO Setting for md1 wrong: <%d:0x%08X:0x%08X>\n", 
				md1_en, md_resv_mem_size[MD_SYS1], md_resv_smem_size[MD_SYS1]);
		md1_en = 0;
		md_resv_smem_size[MD_SYS1] = 0;
		md_resv_mem_size[MD_SYS1] = 0;
	}

	if(md2_en && (md_resv_smem_size[MD_SYS2]>0) && (md_resv_mem_size[MD_SYS2]>0)) {
		// Setting is OK
	} else if (md2_en && ((md_resv_smem_size[MD_SYS2]<=0) || (md_resv_mem_size[MD_SYS2]<=0))) {
		CCCI_UTIL_ERR_MSG("FO Setting for md2 wrong: <%d:0x%08X:0x%08X>\n", 
				md2_en, md_resv_mem_size[MD_SYS2], md_resv_smem_size[MD_SYS2]);
		md2_en = 0;
		md_resv_smem_size[MD_SYS2] = 0;
		md_resv_mem_size[MD_SYS2] = 0;
	}

	if(md3_en && (md_resv_smem_size[MD_SYS3]>0) && (md_resv_mem_size[MD_SYS3]>0)) {
		// Setting is OK
	} else if (md3_en && ((md_resv_smem_size[MD_SYS3]<=0) || (md_resv_mem_size[MD_SYS3]<=0))) {
		CCCI_UTIL_ERR_MSG("FO Setting for md3 wrong: <%d:0x%08X:0x%08X>\n", 
				md3_en, md_resv_mem_size[MD_SYS3], md_resv_smem_size[MD_SYS3]);
		md3_en = 0;
		md_resv_smem_size[MD_SYS2] = 0;
		md_resv_mem_size[MD_SYS2] = 0;
	}

	if(md1_en) {
		md_usage_case |= MD1_EN;
		modem_num++;
	}
	if(md2_en) {
		md_usage_case |= MD2_EN;
		modem_num++;
	}
	if(md3_en) {
		md_usage_case |= MD3_EN;
		modem_num++;
	}
	if(md5_en) {
		md_usage_case |= MD5_EN;
		modem_num++;
	}

	memory_layout_cal(MEM_LAY_OUT_VER);
}