/*! * * @param mmio * @param pipe_reg * @param time_interval * * @return 0 on success * @return 1 on failure */ int wait_for_vblank_timeout_plb( unsigned char *mmio, unsigned long pipe_reg, unsigned long time_interval) { int ret; unsigned long pipe_status_reg = pipe_reg + PIPE_STATUS_OFFSET; unsigned long tmp; os_alarm_t timeout; unsigned long request_for; EMGD_TRACE_ENTER; EMGD_DEBUG("Parameters: MMIO = %p, pipe_reg = %lx, time_interval = %lx", mmio, pipe_reg, time_interval); /* If pipe is off then just return */ if(!((1L<<31) & EMGD_READ32(EMGD_MMIO(mmio) + pipe_reg))) { EMGD_DEBUG("Pipe disabled/Off"); EMGD_TRACE_EXIT; return 1; } /* * When VGA plane is on the normal wait for vblank won't work * so just skip it. */ if(!(EMGD_READ32(EMGD_MMIO(mmio) + 0x71400) & 0x80000000)) { EMGD_DEBUG("VGA Plane On"); EMGD_TRACE_EXIT; return 1; } /* 1. Request the interrupt handler to record the next VBlank: */ request_for = VBINT_REQUEST(VBINT_WAIT, (pipe_status_reg == PIPEA_STAT) ? VBINT_PORT2 : VBINT_PORT4); mode_context->dispatch->full->request_vblanks(request_for, mmio); /* 2. Wait & poll for the next VBlank: */ timeout = OS_SET_ALARM(time_interval); do { OS_SCHEDULE(); tmp = mode_context->dispatch->full->vblank_occured(request_for); } while ((tmp == 0x00) && (!OS_TEST_ALARM(timeout))); if (tmp == 0) { EMGD_ERROR_EXIT("Timeout waiting for VBLANK"); ret = 0; } else { ret = 1; } /* 3. End our request for the next VBlank: */ mode_context->dispatch->full->end_request(request_for, mmio); EMGD_TRACE_EXIT; return ret; } /* wait_for_vblank_timeout_plb */
/*! * Function to sleep in micro seconds. This can be called with millisecond * ranges. * * @param usec * * @return void */ void igd_pd_usleep(unsigned long usec) { if (usec <= 1000) { OS_SLEEP(usec); } else { os_alarm_t alarm = OS_SET_ALARM((usec+999)/1000); do { OS_SCHEDULE(); } while (!OS_TEST_ALARM(alarm)); } } /* end igd_pd_usleep() */