summaryrefslogtreecommitdiff
path: root/linux/i810_dma.c
diff options
context:
space:
mode:
Diffstat (limited to 'linux/i810_dma.c')
-rw-r--r--linux/i810_dma.c26
1 files changed, 15 insertions, 11 deletions
diff --git a/linux/i810_dma.c b/linux/i810_dma.c
index e27406a62..4c90496a7 100644
--- a/linux/i810_dma.c
+++ b/linux/i810_dma.c
@@ -396,23 +396,26 @@ static int i810_dma_initialize(drm_device_t *dev,
drm_i810_private_t *dev_priv,
drm_i810_init_t *init)
{
- drm_map_t *sarea_map;
+ struct list_head *list;
dev->dev_private = (void *) dev_priv;
memset(dev_priv, 0, sizeof(drm_i810_private_t));
- if (init->ring_map_idx >= dev->map_count ||
- init->buffer_map_idx >= dev->map_count) {
- i810_dma_cleanup(dev);
- DRM_ERROR("ring_map or buffer_map are invalid\n");
- return -EINVAL;
- }
+ list_for_each(list, &dev->maplist->head) {
+ drm_map_list_t *r_list = (drm_map_list_t *)list;
+ if( r_list->map &&
+ r_list->map->type == _DRM_SHM &&
+ r_list->map->flags & _DRM_CONTAINS_LOCK ) {
+ dev_priv->sarea_map = r_list->map;
+ break;
+ }
+ }
+
+ DRM_FIND_MAP( dev_priv->mmio_map, init->mmio_offset );
+ DRM_FIND_MAP( dev_priv->buffer_map, init->buffers_offset );
- dev_priv->ring_map_idx = init->ring_map_idx;
- dev_priv->buffer_map_idx = init->buffer_map_idx;
- sarea_map = dev->maplist[0];
dev_priv->sarea_priv = (drm_i810_sarea_t *)
- ((u8 *)sarea_map->handle +
+ ((u8 *)dev_priv->sarea_map->handle +
init->sarea_priv_offset);
atomic_set(&dev_priv->flush_done, 0);
@@ -865,6 +868,7 @@ static void i810_dma_dispatch_vertex(drm_device_t *dev,
void i810_dma_service(int irq, void *device, struct pt_regs *regs)
{
drm_device_t *dev = (drm_device_t *)device;
+ drm_i810_private_t *dev_priv = (drm_i810_private_t *)dev->dev_private;
u16 temp;
atomic_inc(&dev->counts[_DRM_STAT_IRQ]);