[PATCH] drm/amdgpu: reserve GDS resources statically

Christian König ckoenig.leichtzumerken at gmail.com
Thu Sep 13 08:40:08 UTC 2018


As discussed internally that doesn't work because threads don't 
necessary get the same VMID assigned.

Christian.

Am 12.09.2018 um 22:33 schrieb Marek Olšák:
> From: Marek Olšák <marek.olsak at amd.com>
>
> I've chosen to do it like this because it's easy and allows an arbitrary
> number of processes.
>
> Signed-off-by: Marek Olšák <marek.olsak at amd.com>
> ---
>   drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c |  10 --
>   drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.h |   3 -
>   drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c      |  20 ----
>   drivers/gpu/drm/amd/amdgpu/amdgpu_gds.h     |  19 +--
>   drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c     |  24 +---
>   drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c     |   6 -
>   drivers/gpu/drm/amd/amdgpu/amdgpu_ids.h     |   7 --
>   drivers/gpu/drm/amd/amdgpu/amdgpu_job.h     |   3 -
>   drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c     |  14 +--
>   drivers/gpu/drm/amd/amdgpu/amdgpu_object.c  |  21 ----
>   drivers/gpu/drm/amd/amdgpu/amdgpu_object.h  |   6 -
>   drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h    |   5 -
>   drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c     |  61 ----------
>   drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h     |   8 --
>   drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c      |  34 +-----
>   drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c       | 125 +++++---------------
>   drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c       | 123 +++++--------------
>   drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c       | 124 ++++++-------------
>   include/uapi/drm/amdgpu_drm.h               |  15 +--
>   19 files changed, 109 insertions(+), 519 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c
> index b80243d3972e..7264a4930b88 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c
> @@ -71,23 +71,20 @@ int amdgpu_bo_list_create(struct amdgpu_device *adev, struct drm_file *filp,
>   				/ sizeof(struct amdgpu_bo_list_entry))
>   		return -EINVAL;
>   
>   	size = sizeof(struct amdgpu_bo_list);
>   	size += num_entries * sizeof(struct amdgpu_bo_list_entry);
>   	list = kvmalloc(size, GFP_KERNEL);
>   	if (!list)
>   		return -ENOMEM;
>   
>   	kref_init(&list->refcount);
> -	list->gds_obj = adev->gds.gds_gfx_bo;
> -	list->gws_obj = adev->gds.gws_gfx_bo;
> -	list->oa_obj = adev->gds.oa_gfx_bo;
>   
>   	array = amdgpu_bo_list_array_entry(list, 0);
>   	memset(array, 0, num_entries * sizeof(struct amdgpu_bo_list_entry));
>   
>   	for (i = 0; i < num_entries; ++i) {
>   		struct amdgpu_bo_list_entry *entry;
>   		struct drm_gem_object *gobj;
>   		struct amdgpu_bo *bo;
>   		struct mm_struct *usermm;
>   
> @@ -111,27 +108,20 @@ int amdgpu_bo_list_create(struct amdgpu_device *adev, struct drm_file *filp,
>   		} else {
>   			entry = &array[last_entry++];
>   		}
>   
>   		entry->robj = bo;
>   		entry->priority = min(info[i].bo_priority,
>   				      AMDGPU_BO_LIST_MAX_PRIORITY);
>   		entry->tv.bo = &entry->robj->tbo;
>   		entry->tv.shared = !entry->robj->prime_shared_count;
>   
> -		if (entry->robj->preferred_domains == AMDGPU_GEM_DOMAIN_GDS)
> -			list->gds_obj = entry->robj;
> -		if (entry->robj->preferred_domains == AMDGPU_GEM_DOMAIN_GWS)
> -			list->gws_obj = entry->robj;
> -		if (entry->robj->preferred_domains == AMDGPU_GEM_DOMAIN_OA)
> -			list->oa_obj = entry->robj;
> -
>   		total_size += amdgpu_bo_size(entry->robj);
>   		trace_amdgpu_bo_list_set(list, entry->robj);
>   	}
>   
>   	list->first_userptr = first_userptr;
>   	list->num_entries = num_entries;
>   
>   	trace_amdgpu_cs_bo_status(list->num_entries, total_size);
>   
>   	*result = list;
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.h
> index 61b089768e1c..30f12a60aa28 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.h
> @@ -36,23 +36,20 @@ struct amdgpu_bo_list_entry {
>   	struct ttm_validate_buffer	tv;
>   	struct amdgpu_bo_va		*bo_va;
>   	uint32_t			priority;
>   	struct page			**user_pages;
>   	int				user_invalidated;
>   };
>   
>   struct amdgpu_bo_list {
>   	struct rcu_head rhead;
>   	struct kref refcount;
> -	struct amdgpu_bo *gds_obj;
> -	struct amdgpu_bo *gws_obj;
> -	struct amdgpu_bo *oa_obj;
>   	unsigned first_userptr;
>   	unsigned num_entries;
>   };
>   
>   int amdgpu_bo_list_get(struct amdgpu_fpriv *fpriv, int id,
>   		       struct amdgpu_bo_list **result);
>   void amdgpu_bo_list_get_list(struct amdgpu_bo_list *list,
>   			     struct list_head *validated);
>   void amdgpu_bo_list_put(struct amdgpu_bo_list *list);
>   int amdgpu_bo_create_list_entry_array(struct drm_amdgpu_bo_list_in *in,
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
> index 1081fd00b059..88b58facf29e 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
> @@ -565,23 +565,20 @@ static int amdgpu_cs_list_validate(struct amdgpu_cs_parser *p,
>   	return 0;
>   }
>   
>   static int amdgpu_cs_parser_bos(struct amdgpu_cs_parser *p,
>   				union drm_amdgpu_cs *cs)
>   {
>   	struct amdgpu_fpriv *fpriv = p->filp->driver_priv;
>   	struct amdgpu_vm *vm = &fpriv->vm;
>   	struct amdgpu_bo_list_entry *e;
>   	struct list_head duplicates;
> -	struct amdgpu_bo *gds;
> -	struct amdgpu_bo *gws;
> -	struct amdgpu_bo *oa;
>   	unsigned tries = 10;
>   	int r;
>   
>   	INIT_LIST_HEAD(&p->validated);
>   
>   	/* p->bo_list could already be assigned if AMDGPU_CHUNK_ID_BO_HANDLES is present */
>   	if (cs->in.bo_list_handle) {
>   		if (p->bo_list)
>   			return -EINVAL;
>   
> @@ -705,40 +702,23 @@ static int amdgpu_cs_parser_bos(struct amdgpu_cs_parser *p,
>   
>   	r = amdgpu_cs_list_validate(p, &p->validated);
>   	if (r) {
>   		DRM_ERROR("amdgpu_cs_list_validate(validated) failed.\n");
>   		goto error_validate;
>   	}
>   
>   	amdgpu_cs_report_moved_bytes(p->adev, p->bytes_moved,
>   				     p->bytes_moved_vis);
>   
> -	gds = p->bo_list->gds_obj;
> -	gws = p->bo_list->gws_obj;
> -	oa = p->bo_list->oa_obj;
> -
>   	amdgpu_bo_list_for_each_entry(e, p->bo_list)
>   		e->bo_va = amdgpu_vm_bo_find(vm, e->robj);
>   
> -	if (gds) {
> -		p->job->gds_base = amdgpu_bo_gpu_offset(gds);
> -		p->job->gds_size = amdgpu_bo_size(gds);
> -	}
> -	if (gws) {
> -		p->job->gws_base = amdgpu_bo_gpu_offset(gws);
> -		p->job->gws_size = amdgpu_bo_size(gws);
> -	}
> -	if (oa) {
> -		p->job->oa_base = amdgpu_bo_gpu_offset(oa);
> -		p->job->oa_size = amdgpu_bo_size(oa);
> -	}
> -
>   	if (!r && p->uf_entry.robj) {
>   		struct amdgpu_bo *uf = p->uf_entry.robj;
>   
>   		r = amdgpu_ttm_alloc_gart(&uf->tbo);
>   		p->job->uf_addr += amdgpu_bo_gpu_offset(uf);
>   	}
>   
>   error_validate:
>   	if (r)
>   		ttm_eu_backoff_reservation(&p->ticket, &p->validated);
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gds.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_gds.h
> index e73728d90388..69ba25c2e921 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gds.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gds.h
> @@ -17,48 +17,33 @@
>    * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
>    * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
>    * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
>    * OTHER DEALINGS IN THE SOFTWARE.
>    *
>    */
>   
>   #ifndef __AMDGPU_GDS_H__
>   #define __AMDGPU_GDS_H__
>   
> -/* Because TTM request that alloacted buffer should be PAGE_SIZE aligned,
> - * we should report GDS/GWS/OA size as PAGE_SIZE aligned
> - * */
> -#define AMDGPU_GDS_SHIFT	2
> -#define AMDGPU_GWS_SHIFT	PAGE_SHIFT
> -#define AMDGPU_OA_SHIFT		PAGE_SHIFT
> -
>   struct amdgpu_ring;
>   struct amdgpu_bo;
>   
>   struct amdgpu_gds_asic_info {
>   	uint32_t	total_size;
> -	uint32_t	gfx_partition_size;
> -	uint32_t	cs_partition_size;
> +	uint32_t	gfx_size_per_vmid;
> +	uint32_t	kfd_size_per_vmid;
>   };
>   
>   struct amdgpu_gds {
>   	struct amdgpu_gds_asic_info	mem;
>   	struct amdgpu_gds_asic_info	gws;
>   	struct amdgpu_gds_asic_info	oa;
> -	/* At present, GDS, GWS and OA resources for gfx (graphics)
> -	 * is always pre-allocated and available for graphics operation.
> -	 * Such resource is shared between all gfx clients.
> -	 * TODO: move this operation to user space
> -	 * */
> -	struct amdgpu_bo*		gds_gfx_bo;
> -	struct amdgpu_bo*		gws_gfx_bo;
> -	struct amdgpu_bo*		oa_gfx_bo;
>   };
>   
>   struct amdgpu_gds_reg_offset {
>   	uint32_t	mem_base;
>   	uint32_t	mem_size;
>   	uint32_t	gws;
>   	uint32_t	oa;
>   };
>   
>   #endif /* __AMDGPU_GDS_H__ */
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
> index d30a0838851b..c87ad4b4d0b6 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
> @@ -223,43 +223,25 @@ int amdgpu_gem_create_ioctl(struct drm_device *dev, void *data,
>   	if (flags & ~(AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED |
>   		      AMDGPU_GEM_CREATE_NO_CPU_ACCESS |
>   		      AMDGPU_GEM_CREATE_CPU_GTT_USWC |
>   		      AMDGPU_GEM_CREATE_VRAM_CLEARED |
>   		      AMDGPU_GEM_CREATE_VM_ALWAYS_VALID |
>   		      AMDGPU_GEM_CREATE_EXPLICIT_SYNC))
>   
>   		return -EINVAL;
>   
>   	/* reject invalid gem domains */
> -	if (args->in.domains & ~AMDGPU_GEM_DOMAIN_MASK)
> +	if (args->in.domains & ~(AMDGPU_GEM_DOMAIN_CPU |
> +				 AMDGPU_GEM_DOMAIN_GTT |
> +				 AMDGPU_GEM_DOMAIN_VRAM))
>   		return -EINVAL;
>   
> -	/* create a gem object to contain this object in */
> -	if (args->in.domains & (AMDGPU_GEM_DOMAIN_GDS |
> -	    AMDGPU_GEM_DOMAIN_GWS | AMDGPU_GEM_DOMAIN_OA)) {
> -		if (flags & AMDGPU_GEM_CREATE_VM_ALWAYS_VALID) {
> -			/* if gds bo is created from user space, it must be
> -			 * passed to bo list
> -			 */
> -			DRM_ERROR("GDS bo cannot be per-vm-bo\n");
> -			return -EINVAL;
> -		}
> -		flags |= AMDGPU_GEM_CREATE_NO_CPU_ACCESS;
> -		if (args->in.domains == AMDGPU_GEM_DOMAIN_GDS)
> -			size = size << AMDGPU_GDS_SHIFT;
> -		else if (args->in.domains == AMDGPU_GEM_DOMAIN_GWS)
> -			size = size << AMDGPU_GWS_SHIFT;
> -		else if (args->in.domains == AMDGPU_GEM_DOMAIN_OA)
> -			size = size << AMDGPU_OA_SHIFT;
> -		else
> -			return -EINVAL;
> -	}
>   	size = roundup(size, PAGE_SIZE);
>   
>   	if (flags & AMDGPU_GEM_CREATE_VM_ALWAYS_VALID) {
>   		r = amdgpu_bo_reserve(vm->root.base.bo, false);
>   		if (r)
>   			return r;
>   
>   		resv = vm->root.base.bo->tbo.resv;
>   	}
>   
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c
> index 3a072a7a39f0..c2e6a1a11d7f 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c
> @@ -516,26 +516,20 @@ void amdgpu_vmid_free_reserved(struct amdgpu_device *adev,
>    * Reset saved GDW, GWS and OA to force switch on next flush.
>    */
>   void amdgpu_vmid_reset(struct amdgpu_device *adev, unsigned vmhub,
>   		       unsigned vmid)
>   {
>   	struct amdgpu_vmid_mgr *id_mgr = &adev->vm_manager.id_mgr[vmhub];
>   	struct amdgpu_vmid *id = &id_mgr->ids[vmid];
>   
>   	mutex_lock(&id_mgr->lock);
>   	id->owner = 0;
> -	id->gds_base = 0;
> -	id->gds_size = 0;
> -	id->gws_base = 0;
> -	id->gws_size = 0;
> -	id->oa_base = 0;
> -	id->oa_size = 0;
>   	mutex_unlock(&id_mgr->lock);
>   }
>   
>   /**
>    * amdgpu_vmid_reset_all - reset VMID to zero
>    *
>    * @adev: amdgpu device structure
>    *
>    * Reset VMID to force flush on next use
>    */
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.h
> index 7625419f0fc2..06078e665532 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.h
> @@ -44,27 +44,20 @@ struct amdgpu_vmid {
>   	struct amdgpu_sync	active;
>   	struct dma_fence	*last_flush;
>   	uint64_t		owner;
>   
>   	uint64_t		pd_gpu_addr;
>   	/* last flushed PD/PT update */
>   	struct dma_fence	*flushed_updates;
>   
>   	uint32_t                current_gpu_reset_count;
>   
> -	uint32_t		gds_base;
> -	uint32_t		gds_size;
> -	uint32_t		gws_base;
> -	uint32_t		gws_size;
> -	uint32_t		oa_base;
> -	uint32_t		oa_size;
> -
>   	unsigned		pasid;
>   	struct dma_fence	*pasid_mapping;
>   };
>   
>   struct amdgpu_vmid_mgr {
>   	struct mutex		lock;
>   	unsigned		num_ids;
>   	struct list_head	ids_lru;
>   	struct amdgpu_vmid	ids[AMDGPU_NUM_VMID];
>   	atomic_t		reserved_vmid_num;
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.h
> index 57cfe78a262b..3db553f6ad01 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.h
> @@ -42,23 +42,20 @@ struct amdgpu_job {
>   	struct amdgpu_sync	sched_sync;
>   	struct amdgpu_ib	*ibs;
>   	struct dma_fence	*fence; /* the hw fence */
>   	uint32_t		preamble_status;
>   	uint32_t		num_ibs;
>   	void			*owner;
>   	bool                    vm_needs_flush;
>   	uint64_t		vm_pd_addr;
>   	unsigned		vmid;
>   	unsigned		pasid;
> -	uint32_t		gds_base, gds_size;
> -	uint32_t		gws_base, gws_size;
> -	uint32_t		oa_base, oa_size;
>   	uint32_t		vram_lost_counter;
>   
>   	/* user fence handling */
>   	uint64_t		uf_addr;
>   	uint64_t		uf_sequence;
>   
>   };
>   
>   int amdgpu_job_alloc(struct amdgpu_device *adev, unsigned num_ibs,
>   		     struct amdgpu_job **job, struct amdgpu_vm *vm);
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
> index 29ac3873eeb0..209954290954 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
> @@ -517,27 +517,27 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file
>   	case AMDGPU_INFO_VIS_VRAM_USAGE:
>   		ui64 = amdgpu_vram_mgr_vis_usage(&adev->mman.bdev.man[TTM_PL_VRAM]);
>   		return copy_to_user(out, &ui64, min(size, 8u)) ? -EFAULT : 0;
>   	case AMDGPU_INFO_GTT_USAGE:
>   		ui64 = amdgpu_gtt_mgr_usage(&adev->mman.bdev.man[TTM_PL_TT]);
>   		return copy_to_user(out, &ui64, min(size, 8u)) ? -EFAULT : 0;
>   	case AMDGPU_INFO_GDS_CONFIG: {
>   		struct drm_amdgpu_info_gds gds_info;
>   
>   		memset(&gds_info, 0, sizeof(gds_info));
> -		gds_info.gds_gfx_partition_size = adev->gds.mem.gfx_partition_size >> AMDGPU_GDS_SHIFT;
> -		gds_info.compute_partition_size = adev->gds.mem.cs_partition_size >> AMDGPU_GDS_SHIFT;
> -		gds_info.gds_total_size = adev->gds.mem.total_size >> AMDGPU_GDS_SHIFT;
> -		gds_info.gws_per_gfx_partition = adev->gds.gws.gfx_partition_size >> AMDGPU_GWS_SHIFT;
> -		gds_info.gws_per_compute_partition = adev->gds.gws.cs_partition_size >> AMDGPU_GWS_SHIFT;
> -		gds_info.oa_per_gfx_partition = adev->gds.oa.gfx_partition_size >> AMDGPU_OA_SHIFT;
> -		gds_info.oa_per_compute_partition = adev->gds.oa.cs_partition_size >> AMDGPU_OA_SHIFT;
> +		gds_info.gds_gfx_partition_size = adev->gds.mem.gfx_size_per_vmid;
> +		gds_info.compute_partition_size = adev->gds.mem.kfd_size_per_vmid;
> +		gds_info.gds_total_size = adev->gds.mem.total_size;
> +		gds_info.gws_per_gfx_partition = adev->gds.gws.gfx_size_per_vmid;
> +		gds_info.gws_per_compute_partition = adev->gds.gws.kfd_size_per_vmid;
> +		gds_info.oa_per_gfx_partition = adev->gds.oa.gfx_size_per_vmid;
> +		gds_info.oa_per_compute_partition = adev->gds.oa.kfd_size_per_vmid;
>   		return copy_to_user(out, &gds_info,
>   				    min((size_t)size, sizeof(gds_info))) ? -EFAULT : 0;
>   	}
>   	case AMDGPU_INFO_VRAM_GTT: {
>   		struct drm_amdgpu_info_vram_gtt vram_gtt;
>   
>   		vram_gtt.vram_size = adev->gmc.real_vram_size -
>   			atomic64_read(&adev->vram_pin_size);
>   		vram_gtt.vram_cpu_accessible_size = adev->gmc.visible_vram_size -
>   			atomic64_read(&adev->visible_pin_size);
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
> index de990bdcdd6c..76770a8c29a5 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
> @@ -178,41 +178,20 @@ void amdgpu_bo_placement_from_domain(struct amdgpu_bo *abo, u32 domain)
>   		places[c].lpfn = 0;
>   		places[c].flags = TTM_PL_FLAG_SYSTEM;
>   		if (flags & AMDGPU_GEM_CREATE_CPU_GTT_USWC)
>   			places[c].flags |= TTM_PL_FLAG_WC |
>   				TTM_PL_FLAG_UNCACHED;
>   		else
>   			places[c].flags |= TTM_PL_FLAG_CACHED;
>   		c++;
>   	}
>   
> -	if (domain & AMDGPU_GEM_DOMAIN_GDS) {
> -		places[c].fpfn = 0;
> -		places[c].lpfn = 0;
> -		places[c].flags = TTM_PL_FLAG_UNCACHED | AMDGPU_PL_FLAG_GDS;
> -		c++;
> -	}
> -
> -	if (domain & AMDGPU_GEM_DOMAIN_GWS) {
> -		places[c].fpfn = 0;
> -		places[c].lpfn = 0;
> -		places[c].flags = TTM_PL_FLAG_UNCACHED | AMDGPU_PL_FLAG_GWS;
> -		c++;
> -	}
> -
> -	if (domain & AMDGPU_GEM_DOMAIN_OA) {
> -		places[c].fpfn = 0;
> -		places[c].lpfn = 0;
> -		places[c].flags = TTM_PL_FLAG_UNCACHED | AMDGPU_PL_FLAG_OA;
> -		c++;
> -	}
> -
>   	if (!c) {
>   		places[c].fpfn = 0;
>   		places[c].lpfn = 0;
>   		places[c].flags = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;
>   		c++;
>   	}
>   
>   	BUG_ON(c >= AMDGPU_BO_MAX_PLACEMENTS);
>   
>   	placement->num_placement = c;
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
> index 907fdf46d895..e089964cbcb7 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
> @@ -120,26 +120,20 @@ static inline struct amdgpu_bo *ttm_to_amdgpu_bo(struct ttm_buffer_object *tbo)
>    */
>   static inline unsigned amdgpu_mem_type_to_domain(u32 mem_type)
>   {
>   	switch (mem_type) {
>   	case TTM_PL_VRAM:
>   		return AMDGPU_GEM_DOMAIN_VRAM;
>   	case TTM_PL_TT:
>   		return AMDGPU_GEM_DOMAIN_GTT;
>   	case TTM_PL_SYSTEM:
>   		return AMDGPU_GEM_DOMAIN_CPU;
> -	case AMDGPU_PL_GDS:
> -		return AMDGPU_GEM_DOMAIN_GDS;
> -	case AMDGPU_PL_GWS:
> -		return AMDGPU_GEM_DOMAIN_GWS;
> -	case AMDGPU_PL_OA:
> -		return AMDGPU_GEM_DOMAIN_OA;
>   	default:
>   		break;
>   	}
>   	return 0;
>   }
>   
>   /**
>    * amdgpu_bo_reserve - reserve bo
>    * @bo:		bo structure
>    * @no_intr:	don't return -ERESTARTSYS on pending signal
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
> index 9cc239968e40..f6ea9604e611 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
> @@ -130,24 +130,20 @@ struct amdgpu_ring_funcs {
>   	/* command emit functions */
>   	void (*emit_ib)(struct amdgpu_ring *ring,
>   			struct amdgpu_ib *ib,
>   			unsigned vmid, bool ctx_switch);
>   	void (*emit_fence)(struct amdgpu_ring *ring, uint64_t addr,
>   			   uint64_t seq, unsigned flags);
>   	void (*emit_pipeline_sync)(struct amdgpu_ring *ring);
>   	void (*emit_vm_flush)(struct amdgpu_ring *ring, unsigned vmid,
>   			      uint64_t pd_addr);
>   	void (*emit_hdp_flush)(struct amdgpu_ring *ring);
> -	void (*emit_gds_switch)(struct amdgpu_ring *ring, uint32_t vmid,
> -				uint32_t gds_base, uint32_t gds_size,
> -				uint32_t gws_base, uint32_t gws_size,
> -				uint32_t oa_base, uint32_t oa_size);
>   	/* testing functions */
>   	int (*test_ring)(struct amdgpu_ring *ring);
>   	int (*test_ib)(struct amdgpu_ring *ring, long timeout);
>   	/* insert NOP packets */
>   	void (*insert_nop)(struct amdgpu_ring *ring, uint32_t count);
>   	void (*insert_start)(struct amdgpu_ring *ring);
>   	void (*insert_end)(struct amdgpu_ring *ring);
>   	/* pad the indirect buffer to the necessary number of dw */
>   	void (*pad_ib)(struct amdgpu_ring *ring, struct amdgpu_ib *ib);
>   	unsigned (*init_cond_exec)(struct amdgpu_ring *ring);
> @@ -226,21 +222,20 @@ struct amdgpu_ring {
>   #define amdgpu_ring_patch_cs_in_place(r, p, ib) ((r)->funcs->patch_cs_in_place((p), (ib)))
>   #define amdgpu_ring_test_ring(r) (r)->funcs->test_ring((r))
>   #define amdgpu_ring_test_ib(r, t) (r)->funcs->test_ib((r), (t))
>   #define amdgpu_ring_get_rptr(r) (r)->funcs->get_rptr((r))
>   #define amdgpu_ring_get_wptr(r) (r)->funcs->get_wptr((r))
>   #define amdgpu_ring_set_wptr(r) (r)->funcs->set_wptr((r))
>   #define amdgpu_ring_emit_ib(r, ib, vmid, c) (r)->funcs->emit_ib((r), (ib), (vmid), (c))
>   #define amdgpu_ring_emit_pipeline_sync(r) (r)->funcs->emit_pipeline_sync((r))
>   #define amdgpu_ring_emit_vm_flush(r, vmid, addr) (r)->funcs->emit_vm_flush((r), (vmid), (addr))
>   #define amdgpu_ring_emit_fence(r, addr, seq, flags) (r)->funcs->emit_fence((r), (addr), (seq), (flags))
> -#define amdgpu_ring_emit_gds_switch(r, v, db, ds, wb, ws, ab, as) (r)->funcs->emit_gds_switch((r), (v), (db), (ds), (wb), (ws), (ab), (as))
>   #define amdgpu_ring_emit_hdp_flush(r) (r)->funcs->emit_hdp_flush((r))
>   #define amdgpu_ring_emit_switch_buffer(r) (r)->funcs->emit_switch_buffer((r))
>   #define amdgpu_ring_emit_cntxcntl(r, d) (r)->funcs->emit_cntxcntl((r), (d))
>   #define amdgpu_ring_emit_rreg(r, d) (r)->funcs->emit_rreg((r), (d))
>   #define amdgpu_ring_emit_wreg(r, d, v) (r)->funcs->emit_wreg((r), (d), (v))
>   #define amdgpu_ring_emit_reg_wait(r, d, v, m) (r)->funcs->emit_reg_wait((r), (d), (v), (m))
>   #define amdgpu_ring_emit_reg_write_reg_wait(r, d0, d1, v, m) (r)->funcs->emit_reg_write_reg_wait((r), (d0), (d1), (v), (m))
>   #define amdgpu_ring_emit_tmz(r, b) (r)->funcs->emit_tmz((r), (b))
>   #define amdgpu_ring_pad_ib(r, ib) ((r)->funcs->pad_ib((r), (ib)))
>   #define amdgpu_ring_init_cond_exec(r) (r)->funcs->init_cond_exec((r))
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> index 8a158ee922f7..2cc62b0e7ea8 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> @@ -195,30 +195,20 @@ static int amdgpu_init_mem_type(struct ttm_bo_device *bdev, uint32_t type,
>   		break;
>   	case TTM_PL_VRAM:
>   		/* "On-card" video ram */
>   		man->func = &amdgpu_vram_mgr_func;
>   		man->gpu_offset = adev->gmc.vram_start;
>   		man->flags = TTM_MEMTYPE_FLAG_FIXED |
>   			     TTM_MEMTYPE_FLAG_MAPPABLE;
>   		man->available_caching = TTM_PL_FLAG_UNCACHED | TTM_PL_FLAG_WC;
>   		man->default_caching = TTM_PL_FLAG_WC;
>   		break;
> -	case AMDGPU_PL_GDS:
> -	case AMDGPU_PL_GWS:
> -	case AMDGPU_PL_OA:
> -		/* On-chip GDS memory*/
> -		man->func = &ttm_bo_manager_func;
> -		man->gpu_offset = 0;
> -		man->flags = TTM_MEMTYPE_FLAG_FIXED | TTM_MEMTYPE_FLAG_CMA;
> -		man->available_caching = TTM_PL_FLAG_UNCACHED;
> -		man->default_caching = TTM_PL_FLAG_UNCACHED;
> -		break;
>   	default:
>   		DRM_ERROR("Unsupported memory type %u\n", (unsigned)type);
>   		return -EINVAL;
>   	}
>   	return 0;
>   }
>   
>   /**
>    * amdgpu_evict_flags - Compute placement flags
>    *
> @@ -1039,25 +1029,20 @@ static int amdgpu_ttm_backend_bind(struct ttm_tt *ttm,
>   		if (r) {
>   			DRM_ERROR("failed to pin userptr\n");
>   			return r;
>   		}
>   	}
>   	if (!ttm->num_pages) {
>   		WARN(1, "nothing to bind %lu pages for mreg %p back %p!\n",
>   		     ttm->num_pages, bo_mem, ttm);
>   	}
>   
> -	if (bo_mem->mem_type == AMDGPU_PL_GDS ||
> -	    bo_mem->mem_type == AMDGPU_PL_GWS ||
> -	    bo_mem->mem_type == AMDGPU_PL_OA)
> -		return -EINVAL;
> -
>   	if (!amdgpu_gtt_mgr_has_gart_addr(bo_mem)) {
>   		gtt->offset = AMDGPU_BO_INVALID_OFFSET;
>   		return 0;
>   	}
>   
>   	/* compute PTE flags relevant to this BO memory */
>   	flags = amdgpu_ttm_tt_pte_flags(adev, ttm, bo_mem);
>   
>   	/* bind pages into GART page tables */
>   	gtt->offset = ((u64)bo_mem->start << PAGE_SHIFT) - adev->gmc.gart_start;
> @@ -1818,60 +1803,20 @@ int amdgpu_ttm_init(struct amdgpu_device *adev)
>   
>   	/* Initialize GTT memory pool */
>   	r = ttm_bo_init_mm(&adev->mman.bdev, TTM_PL_TT, gtt_size >> PAGE_SHIFT);
>   	if (r) {
>   		DRM_ERROR("Failed initializing GTT heap.\n");
>   		return r;
>   	}
>   	DRM_INFO("amdgpu: %uM of GTT memory ready.\n",
>   		 (unsigned)(gtt_size / (1024 * 1024)));
>   
> -	/* Initialize various on-chip memory pools */
> -	adev->gds.mem.total_size = adev->gds.mem.total_size << AMDGPU_GDS_SHIFT;
> -	adev->gds.mem.gfx_partition_size = adev->gds.mem.gfx_partition_size << AMDGPU_GDS_SHIFT;
> -	adev->gds.mem.cs_partition_size = adev->gds.mem.cs_partition_size << AMDGPU_GDS_SHIFT;
> -	adev->gds.gws.total_size = adev->gds.gws.total_size << AMDGPU_GWS_SHIFT;
> -	adev->gds.gws.gfx_partition_size = adev->gds.gws.gfx_partition_size << AMDGPU_GWS_SHIFT;
> -	adev->gds.gws.cs_partition_size = adev->gds.gws.cs_partition_size << AMDGPU_GWS_SHIFT;
> -	adev->gds.oa.total_size = adev->gds.oa.total_size << AMDGPU_OA_SHIFT;
> -	adev->gds.oa.gfx_partition_size = adev->gds.oa.gfx_partition_size << AMDGPU_OA_SHIFT;
> -	adev->gds.oa.cs_partition_size = adev->gds.oa.cs_partition_size << AMDGPU_OA_SHIFT;
> -	/* GDS Memory */
> -	if (adev->gds.mem.total_size) {
> -		r = ttm_bo_init_mm(&adev->mman.bdev, AMDGPU_PL_GDS,
> -				   adev->gds.mem.total_size >> PAGE_SHIFT);
> -		if (r) {
> -			DRM_ERROR("Failed initializing GDS heap.\n");
> -			return r;
> -		}
> -	}
> -
> -	/* GWS */
> -	if (adev->gds.gws.total_size) {
> -		r = ttm_bo_init_mm(&adev->mman.bdev, AMDGPU_PL_GWS,
> -				   adev->gds.gws.total_size >> PAGE_SHIFT);
> -		if (r) {
> -			DRM_ERROR("Failed initializing gws heap.\n");
> -			return r;
> -		}
> -	}
> -
> -	/* OA */
> -	if (adev->gds.oa.total_size) {
> -		r = ttm_bo_init_mm(&adev->mman.bdev, AMDGPU_PL_OA,
> -				   adev->gds.oa.total_size >> PAGE_SHIFT);
> -		if (r) {
> -			DRM_ERROR("Failed initializing oa heap.\n");
> -			return r;
> -		}
> -	}
> -
>   	/* Register debugfs entries for amdgpu_ttm */
>   	r = amdgpu_ttm_debugfs_init(adev);
>   	if (r) {
>   		DRM_ERROR("Failed to init debugfs\n");
>   		return r;
>   	}
>   	return 0;
>   }
>   
>   /**
> @@ -1892,26 +1837,20 @@ void amdgpu_ttm_fini(struct amdgpu_device *adev)
>   		return;
>   
>   	amdgpu_ttm_debugfs_fini(adev);
>   	amdgpu_ttm_fw_reserve_vram_fini(adev);
>   	if (adev->mman.aper_base_kaddr)
>   		iounmap(adev->mman.aper_base_kaddr);
>   	adev->mman.aper_base_kaddr = NULL;
>   
>   	ttm_bo_clean_mm(&adev->mman.bdev, TTM_PL_VRAM);
>   	ttm_bo_clean_mm(&adev->mman.bdev, TTM_PL_TT);
> -	if (adev->gds.mem.total_size)
> -		ttm_bo_clean_mm(&adev->mman.bdev, AMDGPU_PL_GDS);
> -	if (adev->gds.gws.total_size)
> -		ttm_bo_clean_mm(&adev->mman.bdev, AMDGPU_PL_GWS);
> -	if (adev->gds.oa.total_size)
> -		ttm_bo_clean_mm(&adev->mman.bdev, AMDGPU_PL_OA);
>   	ttm_bo_device_release(&adev->mman.bdev);
>   	amdgpu_ttm_global_fini(adev);
>   	adev->mman.initialized = false;
>   	DRM_INFO("amdgpu: ttm finalized\n");
>   }
>   
>   /**
>    * amdgpu_ttm_set_buffer_funcs_status - enable/disable use of buffer functions
>    *
>    * @adev: amdgpu_device pointer
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h
> index fe8f276e9811..04557a382b19 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h
> @@ -20,28 +20,20 @@
>    * OTHER DEALINGS IN THE SOFTWARE.
>    *
>    */
>   
>   #ifndef __AMDGPU_TTM_H__
>   #define __AMDGPU_TTM_H__
>   
>   #include "amdgpu.h"
>   #include <drm/gpu_scheduler.h>
>   
> -#define AMDGPU_PL_GDS		(TTM_PL_PRIV + 0)
> -#define AMDGPU_PL_GWS		(TTM_PL_PRIV + 1)
> -#define AMDGPU_PL_OA		(TTM_PL_PRIV + 2)
> -
> -#define AMDGPU_PL_FLAG_GDS		(TTM_PL_FLAG_PRIV << 0)
> -#define AMDGPU_PL_FLAG_GWS		(TTM_PL_FLAG_PRIV << 1)
> -#define AMDGPU_PL_FLAG_OA		(TTM_PL_FLAG_PRIV << 2)
> -
>   #define AMDGPU_GTT_MAX_TRANSFER_SIZE	512
>   #define AMDGPU_GTT_NUM_TRANSFER_WINDOWS	2
>   
>   struct amdgpu_mman {
>   	struct ttm_bo_global_ref        bo_global_ref;
>   	struct drm_global_reference	mem_global_ref;
>   	struct ttm_bo_device		bdev;
>   	bool				mem_global_referenced;
>   	bool				initialized;
>   	void __iomem			*aper_base_kaddr;
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> index be1659fedf94..c66f1c6f0ba8 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> @@ -803,86 +803,69 @@ void amdgpu_vm_check_compute_bug(struct amdgpu_device *adev)
>    * Returns:
>    * True if sync is needed.
>    */
>   bool amdgpu_vm_need_pipeline_sync(struct amdgpu_ring *ring,
>   				  struct amdgpu_job *job)
>   {
>   	struct amdgpu_device *adev = ring->adev;
>   	unsigned vmhub = ring->funcs->vmhub;
>   	struct amdgpu_vmid_mgr *id_mgr = &adev->vm_manager.id_mgr[vmhub];
>   	struct amdgpu_vmid *id;
> -	bool gds_switch_needed;
>   	bool vm_flush_needed = job->vm_needs_flush || ring->has_compute_vm_bug;
>   
>   	if (job->vmid == 0)
>   		return false;
>   	id = &id_mgr->ids[job->vmid];
> -	gds_switch_needed = ring->funcs->emit_gds_switch && (
> -		id->gds_base != job->gds_base ||
> -		id->gds_size != job->gds_size ||
> -		id->gws_base != job->gws_base ||
> -		id->gws_size != job->gws_size ||
> -		id->oa_base != job->oa_base ||
> -		id->oa_size != job->oa_size);
>   
>   	if (amdgpu_vmid_had_gpu_reset(adev, id))
>   		return true;
>   
> -	return vm_flush_needed || gds_switch_needed;
> +	return vm_flush_needed;
>   }
>   
>   /**
>    * amdgpu_vm_flush - hardware flush the vm
>    *
>    * @ring: ring to use for flush
>    * @job:  related job
>    * @need_pipe_sync: is pipe sync needed
>    *
>    * Emit a VM flush when it is necessary.
>    *
>    * Returns:
>    * 0 on success, errno otherwise.
>    */
>   int amdgpu_vm_flush(struct amdgpu_ring *ring, struct amdgpu_job *job, bool need_pipe_sync)
>   {
>   	struct amdgpu_device *adev = ring->adev;
>   	unsigned vmhub = ring->funcs->vmhub;
>   	struct amdgpu_vmid_mgr *id_mgr = &adev->vm_manager.id_mgr[vmhub];
>   	struct amdgpu_vmid *id = &id_mgr->ids[job->vmid];
> -	bool gds_switch_needed = ring->funcs->emit_gds_switch && (
> -		id->gds_base != job->gds_base ||
> -		id->gds_size != job->gds_size ||
> -		id->gws_base != job->gws_base ||
> -		id->gws_size != job->gws_size ||
> -		id->oa_base != job->oa_base ||
> -		id->oa_size != job->oa_size);
>   	bool vm_flush_needed = job->vm_needs_flush;
>   	bool pasid_mapping_needed = id->pasid != job->pasid ||
>   		!id->pasid_mapping ||
>   		!dma_fence_is_signaled(id->pasid_mapping);
>   	struct dma_fence *fence = NULL;
>   	unsigned patch_offset = 0;
>   	int r;
>   
>   	if (amdgpu_vmid_had_gpu_reset(adev, id)) {
> -		gds_switch_needed = true;
>   		vm_flush_needed = true;
>   		pasid_mapping_needed = true;
>   	}
>   
> -	gds_switch_needed &= !!ring->funcs->emit_gds_switch;
>   	vm_flush_needed &= !!ring->funcs->emit_vm_flush  &&
>   			job->vm_pd_addr != AMDGPU_BO_INVALID_OFFSET;
>   	pasid_mapping_needed &= adev->gmc.gmc_funcs->emit_pasid_mapping &&
>   		ring->funcs->emit_wreg;
>   
> -	if (!vm_flush_needed && !gds_switch_needed && !need_pipe_sync)
> +	if (!vm_flush_needed && !need_pipe_sync)
>   		return 0;
>   
>   	if (ring->funcs->init_cond_exec)
>   		patch_offset = amdgpu_ring_init_cond_exec(ring);
>   
>   	if (need_pipe_sync)
>   		amdgpu_ring_emit_pipeline_sync(ring);
>   
>   	if (vm_flush_needed) {
>   		trace_amdgpu_vm_flush(ring, job->vmid, job->vm_pd_addr);
> @@ -907,33 +890,20 @@ int amdgpu_vm_flush(struct amdgpu_ring *ring, struct amdgpu_job *job, bool need_
>   		mutex_unlock(&id_mgr->lock);
>   	}
>   
>   	if (pasid_mapping_needed) {
>   		id->pasid = job->pasid;
>   		dma_fence_put(id->pasid_mapping);
>   		id->pasid_mapping = dma_fence_get(fence);
>   	}
>   	dma_fence_put(fence);
>   
> -	if (ring->funcs->emit_gds_switch && gds_switch_needed) {
> -		id->gds_base = job->gds_base;
> -		id->gds_size = job->gds_size;
> -		id->gws_base = job->gws_base;
> -		id->gws_size = job->gws_size;
> -		id->oa_base = job->oa_base;
> -		id->oa_size = job->oa_size;
> -		amdgpu_ring_emit_gds_switch(ring, job->vmid, job->gds_base,
> -					    job->gds_size, job->gws_base,
> -					    job->gws_size, job->oa_base,
> -					    job->oa_size);
> -	}
> -
>   	if (ring->funcs->patch_cond_exec)
>   		amdgpu_ring_patch_cond_exec(ring, patch_offset);
>   
>   	/* the double SWITCH_BUFFER here *cannot* be skipped by COND_EXEC */
>   	if (ring->funcs->emit_switch_buffer) {
>   		amdgpu_ring_emit_switch_buffer(ring);
>   		amdgpu_ring_emit_switch_buffer(ring);
>   	}
>   	return 0;
>   }
> diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
> index a15d9c0f233b..f5228e169c3a 100644
> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
> @@ -1890,21 +1890,21 @@ static void gfx_v7_0_config_init(struct amdgpu_device *adev)
>    *
>    * @adev: amdgpu_device pointer
>    *
>    * Configures the 3D engine and tiling configuration
>    * registers so that the 3D engine is usable.
>    */
>   static void gfx_v7_0_gpu_init(struct amdgpu_device *adev)
>   {
>   	u32 sh_mem_cfg, sh_static_mem_cfg, sh_mem_base;
>   	u32 tmp;
> -	int i;
> +	int i, vmid;
>   
>   	WREG32(mmGRBM_CNTL, (0xff << GRBM_CNTL__READ_TIMEOUT__SHIFT));
>   
>   	WREG32(mmGB_ADDR_CONFIG, adev->gfx.config.gb_addr_config);
>   	WREG32(mmHDP_ADDR_CONFIG, adev->gfx.config.gb_addr_config);
>   	WREG32(mmDMIF_ADDR_CALC, adev->gfx.config.gb_addr_config);
>   
>   	gfx_v7_0_tiling_mode_table_init(adev);
>   
>   	gfx_v7_0_setup_rb(adev);
> @@ -2014,20 +2014,42 @@ static void gfx_v7_0_gpu_init(struct amdgpu_device *adev)
>   
>   	tmp = RREG32(mmSPI_ARB_PRIORITY);
>   	tmp = REG_SET_FIELD(tmp, SPI_ARB_PRIORITY, PIPE_ORDER_TS0, 2);
>   	tmp = REG_SET_FIELD(tmp, SPI_ARB_PRIORITY, PIPE_ORDER_TS1, 2);
>   	tmp = REG_SET_FIELD(tmp, SPI_ARB_PRIORITY, PIPE_ORDER_TS2, 2);
>   	tmp = REG_SET_FIELD(tmp, SPI_ARB_PRIORITY, PIPE_ORDER_TS3, 2);
>   	WREG32(mmSPI_ARB_PRIORITY, tmp);
>   
>   	mutex_unlock(&adev->grbm_idx_mutex);
>   
> +	for (vmid = 0; vmid < AMDGPU_NUM_VMID; vmid++) {
> +		unsigned gds_size, gws_size, oa_size;
> +
> +		if (vmid < adev->vm_manager.id_mgr[AMDGPU_GFXHUB].num_ids) {
> +			gds_size = adev->gds.mem.gfx_size_per_vmid;
> +			gws_size = adev->gds.gws.gfx_size_per_vmid;
> +			oa_size = adev->gds.oa.gfx_size_per_vmid;
> +		} else {
> +			gds_size = adev->gds.mem.kfd_size_per_vmid;
> +			gws_size = adev->gds.gws.kfd_size_per_vmid;
> +			oa_size = adev->gds.oa.kfd_size_per_vmid;
> +		}
> +
> +		WREG32(amdgpu_gds_reg_offset[vmid].mem_base, vmid * gds_size);
> +		WREG32(amdgpu_gds_reg_offset[vmid].mem_size, gds_size);
> +		WREG32(amdgpu_gds_reg_offset[vmid].gws,
> +		       (vmid * gws_size) |
> +		       (gws_size << GDS_GWS_VMID0__SIZE__SHIFT));
> +		WREG32(amdgpu_gds_reg_offset[vmid].oa,
> +		       ((1 << oa_size) - 1) << (vmid * oa_size));
> +	}
> +
>   	udelay(50);
>   }
>   
>   /*
>    * GPU scratch registers helpers function.
>    */
>   /**
>    * gfx_v7_0_scratch_init - setup driver info for CP scratch regs
>    *
>    * @adev: amdgpu_device pointer
> @@ -4157,68 +4179,20 @@ static uint64_t gfx_v7_0_get_gpu_clock_counter(struct amdgpu_device *adev)
>   	uint64_t clock;
>   
>   	mutex_lock(&adev->gfx.gpu_clock_mutex);
>   	WREG32(mmRLC_CAPTURE_GPU_CLOCK_COUNT, 1);
>   	clock = (uint64_t)RREG32(mmRLC_GPU_CLOCK_COUNT_LSB) |
>   		((uint64_t)RREG32(mmRLC_GPU_CLOCK_COUNT_MSB) << 32ULL);
>   	mutex_unlock(&adev->gfx.gpu_clock_mutex);
>   	return clock;
>   }
>   
> -static void gfx_v7_0_ring_emit_gds_switch(struct amdgpu_ring *ring,
> -					  uint32_t vmid,
> -					  uint32_t gds_base, uint32_t gds_size,
> -					  uint32_t gws_base, uint32_t gws_size,
> -					  uint32_t oa_base, uint32_t oa_size)
> -{
> -	gds_base = gds_base >> AMDGPU_GDS_SHIFT;
> -	gds_size = gds_size >> AMDGPU_GDS_SHIFT;
> -
> -	gws_base = gws_base >> AMDGPU_GWS_SHIFT;
> -	gws_size = gws_size >> AMDGPU_GWS_SHIFT;
> -
> -	oa_base = oa_base >> AMDGPU_OA_SHIFT;
> -	oa_size = oa_size >> AMDGPU_OA_SHIFT;
> -
> -	/* GDS Base */
> -	amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
> -	amdgpu_ring_write(ring, (WRITE_DATA_ENGINE_SEL(0) |
> -				WRITE_DATA_DST_SEL(0)));
> -	amdgpu_ring_write(ring, amdgpu_gds_reg_offset[vmid].mem_base);
> -	amdgpu_ring_write(ring, 0);
> -	amdgpu_ring_write(ring, gds_base);
> -
> -	/* GDS Size */
> -	amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
> -	amdgpu_ring_write(ring, (WRITE_DATA_ENGINE_SEL(0) |
> -				WRITE_DATA_DST_SEL(0)));
> -	amdgpu_ring_write(ring, amdgpu_gds_reg_offset[vmid].mem_size);
> -	amdgpu_ring_write(ring, 0);
> -	amdgpu_ring_write(ring, gds_size);
> -
> -	/* GWS */
> -	amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
> -	amdgpu_ring_write(ring, (WRITE_DATA_ENGINE_SEL(0) |
> -				WRITE_DATA_DST_SEL(0)));
> -	amdgpu_ring_write(ring, amdgpu_gds_reg_offset[vmid].gws);
> -	amdgpu_ring_write(ring, 0);
> -	amdgpu_ring_write(ring, gws_size << GDS_GWS_VMID0__SIZE__SHIFT | gws_base);
> -
> -	/* OA */
> -	amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
> -	amdgpu_ring_write(ring, (WRITE_DATA_ENGINE_SEL(0) |
> -				WRITE_DATA_DST_SEL(0)));
> -	amdgpu_ring_write(ring, amdgpu_gds_reg_offset[vmid].oa);
> -	amdgpu_ring_write(ring, 0);
> -	amdgpu_ring_write(ring, (1 << (oa_size + oa_base)) - (1 << oa_base));
> -}
> -
>   static void gfx_v7_0_ring_soft_recovery(struct amdgpu_ring *ring, unsigned vmid)
>   {
>   	struct amdgpu_device *adev = ring->adev;
>   	uint32_t value = 0;
>   
>   	value = REG_SET_FIELD(value, SQ_CMD, CMD, 0x03);
>   	value = REG_SET_FIELD(value, SQ_CMD, MODE, 0x01);
>   	value = REG_SET_FIELD(value, SQ_CMD, CHECK_VMID, 1);
>   	value = REG_SET_FIELD(value, SQ_CMD, VM_ID, vmid);
>   	WREG32(mmSQ_CMD, value);
> @@ -4584,55 +4558,32 @@ static int gfx_v7_0_sw_init(void *handle)
>   								ring_id,
>   								i, k, j);
>   				if (r)
>   					return r;
>   
>   				ring_id++;
>   			}
>   		}
>   	}
>   
> -	/* reserve GDS, GWS and OA resource for gfx */
> -	r = amdgpu_bo_create_kernel(adev, adev->gds.mem.gfx_partition_size,
> -				    PAGE_SIZE, AMDGPU_GEM_DOMAIN_GDS,
> -				    &adev->gds.gds_gfx_bo, NULL, NULL);
> -	if (r)
> -		return r;
> -
> -	r = amdgpu_bo_create_kernel(adev, adev->gds.gws.gfx_partition_size,
> -				    PAGE_SIZE, AMDGPU_GEM_DOMAIN_GWS,
> -				    &adev->gds.gws_gfx_bo, NULL, NULL);
> -	if (r)
> -		return r;
> -
> -	r = amdgpu_bo_create_kernel(adev, adev->gds.oa.gfx_partition_size,
> -				    PAGE_SIZE, AMDGPU_GEM_DOMAIN_OA,
> -				    &adev->gds.oa_gfx_bo, NULL, NULL);
> -	if (r)
> -		return r;
> -
>   	adev->gfx.ce_ram_size = 0x8000;
>   
>   	gfx_v7_0_gpu_early_init(adev);
>   
>   	return r;
>   }
>   
>   static int gfx_v7_0_sw_fini(void *handle)
>   {
>   	int i;
>   	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
>   
> -	amdgpu_bo_free_kernel(&adev->gds.oa_gfx_bo, NULL, NULL);
> -	amdgpu_bo_free_kernel(&adev->gds.gws_gfx_bo, NULL, NULL);
> -	amdgpu_bo_free_kernel(&adev->gds.gds_gfx_bo, NULL, NULL);
> -
>   	for (i = 0; i < adev->gfx.num_gfx_rings; i++)
>   		amdgpu_ring_fini(&adev->gfx.gfx_ring[i]);
>   	for (i = 0; i < adev->gfx.num_compute_rings; i++)
>   		amdgpu_ring_fini(&adev->gfx.compute_ring[i]);
>   
>   	gfx_v7_0_cp_compute_fini(adev);
>   	gfx_v7_0_rlc_fini(adev);
>   	gfx_v7_0_mec_fini(adev);
>   	amdgpu_bo_free_kernel(&adev->gfx.rlc.clear_state_obj,
>   				&adev->gfx.rlc.clear_state_gpu_addr,
> @@ -5073,64 +5024,60 @@ static const struct amd_ip_funcs gfx_v7_0_ip_funcs = {
>   
>   static const struct amdgpu_ring_funcs gfx_v7_0_ring_funcs_gfx = {
>   	.type = AMDGPU_RING_TYPE_GFX,
>   	.align_mask = 0xff,
>   	.nop = PACKET3(PACKET3_NOP, 0x3FFF),
>   	.support_64bit_ptrs = false,
>   	.get_rptr = gfx_v7_0_ring_get_rptr,
>   	.get_wptr = gfx_v7_0_ring_get_wptr_gfx,
>   	.set_wptr = gfx_v7_0_ring_set_wptr_gfx,
>   	.emit_frame_size =
> -		20 + /* gfx_v7_0_ring_emit_gds_switch */
>   		7 + /* gfx_v7_0_ring_emit_hdp_flush */
>   		5 + /* hdp invalidate */
>   		12 + 12 + 12 + /* gfx_v7_0_ring_emit_fence_gfx x3 for user fence, vm fence */
>   		7 + 4 + /* gfx_v7_0_ring_emit_pipeline_sync */
>   		CIK_FLUSH_GPU_TLB_NUM_WREG * 5 + 7 + 6 + /* gfx_v7_0_ring_emit_vm_flush */
>   		3 + 4, /* gfx_v7_ring_emit_cntxcntl including vgt flush*/
>   	.emit_ib_size = 4, /* gfx_v7_0_ring_emit_ib_gfx */
>   	.emit_ib = gfx_v7_0_ring_emit_ib_gfx,
>   	.emit_fence = gfx_v7_0_ring_emit_fence_gfx,
>   	.emit_pipeline_sync = gfx_v7_0_ring_emit_pipeline_sync,
>   	.emit_vm_flush = gfx_v7_0_ring_emit_vm_flush,
> -	.emit_gds_switch = gfx_v7_0_ring_emit_gds_switch,
>   	.emit_hdp_flush = gfx_v7_0_ring_emit_hdp_flush,
>   	.test_ring = gfx_v7_0_ring_test_ring,
>   	.test_ib = gfx_v7_0_ring_test_ib,
>   	.insert_nop = amdgpu_ring_insert_nop,
>   	.pad_ib = amdgpu_ring_generic_pad_ib,
>   	.emit_cntxcntl = gfx_v7_ring_emit_cntxcntl,
>   	.emit_wreg = gfx_v7_0_ring_emit_wreg,
>   	.soft_recovery = gfx_v7_0_ring_soft_recovery,
>   };
>   
>   static const struct amdgpu_ring_funcs gfx_v7_0_ring_funcs_compute = {
>   	.type = AMDGPU_RING_TYPE_COMPUTE,
>   	.align_mask = 0xff,
>   	.nop = PACKET3(PACKET3_NOP, 0x3FFF),
>   	.support_64bit_ptrs = false,
>   	.get_rptr = gfx_v7_0_ring_get_rptr,
>   	.get_wptr = gfx_v7_0_ring_get_wptr_compute,
>   	.set_wptr = gfx_v7_0_ring_set_wptr_compute,
>   	.emit_frame_size =
> -		20 + /* gfx_v7_0_ring_emit_gds_switch */
>   		7 + /* gfx_v7_0_ring_emit_hdp_flush */
>   		5 + /* hdp invalidate */
>   		7 + /* gfx_v7_0_ring_emit_pipeline_sync */
>   		CIK_FLUSH_GPU_TLB_NUM_WREG * 5 + 7 + /* gfx_v7_0_ring_emit_vm_flush */
>   		7 + 7 + 7, /* gfx_v7_0_ring_emit_fence_compute x3 for user fence, vm fence */
>   	.emit_ib_size =	4, /* gfx_v7_0_ring_emit_ib_compute */
>   	.emit_ib = gfx_v7_0_ring_emit_ib_compute,
>   	.emit_fence = gfx_v7_0_ring_emit_fence_compute,
>   	.emit_pipeline_sync = gfx_v7_0_ring_emit_pipeline_sync,
>   	.emit_vm_flush = gfx_v7_0_ring_emit_vm_flush,
> -	.emit_gds_switch = gfx_v7_0_ring_emit_gds_switch,
>   	.emit_hdp_flush = gfx_v7_0_ring_emit_hdp_flush,
>   	.test_ring = gfx_v7_0_ring_test_ring,
>   	.test_ib = gfx_v7_0_ring_test_ib,
>   	.insert_nop = amdgpu_ring_insert_nop,
>   	.pad_ib = amdgpu_ring_generic_pad_ib,
>   	.emit_wreg = gfx_v7_0_ring_emit_wreg,
>   };
>   
>   static void gfx_v7_0_set_ring_funcs(struct amdgpu_device *adev)
>   {
> @@ -5169,42 +5116,28 @@ static void gfx_v7_0_set_irq_funcs(struct amdgpu_device *adev)
>   	adev->gfx.priv_inst_irq.funcs = &gfx_v7_0_priv_inst_irq_funcs;
>   }
>   
>   static void gfx_v7_0_set_gds_init(struct amdgpu_device *adev)
>   {
>   	/* init asci gds info */
>   	adev->gds.mem.total_size = RREG32(mmGDS_VMID0_SIZE);
>   	adev->gds.gws.total_size = 64;
>   	adev->gds.oa.total_size = 16;
>   
> -	if (adev->gds.mem.total_size == 64 * 1024) {
> -		adev->gds.mem.gfx_partition_size = 4096;
> -		adev->gds.mem.cs_partition_size = 4096;
> -
> -		adev->gds.gws.gfx_partition_size = 4;
> -		adev->gds.gws.cs_partition_size = 4;
> -
> -		adev->gds.oa.gfx_partition_size = 4;
> -		adev->gds.oa.cs_partition_size = 1;
> -	} else {
> -		adev->gds.mem.gfx_partition_size = 1024;
> -		adev->gds.mem.cs_partition_size = 1024;
> -
> -		adev->gds.gws.gfx_partition_size = 16;
> -		adev->gds.gws.cs_partition_size = 16;
> -
> -		adev->gds.oa.gfx_partition_size = 4;
> -		adev->gds.oa.cs_partition_size = 4;
> -	}
> +	adev->gds.mem.gfx_size_per_vmid = adev->gds.mem.total_size / AMDGPU_NUM_VMID;
> +	adev->gds.mem.kfd_size_per_vmid = adev->gds.mem.total_size / AMDGPU_NUM_VMID;
> +	adev->gds.gws.gfx_size_per_vmid = adev->gds.gws.total_size / AMDGPU_NUM_VMID;
> +	adev->gds.gws.kfd_size_per_vmid = adev->gds.gws.total_size / AMDGPU_NUM_VMID;
> +	adev->gds.oa.gfx_size_per_vmid = adev->gds.oa.total_size / 8; /* gfx only */
> +	adev->gds.oa.kfd_size_per_vmid = 0;
>   }
>   
> -
>   static void gfx_v7_0_get_cu_info(struct amdgpu_device *adev)
>   {
>   	int i, j, k, counter, active_cu_number = 0;
>   	u32 mask, bitmap, ao_bitmap, ao_cu_mask = 0;
>   	struct amdgpu_cu_info *cu_info = &adev->gfx.cu_info;
>   	unsigned disable_masks[4 * 2];
>   	u32 ao_cu_num;
>   
>   	if (adev->flags & AMD_IS_APU)
>   		ao_cu_num = 2;
> diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
> index 3882689b2d8f..b11a54bd0668 100644
> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
> @@ -2154,57 +2154,34 @@ static int gfx_v8_0_sw_init(void *handle)
>   	kiq = &adev->gfx.kiq;
>   	r = amdgpu_gfx_kiq_init_ring(adev, &kiq->ring, &kiq->irq);
>   	if (r)
>   		return r;
>   
>   	/* create MQD for all compute queues as well as KIQ for SRIOV case */
>   	r = amdgpu_gfx_compute_mqd_sw_init(adev, sizeof(struct vi_mqd_allocation));
>   	if (r)
>   		return r;
>   
> -	/* reserve GDS, GWS and OA resource for gfx */
> -	r = amdgpu_bo_create_kernel(adev, adev->gds.mem.gfx_partition_size,
> -				    PAGE_SIZE, AMDGPU_GEM_DOMAIN_GDS,
> -				    &adev->gds.gds_gfx_bo, NULL, NULL);
> -	if (r)
> -		return r;
> -
> -	r = amdgpu_bo_create_kernel(adev, adev->gds.gws.gfx_partition_size,
> -				    PAGE_SIZE, AMDGPU_GEM_DOMAIN_GWS,
> -				    &adev->gds.gws_gfx_bo, NULL, NULL);
> -	if (r)
> -		return r;
> -
> -	r = amdgpu_bo_create_kernel(adev, adev->gds.oa.gfx_partition_size,
> -				    PAGE_SIZE, AMDGPU_GEM_DOMAIN_OA,
> -				    &adev->gds.oa_gfx_bo, NULL, NULL);
> -	if (r)
> -		return r;
> -
>   	adev->gfx.ce_ram_size = 0x8000;
>   
>   	r = gfx_v8_0_gpu_early_init(adev);
>   	if (r)
>   		return r;
>   
>   	return 0;
>   }
>   
>   static int gfx_v8_0_sw_fini(void *handle)
>   {
>   	int i;
>   	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
>   
> -	amdgpu_bo_free_kernel(&adev->gds.oa_gfx_bo, NULL, NULL);
> -	amdgpu_bo_free_kernel(&adev->gds.gws_gfx_bo, NULL, NULL);
> -	amdgpu_bo_free_kernel(&adev->gds.gds_gfx_bo, NULL, NULL);
> -
>   	for (i = 0; i < adev->gfx.num_gfx_rings; i++)
>   		amdgpu_ring_fini(&adev->gfx.gfx_ring[i]);
>   	for (i = 0; i < adev->gfx.num_compute_rings; i++)
>   		amdgpu_ring_fini(&adev->gfx.compute_ring[i]);
>   
>   	amdgpu_gfx_compute_mqd_sw_fini(adev);
>   	amdgpu_gfx_kiq_free_ring(&adev->gfx.kiq.ring, &adev->gfx.kiq.irq);
>   	amdgpu_gfx_kiq_fini(adev);
>   
>   	gfx_v8_0_mec_fini(adev);
> @@ -3850,21 +3827,21 @@ static void gfx_v8_0_config_init(struct amdgpu_device *adev)
>   	case CHIP_CARRIZO:
>   	case CHIP_STONEY:
>   		adev->gfx.config.double_offchip_lds_buf = 0;
>   		break;
>   	}
>   }
>   
>   static void gfx_v8_0_gpu_init(struct amdgpu_device *adev)
>   {
>   	u32 tmp, sh_static_mem_cfg;
> -	int i;
> +	int i, vmid;
>   
>   	WREG32_FIELD(GRBM_CNTL, READ_TIMEOUT, 0xFF);
>   	WREG32(mmGB_ADDR_CONFIG, adev->gfx.config.gb_addr_config);
>   	WREG32(mmHDP_ADDR_CONFIG, adev->gfx.config.gb_addr_config);
>   	WREG32(mmDMIF_ADDR_CALC, adev->gfx.config.gb_addr_config);
>   
>   	gfx_v8_0_tiling_mode_table_init(adev);
>   	gfx_v8_0_setup_rb(adev);
>   	gfx_v8_0_get_cu_info(adev);
>   	gfx_v8_0_config_init(adev);
> @@ -3927,20 +3904,41 @@ static void gfx_v8_0_gpu_init(struct amdgpu_device *adev)
>   
>   	tmp = RREG32(mmSPI_ARB_PRIORITY);
>   	tmp = REG_SET_FIELD(tmp, SPI_ARB_PRIORITY, PIPE_ORDER_TS0, 2);
>   	tmp = REG_SET_FIELD(tmp, SPI_ARB_PRIORITY, PIPE_ORDER_TS1, 2);
>   	tmp = REG_SET_FIELD(tmp, SPI_ARB_PRIORITY, PIPE_ORDER_TS2, 2);
>   	tmp = REG_SET_FIELD(tmp, SPI_ARB_PRIORITY, PIPE_ORDER_TS3, 2);
>   	WREG32(mmSPI_ARB_PRIORITY, tmp);
>   
>   	mutex_unlock(&adev->grbm_idx_mutex);
>   
> +	for (vmid = 0; vmid < AMDGPU_NUM_VMID; vmid++) {
> +		unsigned gds_size, gws_size, oa_size;
> +
> +		if (vmid < adev->vm_manager.id_mgr[AMDGPU_GFXHUB].num_ids) {
> +			gds_size = adev->gds.mem.gfx_size_per_vmid;
> +			gws_size = adev->gds.gws.gfx_size_per_vmid;
> +			oa_size = adev->gds.oa.gfx_size_per_vmid;
> +		} else {
> +			gds_size = adev->gds.mem.kfd_size_per_vmid;
> +			gws_size = adev->gds.gws.kfd_size_per_vmid;
> +			oa_size = adev->gds.oa.kfd_size_per_vmid;
> +		}
> +
> +		WREG32(amdgpu_gds_reg_offset[vmid].mem_base, vmid * gds_size);
> +		WREG32(amdgpu_gds_reg_offset[vmid].mem_size, gds_size);
> +		WREG32(amdgpu_gds_reg_offset[vmid].gws,
> +		       (vmid * gws_size) |
> +		       (gws_size << GDS_GWS_VMID0__SIZE__SHIFT));
> +		WREG32(amdgpu_gds_reg_offset[vmid].oa,
> +		       ((1 << oa_size) - 1) << (vmid * oa_size));
> +	}
>   }
>   
>   static void gfx_v8_0_wait_for_rlc_serdes(struct amdgpu_device *adev)
>   {
>   	u32 i, j, k;
>   	u32 mask;
>   
>   	mutex_lock(&adev->grbm_idx_mutex);
>   	for (i = 0; i < adev->gfx.config.max_shader_engines; i++) {
>   		for (j = 0; j < adev->gfx.config.max_sh_per_se; j++) {
> @@ -5383,68 +5381,20 @@ static uint64_t gfx_v8_0_get_gpu_clock_counter(struct amdgpu_device *adev)
>   	uint64_t clock;
>   
>   	mutex_lock(&adev->gfx.gpu_clock_mutex);
>   	WREG32(mmRLC_CAPTURE_GPU_CLOCK_COUNT, 1);
>   	clock = (uint64_t)RREG32(mmRLC_GPU_CLOCK_COUNT_LSB) |
>   		((uint64_t)RREG32(mmRLC_GPU_CLOCK_COUNT_MSB) << 32ULL);
>   	mutex_unlock(&adev->gfx.gpu_clock_mutex);
>   	return clock;
>   }
>   
> -static void gfx_v8_0_ring_emit_gds_switch(struct amdgpu_ring *ring,
> -					  uint32_t vmid,
> -					  uint32_t gds_base, uint32_t gds_size,
> -					  uint32_t gws_base, uint32_t gws_size,
> -					  uint32_t oa_base, uint32_t oa_size)
> -{
> -	gds_base = gds_base >> AMDGPU_GDS_SHIFT;
> -	gds_size = gds_size >> AMDGPU_GDS_SHIFT;
> -
> -	gws_base = gws_base >> AMDGPU_GWS_SHIFT;
> -	gws_size = gws_size >> AMDGPU_GWS_SHIFT;
> -
> -	oa_base = oa_base >> AMDGPU_OA_SHIFT;
> -	oa_size = oa_size >> AMDGPU_OA_SHIFT;
> -
> -	/* GDS Base */
> -	amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
> -	amdgpu_ring_write(ring, (WRITE_DATA_ENGINE_SEL(0) |
> -				WRITE_DATA_DST_SEL(0)));
> -	amdgpu_ring_write(ring, amdgpu_gds_reg_offset[vmid].mem_base);
> -	amdgpu_ring_write(ring, 0);
> -	amdgpu_ring_write(ring, gds_base);
> -
> -	/* GDS Size */
> -	amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
> -	amdgpu_ring_write(ring, (WRITE_DATA_ENGINE_SEL(0) |
> -				WRITE_DATA_DST_SEL(0)));
> -	amdgpu_ring_write(ring, amdgpu_gds_reg_offset[vmid].mem_size);
> -	amdgpu_ring_write(ring, 0);
> -	amdgpu_ring_write(ring, gds_size);
> -
> -	/* GWS */
> -	amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
> -	amdgpu_ring_write(ring, (WRITE_DATA_ENGINE_SEL(0) |
> -				WRITE_DATA_DST_SEL(0)));
> -	amdgpu_ring_write(ring, amdgpu_gds_reg_offset[vmid].gws);
> -	amdgpu_ring_write(ring, 0);
> -	amdgpu_ring_write(ring, gws_size << GDS_GWS_VMID0__SIZE__SHIFT | gws_base);
> -
> -	/* OA */
> -	amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
> -	amdgpu_ring_write(ring, (WRITE_DATA_ENGINE_SEL(0) |
> -				WRITE_DATA_DST_SEL(0)));
> -	amdgpu_ring_write(ring, amdgpu_gds_reg_offset[vmid].oa);
> -	amdgpu_ring_write(ring, 0);
> -	amdgpu_ring_write(ring, (1 << (oa_size + oa_base)) - (1 << oa_base));
> -}
> -
>   static uint32_t wave_read_ind(struct amdgpu_device *adev, uint32_t simd, uint32_t wave, uint32_t address)
>   {
>   	WREG32(mmSQ_IND_INDEX,
>   		(wave << SQ_IND_INDEX__WAVE_ID__SHIFT) |
>   		(simd << SQ_IND_INDEX__SIMD_ID__SHIFT) |
>   		(address << SQ_IND_INDEX__INDEX__SHIFT) |
>   		(SQ_IND_INDEX__FORCE_READ_MASK));
>   	return RREG32(mmSQ_IND_DATA);
>   }
>   
> @@ -7132,21 +7082,20 @@ static const struct amdgpu_ring_funcs gfx_v8_0_ring_funcs_gfx = {
>   		31 + /*	DE_META */
>   		3 + /* CNTX_CTRL */
>   		5 + /* HDP_INVL */
>   		8 + 8 + /* FENCE x2 */
>   		2, /* SWITCH_BUFFER */
>   	.emit_ib_size =	4, /* gfx_v8_0_ring_emit_ib_gfx */
>   	.emit_ib = gfx_v8_0_ring_emit_ib_gfx,
>   	.emit_fence = gfx_v8_0_ring_emit_fence_gfx,
>   	.emit_pipeline_sync = gfx_v8_0_ring_emit_pipeline_sync,
>   	.emit_vm_flush = gfx_v8_0_ring_emit_vm_flush,
> -	.emit_gds_switch = gfx_v8_0_ring_emit_gds_switch,
>   	.emit_hdp_flush = gfx_v8_0_ring_emit_hdp_flush,
>   	.test_ring = gfx_v8_0_ring_test_ring,
>   	.test_ib = gfx_v8_0_ring_test_ib,
>   	.insert_nop = amdgpu_ring_insert_nop,
>   	.pad_ib = amdgpu_ring_generic_pad_ib,
>   	.emit_switch_buffer = gfx_v8_ring_emit_sb,
>   	.emit_cntxcntl = gfx_v8_ring_emit_cntxcntl,
>   	.init_cond_exec = gfx_v8_0_ring_emit_init_cond_exec,
>   	.patch_cond_exec = gfx_v8_0_ring_emit_patch_cond_exec,
>   	.emit_wreg = gfx_v8_0_ring_emit_wreg,
> @@ -7155,51 +7104,48 @@ static const struct amdgpu_ring_funcs gfx_v8_0_ring_funcs_gfx = {
>   
>   static const struct amdgpu_ring_funcs gfx_v8_0_ring_funcs_compute = {
>   	.type = AMDGPU_RING_TYPE_COMPUTE,
>   	.align_mask = 0xff,
>   	.nop = PACKET3(PACKET3_NOP, 0x3FFF),
>   	.support_64bit_ptrs = false,
>   	.get_rptr = gfx_v8_0_ring_get_rptr,
>   	.get_wptr = gfx_v8_0_ring_get_wptr_compute,
>   	.set_wptr = gfx_v8_0_ring_set_wptr_compute,
>   	.emit_frame_size =
> -		20 + /* gfx_v8_0_ring_emit_gds_switch */
>   		7 + /* gfx_v8_0_ring_emit_hdp_flush */
>   		5 + /* hdp_invalidate */
>   		7 + /* gfx_v8_0_ring_emit_pipeline_sync */
>   		VI_FLUSH_GPU_TLB_NUM_WREG * 5 + 7 + /* gfx_v8_0_ring_emit_vm_flush */
>   		7 + 7 + 7, /* gfx_v8_0_ring_emit_fence_compute x3 for user fence, vm fence */
>   	.emit_ib_size =	4, /* gfx_v8_0_ring_emit_ib_compute */
>   	.emit_ib = gfx_v8_0_ring_emit_ib_compute,
>   	.emit_fence = gfx_v8_0_ring_emit_fence_compute,
>   	.emit_pipeline_sync = gfx_v8_0_ring_emit_pipeline_sync,
>   	.emit_vm_flush = gfx_v8_0_ring_emit_vm_flush,
> -	.emit_gds_switch = gfx_v8_0_ring_emit_gds_switch,
>   	.emit_hdp_flush = gfx_v8_0_ring_emit_hdp_flush,
>   	.test_ring = gfx_v8_0_ring_test_ring,
>   	.test_ib = gfx_v8_0_ring_test_ib,
>   	.insert_nop = amdgpu_ring_insert_nop,
>   	.pad_ib = amdgpu_ring_generic_pad_ib,
>   	.set_priority = gfx_v8_0_ring_set_priority_compute,
>   	.emit_wreg = gfx_v8_0_ring_emit_wreg,
>   };
>   
>   static const struct amdgpu_ring_funcs gfx_v8_0_ring_funcs_kiq = {
>   	.type = AMDGPU_RING_TYPE_KIQ,
>   	.align_mask = 0xff,
>   	.nop = PACKET3(PACKET3_NOP, 0x3FFF),
>   	.support_64bit_ptrs = false,
>   	.get_rptr = gfx_v8_0_ring_get_rptr,
>   	.get_wptr = gfx_v8_0_ring_get_wptr_compute,
>   	.set_wptr = gfx_v8_0_ring_set_wptr_compute,
>   	.emit_frame_size =
> -		20 + /* gfx_v8_0_ring_emit_gds_switch */
>   		7 + /* gfx_v8_0_ring_emit_hdp_flush */
>   		5 + /* hdp_invalidate */
>   		7 + /* gfx_v8_0_ring_emit_pipeline_sync */
>   		17 + /* gfx_v8_0_ring_emit_vm_flush */
>   		7 + 7 + 7, /* gfx_v8_0_ring_emit_fence_kiq x3 for user fence, vm fence */
>   	.emit_ib_size =	4, /* gfx_v8_0_ring_emit_ib_compute */
>   	.emit_ib = gfx_v8_0_ring_emit_ib_compute,
>   	.emit_fence = gfx_v8_0_ring_emit_fence_kiq,
>   	.test_ring = gfx_v8_0_ring_test_ring,
>   	.test_ib = gfx_v8_0_ring_test_ib,
> @@ -7278,39 +7224,26 @@ static void gfx_v8_0_set_rlc_funcs(struct amdgpu_device *adev)
>   	adev->gfx.rlc.funcs = &iceland_rlc_funcs;
>   }
>   
>   static void gfx_v8_0_set_gds_init(struct amdgpu_device *adev)
>   {
>   	/* init asci gds info */
>   	adev->gds.mem.total_size = RREG32(mmGDS_VMID0_SIZE);
>   	adev->gds.gws.total_size = 64;
>   	adev->gds.oa.total_size = 16;
>   
> -	if (adev->gds.mem.total_size == 64 * 1024) {
> -		adev->gds.mem.gfx_partition_size = 4096;
> -		adev->gds.mem.cs_partition_size = 4096;
> -
> -		adev->gds.gws.gfx_partition_size = 4;
> -		adev->gds.gws.cs_partition_size = 4;
> -
> -		adev->gds.oa.gfx_partition_size = 4;
> -		adev->gds.oa.cs_partition_size = 1;
> -	} else {
> -		adev->gds.mem.gfx_partition_size = 1024;
> -		adev->gds.mem.cs_partition_size = 1024;
> -
> -		adev->gds.gws.gfx_partition_size = 16;
> -		adev->gds.gws.cs_partition_size = 16;
> -
> -		adev->gds.oa.gfx_partition_size = 4;
> -		adev->gds.oa.cs_partition_size = 4;
> -	}
> +	adev->gds.mem.gfx_size_per_vmid = adev->gds.mem.total_size / AMDGPU_NUM_VMID;
> +	adev->gds.mem.kfd_size_per_vmid = adev->gds.mem.total_size / AMDGPU_NUM_VMID;
> +	adev->gds.gws.gfx_size_per_vmid = adev->gds.gws.total_size / AMDGPU_NUM_VMID;
> +	adev->gds.gws.kfd_size_per_vmid = adev->gds.gws.total_size / AMDGPU_NUM_VMID;
> +	adev->gds.oa.gfx_size_per_vmid = adev->gds.oa.total_size / 8; /* gfx only */
> +	adev->gds.oa.kfd_size_per_vmid = 0;
>   }
>   
>   static void gfx_v8_0_set_user_cu_inactive_bitmap(struct amdgpu_device *adev,
>   						 u32 bitmap)
>   {
>   	u32 data;
>   
>   	if (!bitmap)
>   		return;
>   
> diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
> index 3594704a6f9b..48a7e25514f5 100644
> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
> @@ -1351,31 +1351,32 @@ static int gfx_v9_0_ngg_fini(struct amdgpu_device *adev)
>   				      NULL);
>   
>   	memset(&adev->gfx.ngg.buf[0], 0,
>   			sizeof(struct amdgpu_ngg_buf) * NGG_BUF_MAX);
>   
>   	adev->gfx.ngg.init = false;
>   
>   	return 0;
>   }
>   
> +/* TODO: remove */
>   static int gfx_v9_0_ngg_init(struct amdgpu_device *adev)
>   {
>   	int r;
>   
>   	if (!amdgpu_ngg || adev->gfx.ngg.init == true)
>   		return 0;
>   
>   	/* GDS reserve memory: 64 bytes alignment */
>   	adev->gfx.ngg.gds_reserve_size = ALIGN(5 * 4, 0x40);
>   	adev->gds.mem.total_size -= adev->gfx.ngg.gds_reserve_size;
> -	adev->gds.mem.gfx_partition_size -= adev->gfx.ngg.gds_reserve_size;
> +	adev->gds.mem.gfx_size_per_vmid -= adev->gfx.ngg.gds_reserve_size;
>   	adev->gfx.ngg.gds_reserve_addr = RREG32_SOC15(GC, 0, mmGDS_VMID0_BASE);
>   	adev->gfx.ngg.gds_reserve_addr += RREG32_SOC15(GC, 0, mmGDS_VMID0_SIZE);
>   
>   	/* Primitive Buffer */
>   	r = gfx_v9_0_ngg_create_buf(adev, &adev->gfx.ngg.buf[NGG_PRIM],
>   				    amdgpu_prim_buf_per_se,
>   				    64 * 1024);
>   	if (r) {
>   		dev_err(adev->dev, "Failed to create Primitive Buffer\n");
>   		goto err;
> @@ -1412,20 +1413,21 @@ static int gfx_v9_0_ngg_init(struct amdgpu_device *adev)
>   	}
>   
>   out:
>   	adev->gfx.ngg.init = true;
>   	return 0;
>   err:
>   	gfx_v9_0_ngg_fini(adev);
>   	return r;
>   }
>   
> +/* TODO: remove */
>   static int gfx_v9_0_ngg_en(struct amdgpu_device *adev)
>   {
>   	struct amdgpu_ring *ring = &adev->gfx.gfx_ring[0];
>   	int r;
>   	u32 data, base;
>   
>   	if (!amdgpu_ngg)
>   		return 0;
>   
>   	/* Program buffer size */
> @@ -1469,23 +1471,22 @@ static int gfx_v9_0_ngg_en(struct amdgpu_device *adev)
>   	/* Clear GDS reserved memory */
>   	r = amdgpu_ring_alloc(ring, 17);
>   	if (r) {
>   		DRM_ERROR("amdgpu: NGG failed to lock ring %d (%d).\n",
>   			  ring->idx, r);
>   		return r;
>   	}
>   
>   	gfx_v9_0_write_data_to_reg(ring, 0, false,
>   				   SOC15_REG_OFFSET(GC, 0, mmGDS_VMID0_SIZE),
> -			           (adev->gds.mem.total_size +
> -				    adev->gfx.ngg.gds_reserve_size) >>
> -				   AMDGPU_GDS_SHIFT);
> +			           adev->gds.mem.total_size +
> +				   adev->gfx.ngg.gds_reserve_size);
>   
>   	amdgpu_ring_write(ring, PACKET3(PACKET3_DMA_DATA, 5));
>   	amdgpu_ring_write(ring, (PACKET3_DMA_DATA_CP_SYNC |
>   				PACKET3_DMA_DATA_DST_SEL(1) |
>   				PACKET3_DMA_DATA_SRC_SEL(2)));
>   	amdgpu_ring_write(ring, 0);
>   	amdgpu_ring_write(ring, 0);
>   	amdgpu_ring_write(ring, adev->gfx.ngg.gds_reserve_addr);
>   	amdgpu_ring_write(ring, 0);
>   	amdgpu_ring_write(ring, PACKET3_DMA_DATA_CMD_RAW_WAIT |
> @@ -1644,62 +1645,39 @@ static int gfx_v9_0_sw_init(void *handle)
>   	kiq = &adev->gfx.kiq;
>   	r = amdgpu_gfx_kiq_init_ring(adev, &kiq->ring, &kiq->irq);
>   	if (r)
>   		return r;
>   
>   	/* create MQD for all compute queues as wel as KIQ for SRIOV case */
>   	r = amdgpu_gfx_compute_mqd_sw_init(adev, sizeof(struct v9_mqd_allocation));
>   	if (r)
>   		return r;
>   
> -	/* reserve GDS, GWS and OA resource for gfx */
> -	r = amdgpu_bo_create_kernel(adev, adev->gds.mem.gfx_partition_size,
> -				    PAGE_SIZE, AMDGPU_GEM_DOMAIN_GDS,
> -				    &adev->gds.gds_gfx_bo, NULL, NULL);
> -	if (r)
> -		return r;
> -
> -	r = amdgpu_bo_create_kernel(adev, adev->gds.gws.gfx_partition_size,
> -				    PAGE_SIZE, AMDGPU_GEM_DOMAIN_GWS,
> -				    &adev->gds.gws_gfx_bo, NULL, NULL);
> -	if (r)
> -		return r;
> -
> -	r = amdgpu_bo_create_kernel(adev, adev->gds.oa.gfx_partition_size,
> -				    PAGE_SIZE, AMDGPU_GEM_DOMAIN_OA,
> -				    &adev->gds.oa_gfx_bo, NULL, NULL);
> -	if (r)
> -		return r;
> -
>   	adev->gfx.ce_ram_size = 0x8000;
>   
>   	r = gfx_v9_0_gpu_early_init(adev);
>   	if (r)
>   		return r;
>   
>   	r = gfx_v9_0_ngg_init(adev);
>   	if (r)
>   		return r;
>   
>   	return 0;
>   }
>   
>   
>   static int gfx_v9_0_sw_fini(void *handle)
>   {
>   	int i;
>   	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
>   
> -	amdgpu_bo_free_kernel(&adev->gds.oa_gfx_bo, NULL, NULL);
> -	amdgpu_bo_free_kernel(&adev->gds.gws_gfx_bo, NULL, NULL);
> -	amdgpu_bo_free_kernel(&adev->gds.gds_gfx_bo, NULL, NULL);
> -
>   	for (i = 0; i < adev->gfx.num_gfx_rings; i++)
>   		amdgpu_ring_fini(&adev->gfx.gfx_ring[i]);
>   	for (i = 0; i < adev->gfx.num_compute_rings; i++)
>   		amdgpu_ring_fini(&adev->gfx.compute_ring[i]);
>   
>   	amdgpu_gfx_compute_mqd_sw_fini(adev);
>   	amdgpu_gfx_kiq_free_ring(&adev->gfx.kiq.ring, &adev->gfx.kiq.irq);
>   	amdgpu_gfx_kiq_fini(adev);
>   
>   	gfx_v9_0_mec_fini(adev);
> @@ -1813,21 +1791,21 @@ static void gfx_v9_0_init_compute_vmid(struct amdgpu_device *adev)
>   		WREG32_SOC15(GC, 0, mmSH_MEM_CONFIG, sh_mem_config);
>   		WREG32_SOC15(GC, 0, mmSH_MEM_BASES, sh_mem_bases);
>   	}
>   	soc15_grbm_select(adev, 0, 0, 0, 0);
>   	mutex_unlock(&adev->srbm_mutex);
>   }
>   
>   static void gfx_v9_0_gpu_init(struct amdgpu_device *adev)
>   {
>   	u32 tmp;
> -	int i;
> +	int i, vmid;
>   
>   	WREG32_FIELD15(GC, 0, GRBM_CNTL, READ_TIMEOUT, 0xff);
>   
>   	gfx_v9_0_tiling_mode_table_init(adev);
>   
>   	gfx_v9_0_setup_rb(adev);
>   	gfx_v9_0_get_cu_info(adev, &adev->gfx.cu_info);
>   	adev->gfx.config.db_debug2 = RREG32_SOC15(GC, 0, mmDB_DEBUG2);
>   
>   	/* XXX SH_MEM regs */
> @@ -1869,20 +1847,43 @@ static void gfx_v9_0_gpu_init(struct amdgpu_device *adev)
>   		   (adev->gfx.config.sc_prim_fifo_size_frontend <<
>   			PA_SC_FIFO_SIZE__SC_FRONTEND_PRIM_FIFO_SIZE__SHIFT) |
>   		   (adev->gfx.config.sc_prim_fifo_size_backend <<
>   			PA_SC_FIFO_SIZE__SC_BACKEND_PRIM_FIFO_SIZE__SHIFT) |
>   		   (adev->gfx.config.sc_hiz_tile_fifo_size <<
>   			PA_SC_FIFO_SIZE__SC_HIZ_TILE_FIFO_SIZE__SHIFT) |
>   		   (adev->gfx.config.sc_earlyz_tile_fifo_size <<
>   			PA_SC_FIFO_SIZE__SC_EARLYZ_TILE_FIFO_SIZE__SHIFT));
>   	mutex_unlock(&adev->grbm_idx_mutex);
>   
> +	for (vmid = 0; vmid < AMDGPU_NUM_VMID; vmid++) {
> +		unsigned gds_size, gws_size, oa_size;
> +
> +		if (vmid < adev->vm_manager.id_mgr[AMDGPU_GFXHUB].num_ids) {
> +			gds_size = adev->gds.mem.gfx_size_per_vmid;
> +			gws_size = adev->gds.gws.gfx_size_per_vmid;
> +			oa_size = adev->gds.oa.gfx_size_per_vmid;
> +		} else {
> +			gds_size = adev->gds.mem.kfd_size_per_vmid;
> +			gws_size = adev->gds.gws.kfd_size_per_vmid;
> +			oa_size = adev->gds.oa.kfd_size_per_vmid;
> +		}
> +
> +		WREG32_SOC15_OFFSET(GC, 0, mmGDS_VMID0_BASE, 2 * vmid,
> +				    vmid * gds_size);
> +		WREG32_SOC15_OFFSET(GC, 0, mmGDS_VMID0_SIZE, 2 * vmid,
> +				    gds_size);
> +		WREG32_SOC15_OFFSET(GC, 0, mmGDS_GWS_VMID0, vmid,
> +				    (vmid * gws_size) |
> +				    (gws_size << GDS_GWS_VMID0__SIZE__SHIFT));
> +		WREG32_SOC15_OFFSET(GC, 0, mmGDS_OA_VMID0, vmid,
> +				    ((1 << oa_size) - 1) << (vmid * oa_size));
> +	}
>   }
>   
>   static void gfx_v9_0_wait_for_rlc_serdes(struct amdgpu_device *adev)
>   {
>   	u32 i, j, k;
>   	u32 mask;
>   
>   	mutex_lock(&adev->grbm_idx_mutex);
>   	for (i = 0; i < adev->gfx.config.max_shader_engines; i++) {
>   		for (j = 0; j < adev->gfx.config.max_sh_per_se; j++) {
> @@ -3407,58 +3408,20 @@ static uint64_t gfx_v9_0_get_gpu_clock_counter(struct amdgpu_device *adev)
>   	uint64_t clock;
>   
>   	mutex_lock(&adev->gfx.gpu_clock_mutex);
>   	WREG32_SOC15(GC, 0, mmRLC_CAPTURE_GPU_CLOCK_COUNT, 1);
>   	clock = (uint64_t)RREG32_SOC15(GC, 0, mmRLC_GPU_CLOCK_COUNT_LSB) |
>   		((uint64_t)RREG32_SOC15(GC, 0, mmRLC_GPU_CLOCK_COUNT_MSB) << 32ULL);
>   	mutex_unlock(&adev->gfx.gpu_clock_mutex);
>   	return clock;
>   }
>   
> -static void gfx_v9_0_ring_emit_gds_switch(struct amdgpu_ring *ring,
> -					  uint32_t vmid,
> -					  uint32_t gds_base, uint32_t gds_size,
> -					  uint32_t gws_base, uint32_t gws_size,
> -					  uint32_t oa_base, uint32_t oa_size)
> -{
> -	struct amdgpu_device *adev = ring->adev;
> -
> -	gds_base = gds_base >> AMDGPU_GDS_SHIFT;
> -	gds_size = gds_size >> AMDGPU_GDS_SHIFT;
> -
> -	gws_base = gws_base >> AMDGPU_GWS_SHIFT;
> -	gws_size = gws_size >> AMDGPU_GWS_SHIFT;
> -
> -	oa_base = oa_base >> AMDGPU_OA_SHIFT;
> -	oa_size = oa_size >> AMDGPU_OA_SHIFT;
> -
> -	/* GDS Base */
> -	gfx_v9_0_write_data_to_reg(ring, 0, false,
> -				   SOC15_REG_OFFSET(GC, 0, mmGDS_VMID0_BASE) + 2 * vmid,
> -				   gds_base);
> -
> -	/* GDS Size */
> -	gfx_v9_0_write_data_to_reg(ring, 0, false,
> -				   SOC15_REG_OFFSET(GC, 0, mmGDS_VMID0_SIZE) + 2 * vmid,
> -				   gds_size);
> -
> -	/* GWS */
> -	gfx_v9_0_write_data_to_reg(ring, 0, false,
> -				   SOC15_REG_OFFSET(GC, 0, mmGDS_GWS_VMID0) + vmid,
> -				   gws_size << GDS_GWS_VMID0__SIZE__SHIFT | gws_base);
> -
> -	/* OA */
> -	gfx_v9_0_write_data_to_reg(ring, 0, false,
> -				   SOC15_REG_OFFSET(GC, 0, mmGDS_OA_VMID0) + vmid,
> -				   (1 << (oa_size + oa_base)) - (1 << oa_base));
> -}
> -
>   static int gfx_v9_0_early_init(void *handle)
>   {
>   	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
>   
>   	adev->gfx.num_gfx_rings = GFX9_NUM_GFX_RINGS;
>   	adev->gfx.num_compute_rings = AMDGPU_MAX_COMPUTE_RINGS;
>   	gfx_v9_0_set_ring_funcs(adev);
>   	gfx_v9_0_set_irq_funcs(adev);
>   	gfx_v9_0_set_gds_init(adev);
>   	gfx_v9_0_set_rlc_funcs(adev);
> @@ -4695,21 +4658,20 @@ static const struct amdgpu_ring_funcs gfx_v9_0_ring_funcs_gfx = {
>   		31 + /*	DE_META */
>   		3 + /* CNTX_CTRL */
>   		5 + /* HDP_INVL */
>   		8 + 8 + /* FENCE x2 */
>   		2, /* SWITCH_BUFFER */
>   	.emit_ib_size =	4, /* gfx_v9_0_ring_emit_ib_gfx */
>   	.emit_ib = gfx_v9_0_ring_emit_ib_gfx,
>   	.emit_fence = gfx_v9_0_ring_emit_fence,
>   	.emit_pipeline_sync = gfx_v9_0_ring_emit_pipeline_sync,
>   	.emit_vm_flush = gfx_v9_0_ring_emit_vm_flush,
> -	.emit_gds_switch = gfx_v9_0_ring_emit_gds_switch,
>   	.emit_hdp_flush = gfx_v9_0_ring_emit_hdp_flush,
>   	.test_ring = gfx_v9_0_ring_test_ring,
>   	.test_ib = gfx_v9_0_ring_test_ib,
>   	.insert_nop = amdgpu_ring_insert_nop,
>   	.pad_ib = amdgpu_ring_generic_pad_ib,
>   	.emit_switch_buffer = gfx_v9_ring_emit_sb,
>   	.emit_cntxcntl = gfx_v9_ring_emit_cntxcntl,
>   	.init_cond_exec = gfx_v9_0_ring_emit_init_cond_exec,
>   	.patch_cond_exec = gfx_v9_0_ring_emit_patch_cond_exec,
>   	.emit_tmz = gfx_v9_0_ring_emit_tmz,
> @@ -4722,34 +4684,32 @@ static const struct amdgpu_ring_funcs gfx_v9_0_ring_funcs_gfx = {
>   static const struct amdgpu_ring_funcs gfx_v9_0_ring_funcs_compute = {
>   	.type = AMDGPU_RING_TYPE_COMPUTE,
>   	.align_mask = 0xff,
>   	.nop = PACKET3(PACKET3_NOP, 0x3FFF),
>   	.support_64bit_ptrs = true,
>   	.vmhub = AMDGPU_GFXHUB,
>   	.get_rptr = gfx_v9_0_ring_get_rptr_compute,
>   	.get_wptr = gfx_v9_0_ring_get_wptr_compute,
>   	.set_wptr = gfx_v9_0_ring_set_wptr_compute,
>   	.emit_frame_size =
> -		20 + /* gfx_v9_0_ring_emit_gds_switch */
>   		7 + /* gfx_v9_0_ring_emit_hdp_flush */
>   		5 + /* hdp invalidate */
>   		7 + /* gfx_v9_0_ring_emit_pipeline_sync */
>   		SOC15_FLUSH_GPU_TLB_NUM_WREG * 5 +
>   		SOC15_FLUSH_GPU_TLB_NUM_REG_WAIT * 7 +
>   		2 + /* gfx_v9_0_ring_emit_vm_flush */
>   		8 + 8 + 8, /* gfx_v9_0_ring_emit_fence x3 for user fence, vm fence */
>   	.emit_ib_size =	4, /* gfx_v9_0_ring_emit_ib_compute */
>   	.emit_ib = gfx_v9_0_ring_emit_ib_compute,
>   	.emit_fence = gfx_v9_0_ring_emit_fence,
>   	.emit_pipeline_sync = gfx_v9_0_ring_emit_pipeline_sync,
>   	.emit_vm_flush = gfx_v9_0_ring_emit_vm_flush,
> -	.emit_gds_switch = gfx_v9_0_ring_emit_gds_switch,
>   	.emit_hdp_flush = gfx_v9_0_ring_emit_hdp_flush,
>   	.test_ring = gfx_v9_0_ring_test_ring,
>   	.test_ib = gfx_v9_0_ring_test_ib,
>   	.insert_nop = amdgpu_ring_insert_nop,
>   	.pad_ib = amdgpu_ring_generic_pad_ib,
>   	.set_priority = gfx_v9_0_ring_set_priority_compute,
>   	.emit_wreg = gfx_v9_0_ring_emit_wreg,
>   	.emit_reg_wait = gfx_v9_0_ring_emit_reg_wait,
>   	.emit_reg_write_reg_wait = gfx_v9_0_ring_emit_reg_write_reg_wait,
>   };
> @@ -4757,21 +4717,20 @@ static const struct amdgpu_ring_funcs gfx_v9_0_ring_funcs_compute = {
>   static const struct amdgpu_ring_funcs gfx_v9_0_ring_funcs_kiq = {
>   	.type = AMDGPU_RING_TYPE_KIQ,
>   	.align_mask = 0xff,
>   	.nop = PACKET3(PACKET3_NOP, 0x3FFF),
>   	.support_64bit_ptrs = true,
>   	.vmhub = AMDGPU_GFXHUB,
>   	.get_rptr = gfx_v9_0_ring_get_rptr_compute,
>   	.get_wptr = gfx_v9_0_ring_get_wptr_compute,
>   	.set_wptr = gfx_v9_0_ring_set_wptr_compute,
>   	.emit_frame_size =
> -		20 + /* gfx_v9_0_ring_emit_gds_switch */
>   		7 + /* gfx_v9_0_ring_emit_hdp_flush */
>   		5 + /* hdp invalidate */
>   		7 + /* gfx_v9_0_ring_emit_pipeline_sync */
>   		SOC15_FLUSH_GPU_TLB_NUM_WREG * 5 +
>   		SOC15_FLUSH_GPU_TLB_NUM_REG_WAIT * 7 +
>   		2 + /* gfx_v9_0_ring_emit_vm_flush */
>   		8 + 8 + 8, /* gfx_v9_0_ring_emit_fence_kiq x3 for user fence, vm fence */
>   	.emit_ib_size =	4, /* gfx_v9_0_ring_emit_ib_compute */
>   	.emit_ib = gfx_v9_0_ring_emit_ib_compute,
>   	.emit_fence = gfx_v9_0_ring_emit_fence_kiq,
> @@ -4847,39 +4806,26 @@ static void gfx_v9_0_set_rlc_funcs(struct amdgpu_device *adev)
>   	}
>   }
>   
>   static void gfx_v9_0_set_gds_init(struct amdgpu_device *adev)
>   {
>   	/* init asci gds info */
>   	adev->gds.mem.total_size = RREG32_SOC15(GC, 0, mmGDS_VMID0_SIZE);
>   	adev->gds.gws.total_size = 64;
>   	adev->gds.oa.total_size = 16;
>   
> -	if (adev->gds.mem.total_size == 64 * 1024) {
> -		adev->gds.mem.gfx_partition_size = 4096;
> -		adev->gds.mem.cs_partition_size = 4096;
> -
> -		adev->gds.gws.gfx_partition_size = 4;
> -		adev->gds.gws.cs_partition_size = 4;
> -
> -		adev->gds.oa.gfx_partition_size = 4;
> -		adev->gds.oa.cs_partition_size = 1;
> -	} else {
> -		adev->gds.mem.gfx_partition_size = 1024;
> -		adev->gds.mem.cs_partition_size = 1024;
> -
> -		adev->gds.gws.gfx_partition_size = 16;
> -		adev->gds.gws.cs_partition_size = 16;
> -
> -		adev->gds.oa.gfx_partition_size = 4;
> -		adev->gds.oa.cs_partition_size = 4;
> -	}
> +	adev->gds.mem.gfx_size_per_vmid = adev->gds.mem.total_size / AMDGPU_NUM_VMID;
> +	adev->gds.mem.kfd_size_per_vmid = adev->gds.mem.total_size / AMDGPU_NUM_VMID;
> +	adev->gds.gws.gfx_size_per_vmid = adev->gds.gws.total_size / AMDGPU_NUM_VMID;
> +	adev->gds.gws.kfd_size_per_vmid = adev->gds.gws.total_size / AMDGPU_NUM_VMID;
> +	adev->gds.oa.gfx_size_per_vmid = adev->gds.oa.total_size / 8; /* gfx only */
> +	adev->gds.oa.kfd_size_per_vmid = 0;
>   }
>   
>   static void gfx_v9_0_set_user_cu_inactive_bitmap(struct amdgpu_device *adev,
>   						 u32 bitmap)
>   {
>   	u32 data;
>   
>   	if (!bitmap)
>   		return;
>   
> diff --git a/include/uapi/drm/amdgpu_drm.h b/include/uapi/drm/amdgpu_drm.h
> index 94444eeba55b..9b9512b14cae 100644
> --- a/include/uapi/drm/amdgpu_drm.h
> +++ b/include/uapi/drm/amdgpu_drm.h
> @@ -81,36 +81,27 @@ extern "C" {
>    * %AMDGPU_GEM_DOMAIN_CPU	System memory that is not GPU accessible.
>    * Memory in this pool could be swapped out to disk if there is pressure.
>    *
>    * %AMDGPU_GEM_DOMAIN_GTT	GPU accessible system memory, mapped into the
>    * GPU's virtual address space via gart. Gart memory linearizes non-contiguous
>    * pages of system memory, allows GPU access system memory in a linezrized
>    * fashion.
>    *
>    * %AMDGPU_GEM_DOMAIN_VRAM	Local video memory. For APUs, it is memory
>    * carved out by the BIOS.
> - *
> - * %AMDGPU_GEM_DOMAIN_GDS	Global on-chip data storage used to share data
> - * across shader threads.
> - *
> - * %AMDGPU_GEM_DOMAIN_GWS	Global wave sync, used to synchronize the
> - * execution of all the waves on a device.
> - *
> - * %AMDGPU_GEM_DOMAIN_OA	Ordered append, used by 3D or Compute engines
> - * for appending data.
>    */
>   #define AMDGPU_GEM_DOMAIN_CPU		0x1
>   #define AMDGPU_GEM_DOMAIN_GTT		0x2
>   #define AMDGPU_GEM_DOMAIN_VRAM		0x4
> -#define AMDGPU_GEM_DOMAIN_GDS		0x8
> -#define AMDGPU_GEM_DOMAIN_GWS		0x10
> -#define AMDGPU_GEM_DOMAIN_OA		0x20
> +#define AMDGPU_GEM_DOMAIN_GDS		0x8 /* non-functional */
> +#define AMDGPU_GEM_DOMAIN_GWS		0x10 /* non-functional */
> +#define AMDGPU_GEM_DOMAIN_OA		0x20 /* non-functional */
>   #define AMDGPU_GEM_DOMAIN_MASK		(AMDGPU_GEM_DOMAIN_CPU | \
>   					 AMDGPU_GEM_DOMAIN_GTT | \
>   					 AMDGPU_GEM_DOMAIN_VRAM | \
>   					 AMDGPU_GEM_DOMAIN_GDS | \
>   					 AMDGPU_GEM_DOMAIN_GWS | \
>   					 AMDGPU_GEM_DOMAIN_OA)
>   
>   /* Flag that CPU access will be required for the case of VRAM domain */
>   #define AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED	(1 << 0)
>   /* Flag that CPU access will not work, this VRAM domain is invisible */



More information about the amd-gfx mailing list