Lines Matching refs:gdev

42 static void vbg_guest_mappings_init(struct vbg_dev *gdev)  in vbg_guest_mappings_init()  argument
57 rc = vbg_req_perform(gdev, req); in vbg_guest_mappings_init()
76 gdev->guest_mappings_dummy_page = alloc_page(GFP_HIGHUSER); in vbg_guest_mappings_init()
77 if (!gdev->guest_mappings_dummy_page) in vbg_guest_mappings_init()
81 pages[i] = gdev->guest_mappings_dummy_page; in vbg_guest_mappings_init()
99 rc = vbg_req_perform(gdev, req); in vbg_guest_mappings_init()
101 gdev->guest_mappings = guest_mappings[i]; in vbg_guest_mappings_init()
111 if (!gdev->guest_mappings) { in vbg_guest_mappings_init()
112 __free_page(gdev->guest_mappings_dummy_page); in vbg_guest_mappings_init()
113 gdev->guest_mappings_dummy_page = NULL; in vbg_guest_mappings_init()
126 static void vbg_guest_mappings_exit(struct vbg_dev *gdev) in vbg_guest_mappings_exit() argument
131 if (!gdev->guest_mappings) in vbg_guest_mappings_exit()
145 rc = vbg_req_perform(gdev, req); in vbg_guest_mappings_exit()
154 vunmap(gdev->guest_mappings); in vbg_guest_mappings_exit()
155 gdev->guest_mappings = NULL; in vbg_guest_mappings_exit()
157 __free_page(gdev->guest_mappings_dummy_page); in vbg_guest_mappings_exit()
158 gdev->guest_mappings_dummy_page = NULL; in vbg_guest_mappings_exit()
166 static int vbg_report_guest_info(struct vbg_dev *gdev) in vbg_report_guest_info() argument
203 rc = vbg_req_perform(gdev, req2); in vbg_report_guest_info()
205 rc = vbg_req_perform(gdev, req1); in vbg_report_guest_info()
207 rc = vbg_req_perform(gdev, req1); in vbg_report_guest_info()
209 rc = vbg_req_perform(gdev, req2); in vbg_report_guest_info()
228 static int vbg_report_driver_status(struct vbg_dev *gdev, bool active) in vbg_report_driver_status() argument
244 rc = vbg_req_perform(gdev, req); in vbg_report_driver_status()
259 static int vbg_balloon_inflate(struct vbg_dev *gdev, u32 chunk_idx) in vbg_balloon_inflate() argument
261 struct vmmdev_memballoon_change *req = gdev->mem_balloon.change_req; in vbg_balloon_inflate()
285 rc = vbg_req_perform(gdev, req); in vbg_balloon_inflate()
292 gdev->mem_balloon.pages[chunk_idx] = pages; in vbg_balloon_inflate()
310 static int vbg_balloon_deflate(struct vbg_dev *gdev, u32 chunk_idx) in vbg_balloon_deflate() argument
312 struct vmmdev_memballoon_change *req = gdev->mem_balloon.change_req; in vbg_balloon_deflate()
313 struct page **pages = gdev->mem_balloon.pages[chunk_idx]; in vbg_balloon_deflate()
323 rc = vbg_req_perform(gdev, req); in vbg_balloon_deflate()
332 gdev->mem_balloon.pages[chunk_idx] = NULL; in vbg_balloon_deflate()
343 struct vbg_dev *gdev = in vbg_balloon_work() local
345 struct vmmdev_memballoon_info *req = gdev->mem_balloon.get_req; in vbg_balloon_work()
354 rc = vbg_req_perform(gdev, req); in vbg_balloon_work()
364 if (!gdev->mem_balloon.max_chunks) { in vbg_balloon_work()
365 gdev->mem_balloon.pages = in vbg_balloon_work()
366 devm_kcalloc(gdev->dev, req->phys_mem_chunks, in vbg_balloon_work()
368 if (!gdev->mem_balloon.pages) in vbg_balloon_work()
371 gdev->mem_balloon.max_chunks = req->phys_mem_chunks; in vbg_balloon_work()
375 if (chunks > gdev->mem_balloon.max_chunks) { in vbg_balloon_work()
377 __func__, chunks, gdev->mem_balloon.max_chunks); in vbg_balloon_work()
381 if (chunks > gdev->mem_balloon.chunks) { in vbg_balloon_work()
383 for (i = gdev->mem_balloon.chunks; i < chunks; i++) { in vbg_balloon_work()
384 ret = vbg_balloon_inflate(gdev, i); in vbg_balloon_work()
388 gdev->mem_balloon.chunks++; in vbg_balloon_work()
392 for (i = gdev->mem_balloon.chunks; i-- > chunks;) { in vbg_balloon_work()
393 ret = vbg_balloon_deflate(gdev, i); in vbg_balloon_work()
397 gdev->mem_balloon.chunks--; in vbg_balloon_work()
407 struct vbg_dev *gdev = from_timer(gdev, t, heartbeat_timer); in vbg_heartbeat_timer() local
409 vbg_req_perform(gdev, gdev->guest_heartbeat_req); in vbg_heartbeat_timer()
410 mod_timer(&gdev->heartbeat_timer, in vbg_heartbeat_timer()
411 msecs_to_jiffies(gdev->heartbeat_interval_ms)); in vbg_heartbeat_timer()
421 static int vbg_heartbeat_host_config(struct vbg_dev *gdev, bool enabled) in vbg_heartbeat_host_config() argument
432 rc = vbg_req_perform(gdev, req); in vbg_heartbeat_host_config()
434 gdev->heartbeat_interval_ms = req->interval_ns; in vbg_heartbeat_host_config()
445 static int vbg_heartbeat_init(struct vbg_dev *gdev) in vbg_heartbeat_init() argument
450 ret = vbg_heartbeat_host_config(gdev, false); in vbg_heartbeat_init()
454 ret = vbg_heartbeat_host_config(gdev, true); in vbg_heartbeat_init()
458 gdev->guest_heartbeat_req = vbg_req_alloc( in vbg_heartbeat_init()
459 sizeof(*gdev->guest_heartbeat_req), in vbg_heartbeat_init()
461 if (!gdev->guest_heartbeat_req) in vbg_heartbeat_init()
465 __func__, gdev->heartbeat_interval_ms); in vbg_heartbeat_init()
466 mod_timer(&gdev->heartbeat_timer, 0); in vbg_heartbeat_init()
475 static void vbg_heartbeat_exit(struct vbg_dev *gdev) in vbg_heartbeat_exit() argument
477 del_timer_sync(&gdev->heartbeat_timer); in vbg_heartbeat_exit()
478 vbg_heartbeat_host_config(gdev, false); in vbg_heartbeat_exit()
479 vbg_req_free(gdev->guest_heartbeat_req, in vbg_heartbeat_exit()
480 sizeof(*gdev->guest_heartbeat_req)); in vbg_heartbeat_exit()
525 static int vbg_reset_host_event_filter(struct vbg_dev *gdev, in vbg_reset_host_event_filter() argument
537 rc = vbg_req_perform(gdev, req); in vbg_reset_host_event_filter()
561 static int vbg_set_session_event_filter(struct vbg_dev *gdev, in vbg_set_session_event_filter() argument
578 mutex_lock(&gdev->session_mutex); in vbg_set_session_event_filter()
590 vbg_track_bit_usage(&gdev->event_filter_tracker, changed, previous); in vbg_set_session_event_filter()
591 or_mask = gdev->fixed_events | gdev->event_filter_tracker.mask; in vbg_set_session_event_filter()
593 if (gdev->event_filter_host == or_mask || !req) in vbg_set_session_event_filter()
596 gdev->event_filter_host = or_mask; in vbg_set_session_event_filter()
599 rc = vbg_req_perform(gdev, req); in vbg_set_session_event_filter()
604 gdev->event_filter_host = U32_MAX; in vbg_set_session_event_filter()
608 vbg_track_bit_usage(&gdev->event_filter_tracker, changed, in vbg_set_session_event_filter()
614 mutex_unlock(&gdev->session_mutex); in vbg_set_session_event_filter()
625 static int vbg_reset_host_capabilities(struct vbg_dev *gdev) in vbg_reset_host_capabilities() argument
636 rc = vbg_req_perform(gdev, req); in vbg_reset_host_capabilities()
656 static int vbg_set_session_capabilities(struct vbg_dev *gdev, in vbg_set_session_capabilities() argument
673 mutex_lock(&gdev->session_mutex); in vbg_set_session_capabilities()
685 vbg_track_bit_usage(&gdev->guest_caps_tracker, changed, previous); in vbg_set_session_capabilities()
686 or_mask = gdev->guest_caps_tracker.mask; in vbg_set_session_capabilities()
688 if (gdev->guest_caps_host == or_mask || !req) in vbg_set_session_capabilities()
691 gdev->guest_caps_host = or_mask; in vbg_set_session_capabilities()
694 rc = vbg_req_perform(gdev, req); in vbg_set_session_capabilities()
699 gdev->guest_caps_host = U32_MAX; in vbg_set_session_capabilities()
703 vbg_track_bit_usage(&gdev->guest_caps_tracker, changed, in vbg_set_session_capabilities()
709 mutex_unlock(&gdev->session_mutex); in vbg_set_session_capabilities()
720 static int vbg_query_host_version(struct vbg_dev *gdev) in vbg_query_host_version() argument
729 rc = vbg_req_perform(gdev, req); in vbg_query_host_version()
736 snprintf(gdev->host_version, sizeof(gdev->host_version), "%u.%u.%ur%u", in vbg_query_host_version()
738 gdev->host_features = req->features; in vbg_query_host_version()
740 vbg_info("vboxguest: host-version: %s %#x\n", gdev->host_version, in vbg_query_host_version()
741 gdev->host_features); in vbg_query_host_version()
768 int vbg_core_init(struct vbg_dev *gdev, u32 fixed_events) in vbg_core_init() argument
772 gdev->fixed_events = fixed_events | VMMDEV_EVENT_HGCM; in vbg_core_init()
773 gdev->event_filter_host = U32_MAX; /* forces a report */ in vbg_core_init()
774 gdev->guest_caps_host = U32_MAX; /* forces a report */ in vbg_core_init()
776 init_waitqueue_head(&gdev->event_wq); in vbg_core_init()
777 init_waitqueue_head(&gdev->hgcm_wq); in vbg_core_init()
778 spin_lock_init(&gdev->event_spinlock); in vbg_core_init()
779 mutex_init(&gdev->session_mutex); in vbg_core_init()
780 mutex_init(&gdev->cancel_req_mutex); in vbg_core_init()
781 timer_setup(&gdev->heartbeat_timer, vbg_heartbeat_timer, 0); in vbg_core_init()
782 INIT_WORK(&gdev->mem_balloon.work, vbg_balloon_work); in vbg_core_init()
784 gdev->mem_balloon.get_req = in vbg_core_init()
785 vbg_req_alloc(sizeof(*gdev->mem_balloon.get_req), in vbg_core_init()
787 gdev->mem_balloon.change_req = in vbg_core_init()
788 vbg_req_alloc(sizeof(*gdev->mem_balloon.change_req), in vbg_core_init()
790 gdev->cancel_req = in vbg_core_init()
791 vbg_req_alloc(sizeof(*(gdev->cancel_req)), in vbg_core_init()
793 gdev->ack_events_req = in vbg_core_init()
794 vbg_req_alloc(sizeof(*gdev->ack_events_req), in vbg_core_init()
796 gdev->mouse_status_req = in vbg_core_init()
797 vbg_req_alloc(sizeof(*gdev->mouse_status_req), in vbg_core_init()
800 if (!gdev->mem_balloon.get_req || !gdev->mem_balloon.change_req || in vbg_core_init()
801 !gdev->cancel_req || !gdev->ack_events_req || in vbg_core_init()
802 !gdev->mouse_status_req) in vbg_core_init()
805 ret = vbg_query_host_version(gdev); in vbg_core_init()
809 ret = vbg_report_guest_info(gdev); in vbg_core_init()
815 ret = vbg_reset_host_event_filter(gdev, gdev->fixed_events); in vbg_core_init()
822 ret = vbg_reset_host_capabilities(gdev); in vbg_core_init()
829 ret = vbg_core_set_mouse_status(gdev, 0); in vbg_core_init()
836 vbg_guest_mappings_init(gdev); in vbg_core_init()
837 vbg_heartbeat_init(gdev); in vbg_core_init()
840 ret = vbg_report_driver_status(gdev, true); in vbg_core_init()
847 vbg_req_free(gdev->mouse_status_req, in vbg_core_init()
848 sizeof(*gdev->mouse_status_req)); in vbg_core_init()
849 vbg_req_free(gdev->ack_events_req, in vbg_core_init()
850 sizeof(*gdev->ack_events_req)); in vbg_core_init()
851 vbg_req_free(gdev->cancel_req, in vbg_core_init()
852 sizeof(*gdev->cancel_req)); in vbg_core_init()
853 vbg_req_free(gdev->mem_balloon.change_req, in vbg_core_init()
854 sizeof(*gdev->mem_balloon.change_req)); in vbg_core_init()
855 vbg_req_free(gdev->mem_balloon.get_req, in vbg_core_init()
856 sizeof(*gdev->mem_balloon.get_req)); in vbg_core_init()
867 void vbg_core_exit(struct vbg_dev *gdev) in vbg_core_exit() argument
869 vbg_heartbeat_exit(gdev); in vbg_core_exit()
870 vbg_guest_mappings_exit(gdev); in vbg_core_exit()
873 vbg_reset_host_event_filter(gdev, 0); in vbg_core_exit()
874 vbg_reset_host_capabilities(gdev); in vbg_core_exit()
875 vbg_core_set_mouse_status(gdev, 0); in vbg_core_exit()
877 vbg_req_free(gdev->mouse_status_req, in vbg_core_exit()
878 sizeof(*gdev->mouse_status_req)); in vbg_core_exit()
879 vbg_req_free(gdev->ack_events_req, in vbg_core_exit()
880 sizeof(*gdev->ack_events_req)); in vbg_core_exit()
881 vbg_req_free(gdev->cancel_req, in vbg_core_exit()
882 sizeof(*gdev->cancel_req)); in vbg_core_exit()
883 vbg_req_free(gdev->mem_balloon.change_req, in vbg_core_exit()
884 sizeof(*gdev->mem_balloon.change_req)); in vbg_core_exit()
885 vbg_req_free(gdev->mem_balloon.get_req, in vbg_core_exit()
886 sizeof(*gdev->mem_balloon.get_req)); in vbg_core_exit()
897 struct vbg_session *vbg_core_open_session(struct vbg_dev *gdev, bool user) in vbg_core_open_session() argument
905 session->gdev = gdev; in vbg_core_open_session()
917 struct vbg_dev *gdev = session->gdev; in vbg_core_close_session() local
920 vbg_set_session_capabilities(gdev, session, 0, U32_MAX, true); in vbg_core_close_session()
921 vbg_set_session_event_filter(gdev, session, 0, U32_MAX, true); in vbg_core_close_session()
927 vbg_hgcm_disconnect(gdev, session->hgcm_client_ids[i], &rc); in vbg_core_close_session()
975 static bool vbg_wait_event_cond(struct vbg_dev *gdev, in vbg_wait_event_cond() argument
983 spin_lock_irqsave(&gdev->event_spinlock, flags); in vbg_wait_event_cond()
985 events = gdev->pending_events & event_mask; in vbg_wait_event_cond()
988 spin_unlock_irqrestore(&gdev->event_spinlock, flags); in vbg_wait_event_cond()
994 static u32 vbg_consume_events_locked(struct vbg_dev *gdev, in vbg_consume_events_locked() argument
998 u32 events = gdev->pending_events & event_mask; in vbg_consume_events_locked()
1000 gdev->pending_events &= ~events; in vbg_consume_events_locked()
1004 static int vbg_ioctl_wait_for_events(struct vbg_dev *gdev, in vbg_ioctl_wait_for_events() argument
1025 gdev->event_wq, in vbg_ioctl_wait_for_events()
1026 vbg_wait_event_cond(gdev, session, event_mask), in vbg_ioctl_wait_for_events()
1029 spin_lock_irqsave(&gdev->event_spinlock, flags); in vbg_ioctl_wait_for_events()
1037 vbg_consume_events_locked(gdev, session, event_mask); in vbg_ioctl_wait_for_events()
1040 spin_unlock_irqrestore(&gdev->event_spinlock, flags); in vbg_ioctl_wait_for_events()
1051 static int vbg_ioctl_interrupt_all_wait_events(struct vbg_dev *gdev, in vbg_ioctl_interrupt_all_wait_events() argument
1060 spin_lock_irqsave(&gdev->event_spinlock, flags); in vbg_ioctl_interrupt_all_wait_events()
1062 spin_unlock_irqrestore(&gdev->event_spinlock, flags); in vbg_ioctl_interrupt_all_wait_events()
1064 wake_up(&gdev->event_wq); in vbg_ioctl_interrupt_all_wait_events()
1076 static int vbg_req_allowed(struct vbg_dev *gdev, struct vbg_session *session, in vbg_req_allowed() argument
1164 static int vbg_ioctl_vmmrequest(struct vbg_dev *gdev, in vbg_ioctl_vmmrequest() argument
1179 ret = vbg_req_allowed(gdev, session, data); in vbg_ioctl_vmmrequest()
1183 vbg_req_perform(gdev, data); in vbg_ioctl_vmmrequest()
1189 static int vbg_ioctl_hgcm_connect(struct vbg_dev *gdev, in vbg_ioctl_hgcm_connect() argument
1200 mutex_lock(&gdev->session_mutex); in vbg_ioctl_hgcm_connect()
1207 mutex_unlock(&gdev->session_mutex); in vbg_ioctl_hgcm_connect()
1212 ret = vbg_hgcm_connect(gdev, &conn->u.in.loc, &client_id, in vbg_ioctl_hgcm_connect()
1215 mutex_lock(&gdev->session_mutex); in vbg_ioctl_hgcm_connect()
1223 mutex_unlock(&gdev->session_mutex); in vbg_ioctl_hgcm_connect()
1228 static int vbg_ioctl_hgcm_disconnect(struct vbg_dev *gdev, in vbg_ioctl_hgcm_disconnect() argument
1242 mutex_lock(&gdev->session_mutex); in vbg_ioctl_hgcm_disconnect()
1249 mutex_unlock(&gdev->session_mutex); in vbg_ioctl_hgcm_disconnect()
1254 ret = vbg_hgcm_disconnect(gdev, client_id, &disconn->hdr.rc); in vbg_ioctl_hgcm_disconnect()
1256 mutex_lock(&gdev->session_mutex); in vbg_ioctl_hgcm_disconnect()
1261 mutex_unlock(&gdev->session_mutex); in vbg_ioctl_hgcm_disconnect()
1266 static int vbg_ioctl_hgcm_call(struct vbg_dev *gdev, in vbg_ioctl_hgcm_call() argument
1304 mutex_lock(&gdev->session_mutex); in vbg_ioctl_hgcm_call()
1308 mutex_unlock(&gdev->session_mutex); in vbg_ioctl_hgcm_call()
1316 ret = vbg_hgcm_call32(gdev, client_id, in vbg_ioctl_hgcm_call()
1321 ret = vbg_hgcm_call(gdev, client_id, in vbg_ioctl_hgcm_call()
1349 static int vbg_ioctl_change_filter_mask(struct vbg_dev *gdev, in vbg_ioctl_change_filter_mask() argument
1364 return vbg_set_session_event_filter(gdev, session, or_mask, not_mask, in vbg_ioctl_change_filter_mask()
1368 static int vbg_ioctl_change_guest_capabilities(struct vbg_dev *gdev, in vbg_ioctl_change_guest_capabilities() argument
1383 ret = vbg_set_session_capabilities(gdev, session, or_mask, not_mask, in vbg_ioctl_change_guest_capabilities()
1389 caps->u.out.global_caps = gdev->guest_caps_host; in vbg_ioctl_change_guest_capabilities()
1394 static int vbg_ioctl_check_balloon(struct vbg_dev *gdev, in vbg_ioctl_check_balloon() argument
1400 balloon_info->u.out.balloon_chunks = gdev->mem_balloon.chunks; in vbg_ioctl_check_balloon()
1410 static int vbg_ioctl_write_core_dump(struct vbg_dev *gdev, in vbg_ioctl_write_core_dump() argument
1423 dump->hdr.rc = vbg_req_perform(gdev, req); in vbg_ioctl_write_core_dump()
1439 struct vbg_dev *gdev = session->gdev; in vbg_core_ioctl() local
1455 return vbg_ioctl_vmmrequest(gdev, session, data); in vbg_core_ioctl()
1465 return vbg_ioctl_hgcm_connect(gdev, session, data); in vbg_core_ioctl()
1467 return vbg_ioctl_hgcm_disconnect(gdev, session, data); in vbg_core_ioctl()
1469 return vbg_ioctl_wait_for_events(gdev, session, data); in vbg_core_ioctl()
1471 return vbg_ioctl_interrupt_all_wait_events(gdev, session, data); in vbg_core_ioctl()
1473 return vbg_ioctl_change_filter_mask(gdev, session, data); in vbg_core_ioctl()
1475 return vbg_ioctl_change_guest_capabilities(gdev, session, data); in vbg_core_ioctl()
1477 return vbg_ioctl_check_balloon(gdev, data); in vbg_core_ioctl()
1479 return vbg_ioctl_write_core_dump(gdev, data); in vbg_core_ioctl()
1490 return vbg_ioctl_hgcm_call(gdev, session, f32bit, data); in vbg_core_ioctl()
1506 int vbg_core_set_mouse_status(struct vbg_dev *gdev, u32 features) in vbg_core_set_mouse_status() argument
1519 rc = vbg_req_perform(gdev, req); in vbg_core_set_mouse_status()
1530 struct vbg_dev *gdev = dev_id; in vbg_core_isr() local
1531 struct vmmdev_events *req = gdev->ack_events_req; in vbg_core_isr()
1537 if (!gdev->mmio->V.V1_04.have_events) in vbg_core_isr()
1543 rc = vbg_req_perform(gdev, req); in vbg_core_isr()
1557 wake_up(&gdev->hgcm_wq); in vbg_core_isr()
1562 schedule_work(&gdev->mem_balloon.work); in vbg_core_isr()
1567 spin_lock_irqsave(&gdev->event_spinlock, flags); in vbg_core_isr()
1568 gdev->pending_events |= events; in vbg_core_isr()
1569 spin_unlock_irqrestore(&gdev->event_spinlock, flags); in vbg_core_isr()
1571 wake_up(&gdev->event_wq); in vbg_core_isr()
1575 vbg_linux_mouse_event(gdev); in vbg_core_isr()