From ad55df310570b4ceec28f8c20e586302bb57da71 Mon Sep 17 00:00:00 2001 From: Francisco Jerez Date: Sun, 5 Sep 2010 06:03:07 +0200 Subject: [PATCH] --- yaml --- r: 218186 b: refs/heads/master c: 3bc14b4dca2f8bc088162476279480e78491fd83 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/drivers/gpu/drm/nouveau/nouveau_ramht.c | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 875504f4e8fa..912a04ff6690 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: f243423759271026ddc3f8ab12a16cc7abfabc49 +refs/heads/master: 3bc14b4dca2f8bc088162476279480e78491fd83 diff --git a/trunk/drivers/gpu/drm/nouveau/nouveau_ramht.c b/trunk/drivers/gpu/drm/nouveau/nouveau_ramht.c index f240ba241943..7f16697cc96c 100644 --- a/trunk/drivers/gpu/drm/nouveau/nouveau_ramht.c +++ b/trunk/drivers/gpu/drm/nouveau/nouveau_ramht.c @@ -63,6 +63,23 @@ nouveau_ramht_entry_valid(struct drm_device *dev, struct nouveau_gpuobj *ramht, return (ctx != 0); } +static int +nouveau_ramht_entry_same_channel(struct nouveau_channel *chan, + struct nouveau_gpuobj *ramht, u32 offset) +{ + struct drm_nouveau_private *dev_priv = chan->dev->dev_private; + u32 ctx = nv_ro32(ramht, offset + 4); + + if (dev_priv->card_type >= NV_50) + return true; + else if (dev_priv->card_type >= NV_40) + return chan->id == + ((ctx >> NV40_RAMHT_CONTEXT_CHANNEL_SHIFT) & 0x1f); + else + return chan->id == + ((ctx >> NV_RAMHT_CONTEXT_CHANNEL_SHIFT) & 0x1f); +} + int nouveau_ramht_insert(struct nouveau_channel *chan, u32 handle, struct nouveau_gpuobj *gpuobj) @@ -159,6 +176,7 @@ nouveau_ramht_remove_locked(struct nouveau_channel *chan, u32 handle) co = ho = nouveau_ramht_hash_handle(chan, handle); do { if (nouveau_ramht_entry_valid(dev, ramht, co) && + nouveau_ramht_entry_same_channel(chan, ramht, co) && (handle == nv_ro32(ramht, co))) { NV_DEBUG(dev, "remove ch%d 0x%08x: h=0x%08x, c=0x%08x\n",