drm/amdgpu: implement cgs interface to query system info
authorRex Zhu <Rex.Zhu@amd.com>
Wed, 23 Sep 2015 12:11:54 +0000 (20:11 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Mon, 21 Dec 2015 21:42:06 +0000 (16:42 -0500)
Add a query to get the bus number and function of the
device.

Signed-off-by: Rex Zhu <Rex.Zhu@amd.com>
Reviewed-by: Jammy Zhou <Jammy.Zhou@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c
drivers/gpu/drm/amd/include/cgs_common.h

index f901cdce7c5f425d36be995f5dc493cc2003eab5..19f46d0b6ca7a37bbd20e319bf3a8556a1225894 100644 (file)
@@ -736,6 +736,28 @@ static int amdgpu_cgs_get_firmware_info(void *cgs_device,
        return 0;
 }
 
+static int amdgpu_cgs_query_system_info(void *cgs_device,
+                               struct cgs_system_info *sys_info)
+{
+       CGS_FUNC_ADEV;
+
+       if (NULL == sys_info)
+               return -ENODEV;
+
+       if (sizeof(struct cgs_system_info) != sys_info->size)
+               return -ENODEV;
+
+       switch (sys_info->info_id) {
+       case CGS_SYSTEM_INFO_ADAPTER_BDF_ID:
+               sys_info->value = adev->pdev->devfn | (adev->pdev->bus->number << 8);
+               break;
+       default:
+               return -ENODEV;
+       }
+
+       return 0;
+}
+
 /** \brief evaluate acpi namespace object, handle or pathname must be valid
  *  \param cgs_device
  *  \param info input/output arguments for the control method
@@ -985,6 +1007,7 @@ static const struct cgs_ops amdgpu_cgs_ops = {
        amdgpu_cgs_set_powergating_state,
        amdgpu_cgs_set_clockgating_state,
        amdgpu_cgs_call_acpi_method,
+       amdgpu_cgs_query_system_info,
 };
 
 static const struct cgs_os_ops amdgpu_cgs_os_ops = {
index 8bf6ee5fa00f78505a488ad3d5fef66a9d1c9695..5ea8db0d2a99e199ceefd90edfea9fcdfcbe0403 100644 (file)
@@ -105,6 +105,21 @@ enum cgs_ucode_id {
        CGS_UCODE_ID_MAXIMUM,
 };
 
+enum cgs_system_info_id {
+       CGS_SYSTEM_INFO_ADAPTER_BDF_ID = 1,
+       CGS_SYSTEM_INFO_ID_MAXIMUM,
+};
+
+struct cgs_system_info {
+       uint64_t       size;
+       uint64_t       info_id;
+       union {
+               void           *ptr;
+               uint64_t        value;
+       };
+       uint64_t               padding[13];
+};
+
 /**
  * struct cgs_clock_limits - Clock limits
  *
@@ -533,6 +548,10 @@ typedef int (*cgs_call_acpi_method)(void *cgs_device,
                                        uint32_t output_count,
                                        uint32_t input_size,
                                        uint32_t output_size);
+
+typedef int (*cgs_query_system_info)(void *cgs_device,
+                               struct cgs_system_info *sys_info);
+
 struct cgs_ops {
        /* memory management calls (similar to KFD interface) */
        cgs_gpu_mem_info_t gpu_mem_info;
@@ -575,6 +594,8 @@ struct cgs_ops {
        cgs_set_clockgating_state set_clockgating_state;
        /* ACPI */
        cgs_call_acpi_method call_acpi_method;
+       /* get system info */
+       cgs_query_system_info query_system_info;
 };
 
 struct cgs_os_ops; /* To be define in OS-specific CGS header */
@@ -663,5 +684,7 @@ struct cgs_device
        CGS_CALL(set_clockgating_state, dev, block_type, state)
 #define cgs_call_acpi_method(dev, acpi_method, acpi_function, pintput, poutput, output_count, input_size, output_size) \
        CGS_CALL(call_acpi_method, dev, acpi_method, acpi_function, pintput, poutput, output_count, input_size, output_size)
+#define cgs_query_system_info(dev, sys_info)   \
+       CGS_CALL(query_system_info, dev, sys_info)
 
 #endif /* _CGS_COMMON_H */