summaryrefslogtreecommitdiff
path: root/shared-core
AgeCommit message (Expand)Author
2007-03-21Merge git://proxy01.pd.intel.com:9419/git/mesa/drm into crestlineNian Wu
2007-03-21nouveau: support multiple channels per client (breaks drm interface)Ben Skeggs
2007-03-19Merge git://proxy01.pd.intel.com:9419/git/mesa/drm into crestlineNian Wu
2007-03-19more whitespace issuesDave Airlie
2007-03-19whitespace cleanup pending a kernel mergeDave Airlie
2007-03-14Merge git://proxy01.pd.intel.com:9419/git/mesa/drm into crestlineNian Wu
2007-03-13r300: Renamed the CACHE_CTLSTAT values to include UNKNOWN in the name; notOliver McFadden
2007-03-13Merge git://proxy01.pd.intel.com:9419/git/mesa/drm into crestlineNian Wu
2007-03-13Add defines for the values written to R300_RB3D_ZCACHE_CTLSTAT.Oliver McFadden
2007-03-13nouveau: make sure cmdbuf object gets destroyedBen Skeggs
2007-03-13nouveau: associate all created objects with a channel + cleanupsBen Skeggs
2007-03-13nouveau: s/fifo/channel/Ben Skeggs
2007-03-13Corrected values written to R300_RB3D_DSTCACHE_CTLSTAT to eitherOliver McFadden
2007-03-13Guess another unknown register used for R300 pacification.Oliver McFadden
2007-03-12Merge git://proxy01.pd.intel.com:9419/git/mesa/drm into crestlineNian Wu
2007-03-11nouveau: PUT,GET, not 2xPUTPatrice Mandin
2007-03-07Merge git://proxy01.pd.intel.com:9419/git/mesa/drm into crestlineNian Wu
2007-03-07Add via CX700.Thomas Hellstrom
2007-03-05Merge git://proxy01.pd.intel.com:9419/git/mesa/drm into crestlineNian Wu
2007-03-04radeon: make PCI GART aperture size variable, but making table size variableDave Airlie
2007-03-04ati: make pcigart code able to handle variable size PCI GART apertureDave Airlie
2007-03-01Merge git://proxy01.pd.intel.com:9419/git/mesa/drm into crestlineNian Wu
2007-02-28nouveau: intrusive drm interface changesBen Skeggs
2007-02-25Merge git://proxy01.pd.intel.com:9419/git/mesa/drm into crestlineNian Wu
2007-02-25drm: remove unnecessary NULL checks, and fix some indents..Jakob Bornecrantz
2007-02-16Simple fence object sample driver for via, based on idling the GPU.Thomas Hellstrom
2007-02-15Initial support for fence object classes.Thomas Hellstrom
2007-02-14Merge branch 'ttm-vram-0-1-branch'Thomas Hellstrom
2007-02-14Remove an intel-specific hack and replace it with a fence driver callback.Thomas Hellstrom
2007-02-14nouveau: fix the build on big endian (thanks CyberFoxx)Stephane Marchesin
2007-02-14nouveau: fix memory initialization with multiple cards.B. Rathmann
2007-02-13Bugzilla Bug #9457Thomas Hellstrom
2007-02-13i915: Add 965GM pci id updateWang Zhenyu
2007-02-12Update flags and comments.Thomas Hellstrom
2007-02-11Sync r300_reg.h from mesa driver. #10210Aapo Tahkola
2007-03-10Merge branch 'i915-pageflip'Michel Dänzer
2007-03-10i915: Only wait for pending flips before asynchronous flips again.Michel Dänzer
2007-03-09i915: Do not wait for pending flips on both pipes at the same time.Michel Dänzer
2007-03-07nouveau: remove a hack that's not needed since the last interface change.Ben Skeggs
2007-03-07nouveau: ack PFIFO interrupts at PFIFO, not PMC.Ben Skeggs
2007-02-28i915: Eliminate dev_priv->current_page.Michel Dänzer
2007-02-28i915: Only clean up page flipping when the last client goes away, not any one.Michel Dänzer
2007-02-28i915: Don't emit waits for pending flips before emitting synchronous flips.Michel Dänzer
2007-02-28i915: Fix test for synchronous flip affecting both pipes.Michel Dänzer
2007-02-22i915: Add support for scheduled buffer swaps to be done as flips.Michel Dänzer
2007-02-22Add DRM_VBLANK_FLIP.Michel Dänzer
2007-02-19i915: Improved page flipping support, including triple buffering.Michel Dänzer
2007-02-19i915: Page flipping enhancements.Michel Dänzer
2007-02-19i915: Unify breadcrumb emission.Michel Dänzer
2007-02-09I915 accelerated blit copy functional.Thomas Hellstrom
(&dev->object_hash, &item->hash, (unsigned long)item, 32, 0, 0); if (ret) return ret; list_add_tail(&item->list, &priv->user_objects); return 0; } drm_user_object_t *drm_lookup_user_object(drm_file_t * priv, uint32_t key) { drm_device_t *dev = priv->head->dev; drm_hash_item_t *hash; int ret; drm_user_object_t *item; DRM_ASSERT_LOCKED(&dev->struct_mutex); ret = drm_ht_find_item(&dev->object_hash, key, &hash); if (ret) { return NULL; } item = drm_hash_entry(hash, drm_user_object_t, hash); if (priv != item->owner) { drm_open_hash_t *ht = &priv->refd_object_hash[_DRM_REF_USE]; ret = drm_ht_find_item(ht, (unsigned long)item, &hash); if (ret) { DRM_ERROR("Object not registered for usage\n"); return NULL; } } return item; } static void drm_deref_user_object(drm_file_t * priv, drm_user_object_t * item) { drm_device_t *dev = priv->head->dev; int ret; if (atomic_dec_and_test(&item->refcount)) { ret = drm_ht_remove_item(&dev->object_hash, &item->hash); BUG_ON(ret); list_del_init(&item->list); item->remove(priv, item); } } int drm_remove_user_object(drm_file_t * priv, drm_user_object_t * item) { DRM_ASSERT_LOCKED(&priv->head->dev->struct_mutex); if (item->owner != priv) { DRM_ERROR("Cannot destroy object not owned by you.\n"); return -EINVAL; } item->owner = 0; item->shareable = 0; list_del_init(&item->list); drm_deref_user_object(priv, item); return 0; } static int drm_object_ref_action(drm_file_t * priv, drm_user_object_t * ro, drm_ref_t action) { int ret = 0; switch (action) { case _DRM_REF_USE: atomic_inc(&ro->refcount); break; default: if (!ro->ref_struct_locked) { break; } else { ro->ref_struct_locked(priv, ro, action); } } return ret; } int drm_add_ref_object(drm_file_t * priv, drm_user_object_t * referenced_object, drm_ref_t ref_action) { int ret = 0; drm_ref_object_t *item; drm_open_hash_t *ht = &priv->refd_object_hash[ref_action]; DRM_ASSERT_LOCKED(&priv->head->dev->struct_mutex); if (!referenced_object->shareable && priv != referenced_object->owner) { DRM_ERROR("Not allowed to reference this object\n"); return -EINVAL; } /* * If this is not a usage reference, Check that usage has been registered * first. Otherwise strange things may happen on destruction. */ if ((ref_action != _DRM_REF_USE) && priv != referenced_object->owner) { item = drm_lookup_ref_object(priv, referenced_object, _DRM_REF_USE); if (!item) { DRM_ERROR ("Object not registered for usage by this client\n"); return -EINVAL; } } if (NULL != (item = drm_lookup_ref_object(priv, referenced_object, ref_action))) { atomic_inc(&item->refcount); return drm_object_ref_action(priv, referenced_object, ref_action); } item = drm_ctl_calloc(1, sizeof(*item), DRM_MEM_OBJECTS); if (item == NULL) { DRM_ERROR("Could not allocate reference object\n"); return -ENOMEM; } atomic_set(&item->refcount, 1); item->hash.key = (unsigned long)referenced_object; ret = drm_ht_insert_item(ht, &item->hash); item->unref_action = ref_action; if (ret) goto out; list_add(&item->list, &priv->refd_objects); ret = drm_object_ref_action(priv, referenced_object, ref_action); out: return ret; } drm_ref_object_t *drm_lookup_ref_object(drm_file_t * priv, drm_user_object_t * referenced_object, drm_ref_t ref_action) { drm_hash_item_t *hash; int ret; DRM_ASSERT_LOCKED(&priv->head->dev->struct_mutex); ret = drm_ht_find_item(&priv->refd_object_hash[ref_action], (unsigned long)referenced_object, &hash); if (ret) return NULL; return drm_hash_entry(hash, drm_ref_object_t, hash); } static void drm_remove_other_references(drm_file_t * priv, drm_user_object_t * ro) { int i; drm_open_hash_t *ht; drm_hash_item_t *hash; drm_ref_object_t *item; for (i = _DRM_REF_USE + 1; i < _DRM_NO_REF_TYPES; ++i) { ht = &priv->refd_object_hash[i]; while (!drm_ht_find_item(ht, (unsigned long)ro, &hash)) { item = drm_hash_entry(hash, drm_ref_object_t, hash); drm_remove_ref_object(priv, item); } } } void drm_remove_ref_object(drm_file_t * priv, drm_ref_object_t * item) { int ret; drm_user_object_t *user_object = (drm_user_object_t *) item->hash.key; drm_open_hash_t *ht = &priv->refd_object_hash[item->unref_action]; drm_ref_t unref_action; DRM_ASSERT_LOCKED(&priv->head->dev->struct_mutex); unref_action = item->unref_action; if (atomic_dec_and_test(&item->refcount)) { ret = drm_ht_remove_item(ht, &item->hash); BUG_ON(ret); list_del_init(&item->list); if (unref_action == _DRM_REF_USE) drm_remove_other_references(priv, user_object); drm_ctl_free(item, sizeof(*item), DRM_MEM_OBJECTS); } switch (unref_action) { case _DRM_REF_USE: drm_deref_user_object(priv, user_object); break; default: BUG_ON(!user_object->unref); user_object->unref(priv, user_object, unref_action); break; } } int drm_user_object_ref(drm_file_t * priv, uint32_t user_token, drm_object_type_t type, drm_user_object_t ** object) { drm_device_t *dev = priv->head->dev; drm_user_object_t *uo; drm_hash_item_t *hash; int ret; mutex_lock(&dev->struct_mutex); ret = drm_ht_find_item(&dev->object_hash, user_token, &hash); if (ret) { DRM_ERROR("Could not find user object to reference.\n"); goto out_err; } uo = drm_hash_entry(hash, drm_user_object_t, hash); if (uo->type != type) { ret = -EINVAL; goto out_err; } ret = drm_add_ref_object(priv, uo, _DRM_REF_USE); if (ret) goto out_err; mutex_unlock(&dev->struct_mutex); *object = uo; return 0; out_err: mutex_unlock(&dev->struct_mutex); return ret; } int drm_user_object_unref(drm_file_t * priv, uint32_t user_token, drm_object_type_t type) { drm_device_t *dev = priv->head->dev; drm_user_object_t *uo; drm_ref_object_t *ro; int ret; mutex_lock(&dev->struct_mutex); uo = drm_lookup_user_object(priv, user_token); if (!uo || (uo->type != type)) { ret = -EINVAL; goto out_err; } ro = drm_lookup_ref_object(priv, uo, _DRM_REF_USE); if (!ro) { ret = -EINVAL; goto out_err; } drm_remove_ref_object(priv, ro); mutex_unlock(&dev->struct_mutex); return 0; out_err: mutex_unlock(&dev->struct_mutex); return ret; }