[libdrm] admgpu: add amdgpu_query_sw_info for querying high bits of 32-bit address space

Submitted by Marek Olšák on Feb. 2, 2018, 5:34 p.m.

Details

Message ID 1517592891-25061-1-git-send-email-maraeo@gmail.com
State New
Headers show
Series "admgpu: add amdgpu_query_sw_info for querying high bits of 32-bit address space" ( rev: 1 ) in AMD X.Org drivers

Not browsing as part of any series.

Commit Message

Marek Olšák Feb. 2, 2018, 5:34 p.m.
From: Marek Olšák <marek.olsak@amd.com>

---
 amdgpu/amdgpu.h          | 21 +++++++++++++++++++++
 amdgpu/amdgpu_device.c   | 14 ++++++++++++++
 amdgpu/amdgpu_internal.h |  1 +
 3 files changed, 36 insertions(+)

Patch hide | download patch | download mbox

diff --git a/amdgpu/amdgpu.h b/amdgpu/amdgpu.h
index 2eb03bf..928b2a6 100644
--- a/amdgpu/amdgpu.h
+++ b/amdgpu/amdgpu.h
@@ -87,20 +87,24 @@  enum amdgpu_bo_handle_type {
 	amdgpu_bo_handle_type_dma_buf_fd = 2
 };
 
 /** Define known types of GPU VM VA ranges */
 enum amdgpu_gpu_va_range
 {
 	/** Allocate from "normal"/general range */
 	amdgpu_gpu_va_range_general = 0
 };
 
+enum amdgpu_sw_info {
+	amdgpu_sw_info_address32_hi = 0,
+};
+
 /*--------------------------------------------------------------------------*/
 /* -------------------------- Datatypes ----------------------------------- */
 /*--------------------------------------------------------------------------*/
 
 /**
  * Define opaque pointer to context associated with fd.
  * This context will be returned as the result of
  * "initialize" function and should be pass as the first
  * parameter to any API call
  */
@@ -1079,20 +1083,37 @@  int amdgpu_query_gpu_info(amdgpu_device_handle dev,
  * \param   value   - \c [out] Pointer to the return value.
  *
  * \return   0 on success\n
  *          <0 - Negative POSIX error code
  *
 */
 int amdgpu_query_info(amdgpu_device_handle dev, unsigned info_id,
 		      unsigned size, void *value);
 
 /**
+ * Query hardware or driver information.
+ *
+ * The return size is query-specific and depends on the "info_id" parameter.
+ * No more than "size" bytes is returned.
+ *
+ * \param   dev     - \c [in] Device handle. See #amdgpu_device_initialize()
+ * \param   info    - \c [in] amdgpu_sw_info_*
+ * \param   value   - \c [out] Pointer to the return value.
+ *
+ * \return   0 on success\n
+ *          <0 - Negative POSIX error code
+ *
+*/
+int amdgpu_query_sw_info(amdgpu_device_handle dev, enum amdgpu_sw_info info,
+			 void *value);
+
+/**
  * Query information about GDS
  *
  * \param   dev	     - \c [in] Device handle. See #amdgpu_device_initialize()
  * \param   gds_info - \c [out] Pointer to structure to get GDS information
  *
  * \return   0 on success\n
  *          <0 - Negative POSIX Error code
  *
 */
 int amdgpu_query_gds_info(amdgpu_device_handle dev,
diff --git a/amdgpu/amdgpu_device.c b/amdgpu/amdgpu_device.c
index f34e27a..6ee25a9 100644
--- a/amdgpu/amdgpu_device.c
+++ b/amdgpu/amdgpu_device.c
@@ -268,20 +268,21 @@  int amdgpu_device_initialize(int fd,
 		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);
 	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;
 	amdgpu_vamgr_init(&dev->vamgr, start, max,
 			  dev->dev_info.virtual_address_alignment);
 
 	amdgpu_parse_asic_ids(dev);
@@ -305,10 +306,23 @@  cleanup:
 int amdgpu_device_deinitialize(amdgpu_device_handle dev)
 {
 	amdgpu_device_reference(&dev, NULL);
 	return 0;
 }
 
 const char *amdgpu_get_marketing_name(amdgpu_device_handle dev)
 {
 	return dev->marketing_name;
 }
+
+int amdgpu_query_sw_info(amdgpu_device_handle dev, enum amdgpu_sw_info info,
+			 void *value)
+{
+	uint32_t *val32 = (uint32_t*)value;
+
+	switch (info) {
+	case amdgpu_sw_info_address32_hi:
+		*val32 = dev->address32_hi;
+		return 0;
+	}
+	return -EINVAL;
+}
diff --git a/amdgpu/amdgpu_internal.h b/amdgpu/amdgpu_internal.h
index 3e044f1..802b162 100644
--- a/amdgpu/amdgpu_internal.h
+++ b/amdgpu/amdgpu_internal.h
@@ -68,20 +68,21 @@  struct amdgpu_va {
 	enum amdgpu_gpu_va_range range;
 	struct amdgpu_bo_va_mgr *vamgr;
 };
 
 struct amdgpu_device {
 	atomic_t refcount;
 	int fd;
 	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. */
 	struct util_hash_table *bo_handles;
 	/** List of buffer GEM flink names. Protected by bo_table_mutex. */
 	struct util_hash_table *bo_flink_names;
 	/** This protects all hash tables. */
 	pthread_mutex_t bo_table_mutex;
 	struct drm_amdgpu_info_device dev_info;
 	struct amdgpu_gpu_info info;

Comments

Reviewed-by: Christian König <christian.koenig@amd.com>

Am 02.02.2018 um 18:34 schrieb Marek Olšák:
> From: Marek Olšák <marek.olsak@amd.com>
>
> ---
>   amdgpu/amdgpu.h          | 21 +++++++++++++++++++++
>   amdgpu/amdgpu_device.c   | 14 ++++++++++++++
>   amdgpu/amdgpu_internal.h |  1 +
>   3 files changed, 36 insertions(+)
>
> diff --git a/amdgpu/amdgpu.h b/amdgpu/amdgpu.h
> index 2eb03bf..928b2a6 100644
> --- a/amdgpu/amdgpu.h
> +++ b/amdgpu/amdgpu.h
> @@ -87,20 +87,24 @@ enum amdgpu_bo_handle_type {
>   	amdgpu_bo_handle_type_dma_buf_fd = 2
>   };
>   
>   /** Define known types of GPU VM VA ranges */
>   enum amdgpu_gpu_va_range
>   {
>   	/** Allocate from "normal"/general range */
>   	amdgpu_gpu_va_range_general = 0
>   };
>   
> +enum amdgpu_sw_info {
> +	amdgpu_sw_info_address32_hi = 0,
> +};
> +
>   /*--------------------------------------------------------------------------*/
>   /* -------------------------- Datatypes ----------------------------------- */
>   /*--------------------------------------------------------------------------*/
>   
>   /**
>    * Define opaque pointer to context associated with fd.
>    * This context will be returned as the result of
>    * "initialize" function and should be pass as the first
>    * parameter to any API call
>    */
> @@ -1079,20 +1083,37 @@ int amdgpu_query_gpu_info(amdgpu_device_handle dev,
>    * \param   value   - \c [out] Pointer to the return value.
>    *
>    * \return   0 on success\n
>    *          <0 - Negative POSIX error code
>    *
>   */
>   int amdgpu_query_info(amdgpu_device_handle dev, unsigned info_id,
>   		      unsigned size, void *value);
>   
>   /**
> + * Query hardware or driver information.
> + *
> + * The return size is query-specific and depends on the "info_id" parameter.
> + * No more than "size" bytes is returned.
> + *
> + * \param   dev     - \c [in] Device handle. See #amdgpu_device_initialize()
> + * \param   info    - \c [in] amdgpu_sw_info_*
> + * \param   value   - \c [out] Pointer to the return value.
> + *
> + * \return   0 on success\n
> + *          <0 - Negative POSIX error code
> + *
> +*/
> +int amdgpu_query_sw_info(amdgpu_device_handle dev, enum amdgpu_sw_info info,
> +			 void *value);
> +
> +/**
>    * Query information about GDS
>    *
>    * \param   dev	     - \c [in] Device handle. See #amdgpu_device_initialize()
>    * \param   gds_info - \c [out] Pointer to structure to get GDS information
>    *
>    * \return   0 on success\n
>    *          <0 - Negative POSIX Error code
>    *
>   */
>   int amdgpu_query_gds_info(amdgpu_device_handle dev,
> diff --git a/amdgpu/amdgpu_device.c b/amdgpu/amdgpu_device.c
> index f34e27a..6ee25a9 100644
> --- a/amdgpu/amdgpu_device.c
> +++ b/amdgpu/amdgpu_device.c
> @@ -268,20 +268,21 @@ int amdgpu_device_initialize(int fd,
>   		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);
>   	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;
>   	amdgpu_vamgr_init(&dev->vamgr, start, max,
>   			  dev->dev_info.virtual_address_alignment);
>   
>   	amdgpu_parse_asic_ids(dev);
> @@ -305,10 +306,23 @@ cleanup:
>   int amdgpu_device_deinitialize(amdgpu_device_handle dev)
>   {
>   	amdgpu_device_reference(&dev, NULL);
>   	return 0;
>   }
>   
>   const char *amdgpu_get_marketing_name(amdgpu_device_handle dev)
>   {
>   	return dev->marketing_name;
>   }
> +
> +int amdgpu_query_sw_info(amdgpu_device_handle dev, enum amdgpu_sw_info info,
> +			 void *value)
> +{
> +	uint32_t *val32 = (uint32_t*)value;
> +
> +	switch (info) {
> +	case amdgpu_sw_info_address32_hi:
> +		*val32 = dev->address32_hi;
> +		return 0;
> +	}
> +	return -EINVAL;
> +}
> diff --git a/amdgpu/amdgpu_internal.h b/amdgpu/amdgpu_internal.h
> index 3e044f1..802b162 100644
> --- a/amdgpu/amdgpu_internal.h
> +++ b/amdgpu/amdgpu_internal.h
> @@ -68,20 +68,21 @@ struct amdgpu_va {
>   	enum amdgpu_gpu_va_range range;
>   	struct amdgpu_bo_va_mgr *vamgr;
>   };
>   
>   struct amdgpu_device {
>   	atomic_t refcount;
>   	int fd;
>   	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. */
>   	struct util_hash_table *bo_handles;
>   	/** List of buffer GEM flink names. Protected by bo_table_mutex. */
>   	struct util_hash_table *bo_flink_names;
>   	/** This protects all hash tables. */
>   	pthread_mutex_t bo_table_mutex;
>   	struct drm_amdgpu_info_device dev_info;
>   	struct amdgpu_gpu_info info;
Just a typo in commit log:
admgpu -> amdgpu

Jerry

On 02/03/2018 01:34 AM, Marek Olšák wrote:
> From: Marek Olšák <marek.olsak@amd.com>
>
> ---
>   amdgpu/amdgpu.h          | 21 +++++++++++++++++++++
>   amdgpu/amdgpu_device.c   | 14 ++++++++++++++
>   amdgpu/amdgpu_internal.h |  1 +
>   3 files changed, 36 insertions(+)
>
> diff --git a/amdgpu/amdgpu.h b/amdgpu/amdgpu.h
> index 2eb03bf..928b2a6 100644
> --- a/amdgpu/amdgpu.h
> +++ b/amdgpu/amdgpu.h
> @@ -87,20 +87,24 @@ enum amdgpu_bo_handle_type {
>   	amdgpu_bo_handle_type_dma_buf_fd = 2
>   };
>
>   /** Define known types of GPU VM VA ranges */
>   enum amdgpu_gpu_va_range
>   {
>   	/** Allocate from "normal"/general range */
>   	amdgpu_gpu_va_range_general = 0
>   };
>
> +enum amdgpu_sw_info {
> +	amdgpu_sw_info_address32_hi = 0,
> +};
> +
>   /*--------------------------------------------------------------------------*/
>   /* -------------------------- Datatypes ----------------------------------- */
>   /*--------------------------------------------------------------------------*/
>
>   /**
>    * Define opaque pointer to context associated with fd.
>    * This context will be returned as the result of
>    * "initialize" function and should be pass as the first
>    * parameter to any API call
>    */
> @@ -1079,20 +1083,37 @@ int amdgpu_query_gpu_info(amdgpu_device_handle dev,
>    * \param   value   - \c [out] Pointer to the return value.
>    *
>    * \return   0 on success\n
>    *          <0 - Negative POSIX error code
>    *
>   */
>   int amdgpu_query_info(amdgpu_device_handle dev, unsigned info_id,
>   		      unsigned size, void *value);
>
>   /**
> + * Query hardware or driver information.
> + *
> + * The return size is query-specific and depends on the "info_id" parameter.
> + * No more than "size" bytes is returned.
> + *
> + * \param   dev     - \c [in] Device handle. See #amdgpu_device_initialize()
> + * \param   info    - \c [in] amdgpu_sw_info_*
> + * \param   value   - \c [out] Pointer to the return value.
> + *
> + * \return   0 on success\n
> + *          <0 - Negative POSIX error code
> + *
> +*/
> +int amdgpu_query_sw_info(amdgpu_device_handle dev, enum amdgpu_sw_info info,
> +			 void *value);
> +
> +/**
>    * Query information about GDS
>    *
>    * \param   dev	     - \c [in] Device handle. See #amdgpu_device_initialize()
>    * \param   gds_info - \c [out] Pointer to structure to get GDS information
>    *
>    * \return   0 on success\n
>    *          <0 - Negative POSIX Error code
>    *
>   */
>   int amdgpu_query_gds_info(amdgpu_device_handle dev,
> diff --git a/amdgpu/amdgpu_device.c b/amdgpu/amdgpu_device.c
> index f34e27a..6ee25a9 100644
> --- a/amdgpu/amdgpu_device.c
> +++ b/amdgpu/amdgpu_device.c
> @@ -268,20 +268,21 @@ int amdgpu_device_initialize(int fd,
>   		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);
>   	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;
>   	amdgpu_vamgr_init(&dev->vamgr, start, max,
>   			  dev->dev_info.virtual_address_alignment);
>
>   	amdgpu_parse_asic_ids(dev);
> @@ -305,10 +306,23 @@ cleanup:
>   int amdgpu_device_deinitialize(amdgpu_device_handle dev)
>   {
>   	amdgpu_device_reference(&dev, NULL);
>   	return 0;
>   }
>
>   const char *amdgpu_get_marketing_name(amdgpu_device_handle dev)
>   {
>   	return dev->marketing_name;
>   }
> +
> +int amdgpu_query_sw_info(amdgpu_device_handle dev, enum amdgpu_sw_info info,
> +			 void *value)
> +{
> +	uint32_t *val32 = (uint32_t*)value;
> +
> +	switch (info) {
> +	case amdgpu_sw_info_address32_hi:
> +		*val32 = dev->address32_hi;
> +		return 0;
> +	}
> +	return -EINVAL;
> +}
> diff --git a/amdgpu/amdgpu_internal.h b/amdgpu/amdgpu_internal.h
> index 3e044f1..802b162 100644
> --- a/amdgpu/amdgpu_internal.h
> +++ b/amdgpu/amdgpu_internal.h
> @@ -68,20 +68,21 @@ struct amdgpu_va {
>   	enum amdgpu_gpu_va_range range;
>   	struct amdgpu_bo_va_mgr *vamgr;
>   };
>
>   struct amdgpu_device {
>   	atomic_t refcount;
>   	int fd;
>   	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. */
>   	struct util_hash_table *bo_handles;
>   	/** List of buffer GEM flink names. Protected by bo_table_mutex. */
>   	struct util_hash_table *bo_flink_names;
>   	/** This protects all hash tables. */
>   	pthread_mutex_t bo_table_mutex;
>   	struct drm_amdgpu_info_device dev_info;
>   	struct amdgpu_gpu_info info;
>