Beispiel #1
0
void print_mark(int p)
{
print_char('{');
if((p<(int)fix_mem_min)||(p> (int)fix_mem_end))
tprint_esc("CLOBBERED.");
else
show_token_list(token_link(p),null,max_print_line-10);
print_char('}');
}
int cvmx_parse_config()
{
	token_list_t *list;
	int start_index=0;
        int rv;
	cvmx_ipd_config_t ipd_config;
	cvmx_dma_config_t dma_config;
	cvmx_tim_config_t timer_config;
	cvmx_dfa_app_config_t dfa_config;
	cvmx_zip_config_t zip_config;
	cvmx_raid_config_t raid_config;
	cvmx_bch_app_config_t bch_config;

	if (cvmx_app_config_str == 0)
		cvmx_dprintf("ERROR: application config string is not set\n");
	if(dbg_parse)
		cvmx_dprintf("Parsing config string.\n");

	list = init_token_list(30, 128);
	cvmx_ipd_get_config(&ipd_config);
	cvmx_dma_get_cmd_que_pool_config(&dma_config.command_queue_pool);
	cvmx_pko_get_cmd_que_pool_config(&pko_fpa_cfg);
	cvmx_tim_get_fpa_pool_config(&timer_config.timer_pool);
	cvmx_dfa_get_fpa_pool_config(&dfa_config.dfa_pool);
	cvmx_zip_get_fpa_pool_config(&zip_config.zip_pool);
	cvmx_raid_get_cmd_que_pool_config(&raid_config.command_queue_pool);
	cvmx_bch_get_cmd_que_pool_config(&bch_config.command_queue_pool);

	while (1) {
		/* Parsing the config string line by line, each call to get_token_list()
		   returns the tokens on the next line */
		start_index = get_token_list(list, cvmx_app_config_str, start_index);
		//show_token_list(list);
		if (list->token_index >= 1) {
			if (SC(TK[0],"pko") == 0)  {
				rv = parse_pko_config_command(list);
				if (rv != 0) {
					cvmx_dprintf("ERROR: in parsing pko commands\n");
					show_token_list(list);
				}
			}
			else if (SC(TK[0],"ipd") == 0) {
				if((rv = parse_ipd_config_command(list, &ipd_config))) {
					cvmx_dprintf("ERROR: in parsing IPD command\n");
					show_token_list(list);
				}
			}
			else if (SC(TK[0],"rgmii") == 0) {
				if((rv = parse_rgmii_config_command(list))) {
					cvmx_dprintf("ERROR: in parsing rgmii command\n");
					show_token_list(list);
				}
			}
			else if (SC(TK[0],"dma") == 0) {
				if((rv = parse_dma_config_command(list, &dma_config ))) {
					cvmx_dprintf("ERROR: in parsing dma command\n");
					show_token_list(list);
				}
			}
			else if (SC(TK[0],"timer") == 0) {
				if((rv = parse_timer_config_command(list, &timer_config ))) {
					cvmx_dprintf("ERROR: in parsing timer command\n");
					show_token_list(list);
				}
			}
			else if (SC(TK[0],"dfa") == 0) {
				if((rv = parse_dfa_config_command(list, &dfa_config ))) {
					cvmx_dprintf("ERROR: in parsing dfa command\n");
					show_token_list(list);
				}
			}
			else if (SC(TK[0],"zip") == 0) {
				if((rv = parse_zip_config_command(list, &zip_config ))) {
					cvmx_dprintf("ERROR: in parsing zip command\n");
					show_token_list(list);
				}
			}
			else if (SC(TK[0], "bch") == 0) {
				if ((rv = parse_bch_config_command(list, &bch_config))) {
					cvmx_dprintf("ERROR: in parsing bch command\n");
					show_token_list(list);
				}
			}
			else if (SC(TK[0],"raid") == 0) {
				if((rv = parse_raid_config_command(list, &raid_config ))) {
					cvmx_dprintf("ERROR: in parsing raid command\n");
					show_token_list(list);
				}
			}
			else if (SC(TK[0],"llm") == 0) {
				if((rv = parse_llm_config_command(list))) {
					cvmx_dprintf("ERROR: in parsing llm command\n");
					show_token_list(list);
				}
			}
			else if (SC(TK[0],"spi") == 0) {
				if((rv = parse_spi_config_command(list))) {
					cvmx_dprintf("ERROR: in parsing spi command\n");
					show_token_list(list);
				}
			}
			else if (SC(TK[0],"ilk") == 0) {
				if((rv = parse_ilk_config_command(list))) {
					cvmx_dprintf("ERROR: in parsing ilk command\n");
					show_token_list(list);
				}
			}
			else if (SC(TK[0],"npi") == 0) {
				if((rv = parse_npi_config_command(list))) {
					cvmx_dprintf("ERROR: in parsing npi command\n");
					show_token_list(list);
				}
			}
			else if (SC(TK[0],"pki") == 0) {
				if(OCTEON_IS_MODEL(OCTEON_CN78XX)) {
					if((rv = parse_pki_config_command(list))) {
						cvmx_dprintf("ERROR: in parsing pki command\n");
						show_token_list(list);
					}
				}
			}
		}
		if (cvmx_app_config_str[start_index] == '\0') {
			cvmx_ipd_set_config(ipd_config);
			cvmx_pko_set_cmd_que_pool_config(pko_fpa_cfg.pool_num,
					pko_fpa_cfg.buffer_size, pko_fpa_cfg.buffer_count);
			cvmx_zip_set_fpa_pool_config(zip_config.zip_pool.pool_num,
					zip_config.zip_pool.buffer_size, zip_config.zip_pool.buffer_count);
			cvmx_tim_set_fpa_pool_config(timer_config.timer_pool.pool_num,
					timer_config.timer_pool.buffer_size, timer_config.timer_pool.buffer_count);
			cvmx_dfa_set_fpa_pool_config(dfa_config.dfa_pool.pool_num,
					dfa_config.dfa_pool.buffer_size, dfa_config.dfa_pool.buffer_count);
			cvmx_dma_set_cmd_que_pool_config(dma_config.command_queue_pool.pool_num,
					dma_config.command_queue_pool.buffer_size, dma_config.command_queue_pool.buffer_count);
			cvmx_raid_set_cmd_que_pool_config(raid_config.command_queue_pool.pool_num,
					raid_config.command_queue_pool.buffer_size, raid_config.command_queue_pool.buffer_count);
			cvmx_bch_set_cmd_que_pool_config(bch_config.command_queue_pool.pool_num,
					bch_config.command_queue_pool.buffer_size,
					bch_config.command_queue_pool.buffer_count);
			break;
		}
		start_index++;
		reset_token_index(list);
	}
	return 0;
}
int parse_interface_name(char *name, int interfaces[], int max_interface_cnt)
{

	token_list_t *list;
	list = init_token_list(30, 128);

	get_interface_name_token_list(list, name);
	//show_token_list(list);
	if (list->token_index < 3 ) {
		cvmx_dprintf("invalid interface name :%s token_cnt=%d \n",
			     name, list->token_index);
		show_token_list(list);
		return -1;
	}

	/* Looking for something like type:n */
	if ( (list->token_index == 3 ) && (SC(TK[1],":") == 0) ) {
		int interface_num = ST(TK[2], 0, 10);
		int type_index = cvmx_get_interface_type_index(TK[0]);

		//cvmx_dprintf("type_index=%d num=%d \n", type_index, interface_num);
		if (type_index < 0) {
			cvmx_dprintf("invalid interface type:%s\n", TK[0]);
			return -1;
		}

		if (interface_num >= cvmx_interface_types[type_index].max_cnt ) {
			cvmx_dprintf("invalid interface index=%d for type=%s\n",
				     interface_num, TK[0]);
			return -1;
		}
		interfaces[0] = cvmx_get_interface_number(type_index, interface_num);
		//cvmx_dprintf("interface=%d \n", interfaces[0]);
		return 1;
	}
	/* Looking for something like type:[n..n] */
	if ( (list->token_index == 8 ) && (SC(TK[2],"[") == 0)  &&
	     (SC(TK[4],".") == 0) && (SC(TK[5],".") == 0) &&
	     (SC(TK[7],"]") == 0) ) {
		int intf_start = ST(TK[3], 0, 10);
		int intf_end   = ST(TK[6], 0, 10);
		int type_index = cvmx_get_interface_type_index(TK[0]);
		int i,j;

		if (type_index < 0) {
			cvmx_dprintf("invalid interface type:%s\n", TK[0]);
			return -1;
		}
		if ((intf_end <= intf_start) || (intf_start < 0) ||
		    intf_end >= cvmx_interface_types[type_index].max_cnt) {
			cvmx_dprintf("invalid interface range %d..%d max=%d\n",
				     intf_start, intf_start,
				     cvmx_interface_types[type_index].max_cnt);
			return -1;
		}
		j=0;
		for(i=intf_start; i<=intf_end; i++) {
			int inum = cvmx_get_interface_number(type_index, i);
			if (inum != -1)
				interfaces[j++] = inum;
		}
		return j;
	}
	//cvmx_dprintf("%s:%d Here... %s %s \n", __FUNCTION__, __LINE__,
	//	     TK[2], TK[list->token_index -1]);
	/* Looking for something like type:[n,*,n] * is repetitions of ,n*/
	if ( (SC(TK[2],"[") == 0) && (SC(TK[list->token_index-1], "]") == 0) ) {
		int type_index = cvmx_get_interface_type_index(TK[0]);
		int i,j;

		//cvmx_dprintf("%s:%d Here..\n", __FUNCTION__, __LINE__);
		if (type_index < 0) {
			cvmx_dprintf("invalid interface type:%s\n", TK[0]);
			return -1;
		}
		for(i=4; i < (list->token_index-1); i+=2) {
			if (SC(TK[i],",") != 0) {
				cvmx_dprintf("invalid seperator i=%d\n",i);
				return -1;
			}
		}
		j = 0;
		for(i=3; i < (list->token_index-1); i++) {
			int num = ST(TK[i], 0, 10);
			int inum;

			if (num >  cvmx_interface_types[type_index].max_cnt) {
				cvmx_dprintf("invalid index %d for type=%s\n", num,
					     cvmx_interface_types[type_index].name);
			}
			inum = cvmx_get_interface_number(type_index, i);
			if (inum != -1)
				interfaces[j++] = inum;
			if (j >= max_interface_cnt) {
				cvmx_dprintf("too many interface numbers=%d\n", j);
				return -1;
			}
		}
		return j;
	}
	return -1;

}
int parse_pko_config_command(token_list_t *list)
{
	int intf_index = -1;
	int queue_cnt = -1;
	int port_cnt = -1;
	int tok_offset = 0;
	int interfaces[CVMX_HELPER_MAX_IFACE];
	int intf_cnt, i;

	if (SC(TK[1],"command_queue") == 0)
		return (parse_fpa_config_command(list, &pko_fpa_cfg, "pko command queue pool"));
	if  ( (SC(TK[0],"pko") != 0) || (SC(TK[1],"interface") != 0) ||
	      (SC(TK[2],"=") != 0) || (list->token_index < 9) ) {
		cvmx_dprintf("ERROR: invalid pko command :");
		return -1;
		//show_token_list(list);
	}
	intf_cnt = parse_interface_name(TK[3], interfaces,
					CVMX_HELPER_MAX_IFACE);

	if (intf_cnt < 0) {
		cvmx_dprintf("ERROR: invalid interface name = %s \n", TK[3]);
		return -1;
	}

	if (SC(TK[4],"interface_index") == 0)
	{
		if (intf_cnt != 1) {
			cvmx_dprintf("ERROR: cannot specify interface_index"
				     " when using wild card for specifying"
				     " interface name\n");
			return -1;
		}
		if (SC(TK[5],"=") != 0) {
			cvmx_dprintf("ERROR: invalid pko config command : no "
				     "equal sign after interface_index \n");
			return -1;
		}
		tok_offset = 3;
		intf_index = ST(TK[6], 0, 10);
		if ((intf_index >= CVMX_HELPER_CFG_MAX_PORT_PER_IFACE) ||
			(intf_index < 0)) {
			cvmx_dprintf("ERROR: invalid intf_index=%d max=%d\n",
				     intf_index,
				     CVMX_HELPER_CFG_MAX_PORT_PER_IFACE-1);
			return -1;
		}
	}

	if ( (SC(TK[tok_offset + 4],"internal_port_cnt") != 0) ||
	     (SC(TK[tok_offset + 5],"=") != 0) ) {
		cvmx_dprintf("ERROR: invalid pko config command  while looking"
			     "for internal_port_cnt \n");
		return -1;
	}
	if ( (SC(TK[tok_offset+7],"queues_per_internal_port") != 0) ||
	     (SC(TK[tok_offset+8],"=") != 0) )  {
		cvmx_dprintf("ERROR: invalid pko config command while looking"
			     "for queues_per_internal_port\n");
		return -1;
	}
#define PKO_CFG __cvmx_pko_config

	port_cnt = (int) ST(TK[tok_offset+6], 0, 10);
	queue_cnt  = (int) ST(TK[tok_offset+9], 0, 10);

	for(i=0; i<intf_cnt; i++) {
		int intf_num = interfaces[i];
		if (intf_num == -1)
			continue;
		if ( (is_interface_disabled(intf_num) == 1)  && dbg_parse) {
			cvmx_dprintf("skipping config interace_num=%d :",
				     intf_num);
			show_token_list(list);
		}
		if (intf_index != -1) {
			//cvmx_dprintf("%d:%d %d %d \n", intf_num, intf_index, port_cnt, queue_cnt);
			PKO_CFG[intf_num][intf_index].internal_port_cnt = port_cnt;
			PKO_CFG[intf_num][intf_index].queues_per_internal_port = queue_cnt;
		} else {
			int index;
			int port_max = __cvmx_helper_early_ports_on_interface(intf_num);
			for(index=0; index<port_max; index++) {
				PKO_CFG[intf_num][index].internal_port_cnt = port_cnt;
				PKO_CFG[intf_num][index].queues_per_internal_port = queue_cnt;
			}
		}
		if(dbg_parse)
			cvmx_dprintf("interface=%d interface_index=%d queue_cnt"
				     "=%d port_cnt=%d\n", intf_num, intf_index,
				     queue_cnt, port_cnt);
	}
#undef PKO_CFG
	return 0;
}
Beispiel #5
0
void tex::print_mark(ptr p)
	{
	print("{");
	show_token_list(token_link(p), null, MAX_PRINT_LINE - 10);
	print("}");
	}