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; }
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; }
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); }
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); }
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(); } } }
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(); } */ } }