Home
last modified time | relevance | path

Searched refs:job (Results 1 – 25 of 410) sorted by relevance

12345678910>>...17

/OK3568_Linux_fs/kernel/drivers/gpu/arm/mali400/mali/common/
H A Dmali_pp_job.h116 void mali_pp_job_delete(struct mali_pp_job *job);
118 u32 mali_pp_job_get_perf_counter_src0(struct mali_pp_job *job, u32 sub_job);
119 u32 mali_pp_job_get_perf_counter_src1(struct mali_pp_job *job, u32 sub_job);
131 MALI_STATIC_INLINE u32 mali_pp_job_get_id(struct mali_pp_job *job) in mali_pp_job_get_id() argument
133 MALI_DEBUG_ASSERT_POINTER(job); in mali_pp_job_get_id()
134 return (NULL == job) ? 0 : job->id; in mali_pp_job_get_id()
137 MALI_STATIC_INLINE void mali_pp_job_set_cache_order(struct mali_pp_job *job, in mali_pp_job_set_cache_order() argument
140 MALI_DEBUG_ASSERT_POINTER(job); in mali_pp_job_set_cache_order()
142 job->cache_order = cache_order; in mali_pp_job_set_cache_order()
145 MALI_STATIC_INLINE u32 mali_pp_job_get_cache_order(struct mali_pp_job *job) in mali_pp_job_get_cache_order() argument
[all …]
H A Dmali_soft_job.c90 … void mali_soft_job_system_free_job(struct mali_soft_job_system *system, struct mali_soft_job *job) in mali_soft_job_system_free_job() argument
92 MALI_DEBUG_ASSERT_POINTER(job); in mali_soft_job_system_free_job()
95 mali_soft_job_system_lock(job->system); in mali_soft_job_system_free_job()
97 MALI_DEBUG_ASSERT(MALI_SOFT_JOB_INVALID_ID != job->id); in mali_soft_job_system_free_job()
98 MALI_DEBUG_ASSERT(system == job->system); in mali_soft_job_system_free_job()
100 _mali_osk_list_del(&(job->system_list)); in mali_soft_job_system_free_job()
102 mali_soft_job_system_unlock(job->system); in mali_soft_job_system_free_job()
104 _mali_osk_free(job); in mali_soft_job_system_free_job()
109 struct mali_soft_job *job, *tmp; in mali_soft_job_system_lookup_job() local
114 _MALI_OSK_LIST_FOREACHENTRY(job, tmp, &system->jobs_used, struct mali_soft_job, system_list) { in mali_soft_job_system_lookup_job()
[all …]
H A Dmali_gp_job.h89 void mali_gp_job_delete(struct mali_gp_job *job);
96 MALI_STATIC_INLINE u32 mali_gp_job_get_id(struct mali_gp_job *job) in mali_gp_job_get_id() argument
98 MALI_DEBUG_ASSERT_POINTER(job); in mali_gp_job_get_id()
99 return (NULL == job) ? 0 : job->id; in mali_gp_job_get_id()
102 MALI_STATIC_INLINE void mali_gp_job_set_cache_order(struct mali_gp_job *job, in mali_gp_job_set_cache_order() argument
105 MALI_DEBUG_ASSERT_POINTER(job); in mali_gp_job_set_cache_order()
107 job->cache_order = cache_order; in mali_gp_job_set_cache_order()
110 MALI_STATIC_INLINE u32 mali_gp_job_get_cache_order(struct mali_gp_job *job) in mali_gp_job_get_cache_order() argument
112 MALI_DEBUG_ASSERT_POINTER(job); in mali_gp_job_get_cache_order()
113 return (NULL == job) ? 0 : job->cache_order; in mali_gp_job_get_cache_order()
[all …]
H A Dmali_pp_job.c43 struct mali_pp_job *job; in mali_pp_job_create() local
46 job = _mali_osk_calloc(1, sizeof(struct mali_pp_job)); in mali_pp_job_create()
47 if (NULL != job) { in mali_pp_job_create()
49 _mali_osk_list_init(&job->list); in mali_pp_job_create()
50 _mali_osk_list_init(&job->session_fb_lookup_list); in mali_pp_job_create()
53 if (0 != _mali_osk_copy_from_user(&job->uargs, uargs, sizeof(_mali_uk_pp_start_job_s))) { in mali_pp_job_create()
57 if (job->uargs.num_cores > _MALI_PP_MAX_SUB_JOBS) { in mali_pp_job_create()
62 if (!mali_pp_job_use_no_notification(job)) { in mali_pp_job_create()
63job->finished_notification = _mali_osk_notification_create(_MALI_NOTIFICATION_PP_FINISHED, sizeof(… in mali_pp_job_create()
64 if (NULL == job->finished_notification) goto fail; in mali_pp_job_create()
[all …]
H A Dmali_gp_job.c20 static void _mali_gp_del_varying_allocations(struct mali_gp_job *job);
24 struct mali_gp_job *job, in _mali_gp_add_varying_allocations() argument
51 list_move(&alloc_node->node, &job->varying_alloc); in _mali_gp_add_varying_allocations()
59 _mali_gp_del_varying_allocations(job); in _mali_gp_add_varying_allocations()
64 static void _mali_gp_del_varying_allocations(struct mali_gp_job *job) in _mali_gp_del_varying_allocations() argument
68 list_for_each_entry_safe(alloc_node, tmp_node, &job->varying_alloc, node) { in _mali_gp_del_varying_allocations()
72 INIT_LIST_HEAD(&job->varying_alloc); in _mali_gp_del_varying_allocations()
77 struct mali_gp_job *job; in mali_gp_job_create() local
83 job = _mali_osk_calloc(1, sizeof(struct mali_gp_job)); in mali_gp_job_create()
84 if (NULL != job) { in mali_gp_job_create()
[all …]
H A Dmali_scheduler.c86 struct mali_session_data *session, struct mali_gp_job *job);
88 struct mali_session_data *session, struct mali_pp_job *job, mali_timeline_point *point);
90 static mali_bool mali_scheduler_queue_gp_job(struct mali_gp_job *job);
91 static mali_bool mali_scheduler_queue_pp_job(struct mali_pp_job *job);
93 static void mali_scheduler_return_gp_job_to_user(struct mali_gp_job *job,
96 static void mali_scheduler_deferred_pp_job_delete(struct mali_pp_job *job);
100 static void mali_scheduler_deferred_pp_job_queue(struct mali_pp_job *job);
206 struct mali_pp_job *job; in mali_scheduler_job_physical_head_count() local
213 job = _MALI_OSK_LIST_ENTRY(job_queue_pp.normal_pri.next, in mali_scheduler_job_physical_head_count()
216 MALI_DEBUG_ASSERT_POINTER(job); in mali_scheduler_job_physical_head_count()
[all …]
/OK3568_Linux_fs/kernel/drivers/rknpu/
H A Drknpu_job.c61 static int rknn_get_task_number(struct rknpu_job *job, int core_index) in rknn_get_task_number() argument
63 int task_num = job->args->task_number; in rknn_get_task_number()
65 if (job->use_core_num == 2) in rknn_get_task_number()
66 task_num = job->args->subcore_task[core_index].task_number; in rknn_get_task_number()
67 else if (job->use_core_num == 3) in rknn_get_task_number()
68 task_num = job->args->subcore_task[core_index + 2].task_number; in rknn_get_task_number()
73 static void rknpu_job_free(struct rknpu_job *job) in rknpu_job_free() argument
79 (struct rknpu_gem_object *)(uintptr_t)job->args->task_obj_addr; in rknpu_job_free()
84 if (job->fence) in rknpu_job_free()
85 dma_fence_put(job->fence); in rknpu_job_free()
[all …]
/OK3568_Linux_fs/kernel/drivers/gpu/drm/amd/amdgpu/
H A Damdgpu_job.c34 struct amdgpu_job *job = to_amdgpu_job(s_job); in amdgpu_job_timedout() local
41 amdgpu_ring_soft_recovery(ring, job->vmid, s_job->s_fence->parent)) { in amdgpu_job_timedout()
47 amdgpu_vm_get_task_info(ring->adev, job->pasid, &ti); in amdgpu_job_timedout()
49 job->base.sched->name, atomic_read(&ring->fence_drv.last_seq), in amdgpu_job_timedout()
55 amdgpu_device_gpu_recover(ring->adev, job); in amdgpu_job_timedout()
64 struct amdgpu_job **job, struct amdgpu_vm *vm) in amdgpu_job_alloc() argument
73 *job = kzalloc(size, GFP_KERNEL); in amdgpu_job_alloc()
74 if (!*job) in amdgpu_job_alloc()
81 (*job)->base.sched = &adev->rings[0]->sched; in amdgpu_job_alloc()
82 (*job)->vm = vm; in amdgpu_job_alloc()
[all …]
/OK3568_Linux_fs/kernel/drivers/gpu/host1x/
H A Djob.c29 struct host1x_job *job = NULL; in host1x_job_alloc() local
47 mem = job = kzalloc(total, GFP_KERNEL); in host1x_job_alloc()
48 if (!job) in host1x_job_alloc()
51 kref_init(&job->ref); in host1x_job_alloc()
52 job->channel = ch; in host1x_job_alloc()
56 job->relocs = num_relocs ? mem : NULL; in host1x_job_alloc()
58 job->unpins = num_unpins ? mem : NULL; in host1x_job_alloc()
60 job->gathers = num_cmdbufs ? mem : NULL; in host1x_job_alloc()
62 job->addr_phys = num_unpins ? mem : NULL; in host1x_job_alloc()
64 job->reloc_addr_phys = job->addr_phys; in host1x_job_alloc()
[all …]
H A Dcdma.c274 struct host1x_job *job) in cdma_start_timer_locked() argument
283 cdma->timeout.client = job->client; in cdma_start_timer_locked()
284 cdma->timeout.syncpt = host1x_syncpt_get(host, job->syncpt_id); in cdma_start_timer_locked()
285 cdma->timeout.syncpt_val = job->syncpt_end; in cdma_start_timer_locked()
289 msecs_to_jiffies(job->timeout)); in cdma_start_timer_locked()
316 struct host1x_job *job, *n; in update_cdma_locked() local
326 list_for_each_entry_safe(job, n, &cdma->sync_queue, list) { in update_cdma_locked()
328 host1x_syncpt_get(host1x, job->syncpt_id); in update_cdma_locked()
331 if (!host1x_syncpt_is_expired(sp, job->syncpt_end)) { in update_cdma_locked()
333 if (job->timeout) in update_cdma_locked()
[all …]
/OK3568_Linux_fs/kernel/drivers/md/
H A Ddm-kcopyd.c531 struct kcopyd_job *job; in pop_io_job() local
537 list_for_each_entry(job, jobs, list) { in pop_io_job()
538 if (job->rw == READ || !test_bit(DM_KCOPYD_WRITE_SEQ, &job->flags)) { in pop_io_job()
539 list_del(&job->list); in pop_io_job()
540 return job; in pop_io_job()
543 if (job->write_offset == job->master_job->write_offset) { in pop_io_job()
544 job->master_job->write_offset += job->source.count; in pop_io_job()
545 list_del(&job->list); in pop_io_job()
546 return job; in pop_io_job()
556 struct kcopyd_job *job = NULL; in pop() local
[all …]
/OK3568_Linux_fs/kernel/block/
H A Dbsg-lib.c39 struct bsg_job *job = blk_mq_rq_to_pdu(rq); in bsg_transport_fill_hdr() local
42 job->request_len = hdr->request_len; in bsg_transport_fill_hdr()
43 job->request = memdup_user(uptr64(hdr->request), hdr->request_len); in bsg_transport_fill_hdr()
44 if (IS_ERR(job->request)) in bsg_transport_fill_hdr()
45 return PTR_ERR(job->request); in bsg_transport_fill_hdr()
48 job->bidi_rq = blk_get_request(rq->q, REQ_OP_SCSI_IN, 0); in bsg_transport_fill_hdr()
49 if (IS_ERR(job->bidi_rq)) { in bsg_transport_fill_hdr()
50 ret = PTR_ERR(job->bidi_rq); in bsg_transport_fill_hdr()
54 ret = blk_rq_map_user(rq->q, job->bidi_rq, NULL, in bsg_transport_fill_hdr()
60 job->bidi_bio = job->bidi_rq->bio; in bsg_transport_fill_hdr()
[all …]
/OK3568_Linux_fs/kernel/drivers/video/rockchip/rve/
H A Drve_job.c18 struct rve_job *job; in rve_scheduler_get_pending_job_list() local
22 job = list_first_entry_or_null(&scheduler->todo_list, in rve_scheduler_get_pending_job_list()
27 return job; in rve_scheduler_get_pending_job_list()
34 struct rve_job *job; in rve_scheduler_get_running_job() local
38 job = scheduler->running_job; in rve_scheduler_get_running_job()
42 return job; in rve_scheduler_get_running_job()
45 static void rve_scheduler_set_pid_info(struct rve_job *job, ktime_t now) in rve_scheduler_set_pid_info() argument
52 scheduler = rve_job_get_scheduler(job); in rve_scheduler_set_pid_info()
56 scheduler->session.pid_info[i].pid = job->pid; in rve_scheduler_set_pid_info()
58 if (scheduler->session.pid_info[i].pid == job->pid) { in rve_scheduler_set_pid_info()
[all …]
/OK3568_Linux_fs/external/rkwifibt/drivers/rtl8852be/phl/
H A Dphl_cmd_job.c37 struct phl_cmd_job *job = (struct phl_cmd_job *)msg->param; in cmd_discard_msg_job() local
40 if (job->id == JOB_RUN_FUNC && in cmd_discard_msg_job()
41 (job->u.cmd.fptr || job->u.cmd.func)) { in cmd_discard_msg_job()
44 job_name(pcmd, (u8)job->id), in cmd_discard_msg_job()
45 (char *)job->u.cmd.name); in cmd_discard_msg_job()
50 job->u.cmd.fptr(job->u.cmd.priv, job->u.cmd.parm, true); in cmd_discard_msg_job()
54 job_name(pcmd, (u8)job->id)); in cmd_discard_msg_job()
60 enum rtw_phl_status rtw_phl_job_fill_fptr(void *phl, struct phl_cmd_job *job, in rtw_phl_job_fill_fptr() argument
66 job->id = JOB_RUN_FUNC; in rtw_phl_job_fill_fptr()
67 job->pwr_level = pwr; in rtw_phl_job_fill_fptr()
[all …]
H A Dphl_cmd_fsm.c117 struct phl_cmd_job *job; in cmd_do_wdog_job() local
124 phl_list_for_loop(job, struct phl_cmd_job, &pcmd->wd_q, list) { in cmd_do_wdog_job()
125 job->u.cmd.fptr(job->u.cmd.priv, job->u.cmd.parm, false); in cmd_do_wdog_job()
130 job_name(pcmd, (u8)job->id), in cmd_do_wdog_job()
131 (char *)job->u.cmd.name); in cmd_do_wdog_job()
287 struct phl_cmd_job *job; in cmd_service_st_hdl() local
301 job = (struct phl_cmd_job *)param; in cmd_service_st_hdl()
302 if (job->pwr_level >= PWR_BASIC_IO) in cmd_service_st_hdl()
406 static int wait_completion(void *d, struct phl_cmd_job *job, int m_sec) in wait_completion() argument
408 job->wait.max_wait_time = m_sec; in wait_completion()
[all …]
/OK3568_Linux_fs/external/rkwifibt/drivers/rtl8852bs/phl/
H A Dphl_cmd_job.c37 struct phl_cmd_job *job = (struct phl_cmd_job *)msg->param; in cmd_discard_msg_job() local
40 if (job->id == JOB_RUN_FUNC && in cmd_discard_msg_job()
41 (job->u.cmd.fptr || job->u.cmd.func)) { in cmd_discard_msg_job()
44 job_name(pcmd, (u8)job->id), in cmd_discard_msg_job()
45 (char *)job->u.cmd.name); in cmd_discard_msg_job()
50 job->u.cmd.fptr(job->u.cmd.priv, job->u.cmd.parm, true); in cmd_discard_msg_job()
54 job_name(pcmd, (u8)job->id)); in cmd_discard_msg_job()
60 enum rtw_phl_status rtw_phl_job_fill_fptr(void *phl, struct phl_cmd_job *job, in rtw_phl_job_fill_fptr() argument
66 job->id = JOB_RUN_FUNC; in rtw_phl_job_fill_fptr()
67 job->pwr_level = pwr; in rtw_phl_job_fill_fptr()
[all …]
H A Dphl_cmd_fsm.c117 struct phl_cmd_job *job; in cmd_do_wdog_job() local
124 phl_list_for_loop(job, struct phl_cmd_job, &pcmd->wd_q, list) { in cmd_do_wdog_job()
125 job->u.cmd.fptr(job->u.cmd.priv, job->u.cmd.parm, false); in cmd_do_wdog_job()
130 job_name(pcmd, (u8)job->id), in cmd_do_wdog_job()
131 (char *)job->u.cmd.name); in cmd_do_wdog_job()
287 struct phl_cmd_job *job; in cmd_service_st_hdl() local
301 job = (struct phl_cmd_job *)param; in cmd_service_st_hdl()
302 if (job->pwr_level >= PWR_BASIC_IO) in cmd_service_st_hdl()
406 static int wait_completion(void *d, struct phl_cmd_job *job, int m_sec) in wait_completion() argument
408 job->wait.max_wait_time = m_sec; in wait_completion()
[all …]
/OK3568_Linux_fs/kernel/drivers/gpu/drm/v3d/
H A Dv3d_sched.c60 struct v3d_job *job = to_v3d_job(sched_job); in v3d_job_free() local
63 v3d_job_put(job); in v3d_job_free()
76 struct v3d_job *job = to_v3d_job(sched_job); in v3d_job_dependency() local
82 if (!xa_empty(&job->deps)) in v3d_job_dependency()
83 return xa_erase(&job->deps, job->last_dep++); in v3d_job_dependency()
90 struct v3d_bin_job *job = to_bin_job(sched_job); in v3d_bin_job_run() local
91 struct v3d_dev *v3d = job->base.v3d; in v3d_bin_job_run()
96 if (unlikely(job->base.base.s_fence->finished.error)) in v3d_bin_job_run()
103 v3d->bin_job = job; in v3d_bin_job_run()
116 if (job->base.irq_fence) in v3d_bin_job_run()
[all …]
H A Dv3d_gem.c250 v3d_lock_bo_reservations(struct v3d_job *job, in v3d_lock_bo_reservations() argument
255 ret = drm_gem_lock_reservations(job->bo, job->bo_count, acquire_ctx); in v3d_lock_bo_reservations()
259 for (i = 0; i < job->bo_count; i++) { in v3d_lock_bo_reservations()
260 ret = drm_gem_fence_array_add_implicit(&job->deps, in v3d_lock_bo_reservations()
261 job->bo[i], true); in v3d_lock_bo_reservations()
263 drm_gem_unlock_reservations(job->bo, job->bo_count, in v3d_lock_bo_reservations()
289 struct v3d_job *job, in v3d_lookup_bos() argument
297 job->bo_count = bo_count; in v3d_lookup_bos()
299 if (!job->bo_count) { in v3d_lookup_bos()
307 job->bo = kvmalloc_array(job->bo_count, in v3d_lookup_bos()
[all …]
/OK3568_Linux_fs/kernel/drivers/video/rockchip/rga3/
H A Drga_job.c17 static void rga_job_free(struct rga_job *job) in rga_job_free() argument
19 free_page((unsigned long)job); in rga_job_free()
24 struct rga_job *job; in rga_job_kref_release() local
26 job = container_of(ref, struct rga_job, refcount); in rga_job_kref_release()
28 rga_job_free(job); in rga_job_kref_release()
31 static int rga_job_put(struct rga_job *job) in rga_job_put() argument
33 return kref_put(&job->refcount, rga_job_kref_release); in rga_job_put()
36 static void rga_job_get(struct rga_job *job) in rga_job_get() argument
38 kref_get(&job->refcount); in rga_job_get()
41 static int rga_job_cleanup(struct rga_job *job) in rga_job_cleanup() argument
[all …]
H A Drga_mm.c373 struct rga_job *job) in rga_mm_map_dma_buffer() argument
383 scheduler = job ? job->scheduler : in rga_mm_map_dma_buffer()
525 struct rga_job *job, int write_flag) in rga_mm_map_virt_addr() argument
535 scheduler = job ? job->scheduler : in rga_mm_map_virt_addr()
542 internal_buffer->current_mm = job ? job->mm : current->mm; in rga_mm_map_virt_addr()
673 struct rga_job *job) in rga_mm_map_phys_addr() argument
682 scheduler = job ? job->scheduler : in rga_mm_map_phys_addr()
765 struct rga_job *job, int write_flag) in rga_mm_map_buffer() argument
777 ret = rga_mm_map_dma_buffer(external_buffer, internal_buffer, job); in rga_mm_map_buffer()
790 ret = rga_mm_map_virt_addr(external_buffer, internal_buffer, job, write_flag); in rga_mm_map_buffer()
[all …]
/OK3568_Linux_fs/kernel/drivers/gpu/drm/panfrost/
H A Dpanfrost_job.c112 static int panfrost_job_get_slot(struct panfrost_job *job) in panfrost_job_get_slot() argument
118 if (job->requirements & PANFROST_JD_REQ_FS) in panfrost_job_get_slot()
123 if (job->requirements & PANFROST_JD_REQ_ONLY_COMPUTE) { in panfrost_job_get_slot()
124 if ((job->requirements & PANFROST_JD_REQ_CORE_GRP_MASK) && in panfrost_job_get_slot()
125 (job->pfdev->features.nr_core_groups == 2)) in panfrost_job_get_slot()
127 if (panfrost_has_hw_issue(job->pfdev, HW_ISSUE_8987)) in panfrost_job_get_slot()
151 static void panfrost_job_hw_submit(struct panfrost_job *job, int js) in panfrost_job_hw_submit() argument
153 struct panfrost_device *pfdev = job->pfdev; in panfrost_job_hw_submit()
155 u64 jc_head = job->jc; in panfrost_job_hw_submit()
168 cfg = panfrost_mmu_as_get(pfdev, job->file_priv->mmu); in panfrost_job_hw_submit()
[all …]
/OK3568_Linux_fs/kernel/drivers/misc/habanalabs/common/
H A Dcommand_submission.c123 static bool is_cb_patched(struct hl_device *hdev, struct hl_cs_job *job) in is_cb_patched() argument
129 return (job->queue_type == QUEUE_TYPE_EXT || in is_cb_patched()
130 (job->queue_type == QUEUE_TYPE_HW && in is_cb_patched()
131 job->is_kernel_allocated_cb && in is_cb_patched()
146 static int cs_parser(struct hl_fpriv *hpriv, struct hl_cs_job *job) in cs_parser() argument
152 parser.ctx_id = job->cs->ctx->asid; in cs_parser()
153 parser.cs_sequence = job->cs->sequence; in cs_parser()
154 parser.job_id = job->id; in cs_parser()
156 parser.hw_queue_id = job->hw_queue_id; in cs_parser()
157 parser.job_userptr_list = &job->userptr_list; in cs_parser()
[all …]
/OK3568_Linux_fs/kernel/drivers/gpu/host1x/hw/
H A Dchannel_hw.c50 static void submit_gathers(struct host1x_job *job) in submit_gathers() argument
52 struct host1x_cdma *cdma = &job->channel->cdma; in submit_gathers()
54 struct device *dev = job->channel->dev; in submit_gathers()
58 for (i = 0; i < job->num_gathers; i++) { in submit_gathers()
59 struct host1x_job_gather *g = &job->gathers[i]; in submit_gathers()
87 static inline void synchronize_syncpt_base(struct host1x_job *job) in synchronize_syncpt_base() argument
89 struct host1x *host = dev_get_drvdata(job->channel->dev->parent); in synchronize_syncpt_base()
90 struct host1x_syncpt *sp = host->syncpt + job->syncpt_id; in synchronize_syncpt_base()
97 host1x_cdma_push(&job->channel->cdma, in synchronize_syncpt_base()
118 static int channel_submit(struct host1x_job *job) in channel_submit() argument
[all …]
/OK3568_Linux_fs/kernel/drivers/gpu/arm/midgard/
H A Dmali_kbase_replay.c68 struct job_descriptor_header *job) in dump_job_head() argument
86 job, job->exception_status, in dump_job_head()
87 JOB_SOURCE_ID(job->exception_status), in dump_job_head()
88 (job->exception_status >> 8) & 0x3, in dump_job_head()
89 job->exception_status & 0xFF, in dump_job_head()
90 job->first_incomplete_task, in dump_job_head()
91 job->fault_pointer, job->job_descriptor_size, in dump_job_head()
92 job->job_type, job->job_barrier, job->_reserved_01, in dump_job_head()
93 job->_reserved_02, job->_reserved_03, in dump_job_head()
94 job->_reserved_04, job->_reserved_05, in dump_job_head()
[all …]

12345678910>>...17