summaryrefslogtreecommitdiffstats
path: root/qemu/ui/vnc-jobs.h
blob: 044bf9fbfd5688d10581dcc0a5066a8d6e683160 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
/*
 * QEMU VNC display driver
 *
 * From libvncserver/rfb/rfbproto.h
 * Copyright (C) 2005 Rohit Kumar, Johannes E. Schindelin
 * Copyright (C) 2000-2002 Constantin Kaplinsky.  All Rights Reserved.
 * Copyright (C) 2000 Tridia Corporation.  All Rights Reserved.
 * Copyright (C) 1999 AT&T Laboratories Cambridge.  All Rights Reserved.
 *
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

#ifndef VNC_JOBS_H
#define VNC_JOBS_H

/* Jobs */
VncJob *vnc_job_new(VncState *vs);
int vnc_job_add_rect(VncJob *job, int x, int y, int w, int h);
void vnc_job_push(VncJob *job);
bool vnc_has_job(VncState *vs);
void vnc_jobs_clear(VncState *vs);
void vnc_jobs_join(VncState *vs);

void vnc_jobs_consume_buffer(VncState *vs);
void vnc_start_worker_thread(void);

/* Locks */
static inline int vnc_trylock_display(VncDisplay *vd)
{
    return qemu_mutex_trylock(&vd->mutex);
}

static inline void vnc_lock_display(VncDisplay *vd)
{
    qemu_mutex_lock(&vd->mutex);
}

static inline void vnc_unlock_display(VncDisplay *vd)
{
    qemu_mutex_unlock(&vd->mutex);
}

static inline void vnc_lock_output(VncState *vs)
{
    qemu_mutex_lock(&vs->output_mutex);
}

static inline void vnc_unlock_output(VncState *vs)
{
    qemu_mutex_unlock(&vs->output_mutex);
}

#endif /* VNC_JOBS_H */
= irq_remapping_disable_io_apic; } static __init int setup_nointremap(char *str) { disable_irq_remap = 1; return 0; } early_param("nointremap", setup_nointremap); static __init int setup_irqremap(char *str) { if (!str) return -EINVAL; while (*str) { if (!strncmp(str, "on", 2)) { disable_irq_remap = 0; disable_irq_post = 0; } else if (!strncmp(str, "off", 3)) { disable_irq_remap = 1; disable_irq_post = 1; } else if (!strncmp(str, "nosid", 5)) disable_sourceid_checking = 1; else if (!strncmp(str, "no_x2apic_optout", 16)) no_x2apic_optout = 1; else if (!strncmp(str, "nopost", 6)) disable_irq_post = 1; str += strcspn(str, ","); while (*str == ',') str++; } return 0; } early_param("intremap", setup_irqremap); void set_irq_remapping_broken(void) { irq_remap_broken = 1; } bool irq_remapping_cap(enum irq_remap_cap cap) { if (!remap_ops || disable_irq_post) return false; return (remap_ops->capability & (1 << cap)); } EXPORT_SYMBOL_GPL(irq_remapping_cap); int __init irq_remapping_prepare(void) { if (disable_irq_remap) return -ENOSYS; if (intel_irq_remap_ops.prepare() == 0) remap_ops = &intel_irq_remap_ops; else if (IS_ENABLED(CONFIG_AMD_IOMMU) && amd_iommu_irq_ops.prepare() == 0) remap_ops = &amd_iommu_irq_ops; else return -ENOSYS; return 0; } int __init irq_remapping_enable(void) { int ret; if (!remap_ops->enable) return -ENODEV; ret = remap_ops->enable(); if (irq_remapping_enabled) irq_remapping_modify_x86_ops(); return ret; } void irq_remapping_disable(void) { if (irq_remapping_enabled && remap_ops->disable) remap_ops->disable(); } int irq_remapping_reenable(int mode) { if (irq_remapping_enabled && remap_ops->reenable) return remap_ops->reenable(mode); return 0; } int __init irq_remap_enable_fault_handling(void) { if (!irq_remapping_enabled) return 0; if (!remap_ops->enable_faulting) return -ENODEV; return remap_ops->enable_faulting(); } void panic_if_irq_remap(const char *msg) { if (irq_remapping_enabled) panic(msg); } void ir_ack_apic_edge(struct irq_data *data) { ack_APIC_irq(); } /** * irq_remapping_get_ir_irq_domain - Get the irqdomain associated with the IOMMU * device serving request @info * @info: interrupt allocation information, used to identify the IOMMU device * * It's used to get parent irqdomain for HPET and IOAPIC irqdomains. * Returns pointer to IRQ domain, or NULL on failure. */ struct irq_domain * irq_remapping_get_ir_irq_domain(struct irq_alloc_info *info) { if (!remap_ops || !remap_ops->get_ir_irq_domain) return NULL; return remap_ops->get_ir_irq_domain(info); } /** * irq_remapping_get_irq_domain - Get the irqdomain serving the request @info * @info: interrupt allocation information, used to identify the IOMMU device * * There will be one PCI MSI/MSIX irqdomain associated with each interrupt * remapping device, so this interface is used to retrieve the PCI MSI/MSIX * irqdomain serving request @info. * Returns pointer to IRQ domain, or NULL on failure. */ struct irq_domain * irq_remapping_get_irq_domain(struct irq_alloc_info *info) { if (!remap_ops || !remap_ops->get_irq_domain) return NULL; return remap_ops->get_irq_domain(info); }