summaryrefslogtreecommitdiffstats
path: root/src/occ_gpe0/gpe_util.c
diff options
context:
space:
mode:
authorDoug Gilbert <dgilbert@us.ibm.com>2017-09-29 10:00:59 -0500
committerMartha Broyles <mbroyles@us.ibm.com>2017-10-03 17:05:58 -0400
commit119f37bc1c1b9da19f80c4a8fbc04cb0120e1bdf (patch)
treeb6633108c81c62203292349730b0094ce026459b /src/occ_gpe0/gpe_util.c
parent28ba8e805cab998dc8ca15c0a3c362d18a189c04 (diff)
downloadtalos-occ-119f37bc1c1b9da19f80c4a8fbc04cb0120e1bdf.tar.gz
talos-occ-119f37bc1c1b9da19f80c4a8fbc04cb0120e1bdf.zip
Correct gpe timebase
Change-Id: I47524f8400d1b5f2ed5423c2bea105a22a099205 CQ: SW402715 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/46917 Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com> Reviewed-by: Christopher J. Cain <cjcain@us.ibm.com> Reviewed-by: William A. Bryan <wilbryan@us.ibm.com> Reviewed-by: Martha Broyles <mbroyles@us.ibm.com>
Diffstat (limited to 'src/occ_gpe0/gpe_util.c')
-rw-r--r--src/occ_gpe0/gpe_util.c33
1 files changed, 14 insertions, 19 deletions
diff --git a/src/occ_gpe0/gpe_util.c b/src/occ_gpe0/gpe_util.c
index 59e44c1..2606a3d 100644
--- a/src/occ_gpe0/gpe_util.c
+++ b/src/occ_gpe0/gpe_util.c
@@ -159,29 +159,24 @@ int wait_spi_completion(GpeErrorStruct *error, uint32_t reg, uint32_t i_timeout)
*/
void busy_wait(uint32_t i_microseconds)
{
- uint32_t start_decrementer_value; // The decrementer register value at the beginning
- uint32_t end_decrementer_value; // The decrementer register value at the end
- uint32_t current_decrementer_value; // The current decrementer register value
- uint32_t duration;
- MFDEC(start_decrementer_value); // get the decrementer register value at the beginning
- current_decrementer_value = start_decrementer_value;
+ uint32_t current_count = pk_timebase32_get();
+ uint32_t end_count = current_count +
+ PK_INTERVAL_SCALE((uint32_t)PK_MICROSECONDS(i_microseconds));
- // multiply the delay time by the external clock frequency (~37.5 MHz)
- duration = (i_microseconds * 37);
- duration += (i_microseconds >> 1);
-
- // Calculate the decrementer register value at the end of the busy wait period
- end_decrementer_value = start_decrementer_value - duration;
-
- if(start_decrementer_value < end_decrementer_value) // decrementer overflows during the busy wait?
+ // Handle wrap case
+ if(current_count > end_count)
{
- MFDEC(current_decrementer_value);
- while(current_decrementer_value < end_decrementer_value) // Wait until Decrementer overflows
- MFDEC(current_decrementer_value);
+ // let counter roll over
+ while(current_count > end_count)
+ {
+ current_count = pk_timebase32_get();
+ }
}
- while (current_decrementer_value > end_decrementer_value) // Wait until end_decrementer_value is reached
- MFDEC(current_decrementer_value);
+ while (current_count < end_count)
+ {
+ current_count = pk_timebase32_get();
+ }
}
/*
OpenPOWER on IntegriCloud