On Wed, Jan 4, 2012 at 10:36 AM, James Simmons <jsimmons@xxxxxxxxxxxxx> wrote: > >> Attached is patch to fix this, so sorry about that, i must have lost my >> agp change along the way when working on the patchset. This patch is not >> extensively tested, i will do more testing tomorrow on more gpu, might >> even found an nvidia agp i can try. Again sorry for breaking this. > > Thanks for the fix up. I was wondering if this purposed change could be > done instead. Its the same as your fix up except that you pass in the > ttm_buffer_object for tt_create. The reason is I really like to have the > ability to have more than one back end to grab a bunch pf pages from. > Currently its AGP or something else. On some of my embedded devices the > AGP space is not very large and can be exhausted very quickly. Those > embedded devices have DMA engines I could use instead. This change violate the layer separation ttm wish to preserve see : http://www.mail-archive.com/dri-devel@xxxxxxxxxxxxxxxxxxxxx/msg16443.html You can achieve what you want by either adding a new domain so you would have system, vram, agp, pcidma and object can be bound to one and only one. Or you can hack your own agp ttm backend that could bind bo to agp or pci or both at the same time depending on what you want to achieve. Cheers, Jerome > diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.c b/drivers/gpu/drm/nouveau/nouveau_bo.c > index 8cf4a48..58ad508 100644 > --- a/drivers/gpu/drm/nouveau/nouveau_bo.c > +++ b/drivers/gpu/drm/nouveau/nouveau_bo.c > @@ -349,10 +349,11 @@ nouveau_bo_wr32(struct nouveau_bo *nvbo, unsigned index, u32 val) > } > > static struct ttm_tt * > -nouveau_ttm_tt_create(struct ttm_bo_device *bdev, > +nouveau_ttm_tt_create(struct ttm_buffer_object *bo, > unsigned long size, uint32_t page_flags, > struct page *dummy_read_page) > { > + struct ttm_bo_device *bdev = bo->bdev; > struct drm_nouveau_private *dev_priv = nouveau_bdev(bdev); > struct drm_device *dev = dev_priv->dev; > > @@ -1066,6 +1067,12 @@ nouveau_ttm_tt_populate(struct ttm_tt *ttm) > dev_priv = nouveau_bdev(ttm->bdev); > dev = dev_priv->dev; > > +#if __OS_HAS_AGP > + if (dev_priv->gart_info.type == NOUVEAU_GART_AGP) { > + return ttm_agp_tt_populate(ttm); > + } > +#endif > + > #ifdef CONFIG_SWIOTLB > if (swiotlb_nr_tbl()) { > return ttm_dma_populate((void *)ttm, dev->dev); > @@ -1105,6 +1112,13 @@ nouveau_ttm_tt_unpopulate(struct ttm_tt *ttm) > dev_priv = nouveau_bdev(ttm->bdev); > dev = dev_priv->dev; > > +#if __OS_HAS_AGP > + if (dev_priv->gart_info.type == NOUVEAU_GART_AGP) { > + ttm_agp_tt_unpopulate(ttm); > + return; > + } > +#endif > + > #ifdef CONFIG_SWIOTLB > if (swiotlb_nr_tbl()) { > ttm_dma_unpopulate((void *)ttm, dev->dev); > diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c b/drivers/gpu/drm/radeon/radeon_ttm.c > index b0ebaf8..655f8e9 100644 > --- a/drivers/gpu/drm/radeon/radeon_ttm.c > +++ b/drivers/gpu/drm/radeon/radeon_ttm.c > @@ -549,10 +549,12 @@ static struct ttm_backend_func radeon_backend_func = { > .destroy = &radeon_ttm_backend_destroy, > }; > > -struct ttm_tt *radeon_ttm_tt_create(struct ttm_bo_device *bdev, > - unsigned long size, uint32_t page_flags, > +struct ttm_tt *radeon_ttm_tt_create(struct ttm_buffer_object *bo, > + unsigned long size, > + uint32_t page_flags, > struct page *dummy_read_page) > { > + struct ttm_bo_device *bdev = bo->bdev; > struct radeon_device *rdev; > struct radeon_ttm_tt *gtt; > > @@ -588,6 +590,11 @@ static int radeon_ttm_tt_populate(struct ttm_tt *ttm) > return 0; > > rdev = radeon_get_rdev(ttm->bdev); > +#if __OS_HAS_AGP > + if (rdev->flags & RADEON_IS_AGP) { > + return ttm_agp_tt_populate(ttm); > + } > +#endif > > #ifdef CONFIG_SWIOTLB > if (swiotlb_nr_tbl()) { > @@ -624,6 +631,12 @@ static void radeon_ttm_tt_unpopulate(struct ttm_tt *ttm) > unsigned i; > > rdev = radeon_get_rdev(ttm->bdev); > +#if __OS_HAS_AGP > + if (rdev->flags & RADEON_IS_AGP) { > + ttm_agp_tt_unpopulate(ttm); > + return; > + } > +#endif > > #ifdef CONFIG_SWIOTLB > if (swiotlb_nr_tbl()) { > diff --git a/drivers/gpu/drm/ttm/ttm_agp_backend.c b/drivers/gpu/drm/ttm/ttm_agp_backend.c > index 14ebd36..747c141 100644 > --- a/drivers/gpu/drm/ttm/ttm_agp_backend.c > +++ b/drivers/gpu/drm/ttm/ttm_agp_backend.c > @@ -31,6 +31,7 @@ > > #include "ttm/ttm_module.h" > #include "ttm/ttm_bo_driver.h" > +#include "ttm/ttm_page_alloc.h" > #ifdef TTM_HAS_AGP > #include "ttm/ttm_placement.h" > #include <linux/agp_backend.h> > @@ -97,6 +98,7 @@ static void ttm_agp_destroy(struct ttm_tt *ttm) > > if (agp_be->mem) > ttm_agp_unbind(ttm); > + ttm_tt_fini(ttm); > kfree(agp_be); > } > > @@ -129,4 +131,19 @@ struct ttm_tt *ttm_agp_tt_create(struct ttm_bo_device *bdev, > } > EXPORT_SYMBOL(ttm_agp_tt_create); > > +int ttm_agp_tt_populate(struct ttm_tt *ttm) > +{ > + if (ttm->state != tt_unpopulated) > + return 0; > + > + return ttm_pool_populate(ttm); > +} > +EXPORT_SYMBOL(ttm_agp_tt_populate); > + > +void ttm_agp_tt_unpopulate(struct ttm_tt *ttm) > +{ > + ttm_pool_unpopulate(ttm); > +} > +EXPORT_SYMBOL(ttm_agp_tt_unpopulate); > + > #endif > diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c > index 2f0eab6..1adc149 100644 > --- a/drivers/gpu/drm/ttm/ttm_bo.c > +++ b/drivers/gpu/drm/ttm/ttm_bo.c > @@ -338,7 +338,7 @@ static int ttm_bo_add_ttm(struct ttm_buffer_object *bo, bool zero_alloc) > if (zero_alloc) > page_flags |= TTM_PAGE_FLAG_ZERO_ALLOC; > case ttm_bo_type_kernel: > - bo->ttm = bdev->driver->ttm_tt_create(bdev, bo->num_pages << PAGE_SHIFT, > + bo->ttm = bdev->driver->ttm_tt_create(bo, bo->num_pages << PAGE_SHIFT, > page_flags, glob->dummy_read_page); > if (unlikely(bo->ttm == NULL)) > ret = -ENOMEM; > diff --git a/drivers/gpu/drm/ttm/ttm_tt.c b/drivers/gpu/drm/ttm/ttm_tt.c > index 58e1fa1..2f75d20 100644 > --- a/drivers/gpu/drm/ttm/ttm_tt.c > +++ b/drivers/gpu/drm/ttm/ttm_tt.c > @@ -191,6 +191,7 @@ int ttm_tt_init(struct ttm_tt *ttm, struct ttm_bo_device *bdev, > ttm->page_flags = page_flags; > ttm->dummy_read_page = dummy_read_page; > ttm->state = tt_unpopulated; > + ttm->swap_storage = NULL; > > ttm_tt_alloc_page_directory(ttm); > if (!ttm->pages) { > @@ -222,6 +223,7 @@ int ttm_dma_tt_init(struct ttm_dma_tt *ttm_dma, struct ttm_bo_device *bdev, > ttm->page_flags = page_flags; > ttm->dummy_read_page = dummy_read_page; > ttm->state = tt_unpopulated; > + ttm->swap_storage = NULL; > > INIT_LIST_HEAD(&ttm_dma->pages_list); > ttm_dma_tt_alloc_page_directory(ttm_dma); > diff --git a/include/drm/ttm/ttm_bo_driver.h b/include/drm/ttm/ttm_bo_driver.h > index 2be8891..6b67c37 100644 > --- a/include/drm/ttm/ttm_bo_driver.h > +++ b/include/drm/ttm/ttm_bo_driver.h > @@ -318,7 +318,7 @@ struct ttm_bo_driver { > /** > * ttm_tt_create > * > - * @bdev: pointer to a struct ttm_bo_device: > + * @bo: pointer to a struct ttm_bo: > * @size: Size of the data needed backing. > * @page_flags: Page flags as identified by TTM_PAGE_FLAG_XX flags. > * @dummy_read_page: See struct ttm_bo_device. > @@ -328,7 +328,7 @@ struct ttm_bo_driver { > * Returns: > * NULL: Out of memory. > */ > - struct ttm_tt *(*ttm_tt_create)(struct ttm_bo_device *bdev, > + struct ttm_tt *(*ttm_tt_create)(struct ttm_buffer_object *bo, > unsigned long size, > uint32_t page_flags, > struct page *dummy_read_page); > @@ -1030,6 +1030,8 @@ extern struct ttm_tt *ttm_agp_tt_create(struct ttm_bo_device *bdev, > struct agp_bridge_data *bridge, > unsigned long size, uint32_t page_flags, > struct page *dummy_read_page); > +int ttm_agp_tt_populate(struct ttm_tt *ttm); > +void ttm_agp_tt_unpopulate(struct ttm_tt *ttm); > #endif > > #endif _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/dri-devel