This source file includes following definitions.
- amdgpu_vf_error_put
- amdgpu_vf_error_trans_all
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 #include "amdgpu.h"
25 #include "amdgpu_vf_error.h"
26 #include "mxgpu_ai.h"
27
28 void amdgpu_vf_error_put(struct amdgpu_device *adev,
29 uint16_t sub_error_code,
30 uint16_t error_flags,
31 uint64_t error_data)
32 {
33 int index;
34 uint16_t error_code;
35
36 if (!amdgpu_sriov_vf(adev))
37 return;
38
39 error_code = AMDGIM_ERROR_CODE(AMDGIM_ERROR_CATEGORY_VF, sub_error_code);
40
41 mutex_lock(&adev->virt.vf_errors.lock);
42 index = adev->virt.vf_errors.write_count % AMDGPU_VF_ERROR_ENTRY_SIZE;
43 adev->virt.vf_errors.code [index] = error_code;
44 adev->virt.vf_errors.flags [index] = error_flags;
45 adev->virt.vf_errors.data [index] = error_data;
46 adev->virt.vf_errors.write_count ++;
47 mutex_unlock(&adev->virt.vf_errors.lock);
48 }
49
50
51 void amdgpu_vf_error_trans_all(struct amdgpu_device *adev)
52 {
53
54 u32 data1, data2, data3;
55 int index;
56
57 if ((NULL == adev) || (!amdgpu_sriov_vf(adev)) ||
58 (!adev->virt.ops) || (!adev->virt.ops->trans_msg)) {
59 return;
60 }
61
62
63
64
65
66
67
68
69 mutex_lock(&adev->virt.vf_errors.lock);
70
71 if (adev->virt.vf_errors.write_count - adev->virt.vf_errors.read_count > AMDGPU_VF_ERROR_ENTRY_SIZE) {
72 adev->virt.vf_errors.read_count = adev->virt.vf_errors.write_count - AMDGPU_VF_ERROR_ENTRY_SIZE;
73 }
74
75 while (adev->virt.vf_errors.read_count < adev->virt.vf_errors.write_count) {
76 index =adev->virt.vf_errors.read_count % AMDGPU_VF_ERROR_ENTRY_SIZE;
77 data1 = AMDGIM_ERROR_CODE_FLAGS_TO_MAILBOX(adev->virt.vf_errors.code[index],
78 adev->virt.vf_errors.flags[index]);
79 data2 = adev->virt.vf_errors.data[index] & 0xFFFFFFFF;
80 data3 = (adev->virt.vf_errors.data[index] >> 32) & 0xFFFFFFFF;
81
82 adev->virt.ops->trans_msg(adev, IDH_LOG_VF_ERROR, data1, data2, data3);
83 adev->virt.vf_errors.read_count ++;
84 }
85 mutex_unlock(&adev->virt.vf_errors.lock);
86 }