summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Hellstrom <unichrome@shipmail.org>2004-10-12 18:46:26 +0000
committerThomas Hellstrom <unichrome@shipmail.org>2004-10-12 18:46:26 +0000
commitbbfe18e3bf7b45543c9f59f7363c1ed5b6bca719 (patch)
tree7ee5e1af7a8f96824215d25d1704b90cb4c86479
parentad70dc676ebf8f2f86d171dccb873a04a3e5b87b (diff)
Via updates. Fixed unlikely but possible uint32_t overflow in ring-buffer
code. bumped patchlevel.
-rw-r--r--shared-core/via_dma.c9
-rw-r--r--shared-core/via_drv.h4
-rw-r--r--shared/via.h4
-rw-r--r--shared/via_dma.c10
4 files changed, 13 insertions, 14 deletions
diff --git a/shared-core/via_dma.c b/shared-core/via_dma.c
index 182964f6..574858b9 100644
--- a/shared-core/via_dma.c
+++ b/shared-core/via_dma.c
@@ -80,7 +80,7 @@ via_cmdbuf_wait(drm_via_private_t * dev_priv, unsigned int size)
volatile uint32_t *hw_addr_ptr;
uint32_t count;
hw_addr_ptr = dev_priv->hw_addr_ptr;
- cur_addr = agp_base + dev_priv->dma_low;
+ cur_addr = dev_priv->dma_low;
/* At high resolution (i.e. 1280x1024) and with high workload within
* a short commmand stream, the following test will fail. It may be
* that the engine is too busy to update hw_addr. Therefore, add
@@ -89,11 +89,10 @@ via_cmdbuf_wait(drm_via_private_t * dev_priv, unsigned int size)
next_addr = cur_addr + size + 64 * 1024;
count = 1000000; /* How long is this? */
do {
- hw_addr = *hw_addr_ptr;
+ hw_addr = *hw_addr_ptr - agp_base;
if (count-- == 0) {
- DRM_ERROR
- ("via_cmdbuf_wait timed out hw %x dma_low %x\n",
- hw_addr, dev_priv->dma_low);
+ DRM_ERROR("via_cmdbuf_wait timed out hw %x cur_addr %x next_addr %x\n",
+ hw_addr, cur_addr, next_addr);
return -1;
}
} while ((cur_addr < hw_addr) && (next_addr >= hw_addr));
diff --git a/shared-core/via_drv.h b/shared-core/via_drv.h
index 28556853..3d3f093f 100644
--- a/shared-core/via_drv.h
+++ b/shared-core/via_drv.h
@@ -28,11 +28,11 @@
#define DRIVER_NAME "via"
#define DRIVER_DESC "VIA Unichrome"
-#define DRIVER_DATE "20041010"
+#define DRIVER_DATE "20041012"
#define DRIVER_MAJOR 2
#define DRIVER_MINOR 0
-#define DRIVER_PATCHLEVEL 0
+#define DRIVER_PATCHLEVEL 1
typedef struct drm_via_ring_buffer {
drm_map_t map;
diff --git a/shared/via.h b/shared/via.h
index e87b617f..48a85f4c 100644
--- a/shared/via.h
+++ b/shared/via.h
@@ -30,11 +30,11 @@
#define DRIVER_NAME "via"
#define DRIVER_DESC "VIA Unichrome"
-#define DRIVER_DATE "20041010"
+#define DRIVER_DATE "20041012"
#define DRIVER_MAJOR 2
#define DRIVER_MINOR 0
-#define DRIVER_PATCHLEVEL 0
+#define DRIVER_PATCHLEVEL 1
#define DRIVER_IOCTLS \
[DRM_IOCTL_NR(DRM_IOCTL_VIA_ALLOCMEM)] = { via_mem_alloc, 1, 0 }, \
diff --git a/shared/via_dma.c b/shared/via_dma.c
index 84df4d12..4b1489f3 100644
--- a/shared/via_dma.c
+++ b/shared/via_dma.c
@@ -81,7 +81,7 @@ via_cmdbuf_wait(drm_via_private_t * dev_priv, unsigned int size)
volatile uint32_t *hw_addr_ptr;
uint32_t count;
hw_addr_ptr = dev_priv->hw_addr_ptr;
- cur_addr = agp_base + dev_priv->dma_low;
+ cur_addr = dev_priv->dma_low;
/* At high resolution (i.e. 1280x1024) and with high workload within
* a short commmand stream, the following test will fail. It may be
* that the engine is too busy to update hw_addr. Therefore, add
@@ -90,11 +90,10 @@ via_cmdbuf_wait(drm_via_private_t * dev_priv, unsigned int size)
next_addr = cur_addr + size + 64 * 1024;
count = 1000000; /* How long is this? */
do {
- hw_addr = *hw_addr_ptr;
+ hw_addr = *hw_addr_ptr - agp_base;
if (count-- == 0) {
- DRM_ERROR
- ("via_cmdbuf_wait timed out hw %x dma_low %x\n",
- hw_addr, dev_priv->dma_low);
+ DRM_ERROR("via_cmdbuf_wait timed out hw %x cur_addr %x next_addr %x\n",
+ hw_addr, cur_addr, next_addr);
return -1;
}
} while ((cur_addr < hw_addr) && (next_addr >= hw_addr));
@@ -491,6 +490,7 @@ static void via_cmdbuf_jump(drm_via_private_t * dev_priv)
* state. Prepending a BitBLT command to stall the command
* regulator for a moment seems to solve the problem.
*/
+
via_cmdbuf_wait(dev_priv, 48);
via_dummy_bitblt(dev_priv);