diff mbox series

[2/2] drm: add DRIVER_RENDER_ONLY

Message ID 20221011110437.15258-3-christian.koenig@amd.com (mailing list archive)
State New, archived
Headers show
Series [1/2] drm: remove DRM_MINOR_CONTROL | expand

Commit Message

Christian König Oct. 11, 2022, 11:04 a.m. UTC
This allows to suppress creating the primary node. Useful for drivers
which don't expose any display functionality, but are render only by
design.

Signed-off-by: Christian König <christian.koenig@amd.com>
---
 drivers/gpu/drm/drm_drv.c   | 10 ++++++----
 drivers/gpu/drm/drm_prime.c |  2 +-
 include/drm/drm_drv.h       |  7 +++++++
 3 files changed, 14 insertions(+), 5 deletions(-)

Comments

Thomas Zimmermann Oct. 11, 2022, 11:27 a.m. UTC | #1
Hi

Am 11.10.22 um 13:04 schrieb Christian König:
> This allows to suppress creating the primary node. Useful for drivers
> which don't expose any display functionality, but are render only by
> design.
> 
> Signed-off-by: Christian König <christian.koenig@amd.com>
> ---
>   drivers/gpu/drm/drm_drv.c   | 10 ++++++----
>   drivers/gpu/drm/drm_prime.c |  2 +-
>   include/drm/drm_drv.h       |  7 +++++++
>   3 files changed, 14 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c
> index d81783f43452..4a525f78a932 100644
> --- a/drivers/gpu/drm/drm_drv.c
> +++ b/drivers/gpu/drm/drm_drv.c
> @@ -634,9 +634,11 @@ static int drm_dev_init(struct drm_device *dev,
>   			goto err;
>   	}
>   
> -	ret = drm_minor_alloc(dev, DRM_MINOR_PRIMARY);
> -	if (ret)
> -		goto err;
> +	if (!drm_core_check_feature(dev, DRIVER_RENDER_ONLY)) {
> +		ret = drm_minor_alloc(dev, DRM_MINOR_PRIMARY);
> +		if (ret)
> +			goto err;
> +	}
>   
>   	ret = drm_legacy_create_map_hash(dev);
>   	if (ret)
> @@ -902,7 +904,7 @@ int drm_dev_register(struct drm_device *dev, unsigned long flags)
>   		 driver->name, driver->major, driver->minor,
>   		 driver->patchlevel, driver->date,
>   		 dev->dev ? dev_name(dev->dev) : "virtual device",
> -		 dev->primary->index);
> +		 (dev->primary ?: dev->render)->index);
>   
>   	goto out_unlock;
>   
> diff --git a/drivers/gpu/drm/drm_prime.c b/drivers/gpu/drm/drm_prime.c
> index a3f180653b8b..4afd3f15b135 100644
> --- a/drivers/gpu/drm/drm_prime.c
> +++ b/drivers/gpu/drm/drm_prime.c
> @@ -740,7 +740,7 @@ int drm_gem_prime_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma)
>   	}
>   
>   	/* Used by drm_gem_mmap() to lookup the GEM object */
> -	priv->minor = obj->dev->primary;
> +	priv->minor = obj->dev->primary ?: obj->dev->render;
>   	fil->private_data = priv;
>   
>   	ret = drm_vma_node_allow(&obj->vma_node, priv);
> diff --git a/include/drm/drm_drv.h b/include/drm/drm_drv.h
> index f6159acb8856..0a1450d47ca2 100644
> --- a/include/drm/drm_drv.h
> +++ b/include/drm/drm_drv.h
> @@ -94,6 +94,13 @@ enum drm_driver_feature {
>   	 * synchronization of command submission.
>   	 */
>   	DRIVER_SYNCOBJ_TIMELINE         = BIT(6),
> +	/**
> +	 * @DRIVER_RENDER_ONLY
> +	 *
> +	 * Driver is a render node only driver and don't want to support the
> +	 * primary interface.
> +	 */
> +	DRIVER_RENDER_ONLY		= BIT(7),

Is it really necessary to add a new flag?  If a driver sets DRIVER_GEM 
and omits DRIVER_MODESET wouldn't this have the same meaning?

Best regards
Thomas

>   
>   	/* IMPORTANT: Below are all the legacy flags, add new ones above. */
>
Christian König Oct. 11, 2022, 11:28 a.m. UTC | #2
Am 11.10.22 um 13:27 schrieb Thomas Zimmermann:
> Hi
>
> Am 11.10.22 um 13:04 schrieb Christian König:
>> This allows to suppress creating the primary node. Useful for drivers
>> which don't expose any display functionality, but are render only by
>> design.
>>
>> Signed-off-by: Christian König <christian.koenig@amd.com>
>> ---
>>   drivers/gpu/drm/drm_drv.c   | 10 ++++++----
>>   drivers/gpu/drm/drm_prime.c |  2 +-
>>   include/drm/drm_drv.h       |  7 +++++++
>>   3 files changed, 14 insertions(+), 5 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c
>> index d81783f43452..4a525f78a932 100644
>> --- a/drivers/gpu/drm/drm_drv.c
>> +++ b/drivers/gpu/drm/drm_drv.c
>> @@ -634,9 +634,11 @@ static int drm_dev_init(struct drm_device *dev,
>>               goto err;
>>       }
>>   -    ret = drm_minor_alloc(dev, DRM_MINOR_PRIMARY);
>> -    if (ret)
>> -        goto err;
>> +    if (!drm_core_check_feature(dev, DRIVER_RENDER_ONLY)) {
>> +        ret = drm_minor_alloc(dev, DRM_MINOR_PRIMARY);
>> +        if (ret)
>> +            goto err;
>> +    }
>>         ret = drm_legacy_create_map_hash(dev);
>>       if (ret)
>> @@ -902,7 +904,7 @@ int drm_dev_register(struct drm_device *dev, 
>> unsigned long flags)
>>            driver->name, driver->major, driver->minor,
>>            driver->patchlevel, driver->date,
>>            dev->dev ? dev_name(dev->dev) : "virtual device",
>> -         dev->primary->index);
>> +         (dev->primary ?: dev->render)->index);
>>         goto out_unlock;
>>   diff --git a/drivers/gpu/drm/drm_prime.c b/drivers/gpu/drm/drm_prime.c
>> index a3f180653b8b..4afd3f15b135 100644
>> --- a/drivers/gpu/drm/drm_prime.c
>> +++ b/drivers/gpu/drm/drm_prime.c
>> @@ -740,7 +740,7 @@ int drm_gem_prime_mmap(struct drm_gem_object 
>> *obj, struct vm_area_struct *vma)
>>       }
>>         /* Used by drm_gem_mmap() to lookup the GEM object */
>> -    priv->minor = obj->dev->primary;
>> +    priv->minor = obj->dev->primary ?: obj->dev->render;
>>       fil->private_data = priv;
>>         ret = drm_vma_node_allow(&obj->vma_node, priv);
>> diff --git a/include/drm/drm_drv.h b/include/drm/drm_drv.h
>> index f6159acb8856..0a1450d47ca2 100644
>> --- a/include/drm/drm_drv.h
>> +++ b/include/drm/drm_drv.h
>> @@ -94,6 +94,13 @@ enum drm_driver_feature {
>>        * synchronization of command submission.
>>        */
>>       DRIVER_SYNCOBJ_TIMELINE         = BIT(6),
>> +    /**
>> +     * @DRIVER_RENDER_ONLY
>> +     *
>> +     * Driver is a render node only driver and don't want to support 
>> the
>> +     * primary interface.
>> +     */
>> +    DRIVER_RENDER_ONLY        = BIT(7),
>
> Is it really necessary to add a new flag?  If a driver sets DRIVER_GEM 
> and omits DRIVER_MODESET wouldn't this have the same meaning?

Mhm, good point. I haven't thought about that.

Let me double check if anybody is actually using this.

Thanks,
Christian.

>
> Best regards
> Thomas
>
>>         /* IMPORTANT: Below are all the legacy flags, add new ones 
>> above. */
>
diff mbox series

Patch

diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c
index d81783f43452..4a525f78a932 100644
--- a/drivers/gpu/drm/drm_drv.c
+++ b/drivers/gpu/drm/drm_drv.c
@@ -634,9 +634,11 @@  static int drm_dev_init(struct drm_device *dev,
 			goto err;
 	}
 
-	ret = drm_minor_alloc(dev, DRM_MINOR_PRIMARY);
-	if (ret)
-		goto err;
+	if (!drm_core_check_feature(dev, DRIVER_RENDER_ONLY)) {
+		ret = drm_minor_alloc(dev, DRM_MINOR_PRIMARY);
+		if (ret)
+			goto err;
+	}
 
 	ret = drm_legacy_create_map_hash(dev);
 	if (ret)
@@ -902,7 +904,7 @@  int drm_dev_register(struct drm_device *dev, unsigned long flags)
 		 driver->name, driver->major, driver->minor,
 		 driver->patchlevel, driver->date,
 		 dev->dev ? dev_name(dev->dev) : "virtual device",
-		 dev->primary->index);
+		 (dev->primary ?: dev->render)->index);
 
 	goto out_unlock;
 
diff --git a/drivers/gpu/drm/drm_prime.c b/drivers/gpu/drm/drm_prime.c
index a3f180653b8b..4afd3f15b135 100644
--- a/drivers/gpu/drm/drm_prime.c
+++ b/drivers/gpu/drm/drm_prime.c
@@ -740,7 +740,7 @@  int drm_gem_prime_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma)
 	}
 
 	/* Used by drm_gem_mmap() to lookup the GEM object */
-	priv->minor = obj->dev->primary;
+	priv->minor = obj->dev->primary ?: obj->dev->render;
 	fil->private_data = priv;
 
 	ret = drm_vma_node_allow(&obj->vma_node, priv);
diff --git a/include/drm/drm_drv.h b/include/drm/drm_drv.h
index f6159acb8856..0a1450d47ca2 100644
--- a/include/drm/drm_drv.h
+++ b/include/drm/drm_drv.h
@@ -94,6 +94,13 @@  enum drm_driver_feature {
 	 * synchronization of command submission.
 	 */
 	DRIVER_SYNCOBJ_TIMELINE         = BIT(6),
+	/**
+	 * @DRIVER_RENDER_ONLY
+	 *
+	 * Driver is a render node only driver and don't want to support the
+	 * primary interface.
+	 */
+	DRIVER_RENDER_ONLY		= BIT(7),
 
 	/* IMPORTANT: Below are all the legacy flags, add new ones above. */