drm/amd/amdgpu: export vbios information (v2)
authorEvan Quan <evan.quan@amd.com>
Wed, 7 Dec 2016 02:05:09 +0000 (10:05 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 8 Dec 2016 19:12:09 +0000 (14:12 -0500)
Allows userspace components to fetch information
from the vbios image.

v2: agd: fix warning

Reviewed-by: Edward O'Callaghan <funfunctor@folklore1984.net>
Signed-off-by: Evan Quan <evan.quan@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Reviewed-by: Christian Koenig <christian.koenig@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
include/uapi/drm/amdgpu_drm.h

index d1cf9ac..9af87ea 100644 (file)
@@ -544,6 +544,32 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file
                return copy_to_user(out, &vce_clk_table,
                                    min((size_t)size, sizeof(vce_clk_table))) ? -EFAULT : 0;
        }
+       case AMDGPU_INFO_VBIOS: {
+               uint32_t bios_size = adev->bios_size;
+
+               switch (info->vbios_info.type) {
+               case AMDGPU_INFO_VBIOS_SIZE:
+                       return copy_to_user(out, &bios_size,
+                                       min((size_t)size, sizeof(bios_size)))
+                                       ? -EFAULT : 0;
+               case AMDGPU_INFO_VBIOS_IMAGE: {
+                       uint8_t *bios;
+                       uint32_t bios_offset = info->vbios_info.offset;
+
+                       if (bios_offset >= bios_size)
+                               return -EINVAL;
+
+                       bios = adev->bios + bios_offset;
+                       return copy_to_user(out, bios,
+                                           min((size_t)size, (size_t)(bios_size - bios_offset)))
+                                       ? -EFAULT : 0;
+               }
+               default:
+                       DRM_DEBUG_KMS("Invalid request %d\n",
+                                       info->vbios_info.type);
+                       return -EINVAL;
+               }
+       }
        default:
                DRM_DEBUG_KMS("Invalid request %d\n", info->query);
                return -EINVAL;
index 2191a9e..3961836 100644 (file)
@@ -522,6 +522,12 @@ struct drm_amdgpu_cs_chunk_data {
 #define AMDGPU_INFO_MEMORY                     0x19
 /* Query vce clock table */
 #define AMDGPU_INFO_VCE_CLOCK_TABLE            0x1A
+/* Query vbios related information */
+#define AMDGPU_INFO_VBIOS                      0x1B
+       /* Subquery id: Query vbios size */
+       #define AMDGPU_INFO_VBIOS_SIZE          0x1
+       /* Subquery id: Query vbios image */
+       #define AMDGPU_INFO_VBIOS_IMAGE         0x2
 
 #define AMDGPU_INFO_MMR_SE_INDEX_SHIFT 0
 #define AMDGPU_INFO_MMR_SE_INDEX_MASK  0xff
@@ -580,6 +586,11 @@ struct drm_amdgpu_info {
                } read_mmr_reg;
 
                struct drm_amdgpu_query_fw query_fw;
+
+               struct {
+                       __u32 type;
+                       __u32 offset;
+               } vbios_info;
        };
 };