msm: kgsl: Reimplement the timestamp comparison function
Make timestamp_cmp return -1, 0 or 1 depending if
the first operand is less than, equal or greater
than the second operand.
Change-Id: Ic0dedbad0ea2d918e0eeef9428859f0b54a6e7ad
Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>
diff --git a/drivers/gpu/msm/adreno.c b/drivers/gpu/msm/adreno.c
index 06c4d90..d485cd2 100644
--- a/drivers/gpu/msm/adreno.c
+++ b/drivers/gpu/msm/adreno.c
@@ -1035,7 +1035,7 @@
kgsl_sharedmem_readl(&device->memstore, &ref_ts,
KGSL_DEVICE_MEMSTORE_OFFSET(ref_wait_ts));
mb();
- if (timestamp_cmp(ref_ts, timestamp)) {
+ if (timestamp_cmp(ref_ts, timestamp) >= 0) {
kgsl_sharedmem_writel(&device->memstore,
KGSL_DEVICE_MEMSTORE_OFFSET(ref_wait_ts),
timestamp);
@@ -1098,9 +1098,7 @@
if (msecs == -1)
msecs = adreno_dev->wait_timeout;
- if (timestamp != adreno_dev->ringbuffer.timestamp &&
- timestamp_cmp(timestamp,
- adreno_dev->ringbuffer.timestamp)) {
+ if (timestamp_cmp(timestamp, adreno_dev->ringbuffer.timestamp) > 0) {
KGSL_DRV_ERR(device, "Cannot wait for invalid ts: %x, "
"rb->timestamp: %x\n",
timestamp, adreno_dev->ringbuffer.timestamp);
diff --git a/drivers/gpu/msm/kgsl.c b/drivers/gpu/msm/kgsl.c
index a0a4056..e39a86d 100644
--- a/drivers/gpu/msm/kgsl.c
+++ b/drivers/gpu/msm/kgsl.c
@@ -215,7 +215,7 @@
/* Flush the freememontimestamp queue */
list_for_each_entry_safe(entry, entry_tmp, &device->memqueue, list) {
- if (!timestamp_cmp(ts_processed, entry->free_timestamp))
+ if (timestamp_cmp(ts_processed, entry->free_timestamp) < 0)
break;
list_del(&entry->list);
@@ -303,7 +303,7 @@
ts_processed = device->ftbl->readtimestamp(device,
KGSL_TIMESTAMP_RETIRED);
- return timestamp_cmp(ts_processed, timestamp);
+ return (timestamp_cmp(ts_processed, timestamp) >= 0);
}
EXPORT_SYMBOL(kgsl_check_timestamp);
diff --git a/drivers/gpu/msm/kgsl.h b/drivers/gpu/msm/kgsl.h
index b5c24f0..3bb722d 100644
--- a/drivers/gpu/msm/kgsl.h
+++ b/drivers/gpu/msm/kgsl.h
@@ -184,10 +184,14 @@
return 0;
}
-static inline bool timestamp_cmp(unsigned int new, unsigned int old)
+static inline int timestamp_cmp(unsigned int new, unsigned int old)
{
int ts_diff = new - old;
- return (ts_diff >= 0) || (ts_diff < -20000);
+
+ if (ts_diff == 0)
+ return 0;
+
+ return ((ts_diff > 0) || (ts_diff < -20000)) ? 1 : -1;
}
static inline void
diff --git a/drivers/gpu/msm/z180.c b/drivers/gpu/msm/z180.c
index 9e14247..cdb9c23 100644
--- a/drivers/gpu/msm/z180.c
+++ b/drivers/gpu/msm/z180.c
@@ -378,7 +378,8 @@
int status = 0;
struct z180_device *z180_dev = Z180_DEVICE(device);
- if (z180_dev->current_timestamp > z180_dev->timestamp)
+ if (timestamp_cmp(z180_dev->current_timestamp,
+ z180_dev->timestamp) > 0)
status = z180_wait(device, z180_dev->current_timestamp,
timeout);
@@ -644,15 +645,10 @@
static unsigned int z180_isidle(struct kgsl_device *device)
{
- int status = false;
struct z180_device *z180_dev = Z180_DEVICE(device);
- int timestamp = z180_dev->timestamp;
-
- if (timestamp == z180_dev->current_timestamp)
- status = true;
-
- return status;
+ return (timestamp_cmp(z180_dev->timestamp,
+ z180_dev->current_timestamp) == 0) ? true : false;
}
static int z180_suspend_context(struct kgsl_device *device)