0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024 #include "amdgpu.h"
0025 #include "amdgpu_vf_error.h"
0026 #include "mxgpu_ai.h"
0027
0028 void amdgpu_vf_error_put(struct amdgpu_device *adev,
0029 uint16_t sub_error_code,
0030 uint16_t error_flags,
0031 uint64_t error_data)
0032 {
0033 int index;
0034 uint16_t error_code;
0035
0036 if (!amdgpu_sriov_vf(adev))
0037 return;
0038
0039 error_code = AMDGIM_ERROR_CODE(AMDGIM_ERROR_CATEGORY_VF, sub_error_code);
0040
0041 mutex_lock(&adev->virt.vf_errors.lock);
0042 index = adev->virt.vf_errors.write_count % AMDGPU_VF_ERROR_ENTRY_SIZE;
0043 adev->virt.vf_errors.code [index] = error_code;
0044 adev->virt.vf_errors.flags [index] = error_flags;
0045 adev->virt.vf_errors.data [index] = error_data;
0046 adev->virt.vf_errors.write_count ++;
0047 mutex_unlock(&adev->virt.vf_errors.lock);
0048 }
0049
0050
0051 void amdgpu_vf_error_trans_all(struct amdgpu_device *adev)
0052 {
0053
0054 u32 data1, data2, data3;
0055 int index;
0056
0057 if ((NULL == adev) || (!amdgpu_sriov_vf(adev)) ||
0058 (!adev->virt.ops) || (!adev->virt.ops->trans_msg)) {
0059 return;
0060 }
0061
0062
0063
0064
0065
0066
0067
0068
0069 mutex_lock(&adev->virt.vf_errors.lock);
0070
0071 if (adev->virt.vf_errors.write_count - adev->virt.vf_errors.read_count > AMDGPU_VF_ERROR_ENTRY_SIZE) {
0072 adev->virt.vf_errors.read_count = adev->virt.vf_errors.write_count - AMDGPU_VF_ERROR_ENTRY_SIZE;
0073 }
0074
0075 while (adev->virt.vf_errors.read_count < adev->virt.vf_errors.write_count) {
0076 index =adev->virt.vf_errors.read_count % AMDGPU_VF_ERROR_ENTRY_SIZE;
0077 data1 = AMDGIM_ERROR_CODE_FLAGS_TO_MAILBOX(adev->virt.vf_errors.code[index],
0078 adev->virt.vf_errors.flags[index]);
0079 data2 = adev->virt.vf_errors.data[index] & 0xFFFFFFFF;
0080 data3 = (adev->virt.vf_errors.data[index] >> 32) & 0xFFFFFFFF;
0081
0082 adev->virt.ops->trans_msg(adev, IDH_LOG_VF_ERROR, data1, data2, data3);
0083 adev->virt.vf_errors.read_count ++;
0084 }
0085 mutex_unlock(&adev->virt.vf_errors.lock);
0086 }