Lines Matching refs:instance

111 vchiq_ioc_queue_message(struct vchiq_instance *instance, unsigned int handle,  in vchiq_ioc_queue_message()  argument
130 status = vchiq_queue_message(instance, handle, vchiq_ioc_copy_element_data, in vchiq_ioc_queue_message()
140 static int vchiq_ioc_create_service(struct vchiq_instance *instance, in vchiq_ioc_create_service() argument
149 if (args->is_open && !instance->connected) in vchiq_ioc_create_service()
159 srvstate = instance->connected ? in vchiq_ioc_create_service()
170 service = vchiq_add_service_internal(instance->state, &params, in vchiq_ioc_create_service()
171 srvstate, instance, in vchiq_ioc_create_service()
180 user_service->instance = instance; in vchiq_ioc_create_service()
184 user_service->message_available_pos = instance->completion_remove - 1; in vchiq_ioc_create_service()
192 status = vchiq_open_service_internal(service, instance->pid); in vchiq_ioc_create_service()
194 vchiq_remove_service(instance, service->handle); in vchiq_ioc_create_service()
204 static int vchiq_ioc_dequeue_message(struct vchiq_instance *instance, in vchiq_ioc_dequeue_message() argument
214 service = find_service_for_instance(instance, args->handle); in vchiq_ioc_dequeue_message()
269 vchiq_release_message(instance, service->handle, header); in vchiq_ioc_dequeue_message()
286 static int vchiq_irq_queue_bulk_tx_rx(struct vchiq_instance *instance, in vchiq_irq_queue_bulk_tx_rx() argument
297 service = find_service_for_instance(instance, args->handle); in vchiq_irq_queue_bulk_tx_rx()
310 mutex_lock(&instance->bulk_waiter_list_mutex); in vchiq_irq_queue_bulk_tx_rx()
311 list_for_each_entry(iter, &instance->bulk_waiter_list, in vchiq_irq_queue_bulk_tx_rx()
319 mutex_unlock(&instance->bulk_waiter_list_mutex); in vchiq_irq_queue_bulk_tx_rx()
333 status = vchiq_bulk_transfer(instance, args->handle, NULL, args->data, args->size, in vchiq_irq_queue_bulk_tx_rx()
355 mutex_lock(&instance->bulk_waiter_list_mutex); in vchiq_irq_queue_bulk_tx_rx()
356 list_add(&waiter->list, &instance->bulk_waiter_list); in vchiq_irq_queue_bulk_tx_rx()
357 mutex_unlock(&instance->bulk_waiter_list_mutex); in vchiq_irq_queue_bulk_tx_rx()
432 static int vchiq_ioc_await_completion(struct vchiq_instance *instance, in vchiq_ioc_await_completion() argument
443 if (!instance->connected) in vchiq_ioc_await_completion()
446 mutex_lock(&instance->completion_mutex); in vchiq_ioc_await_completion()
449 while ((instance->completion_remove == instance->completion_insert) && !instance->closing) { in vchiq_ioc_await_completion()
453 mutex_unlock(&instance->completion_mutex); in vchiq_ioc_await_completion()
454 rc = wait_for_completion_interruptible(&instance->insert_event); in vchiq_ioc_await_completion()
455 mutex_lock(&instance->completion_mutex); in vchiq_ioc_await_completion()
467 remove = instance->completion_remove; in vchiq_ioc_await_completion()
476 if (remove == instance->completion_insert) in vchiq_ioc_await_completion()
479 completion = &instance->completions[remove & (MAX_COMPLETIONS - 1)]; in vchiq_ioc_await_completion()
532 vchiq_release_message(instance, service->handle, header); in vchiq_ioc_await_completion()
539 !instance->use_close_delivered) in vchiq_ioc_await_completion()
560 instance->completion_remove = remove; in vchiq_ioc_await_completion()
569 complete(&instance->remove_event); in vchiq_ioc_await_completion()
570 mutex_unlock(&instance->completion_mutex); in vchiq_ioc_await_completion()
579 struct vchiq_instance *instance = file->private_data; in vchiq_ioctl() local
586 "%s - instance %pK, cmd %s, arg %lx", __func__, instance, in vchiq_ioctl()
592 if (!instance->connected) in vchiq_ioctl()
597 while ((service = next_service_by_instance(instance->state, in vchiq_ioctl()
598 instance, &i))) { in vchiq_ioctl()
599 status = vchiq_remove_service(instance, service->handle); in vchiq_ioctl()
608 instance->closing = 1; in vchiq_ioctl()
609 complete(&instance->insert_event); in vchiq_ioctl()
615 if (instance->connected) { in vchiq_ioctl()
619 rc = mutex_lock_killable(&instance->state->mutex); in vchiq_ioctl()
623 instance->state->id, rc); in vchiq_ioctl()
627 status = vchiq_connect_internal(instance->state, instance); in vchiq_ioctl()
628 mutex_unlock(&instance->state->mutex); in vchiq_ioctl()
631 instance->connected = 1; in vchiq_ioctl()
647 ret = vchiq_ioc_create_service(instance, &args); in vchiq_ioctl()
652 vchiq_remove_service(instance, args.handle); in vchiq_ioctl()
662 service = find_service_for_instance(instance, handle); in vchiq_ioctl()
676 vchiq_close_service(instance, service->handle) : in vchiq_ioctl()
677 vchiq_remove_service(instance, service->handle); in vchiq_ioctl()
697 service = find_service_for_instance(instance, handle); in vchiq_ioctl()
726 service = find_service_for_instance(instance, args.handle); in vchiq_ioctl()
734 ret = vchiq_ioc_queue_message(instance, args.handle, elements, in vchiq_ioctl()
758 ret = vchiq_irq_queue_bulk_tx_rx(instance, &args, in vchiq_ioctl()
772 ret = vchiq_ioc_await_completion(instance, &args, in vchiq_ioctl()
785 ret = vchiq_ioc_dequeue_message(instance, &args); in vchiq_ioctl()
791 ret = vchiq_get_client_id(instance, handle); in vchiq_ioctl()
824 service = find_service_for_instance(instance, args.handle); in vchiq_ioctl()
830 ret = vchiq_set_service_option(instance, args.handle, args.option, in vchiq_ioctl()
840 instance->use_close_delivered = 1; in vchiq_ioctl()
846 service = find_closed_service_for_instance(instance, handle); in vchiq_ioctl()
874 instance, (_IOC_NR(cmd) <= VCHIQ_IOC_MAX) ? in vchiq_ioctl()
879 instance, (_IOC_NR(cmd) <= VCHIQ_IOC_MAX) ? in vchiq_ioctl()
911 struct vchiq_instance *instance = file->private_data; in vchiq_compat_ioctl_create_service() local
930 ret = vchiq_ioc_create_service(instance, &args); in vchiq_compat_ioctl_create_service()
935 vchiq_remove_service(instance, args.handle); in vchiq_compat_ioctl_create_service()
964 struct vchiq_instance *instance = file->private_data; in vchiq_compat_ioctl_queue_message() local
979 service = find_service_for_instance(instance, args.handle); in vchiq_compat_ioctl_queue_message()
999 ret = vchiq_ioc_queue_message(instance, args.handle, elements, in vchiq_compat_ioctl_queue_message()
1171 struct vchiq_instance *instance; in vchiq_open() local
1181 instance = kzalloc(sizeof(*instance), GFP_KERNEL); in vchiq_open()
1182 if (!instance) in vchiq_open()
1185 instance->state = state; in vchiq_open()
1186 instance->pid = current->tgid; in vchiq_open()
1188 vchiq_debugfs_add_instance(instance); in vchiq_open()
1190 init_completion(&instance->insert_event); in vchiq_open()
1191 init_completion(&instance->remove_event); in vchiq_open()
1192 mutex_init(&instance->completion_mutex); in vchiq_open()
1193 mutex_init(&instance->bulk_waiter_list_mutex); in vchiq_open()
1194 INIT_LIST_HEAD(&instance->bulk_waiter_list); in vchiq_open()
1196 file->private_data = instance; in vchiq_open()
1203 struct vchiq_instance *instance = file->private_data; in vchiq_release() local
1210 (unsigned long)instance); in vchiq_release()
1218 vchiq_use_internal(instance->state, NULL, USE_TYPE_VCHIQ); in vchiq_release()
1220 mutex_lock(&instance->completion_mutex); in vchiq_release()
1223 instance->closing = 1; in vchiq_release()
1224 complete(&instance->insert_event); in vchiq_release()
1226 mutex_unlock(&instance->completion_mutex); in vchiq_release()
1229 complete(&instance->remove_event); in vchiq_release()
1233 while ((service = next_service_by_instance(state, instance, &i))) { in vchiq_release()
1245 while ((service = next_service_by_instance(state, instance, &i))) { in vchiq_release()
1266 vchiq_release_message(instance, service->handle, header); in vchiq_release()
1276 while (instance->completion_remove != instance->completion_insert) { in vchiq_release()
1280 completion = &instance->completions[instance->completion_remove in vchiq_release()
1288 if (instance->use_close_delivered) in vchiq_release()
1292 instance->completion_remove++; in vchiq_release()
1296 vchiq_release_internal(instance->state, NULL); in vchiq_release()
1298 free_bulk_waiter(instance); in vchiq_release()
1300 vchiq_debugfs_remove_instance(instance); in vchiq_release()
1302 kfree(instance); in vchiq_release()