Пример #1
0
ULONG findMem(APTR ofw, ULONG orig_MSR)
{
    ULONG volatile *mem=(APTR)(16*1024*1024);
    ULONG msr;
    int i;

    ULONG dev_handle, res, size;
    ULONG mem_info[2];
    
    asm volatile("mfmsr %0":"=r"(msr));

    while(ofw && ((ULONG)ofw < 0x10000000))
    {
	asm volatile("mtmsr %0"::"r"(orig_MSR));
	of_init(ofw);

	res = of_finddevice("/memory@0", &dev_handle);

	if (res)
		break;

	res = of_getprop(dev_handle, "reg", mem_info, sizeof(mem_info), &size);
	if (res) break;

	mem = (ULONG *)mem_info[1];

	break;
    }

    asm volatile("mtmsr %0"::"r"(msr));
    return (ULONG)mem;
}
Пример #2
0
extern "C" void
start(void *openFirmwareEntry)
{
	char bootargs[512];

	// stage2 args - might be set via the command line one day
	stage2_args args;
	args.heap_size = HEAP_SIZE;
	args.arguments = NULL;

	of_init((int (*)(void*))openFirmwareEntry);

	// check for arguments
	if (of_getprop(gChosen, "bootargs", bootargs, sizeof(bootargs))
			!= OF_FAILED) {
		static const char *sArgs[] = { NULL, NULL };
		sArgs[0] = (const char *)bootargs;
		args.arguments = sArgs;
		args.arguments_count = 1;
	}

	determine_machine();
	console_init();

	if ((gMachine & MACHINE_QEMU) != 0)
		dprintf("OpenBIOS (QEMU?) OpenFirmware machine detected\n");
	else if ((gMachine & MACHINE_PEGASOS) != 0)
		dprintf("Pegasos PowerPC machine detected\n");
	else
		dprintf("Apple PowerPC machine assumed\n");

	// Initialize and take over MMU and set the OpenFirmware callbacks - it
	// will ask us for memory after that instead of maintaining it itself
	// (the kernel will need to adjust the callback later on as well)
	arch_mmu_init();

	if (boot_arch_cpu_init() != B_OK)
		of_exit();

	if (init_real_time_clock() != B_OK)
		of_exit();

	// check for key presses once
	sBootOptions = 0;
	int key = console_check_for_key();
	if (key == 32) {
		// space bar: option menu
		sBootOptions |= BOOT_OPTION_MENU;
	} else if (key == 27) {
		// ESC: debug output
		sBootOptions |= BOOT_OPTION_DEBUG_OUTPUT;
	}

	gKernelArgs.platform_args.openfirmware_entry = openFirmwareEntry;

	main(&args);
		// if everything goes fine, main() never returns

	of_exit();
}
Пример #3
0
int
kbd_get_lmuaddr(void)
{
  struct device_node *node;
  int plen;
  unsigned long *reg = NULL;

  of_init();

  node = of_find_node_by_type("lmu-controller", 0);
  if (node == NULL)
    {
      node = of_find_node_by_name("lmu-controller", 0);
      if (node == NULL)
	{
	  logmsg(LOG_ERR, "Error: no lmu-controller found in device-tree");

	  return -1;
	}
    }

  reg = of_find_property(node, "reg", &plen);
  lmu_info.lmuaddr = (unsigned int) (*reg >> 1);

  free(reg);
  of_free_node(node);

  logdebug("Found LMU controller at address 0x%x\n", lmu_info.lmuaddr);

  return 0;
}
Пример #4
0
int ips_module_init(const char* log_cat)
{
    int i;
    int ret;

    if (ips_zc) {
        fprintf(stderr, "%s: already initialized!\n", __func__);
        return(SPKERR_BADSEQ);
    }
    ips_zc = zlog_get_category(log_cat?log_cat:"IPS");
    if (!ips_zc) {
        fprintf(stderr, "%s: failed to initialize log system!\n", __func__);
//        return(SPKERR_LOGSYS);
    }

    assert(!ips_sriodev);

    for (i = 0; i < IPS_MAX_PORTS_IN_DEV; i++) {
        ips_epctx_tbl[i] = NULL;
    }

    pthread_mutex_init(&ips_dma_ch_lock, NULL);
    pthread_mutex_init(&ips_zlog_lock, NULL);

    of_init();
    ret = fsl_srio_uio_init(&ips_sriodev);
    IPS_LOGINFO(IPS_EPID_UNKNOWN, "fsl_srio_uio_init: ret=%d", ret);
    if (ret) {
        return(SPKERR_EAGAIN);
    }

    zlog_notice(ips_zc, "module initialized.");

    return(SPK_SUCCESS);
}
Пример #5
0
void of_entry(uintptr_t initrd_start, uintptr_t initrd_size, void *entry)
{
	uintptr_t *treestart = treebuf;

	firmware_entry = entry;

	of_init(entry);

	of_puts( "\r\n[==== Kenge PowerPC64 OpenFirmware elf-loader ====]\r\n" );

	/* Align device tree on a page boundary */
	if ((uintptr_t)treestart & 0xfff)
		treestart = (uintptr_t *)(((uintptr_t)treestart + 0xfff) & (~0xffful));

	of_tree_init( &device_tree, treestart );

	tree_size = of_populate_device_tree( &device_tree );
}
Пример #6
0
void platform_init(unsigned long a1, unsigned long a2, void *promptr)
{
	platform_ops.image_hdr = of_image_hdr;
	platform_ops.malloc = of_try_claim;
	platform_ops.exit = of_exit;
	platform_ops.vmlinux_alloc = of_vmlinux_alloc;

	dt_ops.finddevice = of_finddevice;
	dt_ops.getprop = of_getprop;
	dt_ops.setprop = of_setprop;

	of_console_init();

	of_init(promptr);
	loader_info.promptr = promptr;
	if (a1 && a2 && a2 != 0xdeadbeef) {
		loader_info.initrd_addr = a1;
		loader_info.initrd_size = a2;
	}
}
Пример #7
0
int main(int argc, char *argv[])
{
    struct srio_dev *sriodev;
    struct dma_ch *send_dmadev[SEND_THREAD_NUM];
    struct dma_ch *receive_dmadev[RECEIVE_THREAD_NUM];
    struct dma_pool *dmapool = NULL;
    int i, err;
    int maxworkers=2;
    struct srio_port_data *port_data;
    uint32_t attr_read, attr_write;
    struct task_arg_type task_arg_send[SEND_THREAD_NUM];
    struct task_arg_type task_arg_receive[RECEIVE_THREAD_NUM];
    pthread_t send_id[SEND_THREAD_NUM];
    pthread_t receive_id[RECEIVE_THREAD_NUM];
    of_init();
    err = fsl_srio_uio_init(&sriodev);
    if (err < 0)
        error(EXIT_FAILURE, -err, "%s(): srio_uio_init()", __func__);

    port_num = fsl_srio_get_port_num(sriodev);

    memset(&cmd_param, 0, sizeof(cmd_param));
    /*ctx add*/
    cmd_param.curr_port_id=0;
    cmd_param.test_type=0;
    cmd_param.test_srio_type=0;
    cmd_param.time=60;
    cmd_param.passes=1000;
    cmd_param.bind=0;
    cmd_param.workers=2;
    cmd_param.interval=1;
    err = cmd_translate(argc, argv,&cmd_param);
    if(err==2)
    {
        return 0;
    }
    if (err < 0)
    {
        return -1;
    }

    if(cmd_param.workers!=maxworkers)
    {
        printf("workers error!\n");
        fflush(stdout);
        return -1;
    }
    port_data = malloc(sizeof(struct srio_port_data) * port_num);
    if (!port_data) {
        error(0, errno, "%s(): port_data", __func__);
        goto err_cmd_malloc;
    }

    for (i = 0; i < port_num; i++) {
        fsl_srio_connection(sriodev, i);
        fsl_srio_get_port_info(sriodev, i + 1, &port_data[i].port_info,
                               &port_data[i].range_virt);
    }

    err = fsl_srio_port_connected(sriodev);
    if (err <= 0) {
        error(0, -err, "%s(): fsl_srio_port_connected", __func__);
        goto err_srio_connected;
    }
    uint8_t flag=0;
    if(cmd_param.test_type==1)
    {
        for (i = 0; i < port_num; i++) {
            if(srio_link(sriodev,i))
            {
                printf("port %d sucess!\n",i);
                //                         fsl_srio_drain_enable(sriodev,i);
                fflush(stdout);
            }
            else
            {
                printf("port %d failed!\n",i);
                fflush(stdout);
                flag++;
            }
        }
        if(flag != 0)
            return -1;
        return 0;
    }
    err = dma_pool_init(&dmapool);
    uint8_t port = cmd_param.curr_port_id;
    attr_read = srio_test_win_attrv[3];
    attr_write = srio_test_win_attrv[cmd_param.test_srio_type];

    for (i = 0; i < port_num; i++) {
        dma_addr_t port_phys_base =
            dmapool->dma_phys_base + SRIO_POOL_PORT_OFFSET * i;
        port_data[i].phys.write_recv_data = port_phys_base;
        port_data[i].phys.read_recv_data =
            port_phys_base + SRIO_POOL_SECT_SIZE;
        port_data[i].phys.write_data_prep =
            port_phys_base + SRIO_POOL_SECT_SIZE * 2;
        port_data[i].phys.res =
            port_phys_base + SRIO_POOL_SECT_SIZE * 3;

        port_data[i].virt = (typeof(port_data[i].virt))
                            (dmapool->dma_virt_base + i * SRIO_POOL_PORT_OFFSET);
        fsl_srio_set_ibwin(sriodev, i, 1,
                           port_data[i].phys.write_recv_data,
                           SRIO_SYS_ADDR, LAWAR_SIZE_16M);
        if (fsl_srio_port_connected(sriodev) & (0x1 << i)) {
            fsl_srio_set_obwin(sriodev, i, 1,
                               port_data[i].port_info.range_start,
                               SRIO_SYS_ADDR, LAWAR_SIZE_16M);
            fsl_srio_set_obwin_attr(sriodev, i, 1,
                                    attr_read, attr_write);
        } else {
            printf("SRIO port %d error!\n", i + 1);
            fflush(stdout);
            return -errno;
        }
        fsl_srio_set_err_rate_degraded_threshold(sriodev,i,0);
        fsl_srio_set_err_rate_failed_threshold(sriodev,i,0);
        //   fsl_srio_irq_enable(sriodev);
        // fsl_srio_irq_disable(sriodev);
        fsl_srio_set_phy_retry_threshold(sriodev,i,0,1);
        memset(port_data[i].virt,0,SRIO_POOL_PORT_OFFSET);
        printf("phy base:%08x virt base:%08x\n",port_phys_base,port_data[i].virt);
    }
    err = fsl_srio_set_targetid(sriodev,0,1,0x11);
    if(err!=0)
    {
        printf("sro set targetid  failed!\n");
        fflush(stdout);
    }
    err = fsl_srio_set_targetid(sriodev,1,1,0x14);
    if(err!=0)
    {
        printf("sro set targetid  failed!\n");
        fflush(stdout);
    }
    err = fsl_srio_set_deviceid(sriodev,0,0x11);
    if(err!=0)
    {
        printf("sro set deviceid  failed!\n");
        fflush(stdout);
    }
    err = fsl_srio_set_deviceid(sriodev,1,0x14);
    if(err!=0)
    {
        printf("sro set deviceid  failed!\n");
        fflush(stdout);
    }
    /*ctx add*/
    sleep(5);

    for(i=0; i<2; i++)
    {

        err = fsl_dma_chan_init(&send_dmadev[i], i, 1);
        if (err < 0) {
            error(0, -err, "%s(): fsl_dma_chan_init()", __func__);
            goto err_srio_connected;
        }

        fsl_dma_chan_basic_direct_init(send_dmadev[i]);
        fsl_dma_chan_bwc(send_dmadev[i], DMA_BWC_1024);
        task_arg_send[i].dmadev = send_dmadev[i];

        /* ctx add*/
        task_arg_send[i].port_data_thread.phys.write_recv_data=port_data[i].phys.write_recv_data+THREAD_WIN_SIZE*1;
        task_arg_send[i].port_data_thread.phys.read_recv_data=port_data[i].phys.read_recv_data+THREAD_WIN_SIZE*0;
        task_arg_send[i].port_data_thread.phys.write_data_prep=port_data[i].phys.write_data_prep+THREAD_WIN_SIZE*0;
        task_arg_send[i].port_data_thread.phys.res=port_data[i].phys.res+THREAD_WIN_SIZE*0;
        task_arg_send[i].port_data_thread.virt.write_recv_data = &port_data[i].virt->write_recv_data_t[1][0];
        task_arg_send[i].port_data_thread.virt.read_recv_data = &port_data[i].virt->read_recv_data_t[0][0];
        task_arg_send[i].port_data_thread.virt.write_data_prep = &port_data[i].virt->write_data_prep_t[0][0];
        task_arg_send[i].port_data_thread.virt.res = &port_data[i].virt->res_t[0][0];
        task_arg_send[i].port_data_thread.port_info.range_start = port_data[i].port_info.range_start+THREAD_WIN_SIZE*0;
        /* cta end*/
        task_arg_send[i].port = i;
        task_arg_send[i].sriodev = sriodev;
        task_arg_send[i].srio_type = cmd_param.test_srio_type;
        task_arg_send[i].bind=cmd_param.bind;
        task_arg_send[i].time=cmd_param.time;
        task_arg_send[i].passes = cmd_param.passes;/*bind cpu*/

        if(cmd_param.test_type==2)
        {
            task_arg_send[i].test_type=0;
        }
        else if(cmd_param.test_type==3)
        {
            task_arg_send[i].test_type=1;

        }
        err = pthread_create(&send_id[i], NULL,t_srio_send, &task_arg_send[i]);
        if (err) {
            printf("Port %d : Send thread failed!\n",port + 1);
            fflush(stdout);
            return -errno;
        }

    }
    sleep(2);

    for(i=0; i<2; i++)
    {
        err = fsl_dma_chan_init(&receive_dmadev[i], i, 3);
        if (err < 0) {
            error(0, -err, "%s(): fsl_dma_chan_init()", __func__);
            goto err_srio_connected;
        }

        fsl_dma_chan_basic_direct_init(receive_dmadev[i]);
        fsl_dma_chan_bwc(receive_dmadev[i], DMA_BWC_1024);
        task_arg_receive[i].dmadev = receive_dmadev[i];

        task_arg_receive[i].port_data_thread.phys.write_recv_data=port_data[i].phys.write_recv_data+THREAD_WIN_SIZE*0;
        task_arg_receive[i].port_data_thread.phys.read_recv_data=port_data[i].phys.read_recv_data+THREAD_WIN_SIZE*1;
        task_arg_receive[i].port_data_thread.phys.write_data_prep=port_data[i].phys.write_data_prep+THREAD_WIN_SIZE*1;
        task_arg_receive[i].port_data_thread.phys.res=port_data[i].phys.res+THREAD_WIN_SIZE*1;
        task_arg_receive[i].port_data_thread.virt.write_recv_data = &port_data[i].virt->write_recv_data_t[0][0];
        task_arg_receive[i].port_data_thread.virt.read_recv_data = &port_data[i].virt->read_recv_data_t[1][0];
        task_arg_receive[i].port_data_thread.virt.write_data_prep = &port_data[i].virt->write_data_prep_t[1][0];
        task_arg_receive[i].port_data_thread.virt.res = &port_data[i].virt->res_t[1][0];
        task_arg_receive[i].port_data_thread.port_info.range_start = port_data[i].port_info.range_start+THREAD_WIN_SIZE*1;
        /* cta end*/
        task_arg_receive[i].port = i;
        task_arg_receive[i].sriodev = sriodev;
        task_arg_receive[i].srio_type = cmd_param.test_srio_type;
        task_arg_receive[i].bind=cmd_param.bind;/*bind cpu*/
        task_arg_receive[i].time=cmd_param.time;/*bind cpu*/
        task_arg_receive[i].passes = cmd_param.passes;/*bind cpu*/

        if(cmd_param.test_type==2)
        {
            err = pthread_create(&receive_id[i], NULL,t_srio_receive, &task_arg_receive[i]);
            if (err) {
                printf("Port %d : Send thread failed!\n",port + 1);
                fflush(stdout);
                return -errno;
            }
        }
    }
    for(i=0; i<2; i++)
    {
        if(cmd_param.test_type==2)
        {
            pthread_join(send_id[i],NULL);
            pthread_join(receive_id[i],NULL);
        } else if(cmd_param.test_type==3)
        {
            pthread_join(send_id[i],NULL);
        }
    }
    /*ctx end*/

    free(port_data);
    for(i=0; i<2; i++)
    {
        fsl_dma_chan_finish(send_dmadev[i]);
        fsl_dma_chan_finish(receive_dmadev[i]);
    }
    dma_pool_finish(dmapool);
    fsl_srio_uio_finish(sriodev);

    of_finish();
    return EXIT_SUCCESS;

err_srio_connected:
    free(port_data);
err_cmd_malloc:
    fsl_srio_uio_finish(sriodev);
    of_finish();

    return err;
}
Пример #8
0
TITLE_RESULT show_title(game_display& screen, config& tips_of_day)
{
	disableTerrainCache();
	
	free_all_caches();
	
	cursor::set(cursor::NORMAL);

	const preferences::display_manager disp_manager(&screen);
	const hotkey::basic_handler key_handler(&screen);

	const font::floating_label_context label_manager;

	screen.video().modeChanged(); // resets modeChanged value

//	if (background_is_dirty_) 
	{
		draw_background(screen);
	}

	//- Texts for the menu-buttons.
	//- Members of this array must correspond to the enumeration TITLE_RESULT
	static const char* button_labels[] = {
					       //N_("TitleScreen button^Tutorial"),
					       N_("TitleScreen button^Campaign"),
#ifndef FREE_VERSION		
							N_("TitleScreen button^Skirmish"),
					       N_("TitleScreen button^Multiplayer"),
#endif
					       N_("TitleScreen button^Load"),
//					       N_("TitleScreen button^Add-ons"),
//#ifndef DISABLE_EDITOR2
					       //N_("TitleScreen button^Map Editor"),
//#endif
					       //N_("TitleScreen button^Language"),
					       N_("TitleScreen button^Preferences"),
							N_("Sync Saves"),
#ifndef DISABLE_OPENFEINT
							N_("TitleScreen button^OpenFeint"),
#endif
					       N_("TitleScreen button^Help"),
					       //N_("TitleScreen button^Quit"),
								// Only the above buttons go into the menu-frame
								// Next 2 buttons go into frame for the tip-of-the-day:
					       N_("TitleScreen button^Previous"),
					       N_("TitleScreen button^Next"),
					       //N_("TitleScreen button^Help"),
								// Next entry is no button, but shown as a mail-icon instead:
					       //N_("TitleScreen button^Help Wesnoth") 
							};
	//- Texts for the tooltips of the menu-buttons
	static const char* help_button_labels[] = { 
							//N_("Start a tutorial to familiarize yourself with the game"),
						    N_("Start a new single player campaign"),
#ifndef FREE_VERSION
							N_("Play a single scenario against the AI"),
						    N_("Play multiplayer (hotseat or Internet)"),
#endif
						    N_("Load a saved game"),
//						    N_("Download usermade campaigns, eras, or map packs"),
//#ifndef DISABLE_EDITOR2
						    //N_("Start the map editor"),
//#endif
						    //N_("Change the language"),
						    N_("Configure the game's settings"),
							N_("Sync saved games"),
#ifndef DISABLE_OPENFEINT
							N_("Launch the OpenFeint dashboard"),
#endif

							N_("Show Battle for Wesnoth help"),
							//N_("Quit the game"),
						    N_("Show next tip of the day"),
						    //N_("Upload statistics") 
							};

	//static const size_t nbuttons = sizeof(button_labels)/sizeof(*button_labels);
#ifdef FREE_VERSION	
	int nbuttons = 10;
#else
	int nbuttons = 8;
#endif
	
#ifdef DISABLE_OPENFEINT
	nbuttons--;
#endif
	
#ifndef __IPAD__
	nbuttons--;	// because help is off to the left now
#endif
	
	int menu_xbase = CVideo::getx()-108-10; //380; //(game_config::title_buttons_x*screen.w())/1024;
	const int menu_xincr = 0;

#ifdef USE_TINY_GUI
	//const int menu_ybase = 15; //(330*screen.h())/768 - 50; //15;
	const int menu_yincr = 36+5; //(35*3)/4;//15;
	const int menu_ybase = (screen.h() - (36+5)*nbuttons - 5) / 2 + 4;
#else
	const int menu_ybase = (screen.h() - (36+5)*nbuttons - 5) / 2 + 4;
	const int menu_yincr = 36+5;
#endif
	
#ifdef __IPAD__
	menu_xbase -= 10;
#endif

	const int padding = 4; //game_config::title_buttons_padding;

	std::vector<button> buttons;
	size_t b, max_width = 0;
	size_t n_menubuttons = 0;
	for(b = 0; b != nbuttons; ++b) 
	{
//#ifdef __IPHONEOS__		
//		if (b + TUTORIAL == TUTORIAL || b + TUTORIAL == START_MAP_EDITOR || b+TUTORIAL == CHANGE_LANGUAGE)
//			continue;
//#endif		
		buttons.push_back(button(screen.video(),sgettext(button_labels[b])));
		buttons.back().set_help_string(sgettext(help_button_labels[b]));
		max_width = std::max<size_t>(max_width,buttons.back().width());

		n_menubuttons = b;
#ifdef __IPAD__
		if(b + NEW_CAMPAIGN == SHOW_HELP) break;
#else
		if(b + NEW_CAMPAIGN == SHOW_OPENFEINT) break;		
#endif
	}

	SDL_Rect main_dialog_area = {menu_xbase-padding, menu_ybase-padding, max_width+padding*2,
								 menu_yincr*(n_menubuttons)+buttons.back().height()+padding*2};

	gui::dialog_frame main_frame(screen.video(), "", gui::dialog_frame::titlescreen_style, false);
	main_frame.layout(main_dialog_area);

	// we only redraw transparent parts when asked,
	// to prevent alpha growing
	if (background_is_dirty_) {
		main_frame.draw_background();
		main_frame.draw_border();
	}

	int i=0;
	for(b = 0; b != nbuttons; ++b) 
	{
//#ifdef __IPHONEOS__		
//		if (b + TUTORIAL == TUTORIAL || b + TUTORIAL == START_MAP_EDITOR || b+TUTORIAL == CHANGE_LANGUAGE)
//			continue;
//#endif		
		buttons[i].set_width(max_width);
		buttons[i].set_location(menu_xbase + i*menu_xincr, menu_ybase + i*menu_yincr);
#ifdef __IPAD__
		if(b + NEW_CAMPAIGN == SHOW_HELP) break;
#else
		if(b + NEW_CAMPAIGN == SHOW_OPENFEINT) break;		
#endif
		i++;
	}
	
#ifndef __IPAD__
	buttons.push_back(button(screen.video(),sgettext(button_labels[i+1])));
	buttons.back().set_help_string(sgettext(help_button_labels[i+1]));
	buttons[i+1].set_width(max_width);
	buttons[i+1].set_location(5, 320-menu_yincr);	
#endif

//	b = TIP_PREVIOUS - NEW_CAMPAIGN;
//	gui::button previous_tip_button(screen.video(),sgettext(button_labels[b]),button::TYPE_PRESS,"lite_small");
//	previous_tip_button.set_help_string( sgettext(button_labels[b] ));

//	b = TIP_NEXT - NEW_CAMPAIGN;
//	gui::button next_tip_button(screen.video(),sgettext(button_labels[b]),button::TYPE_PRESS,"lite_small");
//	next_tip_button.set_help_string( sgettext(button_labels[b] ));

//	b = SHOW_HELP - NEW_CAMPAIGN;
//	gui::button help_tip_button(screen.video(),sgettext(button_labels[b]),button::TYPE_PRESS,"lite_small");
//	help_tip_button.set_help_string( sgettext(button_labels[b] ));

//	gui::button beg_button(screen.video(),_("Help Wesnoth"),button::TYPE_IMAGE,"menu-button",button::MINIMUM_SPACE);
//	beg_button.set_help_string(_("Help Wesnoth by sending us information"));

//	next_tip_of_day(tips_of_day);

//	surface_restorer tip_of_day_restorer;

//	draw_tip_of_day(screen, tips_of_day, gui::dialog_frame::titlescreen_style,
//					&previous_tip_button, &next_tip_button, NULL/*&help_tip_button*/, &main_dialog_area, tip_of_day_restorer);

//	const int pad = game_config::title_tip_padding;
//	beg_button.set_location(screen.w() - pad - beg_button.location().w,
//		screen.h() - pad - beg_button.location().h);
	events::raise_draw_event();

	LOG_DP << "drew buttons dialog\n";
	
	
	// draw logo over everything
#ifdef __IPAD__	
	std::string path = game_config::path + "/data/core/images/misc/logo.png";
#else
	std::string path = game_config::path + "/data/core/images/misc/logo_small.png";
#endif	
	surface logo_surface = IMG_Load(path.c_str());
	//blit_surface(480-logo_surface.get()->w, 0, logo_surface);
	
	

	CKey key;

	size_t keyboard_button = nbuttons;
	bool key_processed = false;

//	update_whole_screen();
	background_is_dirty_ = false;

	titlescreen_handler ts_handler(key[SDLK_ESCAPE] != 0); //!= 0 to avoid a MSVC warning C4800

	LOG_DP << "entering interactive loop...\n";
	
	
	memory_stats("At titlescreen");
	
	// Initialize OpenFeint now
	of_init();

	
	for(;;) {
		events::pump();
		for(size_t b = 0; b != buttons.size(); ++b) {
			if(buttons[b].pressed()) {
				free_title();
				return static_cast<TITLE_RESULT>(b + NEW_CAMPAIGN);
			}
		}

/*		if(previous_tip_button.pressed()) {
			next_tip_of_day(tips_of_day, true);
			draw_tip_of_day(screen, tips_of_day, gui::dialog_frame::titlescreen_style,
						&previous_tip_button, &next_tip_button, &help_tip_button, &main_dialog_area, tip_of_day_restorer);
		}
		if(next_tip_button.pressed()) {
			next_tip_of_day(tips_of_day, false);
			draw_tip_of_day(screen, tips_of_day, gui::dialog_frame::titlescreen_style,
						&previous_tip_button, &next_tip_button, &help_tip_button, &main_dialog_area, tip_of_day_restorer);
		}
*/
//		if(help_tip_button.pressed()) {
//			return SHOW_HELP;
//		}
//		if(beg_button.pressed()) {
//			return BEG_FOR_UPLOAD;
//		}
		if (key[SDLK_UP]) {
			if (!key_processed) {
				buttons[keyboard_button].set_active(false);
				if (keyboard_button == 0) {
					keyboard_button = nbuttons - 1;
				} else {
					keyboard_button--;
				}
				key_processed = true;
				buttons[keyboard_button].set_active(true);
			}
		} else if (key[SDLK_DOWN]) {
			if (!key_processed) {
				buttons[keyboard_button].set_active(false);
				if (keyboard_button > nbuttons - 1) {
					keyboard_button = 0;
				} else {
					keyboard_button++;
				}
				key_processed = true;
				buttons[keyboard_button].set_active(true);
			}
		} else {
			key_processed = false;
		}

		events::raise_process_event();
		
		
		// KP: redraw
		draw_background(screen);
		main_frame.draw_background();
		main_frame.draw_border();
		events::raise_draw_event();
		//blit_surface(480-logo_surface.get()->w, 0, logo_surface);
#ifdef __IPAD__
		blit_surface(-10, 0, logo_surface);
#else
		blit_surface(-15, -10, logo_surface);
#endif
		
		screen.flip();

//		if (key[SDLK_ESCAPE] && !ts_handler.get_esc_ignore())
//			return QUIT_GAME;
		if (key[SDLK_F5])
			return RELOAD_GAME_DATA;

		if (key[SDLK_RETURN] && keyboard_button < nbuttons) {
			return static_cast<TITLE_RESULT>(keyboard_button + NEW_CAMPAIGN);
		}



		// If the resolution has changed due to the user resizing the screen,
		// or from changing between windowed and fullscreen:
		if(screen.video().modeChanged()) {
			return REDRAW_BACKGROUND;
		}
		
		screen.delay(10);
	}

	free_title();
	return REDRAW_BACKGROUND;
}
Пример #9
0
int fvl_srio_init(fvl_srio_init_param_t *srio_param)
{
    fvl_srio_context_t  *psrio = &g_srio_context;
    fvl_srio_portpool_t *ppool;
    fvl_srio_ctrlblk_t *pscb,*cscb,*re_cscb;
    uint32_t chan_num=srio_param->chan_num;
    uint32_t buf_num=srio_param->buf_num;
    uint32_t buf_size=srio_param->buf_size;
    uint32_t chan_size=srio_param->chan_size;
    uint32_t ctl_size= FVL_CTL_WIN_SIZE;
    uint32_t port_num=srio_param->port_num;
    fvl_dma_pool_t *port_dma_wr = srio_param->port_rd_buf;
    fvl_dma_pool_t *port_dma_ctl_wp;
    fvl_dma_pool_t *port_dma_ctl_wr;

    uint32_t win_size=chan_size*chan_num;
    uint32_t ctl_win_size=0x1000;//ctl_size*chan_num;
    uint32_t win_law=0,ctl_law=0;
    struct srio_dev *sriodev;
    int rvl;

    if((port_num >= FVL_SRIO_PORT_NUM) || (port_num <0))
    {
        FVL_LOG("port number error:%d\n",port_num);
        return -1;
    }
    if((chan_num > FVL_PORT_CHAN_NUM_MAX) || ( chan_num<0))
    {
        FVL_LOG("channel number error:%d\n",chan_num);
        return -1;
    }
    
    if(!init_flag)    
    {
        of_init();
        rvl = fsl_srio_uio_init(&sriodev);
        if (rvl < 0) 
        {
            FVL_LOG("%s(): fsl_srio_uio_init return %d\n", __func__, rvl);
            return rvl;
        }
        psrio->sriodev=sriodev;
        init_flag=1;
    }
    else
    {
        sriodev=psrio->sriodev;
    }

//mode slave	
    head_port[port_num].re_flag=1;
    head_port[port_num].uflag=0;
    int i=0;
    int j=FVL_PORT_CHAN_NUM_MAX*port_num;
    FVL_LOG("Slave: chan_num %d\n",chan_num);
    for(i=0;i<chan_num;i++)
    {
        head_channel[j+i].re_flag=1;
        head_channel[j+i].uflag=0;
    }
    
    psrio->chan_num[port_num]=chan_num;

    struct srio_port_info *pinfo;
    void *range;
    pinfo = &psrio->portpool[port_num].port_info;
    fsl_srio_connection(sriodev,port_num);
    if (fsl_srio_port_connected(sriodev) & (0x1 << port_num)) 
    {
        fsl_srio_get_port_info(sriodev, port_num+1, pinfo, &range);
        psrio->portpool[port_num].range_virt = range;
        FVL_LOG("Get port %u info, range=%p, range_start=%llx ,range_size=%llx\n", port_num, range, pinfo->range_start,pinfo->range_size);
    } 
    else 
    {
        FVL_LOG("%s(): fsl_srio_connection port %d failed\n", __func__, port_num+1);
        return -1;
    }    
    rvl = fsl_srio_port_connected(sriodev);
    if (rvl <= 0) 
    {
        FVL_LOG("%s(): fsl_srio_port_connected return %d\n", __func__, rvl);
        return -1;
    }

    FVL_LOG("*****************************************************\n");    
    rvl = dma_pool_init(&port_dma_ctl_wp,ctl_win_size,ctl_win_size/2);
    if(rvl!=0)
    {
        FVL_LOG("port %d dma_pool_init failed!\n",port_num+1);
        return -errno;
    }
    rvl = dma_pool_init(&port_dma_ctl_wr,ctl_win_size,ctl_win_size/2);
    if(rvl!=0)
    {
        FVL_LOG("port %d dma_pool_init failed!\n",port_num+1);
        return -errno;
    }
    FVL_LOG("*********************dma pool init end**************\n");    
    uint32_t attr_read, attr_write;
    attr_read = srio_test_win_attrv[3];
    attr_write = srio_test_win_attrv[0];
    FVL_LOG("attr_write = %u, srio_type = 0\n", attr_write);
        
    ppool = &psrio->portpool[port_num];
    ppool->write_result = port_dma_wr->dma_phys_base;
    ppool->pwrite_result = port_dma_wr->dma_virt_base;

    ppool->write_ctl_result = port_dma_ctl_wr->dma_phys_base;
    ppool->write_ctl_data = port_dma_ctl_wp->dma_phys_base;
    ppool->pwrite_ctl_result = port_dma_ctl_wr->dma_virt_base;
    ppool->pwrite_ctl_data = port_dma_ctl_wp->dma_virt_base;
    
    ctl_law=FVL_BASE_LAW+fvl_get_law((ctl_win_size/FVL_BASE_LAW_SIZE)-1);
    FVL_LOG("ctl law:%d\n",ctl_law);

    fsl_srio_set_ibwin(sriodev, port_num, 2, ppool->write_ctl_result,
            FVL_SRIO_CTL_ADDR, ctl_law);
    
    rvl=fsl_srio_set_deviceid(sriodev,port_num,source_id[port_num]);
    if(rvl!=0)
    {
        FVL_LOG("SRIO port %d set  source_id faile!\n",port_num);
        return -errno;
    }
    rvl=fsl_srio_set_targetid(sriodev,port_num,1,target_id[port_num]);
    if(rvl!=0)
    {
        FVL_LOG("SRIO port %d set  target_id faile!\n",port_num);
        return -errno;
    }
    rvl=fsl_srio_set_targetid(sriodev,port_num,2,target_id[port_num]);
    if(rvl!=0)
    {
        FVL_LOG("SRIO port %d set  target_id faile!\n",port_num);
        return -errno;
    }
    fsl_srio_set_err_rate_degraded_threshold(sriodev,port_num,0);
    fsl_srio_set_err_rate_failed_threshold(sriodev,port_num,0);
    fsl_srio_set_phy_retry_threshold(sriodev,port_num,0,0);
    
    memset(port_dma_wr->dma_virt_base,0x5a,win_size);        
    memset(port_dma_ctl_wp->dma_virt_base,0,ctl_win_size);        
    memset(port_dma_ctl_wr->dma_virt_base,0,ctl_win_size); 
    
    fvl_srio_channel_t *temp_channel;
    for(i=0;i<FVL_PORT_CHAN_NUM_MAX;i++)
    {
        pscb=fvl_srio_getcb(port_num,i*2);
        if(pscb==NULL)
        {
            FVL_LOG("port:%d channel:%d : dmadev init error.\n",port_num+1,2*i);
            return -1;
        }
        temp_channel=&srio_channel_context[FVL_PORT_CHAN_NUM_MAX*port_num+i];
        cscb=&(temp_channel->chanblk);
        cscb->dmadev=pscb->dmadev;
        cscb->bfnum=pscb->bfnum;
        cscb->port = pscb->port;
        
        pscb=fvl_srio_getcb(port_num,i*2+1);
        if(pscb==NULL)
        {
            FVL_LOG("port:%d channel:%d : dmadev init error.\n",port_num+1,2*i+1);
            return -1;
        }
        re_cscb=&(temp_channel->rechanblk);
        re_cscb->dmadev=pscb->dmadev;
        re_cscb->bfnum=pscb->bfnum;
        re_cscb->port = pscb->port;
    }        

//create thread:
    FVL_LOG("port_num:%d\n",port_num);
    head_arg[port_num].num = port_num;
    head_arg[port_num].cpu = port_num+1;
    head_arg[port_num].op_mode = 0;
    head_arg[port_num].buf_virt=ppool->pwrite_ctl_result;

    rvl = pthread_create(&(psrio->chan_id[port_num]), NULL,fvl_srio_recv_head, &head_arg[port_num]);
    if (rvl) 
    {
        FVL_LOG("Create receive packet thread error!\n");
        return -errno;
    }
    FVL_LOG("SRIO Initial complete\n");    

    return 0;
}
Пример #10
0
int main(int argc, char *argv[])
{
	struct srio_dev *sriodev;
	struct dma_ch *dmadev;
	struct dma_pool *dmapool = NULL;
	int i, err;
	struct srio_port_data *port_data;
	int cli_argc;
	char *cli, **cli_argv;

	of_init();
	err = fsl_srio_uio_init(&sriodev);
	if (err < 0)
		error(EXIT_FAILURE, -err, "%s(): srio_uio_init()", __func__);

	port_num = fsl_srio_get_port_num(sriodev);

	memset(&cmd_param, 0, sizeof(cmd_param));
	cmd_param.port = malloc(sizeof(struct cmd_port_param) * port_num);
	if (!cmd_param.port) {
		error(0, errno, "%s(): command port", __func__);
		goto err_cmd_malloc;
	}
	memset(cmd_param.port, 0, sizeof(struct cmd_port_param));

	port_data = malloc(sizeof(struct srio_port_data) * port_num);
	if (!port_data) {
		error(0, errno, "%s(): port_data", __func__);
		goto err_cmd_malloc;
	}

	for (i = 0; i < port_num; i++) {
		fsl_srio_connection(sriodev, i);
		fsl_srio_get_port_info(sriodev, i + 1, &port_data[i].port_info,
				       &port_data[i].range_virt);
	}

	err = fsl_srio_port_connected(sriodev);
	if (err <= 0) {
		error(0, -err, "%s(): fsl_srio_port_connected", __func__);
		goto err_srio_connected;
	}

	err = dma_pool_init(&dmapool);

	for (i = 0; i < port_num; i++) {
		dma_addr_t port_phys_base =
			dmapool->dma_phys_base + SRIO_POOL_PORT_OFFSET * i;
		port_data[i].phys.write_recv_data = port_phys_base;
		port_data[i].phys.read_recv_data =
			port_phys_base + SRIO_POOL_SECT_SIZE;
		port_data[i].phys.write_data_prep =
			port_phys_base + SRIO_POOL_SECT_SIZE * 2;
		port_data[i].phys.res =
			port_phys_base + SRIO_POOL_SECT_SIZE * 3;

		port_data[i].virt = (typeof(port_data[i].virt))
			(dmapool->dma_virt_base + i * SRIO_POOL_PORT_OFFSET);
		fsl_srio_set_ibwin(sriodev, i, 1,
				   port_data[i].phys.write_recv_data,
				   SRIO_SYS_ADDR, LAWAR_SIZE_2M);
	}

	err = fsl_dma_chan_init(&dmadev, 0, 0);
	if (err < 0) {
		error(0, -err, "%s(): fsl_dma_chan_init()", __func__);
		goto err_srio_connected;
	}

	err = fsl_dma_chan_init(&dmadev1, 0, 1);
	if (err < 0) {
		error(0, -err, "%s(): fsl_dma_chan_init()", __func__);
		goto err_srio_connected;
	}

	err = fsl_dma_chan_init(&dmadev2, 1, 1);
	if (err < 0) {
		error(0, -err, "%s(): fsl_dma_chan_init()", __func__);
		goto err_srio_connected;
	}

	fsl_srio_err_handle_enable(sriodev);

	/* Run the CLI loop */
	while (1) {
		/* Get CLI input */
		cli = readline(sra_prompt);
		if (unlikely((cli == NULL) || strncmp(cli, "q", 1) == 0))
			break;
		if (cli[0] == 0) {
			free(cli);
			continue;
		}

		cli_argv = history_tokenize(cli);
		if (unlikely(cli_argv == NULL)) {
			error(EXIT_SUCCESS, 0,
			      "Out of memory while parsing: %s", cli);
			free(cli);
			continue;
		}
		for (cli_argc = 0; cli_argv[cli_argc] != NULL; cli_argc++)
			;

		add_history(cli);
		err = cmd_translate(cli_argc, cli_argv);
		if (err < 0)
			cmd_format_print();

		for (cli_argc = 0; cli_argv[cli_argc] != NULL; cli_argc++)
			free(cli_argv[cli_argc]);
		free(cli_argv);
		free(cli);

		if (err < 0)
			continue;
		fsl_dma_chan_basic_direct_init(dmadev);

		cmd_implement(sriodev, dmadev, port_data);
	}

	free(port_data);
	free(cmd_param.port);
	fsl_dma_chan_finish(dmadev);
	fsl_dma_chan_finish(dmadev1);
	fsl_dma_chan_finish(dmadev2);
	dma_pool_finish(dmapool);
	fsl_srio_uio_finish(sriodev);

	of_finish();
	return EXIT_SUCCESS;

err_srio_connected:
	free(port_data);
	free(cmd_param.port);
err_cmd_malloc:
	fsl_srio_uio_finish(sriodev);
	of_finish();

	return err;
}
Пример #11
0
extern "C" int main(int argcount, char** argvec)
{

	#ifdef NO_STDERR
	std::freopen("/dev/null", "w", stderr);
	std::cerr.sync_with_stdio(true);
	#endif

	std::cerr << "Frogatto engine version " << preferences::version() << "\n";
	LOG( "After print engine version" );

	#if defined(TARGET_BLACKBERRY)
		chdir("app/native");
		std::cout<< "Changed working directory to: " << getcwd(0, 0) << std::endl;
	#endif

	std::string level_cfg = "titlescreen.cfg";
	bool unit_tests_only = false, skip_tests = false;
	bool run_benchmarks = false;
	std::vector<std::string> benchmarks_list;
	std::string utility_program;
	std::vector<std::string> util_args;
	std::string server = "wesnoth.org";

	const char* profile_output = NULL;
	std::string profile_output_buf;

	std::string orig_level_cfg = level_cfg;
	std::string override_level_cfg = "";

	int modules_loaded = 0;

	std::vector<std::string> argv;
	for(int n = 1; n < argcount; ++n) {
		argv.push_back(argvec[n]);
        
        if(argv.size() >= 2 && argv[argv.size()-2] == "-NSDocumentRevisionsDebugMode" && argv.back() == "YES") {
            //XCode passes these arguments by default when debugging -- make sure they are ignored.
            argv.resize(argv.size()-2);
        }
	}

	if(sys::file_exists("./master-config.cfg")) {
		variant cfg = json::parse_from_file("./master-config.cfg");
		if(cfg.is_map()) {
			if( cfg["id"].is_null() == false) {
				preferences::set_preferences_path_from_module(cfg["id"].as_string());
				//XXX module::set_module_name(cfg["id"].as_string(), cfg["id"].as_string());
			}
			if(cfg["arguments"].is_null() == false) {
				std::vector<std::string> additional_args = cfg["arguments"].as_list_string();
				argv.insert(argv.begin(), additional_args.begin(), additional_args.end());
			}
		}
	}

	for(int n = 0; n < argv.size(); ++n) {
		const int argc = argv.size();
		const std::string arg(argv[n]);
		std::string arg_name, arg_value;
		std::string::const_iterator equal = std::find(arg.begin(), arg.end(), '=');
		if(equal != arg.end()) {
			arg_name = std::string(arg.begin(), equal);
			arg_value = std::string(equal+1, arg.end());
		}
		if(arg_name == "--module") {
			if(load_module(arg_value, &argv) != 0) {
				std::cerr << "FAILED TO LOAD MODULE: " << arg_value << "\n";
				return -1;
			}
			++modules_loaded;
		}
	}

	if(modules_loaded == 0) {
		if(load_module(DEFAULT_MODULE, &argv) != 0) {
			std::cerr << "FAILED TO LOAD MODULE: " << DEFAULT_MODULE << "\n";
			return -1;
		}
	}

	preferences::load_preferences();
	LOG( "After load_preferences()" );

	// load difficulty settings after module, before rest of args.
	difficulty::manager();

	for(int n = 0; n < argv.size(); ++n) {
		const int argc = argv.size();
		const std::string arg(argv[n]);
		std::string arg_name, arg_value;
		std::string::const_iterator equal = std::find(arg.begin(), arg.end(), '=');
		if(equal != arg.end()) {
			arg_name = std::string(arg.begin(), equal);
			arg_value = std::string(equal+1, arg.end());
		}
		
		if(arg_name == "--module") {
			// ignore already processed.
		} else if(arg_name == "--profile" || arg == "--profile") {
			profile_output_buf = arg_value;
			profile_output = profile_output_buf.c_str();
		} else if(arg_name == "--utility") {
			utility_program = arg_value;
			for(++n; n < argc; ++n) {
				const std::string arg(argv[n]);
				util_args.push_back(arg);
			}

			break;
		} else if(arg == "--benchmarks") {
			run_benchmarks = true;
		} else if(arg_name == "--benchmarks") {
			run_benchmarks = true;
			benchmarks_list = util::split(arg_value);
		} else if(arg == "--tests") {
			unit_tests_only = true;
		} else if(arg == "--no-tests") {
			skip_tests = true;
		} else if(arg == "--width" && n+1 < argc) {
			std::string w(argv[++n]);
			preferences::set_actual_screen_width(boost::lexical_cast<int>(w));
		} else if(arg == "--height" && n+1 < argc) {
			std::string h(argv[++n]);
			preferences::set_actual_screen_height(boost::lexical_cast<int>(h));
		} else if(arg == "--level" && n+1 < argc) {
			override_level_cfg = argv[++n];
		} else if(arg == "--host" && n+1 < argc) {
			server = argv[++n];
		} else if(arg == "--compiled") {
			preferences::set_load_compiled(true);
#ifndef NO_EDITOR
		} else if(arg == "--edit") {
			preferences::set_edit_on_start(true);
#endif
		} else if(arg == "--no-compiled") {
			preferences::set_load_compiled(false);
#if defined(TARGET_PANDORA)
		} else if(arg == "--no-fbo") {
			preferences::set_fbo(false);
		} else if(arg == "--no-bequ") {
			preferences::set_bequ(false);
#endif
		} else if(arg == "--help" || arg == "-h") {
			print_help(std::string(argvec[0]));
			return 0;
		} else {
			const bool res = preferences::parse_arg(argv[n].c_str());
			if(!res) {
				std::cerr << "unrecognized arg: '" << arg << "'\n";
				return -1;
			}
		}
	}

	checksum::manager checksum_manager;

	preferences::expand_data_paths();
	LOG( "After expand_data_paths()" );

	std::cerr << "Preferences dir: " << preferences::user_data_path() << '\n';

	//make sure that the user data path exists.
	if(!preferences::setup_preferences_dir()) {
		std::cerr << "cannot create preferences dir!\n";
	}

	std::cerr << "\n";

	if(utility_program.empty() == false && test::utility_needs_video(utility_program) == false) {
		test::run_utility(utility_program, util_args);
		return 0;
	}

#if defined(TARGET_PANDORA)
    EGL_Open();
#endif

#if defined(__ANDROID__)
	std::freopen("stdout.txt","w",stdout);
	std::freopen("stderr.txt","w",stderr);
	std::cerr.sync_with_stdio(true);
#endif

	LOG( "Start of main" );
	
	Uint32 sdl_init_flags = SDL_INIT_VIDEO | SDL_INIT_JOYSTICK;
#ifdef _WINDOWS
	sdl_init_flags |= SDL_INIT_TIMER;
#endif
	if(SDL_Init(sdl_init_flags) < 0) {
		std::cerr << "could not init SDL\n";
		return -1;
	}
	LOG( "After SDL_Init" );

#ifdef TARGET_OS_HARMATTAN
	g_type_init();
#endif
	i18n::init ();
	LOG( "After i18n::init()" );

//	SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 1);

#if defined(TARGET_OS_IPHONE) || defined(TARGET_BLACKBERRY) || defined(__ANDROID__)
	//on the iPhone and PlayBook, try to restore the auto-save if it exists
	if(sys::file_exists(preferences::auto_save_file_path()) && sys::read_file(std::string(preferences::auto_save_file_path()) + ".stat") == "1") {
		level_cfg = "autosave.cfg";
		sys::write_file(std::string(preferences::auto_save_file_path()) + ".stat", "0");

	}
#endif

	if(override_level_cfg.empty() != true) {
		level_cfg = override_level_cfg;
		orig_level_cfg = level_cfg;
	}

#if TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR
	int width, height;
	iphone_screen_res(&width, &height);
	preferences::set_actual_screen_width(width);
	preferences::set_actual_screen_height(height);
	int multiplier = 2;
	if (width > 320)
	{
		//preferences::set_use_pretty_scaling(true);
		multiplier = 1;
	}
	preferences::set_virtual_screen_width(height*multiplier);
	preferences::set_virtual_screen_height(width*multiplier);
	preferences::set_control_scheme(height % 1024 ? "iphone_2d" : "ipad_2d");
	
	SDL_WindowID windowID = SDL_CreateWindow (NULL, 0, 0, preferences::actual_screen_width(), preferences::actual_screen_height(),
		SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN |
		SDL_WINDOW_BORDERLESS);
	if (windowID == 0) { 
		std::cerr << "Could not create window: " << SDL_GetError() << "\n"; 
		return -1;
	}
	
	//	if (SDL_GL_CreateContext(windowID) == 0) {
	//		std::cerr << "Could not create GL context: " << SDL_GetError() << "\n";
	//		return -1;
	//	}
	if (SDL_CreateRenderer(windowID, -1, 0) != 0) {
		std::cerr << "Could not create renderer\n";
		return -1;
	}
	
#else
#ifdef TARGET_OS_HARMATTAN
	SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 1);
	if (SDL_SetVideoMode(preferences::actual_screen_width(),preferences::actual_screen_height(),0,SDL_OPENGLES | SDL_FULLSCREEN) == NULL) {
		std::cerr << "could not set video mode\n";
		return -1;
	}

	preferences::init_oes();
	SDL_ShowCursor(0);
#else
#ifndef __APPLE__
	graphics::surface wm_icon = graphics::surface_cache::get("window-icon.png");
	if(!wm_icon.null()) {
		SDL_WM_SetIcon(wm_icon, NULL);
	}
#endif

#if defined(TARGET_PANDORA)
	if (SDL_SetVideoMode(preferences::actual_screen_width(),preferences::actual_screen_height(),16,SDL_FULLSCREEN) == NULL) {
		std::cerr << "could not set video mode\n";
		return -1;
	}
    EGL_Init();
    preferences::init_oes();
#elif defined(TARGET_TEGRA)
	//if (SDL_SetVideoMode(preferences::actual_screen_width(),preferences::actual_screen_height(),0,preferences::resizable() ? SDL_RESIZABLE : 0|preferences::fullscreen() ? SDL_FULLSCREEN : 0) == NULL) {
	if (SDL_SetVideoMode(preferences::actual_screen_width(),preferences::actual_screen_height(),0,SDL_FULLSCREEN) == NULL) {
		std::cerr << "could not set video mode\n";
		return -1;
	}
    EGL_Init();
    preferences::init_oes();
#elif defined(TARGET_BLACKBERRY)
	if (SDL_SetVideoMode(preferences::actual_screen_width(),preferences::actual_screen_height(),0,SDL_OPENGL|SDL_FULLSCREEN) == NULL) {
		std::cerr << "could not set video mode\n";
		return -1;
	}
	preferences::init_oes();
#elif defined(__ANDROID__)
    SDL_Rect** r = SDL_ListModes(NULL, SDL_FULLSCREEN|SDL_OPENGL);
    if( r != (SDL_Rect**)0 && r != (SDL_Rect**)-1 ) {
        preferences::set_actual_screen_width(r[0]->w);
        preferences::set_actual_screen_height(r[0]->h);
		if(r[0]->w < 640) {
        	preferences::set_virtual_screen_width(r[0]->w*2);
        	preferences::set_virtual_screen_height(r[0]->h*2);
		} else {
			preferences::set_virtual_screen_width(r[0]->w);
			preferences::set_virtual_screen_height(r[0]->h);
		}
		preferences::set_control_scheme(r[0]->h >= 1024 ? "ipad_2d" : "android_med");
    }

    if (SDL_SetVideoMode(preferences::actual_screen_width(),preferences::actual_screen_height(),16,SDL_FULLSCREEN|SDL_OPENGL) == NULL) {
		std::cerr << "could not set video mode\n";
		return -1;
    }
#else
	if (SDL_SetVideoMode(preferences::actual_screen_width(),preferences::actual_screen_height(),0,SDL_OPENGL|(preferences::resizable() ? SDL_RESIZABLE : 0)|(preferences::fullscreen() ? SDL_FULLSCREEN : 0)) == NULL) {
		std::cerr << "could not set video mode\n";
		return -1;
	}
#endif
#endif

#endif

//	srand(time(NULL));

	const stats::manager stats_manager;
#ifndef NO_EDITOR
	const external_text_editor::manager editor_manager;
#endif // NO_EDITOR

	std::cerr
		<< "\n"
		<< "OpenGL vendor: " << reinterpret_cast<const char *>(glGetString(GL_VENDOR)) << "\n"
		<< "OpenGL version: " << reinterpret_cast<const char *>(glGetString(GL_VERSION)) << "\n"
		<< "OpenGL extensions: " << reinterpret_cast<const char *>(glGetString(GL_EXTENSIONS)) << "\n"
		<< "\n";
	glShadeModel(GL_SMOOTH);
	glEnable(GL_BLEND);
	glEnable(GL_TEXTURE_2D);
	glEnableClientState(GL_VERTEX_ARRAY);
	glEnableClientState(GL_TEXTURE_COORD_ARRAY);
	
	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

	SDL_WM_SetCaption(module::get_module_pretty_name().c_str(), module::get_module_pretty_name().c_str());

	std::cerr << "JOYSTICKS: " << SDL_NumJoysticks() << "\n";

	const load_level_manager load_manager;

	{ //manager scope
	const font::manager font_manager;
	const sound::manager sound_manager;
	const joystick::manager joystick_manager;
		
	#if !TARGET_OS_IPHONE && !TARGET_IPHONE_SIMULATOR
	const SDL_Surface* fb = SDL_GetVideoSurface();
	if(fb == NULL) {
		return 0;
	}
	#endif

	graphics::texture::manager texture_manager;

#ifndef NO_EDITOR
	editor::manager editor_manager;
#endif

	variant preloads;
	loading_screen loader;
	try {
		sound::init_music(json::parse_from_file(module::map_file("data/music.cfg")));

		std::string filename = "data/fonts." + i18n::get_locale() + ".cfg";
		if (!sys::file_exists(filename))
			filename = "data/fonts.cfg";
		graphical_font::init(json::parse_from_file(module::map_file(filename)));

		preloads = json::parse_from_file(module::map_file("data/preload.cfg"));
		int preload_items = preloads["preload"].num_elements();
		loader.set_number_of_items(preload_items+7); // 7 is the number of items that will be loaded below
		custom_object::init();
		loader.draw_and_increment(_("Initializing custom object functions"));
		init_custom_object_functions(json::parse_from_file(module::map_file("data/functions.cfg")));
		loader.draw_and_increment(_("Initializing textures"));
		loader.load(preloads);
		loader.draw_and_increment(_("Initializing tiles"));
		tile_map::init(json::parse_from_file(module::map_file("data/tiles.cfg")));
		loader.draw_and_increment(_("Initializing GUI"));

		variant gui_node = json::parse_from_file(module::map_file(preferences::load_compiled() ? "data/compiled/gui.cfg" : "data/gui.cfg"));
		gui_section::init(gui_node);
		loader.draw_and_increment(_("Initializing GUI"));
		framed_gui_element::init(gui_node);

	} catch(const json::parse_error& e) {
		std::cerr << "ERROR PARSING: " << e.error_message() << "\n";
		return 0;
	}
	loader.draw(_("Loading level"));

	if(!skip_tests && !test::run_tests()) {
		return -1;
	}

	if(unit_tests_only) {
		return 0;
	}
#if defined(__APPLE__) && !(TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE)
	GLint swapInterval = 1;
	CGLSetParameter(CGLGetCurrentContext(), kCGLCPSwapInterval, &swapInterval);
#endif

#ifndef SDL_VIDEO_OPENGL_ES
	GLenum glew_status = glewInit();
	ASSERT_EQ(glew_status, GLEW_OK);
#endif

	loader.finish_loading();
	//look to see if we got any quit events while loading.
	{
	SDL_Event event;
	while(SDL_PollEvent(&event)) {
		if(event.type == SDL_QUIT) {
			return 0;
		}
	}
	}

	formula_profiler::manager profiler(profile_output);
	texture_frame_buffer::init();

	if(run_benchmarks) {
		if(benchmarks_list.empty() == false) {
			test::run_benchmarks(&benchmarks_list);
		} else {
			test::run_benchmarks();
		}
		return 0;
	} else if(utility_program.empty() == false) {
		test::run_utility(utility_program, util_args);
		return 0;
	}

	bool quit = false;
	bool of_initialized = false;

	while(!quit && !show_title_screen(level_cfg)) {
		boost::intrusive_ptr<level> lvl(load_level(level_cfg));
		
#if TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR
		if (!of_initialized)
		{
			of_init();
			of_initialized = true;
		}
#endif

		//see if we're loading a multiplayer level, in which case we
		//connect to the server.
		multiplayer::manager mp_manager(lvl->is_multiplayer());
		if(lvl->is_multiplayer()) {
			multiplayer::setup_networked_game(server);
		}

		if(lvl->is_multiplayer()) {
			last_draw_position() = screen_position();
			std::string level_cfg = "waiting-room.cfg";
			boost::intrusive_ptr<level> wait_lvl(load_level(level_cfg));
			wait_lvl->finish_loading();
			wait_lvl->set_multiplayer_slot(0);
			if(wait_lvl->player()) {
				wait_lvl->player()->set_current_level(level_cfg);
			}
			wait_lvl->set_as_current_level();

			level_runner runner(wait_lvl, level_cfg, orig_level_cfg);

			multiplayer::sync_start_time(*lvl, boost::bind(&level_runner::play_cycle, &runner));

			lvl->set_multiplayer_slot(multiplayer::slot());
		}

		last_draw_position() = screen_position();

		assert(lvl.get());
		if(!lvl->music().empty()) {
			sound::play_music(lvl->music());
		}

		if(lvl->player() && level_cfg != "autosave.cfg") {
			lvl->player()->set_current_level(level_cfg);
			lvl->player()->get_entity().save_game();
		}

		set_scene_title(lvl->title());

		try {
			quit = level_runner(lvl, level_cfg, orig_level_cfg).play_level();
			level_cfg = orig_level_cfg;
		} catch(multiplayer_exception&) {
		}
	}

	level::clear_current_level();

	} //end manager scope, make managers destruct before calling SDL_Quit
//	controls::debug_dump_controls();
#if defined(TARGET_PANDORA) || defined(TARGET_TEGRA)
    EGL_Destroy();
#endif

	SDL_Quit();
	
	preferences::save_preferences();
	std::cerr << SDL_GetError() << "\n";
#if !defined(TARGET_OS_HARMATTAN) && !defined(TARGET_TEGRA) && !defined(TARGET_BLACKBERRY) && !defined(__ANDROID__)
	std::cerr << gluErrorString(glGetError()) << "\n";
#endif
	return 0;
}
Пример #12
0
int main(int argc, char *argv[])
{
	struct srio_dev *sriodev;
	struct dma_ch *send_dmadev[SEND_THREAD_NUM];
	struct dma_ch *receive_dmadev[RECEIVE_THREAD_NUM];
	struct dma_pool *dmapool = NULL;
	int i, err;
	struct srio_port_data *port_data;
	uint32_t attr_read, attr_write;
	struct task_arg_type task_arg_send[SEND_THREAD_NUM];
	struct task_arg_type task_arg_receive[RECEIVE_THREAD_NUM];
	pthread_t send_id[SEND_THREAD_NUM];
	pthread_t receive_id[RECEIVE_THREAD_NUM];
	of_init();
	err = fsl_srio_uio_init(&sriodev);
	if (err < 0)
		error(EXIT_FAILURE, -err, "%s(): srio_uio_init()", __func__);

	port_num = fsl_srio_get_port_num(sriodev);

	memset(&cmd_param, 0, sizeof(cmd_param));
/*ctx add*/
	cmd_param.curr_port_id=0;
	cmd_param.start_cpu=1;
	cmd_param.passes=10;
	cmd_param.test_type=0;
	cmd_param.test_srio_type=0;
	if (argc<3)
	{
		cmd_format_print();
		return -1;
	}
	err = cmd_translate(argc, argv,&cmd_param);
	if(err==2)
	{
		return 0;
	}
	if ((err < 0) ||(argc<3))
	{
		cmd_format_print();
		return -1;
	}
	
	

	port_data = malloc(sizeof(struct srio_port_data) * port_num);
	if (!port_data) {
		error(0, errno, "%s(): port_data", __func__);
		goto err_cmd_malloc;
	}

	for (i = 0; i < port_num; i++) {
		fsl_srio_connection(sriodev, i);
		fsl_srio_get_port_info(sriodev, i + 1, &port_data[i].port_info,
				       &port_data[i].range_virt);
	}

	err = fsl_srio_port_connected(sriodev);
	if (err <= 0) {
		error(0, -err, "%s(): fsl_srio_port_connected", __func__);
		goto err_srio_connected;
	}
	uint8_t flag=0;
	if(cmd_param.test_type==1)
	{
		for (i = 0; i < port_num; i++) {
			if(srio_link(sriodev,i))
			{
		  	     printf("port %d sucess!\n",i);
                             fflush(stdout);
			}
			else
			{
			     printf("port %d failed!\n",i);
                             fflush(stdout);
			     flag++;
			}
		}
		if(flag != 0)
			return -1;
		return 0;
	}
	err = dma_pool_init(&dmapool);
	uint8_t port = cmd_param.curr_port_id;
	attr_read = srio_test_win_attrv[3];
	attr_write = srio_test_win_attrv[cmd_param.test_srio_type];

	for (i = 0; i < port_num; i++) {
		dma_addr_t port_phys_base =
			dmapool->dma_phys_base + SRIO_POOL_PORT_OFFSET * i;
		port_data[i].phys.write_recv_data = port_phys_base;
		port_data[i].phys.read_recv_data =
			port_phys_base + SRIO_POOL_SECT_SIZE;
		port_data[i].phys.write_data_prep =
			port_phys_base + SRIO_POOL_SECT_SIZE * 2;
		port_data[i].phys.res =
			port_phys_base + SRIO_POOL_SECT_SIZE * 3;
		
		port_data[i].virt = (typeof(port_data[i].virt))
			(dmapool->dma_virt_base + i * SRIO_POOL_PORT_OFFSET);
		fsl_srio_set_ibwin(sriodev, i, 1,
				   port_data[i].phys.write_recv_data,
				   SRIO_SYS_ADDR, LAWAR_SIZE_8M);
		fsl_srio_set_ibwin(sriodev, i, 2,
				   port_data[i].phys.write_recv_data+0x800000,
				   SRIO_ctl_ADDR, LAWAR_SIZE_8M);
		
		if (fsl_srio_port_connected(sriodev) & (0x1 << i)) {
			fsl_srio_set_obwin(sriodev, i, 1,
				   port_data[i].port_info.range_start,
				   SRIO_SYS_ADDR, LAWAR_SIZE_8M);
			fsl_srio_set_obwin_attr(sriodev, i, 1,
					attr_read, attr_write);

			fsl_srio_set_obwin(sriodev, i, 2,
				   port_data[i].port_info.range_start+0x800000,
				   SRIO_ctl_ADDR, LAWAR_SIZE_8M);
			fsl_srio_set_obwin_attr(sriodev, i, 2,
					attr_read, attr_write);
		} else {
			printf("SRIO port %d error!\n", i + 1);
			fflush(stdout);
			return -errno;
		}
		memset(port_data[i].virt,0,SRIO_POOL_PORT_OFFSET);
	}
        err = fsl_srio_set_targetid(sriodev,0,1,0x11);
	if(err!=0)
        {
		printf("sro set targetid  failed!\n");
                fflush(stdout);
	}
        err = fsl_srio_set_targetid(sriodev,1,1,0x14);
	if(err!=0)
        {
		printf("sro set targetid  failed!\n");
                fflush(stdout);
	}
        err = fsl_srio_set_targetid(sriodev,0,2,0x11);
	if(err!=0)
        {
		printf("sro set targetid  failed!\n");
                fflush(stdout);
	}
        err = fsl_srio_set_targetid(sriodev,1,2,0x14);
	if(err!=0)
        {
		printf("sro set targetid  failed!\n");
                fflush(stdout);
	}
/*ctx add*/
        sleep(5);

	for(i=0;i<1;i++)
	{
		
		err = fsl_dma_chan_init(&send_dmadev[i], 0, i);	
		if (err < 0) {
			error(0, -err, "%s(): fsl_dma_chan_init()", __func__);
			goto err_srio_connected;
		}
		err = fsl_dma_chan_init(&receive_dmadev[i], 1, i);
		if (err < 0) {
			error(0, -err, "%s(): fsl_dma_chan_init()", __func__);
			goto err_srio_connected;
		}
		fsl_dma_chan_basic_direct_init(send_dmadev[i]);
		fsl_dma_chan_bwc(send_dmadev[i], DMA_BWC_1024);
		task_arg_send[i].dmadev = send_dmadev[i];
		
		fsl_dma_chan_basic_direct_init(receive_dmadev[i]);
		fsl_dma_chan_bwc(receive_dmadev[i], DMA_BWC_1024);
		task_arg_receive[i].dmadev = receive_dmadev[i];
		
		task_arg_receive[i].port_data_thread.phys.write_recv_data=port_data[1-port].phys.write_recv_data+THREAD_WIN_SIZE*i;
		task_arg_receive[i].port_data_thread.phys.read_recv_data=port_data[1-port].phys.read_recv_data+THREAD_WIN_SIZE*i;
		task_arg_receive[i].port_data_thread.phys.write_data_prep=port_data[1-port].phys.write_data_prep+THREAD_WIN_SIZE*i;
		task_arg_receive[i].port_data_thread.phys.res=port_data[1-port].phys.res+THREAD_WIN_SIZE*i;
		task_arg_receive[i].port_data_thread.virt.write_recv_data = &port_data[1-port].virt->write_recv_data_t[i][0];
		task_arg_receive[i].port_data_thread.virt.read_recv_data = &port_data[1-port].virt->read_recv_data_t[i][0];
		task_arg_receive[i].port_data_thread.virt.write_data_prep = &port_data[1-port].virt->write_data_prep_t[i][0];
		task_arg_receive[i].port_data_thread.virt.res = &port_data[1-port].virt->res_t[i][0];
		task_arg_receive[i].port_data_thread.port_info.range_start = port_data[1-port].port_info.range_start+THREAD_WIN_SIZE*i; 
		task_arg_receive[i].port = 1-port;

		task_arg_receive[i].srio_type = cmd_param.test_srio_type;
		task_arg_receive[i].cpu = cmd_param.start_cpu;/*bind cpu*/
		task_arg_receive[i].passes = cmd_param.passes;/*bind cpu*/
		/* ctx add*/
		task_arg_send[i].port_data_thread.phys.write_recv_data=port_data[port].phys.write_recv_data+THREAD_WIN_SIZE*i;
		task_arg_send[i].port_data_thread.phys.read_recv_data=port_data[port].phys.read_recv_data+THREAD_WIN_SIZE*i;
		task_arg_send[i].port_data_thread.phys.write_data_prep=port_data[port].phys.write_data_prep+THREAD_WIN_SIZE*i;
		task_arg_send[i].port_data_thread.phys.res=port_data[port].phys.res+THREAD_WIN_SIZE*i;
		task_arg_send[i].port_data_thread.virt.write_recv_data = &port_data[port].virt->write_recv_data_t[i][0];
		task_arg_send[i].port_data_thread.virt.read_recv_data = &port_data[port].virt->read_recv_data_t[i][0];
		task_arg_send[i].port_data_thread.virt.write_data_prep = &port_data[port].virt->write_data_prep_t[i][0];
		task_arg_send[i].port_data_thread.virt.res = &port_data[port].virt->res_t[i][0];
		task_arg_send[i].port_data_thread.port_info.range_start = port_data[port].port_info.range_start+THREAD_WIN_SIZE*i; 
		/* cta end*/
		task_arg_send[i].port = port;
		task_arg_send[i].srio_type = cmd_param.test_srio_type;
		task_arg_send[i].cpu = cmd_param.start_cpu+1;/*bind cpu*/
		task_arg_send[i].passes = cmd_param.passes;/*bind cpu*/
		if(cmd_param.test_type==2)
		{
			task_arg_send[i].test_type=0;
			err = pthread_create(&send_id[i], NULL,t_srio_send, &task_arg_send[i]);
			if (err) {
				printf("Port %d : Send thread failed!\n",port + 1);
				fflush(stdout);
				return -errno;
			}
                        sleep(1);
			err = pthread_create(&receive_id[i],NULL,t_srio_receive,&task_arg_receive[i]);
			if (err) {
				printf("Port %d : Receive thread failed!\n",2-port);
				fflush(stdout);
				return -errno;
			} 
		} 
		else if(cmd_param.test_type==3)
		{	
			task_arg_send[i].test_type=1;
			err = pthread_create(&send_id[i], NULL,t_srio_send, &task_arg_send[i]);
			if (err) {
				printf("Port %d : Send thread failed!\n",port + 1);
				fflush(stdout);
				return -errno;
			}			
		}	
	}
/*multiplie*/
	for(i=1;i<SEND_THREAD_NUM;i++)
	{
		
		err = fsl_dma_chan_init(&send_dmadev[i], 0, i);	
		if (err < 0) {
			error(0, -err, "%s(): fsl_dma_chan_init()", __func__);
			goto err_srio_connected;
		}
		err = fsl_dma_chan_init(&receive_dmadev[i], 1, i);
		if (err < 0) {
			error(0, -err, "%s(): fsl_dma_chan_init()", __func__);
			goto err_srio_connected;
		}
		fsl_dma_chan_basic_direct_init(send_dmadev[i]);
		fsl_dma_chan_bwc(send_dmadev[i], DMA_BWC_1024);
		task_arg_send[i].dmadev = send_dmadev[i];
		
		fsl_dma_chan_basic_direct_init(receive_dmadev[i]);
		fsl_dma_chan_bwc(receive_dmadev[i], DMA_BWC_1024);
		task_arg_receive[i].dmadev = receive_dmadev[i];
		
		task_arg_receive[i].port_data_thread.phys.write_recv_data=port_data[port].phys.write_recv_data+THREAD_WIN_SIZE*i;
		task_arg_receive[i].port_data_thread.phys.read_recv_data=port_data[port].phys.read_recv_data+THREAD_WIN_SIZE*i;
		task_arg_receive[i].port_data_thread.phys.write_data_prep=port_data[port].phys.write_data_prep+THREAD_WIN_SIZE*i;
		task_arg_receive[i].port_data_thread.phys.res=port_data[port].phys.res+THREAD_WIN_SIZE*i;
		task_arg_receive[i].port_data_thread.virt.write_recv_data = &port_data[port].virt->write_recv_data_t[i][0];
		task_arg_receive[i].port_data_thread.virt.read_recv_data = &port_data[port].virt->read_recv_data_t[i][0];
		task_arg_receive[i].port_data_thread.virt.write_data_prep = &port_data[port].virt->write_data_prep_t[i][0];
		task_arg_receive[i].port_data_thread.virt.res = &port_data[port].virt->res_t[i][0];
		task_arg_receive[i].port_data_thread.port_info.range_start = port_data[port].port_info.range_start+THREAD_WIN_SIZE*i; 
		task_arg_receive[i].port = port;
		task_arg_receive[i].srio_type = cmd_param.test_srio_type;
		task_arg_receive[i].cpu = cmd_param.start_cpu+2;
                task_arg_receive[i].passes = cmd_param.passes;

		task_arg_send[i].port_data_thread.phys.write_recv_data=port_data[1-port].phys.write_recv_data+THREAD_WIN_SIZE*i;
		task_arg_send[i].port_data_thread.phys.read_recv_data=port_data[1-port].phys.read_recv_data+THREAD_WIN_SIZE*i;
		task_arg_send[i].port_data_thread.phys.write_data_prep=port_data[1-port].phys.write_data_prep+THREAD_WIN_SIZE*i;
		task_arg_send[i].port_data_thread.phys.res=port_data[1-port].phys.res+THREAD_WIN_SIZE*i;
		task_arg_send[i].port_data_thread.virt.write_recv_data = &port_data[1-port].virt->write_recv_data_t[i][0];
		task_arg_send[i].port_data_thread.virt.read_recv_data = &port_data[1-port].virt->read_recv_data_t[i][0];
		task_arg_send[i].port_data_thread.virt.write_data_prep = &port_data[1-port].virt->write_data_prep_t[i][0];
		task_arg_send[i].port_data_thread.virt.res = &port_data[1-port].virt->res_t[i][0];
		task_arg_send[i].port_data_thread.port_info.range_start = port_data[1-port].port_info.range_start+THREAD_WIN_SIZE*i; 
		
		task_arg_send[i].port = 1-port;
		task_arg_send[i].srio_type = cmd_param.test_srio_type;
		task_arg_send[i].cpu = cmd_param.start_cpu+3;
		task_arg_send[i].passes = cmd_param.passes;
		if(cmd_param.test_type==2)
		{	
			task_arg_send[i].test_type=0;
			err = pthread_create(&send_id[i],NULL,t_srio_send,&task_arg_send[i]);
			if (err) {
				printf("Port %d : Send thread failed!\n",2-port);
				fflush(stdout);
				return -errno;
			} 
                        sleep(1);
	
			err = pthread_create(&receive_id[i], NULL,t_srio_receive, &task_arg_receive[i]);
			if (err) {
				printf("Port %d : Send thread failed!\n",port + 1);
				fflush(stdout);
				return -errno;
			} 

		}else if(cmd_param.test_type==3)
		{
			task_arg_send[i].test_type=1;	
			err = pthread_create(&send_id[i],NULL,t_srio_send,&task_arg_send[i]);
			if (err) {
				printf("Port %d : Send thread failed!\n",2-port);
				fflush(stdout);
				return -errno;
			} 			
		}
	}

	for(i=0;i<2;i++)
	{
		if(cmd_param.test_type==2)
		{
			pthread_join(send_id[i],NULL);
			pthread_join(receive_id[i],NULL);
		}else if(cmd_param.test_type==3)
		{
			pthread_join(send_id[i],NULL);
		}
	}
/*ctx end*/

        free(port_data);
	for(i=0;i<SEND_THREAD_NUM;i++)
	{
		fsl_dma_chan_finish(send_dmadev[i]);
		fsl_dma_chan_finish(receive_dmadev[i]);
	}
	dma_pool_finish(dmapool);
	fsl_srio_uio_finish(sriodev);

	of_finish();
	return EXIT_SUCCESS;

err_srio_connected:
    free(port_data);
err_cmd_malloc:
	fsl_srio_uio_finish(sriodev);
	of_finish();

	return err;
}
Пример #13
0
unsigned long
decompress_kernel(unsigned long load_addr, int num_words, unsigned long cksum,
		  RESIDUAL *residual, void *OFW_interface)
{
	int timer;
	extern unsigned long start;
	char *cp, ch;
	unsigned long i;
	BATU *u;
	BATL *l;
	unsigned long TotalMemory;
	unsigned long orig_MSR;
	int dev_handle;
	int mem_info[2];
	int res, size;
	unsigned char board_type;
	unsigned char base_mod;

	lines = 25;
	cols = 80;
	orig_x = 0;
	orig_y = 24;
	
	/*
	 * IBM's have the MMU on, so we have to disable it or
	 * things get really unhappy in the kernel when
	 * trying to setup the BATs with the MMU on
	 * -- Cort
	 */
	flush_instruction_cache();
	_put_HID0(_get_HID0() & ~0x0000C000);
	_put_MSR((orig_MSR = _get_MSR()) & ~0x0030);

#if defined(CONFIG_SERIAL_CONSOLE)
	com_port = (struct NS16550 *)NS16550_init(0);
#endif /* CONFIG_SERIAL_CONSOLE */
	vga_init(0xC0000000);

	if (residual)
	{
		/* Is this Motorola PPCBug? */
		if ((1 & residual->VitalProductData.FirmwareSupports) &&
		    (1 == residual->VitalProductData.FirmwareSupplier)) {
			board_type = inb(0x800) & 0xF0;

			/* If this is genesis 2 board then check for no
			 * keyboard controller and more than one processor.
			 */
			if (board_type == 0xe0) {	
				base_mod = inb(0x803);
				/* if a MVME2300/2400 or a Sitka then no keyboard */
				if((base_mod == 0xFA) || (base_mod == 0xF9) ||
				   (base_mod == 0xE1)) {
					keyb_present = 0;	/* no keyboard */
				}
			}
		}
		memcpy(hold_residual,residual,sizeof(RESIDUAL));
	} else {
		/* Assume 32M in the absence of more info... */
		TotalMemory = 0x02000000;
		/*
		 * This is a 'best guess' check.  We want to make sure
		 * we don't try this on a PReP box without OF
		 *     -- Cort
		 */
		while (OFW_interface && ((unsigned long)OFW_interface < 0x10000000) )
		{
			/* The MMU needs to be on when we call OFW */
			_put_MSR(orig_MSR);
			of_init(OFW_interface);

			/* get handle to memory description */
			res = of_finddevice("/memory@0", 
					    &dev_handle);
			// puthex(res);  puts("\n");
			if (res) break;
			
			/* get the info */
			// puts("get info = ");
			res = of_getprop(dev_handle, 
					 "reg", 
					 mem_info, 
					 sizeof(mem_info), 
					 &size);
			// puthex(res);  puts(", info = "); puthex(mem_info[0]);  
			// puts(" ");  puthex(mem_info[1]);   puts("\n");
			if (res) break;
			
			TotalMemory = mem_info[1];
			break;
		}
		hold_residual->TotalMemory = TotalMemory;
		residual = hold_residual;
		/* Turn MMU back off */
		_put_MSR(orig_MSR & ~0x0030);
        }

	/* assume the chunk below 8M is free */
	end_avail = (char *)0x00800000;

	/* tell the user where we were loaded at and where we
	 * were relocated to for debugging this process
	 */
	puts("loaded at:     "); puthex(load_addr);
	puts(" "); puthex((unsigned long)(load_addr + (4*num_words))); puts("\n");
	if ( (unsigned long)load_addr != (unsigned long)&start )
	{
		puts("relocated to:  "); puthex((unsigned long)&start);
		puts(" ");
		puthex((unsigned long)((unsigned long)&start + (4*num_words)));
		puts("\n");
	}

	if ( residual )
	{
		puts("board data at: "); puthex((unsigned long)residual);
		puts(" ");
		puthex((unsigned long)((unsigned long)residual + sizeof(RESIDUAL)));
		puts("\n");
		puts("relocated to:  ");
		puthex((unsigned long)hold_residual);
		puts(" ");
		puthex((unsigned long)((unsigned long)hold_residual + sizeof(RESIDUAL)));
		puts("\n");
	}

	/* we have to subtract 0x10000 here to correct for objdump including the
	   size of the elf header which we strip -- Cort */
	zimage_start = (char *)(load_addr - 0x10000 + ZIMAGE_OFFSET);
	zimage_size = ZIMAGE_SIZE;

	if ( INITRD_OFFSET )
		initrd_start = load_addr - 0x10000 + INITRD_OFFSET;
	else
		initrd_start = 0;
	initrd_end = INITRD_SIZE + initrd_start;

	/*
	 * Find a place to stick the zimage and initrd and 
	 * relocate them if we have to. -- Cort
	 */
	avail_ram = (char *)PAGE_ALIGN((unsigned long)_end);
	puts("zimage at:     "); puthex((unsigned long)zimage_start);
	puts(" "); puthex((unsigned long)(zimage_size+zimage_start)); puts("\n");
	if ( (unsigned long)zimage_start <= 0x00800000 )
	{
		memcpy( (void *)avail_ram, (void *)zimage_start, zimage_size );
		zimage_start = (char *)avail_ram;
		puts("relocated to:  "); puthex((unsigned long)zimage_start);
		puts(" ");
		puthex((unsigned long)zimage_size+(unsigned long)zimage_start);
		puts("\n");
		avail_ram += zimage_size;
	}

	/* relocate initrd */
	if ( initrd_start )
	{
		puts("initrd at:     "); puthex(initrd_start);
		puts(" "); puthex(initrd_end); puts("\n");
		if ( (unsigned long)initrd_start <= 0x00800000 )
		{
			memcpy( (void *)avail_ram,
				(void *)initrd_start, initrd_end-initrd_start );
			puts("relocated to:  ");
			initrd_end = (unsigned long) avail_ram + (initrd_end-initrd_start);
			initrd_start = (unsigned long)avail_ram;
			puthex((unsigned long)initrd_start);
			puts(" ");
			puthex((unsigned long)initrd_end);
			puts("\n");
		}
		avail_ram = (char *)PAGE_ALIGN((unsigned long)initrd_end);
	}

	avail_ram = (char *)0x00400000;
	end_avail = (char *)0x00800000;
	puts("avail ram:     "); puthex((unsigned long)avail_ram); puts(" ");
	puthex((unsigned long)end_avail); puts("\n");

	if (keyb_present)
		CRT_tstc();  /* Forces keyboard to be initialized */

	puts("\nLinux/PPC load: ");
	timer = 0;
	cp = cmd_line;
	memcpy (cmd_line, cmd_preset, sizeof(cmd_preset));
	while ( *cp ) putc(*cp++);
	while (timer++ < 5*1000) {
		if (tstc()) {
			while ((ch = getc()) != '\n' && ch != '\r') {
				if (ch == '\b') {
					if (cp != cmd_line) {
						cp--;
						puts("\b \b");
					}
				} else {
					*cp++ = ch;
					putc(ch);
				}
			}
			break;  /* Exit 'timer' loop */
		}
		udelay(1000);  /* 1 msec */
	}
	*cp = 0;
	puts("\n");

	puts("Uncompressing Linux...");
	gunzip(0, 0x400000, zimage_start, &zimage_size);
	puts("done.\n");
	
	{
		struct bi_record *rec;
	    
		rec = (struct bi_record *)PAGE_ALIGN(zimage_size);
	    
		rec->tag = BI_FIRST;
		rec->size = sizeof(struct bi_record);
		rec = (struct bi_record *)((unsigned long)rec + rec->size);

		rec->tag = BI_BOOTLOADER_ID;
		memcpy( (void *)rec->data, "prepboot", 9);
		rec->size = sizeof(struct bi_record) + 8 + 1;
		rec = (struct bi_record *)((unsigned long)rec + rec->size);
	    
		rec->tag = BI_MACHTYPE;
		rec->data[0] = _MACH_prep;
		rec->data[1] = 1;
		rec->size = sizeof(struct bi_record) + sizeof(unsigned long);
		rec = (struct bi_record *)((unsigned long)rec + rec->size);
	    
		rec->tag = BI_CMD_LINE;
		memcpy( (char *)rec->data, cmd_line, strlen(cmd_line)+1);
		rec->size = sizeof(struct bi_record) + strlen(cmd_line) + 1;
		rec = (struct bi_record *)((ulong)rec + rec->size);
		
		rec->tag = BI_LAST;
		rec->size = sizeof(struct bi_record);
		rec = (struct bi_record *)((unsigned long)rec + rec->size);
	}
	puts("Now booting the kernel\n");
	return (unsigned long)hold_residual;
}
Пример #14
0
int fvl_srio_init_master(fvl_srio_init_param_t *srio_param)
{
    fvl_srio_context_t  *psrio = &g_srio_context;
    fvl_srio_portpool_t *ppool;
    fvl_srio_ctrlblk_t *pscb,*cscb,*re_cscb;
    fvl_head_thread_t head_arg;
    uint32_t chan_num=srio_param->chan_num;
    uint32_t port_num=srio_param->port_num;
    fvl_dma_pool_t *port_dma_wr = srio_param->port_rd_buf;
    fvl_dma_pool_t *port_dma_ctl_wp;
    fvl_dma_pool_t *port_dma_ctl_wr;

    uint32_t win_size=0; //need change
    uint32_t ctl_win_size=0x400000;//ctl_size*chan_num;
    uint32_t win_law=0,ctl_law=21;
    struct srio_dev *sriodev;
    int rvl;
    int i=0;
    if((port_num >= FVL_SRIO_PORT_NUM) || (port_num <0))
    {
        FVL_LOG("port number error:%d\n",port_num);
        return -1;
    }
    if((chan_num > FVL_PORT_CHAN_NUM_MAX) || ( chan_num<0))
    {
        FVL_LOG("channel number error:%d\n",chan_num);
        return -1;
    }
    
    if(SRIO_PORT_STATUS[port_num]==FVL_INIT_READY)
    {
        FVL_LOG("The port:%d has been inited ready,don't need to be inited again!\n",port_num);
        return -1;    	
    }
    
    if(!init_flag)    
    {
        of_init();
        rvl = fsl_srio_uio_init(&sriodev);
        if (rvl < 0) 
        {
            FVL_LOG("%s(): fsl_srio_uio_init return %d\n", __func__, rvl);
            return rvl;
        }
        psrio->sriodev=sriodev;
        init_flag=1;
    }
    else
    {
        sriodev=psrio->sriodev;
    }

//mode master
    uint32_t offset=0;
    int j=FVL_PORT_CHAN_NUM_MAX*port_num;
    for(i=0;i<chan_num;i++)
    {
        uint32_t buf_num=srio_param->buf_num[i];
        uint32_t buf_size=(srio_param->buf_size[i]/FVL_BUFSIZE_unit);
        uint32_t chan_size=buf_size*buf_num*FVL_BUFSIZE_unit;
        head_port[port_num].channel[i].receive_cluster.buf_size=buf_size;
        head_port[port_num].channel[i].receive_cluster.buf_num=buf_num;
        head_port[port_num].channel[i].receive_cluster.cluster_addr=FVL_SRIO_SYS_ADDR+offset;
        head_port[port_num].channel[i].send_cluster.buf_size=buf_size;
        head_port[port_num].channel[i].send_cluster.buf_num=buf_num;
        head_port[port_num].channel[i].send_cluster.cluster_addr=FVL_SRIO_SYS_ADDR+offset;
        head_port[port_num].symbol=FVL_SRIO_SYMBOL;
        head_port[port_num].status=FVL_SRIO_STATUS;
        head_port[port_num].cmd=FVL_INIT_CMD;
        offset=offset+chan_size;
        srio_channel_context[(j+i)].chan_size=chan_size; 
        srio_channel_context[(j+i)].buf_size=srio_param->buf_size[i];
        srio_channel_context[(j+i)].buf_num=buf_num;
        win_size=win_size+chan_size;
        FVL_LOG("channel:%d buf_size:%d buf_num: %d chan_size:%08x\n",(j+i),srio_param->buf_size[i],buf_num,chan_size);
//head channel init 
    }
    psrio->chan_num[port_num] = chan_num;
    source_id[port_num]=srio_param->source_id;
    target_id[port_num]=srio_param->target_id;
    
    FVL_LOG("port_num:%d target_id:%04x source_id:%04x\n",port_num,target_id[port_num],source_id[port_num]);
//end master
    struct srio_port_info *pinfo;
    void *range;
    pinfo = &psrio->portpool[port_num].port_info;
    fsl_srio_connection(sriodev,port_num);
    if (fsl_srio_port_connected(sriodev) & (0x1 << port_num)) 
    {
        fsl_srio_get_port_info(sriodev, port_num+1, pinfo, &range);
        psrio->portpool[port_num].range_virt = range;
    } 
    else 
    {
        FVL_LOG("%s(): fsl_srio_connection port %d failed\n", __func__, port_num+1);
        return -1;
    }
    rvl = fsl_srio_port_connected(sriodev);
    if (rvl <= 0) 
    {
        FVL_LOG("%s(): fsl_srio_port_connected return %d\n", __func__, rvl);
        return -1;
    }
    
    rvl = dma_pool_init(&port_dma_ctl_wp,ctl_win_size,ctl_win_size/2);
    if(rvl!=0)
    {
        FVL_LOG("port %d dma_pool_init failed!\n",port_num+1);
        return -errno;
    }
    rvl = dma_pool_init(&port_dma_ctl_wr,ctl_win_size,ctl_win_size/2);
    if(rvl!=0)
    {
        FVL_LOG("port %d dma_pool_init failed!\n",port_num+1);
        return -errno;
    }
 
    uint32_t attr_read, attr_write;
    attr_read = srio_test_win_attrv[3];
    attr_write = srio_test_win_attrv[0];
    FVL_LOG("attr_write = %u, srio_type = 0\n", attr_write);
        
    ppool = &psrio->portpool[port_num];
    ppool->write_result = port_dma_wr->dma_phys_base;
    ppool->pwrite_result = port_dma_wr->dma_virt_base;

    ppool->write_ctl_result = port_dma_ctl_wr->dma_phys_base;
    ppool->write_ctl_data = port_dma_ctl_wp->dma_phys_base;
    ppool->pwrite_ctl_result = port_dma_ctl_wr->dma_virt_base;
    ppool->pwrite_ctl_data = port_dma_ctl_wp->dma_virt_base;
   
    win_law=FVL_BASE_LAW+fvl_get_law((win_size/FVL_BASE_LAW_SIZE)-1);
  //  ctl_law=FVL_BASE_LAW+fvl_get_law((ctl_win_size/FVL_BASE_LAW_SIZE)-1);
   
 
    FVL_LOG("HOST WIN_LAW:%d CTL_LAW:%d\n",win_law,ctl_law);
     
    fsl_srio_set_ibwin(sriodev, port_num, 1, ppool->write_result,
            FVL_SRIO_SYS_ADDR, win_law);
    fsl_srio_set_ibwin(sriodev, port_num, 2, ppool->write_ctl_result,
            FVL_SRIO_CTL_ADDR, ctl_law);

    uint32_t win_offset=FVL_BASE_LAW_SIZE;

    for(i=FVL_BASE_LAW;i<win_law;i++)
    {
        win_offset=win_offset*2;
    }

    FVL_LOG("HOST WIN_OFFSET:%d\n",win_offset);

    ppool->ctl_info_start=ppool->port_info.range_start+win_offset;

    if (fsl_srio_port_connected(sriodev) & (0x1 << port_num)) 
    {
//ctl
        fsl_srio_set_obwin(sriodev, port_num, 2,
                ppool->port_info.range_start+win_offset,
                FVL_SRIO_CTL_ADDR, ctl_law);
        fsl_srio_set_obwin_attr(sriodev, port_num, 2,
                attr_read, attr_write);
//data
        fsl_srio_set_obwin(sriodev, port_num, 1,
                ppool->port_info.range_start,
                FVL_SRIO_SYS_ADDR, win_law);
        fsl_srio_set_obwin_attr(sriodev, port_num, 1,
                attr_read, attr_write);
    } 
    else 
    {
        FVL_LOG("SRIO port %d error!\n", port_num + 1);
        return -errno;
    }

    rvl=fsl_srio_set_deviceid(sriodev,port_num,source_id[port_num]);
    if(rvl!=0)
    {
        FVL_LOG("SRIO port %d set  source_id faile!\n",port_num);
        return -errno;
    }
    rvl=fsl_srio_set_targetid(sriodev,port_num,1,target_id[port_num]);
    if(rvl!=0)
    {
        FVL_LOG("SRIO port %d set  target_id faile!\n",port_num);
        return -errno;
    }
    rvl=fsl_srio_set_targetid(sriodev,port_num,2,target_id[port_num]);
    if(rvl!=0)
    {
        FVL_LOG("SRIO port %d set  target_id faile!\n",port_num);
        return -errno;
    }
    fsl_srio_set_phy_retry_threshold(sriodev,port_num,0,0);

    memset(port_dma_wr->dma_virt_base,0,win_size);        
    memset(port_dma_ctl_wp->dma_virt_base,0,ctl_win_size);        
    memset(port_dma_ctl_wr->dma_virt_base,0,ctl_win_size);        
    
    fvl_srio_channel_t *temp_channel;
    j=FVL_PORT_CHAN_NUM_MAX*port_num;
    for(i=0;i<FVL_PORT_CHAN_NUM_MAX;i++)
    {
        pscb=fvl_srio_getcb(port_num,i*2);
        if(pscb==NULL)
        {
            FVL_LOG("port:%d channel:%d : dmadev init error.\n",port_num+1,2*i);
            return -1;
        }
        temp_channel=&srio_channel_context[(j+i)];
        cscb=&(temp_channel->chanblk);
        cscb->dmadev=pscb->dmadev;
        cscb->bfnum=pscb->bfnum;
        cscb->port = pscb->port;
        pscb=fvl_srio_getcb(port_num,i*2+1);
        if(pscb==NULL)
        {
            FVL_LOG("port:%d channel:%d : dmadev init error.\n",port_num+1,2*i+1);
            return -1;
        }
        re_cscb=&(temp_channel->rechanblk);
        re_cscb->dmadev=pscb->dmadev;
        re_cscb->bfnum=pscb->bfnum;
        re_cscb->port = pscb->port;
    }    

    pthread_mutex_init(&mutex[port_num],NULL);  

//mode master
//need send packet_info out 
    memcpy(ppool->pwrite_ctl_data,&head_port[port_num],256);
    uint64_t dest_phys,src_phys;
    src_phys=ppool->write_ctl_data;
    dest_phys=ppool->ctl_info_start;

    pscb=&psrio->ctrlblk[FVL_PORT_DMA_NUM*port_num+7];

    pthread_mutex_lock(&mutex[port_num]); 
    rvl = fvl_srio_send(pscb->dmadev,src_phys,dest_phys,256);
    if(rvl!=0)
    {
        error_count[port_num]++;
        FVL_LOG("DMA do't response times:%lu\n",error_count[port_num]);
    }
    pthread_mutex_unlock(&mutex[port_num]);

    FVL_LOG("PORT_NUM:%d HEAD_INFO_SIZE:256\n",port_num);
    head_arg.num = port_num;
    head_arg.op_mode = 0;
    head_arg.buf_virt=ppool->pwrite_ctl_result;
    rvl=fvl_srio_recv_head_master(&head_arg);
    if(rvl!=0)
    {
        FVL_LOG("Host:Port %d  is not ready!\n",port_num);
        return -1;
    }
    
    return 0;
}
Пример #15
0
extern "C" int
start_gen(int argc, const char **argv, struct image_header *uimage, void *fdt)
{
	stage2_args args;

	clear_bss();
		// call C++ constructors before doing anything else
	call_ctors();
	args.heap_size = HEAP_SIZE;
	args.arguments = NULL;
	args.arguments_count = 0;
	args.platform.boot_tgz_data = NULL;
	args.platform.boot_tgz_size = 0;
	args.platform.fdt_data = NULL;
	args.platform.fdt_size = 0;

	gUImage = uimage;
	gFDT = fdt;	//XXX: make a copy?
		// TODO: check for atags instead and convert them

	if (argv) {
		// skip the kernel name
		++argv;
		--argc;
	}
	// TODO: Ensure cmdline is mapped into memory by MMU before usage.

	// if we get passed a uimage, try to find the third blob
	// only if we do not have FDT data yet
	if (gUImage != NULL
		&& !gFDT
		&& image_multi_getimg(gUImage, 2,
			(uint32*)&args.platform.fdt_data,
			&args.platform.fdt_size)) {
		// found a blob, assume it is FDT data, when working on a platform
		// which does not have an FDT enabled U-Boot
		gFDT = args.platform.fdt_data;
	}

	// We have to cpu_init *before* calling FDT functions
	cpu_init();

	serial_init(gFDT);

	#if defined(__ARM__)
	arch_mailbox_init();
	#endif

	// initialize the OpenFirmware wrapper
	of_init(NULL);

	console_init();

	// if we get passed an FDT, check /chosen for initrd and bootargs
	if (gFDT != NULL) {
		int node = fdt_path_offset(gFDT, "/chosen");
		const void *prop;
		int len;
		phys_addr_t initrd_start = 0, initrd_end = 0;

		if (node >= 0) {
			prop = fdt_getprop(gFDT, node, "linux,initrd-start", &len);
			if (prop && len == 4)
				initrd_start = fdt32_to_cpu(*(uint32_t *)prop);
			prop = fdt_getprop(gFDT, node, "linux,initrd-end", &len);
			if (prop && len == 4)
				initrd_end = fdt32_to_cpu(*(uint32_t *)prop);
			if (initrd_end > initrd_start) {
				args.platform.boot_tgz_data = (void *)initrd_start;
				args.platform.boot_tgz_size = initrd_end - initrd_start;
				dprintf("Found boot tgz from FDT @ %p, %" B_PRIu32 " bytes\n",
					args.platform.boot_tgz_data, args.platform.boot_tgz_size);
			}
			// we check for bootargs after remapping the FDT
		}
	}

	// if we get passed a uimage, try to find the second blob
	if (gUImage != NULL
		&& image_multi_getimg(gUImage, 1,
			(uint32*)&args.platform.boot_tgz_data,
			&args.platform.boot_tgz_size)) {
		dprintf("Found boot tgz from uimage @ %p, %" B_PRIu32 " bytes\n",
			args.platform.boot_tgz_data, args.platform.boot_tgz_size);
	}

	{ //DEBUG:
		int i;
		dprintf("argc = %d\n", argc);
		for (i = 0; i < argc; i++)
			dprintf("argv[%d] @%lx = '%s'\n", i, (uint32)argv[i], argv[i]);
		dprintf("os: %d\n", (int)gUBootOS);
		dprintf("gd @ %p\n", gUBootGlobalData);
		if (gUBootGlobalData) {
			dprintf("gd->bd @ %p\n", gUBootGlobalData->bd);
			dprintf("gd->fb_base @ %p\n", (void*)gUBootGlobalData->fb_base);
		}
		if (gUImage)
			dump_uimage(gUImage);
		if (gFDT)
			dump_fdt(gFDT);
	}
	
	if (args.platform.boot_tgz_size > 0) {
		insert_physical_allocated_range((addr_t)args.platform.boot_tgz_data,
			args.platform.boot_tgz_size);
	}

	// save the size of the FDT so we can map it easily after mmu_init
	size_t fdtSize = gFDT ? fdt_totalsize(gFDT) : 0;
	dprintf("fdtSize: 0x%" B_PRIxSIZE "\n", fdtSize);

	mmu_init();

	// Handle our tarFS post-mmu
	if (args.platform.boot_tgz_size > 0) {
		args.platform.boot_tgz_data = (void*)mmu_map_physical_memory((addr_t)
			args.platform.boot_tgz_data, args.platform.boot_tgz_size,
			kDefaultPageFlags);
	}
	// .. and our FDT
	if (gFDT != NULL)
		gFDT = (void*)mmu_map_physical_memory((addr_t)gFDT, fdtSize, kDefaultPageFlags);

	// if we get passed an FDT, check /chosen for bootargs now
	// to avoid having to copy them.
	if (gFDT != NULL) {
		int node = fdt_path_offset(gFDT, "/chosen");
		const void *prop;
		int len;

		if (node >= 0) {
			prop = fdt_getprop(gFDT, node, "bootargs", &len);
			if (prop) {
				dprintf("Found bootargs: %s\n", (const char *)prop);
				static const char *sArgs[] = { NULL, NULL };
				sArgs[0] = (const char *)prop;
				// override main() args
				args.arguments = sArgs;
				args.arguments_count = 1;
			}
		}
		dprintf("args.arguments_count = %" B_PRId32 "\n", args.arguments_count);
		for (int i = 0; i < args.arguments_count; i++)
			dprintf("args.arguments[%d] @%lx = '%s'\n", i,
				(uint32)args.arguments[i], args.arguments[i]);
	}

	// wait a bit to give the user the opportunity to press a key
//	spin(750000);

	// reading the keyboard doesn't seem to work in graphics mode
	// (maybe a bochs problem)
//	sBootOptions = check_for_boot_keys();
	//if (sBootOptions & BOOT_OPTION_DEBUG_OUTPUT)
		serial_enable();

	main(&args);
	return 0;
}
Пример #16
0
/* The main() function/thread creates the worker threads and then waits for
 * threads to exit or ctrl-c. All code outside the main() function is used by
 * the worker threads. */
int main(int argc, char *argv[])
{
	struct worker *workers;
	char *endptr;
	size_t sz = DMA_MAP_SIZE;
	/* Determine number of cores (==number of threads) */
	long ncpus = sysconf(_SC_NPROCESSORS_ONLN);
	/* Load the device-tree driver */
	int loop, tmpret, teardown, ret = of_init();

	while (ARGINC() > 0) {
		if (!strcmp(*argv, "-n")) {
			unsigned long val;
			if (!ARGINC()) {
				fprintf(stderr, "Missing argument to -n\n");
				exit(EXIT_FAILURE);
			}
			val = strtoul(*argv, &endptr, 0);
			if ((val == ULONG_MAX) || (*endptr != '\0')) {
				fprintf(stderr, "Invalid argument to -n (%s)\n",
					*argv);
				exit(EXIT_FAILURE);
			}
			if (!val || (val > ncpus)) {
				fprintf(stderr, "Out of range (-n %lu)\n", val);
				exit(EXIT_FAILURE);
			}
			ncpus = val;
		} else if (!strcmp(*argv, "-p")) {
			if (!ARGINC()) {
				fprintf(stderr, "Missing argument to -p\n");
				exit(EXIT_FAILURE);
			}
			PCD_PATH = *argv;
		} else if (!strcmp(*argv, "-c")) {
			if (!ARGINC()) {
				fprintf(stderr, "Missing argument to -c\n");
				exit(EXIT_FAILURE);
			}
			CFG_PATH = *argv;
		} else if (!strcmp(*argv, "-s")) {
			unsigned long val;
			if (!ARGINC()) {
				fprintf(stderr, "Missing argument to -s\n");
				exit(EXIT_FAILURE);
			}
			val = strtoul(*argv, &endptr, 0);
			if ((val == ULONG_MAX) || (*endptr != '\0') || !val) {
				fprintf(stderr, "Invalid argument to -s (%s)\n",
					*argv);
				exit(EXIT_FAILURE);
			}
			sz = (size_t)val;
		} else if (!strcmp(*argv, "-sc")) {
			short_circuit_mode = 1;
		} else if (!strcmp(*argv, "-b")) {
			unsigned long val;
			if (!ARGINC()) {
				fprintf(stderr, "Missing argument to -b\n");
				exit(EXIT_FAILURE);
			}
			val = strtoul(*argv, &endptr, 0);
			if ((val == ULONG_MAX) || (*endptr != ':'))
				goto b_err;
			bpool_cnt[0] = val;
			val = strtoul(endptr + 1, &endptr, 0);
			if ((val == ULONG_MAX) || (*endptr != ':'))
				goto b_err;
			bpool_cnt[1] = val;
			val = strtoul(endptr + 1, &endptr, 0);
			if ((val == ULONG_MAX) || (*endptr != '\0'))
				goto b_err;
			bpool_cnt[2] = val;
			continue;
b_err:
			fprintf(stderr, "Invalid argument to -b (%s)\n", *argv);
			exit(EXIT_FAILURE);
		} else {
			fprintf(stderr, "Unknown argument '%s'\n", *argv);
			exit(EXIT_FAILURE);
		}
	}

	printf("Starting hello_reflector, ncpus=%ld\n", ncpus);

	if (ncpus < 1) {
		fprintf(stderr, "Fail: # processors: %ld\n", ncpus);
		exit(EXIT_FAILURE);
	}
	if (ret) {
		fprintf(stderr, "Fail: %s: %d\n", "of_init()", ret);
		exit(EXIT_FAILURE);
	}
	/* Parse FMC policy and configuration files for the network
	 * configuration. This also "extracts" other settings into 'netcfg' that
	 * are not necessarily from the XML files, such as the pool channels
	 * that the application is allowed to use (these are currently
	 * hard-coded into the netcfg code). */
	netcfg = usdpaa_netcfg_acquire(PCD_PATH, CFG_PATH);
	if (!netcfg) {
		fprintf(stderr, "Fail: usdpaa_netcfg_acquire(%s,%s)\n",
			PCD_PATH, CFG_PATH);
		exit(EXIT_FAILURE);
	}
	if (!netcfg->num_ethports) {
		fprintf(stderr, "Fail: no network interfaces available\n");
		exit(EXIT_FAILURE);
	}
	/* Install ctrl-c handler */
	if (signal(SIGINT, handle_sigint) == SIG_ERR) {
		fprintf(stderr, "Fail: %s\n", "signal(SIGINT)");
		exit(EXIT_FAILURE);
	}
	/* Allocate the worker structs */
	ret = posix_memalign((void **)&workers, MAX_CACHELINE,
			     ncpus * sizeof(*workers));
	if (ret) {
		fprintf(stderr, "Fail: %s: %d\n", "posix_memalign()", ret);
		exit(EXIT_FAILURE);
	}
	/* Load the Qman/Bman drivers */
	ret = qman_global_init();
	if (ret) {
		fprintf(stderr, "Fail: %s: %d\n", "qman_global_init()", ret);
		exit(EXIT_FAILURE);
	}
	ret = bman_global_init();
	if (ret) {
		fprintf(stderr, "Fail: %s: %d\n", "bman_global_init()", ret);
		exit(EXIT_FAILURE);
	}
	ret = qman_alloc_pool_range(&pchannels[0], NUM_POOL_CHANNELS, 1, 0);
	if (ret != NUM_POOL_CHANNELS) {
		fprintf(stderr, "Fail: no pool channels available\n");
		exit(EXIT_FAILURE);
	}
	/* Compute SDQCR */
	for (loop = 0; loop < NUM_POOL_CHANNELS; loop++)
		sdqcr |= QM_SDQCR_CHANNELS_POOL_CONV(pchannels[loop]);
	/* Load dma_mem driver */
	dma_mem_generic = dma_mem_create(DMA_MAP_FLAG_ALLOC, NULL, sz);
	if (!dma_mem_generic) {
		fprintf(stderr, "Fail: %s:\n", "dma_mem_create()");
		exit(EXIT_FAILURE);
	}
	printf("DMA region created of size %zu (0x%zx)\n", sz, sz);
	/* Start up the threads */
	for (loop = 0; loop < ncpus; loop++) {
		struct worker *worker = &workers[loop];
		worker->quit = worker->init_done = 0;
		worker->cpu = loop;
		ret = pthread_create(&worker->id, NULL, worker_fn, worker);
		if (ret) {
			fprintf(stderr, "Fail: %s(%d): %d\n", "pthread_create",
				loop, ret);
			while (--loop >= 0) {
				(--worker)->quit = 1;
				tmpret = pthread_join(worker->id, NULL);
				if (tmpret)
					fprintf(stderr, "Fail: %s(%d): %d\n",
						"pthread_join", loop, tmpret);
			}
			exit(EXIT_FAILURE);
		}
		/* Wait for thread init to complete (the first thread will
		 * complete global init as part of that) */
		while (!worker->init_done) {
			pthread_yield();
			if (!pthread_tryjoin_np(worker->id, NULL)) {
				fprintf(stderr, "Fail: primary thread init\n");
				exit(EXIT_FAILURE);
			}
		}
	}

	/* Threads are created, now manage them (and catch ctrl-c) */
	printf("Hit Ctrl-C (or send SIGINT) to terminate.\n");
	teardown = 0;
	while (ncpus) {
		if (!teardown) {
			if (received_sigint) {
				/* Ctrl-c signal triggers teardown */
				teardown = 1;
				printf("Ctrl-C, ending...\n");
				/* Non-primary threads should quit first */
				for (loop = 1; loop < ncpus; loop++)
					workers[loop].quit = 1;
			} else
				/* No teardown, no signal, this is where we can
				 * pause */
				sleep(1);
		} else {
			/* Once the primary thread is the only thread, it can
			 * quit too (global cleanup) */
			if (ncpus == 1)
				workers[0].quit = 1;
		}
		/* Reap loop */
		loop = 0;
		while (loop < ncpus) {
			struct worker *worker = &workers[loop];
			if (!pthread_tryjoin_np(worker->id, NULL)) {
				fprintf(stderr, "Exit: thread %d\n",
					worker->cpu);
				if (--ncpus > loop)
					memmove(worker, worker + 1,
						(ncpus - loop) *
						sizeof(*worker));
			} else
				loop++;
		}
	}
	qman_release_pool_range(pchannels[0], NUM_POOL_CHANNELS);

	printf("Finished hello_reflector\n");
	return 0;
}
Пример #17
0
Файл: q.c Проект: Cai900205/test
int main(int argc, char *argv[])
{
	struct srio_dev *sriodev;
	struct dma_ch *send_dmadev[SEND_THREAD_NUM];
	struct dma_ch *receive_dmadev[RECEIVE_THREAD_NUM];
	struct dma_pool *dmapool = NULL;
	int i, err;
	struct srio_port_data *port_data;
	uint32_t attr_read, attr_write;
	struct task_arg_type task_arg_send[SEND_THREAD_NUM];
	struct task_arg_type task_arg_receive[RECEIVE_THREAD_NUM];
	pthread_t send_id[SEND_THREAD_NUM];
	pthread_t receive_id[RECEIVE_THREAD_NUM];

	of_init();
	err = fsl_srio_uio_init(&sriodev);
	if (err < 0)
		error(EXIT_FAILURE, -err, "%s(): srio_uio_init()", __func__);

	port_num = fsl_srio_get_port_num(sriodev);

	memset(&cmd_param, 0, sizeof(cmd_param));
	cmd_param.port = malloc(sizeof(struct cmd_port_param) * port_num);
	if (!cmd_param.port) {
		error(0, errno, "%s(): command port", __func__);
		goto err_cmd_malloc;
	}
	memset(cmd_param.port, 0, sizeof(struct cmd_port_param));
/*ctx add*/
	err = cmd_translate(argc, argv);
	if (err < 0)
		cmd_format_print();

	printf("packet size:%d\n",sizeof(struct srio_packet));
	port_data = malloc(sizeof(struct srio_port_data) * port_num);
	if (!port_data) {
		error(0, errno, "%s(): port_data", __func__);
		goto err_cmd_malloc;
	}

	for (i = 0; i < port_num; i++) {
		fsl_srio_connection(sriodev, i);
		fsl_srio_get_port_info(sriodev, i + 1, &port_data[i].port_info,
				       &port_data[i].range_virt);
	}

	err = fsl_srio_port_connected(sriodev);
	if (err <= 0) {
		error(0, -err, "%s(): fsl_srio_port_connected", __func__);
		goto err_srio_connected;
	}
	return 0;

	err = dma_pool_init(&dmapool);
	uint8_t port = cmd_param.curr_port_id;
	attr_read = srio_test_win_attrv[3];
	attr_write = srio_test_win_attrv[cmd_param.test_srio_type];

	for (i = 0; i < port_num; i++) {
		dma_addr_t port_phys_base =
			dmapool->dma_phys_base + SRIO_POOL_PORT_OFFSET * i;
		port_data[i].phys.write_recv_data = port_phys_base;
		port_data[i].phys.read_recv_data =
			port_phys_base + SRIO_POOL_SECT_SIZE;
		port_data[i].phys.write_data_prep =
			port_phys_base + SRIO_POOL_SECT_SIZE * 2;
		port_data[i].phys.res =
			port_phys_base + SRIO_POOL_SECT_SIZE * 3;
		
		port_data[i].virt = (typeof(port_data[i].virt))
			(dmapool->dma_virt_base + i * SRIO_POOL_PORT_OFFSET);
		fsl_srio_set_ibwin(sriodev, i, 1,
				   port_data[i].phys.write_recv_data,
				   SRIO_SYS_ADDR, LAWAR_SIZE_16M);
		
		if (fsl_srio_port_connected(sriodev) & (0x1 << i)) {
			fsl_srio_set_obwin(sriodev, i, 1,
				   port_data[i].port_info.range_start,
				   SRIO_SYS_ADDR, LAWAR_SIZE_16M);
			fsl_srio_set_obwin_attr(sriodev, i, 1,
					attr_read, attr_write);
		} else {
			printf("SRIO port %d error!\n", i + 1);
			return -errno;
		}
		memset(port_data[i].virt,0,SRIO_POOL_PORT_OFFSET);
	}
/*ctx add*/
	for(i=0;i<1;i++)
	{
		
		err = fsl_dma_chan_init(&send_dmadev[i], 0, i);	
		if (err < 0) {
			error(0, -err, "%s(): fsl_dma_chan_init()", __func__);
			goto err_srio_connected;
		}
		err = fsl_dma_chan_init(&receive_dmadev[i], 1, i);
		if (err < 0) {
			error(0, -err, "%s(): fsl_dma_chan_init()", __func__);
			goto err_srio_connected;
		}
		fsl_dma_chan_basic_direct_init(send_dmadev[i]);
		fsl_dma_chan_bwc(send_dmadev[i], DMA_BWC_1024);
		task_arg_send[i].dmadev = send_dmadev[i];
		
		fsl_dma_chan_basic_direct_init(receive_dmadev[i]);
		fsl_dma_chan_bwc(receive_dmadev[i], DMA_BWC_1024);
		task_arg_receive[i].dmadev = receive_dmadev[i];
		
		
		task_arg_receive[i].port_data_thread.phys.write_recv_data=port_data[1-port].phys.write_recv_data+THREAD_WIN_SIZE*i;
		task_arg_receive[i].port_data_thread.phys.read_recv_data=port_data[1-port].phys.read_recv_data+THREAD_WIN_SIZE*i;
		task_arg_receive[i].port_data_thread.phys.write_data_prep=port_data[1-port].phys.write_data_prep+THREAD_WIN_SIZE*i;
		task_arg_receive[i].port_data_thread.phys.res=port_data[1-port].phys.res+THREAD_WIN_SIZE*i;
		
		task_arg_receive[i].port_data_thread.virt.write_recv_data = &port_data[1-port].virt->write_recv_data_t[i][0];
		
		task_arg_receive[i].port_data_thread.virt.read_recv_data = &port_data[1-port].virt->read_recv_data_t[i][0];
		
		task_arg_receive[i].port_data_thread.virt.write_data_prep = &port_data[1-port].virt->write_data_prep_t[i][0];
		
		task_arg_receive[i].port_data_thread.virt.res = &port_data[1-port].virt->res_t[i][0];
		
		task_arg_receive[i].port_data_thread.port_info.range_start = port_data[1-port].port_info.range_start+THREAD_WIN_SIZE*i; 
		
		task_arg_receive[i].port = 1-port;
		task_arg_receive[i].srio_type = cmd_param.test_srio_type;
		task_arg_receive[i].cpu = i+SEND_THREAD_NUM+2;/*bind cpu*/
		
		err = pthread_create(&receive_id[i],NULL,t_srio_receive,&task_arg_receive[i]);
		if (err) {
			printf("Port %d : Receive thread failed!\n",2-port);
			return -errno;
		} 
		
		/* ctx add*/
		task_arg_send[i].port_data_thread.phys.write_recv_data=port_data[port].phys.write_recv_data+THREAD_WIN_SIZE*i;
		task_arg_send[i].port_data_thread.phys.read_recv_data=port_data[port].phys.read_recv_data+THREAD_WIN_SIZE*i;
		task_arg_send[i].port_data_thread.phys.write_data_prep=port_data[port].phys.write_data_prep+THREAD_WIN_SIZE*i;
		task_arg_send[i].port_data_thread.phys.res=port_data[port].phys.res+THREAD_WIN_SIZE*i;
		task_arg_send[i].port_data_thread.virt.write_recv_data = &port_data[port].virt->write_recv_data_t[i][0];
		task_arg_send[i].port_data_thread.virt.read_recv_data = &port_data[port].virt->read_recv_data_t[i][0];
		task_arg_send[i].port_data_thread.virt.write_data_prep = &port_data[port].virt->write_data_prep_t[i][0];
		task_arg_send[i].port_data_thread.virt.res = &port_data[port].virt->res_t[i][0];
		task_arg_send[i].port_data_thread.port_info.range_start = port_data[port].port_info.range_start+THREAD_WIN_SIZE*i; 
		/* cta end*/
		task_arg_send[i].port = port;
		task_arg_send[i].srio_type = cmd_param.test_srio_type;
		task_arg_send[i].cpu = i+2;/*bind cpu*/

		err = pthread_create(&send_id[i], NULL,t_srio_send, &task_arg_send[i]);
		if (err) {
			printf("Port %d : Send thread failed!\n",port + 1);
			return -errno;
		} 	
	}
/*multiple*/
	for(i=1;i<SEND_THREAD_NUM;i++)
	{
		
		err = fsl_dma_chan_init(&send_dmadev[i], 0, i);	
		if (err < 0) {
			error(0, -err, "%s(): fsl_dma_chan_init()", __func__);
			goto err_srio_connected;
		}
		err = fsl_dma_chan_init(&receive_dmadev[i], 1, i);
		if (err < 0) {
			error(0, -err, "%s(): fsl_dma_chan_init()", __func__);
			goto err_srio_connected;
		}
		fsl_dma_chan_basic_direct_init(send_dmadev[i]);
		fsl_dma_chan_bwc(send_dmadev[i], DMA_BWC_1024);
		task_arg_send[i].dmadev = send_dmadev[i];
		
		fsl_dma_chan_basic_direct_init(receive_dmadev[i]);
		fsl_dma_chan_bwc(receive_dmadev[i], DMA_BWC_1024);
		task_arg_receive[i].dmadev = receive_dmadev[i];
		
		/* ctx add*/
		task_arg_send[i].port_data_thread.phys.write_recv_data=port_data[port].phys.write_recv_data+THREAD_WIN_SIZE*i;
		task_arg_send[i].port_data_thread.phys.read_recv_data=port_data[port].phys.read_recv_data+THREAD_WIN_SIZE*i;
		task_arg_send[i].port_data_thread.phys.write_data_prep=port_data[port].phys.write_data_prep+THREAD_WIN_SIZE*i;
		task_arg_send[i].port_data_thread.phys.res=port_data[port].phys.res+THREAD_WIN_SIZE*i;
		task_arg_send[i].port_data_thread.virt.write_recv_data = &port_data[port].virt->write_recv_data_t[i][0];
		task_arg_send[i].port_data_thread.virt.read_recv_data = &port_data[port].virt->read_recv_data_t[i][0];
		task_arg_send[i].port_data_thread.virt.write_data_prep = &port_data[port].virt->write_data_prep_t[i][0];
		task_arg_send[i].port_data_thread.virt.res = &port_data[port].virt->res_t[i][0];
		task_arg_send[i].port_data_thread.port_info.range_start = port_data[port].port_info.range_start+THREAD_WIN_SIZE*i; 
		/* cta end*/
		task_arg_send[i].port = port;
		task_arg_send[i].srio_type = cmd_param.test_srio_type;
		task_arg_send[i].cpu = i+2;/*bind cpu*/

		err = pthread_create(&send_id[i], NULL,t_srio_receive, &task_arg_send[i]);
		if (err) {
			printf("Port %d : Send thread failed!\n",port + 1);
			return -errno;
		} 
		
		task_arg_receive[i].port_data_thread.phys.write_recv_data=port_data[1-port].phys.write_recv_data+THREAD_WIN_SIZE*i;
		task_arg_receive[i].port_data_thread.phys.read_recv_data=port_data[1-port].phys.read_recv_data+THREAD_WIN_SIZE*i;
		task_arg_receive[i].port_data_thread.phys.write_data_prep=port_data[1-port].phys.write_data_prep+THREAD_WIN_SIZE*i;
		task_arg_receive[i].port_data_thread.phys.res=port_data[1-port].phys.res+THREAD_WIN_SIZE*i;
		
		task_arg_receive[i].port_data_thread.virt.write_recv_data = &port_data[1-port].virt->write_recv_data_t[i][0];
		
		task_arg_receive[i].port_data_thread.virt.read_recv_data = &port_data[1-port].virt->read_recv_data_t[i][0];
		
		task_arg_receive[i].port_data_thread.virt.write_data_prep = &port_data[1-port].virt->write_data_prep_t[i][0];
		
		task_arg_receive[i].port_data_thread.virt.res = &port_data[1-port].virt->res_t[i][0];
		
		task_arg_receive[i].port_data_thread.port_info.range_start = port_data[1-port].port_info.range_start+THREAD_WIN_SIZE*i; 
		
		task_arg_receive[i].port = 1-port;
		task_arg_receive[i].srio_type = cmd_param.test_srio_type;
		task_arg_receive[i].cpu = i+SEND_THREAD_NUM+2;/*bind cpu*/
		
		err = pthread_create(&receive_id[i],NULL,t_srio_send,&task_arg_receive[i]);
		if (err) {
			printf("Port %d : Receive thread failed!\n",2-port);
			return -errno;
		} 
	
	}

	for(i=0;i<SEND_THREAD_NUM;i++)
	{
		pthread_join(send_id[i],NULL);
		pthread_join(receive_id[i],NULL);
	}
/*ctx end*/

	free(port_data);
	free(cmd_param.port);
	for(i=0;i<SEND_THREAD_NUM;i++)
	{
		fsl_dma_chan_finish(send_dmadev[i]);
		fsl_dma_chan_finish(receive_dmadev[i]);
	}
	dma_pool_finish(dmapool);
	fsl_srio_uio_finish(sriodev);

	of_finish();
	return EXIT_SUCCESS;

err_srio_connected:
	free(port_data);
	free(cmd_param.port);
err_cmd_malloc:
	fsl_srio_uio_finish(sriodev);
	of_finish();

	return err;
}
Пример #18
0
extern "C" int
start_raw(int argc, const char **argv)
{
	stage2_args args;

	clear_bss();
		// call C++ constructors before doing anything else
	call_ctors();
	args.heap_size = HEAP_SIZE;
	args.arguments = NULL;
	args.platform.boot_tgz_data = NULL;
	args.platform.boot_tgz_size = 0;
	args.platform.fdt_data = NULL;
	args.platform.fdt_size = 0;

	if (argv) {
		// skip the kernel name
		args.arguments = ++argv;
		args.arguments_count = --argc;
	}

	// if we get passed a uimage, try to find the third blob
	// only if we do not have FDT data yet
	if (gUImage != NULL
		&& !gFDT
		&& image_multi_getimg(gUImage, 2,
			(uint32*)&args.platform.fdt_data,
			&args.platform.fdt_size)) {
		// found a blob, assume it is FDT data, when working on a platform
		// which does not have an FDT enabled U-Boot
		gFDT = args.platform.fdt_data;
	}

	serial_init(gFDT);
	console_init();
	// initialize the OpenFirmware wrapper
	of_init(NULL);

	cpu_init();

	if (args.platform.fdt_data) {
		dprintf("Found FDT from uimage @ %p, %" B_PRIu32 " bytes\n",
			args.platform.fdt_data, args.platform.fdt_size);
	} else if (gFDT) {
		/* Fixup args so we can pass the gFDT on to the kernel */
		args.platform.fdt_data = gFDT;
		args.platform.fdt_size = fdt_totalsize(gFDT);
	}

	// if we get passed an FDT, check /chosen for initrd and bootargs
	if (gFDT != NULL) {
		int node = fdt_path_offset(gFDT, "/chosen");
		const void *prop;
		int len;
		phys_addr_t initrd_start = 0, initrd_end = 0;

		if (node >= 0) {
			prop = fdt_getprop(gFDT, node, "linux,initrd-start", &len);
			if (prop && len == 4)
				initrd_start = fdt32_to_cpu(*(uint32_t *)prop);
			prop = fdt_getprop(gFDT, node, "linux,initrd-end", &len);
			if (prop && len == 4)
				initrd_end = fdt32_to_cpu(*(uint32_t *)prop);
			if (initrd_end > initrd_start) {
				args.platform.boot_tgz_data = (void *)initrd_start;
				args.platform.boot_tgz_size = initrd_end - initrd_start;
				dprintf("Found boot tgz from FDT @ %p, %" B_PRIu32 " bytes\n",
					args.platform.boot_tgz_data, args.platform.boot_tgz_size);
			}
			prop = fdt_getprop(gFDT, node, "bootargs", &len);
			if (prop) {
				dprintf("Found bootargs: %s\n", (const char *)prop);
				static const char *sArgs[] = { NULL, NULL };
				sArgs[0] = (const char *)prop;
				args.arguments = sArgs;
				args.arguments_count = 1;
			}
		}
	}

	// if we get passed a uimage, try to find the second blob
	if (gUImage != NULL
		&& image_multi_getimg(gUImage, 1,
			(uint32*)&args.platform.boot_tgz_data,
			&args.platform.boot_tgz_size)) {
		dprintf("Found boot tgz from uimage @ %p, %" B_PRIu32 " bytes\n",
			args.platform.boot_tgz_data, args.platform.boot_tgz_size);
	}

	{ //DEBUG:
		int i;
		dprintf("argc = %d\n", argc);
		for (i = 0; i < argc; i++)
			dprintf("argv[%d] @%lx = '%s'\n", i, (uint32)argv[i], argv[i]);
		dprintf("os: %d\n", (int)gUBootOS);
		dprintf("gd @ %p\n", gUBootGlobalData);
		if (gUBootGlobalData)
			dprintf("gd->bd @ %p\n", gUBootGlobalData->bd);
		//dprintf("fb_base %p\n", (void*)gUBootGlobalData->fb_base);
		if (gUImage)
			dump_uimage(gUImage);
		if (gFDT)
			dump_fdt(gFDT);
	}
	
	mmu_init();

	// wait a bit to give the user the opportunity to press a key
//	spin(750000);

	// reading the keyboard doesn't seem to work in graphics mode
	// (maybe a bochs problem)
//	sBootOptions = check_for_boot_keys();
	//if (sBootOptions & BOOT_OPTION_DEBUG_OUTPUT)
		serial_enable();

	main(&args);
	return 0;
}
Пример #19
0
int fvl_srio_init(fvl_srio_init_param_t *srio_param)
{
    fvl_srio_context_t  *psrio = &g_srio_context;
    fvl_srio_portpool_t *ppool;
    uint32_t srio_type=0;//srio_param->srio_type;
    uint32_t chan_num=srio_param->chan_num;
    uint32_t buf_num=srio_param->buf_num;
    uint32_t buf_size=srio_param->buf_size;
    uint32_t chan_size=srio_param->chan_size;
    uint32_t target_id = srio_param->target_id;
    uint32_t port_num=srio_param->port_num;
    fvl_dma_pool_t *port_dma_wr = srio_param->port_rd_buf;
    fvl_dma_pool_t *port_dma_ctl_wp;
    fvl_dma_pool_t *port_dma_ctl_wr;

    uint32_t win_size=chan_size*chan_num;
    uint32_t ctl_win_size=256*buf_num*chan_num;
    uint32_t win_law=0,ctl_law=0;
    struct srio_dev *sriodev;
    int rvl;

    if((port_num >= FVL_SRIO_PORT_NUM) || (port_num <0))
    {
        FVL_LOG("port number error:%d\n",port_num);
        return -1;
    }
    if((chan_num > FVL_PORT_DMA_NUM) || ( chan_num<0))
    {
        FVL_LOG("channel number error:%d\n",chan_num);
        return -1;
    }
    
    if(!init_flag)    
    {
        of_init();
        rvl = fsl_srio_uio_init(&sriodev);
        if (rvl < 0) 
        {
            FVL_LOG("%s(): fsl_srio_uio_init return %d\n", __func__, rvl);
            return rvl;
        }
        psrio->sriodev=sriodev;
        init_flag=1;
    }
    else
    {
        sriodev=psrio->sriodev;
    }
    psrio->buf_num[port_num]=buf_num;
    psrio->buf_size[port_num]=buf_size;
    psrio->chan_size[port_num]=chan_size;
    psrio->ctl_size[port_num]=buf_num*256;
    psrio->chan_num[port_num]=chan_num;
        
    struct srio_port_info *pinfo;
    void *range;
    pinfo = &psrio->portpool[port_num].port_info;
    fsl_srio_connection(sriodev,port_num);
    if (fsl_srio_port_connected(sriodev) & (0x1 << port_num)) 
    {
        fsl_srio_get_port_info(sriodev, port_num+1, pinfo, &range);
        psrio->portpool[port_num].range_virt = range;
        FVL_LOG("Get port %u info, range=%p, range_start=%llx\n", port_num, range, pinfo->range_start);
    } 
    else 
    {
        FVL_LOG("%s(): fsl_srio_connection port %d failed\n", __func__, port_num+1);
        return -1;
    }
    
    rvl = fsl_srio_port_connected(sriodev);
    if (rvl <= 0) 
    {
        FVL_LOG("%s(): fsl_srio_port_connected return %d\n", __func__, rvl);
        return -1;
    }
    
    rvl = dma_pool_init(&port_dma_ctl_wp,ctl_win_size,ctl_win_size/2);
    if(rvl!=0)
    {
        FVL_LOG("port %d dma_pool_init failed!\n",port_num+1);
        return -errno;
    }
    rvl = dma_pool_init(&port_dma_ctl_wr,ctl_win_size,ctl_win_size/2);
    if(rvl!=0)
    {
        FVL_LOG("port %d dma_pool_init failed!\n",port_num+1);
        return -errno;
    }
 
    uint32_t attr_read, attr_write;
    attr_read = srio_test_win_attrv[3];
    attr_write = srio_test_win_attrv[srio_type];
    FVL_LOG("attr_write = %u, srio_type = %u\n", attr_write, srio_type);
        
    ppool = &psrio->portpool[port_num];

    ppool->write_result = port_dma_wr->dma_phys_base;
    ppool->pwrite_result = port_dma_wr->dma_virt_base;
    
    ppool->write_ctl_result = port_dma_ctl_wr->dma_phys_base;
    ppool->write_ctl_data = port_dma_ctl_wp->dma_phys_base;
        
    ppool->pwrite_ctl_result = port_dma_ctl_wr->dma_virt_base;
    ppool->pwrite_ctl_data = port_dma_ctl_wp->dma_virt_base;
    
    win_law=FVL_BASE_LAW+fvl_get_law((win_size/FVL_BASE_LAW_SIZE)-1);
    ctl_law=FVL_BASE_LAW+fvl_get_law((ctl_win_size/FVL_BASE_LAW_SIZE)-1);
     
    fsl_srio_set_ibwin(sriodev, port_num, 1, ppool->write_result,
            FVL_SRIO_SYS_ADDR, win_law);
    fsl_srio_set_ibwin(sriodev, port_num, 2, ppool->write_ctl_result,
            FVL_SRIO_CTL_ADDR, ctl_law);
    uint32_t win_offset=FVL_BASE_LAW_SIZE;
    int i=0;
    for(i=FVL_BASE_LAW;i<win_law;i++)
    {
        win_offset=win_offset*2;
    }
    ppool->ctl_info_start=ppool->port_info.range_start+win_offset;

    if (fsl_srio_port_connected(sriodev) & (0x1 << port_num)) 
    {
//data
        fsl_srio_set_obwin(sriodev, port_num, 1,
                ppool->port_info.range_start,
                FVL_SRIO_SYS_ADDR, win_law);
        fsl_srio_set_obwin_attr(sriodev, port_num, 1,
                attr_read, attr_write);
//ctl
        fsl_srio_set_obwin(sriodev, port_num, 2,
                ppool->port_info.range_start+win_offset,
                FVL_SRIO_CTL_ADDR, ctl_law);
        fsl_srio_set_obwin_attr(sriodev, port_num, 2,
                attr_read, attr_write);
    } 
    else 
    {
        FVL_LOG("SRIO port %d error!\n", port_num + 1);
        return -errno;
    }
    rvl=fsl_srio_set_deviceid(sriodev,port_num,source_id[port_num]);
    if(rvl!=0)
    {
        FVL_LOG("SRIO port %d set  source_id faile!\n",port_num);
        return -errno;
    }
    rvl=fsl_srio_set_targetid(sriodev,port_num,1,target_id);
    if(rvl!=0)
    {
        FVL_LOG("SRIO port %d set  target_id faile!\n",port_num);
        return -errno;
    }
    rvl=fsl_srio_set_targetid(sriodev,port_num,2,target_id);
    if(rvl!=0)
    {
        FVL_LOG("SRIO port %d set  target_id faile!\n",port_num);
        return -errno;
    }
    
    memset(port_dma_wr->dma_virt_base,0,win_size);        
    memset(port_dma_ctl_wp->dma_virt_base,0,ctl_win_size);        
    memset(port_dma_ctl_wr->dma_virt_base,0,ctl_win_size);        
//need send packet_info out 
    FVL_LOG("###########Init Complete#########\n");
    return 0;
}
Пример #20
0
int fvl_srio_init(fvl_srio_context_t **ppsrio, uint32_t srio_type)
{
    fvl_srio_context_t  *psrio = &g_srio_context;
    fvl_srio_portpool_t *ppool;
    struct srio_dev *sriodev;
    fvl_dma_pool_t *dmapool = NULL;
    fvl_dma_pool_t *dmapool_ctl=NULL;
    
    int port_num;
    int rvl;
    int i,j;

    of_init();
    rvl = fsl_srio_uio_init(&sriodev);
    if (rvl < 0) {
        FVL_LOG("%s(): fsl_srio_uio_init return %d\n", __func__, rvl);
        return rvl;
    }
        
    port_num = fsl_srio_get_port_num(sriodev);
    if(port_num > FVL_SRIO_PORTNUM) {
        port_num = FVL_SRIO_PORTNUM;
    }

    for (i = 0; i < port_num; i++) {
        struct srio_port_info *pinfo;
        void *range;

        pinfo = &psrio->portpool[i].port_info;
        fsl_srio_connection(sriodev, i);
        if (fsl_srio_port_connected(sriodev) & (0x1 << i)) {
            fsl_srio_get_port_info(sriodev, i+1, pinfo, &range);
            psrio->portpool[i].range_virt = range;
            FVL_LOG("Get port %u info, range=%p, range_start=%llx\n", i, range, pinfo->range_start);
        } else {
            FVL_LOG("%s(): fsl_srio_connection port %d failed\n", __func__, i);
        }
    }

    rvl = fsl_srio_port_connected(sriodev);
    if (rvl <= 0) {
        FVL_LOG("%s(): fsl_srio_port_connected return %d\n", __func__, rvl);
	    fsl_srio_uio_finish(sriodev);
	    of_finish();
        return -1;
    }

    rvl = dma_pool_init(&dmapool,FVL_SRIO_DMA_POOLSIZE,FVL_SRIO_DMA_POOL_PORT_OFFSET);
    rvl = dma_pool_init(&dmapool_ctl,FVL_SRIO_CTL_POOLSIZE,FVL_SRIO_CTL_POOL_PORT_OFFSET);//ctx add

    for (i = 0; i < port_num; i++) {
        dma_addr_t phy_base;
	    dma_addr_t phy_base_ctl;
   	    uint8_t   *vir_base;
	    uint8_t   *vir_base_ctl;
	    uint32_t attr_read, attr_write;

        attr_read = srio_test_win_attrv[3];
        attr_write = srio_test_win_attrv[srio_type];
        printf("attr_write = %u, srio_type = %u\n", attr_write, srio_type);

        ppool = &psrio->portpool[i];

        phy_base = dmapool->dma_phys_base + FVL_SRIO_DMA_POOL_PORT_OFFSET * i;
        phy_base_ctl = dmapool_ctl->dma_phys_base+FVL_SRIO_CTL_POOL_PORT_OFFSET*i;//ctxadd

        for(j=0;j<FVL_SRIO_BUFFER_NUMBER;j++)//ctx add
   	{
              ppool->write_data[j] = phy_base+FVL_SRIO_DMA_BUFSIZE*j;
              ppool->write_ctl_result[j] = phy_base_ctl +FVL_SRIO_CTL_BUFSIZE*j;
              ppool->write_ctl_data[j] = phy_base_ctl + FVL_SRIO_CTL_WINSIZE+FVL_SRIO_CTL_BUFSIZE*j;
        }
        vir_base = dmapool->dma_virt_base + FVL_SRIO_DMA_POOL_PORT_OFFSET * i;
	vir_base_ctl = dmapool_ctl->dma_virt_base+FVL_SRIO_CTL_POOL_PORT_OFFSET*i;
	for(j=0;j<FVL_SRIO_BUFFER_NUMBER;j++)
        {	
              ppool->pwrite_data[j] = vir_base+FVL_SRIO_DMA_BUFSIZE*j;
              ppool->pwrite_ctl_result[j] = vir_base_ctl +FVL_SRIO_CTL_BUFSIZE*j;
              ppool->pwrite_ctl_data[j] = vir_base_ctl + FVL_SRIO_CTL_WINSIZE+FVL_SRIO_CTL_BUFSIZE*j;
	}
        FVL_LOG("Port %d: virt base=%p, phys base=%llx\n", i, vir_base, phy_base);
        fsl_srio_set_ibwin(sriodev, i, 1, ppool->write_result[0],
                FVL_SRIO_SYS_ADDR, LAWAR_SIZE_64M);
        fsl_srio_set_ibwin(sriodev, i, 2, ppool->write_ctl_result[0],
                FVL_SRIO_CTL_ADDR, LAWAR_SIZE_4M);

        if (fsl_srio_port_connected(sriodev) & (0x1 << i)) {
//data
            fsl_srio_set_obwin(sriodev, i, 1,
                    ppool->port_info.range_start,
                    FVL_SRIO_SYS_ADDR, LAWAR_SIZE_64M);
            fsl_srio_set_obwin_attr(sriodev, i, 1,
                    attr_read, attr_write);
//ctl
            fsl_srio_set_obwin(sriodev, i, 2,
                    ppool->port_info.range_start+FVL_SRIO_DMA_WINSIZE,
                    FVL_SRIO_CTL_ADDR, LAWAR_SIZE_4M);
            fsl_srio_set_obwin_attr(sriodev, i, 2,
                    attr_read, attr_write);
        } else {
            printf("SRIO port %d error!\n", i + 1);
            return -errno;
        }
        memset(vir_base, 0, FVL_SRIO_DMA_POOL_PORT_OFFSET);
	memset(vir_base_ctl, 0, FVL_SRIO_CTL_POOL_PORT_OFFSET);
    }
    rvl = fsl_srio_set_targetid(sriodev,0,1,0x11);
    if(rvl !=0)
    {
        printf("set targetid error!\n");
        return -1;
    }
    rvl = fsl_srio_set_targetid(sriodev,0,2,0x11);
    if(rvl !=0)
    {
        printf("set targetid error!\n");
        return -1;
    }
    rvl = fsl_srio_set_targetid(sriodev,1,1,0x14);
    if(rvl !=0)
    {
        printf("set targetid error!\n");
        return -1;
    }
    rvl = fsl_srio_set_targetid(sriodev,1,2,0x14);
    if(rvl !=0)
    {
        printf("set targetid error!\n");
        return -1;
    }
    rvl = fsl_srio_set_deviceid(sriodev,1,0x11);
    if(rvl !=0)
    {
        printf("set deviceid error!\n");
        return -1;
    }
    rvl = fsl_srio_set_deviceid(sriodev,0,0x14);
    if(rvl !=0)
    {
        printf("set deviceid error!\n");
        return -1;
    }

    *ppsrio = psrio;
    return 0;
}
Пример #21
0
void fsl_cpu_init(int cpu, int global, void_func sync_all)
{
	int ret;

	curr_cpu_id = cpu;

	if (global) {
		ret = of_init();
		if (ret) {
			TRACE("of_init() failed\n");
			exit(EXIT_FAILURE);
		}

		ret = fman_init();
		if (ret) {
			TRACE("fman_init() failed\n");
			exit(EXIT_FAILURE);
		}

		ret = bman_global_init();
		if (ret) {
			TRACE("bman_global_init() failed, ret=%d\n", ret);
			exit(EXIT_FAILURE);
		}

		ret = qman_global_init();
		if (ret) {
			TRACE("qman_global_init() failed, ret=%d\n", ret);
			exit(EXIT_FAILURE);
		}

		dma_mem_generic = dma_mem_create(DMA_MAP_FLAG_ALLOC,
						 NULL, HLP_DMA_MEM_256M);
		if (!dma_mem_generic) {
			TRACE("dma_mem_create() failed\n");
			exit(EXIT_FAILURE);
		}
	}

	/* sync until the init done for 'fman, qman, bman,
	   and dma' components */
	if (sync_all != NULL)
		sync_all();

	DEBUG("sync the 1st time\n");

	/* Initialise bman/qman portals */
	ret = bman_thread_init();
	if (ret) {
		TRACE("bman_thread_init(%d) failed, ret=%d\n", cpu, ret);
		exit(EXIT_FAILURE);
	}

	ret = qman_thread_init();
	if (ret) {
		TRACE("qman_thread_init(%d) failed, ret=%d\n", cpu, ret);
		exit(EXIT_FAILURE);
	}

	if (global)
		helper_pool_channel_init();

	/* sync all cores to wait for buffer pool and FQs init done */
	if (sync_all != NULL)
		sync_all();

	/* init application tx fq, the fqid need be modified during run-time */
	local_tx_fq_init();

	/* dequeue rx pool channel for current thread */
	qman_static_dequeue_add(helper_sdqcr);
	DEBUG("sync the 2nd time\n");
}
Пример #22
0
int fvl_srio_init(fvl_srio_init_param_t *srio_param)
{
    fvl_srio_context_t  *psrio = &g_srio_context;
    fvl_srio_portpool_t *ppool;
    fvl_srio_ctrlblk_t *pscb;
    uint32_t srio_type=0;//srio_param->srio_type;
    uint32_t chan_num=srio_param->chan_num;
    uint32_t buf_num=srio_param->buf_num;
    uint32_t buf_size=srio_param->buf_size;
    uint32_t chan_size=srio_param->chan_size;
    uint32_t ctl_size=512;//FVLSRIO_CTL_SIZE;
    uint32_t target_id = srio_param->target_id;
    uint32_t port_num=srio_param->port_num;
    fvl_dma_pool_t *port_dma_wr = srio_param->port_rd_buf;
    fvl_dma_pool_t *port_dma_ctl_wp;
    fvl_dma_pool_t *port_dma_ctl_wr;

    uint32_t win_size=chan_size*chan_num;
    uint32_t ctl_win_size=0x1000;//ctl_size*chan_num;
    uint32_t win_law=0,ctl_law=0;
    struct srio_dev *sriodev;
    int rvl;

    if((port_num >= FVL_SRIO_PORT_NUM) || (port_num <0))
    {
        FVL_LOG("port number error:%d\n",port_num);
        return -1;
    }
    if((chan_num > FVL_PORT_DMA_NUM) || ( chan_num<0))
    {
        FVL_LOG("channel number error:%d\n",chan_num);
        return -1;
    }
    
	if(!init_flag)    
    {
        of_init();
        rvl = fsl_srio_uio_init(&sriodev);
        if (rvl < 0) 
        {
            FVL_LOG("%s(): fsl_srio_uio_init return %d\n", __func__, rvl);
            return rvl;
        }
        psrio->sriodev=sriodev;
        init_flag=1;
    }
    else
    {
        sriodev=psrio->sriodev;
    }

//mode slave
	head_port[port_num].ctl_re_addr=FVL_SRIO_HEAD_ADDR;
    head_port[port_num].chan_num=chan_num;
	head_port[port_num].re_flag=1;
	head_port[port_num].uflag=0;
    int i=0;
    for(i=0;i<chan_num;i++)
	{
        head_channel[i].re_flag=1;
        head_channel[i].uflag=0;
	}

	struct srio_port_info *pinfo;
    void *range;
    pinfo = &psrio->portpool[port_num].port_info;
    fsl_srio_connection(sriodev,port_num);
    if (fsl_srio_port_connected(sriodev) & (0x1 << port_num)) 
    {
        fsl_srio_get_port_info(sriodev, port_num+1, pinfo, &range);
        psrio->portpool[port_num].range_virt = range;
        FVL_LOG("Get port %u info, range=%p, range_start=%llx\n", port_num, range, pinfo->range_start);
    } 
    else 
    {
        FVL_LOG("%s(): fsl_srio_connection port %d failed\n", __func__, port_num+1);
        return -1;
    }
    
    rvl = fsl_srio_port_connected(sriodev);
    if (rvl <= 0) 
    {
        FVL_LOG("%s(): fsl_srio_port_connected return %d\n", __func__, rvl);
        return -1;
    }
    
    rvl = dma_pool_init(&port_dma_ctl_wp,ctl_win_size,ctl_win_size/2);
    if(rvl!=0)
    {
        FVL_LOG("port %d dma_pool_init failed!\n",port_num+1);
        return -errno;
    }
    rvl = dma_pool_init(&port_dma_ctl_wr,ctl_win_size,ctl_win_size/2);
    if(rvl!=0)
    {
        FVL_LOG("port %d dma_pool_init failed!\n",port_num+1);
        return -errno;
    }
 
    uint32_t attr_read, attr_write;
    attr_read = srio_test_win_attrv[3];
    attr_write = srio_test_win_attrv[srio_type];
    FVL_LOG("attr_write = %u, srio_type = %u\n", attr_write, srio_type);
        
    ppool = &psrio->portpool[port_num];

    ppool->write_result = port_dma_wr->dma_phys_base;
    ppool->pwrite_result = port_dma_wr->dma_virt_base;

    ppool->write_ctl_result = port_dma_ctl_wr->dma_phys_base;
    ppool->write_ctl_data = port_dma_ctl_wp->dma_phys_base;
    ppool->pwrite_ctl_result = port_dma_ctl_wr->dma_virt_base;
    ppool->pwrite_ctl_data = port_dma_ctl_wp->dma_virt_base;
   
	ctl_law=FVL_BASE_LAW+fvl_get_law((ctl_win_size/FVL_BASE_LAW_SIZE)-1);
    fsl_srio_set_ibwin(sriodev, port_num, 2, ppool->write_ctl_result,
            FVL_SRIO_HEAD_ADDR, ctl_law);
    rvl=fsl_srio_set_deviceid(sriodev,port_num,source_id[port_num]);
    if(rvl!=0)
    {
        FVL_LOG("SRIO port %d set  source_id faile!\n",port_num);
        return -errno;
    }
    rvl=fsl_srio_set_targetid(sriodev,port_num,1,target_id);
    if(rvl!=0)
    {
        FVL_LOG("SRIO port %d set  target_id faile!\n",port_num);
        return -errno;
    }
    rvl=fsl_srio_set_targetid(sriodev,port_num,2,target_id);
    if(rvl!=0)
    {
        FVL_LOG("SRIO port %d set  target_id faile!\n",port_num);
        return -errno;
    }
    
    memset(port_dma_wr->dma_virt_base,0,win_size);        
    memset(port_dma_ctl_wp->dma_virt_base,0,ctl_win_size);        
    memset(port_dma_ctl_wr->dma_virt_base,0,ctl_win_size);        

//create thread:
    fvl_head_thread_t head_arg;
    head_arg.num = port_num;
    head_arg.op_mode = 0;
    head_arg.buf_virt=ppool->pwrite_ctl_result;

    rvl = pthread_create(&(psrio->chan_id[port_num]), NULL,fvl_srio_recv_head, &head_arg);
    if (rvl) 
    {
        FVL_LOG("Create receive packet thread error!\n");
        return -errno;
    }
    FVL_LOG("SRIO Initial complete\n");    
	return 0;
}
Пример #23
0
int fvl_srio_init(fvl_srio_init_param_t *srio_param)
{
    fvl_srio_context_t  *psrio = &g_srio_context;
    fvl_srio_portpool_t *ppool;
    fvl_srio_ctrlblk_t *pscb,*cscb,*re_cscb;
    fvl_head_thread_t head_arg;
    uint32_t chan_num=srio_param->chan_num;
    uint32_t buf_num=srio_param->buf_num;
    uint32_t buf_size=srio_param->buf_size;
    uint32_t chan_size=srio_param->chan_size;
    uint32_t ctl_size=FVL_CTL_WIN_SIZE;
    uint32_t port_num=srio_param->port_num;
    fvl_dma_pool_t *port_dma_wr = srio_param->port_rd_buf;
    fvl_dma_pool_t *port_dma_ctl_wp;
    fvl_dma_pool_t *port_dma_ctl_wr;

    uint32_t win_size=chan_size*chan_num; //need change
    uint32_t ctl_win_size=0x400000;//ctl_size*chan_num;
    uint32_t win_law=0,ctl_law=0;
    struct srio_dev *sriodev;
    int rvl;
    int i=0;
    if((port_num >= FVL_SRIO_PORT_NUM) || (port_num <0))
    {
        FVL_LOG("port number error:%d\n",port_num);
        return -1;
    }
    if((chan_num > FVL_PORT_CHAN_NUM_MAX) || ( chan_num<0))
    {
        FVL_LOG("channel number error:%d\n",chan_num);
        return -1;
    }
    
    if(!init_flag)    
    {
        of_init();
        rvl = fsl_srio_uio_init(&sriodev);
        if (rvl < 0) 
        {
            FVL_LOG("%s(): fsl_srio_uio_init return %d\n", __func__, rvl);
            return rvl;
        }
        psrio->sriodev=sriodev;
        init_flag=1;
    }
    else
    {
        sriodev=psrio->sriodev;
    }

//mode master
    FVL_LOG("buf_size:%d buf_num: %d\n",buf_size,buf_num);
    uint32_t offset=0;
    for(i=0;i<chan_num;i++)
    {
        head_port[port_num].data_se_cluster[i].buf_size=buf_size;
        head_port[port_num].data_se_cluster[i].buf_num=buf_num;
        offset=offset+buf_size*buf_num;
        head_port[port_num].data_se_cluster[i].cluster_addr=FVL_SRIO_SYS_ADDR+offset;
        head_port[port_num].data_re_cluster[i].buf_size=buf_size;
        head_port[port_num].data_re_cluster[i].buf_num=buf_num;
        head_port[port_num].data_re_cluster[i].cluster_addr=FVL_SRIO_SYS_ADDR+offset;
        head_port[port_num].re_flag=1;
        head_port[port_num].uflag=0;
        srio_channel_context[(FVL_PORT_CHAN_NUM_MAX*port_num+i)].chan_size=buf_size*buf_num; 
    }
    psrio->chan_num[port_num] = chan_num;
//end master
    struct srio_port_info *pinfo;
    void *range;
    pinfo = &psrio->portpool[port_num].port_info;
    fsl_srio_connection(sriodev,port_num);
    if (fsl_srio_port_connected(sriodev) & (0x1 << port_num)) 
    {
        fsl_srio_get_port_info(sriodev, port_num+1, pinfo, &range);
        psrio->portpool[port_num].range_virt = range;
        FVL_LOG("Get port %u info, range=%p, range_start=%llx range_size=%llx\n", port_num, range, pinfo->range_start,pinfo->range_size);
    } 
    else 
    {
        FVL_LOG("%s(): fsl_srio_connection port %d failed\n", __func__, port_num+1);
        return -1;
    }
    
    rvl = fsl_srio_port_connected(sriodev);
    if (rvl <= 0) 
    {
        FVL_LOG("%s(): fsl_srio_port_connected return %d\n", __func__, rvl);
        return -1;
    }
    
    rvl = dma_pool_init(&port_dma_ctl_wp,ctl_win_size,ctl_win_size/2);
    if(rvl!=0)
    {
        FVL_LOG("port %d dma_pool_init failed!\n",port_num+1);
        return -errno;
    }
    rvl = dma_pool_init(&port_dma_ctl_wr,ctl_win_size,ctl_win_size/2);
    if(rvl!=0)
    {
        FVL_LOG("port %d dma_pool_init failed!\n",port_num+1);
        return -errno;
    }
 
    uint32_t attr_read, attr_write;
    attr_read = srio_test_win_attrv[3];
    attr_write = srio_test_win_attrv[0];
    FVL_LOG("attr_write = %u, srio_type = 0\n", attr_write);
        
    ppool = &psrio->portpool[port_num];
    ppool->write_result = port_dma_wr->dma_phys_base;
    ppool->pwrite_result = port_dma_wr->dma_virt_base;

    ppool->write_ctl_result = port_dma_ctl_wr->dma_phys_base;
    ppool->write_ctl_data = port_dma_ctl_wp->dma_phys_base;
    ppool->pwrite_ctl_result = port_dma_ctl_wr->dma_virt_base;
    ppool->pwrite_ctl_data = port_dma_ctl_wp->dma_virt_base;
   
    win_law=FVL_BASE_LAW+fvl_get_law((win_size/FVL_BASE_LAW_SIZE)-1);
    ctl_law=FVL_BASE_LAW+fvl_get_law((ctl_win_size/FVL_BASE_LAW_SIZE)-1);
   
 
    FVL_LOG("HOST WIN_LAW:%d CTL_LAW:%d\n",win_law,ctl_law);
     
    fsl_srio_set_ibwin(sriodev, port_num, 1, ppool->write_result,
            FVL_SRIO_SYS_ADDR, win_law);
    fsl_srio_set_ibwin(sriodev, port_num, 2, ppool->write_ctl_result,
            FVL_SRIO_CTL_ADDR, ctl_law);

    uint32_t win_offset=FVL_BASE_LAW_SIZE;

    for(i=FVL_BASE_LAW;i<win_law;i++)
    {
        win_offset=win_offset*2;
    }

    FVL_LOG("HOST WIN_OFFSET:%d\n",win_offset);

    ppool->ctl_info_start=ppool->port_info.range_start+win_offset;

    if (fsl_srio_port_connected(sriodev) & (0x1 << port_num)) 
    {
//ctl
        fsl_srio_set_obwin(sriodev, port_num, 2,
                ppool->port_info.range_start+win_offset,
                FVL_SRIO_CTL_ADDR, ctl_law);
        fsl_srio_set_obwin_attr(sriodev, port_num, 2,
                attr_read, attr_write);
//data
        fsl_srio_set_obwin(sriodev, port_num, 1,
                ppool->port_info.range_start,
                FVL_SRIO_SYS_ADDR, win_law);
        fsl_srio_set_obwin_attr(sriodev, port_num, 1,
                attr_read, attr_write);
    } 
    else 
    {
        FVL_LOG("SRIO port %d error!\n", port_num + 1);
        return -errno;
    }

    rvl=fsl_srio_set_deviceid(sriodev,port_num,source_id[port_num]);
    if(rvl!=0)
    {
        FVL_LOG("SRIO port %d set  source_id faile!\n",port_num);
        return -errno;
    }
    rvl=fsl_srio_set_targetid(sriodev,port_num,1,target_id[port_num]);
    if(rvl!=0)
    {
        FVL_LOG("SRIO port %d set  target_id faile!\n",port_num);
        return -errno;
    }
    rvl=fsl_srio_set_targetid(sriodev,port_num,2,target_id[port_num]);
    if(rvl!=0)
    {
        FVL_LOG("SRIO port %d set  target_id faile!\n",port_num);
        return -errno;
    }
  //  FVL_LOG("################retry##############\n");

    fsl_srio_set_phy_retry_threshold(sriodev,port_num,0,0);

   // FVL_LOG("################after retry##############\n");

    memset(port_dma_wr->dma_virt_base,0,win_size);        
    memset(port_dma_ctl_wp->dma_virt_base,0,ctl_win_size);        
    memset(port_dma_ctl_wr->dma_virt_base,0,ctl_win_size);        
    
    fvl_srio_channel_t *temp_channel;
  
    for(i=0;i<FVL_PORT_CHAN_NUM_MAX;i++)
    {
        pscb=fvl_srio_getcb(port_num,i*2);
        if(pscb==NULL)
        {
            FVL_LOG("port:%d channel:%d : dmadev init error.\n",port_num+1,2*i);
            return -1;
        }
        temp_channel=&srio_channel_context[FVL_PORT_CHAN_NUM_MAX*port_num+i];
        FVL_LOG("chan num:%d\n",(FVL_PORT_CHAN_NUM_MAX*port_num+i));
        cscb=&(temp_channel->chanblk);
        cscb->dmadev=pscb->dmadev;
  //      FVL_LOG("dmadev addr:%08x\n",pscb->dmadev);
        cscb->bfnum=pscb->bfnum;
        cscb->port = pscb->port;
    
        pscb=fvl_srio_getcb(port_num,i*2+1);
        if(pscb==NULL)
        {
            FVL_LOG("port:%d channel:%d : dmadev init error.\n",port_num+1,2*i+1);
            return -1;
        }
        re_cscb=&(temp_channel->rechanblk);
        re_cscb->dmadev=pscb->dmadev;
//        FVL_LOG("dmadev addr:%08x\n",pscb->dmadev);
        re_cscb->bfnum=pscb->bfnum;
        re_cscb->port = pscb->port;
    }    

//mode master
//need send packet_info out 
    memcpy(ppool->pwrite_ctl_data,&head_port[port_num],HEAD_SIZE);
    uint64_t dest_phys,src_phys;
    src_phys=ppool->write_ctl_data;
    dest_phys=ppool->ctl_info_start;

    pscb=&psrio->ctrlblk[FVL_PORT_DMA_NUM*port_num+7];

    fvl_srio_send(pscb->dmadev,src_phys,dest_phys,HEAD_SIZE);

    FVL_LOG("PORT_NUM:%d HEAD_SIZE:%d\n",port_num,HEAD_SIZE);
    head_arg.num = port_num;
    head_arg.op_mode = 0;
    head_arg.buf_virt=ppool->pwrite_ctl_result;
    rvl=fvl_srio_recv_head(&head_arg);
    if(rvl!=0)
    {
        FVL_LOG("Host:Port %d  is not ready!\n",port_num);
        return -1;
    }
    
    return 0;
}
Пример #24
0
int fvl_srio_init(fvl_srio_init_param_t *srio_param)
{
    fvl_srio_context_t  *psrio = &g_srio_context;
    fvl_srio_portpool_t *ppool;
    fvl_srio_ctrlblk_t *pscb;
    uint32_t srio_type=0;//srio_param->srio_type;
    uint32_t chan_num=srio_param->chan_num;
    uint32_t buf_num=srio_param->buf_num;
    uint32_t buf_size=srio_param->buf_size;
    uint32_t chan_size=srio_param->chan_size;
    uint32_t ctl_size=1024;//FVLSRIO_CTL_SIZE;
    uint32_t port_num=srio_param->port_num;
    uint32_t target_id = target1_id[port_num];//srio_param->target_id;
    fvl_dma_pool_t *port_dma_wr = srio_param->port_rd_buf;
    fvl_dma_pool_t *port_dma_ctl_wp;
    fvl_dma_pool_t *port_dma_ctl_wr;

    uint32_t win_size=chan_size*chan_num;
    uint32_t ctl_win_size=0x1000;//ctl_size*chan_num;
    uint32_t win_law=0,ctl_law=0;
    struct srio_dev *sriodev;
    int rvl;

    if((port_num >= FVL_SRIO_PORT_NUM) || (port_num <0))
    {
        FVL_LOG("port number error:%d\n",port_num);
        return -1;
    }
    if((chan_num > FVL_PORT_DMA_NUM) || ( chan_num<0))
    {
        FVL_LOG("channel number error:%d\n",chan_num);
        return -1;
    }
    
    if(!init_flag)    
    {
        of_init();
        rvl = fsl_srio_uio_init(&sriodev);
        if (rvl < 0) 
        {
            FVL_LOG("%s(): fsl_srio_uio_init return %d\n", __func__, rvl);
            return rvl;
        }
        psrio->sriodev=sriodev;
        init_flag=1;
    }
    else
    {
        sriodev=psrio->sriodev;
    }

//mode master
    head_port[port_num].buf_size=buf_size;
    head_port[port_num].buf_num=buf_num;
    head_port[port_num].chan_size=buf_size*buf_num;
    head_port[port_num].data_se_addr=FVL_SRIO_SYS_ADDR;
    head_port[port_num].data_re_addr=FVL_SRIO_SYS_ADDR;
    head_port[port_num].ctl_se_addr=FVL_SRIO_CTL_ADDR;
    head_port[port_num].ctl_re_addr=FVL_SRIO_CTL_ADDR;
    head_port[port_num].chan_num=0;
    head_port[port_num].re_flag=1;
    head_port[port_num].uflag=0;
    int i=0;
    for(i=0;i<chan_num;i++)
    {
        head_channel[i].data_se_addr=FVL_SRIO_SYS_ADDR+chan_size*i;
        head_channel[i].data_re_addr=FVL_SRIO_SYS_ADDR+chan_size*i;
        head_channel[i].ctl_se_addr=FVL_SRIO_CTL_ADDR+HEAD_SIZE+ctl_size*i;
        head_channel[i].ctl_se_addr=FVL_SRIO_CTL_ADDR+HEAD_SIZE+ctl_size*i;
        head_channel[i].re_flag=1;
        head_channel[i].uflag=0;
    }

//end master
    struct srio_port_info *pinfo;
    void *range;
    pinfo = &psrio->portpool[port_num].port_info;
    fsl_srio_connection(sriodev,port_num);
    if (fsl_srio_port_connected(sriodev) & (0x1 << port_num)) 
    {
        fsl_srio_get_port_info(sriodev, port_num+1, pinfo, &range);
        psrio->portpool[port_num].range_virt = range;
        FVL_LOG("Get port %u info, range=%p, range_start=%llx\n", port_num, range, pinfo->range_start);
    } 
    else 
    {
        FVL_LOG("%s(): fsl_srio_connection port %d failed\n", __func__, port_num+1);
        return -1;
    }
    
    rvl = fsl_srio_port_connected(sriodev);
    if (rvl <= 0) 
    {
        FVL_LOG("%s(): fsl_srio_port_connected return %d\n", __func__, rvl);
        return -1;
    }
    
    rvl = dma_pool_init(&port_dma_ctl_wp,ctl_win_size,ctl_win_size/2);
    if(rvl!=0)
    {
        FVL_LOG("port %d dma_pool_init failed!\n",port_num+1);
        return -errno;
    }
    rvl = dma_pool_init(&port_dma_ctl_wr,ctl_win_size,ctl_win_size/2);
    if(rvl!=0)
    {
        FVL_LOG("port %d dma_pool_init failed!\n",port_num+1);
        return -errno;
    }
 
    uint32_t attr_read, attr_write;
    attr_read = srio_test_win_attrv[3];
    attr_write = srio_test_win_attrv[srio_type];
    FVL_LOG("attr_write = %u, srio_type = %u\n", attr_write, srio_type);
        
    ppool = &psrio->portpool[port_num];

    ppool->write_result = port_dma_wr->dma_phys_base;
    ppool->pwrite_result = port_dma_wr->dma_virt_base;

    ppool->write_ctl_result = port_dma_ctl_wr->dma_phys_base;
    ppool->write_ctl_data = port_dma_ctl_wp->dma_phys_base;
    ppool->pwrite_ctl_result = port_dma_ctl_wr->dma_virt_base;
    ppool->pwrite_ctl_data = port_dma_ctl_wp->dma_virt_base;
   

    win_law=FVL_BASE_LAW+fvl_get_law((win_size/FVL_BASE_LAW_SIZE)-1);
    ctl_law=FVL_BASE_LAW+fvl_get_law((ctl_win_size/FVL_BASE_LAW_SIZE)-1);
    
    FVL_LOG("HOST WIN_LAW:%d CTL_LAW:%d\n",win_law,ctl_law);
     
    fsl_srio_set_ibwin(sriodev, port_num, 1, ppool->write_result,
            FVL_SRIO_SYS_ADDR, win_law);
    fsl_srio_set_ibwin(sriodev, port_num, 2, ppool->write_ctl_result,
            FVL_SRIO_CTL_ADDR, ctl_law);
    uint32_t win_offset=FVL_BASE_LAW_SIZE;
    for(i=FVL_BASE_LAW;i<win_law;i++)
    {
        win_offset=win_offset*2;
    }
    
    FVL_LOG("HOST WIN_OFFSET:%d\n",win_offset);
    ppool->ctl_info_start=ppool->port_info.range_start+win_offset;

    if (fsl_srio_port_connected(sriodev) & (0x1 << port_num)) 
    {
//data
        fsl_srio_set_obwin(sriodev, port_num, 1,
                ppool->port_info.range_start,
                FVL_SRIO_SYS_ADDR, win_law);
        fsl_srio_set_obwin_attr(sriodev, port_num, 1,
                attr_read, attr_write);
//ctl
        fsl_srio_set_obwin(sriodev, port_num, 2,
                ppool->port_info.range_start+win_offset,
                FVL_SRIO_CTL_ADDR, ctl_law);
        fsl_srio_set_obwin_attr(sriodev, port_num, 2,
                attr_read, attr_write);
    } 
    else 
    {
        FVL_LOG("SRIO port %d error!\n", port_num + 1);
        return -errno;
    }
    rvl=fsl_srio_set_deviceid(sriodev,port_num,source_id[port_num]);
    if(rvl!=0)
    {
        FVL_LOG("SRIO port %d set  source_id faile!\n",port_num);
        return -errno;
    }
    rvl=fsl_srio_set_targetid(sriodev,port_num,1,target_id);
    if(rvl!=0)
    {
        FVL_LOG("SRIO port %d set  target_id faile!\n",port_num);
        return -errno;
    }
    rvl=fsl_srio_set_targetid(sriodev,port_num,2,target_id);
    if(rvl!=0)
    {
        FVL_LOG("SRIO port %d set  target_id faile!\n",port_num);
        return -errno;
    }
    
    memset(port_dma_wr->dma_virt_base,0,win_size);        
    memset(port_dma_ctl_wp->dma_virt_base,0,ctl_win_size);        
    memset(port_dma_ctl_wr->dma_virt_base,0,ctl_win_size);        

//mode master
//need send packet_info out 
    memcpy(ppool->pwrite_ctl_data,&head_port[port_num],HEAD_SIZE);
    uint64_t dest_phys,src_phys;
    fvl_head_thread_t head_arg;
    pscb=fvl_srio_getcb(port_num,0);
    if(pscb==NULL)
    {
        FVL_LOG("port:%d  dmadev init error.\n",port_num+1);
        return -1;
    }
    src_phys=ppool->write_ctl_data;
    dest_phys=ppool->ctl_info_start;
    fvl_srio_send(pscb->dmadev,src_phys,dest_phys,HEAD_SIZE);
//create thread:
    head_arg.num = port_num;
    head_arg.op_mode = 0;
    head_arg.buf_virt=ppool->pwrite_ctl_result;

    rvl = pthread_create(&(psrio->chan_id[port_num]), NULL,fvl_srio_recv_head, &head_arg);
    if (rvl) 
    {
        FVL_LOG("Create receive packet thread error!\n");
        return -errno;
    }
    
    return 0;
}
Пример #25
0
void _start(int arg1, int arg2, void *openfirmware)
{
	int chosen;
	
	of_init(openfirmware);

	/* open the input and output handle */
	chosen = of_finddevice("/chosen");
	of_getprop(chosen, "stdin", &of_input_handle, sizeof(of_input_handle));
	of_getprop(chosen, "stdout", &of_output_handle, sizeof(of_output_handle));

	puts("this is a test\n");

	init_serial();

restart:
	puts("waiting for command\n");

	{
		int base_address;
		int entry_point;
		int length;
		int command;
		unsigned char *ptr;
		void (*func)(int, int, void *);

		serial_read_int32(&command);
		if(command != 0x99) {
			puts("bad command, restarting\n");
			goto restart;
		}

		serial_read_int32(&base_address);
		serial_read_int32(&length);
		serial_read_int32(&entry_point);

		puts("read base and length, claiming\n");

		puts("base ");
		write_hex(base_address);
		puts("\nlength ");
		write_hex(length);
		puts("\nentry_point ");
		write_hex(entry_point);
		puts("\n");

		ptr = (void *)base_address;

		of_claim(base_address, length, 0);

		puts("reading data\n");

		serial_read(ptr, length);	

		puts("done reading data, calling function\n");

		func = (void *)entry_point;
		func(arg1, arg2, openfirmware);
	}

	of_exit();
}