0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023 #include "amdgpu.h"
0024 #include "gfxhub_v1_1.h"
0025
0026 #include "gc/gc_9_2_1_offset.h"
0027 #include "gc/gc_9_2_1_sh_mask.h"
0028
0029 #include "soc15_common.h"
0030
0031 #define mmMC_VM_XGMI_LFB_CNTL_ALDE 0x0978
0032 #define mmMC_VM_XGMI_LFB_CNTL_ALDE_BASE_IDX 0
0033 #define mmMC_VM_XGMI_LFB_SIZE_ALDE 0x0979
0034 #define mmMC_VM_XGMI_LFB_SIZE_ALDE_BASE_IDX 0
0035
0036 #define MC_VM_XGMI_LFB_CNTL_ALDE__PF_LFB_REGION__SHIFT 0x0
0037 #define MC_VM_XGMI_LFB_CNTL_ALDE__PF_MAX_REGION__SHIFT 0x4
0038 #define MC_VM_XGMI_LFB_CNTL_ALDE__PF_LFB_REGION_MASK 0x0000000FL
0039 #define MC_VM_XGMI_LFB_CNTL_ALDE__PF_MAX_REGION_MASK 0x000000F0L
0040
0041 #define MC_VM_XGMI_LFB_SIZE_ALDE__PF_LFB_SIZE__SHIFT 0x0
0042 #define MC_VM_XGMI_LFB_SIZE_ALDE__PF_LFB_SIZE_MASK 0x0001FFFFL
0043
0044 int gfxhub_v1_1_get_xgmi_info(struct amdgpu_device *adev)
0045 {
0046 u32 max_num_physical_nodes;
0047 u32 max_physical_node_id;
0048 u32 xgmi_lfb_cntl;
0049 u32 max_region;
0050 u64 seg_size;
0051
0052 if (adev->asic_type == CHIP_ALDEBARAN) {
0053 xgmi_lfb_cntl = RREG32_SOC15(GC, 0, mmMC_VM_XGMI_LFB_CNTL_ALDE);
0054 seg_size = REG_GET_FIELD(
0055 RREG32_SOC15(GC, 0, mmMC_VM_XGMI_LFB_SIZE_ALDE),
0056 MC_VM_XGMI_LFB_SIZE, PF_LFB_SIZE) << 24;
0057 max_region =
0058 REG_GET_FIELD(xgmi_lfb_cntl, MC_VM_XGMI_LFB_CNTL_ALDE, PF_MAX_REGION);
0059 } else {
0060 xgmi_lfb_cntl = RREG32_SOC15(GC, 0, mmMC_VM_XGMI_LFB_CNTL);
0061 seg_size = REG_GET_FIELD(
0062 RREG32_SOC15(GC, 0, mmMC_VM_XGMI_LFB_SIZE),
0063 MC_VM_XGMI_LFB_SIZE, PF_LFB_SIZE) << 24;
0064 max_region =
0065 REG_GET_FIELD(xgmi_lfb_cntl, MC_VM_XGMI_LFB_CNTL, PF_MAX_REGION);
0066 }
0067
0068
0069
0070 switch (adev->asic_type) {
0071 case CHIP_VEGA20:
0072 max_num_physical_nodes = 4;
0073 max_physical_node_id = 3;
0074 break;
0075 case CHIP_ARCTURUS:
0076 max_num_physical_nodes = 8;
0077 max_physical_node_id = 7;
0078 break;
0079 case CHIP_ALDEBARAN:
0080 max_num_physical_nodes = 16;
0081 max_physical_node_id = 15;
0082 break;
0083 default:
0084 return -EINVAL;
0085 }
0086
0087
0088 if (max_region || adev->gmc.xgmi.connected_to_cpu) {
0089 adev->gmc.xgmi.num_physical_nodes = max_region + 1;
0090
0091 if (adev->gmc.xgmi.num_physical_nodes > max_num_physical_nodes)
0092 return -EINVAL;
0093
0094 if (adev->asic_type == CHIP_ALDEBARAN) {
0095 adev->gmc.xgmi.physical_node_id =
0096 REG_GET_FIELD(xgmi_lfb_cntl, MC_VM_XGMI_LFB_CNTL_ALDE,
0097 PF_LFB_REGION);
0098 } else {
0099 adev->gmc.xgmi.physical_node_id =
0100 REG_GET_FIELD(xgmi_lfb_cntl, MC_VM_XGMI_LFB_CNTL,
0101 PF_LFB_REGION);
0102 }
0103
0104 if (adev->gmc.xgmi.physical_node_id > max_physical_node_id)
0105 return -EINVAL;
0106
0107 adev->gmc.xgmi.node_segment_size = seg_size;
0108 }
0109
0110 return 0;
0111 }