diff --git a/drivers/gpu/drm/drm_prime.c b/drivers/gpu/drm/drm_prime.c
index 2a54f86856af..9bb30e843a44 100644
--- a/drivers/gpu/drm/drm_prime.c
+++ b/drivers/gpu/drm/drm_prime.c
@@ -923,7 +923,8 @@ struct drm_gem_object *drm_gem_prime_import_dev(struct drm_device *dev,
 		}
 	}
 
-	if (!dev->driver->gem_prime_import_sg_table)
+	if (!dev->driver->gem_prime_import_sg_table &&
+	    !dev->driver->gem_prime_create_object)
 		return ERR_PTR(-EINVAL);
 
 	attach = dma_buf_attach(dma_buf, attach_dev);
@@ -932,25 +933,37 @@ struct drm_gem_object *drm_gem_prime_import_dev(struct drm_device *dev,
 
 	get_dma_buf(dma_buf);
 
-	sgt = dma_buf_map_attachment(attach, DMA_BIDIRECTIONAL);
-	if (IS_ERR(sgt)) {
-		ret = PTR_ERR(sgt);
-		goto fail_detach;
-	}
+	if (dev->driver->gem_prime_create_object) {
+		obj = dev->driver->gem_prime_create_object(dev, attach);
+		if (IS_ERR(obj)) {
+			ret = PTR_ERR(obj);
+			goto fail_detach;
+		}
 
-	obj = dev->driver->gem_prime_import_sg_table(dev, attach, sgt);
-	if (IS_ERR(obj)) {
-		ret = PTR_ERR(obj);
-		goto fail_unmap;
-	}
+		if (!obj->import_attach)
+			obj->import_attach = attach;
+		if (!obj->resv)
+			obj->resv = dma_buf->resv;
+	} else {
+		sgt = dma_buf_map_attachment(attach, DMA_BIDIRECTIONAL);
+		if (IS_ERR(sgt)) {
+			ret = PTR_ERR(sgt);
+			goto fail_detach;
+		}
 
-	obj->import_attach = attach;
-	obj->resv = dma_buf->resv;
+		obj = dev->driver->gem_prime_import_sg_table(dev, attach, sgt);
+		if (IS_ERR(obj)) {
+			ret = PTR_ERR(obj);
+			dma_buf_unmap_attachment(attach, sgt, DMA_BIDIRECTIONAL);
+			goto fail_detach;
+		}
+
+		obj->import_attach = attach;
+		obj->resv = dma_buf->resv;
+	}
 
 	return obj;
 
-fail_unmap:
-	dma_buf_unmap_attachment(attach, sgt, DMA_BIDIRECTIONAL);
 fail_detach:
 	dma_buf_detach(dma_buf, attach);
 	dma_buf_put(dma_buf);
diff --git a/drivers/gpu/drm/tiny/gm12u320.c b/drivers/gpu/drm/tiny/gm12u320.c
index 0b4f4f2af1ef..9f13a7c7c2da 100644
--- a/drivers/gpu/drm/tiny/gm12u320.c
+++ b/drivers/gpu/drm/tiny/gm12u320.c
@@ -601,6 +601,12 @@ static const uint64_t gm12u320_pipe_modifiers[] = {
 
 DEFINE_DRM_GEM_FOPS(gm12u320_fops);
 
+static struct drm_gem_object *gm12u320_gem_prime_create_object(struct drm_device *dev,
+							       struct dma_buf_attachment *attach)
+{
+	return drm_gem_shmem_prime_import_sg_table(dev, attach, NULL);
+}
+
 static const struct drm_driver gm12u320_drm_driver = {
 	.driver_features = DRIVER_MODESET | DRIVER_GEM | DRIVER_ATOMIC,
 
@@ -612,6 +618,7 @@ static const struct drm_driver gm12u320_drm_driver = {
 
 	.fops		 = &gm12u320_fops,
 	DRM_GEM_SHMEM_DRIVER_OPS,
+	.gem_prime_create_object = gm12u320_gem_prime_create_object,
 };
 
 static const struct drm_mode_config_funcs gm12u320_mode_config_funcs = {
diff --git a/drivers/gpu/drm/udl/udl_drv.c b/drivers/gpu/drm/udl/udl_drv.c
index 9269092697d8..fdf37b44a956 100644
--- a/drivers/gpu/drm/udl/udl_drv.c
+++ b/drivers/gpu/drm/udl/udl_drv.c
@@ -34,12 +34,19 @@ static int udl_usb_resume(struct usb_interface *interface)
 
 DEFINE_DRM_GEM_FOPS(udl_driver_fops);
 
+static struct drm_gem_object *udl_gem_prime_create_object(struct drm_device *dev,
+							  struct dma_buf_attachment *attach)
+{
+	return drm_gem_shmem_prime_import_sg_table(dev, attach, NULL);
+}
+
 static const struct drm_driver driver = {
 	.driver_features = DRIVER_ATOMIC | DRIVER_GEM | DRIVER_MODESET,
 
 	/* GEM hooks */
 	.fops = &udl_driver_fops,
 	DRM_GEM_SHMEM_DRIVER_OPS,
+	.gem_prime_create_object = udl_gem_prime_create_object,
 
 	.name = DRIVER_NAME,
 	.desc = DRIVER_DESC,
diff --git a/include/drm/drm_drv.h b/include/drm/drm_drv.h
index 827838e0a97e..77657d649ca6 100644
--- a/include/drm/drm_drv.h
+++ b/include/drm/drm_drv.h
@@ -369,11 +369,23 @@ struct drm_driver {
 	 */
 	struct drm_gem_object * (*gem_prime_import)(struct drm_device *dev,
 				struct dma_buf *dma_buf);
+	/**
+	 * @gem_prime_create_object:
+	 *
+	 * Optional hook used by the PRIME helper functions
+	 * drm_gem_prime_import() respectively drm_gem_prime_import_dev().
+	 */
+	struct drm_gem_object *(*gem_prime_create_object)(
+				struct drm_device *dev,
+				struct dma_buf_attachment *attach);
 	/**
 	 * @gem_prime_import_sg_table:
 	 *
 	 * Optional hook used by the PRIME helper functions
 	 * drm_gem_prime_import() respectively drm_gem_prime_import_dev().
+	 *
+	 * TODO: This function is deprecated in favor of @drm_driver.gem_prime_create_object.
+	 * Drivers should switch over and implement SG-table support by themselves.
 	 */
 	struct drm_gem_object *(*gem_prime_import_sg_table)(
 				struct drm_device *dev,
