<html>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=windows-1252">
</head>
<body text="#000000" bgcolor="#FFFFFF">
<div class="moz-cite-prefix">Thanks, as discussed internally I've
just pushed those two to drm-misc-next instead of
amd-staging-drm-next.<br>
<br>
Christian.<br>
<br>
Am 28.10.19 um 16:38 schrieb Deucher, Alexander:<br>
</div>
<blockquote type="cite"
cite="mid:DM5PR12MB1820ECFFCFAFCAD6FB7D8F55F7660@DM5PR12MB1820.namprd12.prod.outlook.com">
<meta http-equiv="Content-Type" content="text/html;
charset=windows-1252">
<style type="text/css" style="display:none;"> P {margin-top:0;margin-bottom:0;} </style>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif;
font-size: 12pt; color: rgb(0, 0, 0);">
Series is:</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif;
font-size: 12pt; color: rgb(0, 0, 0);">
Reviewed-by: Alex Deucher <a class="moz-txt-link-rfc2396E" href="mailto:alexander.deucher@amd.com"><alexander.deucher@amd.com></a><br>
</div>
<hr style="display:inline-block;width:98%" tabindex="-1">
<div id="divRplyFwdMsg" dir="ltr"><font style="font-size:11pt"
face="Calibri, sans-serif" color="#000000"><b>From:</b>
amd-gfx <a class="moz-txt-link-rfc2396E" href="mailto:amd-gfx-bounces@lists.freedesktop.org"><amd-gfx-bounces@lists.freedesktop.org></a> on
behalf of Christian König
<a class="moz-txt-link-rfc2396E" href="mailto:ckoenig.leichtzumerken@gmail.com"><ckoenig.leichtzumerken@gmail.com></a><br>
<b>Sent:</b> Monday, October 28, 2019 11:14 AM<br>
<b>To:</b> <a class="moz-txt-link-abbreviated" href="mailto:amd-gfx@lists.freedesktop.org">amd-gfx@lists.freedesktop.org</a>
<a class="moz-txt-link-rfc2396E" href="mailto:amd-gfx@lists.freedesktop.org"><amd-gfx@lists.freedesktop.org></a><br>
<b>Subject:</b> [PATCH 2/2] drm/amdgpu: add independent
DMA-buf import v9</font>
<div> </div>
</div>
<div class="BodyFragment"><font size="2"><span
style="font-size:11pt;">
<div class="PlainText">Instead of relying on the DRM
functions just implement our own import<br>
functions. This prepares support for taking care of
unpinned DMA-buf.<br>
<br>
v2: enable for all exporters, not just amdgpu, fix
invalidation<br>
handling, lock reservation object while setting
callback<br>
v3: change to new dma_buf attach interface<br>
v4: split out from unpinned DMA-buf work<br>
v5: rebased and cleanup on new DMA-buf interface<br>
v6: squash with invalidation callback change,<br>
stop using _(map|unmap)_locked<br>
v7: drop invalidations when the BO is already in system
domain<br>
v8: rebase on new DMA-buf patch and drop move notification<br>
v9: cleanup comments<br>
<br>
Signed-off-by: Christian König
<a class="moz-txt-link-rfc2396E" href="mailto:christian.koenig@amd.com"><christian.koenig@amd.com></a><br>
---<br>
drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c | 43
++++++++++++---------<br>
drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.h | 4 --<br>
drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 1 -<br>
drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 32
++++++++++++---<br>
4 files changed, 52 insertions(+), 28 deletions(-)<br>
<br>
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c
b/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c<br>
index f14b52cc7205..d5bcdfefbad6 100644<br>
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c<br>
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c<br>
@@ -370,31 +370,28 @@ struct dma_buf
*amdgpu_gem_prime_export(struct drm_gem_object *gobj,<br>
}<br>
<br>
/**<br>
- * amdgpu_gem_prime_import_sg_table -
&drm_driver.gem_prime_import_sg_table<br>
- * implementation<br>
+ * amdgpu_dma_buf_create_obj - create BO for DMA-buf
import<br>
+ *<br>
* @dev: DRM device<br>
- * @attach: DMA-buf attachment<br>
- * @sg: Scatter/gather table<br>
+ * @dma_buf: DMA-buf<br>
*<br>
- * Imports shared DMA buffer memory exported by another
device.<br>
+ * Creates an empty SG BO for DMA-buf import.<br>
*<br>
* Returns:<br>
* A new GEM BO of the given DRM device, representing the
memory<br>
* described by the given DMA-buf attachment and
scatter/gather table.<br>
*/<br>
-struct drm_gem_object *<br>
-amdgpu_gem_prime_import_sg_table(struct drm_device *dev,<br>
- struct dma_buf_attachment
*attach,<br>
- struct sg_table *sg)<br>
+static struct drm_gem_object *<br>
+amdgpu_dma_buf_create_obj(struct drm_device *dev, struct
dma_buf *dma_buf)<br>
{<br>
- struct dma_resv *resv =
attach->dmabuf->resv;<br>
+ struct dma_resv *resv = dma_buf->resv;<br>
struct amdgpu_device *adev = dev->dev_private;<br>
struct amdgpu_bo *bo;<br>
struct amdgpu_bo_param bp;<br>
int ret;<br>
<br>
memset(&bp, 0, sizeof(bp));<br>
- bp.size = attach->dmabuf->size;<br>
+ bp.size = dma_buf->size;<br>
bp.byte_align = PAGE_SIZE;<br>
bp.domain = AMDGPU_GEM_DOMAIN_CPU;<br>
bp.flags = 0;<br>
@@ -405,11 +402,9 @@
amdgpu_gem_prime_import_sg_table(struct drm_device *dev,<br>
if (ret)<br>
goto error;<br>
<br>
- bo->tbo.sg = sg;<br>
- bo->tbo.ttm->sg = sg;<br>
bo->allowed_domains = AMDGPU_GEM_DOMAIN_GTT;<br>
bo->preferred_domains = AMDGPU_GEM_DOMAIN_GTT;<br>
- if (attach->dmabuf->ops !=
&amdgpu_dmabuf_ops)<br>
+ if (dma_buf->ops != &amdgpu_dmabuf_ops)<br>
bo->prime_shared_count = 1;<br>
<br>
dma_resv_unlock(resv);<br>
@@ -425,15 +420,15 @@
amdgpu_gem_prime_import_sg_table(struct drm_device *dev,<br>
* @dev: DRM device<br>
* @dma_buf: Shared DMA buffer<br>
*<br>
- * The main work is done by the &drm_gem_prime_import
helper, which in turn<br>
- * uses &amdgpu_gem_prime_import_sg_table.<br>
+ * Import a dma_buf into a the driver and potentially
create a new GEM object.<br>
*<br>
* Returns:<br>
* GEM BO representing the shared DMA buffer for the
given device.<br>
*/<br>
struct drm_gem_object *amdgpu_gem_prime_import(struct
drm_device *dev,<br>
- struct dma_buf
*dma_buf)<br>
+ struct
dma_buf *dma_buf)<br>
{<br>
+ struct dma_buf_attachment *attach;<br>
struct drm_gem_object *obj;<br>
<br>
if (dma_buf->ops == &amdgpu_dmabuf_ops) {<br>
@@ -448,5 +443,17 @@ struct drm_gem_object
*amdgpu_gem_prime_import(struct drm_device *dev,<br>
}<br>
}<br>
<br>
- return drm_gem_prime_import(dev, dma_buf);<br>
+ obj = amdgpu_dma_buf_create_obj(dev, dma_buf);<br>
+ if (IS_ERR(obj))<br>
+ return obj;<br>
+<br>
+ attach = dma_buf_dynamic_attach(dma_buf,
dev->dev, true);<br>
+ if (IS_ERR(attach)) {<br>
+ drm_gem_object_put(obj);<br>
+ return ERR_CAST(attach);<br>
+ }<br>
+<br>
+ get_dma_buf(dma_buf);<br>
+ obj->import_attach = attach;<br>
+ return obj;<br>
}<br>
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.h
b/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.h<br>
index ce1b3f017451..ec447a7b6b28 100644<br>
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.h<br>
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.h<br>
@@ -25,10 +25,6 @@<br>
<br>
#include <drm/drm_gem.h><br>
<br>
-struct drm_gem_object *<br>
-amdgpu_gem_prime_import_sg_table(struct drm_device *dev,<br>
- struct dma_buf_attachment
*attach,<br>
- struct sg_table *sg);<br>
struct dma_buf *amdgpu_gem_prime_export(struct
drm_gem_object *gobj,<br>
int flags);<br>
struct drm_gem_object *amdgpu_gem_prime_import(struct
drm_device *dev,<br>
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c<br>
index 8805776c8c52..25adf2b847e8 100644<br>
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c<br>
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c<br>
@@ -1445,7 +1445,6 @@ static struct drm_driver kms_driver
= {<br>
.prime_fd_to_handle = drm_gem_prime_fd_to_handle,<br>
.gem_prime_export = amdgpu_gem_prime_export,<br>
.gem_prime_import = amdgpu_gem_prime_import,<br>
- .gem_prime_import_sg_table =
amdgpu_gem_prime_import_sg_table,<br>
.gem_prime_vmap = amdgpu_gem_prime_vmap,<br>
.gem_prime_vunmap = amdgpu_gem_prime_vunmap,<br>
.gem_prime_mmap = amdgpu_gem_prime_mmap,<br>
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c<br>
index 8e867b8b432f..c19100ced040 100644<br>
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c<br>
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c<br>
@@ -39,6 +39,7 @@<br>
#include <linux/slab.h><br>
#include <linux/swap.h><br>
#include <linux/swiotlb.h><br>
+#include <linux/dma-buf.h><br>
<br>
#include <drm/ttm/ttm_bo_api.h><br>
#include <drm/ttm/ttm_bo_driver.h><br>
@@ -763,6 +764,7 @@ static unsigned long
amdgpu_ttm_io_mem_pfn(struct ttm_buffer_object *bo,<br>
*/<br>
struct amdgpu_ttm_tt {<br>
struct ttm_dma_tt ttm;<br>
+ struct drm_gem_object *gobj;<br>
u64 offset;<br>
uint64_t userptr;<br>
struct task_struct *usertask;<br>
@@ -1227,6 +1229,7 @@ static struct ttm_tt
*amdgpu_ttm_tt_create(struct ttm_buffer_object *bo,<br>
return NULL;<br>
}<br>
gtt->ttm.ttm.func = &amdgpu_backend_func;<br>
+ gtt->gobj = &bo->base;<br>
<br>
/* allocate space for the uninitialized page
entries */<br>
if (ttm_sg_tt_init(>t->ttm, bo,
page_flags)) {<br>
@@ -1247,7 +1250,6 @@ static int
amdgpu_ttm_tt_populate(struct ttm_tt *ttm,<br>
{<br>
struct amdgpu_device *adev =
amdgpu_ttm_adev(ttm->bdev);<br>
struct amdgpu_ttm_tt *gtt = (void *)ttm;<br>
- bool slave = !!(ttm->page_flags &
TTM_PAGE_FLAG_SG);<br>
<br>
/* user pages are bound by
amdgpu_ttm_tt_pin_userptr() */<br>
if (gtt && gtt->userptr) {<br>
@@ -1260,7 +1262,19 @@ static int
amdgpu_ttm_tt_populate(struct ttm_tt *ttm,<br>
return 0;<br>
}<br>
<br>
- if (slave && ttm->sg) {<br>
+ if (ttm->page_flags & TTM_PAGE_FLAG_SG) {<br>
+ if (!ttm->sg) {<br>
+ struct dma_buf_attachment *attach;<br>
+ struct sg_table *sgt;<br>
+<br>
+ attach =
gtt->gobj->import_attach;<br>
+ sgt =
dma_buf_map_attachment(attach, DMA_BIDIRECTIONAL);<br>
+ if (IS_ERR(sgt))<br>
+ return PTR_ERR(sgt);<br>
+<br>
+ ttm->sg = sgt;<br>
+ }<br>
+<br>
drm_prime_sg_to_page_addr_arrays(ttm->sg,
ttm->pages,<br>
gtt->ttm.dma_address,<br>
ttm->num_pages);<br>
@@ -1287,9 +1301,8 @@ static int
amdgpu_ttm_tt_populate(struct ttm_tt *ttm,<br>
*/<br>
static void amdgpu_ttm_tt_unpopulate(struct ttm_tt *ttm)<br>
{<br>
- struct amdgpu_device *adev;<br>
struct amdgpu_ttm_tt *gtt = (void *)ttm;<br>
- bool slave = !!(ttm->page_flags &
TTM_PAGE_FLAG_SG);<br>
+ struct amdgpu_device *adev;<br>
<br>
if (gtt && gtt->userptr) {<br>
amdgpu_ttm_tt_set_user_pages(ttm, NULL);<br>
@@ -1298,7 +1311,16 @@ static void
amdgpu_ttm_tt_unpopulate(struct ttm_tt *ttm)<br>
return;<br>
}<br>
<br>
- if (slave)<br>
+ if (ttm->sg &&
gtt->gobj->import_attach) {<br>
+ struct dma_buf_attachment *attach;<br>
+<br>
+ attach = gtt->gobj->import_attach;<br>
+ dma_buf_unmap_attachment(attach,
ttm->sg, DMA_BIDIRECTIONAL);<br>
+ ttm->sg = NULL;<br>
+ return;<br>
+ }<br>
+<br>
+ if (ttm->page_flags & TTM_PAGE_FLAG_SG)<br>
return;<br>
<br>
adev = amdgpu_ttm_adev(ttm->bdev);<br>
-- <br>
2.17.1<br>
<br>
_______________________________________________<br>
amd-gfx mailing list<br>
<a class="moz-txt-link-abbreviated" href="mailto:amd-gfx@lists.freedesktop.org">amd-gfx@lists.freedesktop.org</a><br>
<a
href="https://lists.freedesktop.org/mailman/listinfo/amd-gfx"
moz-do-not-send="true">https://lists.freedesktop.org/mailman/listinfo/amd-gfx</a></div>
</span></font></div>
</blockquote>
<br>
</body>
</html>