All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jerome Glisse <j.glisse@gmail.com>
To: alexdeucher@gmail.com
Cc: Alex Deucher <alexander.deucher@amd.com>,
	dri-devel@lists.freedesktop.org
Subject: Re: [PATCH 19/48] drm/radeon/kms: add support for MC/VM setup on SI
Date: Tue, 20 Mar 2012 19:20:32 -0400	[thread overview]
Message-ID: <1332285632.1654.6.camel@localhost.localdomain> (raw)
In-Reply-To: <1332278322-12875-20-git-send-email-alexdeucher@gmail.com>

On Tue, 2012-03-20 at 17:18 -0400, alexdeucher@gmail.com wrote:
> From: Alex Deucher <alexander.deucher@amd.com>
> 
> Sets up the VM and adds support for the new VM ioctls.
> 
> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
> ---
>  drivers/gpu/drm/radeon/si.c  |  328 ++++++++++++++++++++++++++++++++++++++++++
>  drivers/gpu/drm/radeon/sid.h |  219 ++++++++++++++++++++++++++++
>  2 files changed, 547 insertions(+), 0 deletions(-)
> 
> diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c
> index 58ad900..ad91c5f 100644
> --- a/drivers/gpu/drm/radeon/si.c
> +++ b/drivers/gpu/drm/radeon/si.c
> @@ -1608,3 +1608,331 @@ int si_asic_reset(struct radeon_device *rdev)
>  	return si_gpu_soft_reset(rdev);
>  }
>  
> +/* MC */
> +static void si_mc_program(struct radeon_device *rdev)
> +{
> +	struct evergreen_mc_save save;
> +	u32 tmp;
> +	int i, j;
> +
> +	/* Initialize HDP */
> +	for (i = 0, j = 0; i < 32; i++, j += 0x18) {
> +		WREG32((0x2c14 + j), 0x00000000);
> +		WREG32((0x2c18 + j), 0x00000000);
> +		WREG32((0x2c1c + j), 0x00000000);
> +		WREG32((0x2c20 + j), 0x00000000);
> +		WREG32((0x2c24 + j), 0x00000000);
> +	}
> +	WREG32(HDP_REG_COHERENCY_FLUSH_CNTL, 0);
> +
> +	evergreen_mc_stop(rdev, &save);
> +	if (radeon_mc_wait_for_idle(rdev)) {
> +		dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
> +	}
> +	/* Lockout access through VGA aperture*/
> +	WREG32(VGA_HDP_CONTROL, VGA_MEMORY_DISABLE);
> +	/* Update configuration */
> +	WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR,
> +	       rdev->mc.vram_start >> 12);
> +	WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR,
> +	       rdev->mc.vram_end >> 12);
> +	WREG32(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR,
> +	       rdev->vram_scratch.gpu_addr >> 12);
> +	tmp = ((rdev->mc.vram_end >> 24) & 0xFFFF) << 16;
> +	tmp |= ((rdev->mc.vram_start >> 24) & 0xFFFF);
> +	WREG32(MC_VM_FB_LOCATION, tmp);
> +	/* XXX double check these! */
> +	WREG32(HDP_NONSURFACE_BASE, (rdev->mc.vram_start >> 8));
> +	WREG32(HDP_NONSURFACE_INFO, (2 << 7) | (1 << 30));
> +	WREG32(HDP_NONSURFACE_SIZE, 0x3FFFFFFF);
> +	WREG32(MC_VM_AGP_BASE, 0);
> +	WREG32(MC_VM_AGP_TOP, 0x0FFFFFFF);
> +	WREG32(MC_VM_AGP_BOT, 0x0FFFFFFF);
> +	if (radeon_mc_wait_for_idle(rdev)) {
> +		dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
> +	}
> +	evergreen_mc_resume(rdev, &save);
> +	/* we need to own VRAM, so turn off the VGA renderer here
> +	 * to stop it overwriting our objects */
> +	rv515_vga_render_disable(rdev);
> +}
> +
> +/* SI MC address space is 40 bits */
> +static void si_vram_location(struct radeon_device *rdev,
> +			     struct radeon_mc *mc, u64 base)
> +{
> +	mc->vram_start = base;
> +	if (mc->mc_vram_size > (0xFFFFFFFFFFULL - base + 1)) {

Why not ((1ULL << 40ULL) - 1ULL) so i don't have to count the number
of F in 0xFFFFFFFFFFULL ;)

> +		dev_warn(rdev->dev, "limiting VRAM to PCI aperture size\n");
> +		mc->real_vram_size = mc->aper_size;
> +		mc->mc_vram_size = mc->aper_size;
> +	}
> +	mc->vram_end = mc->vram_start + mc->mc_vram_size - 1;
> +	dev_info(rdev->dev, "VRAM: %lluM 0x%016llX - 0x%016llX (%lluM used)\n",
> +			mc->mc_vram_size >> 20, mc->vram_start,
> +			mc->vram_end, mc->real_vram_size >> 20);
> +}
> +
> +static void si_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc)
> +{
> +	u64 size_af, size_bf;
> +
> +	size_af = ((0xFFFFFFFFFFULL - mc->vram_end) + mc->gtt_base_align) & ~mc->gtt_base_align;
> +	size_bf = mc->vram_start & ~mc->gtt_base_align;
> +	if (size_bf > size_af) {
> +		if (mc->gtt_size > size_bf) {
> +			dev_warn(rdev->dev, "limiting GTT\n");
> +			mc->gtt_size = size_bf;
> +		}
> +		mc->gtt_start = (mc->vram_start & ~mc->gtt_base_align) - mc->gtt_size;
> +	} else {
> +		if (mc->gtt_size > size_af) {
> +			dev_warn(rdev->dev, "limiting GTT\n");
> +			mc->gtt_size = size_af;
> +		}
> +		mc->gtt_start = (mc->vram_end + 1 + mc->gtt_base_align) & ~mc->gtt_base_align;
> +	}
> +	mc->gtt_end = mc->gtt_start + mc->gtt_size - 1;
> +	dev_info(rdev->dev, "GTT: %lluM 0x%016llX - 0x%016llX\n",
> +			mc->gtt_size >> 20, mc->gtt_start, mc->gtt_end);
> +}
> +
> +static void si_vram_gtt_location(struct radeon_device *rdev,
> +				 struct radeon_mc *mc)
> +{
> +	if (mc->mc_vram_size > 0xFFC0000000ULL) {
> +		/* leave room for at least 1024M GTT */
> +		dev_warn(rdev->dev, "limiting VRAM\n");
> +		mc->real_vram_size = 0xFFC0000000ULL;
> +		mc->mc_vram_size = 0xFFC0000000ULL;
> +	}
> +	si_vram_location(rdev, &rdev->mc, 0);
> +	rdev->mc.gtt_base_align = 0;
> +	si_gtt_location(rdev, mc);
> +}
> +
> +static int si_mc_init(struct radeon_device *rdev)
> +{
> +	u32 tmp;
> +	int chansize, numchan;
> +
> +	/* Get VRAM informations */
> +	rdev->mc.vram_is_ddr = true;
> +	tmp = RREG32(MC_ARB_RAMCFG);
> +	if (tmp & CHANSIZE_OVERRIDE) {
> +		chansize = 16;
> +	} else if (tmp & CHANSIZE_MASK) {
> +		chansize = 64;
> +	} else {
> +		chansize = 32;
> +	}
> +	tmp = RREG32(MC_SHARED_CHMAP);
> +	switch ((tmp & NOOFCHAN_MASK) >> NOOFCHAN_SHIFT) {
> +	case 0:
> +	default:
> +		numchan = 1;
> +		break;
> +	case 1:
> +		numchan = 2;
> +		break;
> +	case 2:
> +		numchan = 4;
> +		break;
> +	case 3:
> +		numchan = 8;
> +		break;
> +	case 4:
> +		numchan = 3;
> +		break;
> +	case 5:
> +		numchan = 6;
> +		break;
> +	case 6:
> +		numchan = 10;
> +		break;
> +	case 7:
> +		numchan = 12;
> +		break;
> +	case 8:
> +		numchan = 16;
> +		break;
> +	}
> +	rdev->mc.vram_width = numchan * chansize;
> +	/* Could aper size report 0 ? */
> +	rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0);
> +	rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0);
> +	/* size in MB on si */
> +	rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE) * 1024 * 1024;
> +	rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE) * 1024 * 1024;
> +	rdev->mc.visible_vram_size = rdev->mc.aper_size;
> +	si_vram_gtt_location(rdev, &rdev->mc);
> +	radeon_update_bandwidth_info(rdev);
> +
> +	return 0;
> +}
> +
> +/*
> + * GART
> + */
> +void si_pcie_gart_tlb_flush(struct radeon_device *rdev)
> +{
> +	/* flush hdp cache */
> +	WREG32(HDP_MEM_COHERENCY_FLUSH_CNTL, 0x1);
> +
> +	/* bits 0-15 are the VM contexts0-15 */
> +	WREG32(VM_INVALIDATE_REQUEST, 1);
> +}
> +
> +int si_pcie_gart_enable(struct radeon_device *rdev)
> +{
> +	int r, i;
> +
> +	if (rdev->gart.robj == NULL) {
> +		dev_err(rdev->dev, "No VRAM object for PCIE GART.\n");
> +		return -EINVAL;
> +	}
> +	r = radeon_gart_table_vram_pin(rdev);
> +	if (r)
> +		return r;
> +	radeon_gart_restore(rdev);
> +	/* Setup TLB control */
> +	WREG32(MC_VM_MX_L1_TLB_CNTL,
> +	       (0xA << 7) |
> +	       ENABLE_L1_TLB |
> +	       SYSTEM_ACCESS_MODE_NOT_IN_SYS |
> +	       ENABLE_ADVANCED_DRIVER_MODEL |
> +	       SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU);
> +	/* Setup L2 cache */
> +	WREG32(VM_L2_CNTL, ENABLE_L2_CACHE |
> +	       ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
> +	       ENABLE_L2_PDE0_CACHE_LRU_UPDATE_BY_WRITE |
> +	       EFFECTIVE_L2_QUEUE_SIZE(7) |
> +	       CONTEXT1_IDENTITY_ACCESS_MODE(1));
> +	WREG32(VM_L2_CNTL2, INVALIDATE_ALL_L1_TLBS | INVALIDATE_L2_CACHE);
> +	WREG32(VM_L2_CNTL3, L2_CACHE_BIGK_ASSOCIATIVITY |
> +	       L2_CACHE_BIGK_FRAGMENT_SIZE(0));
> +	/* setup context0 */
> +	WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR, rdev->mc.gtt_start >> 12);
> +	WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR, rdev->mc.gtt_end >> 12);
> +	WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR, rdev->gart.table_addr >> 12);
> +	WREG32(VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR,
> +			(u32)(rdev->dummy_page.addr >> 12));
> +	WREG32(VM_CONTEXT0_CNTL2, 0);
> +	WREG32(VM_CONTEXT0_CNTL, (ENABLE_CONTEXT | PAGE_TABLE_DEPTH(0) |
> +				  RANGE_PROTECTION_FAULT_ENABLE_DEFAULT));
> +
> +	WREG32(0x15D4, 0);
> +	WREG32(0x15D8, 0);
> +	WREG32(0x15DC, 0);
> +
> +	/* empty context1-15 */
> +	/* FIXME start with 1G, once using 2 level pt switch to full
> +	 * vm size space
> +	 */
> +	/* set vm size, must be a multiple of 4 */
> +	WREG32(VM_CONTEXT1_PAGE_TABLE_START_ADDR, 0);
> +	WREG32(VM_CONTEXT1_PAGE_TABLE_END_ADDR, (1 << 30) / RADEON_GPU_PAGE_SIZE);
> +	for (i = 1; i < 16; i++) {
> +		if (i < 8)
> +			WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (i << 2),
> +			       rdev->gart.table_addr >> 12);
> +		else
> +			WREG32(VM_CONTEXT8_PAGE_TABLE_BASE_ADDR + ((i - 8) << 2),
> +			       rdev->gart.table_addr >> 12);
> +	}
> +
> +	/* enable context1-15 */
> +	WREG32(VM_CONTEXT1_PROTECTION_FAULT_DEFAULT_ADDR,
> +	       (u32)(rdev->dummy_page.addr >> 12));
> +	WREG32(VM_CONTEXT1_CNTL2, 0);
> +	WREG32(VM_CONTEXT1_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(0) |
> +				RANGE_PROTECTION_FAULT_ENABLE_DEFAULT);
> +
> +	si_pcie_gart_tlb_flush(rdev);
> +	DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n",
> +		 (unsigned)(rdev->mc.gtt_size >> 20),
> +		 (unsigned long long)rdev->gart.table_addr);
> +	rdev->gart.ready = true;
> +	return 0;
> +}
> +
> +void si_pcie_gart_disable(struct radeon_device *rdev)
> +{
> +	/* Disable all tables */
> +	WREG32(VM_CONTEXT0_CNTL, 0);
> +	WREG32(VM_CONTEXT1_CNTL, 0);
> +	/* Setup TLB control */
> +	WREG32(MC_VM_MX_L1_TLB_CNTL, SYSTEM_ACCESS_MODE_NOT_IN_SYS |
> +	       SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU);
> +	/* Setup L2 cache */
> +	WREG32(VM_L2_CNTL, ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
> +	       ENABLE_L2_PDE0_CACHE_LRU_UPDATE_BY_WRITE |
> +	       EFFECTIVE_L2_QUEUE_SIZE(7) |
> +	       CONTEXT1_IDENTITY_ACCESS_MODE(1));
> +	WREG32(VM_L2_CNTL2, 0);
> +	WREG32(VM_L2_CNTL3, L2_CACHE_BIGK_ASSOCIATIVITY |
> +	       L2_CACHE_BIGK_FRAGMENT_SIZE(0));
> +	radeon_gart_table_vram_unpin(rdev);
> +}
> +
> +void si_pcie_gart_fini(struct radeon_device *rdev)
> +{
> +	si_pcie_gart_disable(rdev);
> +	radeon_gart_table_vram_free(rdev);
> +	radeon_gart_fini(rdev);
> +}
> +
> +/*
> + * vm
> + */
> +int si_vm_init(struct radeon_device *rdev)
> +{
> +	/* number of VMs */
> +	rdev->vm_manager.nvm = 16;
> +	/* base offset of vram pages */
> +	rdev->vm_manager.vram_base_offset = 0;
> +
> +	return 0;
> +}
> +
> +void si_vm_fini(struct radeon_device *rdev)
> +{
> +}
> +
> +int si_vm_bind(struct radeon_device *rdev, struct radeon_vm *vm, int id)
> +{
> +	if (id < 8)
> +		WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (id << 2), vm->pt_gpu_addr >> 12);
> +	else
> +		WREG32(VM_CONTEXT8_PAGE_TABLE_BASE_ADDR + ((id - 8) << 2),
> +		       vm->pt_gpu_addr >> 12);
> +	/* flush hdp cache */
> +	WREG32(HDP_MEM_COHERENCY_FLUSH_CNTL, 0x1);
> +	/* bits 0-15 are the VM contexts0-15 */
> +	WREG32(VM_INVALIDATE_REQUEST, 1 << id);
> +	return 0;
> +}
> +
> +void si_vm_unbind(struct radeon_device *rdev, struct radeon_vm *vm)
> +{
> +	if (vm->id < 8)
> +		WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (vm->id << 2), 0);
> +	else
> +		WREG32(VM_CONTEXT8_PAGE_TABLE_BASE_ADDR + ((vm->id - 8) << 2), 0);
> +	/* flush hdp cache */
> +	WREG32(HDP_MEM_COHERENCY_FLUSH_CNTL, 0x1);
> +	/* bits 0-15 are the VM contexts0-15 */
> +	WREG32(VM_INVALIDATE_REQUEST, 1 << vm->id);
> +}
> +
> +void si_vm_tlb_flush(struct radeon_device *rdev, struct radeon_vm *vm)
> +{
> +	if (vm->id == -1)
> +		return;
> +
> +	/* flush hdp cache */
> +	WREG32(HDP_MEM_COHERENCY_FLUSH_CNTL, 0x1);
> +	/* bits 0-15 are the VM contexts0-15 */
> +	WREG32(VM_INVALIDATE_REQUEST, 1 << vm->id);
> +}
> +
> diff --git a/drivers/gpu/drm/radeon/sid.h b/drivers/gpu/drm/radeon/sid.h
> index 4c6ff1c..4d9cdc8 100644
> --- a/drivers/gpu/drm/radeon/sid.h
> +++ b/drivers/gpu/drm/radeon/sid.h
> @@ -50,6 +50,9 @@
>  #define SI_MAX_TCC               16
>  #define SI_MAX_TCC_MASK          0xFFFF
>  
> +#define VGA_HDP_CONTROL  				0x328
> +#define		VGA_MEMORY_DISABLE				(1 << 4)
> +
>  #define DMIF_ADDR_CONFIG  				0xBD4
>  
>  #define	SRBM_STATUS				        0xE50
> @@ -57,11 +60,88 @@
>  #define	CC_SYS_RB_BACKEND_DISABLE			0xe80
>  #define	GC_USER_SYS_RB_BACKEND_DISABLE			0xe84
>  
> +#define VM_L2_CNTL					0x1400
> +#define		ENABLE_L2_CACHE					(1 << 0)
> +#define		ENABLE_L2_FRAGMENT_PROCESSING			(1 << 1)
> +#define		L2_CACHE_PTE_ENDIAN_SWAP_MODE(x)		((x) << 2)
> +#define		L2_CACHE_PDE_ENDIAN_SWAP_MODE(x)		((x) << 4)
> +#define		ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE		(1 << 9)
> +#define		ENABLE_L2_PDE0_CACHE_LRU_UPDATE_BY_WRITE	(1 << 10)
> +#define		EFFECTIVE_L2_QUEUE_SIZE(x)			(((x) & 7) << 15)
> +#define		CONTEXT1_IDENTITY_ACCESS_MODE(x)		(((x) & 3) << 19)
> +#define VM_L2_CNTL2					0x1404
> +#define		INVALIDATE_ALL_L1_TLBS				(1 << 0)
> +#define		INVALIDATE_L2_CACHE				(1 << 1)
> +#define		INVALIDATE_CACHE_MODE(x)			((x) << 26)
> +#define			INVALIDATE_PTE_AND_PDE_CACHES		0
> +#define			INVALIDATE_ONLY_PTE_CACHES		1
> +#define			INVALIDATE_ONLY_PDE_CACHES		2
> +#define VM_L2_CNTL3					0x1408
> +#define		BANK_SELECT(x)					((x) << 0)
> +#define		L2_CACHE_UPDATE_MODE(x)				((x) << 6)
> +#define		L2_CACHE_BIGK_FRAGMENT_SIZE(x)			((x) << 15)
> +#define		L2_CACHE_BIGK_ASSOCIATIVITY			(1 << 20)
> +#define	VM_L2_STATUS					0x140C
> +#define		L2_BUSY						(1 << 0)
> +#define VM_CONTEXT0_CNTL				0x1410
> +#define		ENABLE_CONTEXT					(1 << 0)
> +#define		PAGE_TABLE_DEPTH(x)				(((x) & 3) << 1)
> +#define		RANGE_PROTECTION_FAULT_ENABLE_DEFAULT		(1 << 4)
> +#define VM_CONTEXT1_CNTL				0x1414
> +#define VM_CONTEXT0_CNTL2				0x1430
> +#define VM_CONTEXT1_CNTL2				0x1434
> +#define	VM_CONTEXT8_PAGE_TABLE_BASE_ADDR		0x1438
> +#define	VM_CONTEXT9_PAGE_TABLE_BASE_ADDR		0x143c
> +#define	VM_CONTEXT10_PAGE_TABLE_BASE_ADDR		0x1440
> +#define	VM_CONTEXT11_PAGE_TABLE_BASE_ADDR		0x1444
> +#define	VM_CONTEXT12_PAGE_TABLE_BASE_ADDR		0x1448
> +#define	VM_CONTEXT13_PAGE_TABLE_BASE_ADDR		0x144c
> +#define	VM_CONTEXT14_PAGE_TABLE_BASE_ADDR		0x1450
> +#define	VM_CONTEXT15_PAGE_TABLE_BASE_ADDR		0x1454
> +
> +#define VM_INVALIDATE_REQUEST				0x1478
> +#define VM_INVALIDATE_RESPONSE				0x147c
> +
> +#define VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR	0x1518
> +#define VM_CONTEXT1_PROTECTION_FAULT_DEFAULT_ADDR	0x151c
> +
> +#define	VM_CONTEXT0_PAGE_TABLE_BASE_ADDR		0x153c
> +#define	VM_CONTEXT1_PAGE_TABLE_BASE_ADDR		0x1540
> +#define	VM_CONTEXT2_PAGE_TABLE_BASE_ADDR		0x1544
> +#define	VM_CONTEXT3_PAGE_TABLE_BASE_ADDR		0x1548
> +#define	VM_CONTEXT4_PAGE_TABLE_BASE_ADDR		0x154c
> +#define	VM_CONTEXT5_PAGE_TABLE_BASE_ADDR		0x1550
> +#define	VM_CONTEXT6_PAGE_TABLE_BASE_ADDR		0x1554
> +#define	VM_CONTEXT7_PAGE_TABLE_BASE_ADDR		0x1558
> +#define	VM_CONTEXT0_PAGE_TABLE_START_ADDR		0x155c
> +#define	VM_CONTEXT1_PAGE_TABLE_START_ADDR		0x1560
> +
> +#define	VM_CONTEXT0_PAGE_TABLE_END_ADDR			0x157C
> +#define	VM_CONTEXT1_PAGE_TABLE_END_ADDR			0x1580
> +
>  #define MC_SHARED_CHMAP						0x2004
>  #define		NOOFCHAN_SHIFT					12
>  #define		NOOFCHAN_MASK					0x0000f000
>  #define MC_SHARED_CHREMAP					0x2008
>  
> +#define	MC_VM_FB_LOCATION				0x2024
> +#define	MC_VM_AGP_TOP					0x2028
> +#define	MC_VM_AGP_BOT					0x202C
> +#define	MC_VM_AGP_BASE					0x2030
> +#define	MC_VM_SYSTEM_APERTURE_LOW_ADDR			0x2034
> +#define	MC_VM_SYSTEM_APERTURE_HIGH_ADDR			0x2038
> +#define	MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR		0x203C
> +
> +#define	MC_VM_MX_L1_TLB_CNTL				0x2064
> +#define		ENABLE_L1_TLB					(1 << 0)
> +#define		ENABLE_L1_FRAGMENT_PROCESSING			(1 << 1)
> +#define		SYSTEM_ACCESS_MODE_PA_ONLY			(0 << 3)
> +#define		SYSTEM_ACCESS_MODE_USE_SYS_MAP			(1 << 3)
> +#define		SYSTEM_ACCESS_MODE_IN_SYS			(2 << 3)
> +#define		SYSTEM_ACCESS_MODE_NOT_IN_SYS			(3 << 3)
> +#define		SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU	(0 << 5)
> +#define		ENABLE_ADVANCED_DRIVER_MODEL			(1 << 6)
> +
>  #define	MC_ARB_RAMCFG					0x2760
>  #define		NOOFBANK_SHIFT					0
>  #define		NOOFBANK_MASK					0x00000003
> @@ -73,19 +153,29 @@
>  #define		NOOFCOLS_MASK					0x000000C0
>  #define		CHANSIZE_SHIFT					8
>  #define		CHANSIZE_MASK					0x00000100
> +#define		CHANSIZE_OVERRIDE				(1 << 11)
>  #define		NOOFGROUPS_SHIFT				12
>  #define		NOOFGROUPS_MASK					0x00001000
>  
>  #define	HDP_HOST_PATH_CNTL				0x2C00
> +#define	HDP_NONSURFACE_BASE				0x2C04
> +#define	HDP_NONSURFACE_INFO				0x2C08
> +#define	HDP_NONSURFACE_SIZE				0x2C0C
>  
>  #define HDP_ADDR_CONFIG  				0x2F48
>  #define HDP_MISC_CNTL					0x2F4C
>  #define 	HDP_FLUSH_INVALIDATE_CACHE			(1 << 0)
>  
> +#define	CONFIG_MEMSIZE					0x5428
> +
> +#define HDP_MEM_COHERENCY_FLUSH_CNTL			0x5480
> +
>  #define	BIF_FB_EN						0x5490
>  #define		FB_READ_EN					(1 << 0)
>  #define		FB_WRITE_EN					(1 << 1)
>  
> +#define HDP_REG_COHERENCY_FLUSH_CNTL			0x54A0
> +
>  #define	DC_LB_MEMORY_SPLIT					0x6b0c
>  #define		DC_LB_MEMORY_CONFIG(x)				((x) << 20)
>  
> @@ -321,5 +411,134 @@
>  #define	TCP_CHAN_STEER_LO				0xac0c
>  #define	TCP_CHAN_STEER_HI				0xac10
>  
> +/*
> + * PM4
> + */
> +#define	PACKET_TYPE0	0
> +#define	PACKET_TYPE1	1
> +#define	PACKET_TYPE2	2
> +#define	PACKET_TYPE3	3
> +
> +#define CP_PACKET_GET_TYPE(h) (((h) >> 30) & 3)
> +#define CP_PACKET_GET_COUNT(h) (((h) >> 16) & 0x3FFF)
> +#define CP_PACKET0_GET_REG(h) (((h) & 0xFFFF) << 2)
> +#define CP_PACKET3_GET_OPCODE(h) (((h) >> 8) & 0xFF)
> +#define PACKET0(reg, n)	((PACKET_TYPE0 << 30) |				\
> +			 (((reg) >> 2) & 0xFFFF) |			\
> +			 ((n) & 0x3FFF) << 16)
> +#define CP_PACKET2			0x80000000
> +#define		PACKET2_PAD_SHIFT		0
> +#define		PACKET2_PAD_MASK		(0x3fffffff << 0)
> +
> +#define PACKET2(v)	(CP_PACKET2 | REG_SET(PACKET2_PAD, (v)))
> +
> +#define PACKET3(op, n)	((PACKET_TYPE3 << 30) |				\
> +			 (((op) & 0xFF) << 8) |				\
> +			 ((n) & 0x3FFF) << 16)
> +
> +/* Packet 3 types */
> +#define	PACKET3_NOP					0x10
> +#define	PACKET3_SET_BASE				0x11
> +#define		PACKET3_BASE_INDEX(x)                  ((x) << 0)
> +#define			GDS_PARTITION_BASE		2
> +#define			CE_PARTITION_BASE		3
> +#define	PACKET3_CLEAR_STATE				0x12
> +#define	PACKET3_INDEX_BUFFER_SIZE			0x13
> +#define	PACKET3_DISPATCH_DIRECT				0x15
> +#define	PACKET3_DISPATCH_INDIRECT			0x16
> +#define	PACKET3_ALLOC_GDS				0x1B
> +#define	PACKET3_WRITE_GDS_RAM				0x1C
> +#define	PACKET3_ATOMIC_GDS				0x1D
> +#define	PACKET3_ATOMIC					0x1E
> +#define	PACKET3_OCCLUSION_QUERY				0x1F
> +#define	PACKET3_SET_PREDICATION				0x20
> +#define	PACKET3_REG_RMW					0x21
> +#define	PACKET3_COND_EXEC				0x22
> +#define	PACKET3_PRED_EXEC				0x23
> +#define	PACKET3_DRAW_INDIRECT				0x24
> +#define	PACKET3_DRAW_INDEX_INDIRECT			0x25
> +#define	PACKET3_INDEX_BASE				0x26
> +#define	PACKET3_DRAW_INDEX_2				0x27
> +#define	PACKET3_CONTEXT_CONTROL				0x28
> +#define	PACKET3_INDEX_TYPE				0x2A
> +#define	PACKET3_DRAW_INDIRECT_MULTI			0x2C
> +#define	PACKET3_DRAW_INDEX_AUTO				0x2D
> +#define	PACKET3_DRAW_INDEX_IMMD				0x2E
> +#define	PACKET3_NUM_INSTANCES				0x2F
> +#define	PACKET3_DRAW_INDEX_MULTI_AUTO			0x30
> +#define	PACKET3_INDIRECT_BUFFER_CONST			0x31
> +#define	PACKET3_INDIRECT_BUFFER				0x32
> +#define	PACKET3_STRMOUT_BUFFER_UPDATE			0x34
> +#define	PACKET3_DRAW_INDEX_OFFSET_2			0x35
> +#define	PACKET3_DRAW_INDEX_MULTI_ELEMENT		0x36
> +#define	PACKET3_WRITE_DATA				0x37
> +#define	PACKET3_DRAW_INDEX_INDIRECT_MULTI		0x38
> +#define	PACKET3_MEM_SEMAPHORE				0x39
> +#define	PACKET3_MPEG_INDEX				0x3A
> +#define	PACKET3_COPY_DW					0x3B
> +#define	PACKET3_WAIT_REG_MEM				0x3C
> +#define	PACKET3_MEM_WRITE				0x3D
> +#define	PACKET3_COPY_DATA				0x40
> +#define	PACKET3_PFP_SYNC_ME				0x42
> +#define	PACKET3_SURFACE_SYNC				0x43
> +#              define PACKET3_DEST_BASE_0_ENA      (1 << 0)
> +#              define PACKET3_DEST_BASE_1_ENA      (1 << 1)
> +#              define PACKET3_CB0_DEST_BASE_ENA    (1 << 6)
> +#              define PACKET3_CB1_DEST_BASE_ENA    (1 << 7)
> +#              define PACKET3_CB2_DEST_BASE_ENA    (1 << 8)
> +#              define PACKET3_CB3_DEST_BASE_ENA    (1 << 9)
> +#              define PACKET3_CB4_DEST_BASE_ENA    (1 << 10)
> +#              define PACKET3_CB5_DEST_BASE_ENA    (1 << 11)
> +#              define PACKET3_CB6_DEST_BASE_ENA    (1 << 12)
> +#              define PACKET3_CB7_DEST_BASE_ENA    (1 << 13)
> +#              define PACKET3_DB_DEST_BASE_ENA     (1 << 14)
> +#              define PACKET3_DEST_BASE_2_ENA      (1 << 19)
> +#              define PACKET3_DEST_BASE_3_ENA      (1 << 21)
> +#              define PACKET3_TCL1_ACTION_ENA      (1 << 22)
> +#              define PACKET3_TC_ACTION_ENA        (1 << 23)
> +#              define PACKET3_CB_ACTION_ENA        (1 << 25)
> +#              define PACKET3_DB_ACTION_ENA        (1 << 26)
> +#              define PACKET3_SH_KCACHE_ACTION_ENA (1 << 27)
> +#              define PACKET3_SH_ICACHE_ACTION_ENA (1 << 29)
> +#define	PACKET3_ME_INITIALIZE				0x44
> +#define		PACKET3_ME_INITIALIZE_DEVICE_ID(x) ((x) << 16)
> +#define	PACKET3_COND_WRITE				0x45
> +#define	PACKET3_EVENT_WRITE				0x46
> +#define	PACKET3_EVENT_WRITE_EOP				0x47
> +#define	PACKET3_EVENT_WRITE_EOS				0x48
> +#define	PACKET3_PREAMBLE_CNTL				0x4A
> +#              define PACKET3_PREAMBLE_BEGIN_CLEAR_STATE     (2 << 28)
> +#              define PACKET3_PREAMBLE_END_CLEAR_STATE       (3 << 28)
> +#define	PACKET3_ONE_REG_WRITE				0x57
> +#define	PACKET3_LOAD_CONFIG_REG				0x5F
> +#define	PACKET3_LOAD_CONTEXT_REG			0x60
> +#define	PACKET3_LOAD_SH_REG				0x61
> +#define	PACKET3_SET_CONFIG_REG				0x68
> +#define		PACKET3_SET_CONFIG_REG_START			0x00008000
> +#define		PACKET3_SET_CONFIG_REG_END			0x0000b000
> +#define	PACKET3_SET_CONTEXT_REG				0x69
> +#define		PACKET3_SET_CONTEXT_REG_START			0x00028000
> +#define		PACKET3_SET_CONTEXT_REG_END			0x00029000
> +#define	PACKET3_SET_CONTEXT_REG_INDIRECT		0x73
> +#define	PACKET3_SET_RESOURCE_INDIRECT			0x74
> +#define	PACKET3_SET_SH_REG				0x76
> +#define		PACKET3_SET_SH_REG_START			0x0000b000
> +#define		PACKET3_SET_SH_REG_END				0x0000c000
> +#define	PACKET3_SET_SH_REG_OFFSET			0x77
> +#define	PACKET3_ME_WRITE				0x7A
> +#define	PACKET3_SCRATCH_RAM_WRITE			0x7D
> +#define	PACKET3_SCRATCH_RAM_READ			0x7E
> +#define	PACKET3_CE_WRITE				0x7F
> +#define	PACKET3_LOAD_CONST_RAM				0x80
> +#define	PACKET3_WRITE_CONST_RAM				0x81
> +#define	PACKET3_WRITE_CONST_RAM_OFFSET			0x82
> +#define	PACKET3_DUMP_CONST_RAM				0x83
> +#define	PACKET3_INCREMENT_CE_COUNTER			0x84
> +#define	PACKET3_INCREMENT_DE_COUNTER			0x85
> +#define	PACKET3_WAIT_ON_CE_COUNTER			0x86
> +#define	PACKET3_WAIT_ON_DE_COUNTER			0x87
> +#define	PACKET3_WAIT_ON_DE_COUNTER_DIFF			0x88
> +#define	PACKET3_SET_CE_DE_COUNTERS			0x89
> +#define	PACKET3_WAIT_ON_AVAIL_BUFFER			0x8A
>  
>  #endif

Good as is

Cheers,
Jerome

  reply	other threads:[~2012-03-20 23:20 UTC|newest]

Thread overview: 54+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-03-20 21:17 [PATCH 00/48] Add SI, TN support alexdeucher
2012-03-20 21:17 ` [PATCH 01/48] drm/radeon/kms: add info query for max pipes alexdeucher
2012-03-20 21:17 ` [PATCH 02/48] drm/radeon/kms: Upstream ObjectID.h updates alexdeucher
2012-03-20 21:17 ` [PATCH 03/48] drm/radeon/kms: upstream atombios.h updates alexdeucher
2012-03-20 21:17 ` [PATCH 04/48] drm/radeon/kms: upstream power table updates alexdeucher
2012-03-20 21:17 ` [PATCH 05/48] drm/radeon/kms: add SI chip families alexdeucher
2012-03-20 21:18 ` [PATCH 06/48] drm/radeon/kms: add initial DCE6 display watermark support alexdeucher
2012-03-20 23:18   ` Jerome Glisse
2012-03-20 21:18 ` [PATCH 07/48] drm/radeon/kms: fix up atom HPD gpio parsing for DCE6 alexdeucher
2012-03-20 21:18 ` [PATCH 08/48] drm/radeon/kms/atom: DCE6 no longer has crtcmemreq bits alexdeucher
2012-03-20 21:18 ` [PATCH 09/48] drm/radeon/kms/atom: add support for crtc power gating alexdeucher
2012-03-20 21:18 ` [PATCH 10/48] drm/radeon/kms: DCE6 disp eng pll updates alexdeucher
2012-03-20 21:18 ` [PATCH 11/48] drm/radeon/kms/atom: add support for DCE6.x dig transmitters alexdeucher
2012-03-20 21:18 ` [PATCH 12/48] drm/radeon/kms: DP aux updates for DCE6 alexdeucher
2012-03-20 21:18 ` [PATCH 13/48] drm/radeon/kms: update comments about dig encoders/transmitters alexdeucher
2012-03-20 21:18 ` [PATCH 14/48] drm/radeon/kms/atom: add support for SI SetVoltage table alexdeucher
2012-03-20 21:18 ` [PATCH 15/48] drm/radeon/kms: update power table parsing for SI alexdeucher
2012-03-20 21:18 ` [PATCH 16/48] drm/radeon/kms: add support for internal thermal sensor on SI alexdeucher
2012-03-20 21:18 ` [PATCH 17/48] drm/radeon/kms: add gpu init support for SI alexdeucher
2012-03-20 23:16   ` Jerome Glisse
2012-03-20 21:18 ` [PATCH 18/48] drm/radeon/kms: Add support for SI GPU reset alexdeucher
2012-03-20 21:18 ` [PATCH 19/48] drm/radeon/kms: add support for MC/VM setup on SI alexdeucher
2012-03-20 23:20   ` Jerome Glisse [this message]
2012-03-20 21:18 ` [PATCH 20/48] drm/radeon/kms: add support for the CONST IB to the CS ioctl alexdeucher
2012-03-20 21:18 ` [PATCH 21/48] drm/radeon/kms: add VM CS checker for SI alexdeucher
2012-03-20 21:18 ` [PATCH 22/48] drm/radeon/kms: Only VM CS ioctl is supported on SI (v2) alexdeucher
2012-03-20 21:18 ` [PATCH 23/48] drm/radeon/kms: add ucode loading for SI alexdeucher
2012-03-20 21:18 ` [PATCH 24/48] drm/radeon/kms: add support for MC ucode loading on SI alexdeucher
2012-03-20 21:18 ` [PATCH 25/48] drm/radeon/kms: add support for CP setup " alexdeucher
2012-03-20 21:18 ` [PATCH 26/48] drm/radeon/kms: add IB and fence dispatch functions for SI alexdeucher
2012-03-20 21:18 ` [PATCH 27/48] drm/radeon/kms: Add support for RLC init on SI alexdeucher
2012-03-20 21:18 ` [PATCH 28/48] drm/radeon/kms: add support for interrupts " alexdeucher
2012-03-20 21:18 ` [PATCH 29/48] drm/radeon/kms: fill in startup/shutdown callbacks for SI alexdeucher
2012-03-20 21:18 ` [PATCH 30/48] drm/radeon/kms: add support for compute rings in CS ioctl on SI alexdeucher
2012-03-20 21:18 ` [PATCH 31/48] drm/radeon/kms: add radeon_asic struct for SI alexdeucher
2012-03-20 21:18 ` [PATCH 32/48] drm/radeon: Update radeon_info_ioctl for SI. (v2) alexdeucher
2012-03-20 21:18 ` [PATCH 33/48] drm/radeon/kms: Add SI pci ids alexdeucher
2012-03-20 21:18 ` [PATCH 34/48] drm/radeon/kms: add trinity (TN) chip family alexdeucher
2012-03-20 21:18 ` [PATCH 35/48] drm/radeon/kms: no support for internal thermal sensor on TN yet alexdeucher
2012-03-20 21:18 ` [PATCH 36/48] drm/radeon/kms: DCE6.1 watermark updates for TN alexdeucher
2012-03-20 21:18 ` [PATCH 37/48] drm/radeon/kms: DCE6.1 disp eng pll updates alexdeucher
2012-03-20 21:18 ` [PATCH 38/48] drm/radeon/kms: Adjust pll picker for DCE6.1 alexdeucher
2012-03-20 21:18 ` [PATCH 39/48] drm/radeon/kms: disable PPLL0 on DCE6.1 when not in use alexdeucher
2012-03-20 21:18 ` [PATCH 40/48] drm/radeon/kms/DCE6.1: ss is not supported on the internal pplls alexdeucher
2012-03-20 21:18 ` [PATCH 41/48] drm/radeon/kms: Add checks for TN in the DP bridge code alexdeucher
2012-03-20 21:18 ` [PATCH 42/48] drm/radeon/kms: cayman gpu init updates for trinity alexdeucher
2012-03-20 21:18 ` [PATCH 43/48] drm/radeon/kms: Update evergreen functions " alexdeucher
2012-03-20 21:18 ` [PATCH 44/48] drm/radeon/kms/vm: set vram base offset properly for TN alexdeucher
2012-03-20 21:18 ` [PATCH 45/48] drm/radeon/kms: add support for ucode loading on trinity (v2) alexdeucher
2012-03-20 21:18 ` [PATCH 46/48] drm/radeon/kms: add radeon_asic struct for trinity alexdeucher
2012-03-20 21:18 ` [PATCH 47/48] drm/radeon/kms: add trinity pci ids alexdeucher
2012-03-20 21:18 ` [PATCH 48/48] drm/radeon/kms: update duallink checks for DCE6 alexdeucher
2012-03-20 23:17 ` [PATCH 00/48] Add SI, TN support Jerome Glisse
2012-03-21 11:18 ` Christian König

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1332285632.1654.6.camel@localhost.localdomain \
    --to=j.glisse@gmail.com \
    --cc=alexander.deucher@amd.com \
    --cc=alexdeucher@gmail.com \
    --cc=dri-devel@lists.freedesktop.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.