aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd
diff options
context:
space:
mode:
authorMonk Liu <Monk.Liu@amd.com>2016-04-19 08:11:32 -0400
committerAlex Deucher <alexander.deucher@amd.com>2016-05-11 12:31:16 -0400
commitc5637837ba5d5b5e962e73f5a1a7c5456fa85a68 (patch)
tree50b66ff9a4d96cf46ee1e6503468cf2f4c009b33 /drivers/gpu/drm/amd
parent1f207f81e371bed8aa4c898de091d5cfbf68f59e (diff)
drm/amdgpu: keep vm in job instead of ib (v2)
ib.vm is a legacy way to get vm, after scheduler implemented vm should be get from job, and all ibs from one job share the same vm, no need to keep ib.vm just move vm field to job. this patch as well add job as paramter to ib_schedule so it can get vm from job->vm. v2: agd: sqaush in: drm/amdgpu: check if ring emit_vm_flush exists in vm flush No vm flush on engines that don't support VM. bug: https://bugs.freedesktop.org/show_bug.cgi?id=95195 Signed-off-by: Monk Liu <Monk.Liu@amd.com> Reviewed-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu.h6
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c3
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c16
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_job.c9
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c4
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c3
-rw-r--r--drivers/gpu/drm/amd/amdgpu/cik_sdma.c2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c4
-rw-r--r--drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c2
12 files changed, 25 insertions, 30 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
index e72cf4518c30..959008ad65a8 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
@@ -740,7 +740,6 @@ struct amdgpu_ib {
740 uint64_t gpu_addr; 740 uint64_t gpu_addr;
741 uint32_t *ptr; 741 uint32_t *ptr;
742 struct amdgpu_user_fence *user; 742 struct amdgpu_user_fence *user;
743 struct amdgpu_vm *vm;
744 unsigned vm_id; 743 unsigned vm_id;
745 uint64_t vm_pd_addr; 744 uint64_t vm_pd_addr;
746 struct amdgpu_ctx *ctx; 745 struct amdgpu_ctx *ctx;
@@ -763,7 +762,7 @@ enum amdgpu_ring_type {
763extern const struct amd_sched_backend_ops amdgpu_sched_ops; 762extern const struct amd_sched_backend_ops amdgpu_sched_ops;
764 763
765int amdgpu_job_alloc(struct amdgpu_device *adev, unsigned num_ibs, 764int amdgpu_job_alloc(struct amdgpu_device *adev, unsigned num_ibs,
766 struct amdgpu_job **job); 765 struct amdgpu_job **job, struct amdgpu_vm *vm);
767int amdgpu_job_alloc_with_ib(struct amdgpu_device *adev, unsigned size, 766int amdgpu_job_alloc_with_ib(struct amdgpu_device *adev, unsigned size,
768 struct amdgpu_job **job); 767 struct amdgpu_job **job);
769 768
@@ -1191,7 +1190,7 @@ int amdgpu_ib_get(struct amdgpu_device *adev, struct amdgpu_vm *vm,
1191void amdgpu_ib_free(struct amdgpu_device *adev, struct amdgpu_ib *ib, struct fence *f); 1190void amdgpu_ib_free(struct amdgpu_device *adev, struct amdgpu_ib *ib, struct fence *f);
1192int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned num_ibs, 1191int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned num_ibs,
1193 struct amdgpu_ib *ib, struct fence *last_vm_update, 1192 struct amdgpu_ib *ib, struct fence *last_vm_update,
1194 struct fence **f); 1193 struct amdgpu_job *job, struct fence **f);
1195int amdgpu_ib_pool_init(struct amdgpu_device *adev); 1194int amdgpu_ib_pool_init(struct amdgpu_device *adev);
1196void amdgpu_ib_pool_fini(struct amdgpu_device *adev); 1195void amdgpu_ib_pool_fini(struct amdgpu_device *adev);
1197int amdgpu_ib_ring_tests(struct amdgpu_device *adev); 1196int amdgpu_ib_ring_tests(struct amdgpu_device *adev);
@@ -1247,6 +1246,7 @@ struct amdgpu_cs_parser {
1247struct amdgpu_job { 1246struct amdgpu_job {
1248 struct amd_sched_job base; 1247 struct amd_sched_job base;
1249 struct amdgpu_device *adev; 1248 struct amdgpu_device *adev;
1249 struct amdgpu_vm *vm;
1250 struct amdgpu_ring *ring; 1250 struct amdgpu_ring *ring;
1251 struct amdgpu_sync sync; 1251 struct amdgpu_sync sync;
1252 struct amdgpu_ib *ibs; 1252 struct amdgpu_ib *ibs;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
index 2ebba295d0e4..1a065961981a 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
@@ -120,6 +120,7 @@ static int amdgpu_cs_user_fence_chunk(struct amdgpu_cs_parser *p,
120int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, void *data) 120int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, void *data)
121{ 121{
122 struct amdgpu_fpriv *fpriv = p->filp->driver_priv; 122 struct amdgpu_fpriv *fpriv = p->filp->driver_priv;
123 struct amdgpu_vm *vm = &fpriv->vm;
123 union drm_amdgpu_cs *cs = data; 124 union drm_amdgpu_cs *cs = data;
124 uint64_t *chunk_array_user; 125 uint64_t *chunk_array_user;
125 uint64_t *chunk_array; 126 uint64_t *chunk_array;
@@ -214,7 +215,7 @@ int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, void *data)
214 } 215 }
215 } 216 }
216 217
217 ret = amdgpu_job_alloc(p->adev, num_ibs, &p->job); 218 ret = amdgpu_job_alloc(p->adev, num_ibs, &p->job, vm);
218 if (ret) 219 if (ret)
219 goto free_all_kdata; 220 goto free_all_kdata;
220 221
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c
index 0129617a7962..0ed643036361 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c
@@ -74,7 +74,6 @@ int amdgpu_ib_get(struct amdgpu_device *adev, struct amdgpu_vm *vm,
74 ib->gpu_addr = amdgpu_sa_bo_gpu_addr(ib->sa_bo); 74 ib->gpu_addr = amdgpu_sa_bo_gpu_addr(ib->sa_bo);
75 } 75 }
76 76
77 ib->vm = vm;
78 ib->vm_id = 0; 77 ib->vm_id = 0;
79 78
80 return 0; 79 return 0;
@@ -117,13 +116,13 @@ void amdgpu_ib_free(struct amdgpu_device *adev, struct amdgpu_ib *ib, struct fen
117 */ 116 */
118int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned num_ibs, 117int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned num_ibs,
119 struct amdgpu_ib *ibs, struct fence *last_vm_update, 118 struct amdgpu_ib *ibs, struct fence *last_vm_update,
120 struct fence **f) 119 struct amdgpu_job *job, struct fence **f)
121{ 120{
122 struct amdgpu_device *adev = ring->adev; 121 struct amdgpu_device *adev = ring->adev;
123 struct amdgpu_ib *ib = &ibs[0]; 122 struct amdgpu_ib *ib = &ibs[0];
124 struct amdgpu_ctx *ctx, *old_ctx; 123 struct amdgpu_ctx *ctx, *old_ctx;
125 struct amdgpu_vm *vm;
126 struct fence *hwf; 124 struct fence *hwf;
125 struct amdgpu_vm *vm = NULL;
127 unsigned i, patch_offset = ~0; 126 unsigned i, patch_offset = ~0;
128 127
129 int r = 0; 128 int r = 0;
@@ -132,7 +131,8 @@ int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned num_ibs,
132 return -EINVAL; 131 return -EINVAL;
133 132
134 ctx = ibs->ctx; 133 ctx = ibs->ctx;
135 vm = ibs->vm; 134 if (job) /* for domain0 job like ring test, ibs->job is not assigned */
135 vm = job->vm;
136 136
137 if (!ring->ready) { 137 if (!ring->ready) {
138 dev_err(adev->dev, "couldn't schedule ib\n"); 138 dev_err(adev->dev, "couldn't schedule ib\n");
@@ -174,14 +174,6 @@ int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned num_ibs,
174 old_ctx = ring->current_ctx; 174 old_ctx = ring->current_ctx;
175 for (i = 0; i < num_ibs; ++i) { 175 for (i = 0; i < num_ibs; ++i) {
176 ib = &ibs[i]; 176 ib = &ibs[i];
177
178 if (ib->ctx != ctx || ib->vm != vm) {
179 ring->current_ctx = old_ctx;
180 if (ib->vm_id)
181 amdgpu_vm_reset_id(adev, ib->vm_id);
182 amdgpu_ring_undo(ring);
183 return -EINVAL;
184 }
185 amdgpu_ring_emit_ib(ring, ib); 177 amdgpu_ring_emit_ib(ring, ib);
186 ring->current_ctx = ctx; 178 ring->current_ctx = ctx;
187 } 179 }
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
index 4eea2a18d8bb..917c6f3bfa09 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
@@ -46,7 +46,7 @@ void amdgpu_job_timeout_func(struct work_struct *work)
46} 46}
47 47
48int amdgpu_job_alloc(struct amdgpu_device *adev, unsigned num_ibs, 48int amdgpu_job_alloc(struct amdgpu_device *adev, unsigned num_ibs,
49 struct amdgpu_job **job) 49 struct amdgpu_job **job, struct amdgpu_vm *vm)
50{ 50{
51 size_t size = sizeof(struct amdgpu_job); 51 size_t size = sizeof(struct amdgpu_job);
52 52
@@ -60,6 +60,7 @@ int amdgpu_job_alloc(struct amdgpu_device *adev, unsigned num_ibs,
60 return -ENOMEM; 60 return -ENOMEM;
61 61
62 (*job)->adev = adev; 62 (*job)->adev = adev;
63 (*job)->vm = vm;
63 (*job)->ibs = (void *)&(*job)[1]; 64 (*job)->ibs = (void *)&(*job)[1];
64 (*job)->num_ibs = num_ibs; 65 (*job)->num_ibs = num_ibs;
65 INIT_WORK(&(*job)->base.work_free_job, amdgpu_job_free_handler); 66 INIT_WORK(&(*job)->base.work_free_job, amdgpu_job_free_handler);
@@ -74,7 +75,7 @@ int amdgpu_job_alloc_with_ib(struct amdgpu_device *adev, unsigned size,
74{ 75{
75 int r; 76 int r;
76 77
77 r = amdgpu_job_alloc(adev, 1, job); 78 r = amdgpu_job_alloc(adev, 1, job, NULL);
78 if (r) 79 if (r)
79 return r; 80 return r;
80 81
@@ -138,7 +139,7 @@ int amdgpu_job_submit(struct amdgpu_job *job, struct amdgpu_ring *ring,
138static struct fence *amdgpu_job_dependency(struct amd_sched_job *sched_job) 139static struct fence *amdgpu_job_dependency(struct amd_sched_job *sched_job)
139{ 140{
140 struct amdgpu_job *job = to_amdgpu_job(sched_job); 141 struct amdgpu_job *job = to_amdgpu_job(sched_job);
141 struct amdgpu_vm *vm = job->ibs->vm; 142 struct amdgpu_vm *vm = job->vm;
142 143
143 struct fence *fence = amdgpu_sync_get_fence(&job->sync); 144 struct fence *fence = amdgpu_sync_get_fence(&job->sync);
144 145
@@ -186,7 +187,7 @@ static struct fence *amdgpu_job_run(struct amd_sched_job *sched_job)
186 187
187 trace_amdgpu_sched_run_job(job); 188 trace_amdgpu_sched_run_job(job);
188 r = amdgpu_ib_schedule(job->ring, job->num_ibs, job->ibs, 189 r = amdgpu_ib_schedule(job->ring, job->num_ibs, job->ibs,
189 job->sync.last_vm_update, &fence); 190 job->sync.last_vm_update, job, &fence);
190 if (r) { 191 if (r) {
191 DRM_ERROR("Error scheduling IBs (%d)\n", r); 192 DRM_ERROR("Error scheduling IBs (%d)\n", r);
192 goto err; 193 goto err;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
index abda242980ba..3f953759002f 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
@@ -910,7 +910,7 @@ static int amdgpu_uvd_send_msg(struct amdgpu_ring *ring, struct amdgpu_bo *bo,
910 ib->length_dw = 16; 910 ib->length_dw = 16;
911 911
912 if (direct) { 912 if (direct) {
913 r = amdgpu_ib_schedule(ring, 1, ib, NULL, &f); 913 r = amdgpu_ib_schedule(ring, 1, ib, NULL, NULL, &f);
914 job->fence = f; 914 job->fence = f;
915 if (r) 915 if (r)
916 goto err_free; 916 goto err_free;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
index 22a4d96fedb7..79ba2aae0d7a 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
@@ -436,7 +436,7 @@ int amdgpu_vce_get_create_msg(struct amdgpu_ring *ring, uint32_t handle,
436 for (i = ib->length_dw; i < ib_size_dw; ++i) 436 for (i = ib->length_dw; i < ib_size_dw; ++i)
437 ib->ptr[i] = 0x0; 437 ib->ptr[i] = 0x0;
438 438
439 r = amdgpu_ib_schedule(ring, 1, ib, NULL, &f); 439 r = amdgpu_ib_schedule(ring, 1, ib, NULL, NULL, &f);
440 job->fence = f; 440 job->fence = f;
441 if (r) 441 if (r)
442 goto err; 442 goto err;
@@ -498,7 +498,7 @@ int amdgpu_vce_get_destroy_msg(struct amdgpu_ring *ring, uint32_t handle,
498 ib->ptr[i] = 0x0; 498 ib->ptr[i] = 0x0;
499 499
500 if (direct) { 500 if (direct) {
501 r = amdgpu_ib_schedule(ring, 1, ib, NULL, &f); 501 r = amdgpu_ib_schedule(ring, 1, ib, NULL, NULL, &f);
502 job->fence = f; 502 job->fence = f;
503 if (r) 503 if (r)
504 goto err; 504 goto err;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
index 2c3d9557e1a2..692d0d02b644 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
@@ -303,7 +303,8 @@ int amdgpu_vm_flush(struct amdgpu_ring *ring,
303 pd_addr != AMDGPU_VM_NO_FLUSH || gds_switch_needed)) 303 pd_addr != AMDGPU_VM_NO_FLUSH || gds_switch_needed))
304 amdgpu_ring_emit_pipeline_sync(ring); 304 amdgpu_ring_emit_pipeline_sync(ring);
305 305
306 if (pd_addr != AMDGPU_VM_NO_FLUSH) { 306 if (ring->funcs->emit_vm_flush &&
307 pd_addr != AMDGPU_VM_NO_FLUSH) {
307 struct fence *fence; 308 struct fence *fence;
308 309
309 trace_amdgpu_vm_flush(pd_addr, ring->idx, vm_id); 310 trace_amdgpu_vm_flush(pd_addr, ring->idx, vm_id);
diff --git a/drivers/gpu/drm/amd/amdgpu/cik_sdma.c b/drivers/gpu/drm/amd/amdgpu/cik_sdma.c
index b7ed9d376001..8d69c6555e02 100644
--- a/drivers/gpu/drm/amd/amdgpu/cik_sdma.c
+++ b/drivers/gpu/drm/amd/amdgpu/cik_sdma.c
@@ -643,7 +643,7 @@ static int cik_sdma_ring_test_ib(struct amdgpu_ring *ring)
643 ib.ptr[3] = 1; 643 ib.ptr[3] = 1;
644 ib.ptr[4] = 0xDEADBEEF; 644 ib.ptr[4] = 0xDEADBEEF;
645 ib.length_dw = 5; 645 ib.length_dw = 5;
646 r = amdgpu_ib_schedule(ring, 1, &ib, NULL, &f); 646 r = amdgpu_ib_schedule(ring, 1, &ib, NULL, NULL, &f);
647 if (r) 647 if (r)
648 goto err1; 648 goto err1;
649 649
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
index 6686c9c3005d..03108909a275 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
@@ -2136,7 +2136,7 @@ static int gfx_v7_0_ring_test_ib(struct amdgpu_ring *ring)
2136 ib.ptr[2] = 0xDEADBEEF; 2136 ib.ptr[2] = 0xDEADBEEF;
2137 ib.length_dw = 3; 2137 ib.length_dw = 3;
2138 2138
2139 r = amdgpu_ib_schedule(ring, 1, &ib, NULL, &f); 2139 r = amdgpu_ib_schedule(ring, 1, &ib, NULL, NULL, &f);
2140 if (r) 2140 if (r)
2141 goto err2; 2141 goto err2;
2142 2142
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
index 021c17e50d51..a82945f3a5d2 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
@@ -800,7 +800,7 @@ static int gfx_v8_0_ring_test_ib(struct amdgpu_ring *ring)
800 ib.ptr[2] = 0xDEADBEEF; 800 ib.ptr[2] = 0xDEADBEEF;
801 ib.length_dw = 3; 801 ib.length_dw = 3;
802 802
803 r = amdgpu_ib_schedule(ring, 1, &ib, NULL, &f); 803 r = amdgpu_ib_schedule(ring, 1, &ib, NULL, NULL, &f);
804 if (r) 804 if (r)
805 goto err2; 805 goto err2;
806 806
@@ -1551,7 +1551,7 @@ static int gfx_v8_0_do_edc_gpr_workarounds(struct amdgpu_device *adev)
1551 ib.ptr[ib.length_dw++] = EVENT_TYPE(7) | EVENT_INDEX(4); 1551 ib.ptr[ib.length_dw++] = EVENT_TYPE(7) | EVENT_INDEX(4);
1552 1552
1553 /* shedule the ib on the ring */ 1553 /* shedule the ib on the ring */
1554 r = amdgpu_ib_schedule(ring, 1, &ib, NULL, &f); 1554 r = amdgpu_ib_schedule(ring, 1, &ib, NULL, NULL, &f);
1555 if (r) { 1555 if (r) {
1556 DRM_ERROR("amdgpu: ib submit failed (%d).\n", r); 1556 DRM_ERROR("amdgpu: ib submit failed (%d).\n", r);
1557 goto fail; 1557 goto fail;
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c b/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
index e6d3544fda06..27ca46d16bc4 100644
--- a/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
+++ b/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
@@ -701,7 +701,7 @@ static int sdma_v2_4_ring_test_ib(struct amdgpu_ring *ring)
701 ib.ptr[7] = SDMA_PKT_HEADER_OP(SDMA_OP_NOP); 701 ib.ptr[7] = SDMA_PKT_HEADER_OP(SDMA_OP_NOP);
702 ib.length_dw = 8; 702 ib.length_dw = 8;
703 703
704 r = amdgpu_ib_schedule(ring, 1, &ib, NULL, &f); 704 r = amdgpu_ib_schedule(ring, 1, &ib, NULL, NULL, &f);
705 if (r) 705 if (r)
706 goto err1; 706 goto err1;
707 707
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
index 00b43700c956..278b1fe35385 100644
--- a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
@@ -925,7 +925,7 @@ static int sdma_v3_0_ring_test_ib(struct amdgpu_ring *ring)
925 ib.ptr[7] = SDMA_PKT_NOP_HEADER_OP(SDMA_OP_NOP); 925 ib.ptr[7] = SDMA_PKT_NOP_HEADER_OP(SDMA_OP_NOP);
926 ib.length_dw = 8; 926 ib.length_dw = 8;
927 927
928 r = amdgpu_ib_schedule(ring, 1, &ib, NULL, &f); 928 r = amdgpu_ib_schedule(ring, 1, &ib, NULL, NULL, &f);
929 if (r) 929 if (r)
930 goto err1; 930 goto err1;
931 931