drm: Branch 'master' - 2 commits

[email protected] (Christian K??nig) Wed, 28 Feb 2018 12:29:41 +0000 (UTC)
Newsgroups gmane.comp.video.dri.patches
Message-ID <[email protected]>
 amdgpu/amdgpu.h          |    1 +
 amdgpu/amdgpu_device.c   |   34 +++++++++++++++++++---------------
 amdgpu/amdgpu_internal.h |    7 +++++--
 amdgpu/amdgpu_vamgr.c    |   24 +++++++++++++++++++-----
 4 files changed, 44 insertions(+), 22 deletions(-)

New commits:
commit ff0da7b32369a08c8a2f69cd4dcd046ad7a15bec
Author: Christian König <[email protected]>
Date:   Mon Feb 26 14:11:52 2018 +0100

    amdgpu: add AMDGPU_VA_RANGE_HIGH
    
    Return high addresses if requested and available.
    
    Signed-off-by: Christian König <[email protected]>
    Reviewed-by: Marek Olšák <[email protected]>

diff --git a/amdgpu/amdgpu.h b/amdgpu/amdgpu.h
index 928b2a68..36f91058 100644
--- a/amdgpu/amdgpu.h
+++ b/amdgpu/amdgpu.h
@@ -1162,6 +1162,7 @@ int amdgpu_read_mm_registers(amdgpu_device_handle dev, unsigned dword_offset,
  * Flag to request VA address range in the 32bit address space
 */
 #define AMDGPU_VA_RANGE_32_BIT		0x1
+#define AMDGPU_VA_RANGE_HIGH		0x2
 
 /**
  * Allocate virtual address range
diff --git a/amdgpu/amdgpu_device.c b/amdgpu/amdgpu_device.c
index ca0c7987..9ff6ad16 100644
--- a/amdgpu/amdgpu_device.c
+++ b/amdgpu/amdgpu_device.c
@@ -268,7 +268,6 @@ int amdgpu_device_initialize(int fd,
 	max = MIN2(dev->dev_info.virtual_address_max, 0x100000000ULL);
 	amdgpu_vamgr_init(&dev->vamgr_32, start, max,
 			  dev->dev_info.virtual_address_alignment);
-	dev->address32_hi = start >> 32;
 
 	start = max;
 	max = MAX2(dev->dev_info.virtual_address_max, 0x100000000ULL);
@@ -323,7 +322,10 @@ int amdgpu_query_sw_info(amdgpu_device_handle dev, enum amdgpu_sw_info info,
 
 	switch (info) {
 	case amdgpu_sw_info_address32_hi:
-		*val32 = dev->address32_hi;
+		if (dev->vamgr_high_32.va_max)
+			*val32 = dev->vamgr_high_32.va_max >> 32;
+		else
+			*val32 = dev->vamgr_32.va_max >> 32;
 		return 0;
 	}
 	return -EINVAL;
diff --git a/amdgpu/amdgpu_internal.h b/amdgpu/amdgpu_internal.h
index 423880ed..aeb5d651 100644
--- a/amdgpu/amdgpu_internal.h
+++ b/amdgpu/amdgpu_internal.h
@@ -73,7 +73,6 @@ struct amdgpu_device {
 	int flink_fd;
 	unsigned major_version;
 	unsigned minor_version;
-	uint32_t address32_hi;
 
 	char *marketing_name;
 	/** List of buffer handles. Protected by bo_table_mutex. */
diff --git a/amdgpu/amdgpu_vamgr.c b/amdgpu/amdgpu_vamgr.c
index 58400428..ac1202de 100644
--- a/amdgpu/amdgpu_vamgr.c
+++ b/amdgpu/amdgpu_vamgr.c
@@ -201,10 +201,21 @@ int amdgpu_va_range_alloc(amdgpu_device_handle dev,
 {
 	struct amdgpu_bo_va_mgr *vamgr;
 
-	if (flags & AMDGPU_VA_RANGE_32_BIT)
-		vamgr = &dev->vamgr_32;
-	else
-		vamgr = &dev->vamgr;
+	/* Clear the flag when the high VA manager is not initialized */
+	if (flags & AMDGPU_VA_RANGE_HIGH && !dev->vamgr_high_32.va_max)
+		flags &= ~AMDGPU_VA_RANGE_HIGH;
+
+	if (flags & AMDGPU_VA_RANGE_HIGH) {
+		if (flags & AMDGPU_VA_RANGE_32_BIT)
+			vamgr = &dev->vamgr_high_32;
+		else
+			vamgr = &dev->vamgr_high;
+	} else {
+		if (flags & AMDGPU_VA_RANGE_32_BIT)
+			vamgr = &dev->vamgr_32;
+		else
+			vamgr = &dev->vamgr;
+	}
 
 	va_base_alignment = MAX2(va_base_alignment, vamgr->va_alignment);
 	size = ALIGN(size, vamgr->va_alignment);
@@ -215,7 +226,10 @@ int amdgpu_va_range_alloc(amdgpu_device_handle dev,
 	if (!(flags & AMDGPU_VA_RANGE_32_BIT) &&
 	    (*va_base_allocated == AMDGPU_INVALID_VA_ADDRESS)) {
 		/* fallback to 32bit address */
-		vamgr = &dev->vamgr_32;
+		if (flags & AMDGPU_VA_RANGE_HIGH)
+			vamgr = &dev->vamgr_high_32;
+		else
+			vamgr = &dev->vamgr_32;
 		*va_base_allocated = amdgpu_vamgr_find_va(vamgr, size,
 					va_base_alignment, va_base_required);
 	}
commit cd8a80493beea4fbdd0a2e0b68ef0adbdaac1133
Author: Christian König <[email protected]>
Date:   Mon Feb 26 12:30:36 2018 +0100

    amdgpu: mostly revert "use the high VA range if possible v2"
    
    This reverts commit 07ea20d5beb24315b721adf83bbfa72ce016e146.
    
    Unfortunately it turned out that this change broke some corner cases in
    Mesa.
    
    Revert it for now, but keep the high range in separate VA managers.
    
    Signed-off-by: Christian König <[email protected]>
    Reviewed-by: Marek Olšák <[email protected]>

diff --git a/amdgpu/amdgpu_device.c b/amdgpu/amdgpu_device.c
index 6ee25a9e..ca0c7987 100644
--- a/amdgpu/amdgpu_device.c
+++ b/amdgpu/amdgpu_device.c
@@ -264,27 +264,29 @@ int amdgpu_device_initialize(int fd,
 		goto cleanup;
 	}
 
-	if (dev->dev_info.high_va_offset && dev->dev_info.high_va_max) {
-		start = dev->dev_info.high_va_offset;
-		max = dev->dev_info.high_va_max;
-	} else {
-		start = dev->dev_info.virtual_address_offset;
-		max = dev->dev_info.virtual_address_max;
-	}
-
-	max = MIN2(max, (start & ~0xffffffffULL) + 0x100000000ULL);
+	start = dev->dev_info.virtual_address_offset;
+	max = MIN2(dev->dev_info.virtual_address_max, 0x100000000ULL);
 	amdgpu_vamgr_init(&dev->vamgr_32, start, max,
 			  dev->dev_info.virtual_address_alignment);
 	dev->address32_hi = start >> 32;
 
 	start = max;
-	if (dev->dev_info.high_va_offset && dev->dev_info.high_va_max)
-		max = dev->dev_info.high_va_max;
-	else
-		max = dev->dev_info.virtual_address_max;
+	max = MAX2(dev->dev_info.virtual_address_max, 0x100000000ULL);
 	amdgpu_vamgr_init(&dev->vamgr, start, max,
 			  dev->dev_info.virtual_address_alignment);
 
+	start = dev->dev_info.high_va_offset;
+	max = MIN2(dev->dev_info.high_va_max, (start & ~0xffffffffULL) +
+		   0x100000000ULL);
+	amdgpu_vamgr_init(&dev->vamgr_high_32, start, max,
+			  dev->dev_info.virtual_address_alignment);
+
+	start = max;
+	max = MAX2(dev->dev_info.high_va_max, (start & ~0xffffffffULL) +
+		   0x100000000ULL);
+	amdgpu_vamgr_init(&dev->vamgr_high, start, max,
+			  dev->dev_info.virtual_address_alignment);
+
 	amdgpu_parse_asic_ids(dev);
 
 	*major_version = dev->major_version;
diff --git a/amdgpu/amdgpu_internal.h b/amdgpu/amdgpu_internal.h
index dd0c3a61..423880ed 100644
--- a/amdgpu/amdgpu_internal.h
+++ b/amdgpu/amdgpu_internal.h
@@ -84,10 +84,14 @@ struct amdgpu_device {
 	pthread_mutex_t bo_table_mutex;
 	struct drm_amdgpu_info_device dev_info;
 	struct amdgpu_gpu_info info;
-	/** The global VA manager for the whole virtual address space */
+	/** The VA manager for the lower virtual address space */
 	struct amdgpu_bo_va_mgr vamgr;
 	/** The VA manager for the 32bit address space */
 	struct amdgpu_bo_va_mgr vamgr_32;
+	/** The VA manager for the high virtual address space */
+	struct amdgpu_bo_va_mgr vamgr_high;
+	/** The VA manager for the 32bit high address space */
+	struct amdgpu_bo_va_mgr vamgr_high_32;
 };
 
 struct amdgpu_bo {

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
--
_______________________________________________
Dri-patches mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/dri-patches