Example #1
0
static int64_t opb_write(struct proc_chip *chip, uint32_t addr, uint32_t data,
			 uint32_t sz)
{
	uint64_t ctl = ECCB_CTL_MAGIC, stat;
	int64_t rc, tout;
	uint64_t data_reg;

	switch(sz) {
	case 1:
		data_reg = ((uint64_t)data) << 56;
		break;
	case 2:
		data_reg = ((uint64_t)data) << 48;
		break;
	case 4:
		data_reg = ((uint64_t)data) << 32;
		break;
	default:
		prerror("LPC: Invalid data size %d\n", sz);
		return OPAL_PARAMETER;
	}

	rc = xscom_write(chip->id, chip->lpc_xbase + ECCB_DATA, data_reg);
	if (rc) {
		log_simple_error(&e_info(OPAL_RC_LPC_WRITE),
			"LPC: XSCOM write to ECCB DATA error %lld\n", rc);
		return rc;
	}

	ctl = SETFIELD(ECCB_CTL_DATASZ, ctl, sz);
	ctl = SETFIELD(ECCB_CTL_ADDRLEN, ctl, ECCB_ADDRLEN_4B);
	ctl = SETFIELD(ECCB_CTL_ADDR, ctl, addr);
	rc = xscom_write(chip->id, chip->lpc_xbase + ECCB_CTL, ctl);
	if (rc) {
		log_simple_error(&e_info(OPAL_RC_LPC_WRITE),
			"LPC: XSCOM write to ECCB CTL error %lld\n", rc);
		return rc;
	}

	for (tout = 0; tout < ECCB_TIMEOUT; tout++) {
		rc = xscom_read(chip->id, chip->lpc_xbase + ECCB_STAT, &stat);
		if (rc) {
			log_simple_error(&e_info(OPAL_RC_LPC_WRITE),
				"LPC: XSCOM read from ECCB STAT err %lld\n",
									rc);
			return rc;
		}
		if (stat & ECCB_STAT_OP_DONE) {
			if (stat & ECCB_STAT_ERR_MASK) {
				log_simple_error(&e_info(OPAL_RC_LPC_WRITE),
					"LPC: Error status: 0x%llx\n", stat);
				return OPAL_HARDWARE;
			}
			return OPAL_SUCCESS;
		}
		time_wait(100);
	}
	log_simple_error(&e_info(OPAL_RC_LPC_WRITE), "LPC: Write timeout !\n");
	return OPAL_HARDWARE;
}
Example #2
0
int testthread(int* arg){
  int i;
  int id[100];

  temp = 0;
  timeout = 2000; /* in millisceonds */

  for(N = 2; N<=50; N*=5){
    printf("\n\n* %ld threads Test...", N);
    fflush(stdout);
    timeout *= 3;
    strt = mytime();
    id[0]=0;

    for(i = 1; i < N; i++){
      id[i]=i;
      minithread_fork(thread1, &id[i]);
    }

    thread1(&id[0]);

    if(temp >= N*3)
      printf(" Preemption working");
    else 
      printf(" Preemption failed");
    fflush(stdout);
    time_wait(4000); /* in milliseconds */
  }

  return 0;
}
Example #3
0
static int64_t opb_read(struct proc_chip *chip, uint32_t addr, uint32_t *data,
		        uint32_t sz)
{
	uint64_t ctl = ECCB_CTL_MAGIC | ECCB_CTL_READ, stat;
	int64_t rc, tout;

	if (sz != 1 && sz != 2 && sz != 4) {
		prerror("LPC: Invalid data size %d\n", sz);
		return OPAL_PARAMETER;
	}

	ctl = SETFIELD(ECCB_CTL_DATASZ, ctl, sz);
	ctl = SETFIELD(ECCB_CTL_ADDRLEN, ctl, ECCB_ADDRLEN_4B);
	ctl = SETFIELD(ECCB_CTL_ADDR, ctl, addr);
	rc = xscom_write(chip->id, chip->lpc_xbase + ECCB_CTL, ctl);
	if (rc) {
		log_simple_error(&e_info(OPAL_RC_LPC_READ),
			"LPC: XSCOM write to ECCB CTL error %lld\n", rc);
		return rc;
	}

	for (tout = 0; tout < ECCB_TIMEOUT; tout++) {
		rc = xscom_read(chip->id, chip->lpc_xbase + ECCB_STAT, &stat);
		if (rc) {
			log_simple_error(&e_info(OPAL_RC_LPC_READ),
				"LPC: XSCOM read from ECCB STAT err %lld\n",
									rc);
			return rc;
		}
		if (stat & ECCB_STAT_OP_DONE) {
			uint32_t rdata = GETFIELD(ECCB_STAT_RD_DATA, stat);
			if (stat & ECCB_STAT_ERR_MASK) {
				log_simple_error(&e_info(OPAL_RC_LPC_READ),
					"LPC: Error status: 0x%llx\n", stat);
				return OPAL_HARDWARE;
			}
			switch(sz) {
			case 1:
				*data = rdata >> 24;
				break;
			case 2:
				*data = rdata >> 16;
				break;
			default:
				*data = rdata;
				break;
			}
			return 0;
		}
		time_wait(100);
	}
Example #4
0
void cpu_wait_job(struct cpu_job *job, bool free_it)
{
	unsigned long ticks = usecs_to_tb(5);

	if (!job)
		return;

	while(!job->complete) {
		time_wait(ticks);
		lwsync();
	}
	lwsync();
	smt_medium();

	if (free_it)
		free(job);
}
Example #5
0
int main( void )
{
        uint32_t chargeopportunity = 0;
	init();

	random_walk_disable();

	time_wait(TICKS_PER_SEC * 1);
	/* start charging if touching charger within 1 second */
	chargeopportunity = the_time + 20;
	leds_set(ORANGE);
	while (the_time < chargeopportunity)
	{
		if ( battery_power_good() )
			now_parking = !charge_complete;
	}
	leds_set(NONE);
	
	while(1)
	{
		leds_update_mood();
	    
		if (battery_critical())
			low_power();
	    
		/* We may have finished charging */
		if( charge_complete )
		{
			food_level = 0;
			charge_complete = FALSE;
			now_parking = 0;
		
			/* reverse out of the charger */
			random_walk_disable();
			motor_r = motor_l = 6;
			motor_mode = MOTOR_BK;
		
			time_wait(5);
			continue;
		}
		
		/* Go to the charger if... */
		if( battery_low()
		    /* Or we've reached a defficiency of food */
		    || ( food_level > FOOD_THRESHOLD ) 
		    || ( now_parking )  ) 
		{
			if (battery_low() )
				mood = MOOD_DRIVING_TO_CHARGER_FLATBATT;
			else if ( food_level > FOOD_THRESHOLD ) 
				mood = MOOD_DRIVING_TO_CHARGER_NOFOOD;
		   
			now_parking = !charge_complete;
			parking_update();
			continue;
		}

		/* Parking involves a static situation, which is incompatible 
		   with the watchdog - hence leave it here. */
		watchdog_update();

		if( hasfood() )
		{
			mood = MOOD_GOT_FOOD;

			/* Are we at the light source? */
			if(light_intensity == 0)
			{
				/* Deposit food here */
				mood = MOOD_AT_LAMP;
				leds_update_mood();
				random_walk_disable();
				motor_r = motor_l = 6;
				motor_mode = MOTOR_BK;

				time_wait(10);
			}

			/* Do we have a reasonable bearing? */
			else if(bearing_strength > 10)
			{
				random_walk_disable();
				braitenberg_update();
			}
			else
				/* Random Walk */
				random_walk_enable();

		}
		else
		{
			/* Not got food, just do random walk */
			mood = MOOD_NONE;
			random_walk_enable();
		}
	}
}
Example #6
0
int main( void )
{
    uint32_t chargeopportunity = 0;
    init();

    random_walk_disable();

    time_wait(TICKS_PER_SEC * 1);
    /* start charging if touching charger within 1 second */
    chargeopportunity = the_time + 20;
    leds_set(RED);                // red LED on for 2 seconds
    P4DIR |= (0x09);                 //P40 and P43 are output IR
    P4OUT |= (0x09);            //all IR leds on (3 top, one bottom)
    time_wait(TICKS_PER_SEC * 2);
    leds_set(GREEN);          //green LED on for 1 second
    time_wait(TICKS_PER_SEC * 1);
    leds_set(ORANGE);          //green LED on for 1 second
    time_wait(TICKS_PER_SEC * 1);
    leds_set(RED);          //green LED on for 1 second
    time_wait(TICKS_PER_SEC * 1);
    leds_set(NONE);
    P4OUT &= ~(0x01);
    motor_l=1;              //left motor running at low speed for 1 second
    time_wait(TICKS_PER_SEC *1);
    motor_l=0;
    motor_r=1;              //right motor running at low speed for 1 second
    time_wait(TICKS_PER_SEC *1);
    motor_r=0;

    motor_mode= MOTOR_BK;
    time_wait(TICKS_PER_SEC *2);
    motor_l=2;
    motor_r=2;
    time_wait(TICKS_PER_SEC *1);
    motor_l=0;
    motor_r=0;
    motor_mode= MOTOR_FWD;
    
/*   
    while (the_time < chargeopportunity)
    {
	if ( battery_power_good() )
	{
	    now_parking = !charge_complete;
	}
    }
*/

    leds_set(NONE);

    while(1)
    {
	leds_update_mood();
	    
	if (battery_critical())
	{
	    low_power();
	}

/*	    
	// We may have finished charging
	if( charge_complete )
	{
    	food_level = 0;
	    charge_complete = FALSE;
	    now_parking = 0;
		
	    // reverse out of the charger
	    random_walk_disable();
	    motor_r = motor_l = 6;
	    motor_mode = MOTOR_BK;
		
	    time_wait(5);
	    continue;
	}
*/


/*		
	// Go to the charger if...
	if( battery_low()
        // Or we've reached a defficiency of food
	    || ( food_level > FOOD_THRESHOLD ) 
	    || ( now_parking )  ) 
	{
	     if (battery_low() )
	     {
	             mood = MOOD_DRIVING_TO_CHARGER_FLATBATT;
	     }
	     else if ( food_level > FOOD_THRESHOLD ) 
	     {
		     mood = MOOD_DRIVING_TO_CHARGER_NOFOOD;
	     }
		   
	     now_parking = !charge_complete;
	     parking_update();
	     continue;
	}
*/
	/* Parking involves a static situation, which is incompatible 
	   with the watchdog - hence leave it here. */
	watchdog_update();

/*
	if( hasfood() )
	{
		mood = MOOD_GOT_FOOD;
*/

		/* Are we at the light source? */
		if(light_intensity == 0)
		{
			/* Deposit food here */
			mood = MOOD_AT_LAMP;
			leds_update_mood();
			random_walk_disable();
			motor_r = motor_l = 6;
			motor_mode = MOTOR_FWD;
			time_wait(10);
		}

		/* Do we have a reasonable bearing? */
		else if(bearing_strength > 10)
		{
			random_walk_disable();
			braitenberg_update();
		}
		else
		{
			/* Random Walk */
			random_walk_enable();
		}
	
/*
	}
	else
	{
		// Not got food, just do random walk
		mood = MOOD_NONE;
		random_walk_enable();
	}
*/

  }
}