summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gk20a
diff options
context:
space:
mode:
authorTimo Alho <talho@nvidia.com>2018-03-05 02:31:06 -0500
committerTimo Alho <talho@nvidia.com>2018-03-05 11:39:57 -0500
commit848af2ce6de6140323a6ffe3075bf8021e119434 (patch)
treec89f28ac819f637b554f191da2f6a0fd8d75253e /drivers/gpu/nvgpu/gk20a
parent89fbf39a05483917c0a9f3453fd94c724bc37375 (diff)
Revert "Revert "Revert "gpu: nvgpu: Get coherency on gv100 + NVLINK working"""
This reverts commit 89fbf39a05483917c0a9f3453fd94c724bc37375. Bug 2075315 Change-Id: Id34a0376be5160b164931926ec600f77edf69667 Signed-off-by: Timo Alho <talho@nvidia.com> Reviewed-on: https://git-master.nvidia.com/r/1668487 Reviewed-by: svc-mobile-coverity <svc-mobile-coverity@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a')
-rw-r--r--drivers/gpu/nvgpu/gk20a/bus_gk20a.c6
-rw-r--r--drivers/gpu/nvgpu/gk20a/fb_gk20a.c5
-rw-r--r--drivers/gpu/nvgpu/gk20a/fecs_trace_gk20a.c1
-rw-r--r--drivers/gpu/nvgpu/gk20a/fifo_gk20a.c20
-rw-r--r--drivers/gpu/nvgpu/gk20a/gr_gk20a.c33
-rw-r--r--drivers/gpu/nvgpu/gk20a/mm_gk20a.c24
-rw-r--r--drivers/gpu/nvgpu/gk20a/pramin_gk20a.c1
7 files changed, 35 insertions, 55 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/bus_gk20a.c b/drivers/gpu/nvgpu/gk20a/bus_gk20a.c
index b2800772..7f0cfe58 100644
--- a/drivers/gpu/nvgpu/gk20a/bus_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/bus_gk20a.c
@@ -21,7 +21,6 @@
21 */ 21 */
22 22
23#include <nvgpu/page_allocator.h> 23#include <nvgpu/page_allocator.h>
24#include <nvgpu/enabled.h>
25#include <nvgpu/log.h> 24#include <nvgpu/log.h>
26#include <nvgpu/soc.h> 25#include <nvgpu/soc.h>
27#include <nvgpu/bus.h> 26#include <nvgpu/bus.h>
@@ -156,9 +155,8 @@ int gk20a_bus_bar1_bind(struct gk20a *g, struct nvgpu_mem *bar1_inst)
156 155
157 gk20a_writel(g, bus_bar1_block_r(), 156 gk20a_writel(g, bus_bar1_block_r(),
158 nvgpu_aperture_mask(g, bar1_inst, 157 nvgpu_aperture_mask(g, bar1_inst,
159 bus_bar1_block_target_sys_mem_ncoh_f(), 158 bus_bar1_block_target_sys_mem_ncoh_f(),
160 bus_bar1_block_target_sys_mem_coh_f(), 159 bus_bar1_block_target_vid_mem_f()) |
161 bus_bar1_block_target_vid_mem_f()) |
162 bus_bar1_block_mode_virtual_f() | 160 bus_bar1_block_mode_virtual_f() |
163 bus_bar1_block_ptr_f(ptr_v)); 161 bus_bar1_block_ptr_f(ptr_v));
164 162
diff --git a/drivers/gpu/nvgpu/gk20a/fb_gk20a.c b/drivers/gpu/nvgpu/gk20a/fb_gk20a.c
index e3052701..a5a2cb51 100644
--- a/drivers/gpu/nvgpu/gk20a/fb_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/fb_gk20a.c
@@ -98,9 +98,8 @@ void gk20a_fb_tlb_invalidate(struct gk20a *g, struct nvgpu_mem *pdb)
98 gk20a_writel(g, fb_mmu_invalidate_pdb_r(), 98 gk20a_writel(g, fb_mmu_invalidate_pdb_r(),
99 fb_mmu_invalidate_pdb_addr_f(addr_lo) | 99 fb_mmu_invalidate_pdb_addr_f(addr_lo) |
100 nvgpu_aperture_mask(g, pdb, 100 nvgpu_aperture_mask(g, pdb,
101 fb_mmu_invalidate_pdb_aperture_sys_mem_f(), 101 fb_mmu_invalidate_pdb_aperture_sys_mem_f(),
102 fb_mmu_invalidate_pdb_aperture_sys_mem_f(), 102 fb_mmu_invalidate_pdb_aperture_vid_mem_f()));
103 fb_mmu_invalidate_pdb_aperture_vid_mem_f()));
104 103
105 gk20a_writel(g, fb_mmu_invalidate_r(), 104 gk20a_writel(g, fb_mmu_invalidate_r(),
106 fb_mmu_invalidate_all_va_true_f() | 105 fb_mmu_invalidate_all_va_true_f() |
diff --git a/drivers/gpu/nvgpu/gk20a/fecs_trace_gk20a.c b/drivers/gpu/nvgpu/gk20a/fecs_trace_gk20a.c
index 4fda0d2e..409661fc 100644
--- a/drivers/gpu/nvgpu/gk20a/fecs_trace_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/fecs_trace_gk20a.c
@@ -653,7 +653,6 @@ int gk20a_fecs_trace_bind_channel(struct gk20a *g,
653 return -ENOMEM; 653 return -ENOMEM;
654 aperture = nvgpu_aperture_mask(g, &trace->trace_buf, 654 aperture = nvgpu_aperture_mask(g, &trace->trace_buf,
655 ctxsw_prog_main_image_context_timestamp_buffer_ptr_hi_target_sys_mem_noncoherent_f(), 655 ctxsw_prog_main_image_context_timestamp_buffer_ptr_hi_target_sys_mem_noncoherent_f(),
656 ctxsw_prog_main_image_context_timestamp_buffer_ptr_hi_target_sys_mem_coherent_f(),
657 ctxsw_prog_main_image_context_timestamp_buffer_ptr_hi_target_vid_mem_f()); 656 ctxsw_prog_main_image_context_timestamp_buffer_ptr_hi_target_vid_mem_f());
658 657
659 if (nvgpu_mem_begin(g, mem)) 658 if (nvgpu_mem_begin(g, mem))
diff --git a/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c b/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c
index 258006f9..e12576d2 100644
--- a/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c
@@ -28,7 +28,6 @@
28#include <nvgpu/dma.h> 28#include <nvgpu/dma.h>
29#include <nvgpu/timers.h> 29#include <nvgpu/timers.h>
30#include <nvgpu/semaphore.h> 30#include <nvgpu/semaphore.h>
31#include <nvgpu/enabled.h>
32#include <nvgpu/kmem.h> 31#include <nvgpu/kmem.h>
33#include <nvgpu/log.h> 32#include <nvgpu/log.h>
34#include <nvgpu/soc.h> 33#include <nvgpu/soc.h>
@@ -667,13 +666,11 @@ static void fifo_engine_exception_status(struct gk20a *g,
667static int init_runlist(struct gk20a *g, struct fifo_gk20a *f) 666static int init_runlist(struct gk20a *g, struct fifo_gk20a *f)
668{ 667{
669 struct fifo_runlist_info_gk20a *runlist; 668 struct fifo_runlist_info_gk20a *runlist;
670 struct fifo_engine_info_gk20a *engine_info;
671 unsigned int runlist_id; 669 unsigned int runlist_id;
672 u32 i; 670 u32 i;
673 size_t runlist_size; 671 size_t runlist_size;
674 u32 active_engine_id, pbdma_id, engine_id; 672 u32 active_engine_id, pbdma_id, engine_id;
675 int flags = nvgpu_is_enabled(g, NVGPU_MM_USE_PHYSICAL_SG) ? 673 struct fifo_engine_info_gk20a *engine_info;
676 NVGPU_DMA_FORCE_CONTIGUOUS : 0;
677 674
678 nvgpu_log_fn(g, " "); 675 nvgpu_log_fn(g, " ");
679 676
@@ -708,9 +705,8 @@ static int init_runlist(struct gk20a *g, struct fifo_gk20a *f)
708 f->num_runlist_entries, runlist_size); 705 f->num_runlist_entries, runlist_size);
709 706
710 for (i = 0; i < MAX_RUNLIST_BUFFERS; i++) { 707 for (i = 0; i < MAX_RUNLIST_BUFFERS; i++) {
711 int err = nvgpu_dma_alloc_flags_sys(g, flags, 708 int err = nvgpu_dma_alloc_sys(g, runlist_size,
712 runlist_size, 709 &runlist->mem[i]);
713 &runlist->mem[i]);
714 if (err) { 710 if (err) {
715 nvgpu_err(g, "memory allocation failed"); 711 nvgpu_err(g, "memory allocation failed");
716 goto clean_up_runlist; 712 goto clean_up_runlist;
@@ -3244,9 +3240,8 @@ static int gk20a_fifo_update_runlist_locked(struct gk20a *g, u32 runlist_id,
3244 gk20a_writel(g, fifo_runlist_base_r(), 3240 gk20a_writel(g, fifo_runlist_base_r(),
3245 fifo_runlist_base_ptr_f(u64_lo32(runlist_iova >> 12)) | 3241 fifo_runlist_base_ptr_f(u64_lo32(runlist_iova >> 12)) |
3246 nvgpu_aperture_mask(g, &runlist->mem[new_buf], 3242 nvgpu_aperture_mask(g, &runlist->mem[new_buf],
3247 fifo_runlist_base_target_sys_mem_ncoh_f(), 3243 fifo_runlist_base_target_sys_mem_ncoh_f(),
3248 fifo_runlist_base_target_sys_mem_coh_f(), 3244 fifo_runlist_base_target_vid_mem_f()));
3249 fifo_runlist_base_target_vid_mem_f()));
3250 } 3245 }
3251 3246
3252 gk20a_writel(g, fifo_runlist_r(), 3247 gk20a_writel(g, fifo_runlist_r(),
@@ -3768,9 +3763,8 @@ static int gk20a_fifo_commit_userd(struct channel_gk20a *c)
3768 nvgpu_mem_wr32(g, &c->inst_block, 3763 nvgpu_mem_wr32(g, &c->inst_block,
3769 ram_in_ramfc_w() + ram_fc_userd_w(), 3764 ram_in_ramfc_w() + ram_fc_userd_w(),
3770 nvgpu_aperture_mask(g, &g->fifo.userd, 3765 nvgpu_aperture_mask(g, &g->fifo.userd,
3771 pbdma_userd_target_sys_mem_ncoh_f(), 3766 pbdma_userd_target_sys_mem_ncoh_f(),
3772 pbdma_userd_target_sys_mem_coh_f(), 3767 pbdma_userd_target_vid_mem_f()) |
3773 pbdma_userd_target_vid_mem_f()) |
3774 pbdma_userd_addr_f(addr_lo)); 3768 pbdma_userd_addr_f(addr_lo));
3775 3769
3776 nvgpu_mem_wr32(g, &c->inst_block, 3770 nvgpu_mem_wr32(g, &c->inst_block,
diff --git a/drivers/gpu/nvgpu/gk20a/gr_gk20a.c b/drivers/gpu/nvgpu/gk20a/gr_gk20a.c
index bdb54325..7160ab6f 100644
--- a/drivers/gpu/nvgpu/gk20a/gr_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/gr_gk20a.c
@@ -742,14 +742,13 @@ void gr_gk20a_ctx_patch_write(struct gk20a *g,
742 742
743static u32 fecs_current_ctx_data(struct gk20a *g, struct nvgpu_mem *inst_block) 743static u32 fecs_current_ctx_data(struct gk20a *g, struct nvgpu_mem *inst_block)
744{ 744{
745 u64 ptr = nvgpu_inst_block_addr(g, inst_block) >> 745 u32 ptr = u64_lo32(nvgpu_inst_block_addr(g, inst_block)
746 ram_in_base_shift_v(); 746 >> ram_in_base_shift_v());
747 u32 aperture = nvgpu_aperture_mask(g, inst_block, 747 u32 aperture = nvgpu_aperture_mask(g, inst_block,
748 gr_fecs_current_ctx_target_sys_mem_ncoh_f(), 748 gr_fecs_current_ctx_target_sys_mem_ncoh_f(),
749 gr_fecs_current_ctx_target_sys_mem_coh_f(), 749 gr_fecs_current_ctx_target_vid_mem_f());
750 gr_fecs_current_ctx_target_vid_mem_f());
751 750
752 return gr_fecs_current_ctx_ptr_f(u64_lo32(ptr)) | aperture | 751 return gr_fecs_current_ctx_ptr_f(ptr) | aperture |
753 gr_fecs_current_ctx_valid_f(1); 752 gr_fecs_current_ctx_valid_f(1);
754} 753}
755 754
@@ -2172,18 +2171,16 @@ void gr_gk20a_load_falcon_bind_instblk(struct gk20a *g)
2172 2171
2173 inst_ptr = nvgpu_inst_block_addr(g, &ucode_info->inst_blk_desc); 2172 inst_ptr = nvgpu_inst_block_addr(g, &ucode_info->inst_blk_desc);
2174 gk20a_writel(g, gr_fecs_new_ctx_r(), 2173 gk20a_writel(g, gr_fecs_new_ctx_r(),
2175 gr_fecs_new_ctx_ptr_f(inst_ptr >> 12) | 2174 gr_fecs_new_ctx_ptr_f(inst_ptr >> 12) |
2176 nvgpu_aperture_mask(g, &ucode_info->inst_blk_desc, 2175 nvgpu_aperture_mask(g, &ucode_info->inst_blk_desc,
2177 gr_fecs_new_ctx_target_sys_mem_ncoh_f(), 2176 gr_fecs_new_ctx_target_sys_mem_ncoh_f(),
2178 gr_fecs_new_ctx_target_sys_mem_coh_f(),
2179 gr_fecs_new_ctx_target_vid_mem_f()) | 2177 gr_fecs_new_ctx_target_vid_mem_f()) |
2180 gr_fecs_new_ctx_valid_m()); 2178 gr_fecs_new_ctx_valid_m());
2181 2179
2182 gk20a_writel(g, gr_fecs_arb_ctx_ptr_r(), 2180 gk20a_writel(g, gr_fecs_arb_ctx_ptr_r(),
2183 gr_fecs_arb_ctx_ptr_ptr_f(inst_ptr >> 12) | 2181 gr_fecs_arb_ctx_ptr_ptr_f(inst_ptr >> 12) |
2184 nvgpu_aperture_mask(g, &ucode_info->inst_blk_desc, 2182 nvgpu_aperture_mask(g, &ucode_info->inst_blk_desc,
2185 gr_fecs_arb_ctx_ptr_target_sys_mem_ncoh_f(), 2183 gr_fecs_arb_ctx_ptr_target_sys_mem_ncoh_f(),
2186 gr_fecs_arb_ctx_ptr_target_sys_mem_coh_f(),
2187 gr_fecs_arb_ctx_ptr_target_vid_mem_f())); 2184 gr_fecs_arb_ctx_ptr_target_vid_mem_f()));
2188 2185
2189 gk20a_writel(g, gr_fecs_arb_ctx_cmd_r(), 0x7); 2186 gk20a_writel(g, gr_fecs_arb_ctx_cmd_r(), 0x7);
@@ -4387,9 +4384,8 @@ static int gk20a_init_gr_setup_hw(struct gk20a *g)
4387 4384
4388 gk20a_writel(g, fb_mmu_debug_wr_r(), 4385 gk20a_writel(g, fb_mmu_debug_wr_r(),
4389 nvgpu_aperture_mask(g, &gr->mmu_wr_mem, 4386 nvgpu_aperture_mask(g, &gr->mmu_wr_mem,
4390 fb_mmu_debug_wr_aperture_sys_mem_ncoh_f(), 4387 fb_mmu_debug_wr_aperture_sys_mem_ncoh_f(),
4391 fb_mmu_debug_wr_aperture_sys_mem_coh_f(), 4388 fb_mmu_debug_wr_aperture_vid_mem_f()) |
4392 fb_mmu_debug_wr_aperture_vid_mem_f()) |
4393 fb_mmu_debug_wr_vol_false_f() | 4389 fb_mmu_debug_wr_vol_false_f() |
4394 fb_mmu_debug_wr_addr_f(addr)); 4390 fb_mmu_debug_wr_addr_f(addr));
4395 4391
@@ -4398,9 +4394,8 @@ static int gk20a_init_gr_setup_hw(struct gk20a *g)
4398 4394
4399 gk20a_writel(g, fb_mmu_debug_rd_r(), 4395 gk20a_writel(g, fb_mmu_debug_rd_r(),
4400 nvgpu_aperture_mask(g, &gr->mmu_rd_mem, 4396 nvgpu_aperture_mask(g, &gr->mmu_rd_mem,
4401 fb_mmu_debug_wr_aperture_sys_mem_ncoh_f(), 4397 fb_mmu_debug_wr_aperture_sys_mem_ncoh_f(),
4402 fb_mmu_debug_wr_aperture_sys_mem_coh_f(), 4398 fb_mmu_debug_rd_aperture_vid_mem_f()) |
4403 fb_mmu_debug_rd_aperture_vid_mem_f()) |
4404 fb_mmu_debug_rd_vol_false_f() | 4399 fb_mmu_debug_rd_vol_false_f() |
4405 fb_mmu_debug_rd_addr_f(addr)); 4400 fb_mmu_debug_rd_addr_f(addr));
4406 4401
diff --git a/drivers/gpu/nvgpu/gk20a/mm_gk20a.c b/drivers/gpu/nvgpu/gk20a/mm_gk20a.c
index 4ff6125b..b27d1109 100644
--- a/drivers/gpu/nvgpu/gk20a/mm_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/mm_gk20a.c
@@ -122,9 +122,8 @@ static inline u32 big_valid_pde0_bits(struct gk20a *g,
122{ 122{
123 u32 pde0_bits = 123 u32 pde0_bits =
124 nvgpu_aperture_mask(g, pd->mem, 124 nvgpu_aperture_mask(g, pd->mem,
125 gmmu_pde_aperture_big_sys_mem_ncoh_f(), 125 gmmu_pde_aperture_big_sys_mem_ncoh_f(),
126 gmmu_pde_aperture_big_sys_mem_coh_f(), 126 gmmu_pde_aperture_big_video_memory_f()) |
127 gmmu_pde_aperture_big_video_memory_f()) |
128 gmmu_pde_address_big_sys_f( 127 gmmu_pde_address_big_sys_f(
129 (u32)(addr >> gmmu_pde_address_shift_v())); 128 (u32)(addr >> gmmu_pde_address_shift_v()));
130 129
@@ -136,9 +135,8 @@ static inline u32 small_valid_pde1_bits(struct gk20a *g,
136{ 135{
137 u32 pde1_bits = 136 u32 pde1_bits =
138 nvgpu_aperture_mask(g, pd->mem, 137 nvgpu_aperture_mask(g, pd->mem,
139 gmmu_pde_aperture_small_sys_mem_ncoh_f(), 138 gmmu_pde_aperture_small_sys_mem_ncoh_f(),
140 gmmu_pde_aperture_small_sys_mem_coh_f(), 139 gmmu_pde_aperture_small_video_memory_f()) |
141 gmmu_pde_aperture_small_video_memory_f()) |
142 gmmu_pde_vol_small_true_f() | /* tbd: why? */ 140 gmmu_pde_vol_small_true_f() | /* tbd: why? */
143 gmmu_pde_address_small_sys_f( 141 gmmu_pde_address_small_sys_f(
144 (u32)(addr >> gmmu_pde_address_shift_v())); 142 (u32)(addr >> gmmu_pde_address_shift_v()));
@@ -217,7 +215,6 @@ static void __update_pte(struct vm_gk20a *vm,
217 215
218 pte_w[1] = __nvgpu_aperture_mask(g, attrs->aperture, 216 pte_w[1] = __nvgpu_aperture_mask(g, attrs->aperture,
219 gmmu_pte_aperture_sys_mem_ncoh_f(), 217 gmmu_pte_aperture_sys_mem_ncoh_f(),
220 gmmu_pte_aperture_sys_mem_coh_f(),
221 gmmu_pte_aperture_video_memory_f()) | 218 gmmu_pte_aperture_video_memory_f()) |
222 gmmu_pte_kind_f(attrs->kind_v) | 219 gmmu_pte_kind_f(attrs->kind_v) |
223 gmmu_pte_comptagline_f((u32)(attrs->ctag >> ctag_shift)); 220 gmmu_pte_comptagline_f((u32)(attrs->ctag >> ctag_shift));
@@ -271,7 +268,7 @@ static void update_gmmu_pte_locked(struct vm_gk20a *vm,
271 page_size >> 10, 268 page_size >> 10,
272 nvgpu_gmmu_perm_str(attrs->rw_flag), 269 nvgpu_gmmu_perm_str(attrs->rw_flag),
273 attrs->kind_v, 270 attrs->kind_v,
274 nvgpu_aperture_str(g, attrs->aperture), 271 nvgpu_aperture_str(attrs->aperture),
275 attrs->cacheable ? 'C' : '-', 272 attrs->cacheable ? 'C' : '-',
276 attrs->sparse ? 'S' : '-', 273 attrs->sparse ? 'S' : '-',
277 attrs->priv ? 'P' : '-', 274 attrs->priv ? 'P' : '-',
@@ -366,12 +363,11 @@ void gk20a_mm_init_pdb(struct gk20a *g, struct nvgpu_mem *inst_block,
366 gk20a_dbg_info("pde pa=0x%llx", pdb_addr); 363 gk20a_dbg_info("pde pa=0x%llx", pdb_addr);
367 364
368 nvgpu_mem_wr32(g, inst_block, ram_in_page_dir_base_lo_w(), 365 nvgpu_mem_wr32(g, inst_block, ram_in_page_dir_base_lo_w(),
369 nvgpu_aperture_mask(g, vm->pdb.mem, 366 nvgpu_aperture_mask(g, vm->pdb.mem,
370 ram_in_page_dir_base_target_sys_mem_ncoh_f(), 367 ram_in_page_dir_base_target_sys_mem_ncoh_f(),
371 ram_in_page_dir_base_target_sys_mem_coh_f(), 368 ram_in_page_dir_base_target_vid_mem_f()) |
372 ram_in_page_dir_base_target_vid_mem_f()) | 369 ram_in_page_dir_base_vol_true_f() |
373 ram_in_page_dir_base_vol_true_f() | 370 ram_in_page_dir_base_lo_f(pdb_addr_lo));
374 ram_in_page_dir_base_lo_f(pdb_addr_lo));
375 371
376 nvgpu_mem_wr32(g, inst_block, ram_in_page_dir_base_hi_w(), 372 nvgpu_mem_wr32(g, inst_block, ram_in_page_dir_base_hi_w(),
377 ram_in_page_dir_base_hi_f(pdb_addr_hi)); 373 ram_in_page_dir_base_hi_f(pdb_addr_hi));
diff --git a/drivers/gpu/nvgpu/gk20a/pramin_gk20a.c b/drivers/gpu/nvgpu/gk20a/pramin_gk20a.c
index 67fd2480..bb8831e0 100644
--- a/drivers/gpu/nvgpu/gk20a/pramin_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/pramin_gk20a.c
@@ -41,7 +41,6 @@ u32 gk20a_pramin_enter(struct gk20a *g, struct nvgpu_mem *mem,
41 u32 lo = (u32)(addr & 0xfffff); 41 u32 lo = (u32)(addr & 0xfffff);
42 u32 win = nvgpu_aperture_mask(g, mem, 42 u32 win = nvgpu_aperture_mask(g, mem,
43 bus_bar0_window_target_sys_mem_noncoherent_f(), 43 bus_bar0_window_target_sys_mem_noncoherent_f(),
44 bus_bar0_window_target_sys_mem_coherent_f(),
45 bus_bar0_window_target_vid_mem_f()) | 44 bus_bar0_window_target_vid_mem_f()) |
46 bus_bar0_window_base_f(hi); 45 bus_bar0_window_base_f(hi);
47 46