diff mbox series

[v7,7/9] drm/ttm: Add a parameter to add extra pages into ttm_tt

Message ID 20220401123751.27771-8-ramalingam.c@intel.com (mailing list archive)
State New, archived
Headers show
Series drm/i915/ttm: Evict and restore of compressed object | expand

Commit Message

Ramalingam C April 1, 2022, 12:37 p.m. UTC
Add a parameter called "extra_pages" for ttm_tt_init, to indicate that
driver needs extra pages in ttm_tt.

v2:
  Used imperative wording [Thomas and Christian]

Signed-off-by: Ramalingam C <ramalingam.c@intel.com>
cc: Christian Koenig <christian.koenig@amd.com>
cc: Hellstrom Thomas <thomas.hellstrom@intel.com>
Reviewed-by: Thomas Hellstrom <thomas.hellstrom@linux.intel.com>
Reviewed-by: Christian Konig <christian.koenig@amd.com>
Reviewed-by: Nirmoy Das <nirmoy.das@intel.com>
---
 drivers/gpu/drm/drm_gem_vram_helper.c      |  2 +-
 drivers/gpu/drm/i915/gem/i915_gem_ttm.c    |  2 +-
 drivers/gpu/drm/qxl/qxl_ttm.c              |  2 +-
 drivers/gpu/drm/ttm/ttm_agp_backend.c      |  2 +-
 drivers/gpu/drm/ttm/ttm_tt.c               | 12 +++++++-----
 drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c |  2 +-
 include/drm/ttm/ttm_tt.h                   |  4 +++-
 7 files changed, 15 insertions(+), 11 deletions(-)

Comments

Ramalingam C April 1, 2022, 2:28 p.m. UTC | #1
Christian, Joonas and vivi

Once the premerge results are greeen, if this patch can be merged into
drm-intel-gt-next along with other patches could you please ack the
request to merge into drm-intel-gt-next?

Thanks
Ram

On 2022-04-01 at 18:07:49 +0530, Ramalingam C wrote:
> Add a parameter called "extra_pages" for ttm_tt_init, to indicate that
> driver needs extra pages in ttm_tt.
> 
> v2:
>   Used imperative wording [Thomas and Christian]
> 
> Signed-off-by: Ramalingam C <ramalingam.c@intel.com>
> cc: Christian Koenig <christian.koenig@amd.com>
> cc: Hellstrom Thomas <thomas.hellstrom@intel.com>
> Reviewed-by: Thomas Hellstrom <thomas.hellstrom@linux.intel.com>
> Reviewed-by: Christian Konig <christian.koenig@amd.com>
> Reviewed-by: Nirmoy Das <nirmoy.das@intel.com>
> ---
>  drivers/gpu/drm/drm_gem_vram_helper.c      |  2 +-
>  drivers/gpu/drm/i915/gem/i915_gem_ttm.c    |  2 +-
>  drivers/gpu/drm/qxl/qxl_ttm.c              |  2 +-
>  drivers/gpu/drm/ttm/ttm_agp_backend.c      |  2 +-
>  drivers/gpu/drm/ttm/ttm_tt.c               | 12 +++++++-----
>  drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c |  2 +-
>  include/drm/ttm/ttm_tt.h                   |  4 +++-
>  7 files changed, 15 insertions(+), 11 deletions(-)
> 
> diff --git a/drivers/gpu/drm/drm_gem_vram_helper.c b/drivers/gpu/drm/drm_gem_vram_helper.c
> index dc7f938bfff2..123045b58fec 100644
> --- a/drivers/gpu/drm/drm_gem_vram_helper.c
> +++ b/drivers/gpu/drm/drm_gem_vram_helper.c
> @@ -867,7 +867,7 @@ static struct ttm_tt *bo_driver_ttm_tt_create(struct ttm_buffer_object *bo,
>  	if (!tt)
>  		return NULL;
>  
> -	ret = ttm_tt_init(tt, bo, page_flags, ttm_cached);
> +	ret = ttm_tt_init(tt, bo, page_flags, ttm_cached, 0);
>  	if (ret < 0)
>  		goto err_ttm_tt_init;
>  
> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_ttm.c b/drivers/gpu/drm/i915/gem/i915_gem_ttm.c
> index c40aca99442f..a878910a563c 100644
> --- a/drivers/gpu/drm/i915/gem/i915_gem_ttm.c
> +++ b/drivers/gpu/drm/i915/gem/i915_gem_ttm.c
> @@ -293,7 +293,7 @@ static struct ttm_tt *i915_ttm_tt_create(struct ttm_buffer_object *bo,
>  		i915_tt->is_shmem = true;
>  	}
>  
> -	ret = ttm_tt_init(&i915_tt->ttm, bo, page_flags, caching);
> +	ret = ttm_tt_init(&i915_tt->ttm, bo, page_flags, caching, 0);
>  	if (ret)
>  		goto err_free;
>  
> diff --git a/drivers/gpu/drm/qxl/qxl_ttm.c b/drivers/gpu/drm/qxl/qxl_ttm.c
> index 95df5750f47f..9ba871bd19b1 100644
> --- a/drivers/gpu/drm/qxl/qxl_ttm.c
> +++ b/drivers/gpu/drm/qxl/qxl_ttm.c
> @@ -113,7 +113,7 @@ static struct ttm_tt *qxl_ttm_tt_create(struct ttm_buffer_object *bo,
>  	ttm = kzalloc(sizeof(struct ttm_tt), GFP_KERNEL);
>  	if (ttm == NULL)
>  		return NULL;
> -	if (ttm_tt_init(ttm, bo, page_flags, ttm_cached)) {
> +	if (ttm_tt_init(ttm, bo, page_flags, ttm_cached, 0)) {
>  		kfree(ttm);
>  		return NULL;
>  	}
> diff --git a/drivers/gpu/drm/ttm/ttm_agp_backend.c b/drivers/gpu/drm/ttm/ttm_agp_backend.c
> index 6ddc16f0fe2b..d27691f2e451 100644
> --- a/drivers/gpu/drm/ttm/ttm_agp_backend.c
> +++ b/drivers/gpu/drm/ttm/ttm_agp_backend.c
> @@ -134,7 +134,7 @@ struct ttm_tt *ttm_agp_tt_create(struct ttm_buffer_object *bo,
>  	agp_be->mem = NULL;
>  	agp_be->bridge = bridge;
>  
> -	if (ttm_tt_init(&agp_be->ttm, bo, page_flags, ttm_write_combined)) {
> +	if (ttm_tt_init(&agp_be->ttm, bo, page_flags, ttm_write_combined, 0)) {
>  		kfree(agp_be);
>  		return NULL;
>  	}
> diff --git a/drivers/gpu/drm/ttm/ttm_tt.c b/drivers/gpu/drm/ttm/ttm_tt.c
> index d234aab800a0..1a66d9fc589a 100644
> --- a/drivers/gpu/drm/ttm/ttm_tt.c
> +++ b/drivers/gpu/drm/ttm/ttm_tt.c
> @@ -134,9 +134,10 @@ void ttm_tt_destroy(struct ttm_device *bdev, struct ttm_tt *ttm)
>  static void ttm_tt_init_fields(struct ttm_tt *ttm,
>  			       struct ttm_buffer_object *bo,
>  			       uint32_t page_flags,
> -			       enum ttm_caching caching)
> +			       enum ttm_caching caching,
> +			       unsigned long extra_pages)
>  {
> -	ttm->num_pages = PAGE_ALIGN(bo->base.size) >> PAGE_SHIFT;
> +	ttm->num_pages = (PAGE_ALIGN(bo->base.size) >> PAGE_SHIFT) + extra_pages;
>  	ttm->caching = ttm_cached;
>  	ttm->page_flags = page_flags;
>  	ttm->dma_address = NULL;
> @@ -146,9 +147,10 @@ static void ttm_tt_init_fields(struct ttm_tt *ttm,
>  }
>  
>  int ttm_tt_init(struct ttm_tt *ttm, struct ttm_buffer_object *bo,
> -		uint32_t page_flags, enum ttm_caching caching)
> +		uint32_t page_flags, enum ttm_caching caching,
> +		unsigned long extra_pages)
>  {
> -	ttm_tt_init_fields(ttm, bo, page_flags, caching);
> +	ttm_tt_init_fields(ttm, bo, page_flags, caching, extra_pages);
>  
>  	if (ttm_tt_alloc_page_directory(ttm)) {
>  		pr_err("Failed allocating page table\n");
> @@ -180,7 +182,7 @@ int ttm_sg_tt_init(struct ttm_tt *ttm, struct ttm_buffer_object *bo,
>  {
>  	int ret;
>  
> -	ttm_tt_init_fields(ttm, bo, page_flags, caching);
> +	ttm_tt_init_fields(ttm, bo, page_flags, caching, 0);
>  
>  	if (page_flags & TTM_TT_FLAG_EXTERNAL)
>  		ret = ttm_sg_tt_alloc_page_directory(ttm);
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c b/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c
> index b84ecc6d6611..4e3938e62c08 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c
> @@ -517,7 +517,7 @@ static struct ttm_tt *vmw_ttm_tt_create(struct ttm_buffer_object *bo,
>  				     ttm_cached);
>  	else
>  		ret = ttm_tt_init(&vmw_be->dma_ttm, bo, page_flags,
> -				  ttm_cached);
> +				  ttm_cached, 0);
>  	if (unlikely(ret != 0))
>  		goto out_no_init;
>  
> diff --git a/include/drm/ttm/ttm_tt.h b/include/drm/ttm/ttm_tt.h
> index f20832139815..17a0310e8aaa 100644
> --- a/include/drm/ttm/ttm_tt.h
> +++ b/include/drm/ttm/ttm_tt.h
> @@ -140,6 +140,7 @@ int ttm_tt_create(struct ttm_buffer_object *bo, bool zero_alloc);
>   * @bo: The buffer object we create the ttm for.
>   * @page_flags: Page flags as identified by TTM_TT_FLAG_XX flags.
>   * @caching: the desired caching state of the pages
> + * @extra_pages: Extra pages needed for the driver.
>   *
>   * Create a struct ttm_tt to back data with system memory pages.
>   * No pages are actually allocated.
> @@ -147,7 +148,8 @@ int ttm_tt_create(struct ttm_buffer_object *bo, bool zero_alloc);
>   * NULL: Out of memory.
>   */
>  int ttm_tt_init(struct ttm_tt *ttm, struct ttm_buffer_object *bo,
> -		uint32_t page_flags, enum ttm_caching caching);
> +		uint32_t page_flags, enum ttm_caching caching,
> +		unsigned long extra_pages);
>  int ttm_sg_tt_init(struct ttm_tt *ttm_dma, struct ttm_buffer_object *bo,
>  		   uint32_t page_flags, enum ttm_caching caching);
>  
> -- 
> 2.20.1
>
Christian König April 1, 2022, 2:31 p.m. UTC | #2
I would be nicer to push this through drm-misc-next, but the intel 
branch works for me as well.

Regards,
Christian.

Am 01.04.22 um 16:28 schrieb Ramalingam C:
> Christian, Joonas and vivi
>
> Once the premerge results are greeen, if this patch can be merged into
> drm-intel-gt-next along with other patches could you please ack the
> request to merge into drm-intel-gt-next?
>
> Thanks
> Ram
>
> On 2022-04-01 at 18:07:49 +0530, Ramalingam C wrote:
>> Add a parameter called "extra_pages" for ttm_tt_init, to indicate that
>> driver needs extra pages in ttm_tt.
>>
>> v2:
>>    Used imperative wording [Thomas and Christian]
>>
>> Signed-off-by: Ramalingam C <ramalingam.c@intel.com>
>> cc: Christian Koenig <christian.koenig@amd.com>
>> cc: Hellstrom Thomas <thomas.hellstrom@intel.com>
>> Reviewed-by: Thomas Hellstrom <thomas.hellstrom@linux.intel.com>
>> Reviewed-by: Christian Konig <christian.koenig@amd.com>
>> Reviewed-by: Nirmoy Das <nirmoy.das@intel.com>
>> ---
>>   drivers/gpu/drm/drm_gem_vram_helper.c      |  2 +-
>>   drivers/gpu/drm/i915/gem/i915_gem_ttm.c    |  2 +-
>>   drivers/gpu/drm/qxl/qxl_ttm.c              |  2 +-
>>   drivers/gpu/drm/ttm/ttm_agp_backend.c      |  2 +-
>>   drivers/gpu/drm/ttm/ttm_tt.c               | 12 +++++++-----
>>   drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c |  2 +-
>>   include/drm/ttm/ttm_tt.h                   |  4 +++-
>>   7 files changed, 15 insertions(+), 11 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/drm_gem_vram_helper.c b/drivers/gpu/drm/drm_gem_vram_helper.c
>> index dc7f938bfff2..123045b58fec 100644
>> --- a/drivers/gpu/drm/drm_gem_vram_helper.c
>> +++ b/drivers/gpu/drm/drm_gem_vram_helper.c
>> @@ -867,7 +867,7 @@ static struct ttm_tt *bo_driver_ttm_tt_create(struct ttm_buffer_object *bo,
>>   	if (!tt)
>>   		return NULL;
>>   
>> -	ret = ttm_tt_init(tt, bo, page_flags, ttm_cached);
>> +	ret = ttm_tt_init(tt, bo, page_flags, ttm_cached, 0);
>>   	if (ret < 0)
>>   		goto err_ttm_tt_init;
>>   
>> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_ttm.c b/drivers/gpu/drm/i915/gem/i915_gem_ttm.c
>> index c40aca99442f..a878910a563c 100644
>> --- a/drivers/gpu/drm/i915/gem/i915_gem_ttm.c
>> +++ b/drivers/gpu/drm/i915/gem/i915_gem_ttm.c
>> @@ -293,7 +293,7 @@ static struct ttm_tt *i915_ttm_tt_create(struct ttm_buffer_object *bo,
>>   		i915_tt->is_shmem = true;
>>   	}
>>   
>> -	ret = ttm_tt_init(&i915_tt->ttm, bo, page_flags, caching);
>> +	ret = ttm_tt_init(&i915_tt->ttm, bo, page_flags, caching, 0);
>>   	if (ret)
>>   		goto err_free;
>>   
>> diff --git a/drivers/gpu/drm/qxl/qxl_ttm.c b/drivers/gpu/drm/qxl/qxl_ttm.c
>> index 95df5750f47f..9ba871bd19b1 100644
>> --- a/drivers/gpu/drm/qxl/qxl_ttm.c
>> +++ b/drivers/gpu/drm/qxl/qxl_ttm.c
>> @@ -113,7 +113,7 @@ static struct ttm_tt *qxl_ttm_tt_create(struct ttm_buffer_object *bo,
>>   	ttm = kzalloc(sizeof(struct ttm_tt), GFP_KERNEL);
>>   	if (ttm == NULL)
>>   		return NULL;
>> -	if (ttm_tt_init(ttm, bo, page_flags, ttm_cached)) {
>> +	if (ttm_tt_init(ttm, bo, page_flags, ttm_cached, 0)) {
>>   		kfree(ttm);
>>   		return NULL;
>>   	}
>> diff --git a/drivers/gpu/drm/ttm/ttm_agp_backend.c b/drivers/gpu/drm/ttm/ttm_agp_backend.c
>> index 6ddc16f0fe2b..d27691f2e451 100644
>> --- a/drivers/gpu/drm/ttm/ttm_agp_backend.c
>> +++ b/drivers/gpu/drm/ttm/ttm_agp_backend.c
>> @@ -134,7 +134,7 @@ struct ttm_tt *ttm_agp_tt_create(struct ttm_buffer_object *bo,
>>   	agp_be->mem = NULL;
>>   	agp_be->bridge = bridge;
>>   
>> -	if (ttm_tt_init(&agp_be->ttm, bo, page_flags, ttm_write_combined)) {
>> +	if (ttm_tt_init(&agp_be->ttm, bo, page_flags, ttm_write_combined, 0)) {
>>   		kfree(agp_be);
>>   		return NULL;
>>   	}
>> diff --git a/drivers/gpu/drm/ttm/ttm_tt.c b/drivers/gpu/drm/ttm/ttm_tt.c
>> index d234aab800a0..1a66d9fc589a 100644
>> --- a/drivers/gpu/drm/ttm/ttm_tt.c
>> +++ b/drivers/gpu/drm/ttm/ttm_tt.c
>> @@ -134,9 +134,10 @@ void ttm_tt_destroy(struct ttm_device *bdev, struct ttm_tt *ttm)
>>   static void ttm_tt_init_fields(struct ttm_tt *ttm,
>>   			       struct ttm_buffer_object *bo,
>>   			       uint32_t page_flags,
>> -			       enum ttm_caching caching)
>> +			       enum ttm_caching caching,
>> +			       unsigned long extra_pages)
>>   {
>> -	ttm->num_pages = PAGE_ALIGN(bo->base.size) >> PAGE_SHIFT;
>> +	ttm->num_pages = (PAGE_ALIGN(bo->base.size) >> PAGE_SHIFT) + extra_pages;
>>   	ttm->caching = ttm_cached;
>>   	ttm->page_flags = page_flags;
>>   	ttm->dma_address = NULL;
>> @@ -146,9 +147,10 @@ static void ttm_tt_init_fields(struct ttm_tt *ttm,
>>   }
>>   
>>   int ttm_tt_init(struct ttm_tt *ttm, struct ttm_buffer_object *bo,
>> -		uint32_t page_flags, enum ttm_caching caching)
>> +		uint32_t page_flags, enum ttm_caching caching,
>> +		unsigned long extra_pages)
>>   {
>> -	ttm_tt_init_fields(ttm, bo, page_flags, caching);
>> +	ttm_tt_init_fields(ttm, bo, page_flags, caching, extra_pages);
>>   
>>   	if (ttm_tt_alloc_page_directory(ttm)) {
>>   		pr_err("Failed allocating page table\n");
>> @@ -180,7 +182,7 @@ int ttm_sg_tt_init(struct ttm_tt *ttm, struct ttm_buffer_object *bo,
>>   {
>>   	int ret;
>>   
>> -	ttm_tt_init_fields(ttm, bo, page_flags, caching);
>> +	ttm_tt_init_fields(ttm, bo, page_flags, caching, 0);
>>   
>>   	if (page_flags & TTM_TT_FLAG_EXTERNAL)
>>   		ret = ttm_sg_tt_alloc_page_directory(ttm);
>> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c b/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c
>> index b84ecc6d6611..4e3938e62c08 100644
>> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c
>> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c
>> @@ -517,7 +517,7 @@ static struct ttm_tt *vmw_ttm_tt_create(struct ttm_buffer_object *bo,
>>   				     ttm_cached);
>>   	else
>>   		ret = ttm_tt_init(&vmw_be->dma_ttm, bo, page_flags,
>> -				  ttm_cached);
>> +				  ttm_cached, 0);
>>   	if (unlikely(ret != 0))
>>   		goto out_no_init;
>>   
>> diff --git a/include/drm/ttm/ttm_tt.h b/include/drm/ttm/ttm_tt.h
>> index f20832139815..17a0310e8aaa 100644
>> --- a/include/drm/ttm/ttm_tt.h
>> +++ b/include/drm/ttm/ttm_tt.h
>> @@ -140,6 +140,7 @@ int ttm_tt_create(struct ttm_buffer_object *bo, bool zero_alloc);
>>    * @bo: The buffer object we create the ttm for.
>>    * @page_flags: Page flags as identified by TTM_TT_FLAG_XX flags.
>>    * @caching: the desired caching state of the pages
>> + * @extra_pages: Extra pages needed for the driver.
>>    *
>>    * Create a struct ttm_tt to back data with system memory pages.
>>    * No pages are actually allocated.
>> @@ -147,7 +148,8 @@ int ttm_tt_create(struct ttm_buffer_object *bo, bool zero_alloc);
>>    * NULL: Out of memory.
>>    */
>>   int ttm_tt_init(struct ttm_tt *ttm, struct ttm_buffer_object *bo,
>> -		uint32_t page_flags, enum ttm_caching caching);
>> +		uint32_t page_flags, enum ttm_caching caching,
>> +		unsigned long extra_pages);
>>   int ttm_sg_tt_init(struct ttm_tt *ttm_dma, struct ttm_buffer_object *bo,
>>   		   uint32_t page_flags, enum ttm_caching caching);
>>   
>> -- 
>> 2.20.1
>>
Ramalingam C April 2, 2022, 3:02 a.m. UTC | #3
On 2022-04-01 at 16:31:19 +0200, Christian König wrote:
> I would be nicer to push this through drm-misc-next, but the intel branch
> works for me as well.
Hi Christian

I have pushed this patch into drm-misc-next.

Regards,
Ram.
> 
> Regards,
> Christian.
> 
> Am 01.04.22 um 16:28 schrieb Ramalingam C:
> > Christian, Joonas and vivi
> > 
> > Once the premerge results are greeen, if this patch can be merged into
> > drm-intel-gt-next along with other patches could you please ack the
> > request to merge into drm-intel-gt-next?
> > 
> > Thanks
> > Ram
> > 
> > On 2022-04-01 at 18:07:49 +0530, Ramalingam C wrote:
> > > Add a parameter called "extra_pages" for ttm_tt_init, to indicate that
> > > driver needs extra pages in ttm_tt.
> > > 
> > > v2:
> > >    Used imperative wording [Thomas and Christian]
> > > 
> > > Signed-off-by: Ramalingam C <ramalingam.c@intel.com>
> > > cc: Christian Koenig <christian.koenig@amd.com>
> > > cc: Hellstrom Thomas <thomas.hellstrom@intel.com>
> > > Reviewed-by: Thomas Hellstrom <thomas.hellstrom@linux.intel.com>
> > > Reviewed-by: Christian Konig <christian.koenig@amd.com>
> > > Reviewed-by: Nirmoy Das <nirmoy.das@intel.com>
> > > ---
> > >   drivers/gpu/drm/drm_gem_vram_helper.c      |  2 +-
> > >   drivers/gpu/drm/i915/gem/i915_gem_ttm.c    |  2 +-
> > >   drivers/gpu/drm/qxl/qxl_ttm.c              |  2 +-
> > >   drivers/gpu/drm/ttm/ttm_agp_backend.c      |  2 +-
> > >   drivers/gpu/drm/ttm/ttm_tt.c               | 12 +++++++-----
> > >   drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c |  2 +-
> > >   include/drm/ttm/ttm_tt.h                   |  4 +++-
> > >   7 files changed, 15 insertions(+), 11 deletions(-)
> > > 
> > > diff --git a/drivers/gpu/drm/drm_gem_vram_helper.c b/drivers/gpu/drm/drm_gem_vram_helper.c
> > > index dc7f938bfff2..123045b58fec 100644
> > > --- a/drivers/gpu/drm/drm_gem_vram_helper.c
> > > +++ b/drivers/gpu/drm/drm_gem_vram_helper.c
> > > @@ -867,7 +867,7 @@ static struct ttm_tt *bo_driver_ttm_tt_create(struct ttm_buffer_object *bo,
> > >   	if (!tt)
> > >   		return NULL;
> > > -	ret = ttm_tt_init(tt, bo, page_flags, ttm_cached);
> > > +	ret = ttm_tt_init(tt, bo, page_flags, ttm_cached, 0);
> > >   	if (ret < 0)
> > >   		goto err_ttm_tt_init;
> > > diff --git a/drivers/gpu/drm/i915/gem/i915_gem_ttm.c b/drivers/gpu/drm/i915/gem/i915_gem_ttm.c
> > > index c40aca99442f..a878910a563c 100644
> > > --- a/drivers/gpu/drm/i915/gem/i915_gem_ttm.c
> > > +++ b/drivers/gpu/drm/i915/gem/i915_gem_ttm.c
> > > @@ -293,7 +293,7 @@ static struct ttm_tt *i915_ttm_tt_create(struct ttm_buffer_object *bo,
> > >   		i915_tt->is_shmem = true;
> > >   	}
> > > -	ret = ttm_tt_init(&i915_tt->ttm, bo, page_flags, caching);
> > > +	ret = ttm_tt_init(&i915_tt->ttm, bo, page_flags, caching, 0);
> > >   	if (ret)
> > >   		goto err_free;
> > > diff --git a/drivers/gpu/drm/qxl/qxl_ttm.c b/drivers/gpu/drm/qxl/qxl_ttm.c
> > > index 95df5750f47f..9ba871bd19b1 100644
> > > --- a/drivers/gpu/drm/qxl/qxl_ttm.c
> > > +++ b/drivers/gpu/drm/qxl/qxl_ttm.c
> > > @@ -113,7 +113,7 @@ static struct ttm_tt *qxl_ttm_tt_create(struct ttm_buffer_object *bo,
> > >   	ttm = kzalloc(sizeof(struct ttm_tt), GFP_KERNEL);
> > >   	if (ttm == NULL)
> > >   		return NULL;
> > > -	if (ttm_tt_init(ttm, bo, page_flags, ttm_cached)) {
> > > +	if (ttm_tt_init(ttm, bo, page_flags, ttm_cached, 0)) {
> > >   		kfree(ttm);
> > >   		return NULL;
> > >   	}
> > > diff --git a/drivers/gpu/drm/ttm/ttm_agp_backend.c b/drivers/gpu/drm/ttm/ttm_agp_backend.c
> > > index 6ddc16f0fe2b..d27691f2e451 100644
> > > --- a/drivers/gpu/drm/ttm/ttm_agp_backend.c
> > > +++ b/drivers/gpu/drm/ttm/ttm_agp_backend.c
> > > @@ -134,7 +134,7 @@ struct ttm_tt *ttm_agp_tt_create(struct ttm_buffer_object *bo,
> > >   	agp_be->mem = NULL;
> > >   	agp_be->bridge = bridge;
> > > -	if (ttm_tt_init(&agp_be->ttm, bo, page_flags, ttm_write_combined)) {
> > > +	if (ttm_tt_init(&agp_be->ttm, bo, page_flags, ttm_write_combined, 0)) {
> > >   		kfree(agp_be);
> > >   		return NULL;
> > >   	}
> > > diff --git a/drivers/gpu/drm/ttm/ttm_tt.c b/drivers/gpu/drm/ttm/ttm_tt.c
> > > index d234aab800a0..1a66d9fc589a 100644
> > > --- a/drivers/gpu/drm/ttm/ttm_tt.c
> > > +++ b/drivers/gpu/drm/ttm/ttm_tt.c
> > > @@ -134,9 +134,10 @@ void ttm_tt_destroy(struct ttm_device *bdev, struct ttm_tt *ttm)
> > >   static void ttm_tt_init_fields(struct ttm_tt *ttm,
> > >   			       struct ttm_buffer_object *bo,
> > >   			       uint32_t page_flags,
> > > -			       enum ttm_caching caching)
> > > +			       enum ttm_caching caching,
> > > +			       unsigned long extra_pages)
> > >   {
> > > -	ttm->num_pages = PAGE_ALIGN(bo->base.size) >> PAGE_SHIFT;
> > > +	ttm->num_pages = (PAGE_ALIGN(bo->base.size) >> PAGE_SHIFT) + extra_pages;
> > >   	ttm->caching = ttm_cached;
> > >   	ttm->page_flags = page_flags;
> > >   	ttm->dma_address = NULL;
> > > @@ -146,9 +147,10 @@ static void ttm_tt_init_fields(struct ttm_tt *ttm,
> > >   }
> > >   int ttm_tt_init(struct ttm_tt *ttm, struct ttm_buffer_object *bo,
> > > -		uint32_t page_flags, enum ttm_caching caching)
> > > +		uint32_t page_flags, enum ttm_caching caching,
> > > +		unsigned long extra_pages)
> > >   {
> > > -	ttm_tt_init_fields(ttm, bo, page_flags, caching);
> > > +	ttm_tt_init_fields(ttm, bo, page_flags, caching, extra_pages);
> > >   	if (ttm_tt_alloc_page_directory(ttm)) {
> > >   		pr_err("Failed allocating page table\n");
> > > @@ -180,7 +182,7 @@ int ttm_sg_tt_init(struct ttm_tt *ttm, struct ttm_buffer_object *bo,
> > >   {
> > >   	int ret;
> > > -	ttm_tt_init_fields(ttm, bo, page_flags, caching);
> > > +	ttm_tt_init_fields(ttm, bo, page_flags, caching, 0);
> > >   	if (page_flags & TTM_TT_FLAG_EXTERNAL)
> > >   		ret = ttm_sg_tt_alloc_page_directory(ttm);
> > > diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c b/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c
> > > index b84ecc6d6611..4e3938e62c08 100644
> > > --- a/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c
> > > +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c
> > > @@ -517,7 +517,7 @@ static struct ttm_tt *vmw_ttm_tt_create(struct ttm_buffer_object *bo,
> > >   				     ttm_cached);
> > >   	else
> > >   		ret = ttm_tt_init(&vmw_be->dma_ttm, bo, page_flags,
> > > -				  ttm_cached);
> > > +				  ttm_cached, 0);
> > >   	if (unlikely(ret != 0))
> > >   		goto out_no_init;
> > > diff --git a/include/drm/ttm/ttm_tt.h b/include/drm/ttm/ttm_tt.h
> > > index f20832139815..17a0310e8aaa 100644
> > > --- a/include/drm/ttm/ttm_tt.h
> > > +++ b/include/drm/ttm/ttm_tt.h
> > > @@ -140,6 +140,7 @@ int ttm_tt_create(struct ttm_buffer_object *bo, bool zero_alloc);
> > >    * @bo: The buffer object we create the ttm for.
> > >    * @page_flags: Page flags as identified by TTM_TT_FLAG_XX flags.
> > >    * @caching: the desired caching state of the pages
> > > + * @extra_pages: Extra pages needed for the driver.
> > >    *
> > >    * Create a struct ttm_tt to back data with system memory pages.
> > >    * No pages are actually allocated.
> > > @@ -147,7 +148,8 @@ int ttm_tt_create(struct ttm_buffer_object *bo, bool zero_alloc);
> > >    * NULL: Out of memory.
> > >    */
> > >   int ttm_tt_init(struct ttm_tt *ttm, struct ttm_buffer_object *bo,
> > > -		uint32_t page_flags, enum ttm_caching caching);
> > > +		uint32_t page_flags, enum ttm_caching caching,
> > > +		unsigned long extra_pages);
> > >   int ttm_sg_tt_init(struct ttm_tt *ttm_dma, struct ttm_buffer_object *bo,
> > >   		   uint32_t page_flags, enum ttm_caching caching);
> > > -- 
> > > 2.20.1
> > > 
>
Joonas Lahtinen April 13, 2022, 8:28 a.m. UTC | #4
(+ Tvrtko and Jani)

Quoting Ramalingam C (2022-04-02 06:02:38)
> On 2022-04-01 at 16:31:19 +0200, Christian König wrote:
> > I would be nicer to push this through drm-misc-next, but the intel branch
> > works for me as well.
> Hi Christian
> 
> I have pushed this patch into drm-misc-next.

I've now backmerged drm-next containing this commit to drm-intel-gt-next
in order to unblock merging the rest of the series.

> Regards,
> Ram.
> > 
> > Regards,
> > Christian.
> > 
> > Am 01.04.22 um 16:28 schrieb Ramalingam C:
> > > Christian, Joonas and vivi
> > > 
> > > Once the premerge results are greeen, if this patch can be merged into
> > > drm-intel-gt-next along with other patches could you please ack the
> > > request to merge into drm-intel-gt-next?

For future reference, when in doubt who are the right ones to handle,
add all the maintainers and wait for them to reply before proceeding.

Then we can avoid some unnecessary churn where there are more
straightforward options like here: merge via drm-intel-gt-next as
nobody else needs the new functions yet.

Regards, Joonas

> > > Thanks
> > > Ram
> > > 
> > > On 2022-04-01 at 18:07:49 +0530, Ramalingam C wrote:
> > > > Add a parameter called "extra_pages" for ttm_tt_init, to indicate that
> > > > driver needs extra pages in ttm_tt.
> > > > 
> > > > v2:
> > > >    Used imperative wording [Thomas and Christian]
> > > > 
> > > > Signed-off-by: Ramalingam C <ramalingam.c@intel.com>
> > > > cc: Christian Koenig <christian.koenig@amd.com>
> > > > cc: Hellstrom Thomas <thomas.hellstrom@intel.com>
> > > > Reviewed-by: Thomas Hellstrom <thomas.hellstrom@linux.intel.com>
> > > > Reviewed-by: Christian Konig <christian.koenig@amd.com>
> > > > Reviewed-by: Nirmoy Das <nirmoy.das@intel.com>
> > > > ---
> > > >   drivers/gpu/drm/drm_gem_vram_helper.c      |  2 +-
> > > >   drivers/gpu/drm/i915/gem/i915_gem_ttm.c    |  2 +-
> > > >   drivers/gpu/drm/qxl/qxl_ttm.c              |  2 +-
> > > >   drivers/gpu/drm/ttm/ttm_agp_backend.c      |  2 +-
> > > >   drivers/gpu/drm/ttm/ttm_tt.c               | 12 +++++++-----
> > > >   drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c |  2 +-
> > > >   include/drm/ttm/ttm_tt.h                   |  4 +++-
> > > >   7 files changed, 15 insertions(+), 11 deletions(-)
> > > > 
> > > > diff --git a/drivers/gpu/drm/drm_gem_vram_helper.c b/drivers/gpu/drm/drm_gem_vram_helper.c
> > > > index dc7f938bfff2..123045b58fec 100644
> > > > --- a/drivers/gpu/drm/drm_gem_vram_helper.c
> > > > +++ b/drivers/gpu/drm/drm_gem_vram_helper.c
> > > > @@ -867,7 +867,7 @@ static struct ttm_tt *bo_driver_ttm_tt_create(struct ttm_buffer_object *bo,
> > > >           if (!tt)
> > > >                   return NULL;
> > > > - ret = ttm_tt_init(tt, bo, page_flags, ttm_cached);
> > > > + ret = ttm_tt_init(tt, bo, page_flags, ttm_cached, 0);
> > > >           if (ret < 0)
> > > >                   goto err_ttm_tt_init;
> > > > diff --git a/drivers/gpu/drm/i915/gem/i915_gem_ttm.c b/drivers/gpu/drm/i915/gem/i915_gem_ttm.c
> > > > index c40aca99442f..a878910a563c 100644
> > > > --- a/drivers/gpu/drm/i915/gem/i915_gem_ttm.c
> > > > +++ b/drivers/gpu/drm/i915/gem/i915_gem_ttm.c
> > > > @@ -293,7 +293,7 @@ static struct ttm_tt *i915_ttm_tt_create(struct ttm_buffer_object *bo,
> > > >                   i915_tt->is_shmem = true;
> > > >           }
> > > > - ret = ttm_tt_init(&i915_tt->ttm, bo, page_flags, caching);
> > > > + ret = ttm_tt_init(&i915_tt->ttm, bo, page_flags, caching, 0);
> > > >           if (ret)
> > > >                   goto err_free;
> > > > diff --git a/drivers/gpu/drm/qxl/qxl_ttm.c b/drivers/gpu/drm/qxl/qxl_ttm.c
> > > > index 95df5750f47f..9ba871bd19b1 100644
> > > > --- a/drivers/gpu/drm/qxl/qxl_ttm.c
> > > > +++ b/drivers/gpu/drm/qxl/qxl_ttm.c
> > > > @@ -113,7 +113,7 @@ static struct ttm_tt *qxl_ttm_tt_create(struct ttm_buffer_object *bo,
> > > >           ttm = kzalloc(sizeof(struct ttm_tt), GFP_KERNEL);
> > > >           if (ttm == NULL)
> > > >                   return NULL;
> > > > - if (ttm_tt_init(ttm, bo, page_flags, ttm_cached)) {
> > > > + if (ttm_tt_init(ttm, bo, page_flags, ttm_cached, 0)) {
> > > >                   kfree(ttm);
> > > >                   return NULL;
> > > >           }
> > > > diff --git a/drivers/gpu/drm/ttm/ttm_agp_backend.c b/drivers/gpu/drm/ttm/ttm_agp_backend.c
> > > > index 6ddc16f0fe2b..d27691f2e451 100644
> > > > --- a/drivers/gpu/drm/ttm/ttm_agp_backend.c
> > > > +++ b/drivers/gpu/drm/ttm/ttm_agp_backend.c
> > > > @@ -134,7 +134,7 @@ struct ttm_tt *ttm_agp_tt_create(struct ttm_buffer_object *bo,
> > > >           agp_be->mem = NULL;
> > > >           agp_be->bridge = bridge;
> > > > - if (ttm_tt_init(&agp_be->ttm, bo, page_flags, ttm_write_combined)) {
> > > > + if (ttm_tt_init(&agp_be->ttm, bo, page_flags, ttm_write_combined, 0)) {
> > > >                   kfree(agp_be);
> > > >                   return NULL;
> > > >           }
> > > > diff --git a/drivers/gpu/drm/ttm/ttm_tt.c b/drivers/gpu/drm/ttm/ttm_tt.c
> > > > index d234aab800a0..1a66d9fc589a 100644
> > > > --- a/drivers/gpu/drm/ttm/ttm_tt.c
> > > > +++ b/drivers/gpu/drm/ttm/ttm_tt.c
> > > > @@ -134,9 +134,10 @@ void ttm_tt_destroy(struct ttm_device *bdev, struct ttm_tt *ttm)
> > > >   static void ttm_tt_init_fields(struct ttm_tt *ttm,
> > > >                                  struct ttm_buffer_object *bo,
> > > >                                  uint32_t page_flags,
> > > > -                        enum ttm_caching caching)
> > > > +                        enum ttm_caching caching,
> > > > +                        unsigned long extra_pages)
> > > >   {
> > > > - ttm->num_pages = PAGE_ALIGN(bo->base.size) >> PAGE_SHIFT;
> > > > + ttm->num_pages = (PAGE_ALIGN(bo->base.size) >> PAGE_SHIFT) + extra_pages;
> > > >           ttm->caching = ttm_cached;
> > > >           ttm->page_flags = page_flags;
> > > >           ttm->dma_address = NULL;
> > > > @@ -146,9 +147,10 @@ static void ttm_tt_init_fields(struct ttm_tt *ttm,
> > > >   }
> > > >   int ttm_tt_init(struct ttm_tt *ttm, struct ttm_buffer_object *bo,
> > > > -         uint32_t page_flags, enum ttm_caching caching)
> > > > +         uint32_t page_flags, enum ttm_caching caching,
> > > > +         unsigned long extra_pages)
> > > >   {
> > > > - ttm_tt_init_fields(ttm, bo, page_flags, caching);
> > > > + ttm_tt_init_fields(ttm, bo, page_flags, caching, extra_pages);
> > > >           if (ttm_tt_alloc_page_directory(ttm)) {
> > > >                   pr_err("Failed allocating page table\n");
> > > > @@ -180,7 +182,7 @@ int ttm_sg_tt_init(struct ttm_tt *ttm, struct ttm_buffer_object *bo,
> > > >   {
> > > >           int ret;
> > > > - ttm_tt_init_fields(ttm, bo, page_flags, caching);
> > > > + ttm_tt_init_fields(ttm, bo, page_flags, caching, 0);
> > > >           if (page_flags & TTM_TT_FLAG_EXTERNAL)
> > > >                   ret = ttm_sg_tt_alloc_page_directory(ttm);
> > > > diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c b/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c
> > > > index b84ecc6d6611..4e3938e62c08 100644
> > > > --- a/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c
> > > > +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c
> > > > @@ -517,7 +517,7 @@ static struct ttm_tt *vmw_ttm_tt_create(struct ttm_buffer_object *bo,
> > > >                                        ttm_cached);
> > > >           else
> > > >                   ret = ttm_tt_init(&vmw_be->dma_ttm, bo, page_flags,
> > > > -                           ttm_cached);
> > > > +                           ttm_cached, 0);
> > > >           if (unlikely(ret != 0))
> > > >                   goto out_no_init;
> > > > diff --git a/include/drm/ttm/ttm_tt.h b/include/drm/ttm/ttm_tt.h
> > > > index f20832139815..17a0310e8aaa 100644
> > > > --- a/include/drm/ttm/ttm_tt.h
> > > > +++ b/include/drm/ttm/ttm_tt.h
> > > > @@ -140,6 +140,7 @@ int ttm_tt_create(struct ttm_buffer_object *bo, bool zero_alloc);
> > > >    * @bo: The buffer object we create the ttm for.
> > > >    * @page_flags: Page flags as identified by TTM_TT_FLAG_XX flags.
> > > >    * @caching: the desired caching state of the pages
> > > > + * @extra_pages: Extra pages needed for the driver.
> > > >    *
> > > >    * Create a struct ttm_tt to back data with system memory pages.
> > > >    * No pages are actually allocated.
> > > > @@ -147,7 +148,8 @@ int ttm_tt_create(struct ttm_buffer_object *bo, bool zero_alloc);
> > > >    * NULL: Out of memory.
> > > >    */
> > > >   int ttm_tt_init(struct ttm_tt *ttm, struct ttm_buffer_object *bo,
> > > > -         uint32_t page_flags, enum ttm_caching caching);
> > > > +         uint32_t page_flags, enum ttm_caching caching,
> > > > +         unsigned long extra_pages);
> > > >   int ttm_sg_tt_init(struct ttm_tt *ttm_dma, struct ttm_buffer_object *bo,
> > > >                      uint32_t page_flags, enum ttm_caching caching);
> > > > -- 
> > > > 2.20.1
> > > > 
> >
Ramalingam C April 13, 2022, 10:03 a.m. UTC | #5
On 2022-04-13 at 11:28:28 +0300, Joonas Lahtinen wrote:
> (+ Tvrtko and Jani)
> 
> Quoting Ramalingam C (2022-04-02 06:02:38)
> > On 2022-04-01 at 16:31:19 +0200, Christian König wrote:
> > > I would be nicer to push this through drm-misc-next, but the intel branch
> > > works for me as well.
> > Hi Christian
> > 
> > I have pushed this patch into drm-misc-next.
> 
> I've now backmerged drm-next containing this commit to drm-intel-gt-next
> in order to unblock merging the rest of the series.
> 
> > Regards,
> > Ram.
> > > 
> > > Regards,
> > > Christian.
> > > 
> > > Am 01.04.22 um 16:28 schrieb Ramalingam C:
> > > > Christian, Joonas and vivi
> > > > 
> > > > Once the premerge results are greeen, if this patch can be merged into
> > > > drm-intel-gt-next along with other patches could you please ack the
> > > > request to merge into drm-intel-gt-next?
> 
> For future reference, when in doubt who are the right ones to handle,
> add all the maintainers and wait for them to reply before proceeding.
> 
> Then we can avoid some unnecessary churn where there are more
> straightforward options like here: merge via drm-intel-gt-next as
> nobody else needs the new functions yet.
Sure Joonas! thank you for backmerging!

Ram
> 
> Regards, Joonas
> 
> > > > Thanks
> > > > Ram
> > > > 
> > > > On 2022-04-01 at 18:07:49 +0530, Ramalingam C wrote:
> > > > > Add a parameter called "extra_pages" for ttm_tt_init, to indicate that
> > > > > driver needs extra pages in ttm_tt.
> > > > > 
> > > > > v2:
> > > > >    Used imperative wording [Thomas and Christian]
> > > > > 
> > > > > Signed-off-by: Ramalingam C <ramalingam.c@intel.com>
> > > > > cc: Christian Koenig <christian.koenig@amd.com>
> > > > > cc: Hellstrom Thomas <thomas.hellstrom@intel.com>
> > > > > Reviewed-by: Thomas Hellstrom <thomas.hellstrom@linux.intel.com>
> > > > > Reviewed-by: Christian Konig <christian.koenig@amd.com>
> > > > > Reviewed-by: Nirmoy Das <nirmoy.das@intel.com>
> > > > > ---
> > > > >   drivers/gpu/drm/drm_gem_vram_helper.c      |  2 +-
> > > > >   drivers/gpu/drm/i915/gem/i915_gem_ttm.c    |  2 +-
> > > > >   drivers/gpu/drm/qxl/qxl_ttm.c              |  2 +-
> > > > >   drivers/gpu/drm/ttm/ttm_agp_backend.c      |  2 +-
> > > > >   drivers/gpu/drm/ttm/ttm_tt.c               | 12 +++++++-----
> > > > >   drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c |  2 +-
> > > > >   include/drm/ttm/ttm_tt.h                   |  4 +++-
> > > > >   7 files changed, 15 insertions(+), 11 deletions(-)
> > > > > 
> > > > > diff --git a/drivers/gpu/drm/drm_gem_vram_helper.c b/drivers/gpu/drm/drm_gem_vram_helper.c
> > > > > index dc7f938bfff2..123045b58fec 100644
> > > > > --- a/drivers/gpu/drm/drm_gem_vram_helper.c
> > > > > +++ b/drivers/gpu/drm/drm_gem_vram_helper.c
> > > > > @@ -867,7 +867,7 @@ static struct ttm_tt *bo_driver_ttm_tt_create(struct ttm_buffer_object *bo,
> > > > >           if (!tt)
> > > > >                   return NULL;
> > > > > - ret = ttm_tt_init(tt, bo, page_flags, ttm_cached);
> > > > > + ret = ttm_tt_init(tt, bo, page_flags, ttm_cached, 0);
> > > > >           if (ret < 0)
> > > > >                   goto err_ttm_tt_init;
> > > > > diff --git a/drivers/gpu/drm/i915/gem/i915_gem_ttm.c b/drivers/gpu/drm/i915/gem/i915_gem_ttm.c
> > > > > index c40aca99442f..a878910a563c 100644
> > > > > --- a/drivers/gpu/drm/i915/gem/i915_gem_ttm.c
> > > > > +++ b/drivers/gpu/drm/i915/gem/i915_gem_ttm.c
> > > > > @@ -293,7 +293,7 @@ static struct ttm_tt *i915_ttm_tt_create(struct ttm_buffer_object *bo,
> > > > >                   i915_tt->is_shmem = true;
> > > > >           }
> > > > > - ret = ttm_tt_init(&i915_tt->ttm, bo, page_flags, caching);
> > > > > + ret = ttm_tt_init(&i915_tt->ttm, bo, page_flags, caching, 0);
> > > > >           if (ret)
> > > > >                   goto err_free;
> > > > > diff --git a/drivers/gpu/drm/qxl/qxl_ttm.c b/drivers/gpu/drm/qxl/qxl_ttm.c
> > > > > index 95df5750f47f..9ba871bd19b1 100644
> > > > > --- a/drivers/gpu/drm/qxl/qxl_ttm.c
> > > > > +++ b/drivers/gpu/drm/qxl/qxl_ttm.c
> > > > > @@ -113,7 +113,7 @@ static struct ttm_tt *qxl_ttm_tt_create(struct ttm_buffer_object *bo,
> > > > >           ttm = kzalloc(sizeof(struct ttm_tt), GFP_KERNEL);
> > > > >           if (ttm == NULL)
> > > > >                   return NULL;
> > > > > - if (ttm_tt_init(ttm, bo, page_flags, ttm_cached)) {
> > > > > + if (ttm_tt_init(ttm, bo, page_flags, ttm_cached, 0)) {
> > > > >                   kfree(ttm);
> > > > >                   return NULL;
> > > > >           }
> > > > > diff --git a/drivers/gpu/drm/ttm/ttm_agp_backend.c b/drivers/gpu/drm/ttm/ttm_agp_backend.c
> > > > > index 6ddc16f0fe2b..d27691f2e451 100644
> > > > > --- a/drivers/gpu/drm/ttm/ttm_agp_backend.c
> > > > > +++ b/drivers/gpu/drm/ttm/ttm_agp_backend.c
> > > > > @@ -134,7 +134,7 @@ struct ttm_tt *ttm_agp_tt_create(struct ttm_buffer_object *bo,
> > > > >           agp_be->mem = NULL;
> > > > >           agp_be->bridge = bridge;
> > > > > - if (ttm_tt_init(&agp_be->ttm, bo, page_flags, ttm_write_combined)) {
> > > > > + if (ttm_tt_init(&agp_be->ttm, bo, page_flags, ttm_write_combined, 0)) {
> > > > >                   kfree(agp_be);
> > > > >                   return NULL;
> > > > >           }
> > > > > diff --git a/drivers/gpu/drm/ttm/ttm_tt.c b/drivers/gpu/drm/ttm/ttm_tt.c
> > > > > index d234aab800a0..1a66d9fc589a 100644
> > > > > --- a/drivers/gpu/drm/ttm/ttm_tt.c
> > > > > +++ b/drivers/gpu/drm/ttm/ttm_tt.c
> > > > > @@ -134,9 +134,10 @@ void ttm_tt_destroy(struct ttm_device *bdev, struct ttm_tt *ttm)
> > > > >   static void ttm_tt_init_fields(struct ttm_tt *ttm,
> > > > >                                  struct ttm_buffer_object *bo,
> > > > >                                  uint32_t page_flags,
> > > > > -                        enum ttm_caching caching)
> > > > > +                        enum ttm_caching caching,
> > > > > +                        unsigned long extra_pages)
> > > > >   {
> > > > > - ttm->num_pages = PAGE_ALIGN(bo->base.size) >> PAGE_SHIFT;
> > > > > + ttm->num_pages = (PAGE_ALIGN(bo->base.size) >> PAGE_SHIFT) + extra_pages;
> > > > >           ttm->caching = ttm_cached;
> > > > >           ttm->page_flags = page_flags;
> > > > >           ttm->dma_address = NULL;
> > > > > @@ -146,9 +147,10 @@ static void ttm_tt_init_fields(struct ttm_tt *ttm,
> > > > >   }
> > > > >   int ttm_tt_init(struct ttm_tt *ttm, struct ttm_buffer_object *bo,
> > > > > -         uint32_t page_flags, enum ttm_caching caching)
> > > > > +         uint32_t page_flags, enum ttm_caching caching,
> > > > > +         unsigned long extra_pages)
> > > > >   {
> > > > > - ttm_tt_init_fields(ttm, bo, page_flags, caching);
> > > > > + ttm_tt_init_fields(ttm, bo, page_flags, caching, extra_pages);
> > > > >           if (ttm_tt_alloc_page_directory(ttm)) {
> > > > >                   pr_err("Failed allocating page table\n");
> > > > > @@ -180,7 +182,7 @@ int ttm_sg_tt_init(struct ttm_tt *ttm, struct ttm_buffer_object *bo,
> > > > >   {
> > > > >           int ret;
> > > > > - ttm_tt_init_fields(ttm, bo, page_flags, caching);
> > > > > + ttm_tt_init_fields(ttm, bo, page_flags, caching, 0);
> > > > >           if (page_flags & TTM_TT_FLAG_EXTERNAL)
> > > > >                   ret = ttm_sg_tt_alloc_page_directory(ttm);
> > > > > diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c b/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c
> > > > > index b84ecc6d6611..4e3938e62c08 100644
> > > > > --- a/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c
> > > > > +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c
> > > > > @@ -517,7 +517,7 @@ static struct ttm_tt *vmw_ttm_tt_create(struct ttm_buffer_object *bo,
> > > > >                                        ttm_cached);
> > > > >           else
> > > > >                   ret = ttm_tt_init(&vmw_be->dma_ttm, bo, page_flags,
> > > > > -                           ttm_cached);
> > > > > +                           ttm_cached, 0);
> > > > >           if (unlikely(ret != 0))
> > > > >                   goto out_no_init;
> > > > > diff --git a/include/drm/ttm/ttm_tt.h b/include/drm/ttm/ttm_tt.h
> > > > > index f20832139815..17a0310e8aaa 100644
> > > > > --- a/include/drm/ttm/ttm_tt.h
> > > > > +++ b/include/drm/ttm/ttm_tt.h
> > > > > @@ -140,6 +140,7 @@ int ttm_tt_create(struct ttm_buffer_object *bo, bool zero_alloc);
> > > > >    * @bo: The buffer object we create the ttm for.
> > > > >    * @page_flags: Page flags as identified by TTM_TT_FLAG_XX flags.
> > > > >    * @caching: the desired caching state of the pages
> > > > > + * @extra_pages: Extra pages needed for the driver.
> > > > >    *
> > > > >    * Create a struct ttm_tt to back data with system memory pages.
> > > > >    * No pages are actually allocated.
> > > > > @@ -147,7 +148,8 @@ int ttm_tt_create(struct ttm_buffer_object *bo, bool zero_alloc);
> > > > >    * NULL: Out of memory.
> > > > >    */
> > > > >   int ttm_tt_init(struct ttm_tt *ttm, struct ttm_buffer_object *bo,
> > > > > -         uint32_t page_flags, enum ttm_caching caching);
> > > > > +         uint32_t page_flags, enum ttm_caching caching,
> > > > > +         unsigned long extra_pages);
> > > > >   int ttm_sg_tt_init(struct ttm_tt *ttm_dma, struct ttm_buffer_object *bo,
> > > > >                      uint32_t page_flags, enum ttm_caching caching);
> > > > > -- 
> > > > > 2.20.1
> > > > > 
> > >
diff mbox series

Patch

diff --git a/drivers/gpu/drm/drm_gem_vram_helper.c b/drivers/gpu/drm/drm_gem_vram_helper.c
index dc7f938bfff2..123045b58fec 100644
--- a/drivers/gpu/drm/drm_gem_vram_helper.c
+++ b/drivers/gpu/drm/drm_gem_vram_helper.c
@@ -867,7 +867,7 @@  static struct ttm_tt *bo_driver_ttm_tt_create(struct ttm_buffer_object *bo,
 	if (!tt)
 		return NULL;
 
-	ret = ttm_tt_init(tt, bo, page_flags, ttm_cached);
+	ret = ttm_tt_init(tt, bo, page_flags, ttm_cached, 0);
 	if (ret < 0)
 		goto err_ttm_tt_init;
 
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_ttm.c b/drivers/gpu/drm/i915/gem/i915_gem_ttm.c
index c40aca99442f..a878910a563c 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_ttm.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_ttm.c
@@ -293,7 +293,7 @@  static struct ttm_tt *i915_ttm_tt_create(struct ttm_buffer_object *bo,
 		i915_tt->is_shmem = true;
 	}
 
-	ret = ttm_tt_init(&i915_tt->ttm, bo, page_flags, caching);
+	ret = ttm_tt_init(&i915_tt->ttm, bo, page_flags, caching, 0);
 	if (ret)
 		goto err_free;
 
diff --git a/drivers/gpu/drm/qxl/qxl_ttm.c b/drivers/gpu/drm/qxl/qxl_ttm.c
index 95df5750f47f..9ba871bd19b1 100644
--- a/drivers/gpu/drm/qxl/qxl_ttm.c
+++ b/drivers/gpu/drm/qxl/qxl_ttm.c
@@ -113,7 +113,7 @@  static struct ttm_tt *qxl_ttm_tt_create(struct ttm_buffer_object *bo,
 	ttm = kzalloc(sizeof(struct ttm_tt), GFP_KERNEL);
 	if (ttm == NULL)
 		return NULL;
-	if (ttm_tt_init(ttm, bo, page_flags, ttm_cached)) {
+	if (ttm_tt_init(ttm, bo, page_flags, ttm_cached, 0)) {
 		kfree(ttm);
 		return NULL;
 	}
diff --git a/drivers/gpu/drm/ttm/ttm_agp_backend.c b/drivers/gpu/drm/ttm/ttm_agp_backend.c
index 6ddc16f0fe2b..d27691f2e451 100644
--- a/drivers/gpu/drm/ttm/ttm_agp_backend.c
+++ b/drivers/gpu/drm/ttm/ttm_agp_backend.c
@@ -134,7 +134,7 @@  struct ttm_tt *ttm_agp_tt_create(struct ttm_buffer_object *bo,
 	agp_be->mem = NULL;
 	agp_be->bridge = bridge;
 
-	if (ttm_tt_init(&agp_be->ttm, bo, page_flags, ttm_write_combined)) {
+	if (ttm_tt_init(&agp_be->ttm, bo, page_flags, ttm_write_combined, 0)) {
 		kfree(agp_be);
 		return NULL;
 	}
diff --git a/drivers/gpu/drm/ttm/ttm_tt.c b/drivers/gpu/drm/ttm/ttm_tt.c
index d234aab800a0..1a66d9fc589a 100644
--- a/drivers/gpu/drm/ttm/ttm_tt.c
+++ b/drivers/gpu/drm/ttm/ttm_tt.c
@@ -134,9 +134,10 @@  void ttm_tt_destroy(struct ttm_device *bdev, struct ttm_tt *ttm)
 static void ttm_tt_init_fields(struct ttm_tt *ttm,
 			       struct ttm_buffer_object *bo,
 			       uint32_t page_flags,
-			       enum ttm_caching caching)
+			       enum ttm_caching caching,
+			       unsigned long extra_pages)
 {
-	ttm->num_pages = PAGE_ALIGN(bo->base.size) >> PAGE_SHIFT;
+	ttm->num_pages = (PAGE_ALIGN(bo->base.size) >> PAGE_SHIFT) + extra_pages;
 	ttm->caching = ttm_cached;
 	ttm->page_flags = page_flags;
 	ttm->dma_address = NULL;
@@ -146,9 +147,10 @@  static void ttm_tt_init_fields(struct ttm_tt *ttm,
 }
 
 int ttm_tt_init(struct ttm_tt *ttm, struct ttm_buffer_object *bo,
-		uint32_t page_flags, enum ttm_caching caching)
+		uint32_t page_flags, enum ttm_caching caching,
+		unsigned long extra_pages)
 {
-	ttm_tt_init_fields(ttm, bo, page_flags, caching);
+	ttm_tt_init_fields(ttm, bo, page_flags, caching, extra_pages);
 
 	if (ttm_tt_alloc_page_directory(ttm)) {
 		pr_err("Failed allocating page table\n");
@@ -180,7 +182,7 @@  int ttm_sg_tt_init(struct ttm_tt *ttm, struct ttm_buffer_object *bo,
 {
 	int ret;
 
-	ttm_tt_init_fields(ttm, bo, page_flags, caching);
+	ttm_tt_init_fields(ttm, bo, page_flags, caching, 0);
 
 	if (page_flags & TTM_TT_FLAG_EXTERNAL)
 		ret = ttm_sg_tt_alloc_page_directory(ttm);
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c b/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c
index b84ecc6d6611..4e3938e62c08 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c
@@ -517,7 +517,7 @@  static struct ttm_tt *vmw_ttm_tt_create(struct ttm_buffer_object *bo,
 				     ttm_cached);
 	else
 		ret = ttm_tt_init(&vmw_be->dma_ttm, bo, page_flags,
-				  ttm_cached);
+				  ttm_cached, 0);
 	if (unlikely(ret != 0))
 		goto out_no_init;
 
diff --git a/include/drm/ttm/ttm_tt.h b/include/drm/ttm/ttm_tt.h
index f20832139815..17a0310e8aaa 100644
--- a/include/drm/ttm/ttm_tt.h
+++ b/include/drm/ttm/ttm_tt.h
@@ -140,6 +140,7 @@  int ttm_tt_create(struct ttm_buffer_object *bo, bool zero_alloc);
  * @bo: The buffer object we create the ttm for.
  * @page_flags: Page flags as identified by TTM_TT_FLAG_XX flags.
  * @caching: the desired caching state of the pages
+ * @extra_pages: Extra pages needed for the driver.
  *
  * Create a struct ttm_tt to back data with system memory pages.
  * No pages are actually allocated.
@@ -147,7 +148,8 @@  int ttm_tt_create(struct ttm_buffer_object *bo, bool zero_alloc);
  * NULL: Out of memory.
  */
 int ttm_tt_init(struct ttm_tt *ttm, struct ttm_buffer_object *bo,
-		uint32_t page_flags, enum ttm_caching caching);
+		uint32_t page_flags, enum ttm_caching caching,
+		unsigned long extra_pages);
 int ttm_sg_tt_init(struct ttm_tt *ttm_dma, struct ttm_buffer_object *bo,
 		   uint32_t page_flags, enum ttm_caching caching);