aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4038-drm-amdgpu-Report-vram-vendor-with-sysfs-v3.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4038-drm-amdgpu-Report-vram-vendor-with-sysfs-v3.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4038-drm-amdgpu-Report-vram-vendor-with-sysfs-v3.patch241
1 files changed, 241 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4038-drm-amdgpu-Report-vram-vendor-with-sysfs-v3.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4038-drm-amdgpu-Report-vram-vendor-with-sysfs-v3.patch
new file mode 100644
index 00000000..3e64a1fa
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4038-drm-amdgpu-Report-vram-vendor-with-sysfs-v3.patch
@@ -0,0 +1,241 @@
+From b2b22a3430c16d8d38c4a81776359955a3e1737e Mon Sep 17 00:00:00 2001
+From: Ori Messinger <Ori.Messinger@amd.com>
+Date: Wed, 2 Oct 2019 10:02:07 -0400
+Subject: [PATCH 4038/4256] drm/amdgpu: Report vram vendor with sysfs (v3)
+
+The vram vendor can be found as a separate sysfs file at:
+/sys/class/drm/card[X]/device/mem_info_vram_vendor
+The vram vendor is displayed as a string value.
+
+v2: Use correct bit masking, and cache vram_vendor in gmc
+v3: Drop unused functions for vram width, type, and vendor
+
+Change-Id: Iaa3ccf3f483ee6536281fe777772ba241a6e0d43
+Signed-off-by: Ori Messinger <Ori.Messinger@amd.com>
+Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
+---
+ .../gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c | 14 +++++-
+ .../gpu/drm/amd/amdgpu/amdgpu_atomfirmware.h | 2 +-
+ drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h | 1 +
+ drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c | 43 +++++++++++++++++++
+ drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c | 6 ++-
+ drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c | 6 ++-
+ 6 files changed, 65 insertions(+), 7 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c
+index fbff37bd2b03..a253a554f41f 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c
+@@ -169,8 +169,11 @@ static int convert_atom_mem_type_to_vram_type(struct amdgpu_device *adev,
+ return vram_type;
+ }
+
+-int amdgpu_atomfirmware_get_vram_info(struct amdgpu_device *adev,
+- int *vram_width, int *vram_type)
++
++int
++amdgpu_atomfirmware_get_vram_info(struct amdgpu_device *adev,
++ int *vram_width, int *vram_type,
++ int *vram_vendor)
+ {
+ struct amdgpu_mode_info *mode_info = &adev->mode_info;
+ int index, i = 0;
+@@ -180,6 +183,7 @@ int amdgpu_atomfirmware_get_vram_info(struct amdgpu_device *adev,
+ union vram_module *vram_module;
+ u8 frev, crev;
+ u8 mem_type;
++ u8 mem_vendor;
+ u32 mem_channel_number;
+ u32 mem_channel_width;
+ u32 module_id;
+@@ -231,6 +235,9 @@ int amdgpu_atomfirmware_get_vram_info(struct amdgpu_device *adev,
+ mem_channel_width = vram_module->v9.channel_width;
+ if (vram_width)
+ *vram_width = mem_channel_number * (1 << mem_channel_width);
++ mem_vendor = (vram_module->v9.vender_rev_id) & 0xF;
++ if (vram_vendor)
++ *vram_vendor = mem_vendor;
+ break;
+ case 4:
+ if (module_id > vram_info->v24.vram_module_num)
+@@ -248,6 +255,9 @@ int amdgpu_atomfirmware_get_vram_info(struct amdgpu_device *adev,
+ mem_channel_width = vram_module->v10.channel_width;
+ if (vram_width)
+ *vram_width = mem_channel_number * (1 << mem_channel_width);
++ mem_vendor = (vram_module->v10.vender_rev_id) & 0xF;
++ if (vram_vendor)
++ *vram_vendor = mem_vendor;
+ break;
+ default:
+ return -EINVAL;
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.h
+index 82819f03e444..53449fc7baf4 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.h
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.h
+@@ -30,7 +30,7 @@ bool amdgpu_atomfirmware_gpu_supports_virtualization(struct amdgpu_device *adev)
+ void amdgpu_atomfirmware_scratch_regs_init(struct amdgpu_device *adev);
+ int amdgpu_atomfirmware_allocate_fb_scratch(struct amdgpu_device *adev);
+ int amdgpu_atomfirmware_get_vram_info(struct amdgpu_device *adev,
+- int *vram_width, int *vram_type);
++ int *vram_width, int *vram_type, int *vram_vendor);
+ int amdgpu_atomfirmware_get_clock_info(struct amdgpu_device *adev);
+ int amdgpu_atomfirmware_get_gfx_info(struct amdgpu_device *adev);
+ bool amdgpu_atomfirmware_mem_ecc_supported(struct amdgpu_device *adev);
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h
+index 387cf338c958..f9d62e80a64e 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h
+@@ -157,6 +157,7 @@ struct amdgpu_gmc {
+ uint32_t fw_version;
+ struct amdgpu_irq_src vm_fault;
+ uint32_t vram_type;
++ uint8_t vram_vendor;
+ uint32_t srbm_soft_reset;
+ bool prt_warning;
+ uint64_t stolen_size;
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c
+index 59440f71d304..cd750c3f4c18 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c
+@@ -25,6 +25,8 @@
+ #include <drm/drmP.h>
+ #include "amdgpu.h"
+ #include "amdgpu_vm.h"
++#include "amdgpu_atomfirmware.h"
++#include "atom.h"
+
+ struct amdgpu_vram_mgr {
+ struct drm_mm mm;
+@@ -103,6 +105,39 @@ static ssize_t amdgpu_mem_info_vis_vram_used_show(struct device *dev,
+ amdgpu_vram_mgr_vis_usage(&adev->mman.bdev.man[TTM_PL_VRAM]));
+ }
+
++static ssize_t amdgpu_mem_info_vram_vendor(struct device *dev,
++ struct device_attribute *attr,
++ char *buf)
++{
++ struct drm_device *ddev = dev_get_drvdata(dev);
++ struct amdgpu_device *adev = ddev->dev_private;
++
++ switch (adev->gmc.vram_vendor) {
++ case SAMSUNG:
++ return snprintf(buf, PAGE_SIZE, "samsung\n");
++ case INFINEON:
++ return snprintf(buf, PAGE_SIZE, "infineon\n");
++ case ELPIDA:
++ return snprintf(buf, PAGE_SIZE, "elpida\n");
++ case ETRON:
++ return snprintf(buf, PAGE_SIZE, "etron\n");
++ case NANYA:
++ return snprintf(buf, PAGE_SIZE, "nanya\n");
++ case HYNIX:
++ return snprintf(buf, PAGE_SIZE, "hynix\n");
++ case MOSEL:
++ return snprintf(buf, PAGE_SIZE, "mosel\n");
++ case WINBOND:
++ return snprintf(buf, PAGE_SIZE, "winbond\n");
++ case ESMT:
++ return snprintf(buf, PAGE_SIZE, "esmt\n");
++ case MICRON:
++ return snprintf(buf, PAGE_SIZE, "micron\n");
++ default:
++ return snprintf(buf, PAGE_SIZE, "unknown\n");
++ }
++}
++
+ static DEVICE_ATTR(mem_info_vram_total, S_IRUGO,
+ amdgpu_mem_info_vram_total_show, NULL);
+ static DEVICE_ATTR(mem_info_vis_vram_total, S_IRUGO,
+@@ -111,6 +146,8 @@ static DEVICE_ATTR(mem_info_vram_used, S_IRUGO,
+ amdgpu_mem_info_vram_used_show, NULL);
+ static DEVICE_ATTR(mem_info_vis_vram_used, S_IRUGO,
+ amdgpu_mem_info_vis_vram_used_show, NULL);
++static DEVICE_ATTR(mem_info_vram_vendor, S_IRUGO,
++ amdgpu_mem_info_vram_vendor, NULL);
+
+ /**
+ * amdgpu_vram_mgr_init - init VRAM manager and DRM MM
+@@ -156,6 +193,11 @@ static int amdgpu_vram_mgr_init(struct ttm_mem_type_manager *man,
+ DRM_ERROR("Failed to create device file mem_info_vis_vram_used\n");
+ return ret;
+ }
++ ret = device_create_file(adev->dev, &dev_attr_mem_info_vram_vendor);
++ if (ret) {
++ DRM_ERROR("Failed to create device file mem_info_vram_vendor\n");
++ return ret;
++ }
+
+ return 0;
+ }
+@@ -182,6 +224,7 @@ static int amdgpu_vram_mgr_fini(struct ttm_mem_type_manager *man)
+ device_remove_file(adev->dev, &dev_attr_mem_info_vis_vram_total);
+ device_remove_file(adev->dev, &dev_attr_mem_info_vram_used);
+ device_remove_file(adev->dev, &dev_attr_mem_info_vis_vram_used);
++ device_remove_file(adev->dev, &dev_attr_mem_info_vram_vendor);
+ return 0;
+ }
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c
+index 055a8cbf889b..6a73e8d95f0a 100644
+--- a/drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c
++++ b/drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c
+@@ -625,7 +625,7 @@ static unsigned gmc_v10_0_get_vbios_fb_size(struct amdgpu_device *adev)
+ static int gmc_v10_0_sw_init(void *handle)
+ {
+ int dma_bits;
+- int r, vram_width = 0, vram_type = 0;
++ int r, vram_width = 0, vram_type = 0, vram_vendor = 0;
+ struct amdgpu_device *adev = (struct amdgpu_device *)handle;
+
+ gfxhub_v2_0_init(adev);
+@@ -633,13 +633,15 @@ static int gmc_v10_0_sw_init(void *handle)
+
+ spin_lock_init(&adev->gmc.invalidate_lock);
+
+- r = amdgpu_atomfirmware_get_vram_info(adev, &vram_width, &vram_type);
++ r = amdgpu_atomfirmware_get_vram_info(adev,
++ &vram_width, &vram_type, &vram_vendor);
+ if (!amdgpu_emu_mode)
+ adev->gmc.vram_width = vram_width;
+ else
+ adev->gmc.vram_width = 1 * 128; /* numchan * chansize */
+
+ adev->gmc.vram_type = vram_type;
++ adev->gmc.vram_vendor = vram_vendor;
+ switch (adev->asic_type) {
+ case CHIP_NAVI10:
+ case CHIP_NAVI14:
+diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
+index 2fa441d9c5a0..b5ecc12cfea2 100644
+--- a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
++++ b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
+@@ -927,7 +927,7 @@ static unsigned gmc_v9_0_get_vbios_fb_size(struct amdgpu_device *adev)
+ static int gmc_v9_0_sw_init(void *handle)
+ {
+ int dma_bits;
+- int r, vram_width = 0, vram_type = 0;
++ int r, vram_width = 0, vram_type = 0, vram_vendor = 0;
+ struct amdgpu_device *adev = (struct amdgpu_device *)handle;
+
+ gfxhub_v1_0_init(adev);
+@@ -938,7 +938,8 @@ static int gmc_v9_0_sw_init(void *handle)
+
+ spin_lock_init(&adev->gmc.invalidate_lock);
+
+- r = amdgpu_atomfirmware_get_vram_info(adev, &vram_width, &vram_type);
++ r = amdgpu_atomfirmware_get_vram_info(adev,
++ &vram_width, &vram_type, &vram_vendor);
+ if (amdgpu_sriov_vf(adev))
+ /* For Vega10 SR-IOV, vram_width can't be read from ATOM as RAVEN,
+ * and DF related registers is not readable, seems hardcord is the
+@@ -962,6 +963,7 @@ static int gmc_v9_0_sw_init(void *handle)
+ }
+
+ adev->gmc.vram_type = vram_type;
++ adev->gmc.vram_vendor = vram_vendor;
+ switch (adev->asic_type) {
+ case CHIP_RAVEN:
+ adev->num_vmhubs = 2;
+--
+2.17.1
+