mirror of
https://github.com/izzy2lost/xemu.git
synced 2026-07-06 00:20:22 -07:00
Merge tag 'for_upstream' of https://git.kernel.org/pub/scm/virt/kvm/mst/qemu into staging
pc,pci,virtio: cleanups, fixes, features vhost-user-gpu: edid vhost-user-scmi device vhost-vdpa: _F_CTRL_RX and _F_CTRL_RX_EXTRA support for svq cleanups, fixes all over the place. Signed-off-by: Michael S. Tsirkin <mst@redhat.com> # -----BEGIN PGP SIGNATURE----- # # iQFDBAABCAAtFiEEXQn9CHHI+FuUyooNKB8NuNKNVGkFAmSsjYMPHG1zdEByZWRo # YXQuY29tAAoJECgfDbjSjVRp2vYH/20u6TAMssE/UAJoUU0ypbJkbHjDqiqDeuZN # qDYazLUWIJTUbDnSfXAiRcdJuukEpEFcoHa9O6vgFE/SNod51IrvsJR9CbZxNmk6 # D+Px9dkMckDE/yb8f6hhcHsi7/1v04I0oSXmJTVYxWSKQhD4Km6x8Larqsh0u4yd # n6laZ+VK5H8sk6QvI5vMz+lYavACQVryiWV/GAigP21B0eQK79I5/N6y0q8/axD5 # cpeTzUF+m33SfLfyd7PPmibCQFYrHDwosynSnr3qnKusPRJt2FzWkzOiZgbtgE2L # UQ/S4sYTBy8dZJMc0wTywbs1bSwzNrkQ+uS0v74z9wCUYTgvQTA= # =RsOh # -----END PGP SIGNATURE----- # gpg: Signature made Tue 11 Jul 2023 12:00:19 AM BST # gpg: using RSA key 5D09FD0871C8F85B94CA8A0D281F0DB8D28D5469 # gpg: issuer "mst@redhat.com" # gpg: Good signature from "Michael S. Tsirkin <mst@kernel.org>" [undefined] # gpg: aka "Michael S. Tsirkin <mst@redhat.com>" [undefined] # gpg: WARNING: This key is not certified with a trusted signature! # gpg: There is no indication that the signature belongs to the owner. # Primary key fingerprint: 0270 606B 6F3C DF3D 0B17 0970 C350 3912 AFBE 8E67 # Subkey fingerprint: 5D09 FD08 71C8 F85B 94CA 8A0D 281F 0DB8 D28D 5469 * tag 'for_upstream' of https://git.kernel.org/pub/scm/virt/kvm/mst/qemu: (66 commits) vdpa: Allow VIRTIO_NET_F_CTRL_RX_EXTRA in SVQ vdpa: Restore packet receive filtering state relative with _F_CTRL_RX_EXTRA feature vdpa: Allow VIRTIO_NET_F_CTRL_RX in SVQ vdpa: Avoid forwarding large CVQ command failures vdpa: Accessing CVQ header through its structure vhost: Fix false positive out-of-bounds vdpa: Restore packet receive filtering state relative with _F_CTRL_RX feature vdpa: Restore MAC address filtering state vdpa: Use iovec for vhost_vdpa_net_load_cmd() pcie: Specify 0 for ARI next function numbers pcie: Use common ARI next function number include/hw/virtio: document some more usage of notifiers include/hw/virtio: add kerneldoc for virtio_init include/hw/virtio: document virtio_notify_config hw/virtio: fix typo in VIRTIO_CONFIG_IRQ_IDX comments include/hw: document the device_class_set_parent_* fns include: attempt to document device_class_set_props vdpa: Fix possible use-after-free for VirtQueueElement pcie: Add hotplug detect state register to cmask virtio-iommu: Rework the traces in virtio_iommu_set_page_size_mask() ... Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
@@ -2215,6 +2215,13 @@ F: hw/virtio/vhost-user-gpio*
|
||||
F: include/hw/virtio/vhost-user-gpio.h
|
||||
F: tests/qtest/libqos/virtio-gpio.*
|
||||
|
||||
vhost-user-scmi
|
||||
R: mzamazal@redhat.com
|
||||
S: Supported
|
||||
F: hw/virtio/vhost-user-scmi*
|
||||
F: include/hw/virtio/vhost-user-scmi.h
|
||||
F: tests/qtest/libqos/virtio-scmi.*
|
||||
|
||||
virtio-crypto
|
||||
M: Gonglei <arei.gonglei@huawei.com>
|
||||
S: Supported
|
||||
|
||||
@@ -303,6 +303,53 @@ vg_get_display_info(VuGpu *vg, struct virtio_gpu_ctrl_command *cmd)
|
||||
cmd->state = VG_CMD_STATE_PENDING;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
get_edid_cb(gint fd, GIOCondition condition, gpointer user_data)
|
||||
{
|
||||
struct virtio_gpu_resp_edid resp_edid;
|
||||
VuGpu *vg = user_data;
|
||||
struct virtio_gpu_ctrl_command *cmd = QTAILQ_LAST(&vg->fenceq);
|
||||
|
||||
g_debug("get edid cb");
|
||||
assert(cmd->cmd_hdr.type == VIRTIO_GPU_CMD_GET_EDID);
|
||||
if (!vg_recv_msg(vg, VHOST_USER_GPU_GET_EDID,
|
||||
sizeof(resp_edid), &resp_edid)) {
|
||||
return G_SOURCE_CONTINUE;
|
||||
}
|
||||
|
||||
QTAILQ_REMOVE(&vg->fenceq, cmd, next);
|
||||
vg_ctrl_response(vg, cmd, &resp_edid.hdr, sizeof(resp_edid));
|
||||
|
||||
vg->wait_in = 0;
|
||||
vg_handle_ctrl(&vg->dev.parent, 0);
|
||||
|
||||
return G_SOURCE_REMOVE;
|
||||
}
|
||||
|
||||
void
|
||||
vg_get_edid(VuGpu *vg, struct virtio_gpu_ctrl_command *cmd)
|
||||
{
|
||||
struct virtio_gpu_cmd_get_edid get_edid;
|
||||
|
||||
VUGPU_FILL_CMD(get_edid);
|
||||
virtio_gpu_bswap_32(&get_edid, sizeof(get_edid));
|
||||
|
||||
VhostUserGpuMsg msg = {
|
||||
.request = VHOST_USER_GPU_GET_EDID,
|
||||
.size = sizeof(VhostUserGpuEdidRequest),
|
||||
.payload.edid_req = {
|
||||
.scanout_id = get_edid.scanout,
|
||||
},
|
||||
};
|
||||
|
||||
assert(vg->wait_in == 0);
|
||||
|
||||
vg_send_msg(vg, &msg, -1);
|
||||
vg->wait_in = g_unix_fd_add(vg->sock_fd, G_IO_IN | G_IO_HUP,
|
||||
get_edid_cb, vg);
|
||||
cmd->state = VG_CMD_STATE_PENDING;
|
||||
}
|
||||
|
||||
static void
|
||||
vg_resource_create_2d(VuGpu *g,
|
||||
struct virtio_gpu_ctrl_command *cmd)
|
||||
@@ -837,8 +884,9 @@ vg_process_cmd(VuGpu *vg, struct virtio_gpu_ctrl_command *cmd)
|
||||
case VIRTIO_GPU_CMD_RESOURCE_DETACH_BACKING:
|
||||
vg_resource_detach_backing(vg, cmd);
|
||||
break;
|
||||
/* case VIRTIO_GPU_CMD_GET_EDID: */
|
||||
/* break */
|
||||
case VIRTIO_GPU_CMD_GET_EDID:
|
||||
vg_get_edid(vg, cmd);
|
||||
break;
|
||||
default:
|
||||
g_warning("TODO handle ctrl %x\n", cmd->cmd_hdr.type);
|
||||
cmd->error = VIRTIO_GPU_RESP_ERR_UNSPEC;
|
||||
@@ -1022,26 +1070,36 @@ vg_queue_set_started(VuDev *dev, int qidx, bool started)
|
||||
static gboolean
|
||||
protocol_features_cb(gint fd, GIOCondition condition, gpointer user_data)
|
||||
{
|
||||
const uint64_t protocol_edid = (1 << VHOST_USER_GPU_PROTOCOL_F_EDID);
|
||||
VuGpu *g = user_data;
|
||||
uint64_t u64;
|
||||
uint64_t protocol_features;
|
||||
VhostUserGpuMsg msg = {
|
||||
.request = VHOST_USER_GPU_GET_PROTOCOL_FEATURES
|
||||
};
|
||||
|
||||
if (!vg_recv_msg(g, msg.request, sizeof(u64), &u64)) {
|
||||
if (!vg_recv_msg(g, msg.request,
|
||||
sizeof(protocol_features), &protocol_features)) {
|
||||
return G_SOURCE_CONTINUE;
|
||||
}
|
||||
|
||||
protocol_features &= protocol_edid;
|
||||
|
||||
msg = (VhostUserGpuMsg) {
|
||||
.request = VHOST_USER_GPU_SET_PROTOCOL_FEATURES,
|
||||
.size = sizeof(uint64_t),
|
||||
.payload.u64 = 0
|
||||
.payload.u64 = protocol_features,
|
||||
};
|
||||
vg_send_msg(g, &msg, -1);
|
||||
|
||||
g->wait_in = 0;
|
||||
vg_handle_ctrl(&g->dev.parent, 0);
|
||||
|
||||
if (g->edid_inited && !(protocol_features & protocol_edid)) {
|
||||
g_printerr("EDID feature set by the frontend but it does not support "
|
||||
"the EDID vhost-user-gpu protocol.\n");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
return G_SOURCE_REMOVE;
|
||||
}
|
||||
|
||||
@@ -1049,7 +1107,7 @@ static void
|
||||
set_gpu_protocol_features(VuGpu *g)
|
||||
{
|
||||
VhostUserGpuMsg msg = {
|
||||
.request = VHOST_USER_GPU_GET_PROTOCOL_FEATURES
|
||||
.request = VHOST_USER_GPU_GET_PROTOCOL_FEATURES,
|
||||
};
|
||||
|
||||
vg_send_msg(g, &msg, -1);
|
||||
@@ -1086,6 +1144,7 @@ vg_get_features(VuDev *dev)
|
||||
if (opt_virgl) {
|
||||
features |= 1 << VIRTIO_GPU_F_VIRGL;
|
||||
}
|
||||
features |= 1 << VIRTIO_GPU_F_EDID;
|
||||
|
||||
return features;
|
||||
}
|
||||
@@ -1103,6 +1162,8 @@ vg_set_features(VuDev *dev, uint64_t features)
|
||||
g->virgl_inited = true;
|
||||
}
|
||||
|
||||
g->edid_inited = !!(features & (1 << VIRTIO_GPU_F_EDID));
|
||||
|
||||
g->virgl = virgl;
|
||||
}
|
||||
|
||||
|
||||
@@ -495,6 +495,9 @@ void vg_virgl_process_cmd(VuGpu *g, struct virtio_gpu_ctrl_command *cmd)
|
||||
case VIRTIO_GPU_CMD_GET_DISPLAY_INFO:
|
||||
vg_get_display_info(g, cmd);
|
||||
break;
|
||||
case VIRTIO_GPU_CMD_GET_EDID:
|
||||
vg_get_edid(g, cmd);
|
||||
break;
|
||||
default:
|
||||
g_debug("TODO handle ctrl %x\n", cmd->cmd_hdr.type);
|
||||
cmd->error = VIRTIO_GPU_RESP_ERR_UNSPEC;
|
||||
|
||||
@@ -36,6 +36,7 @@ typedef enum VhostUserGpuRequest {
|
||||
VHOST_USER_GPU_UPDATE,
|
||||
VHOST_USER_GPU_DMABUF_SCANOUT,
|
||||
VHOST_USER_GPU_DMABUF_UPDATE,
|
||||
VHOST_USER_GPU_GET_EDID,
|
||||
} VhostUserGpuRequest;
|
||||
|
||||
typedef struct VhostUserGpuDisplayInfoReply {
|
||||
@@ -83,6 +84,10 @@ typedef struct VhostUserGpuDMABUFScanout {
|
||||
int fd_drm_fourcc;
|
||||
} QEMU_PACKED VhostUserGpuDMABUFScanout;
|
||||
|
||||
typedef struct VhostUserGpuEdidRequest {
|
||||
uint32_t scanout_id;
|
||||
} QEMU_PACKED VhostUserGpuEdidRequest;
|
||||
|
||||
typedef struct VhostUserGpuMsg {
|
||||
uint32_t request; /* VhostUserGpuRequest */
|
||||
uint32_t flags;
|
||||
@@ -93,6 +98,8 @@ typedef struct VhostUserGpuMsg {
|
||||
VhostUserGpuScanout scanout;
|
||||
VhostUserGpuUpdate update;
|
||||
VhostUserGpuDMABUFScanout dmabuf_scanout;
|
||||
VhostUserGpuEdidRequest edid_req;
|
||||
struct virtio_gpu_resp_edid resp_edid;
|
||||
struct virtio_gpu_resp_display_info display_info;
|
||||
uint64_t u64;
|
||||
} payload;
|
||||
@@ -104,6 +111,8 @@ static VhostUserGpuMsg m __attribute__ ((unused));
|
||||
|
||||
#define VHOST_USER_GPU_MSG_FLAG_REPLY 0x4
|
||||
|
||||
#define VHOST_USER_GPU_PROTOCOL_F_EDID 0
|
||||
|
||||
struct virtio_gpu_scanout {
|
||||
uint32_t width, height;
|
||||
int x, y;
|
||||
@@ -122,6 +131,7 @@ typedef struct VuGpu {
|
||||
|
||||
bool virgl;
|
||||
bool virgl_inited;
|
||||
bool edid_inited;
|
||||
uint32_t inflight;
|
||||
|
||||
struct virtio_gpu_scanout scanout[VIRTIO_GPU_MAX_SCANOUTS];
|
||||
@@ -171,6 +181,7 @@ int vg_create_mapping_iov(VuGpu *g,
|
||||
struct iovec **iov);
|
||||
void vg_cleanup_mapping_iov(VuGpu *g, struct iovec *iov, uint32_t count);
|
||||
void vg_get_display_info(VuGpu *vg, struct virtio_gpu_ctrl_command *cmd);
|
||||
void vg_get_edid(VuGpu *vg, struct virtio_gpu_ctrl_command *cmd);
|
||||
|
||||
void vg_wait_ok(VuGpu *g);
|
||||
|
||||
|
||||
@@ -124,6 +124,16 @@ VhostUserGpuDMABUFScanout
|
||||
:fourcc: ``i32``, the DMABUF fourcc
|
||||
|
||||
|
||||
VhostUserGpuEdidRequest
|
||||
^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
+------------+
|
||||
| scanout-id |
|
||||
+------------+
|
||||
|
||||
:scanout-id: ``u32``, the scanout to get edid from
|
||||
|
||||
|
||||
C structure
|
||||
-----------
|
||||
|
||||
@@ -141,6 +151,8 @@ In QEMU the vhost-user-gpu message is implemented with the following struct:
|
||||
VhostUserGpuScanout scanout;
|
||||
VhostUserGpuUpdate update;
|
||||
VhostUserGpuDMABUFScanout dmabuf_scanout;
|
||||
VhostUserGpuEdidRequest edid_req;
|
||||
struct virtio_gpu_resp_edid resp_edid;
|
||||
struct virtio_gpu_resp_display_info display_info;
|
||||
uint64_t u64;
|
||||
} payload;
|
||||
@@ -149,10 +161,11 @@ In QEMU the vhost-user-gpu message is implemented with the following struct:
|
||||
Protocol features
|
||||
-----------------
|
||||
|
||||
None yet.
|
||||
.. code:: c
|
||||
|
||||
As the protocol may need to evolve, new messages and communication
|
||||
changes are negotiated thanks to preliminary
|
||||
#define VHOST_USER_GPU_PROTOCOL_F_EDID 0
|
||||
|
||||
New messages and communication changes are negotiated thanks to the
|
||||
``VHOST_USER_GPU_GET_PROTOCOL_FEATURES`` and
|
||||
``VHOST_USER_GPU_SET_PROTOCOL_FEATURES`` requests.
|
||||
|
||||
@@ -241,3 +254,12 @@ Message types
|
||||
Note: there is no data payload, since the scanout is shared thanks
|
||||
to DMABUF, that must have been set previously with
|
||||
``VHOST_USER_GPU_DMABUF_SCANOUT``.
|
||||
|
||||
``VHOST_USER_GPU_GET_EDID``
|
||||
:id: 11
|
||||
:request payload: ``struct VhostUserGpuEdidRequest``
|
||||
:reply payload: ``struct virtio_gpu_resp_edid`` (from virtio specification)
|
||||
|
||||
Retrieve the EDID data for a given scanout.
|
||||
This message requires the ``VHOST_USER_GPU_PROTOCOL_F_EDID`` protocol
|
||||
feature to be supported.
|
||||
|
||||
+2
-2
@@ -48,7 +48,7 @@ setting up a BAR for a VF.
|
||||
...
|
||||
int ret = pcie_endpoint_cap_init(d, 0x70);
|
||||
...
|
||||
pcie_ari_init(d, 0x100, 1);
|
||||
pcie_ari_init(d, 0x100);
|
||||
...
|
||||
|
||||
/* Add and initialize the SR/IOV capability */
|
||||
@@ -78,7 +78,7 @@ setting up a BAR for a VF.
|
||||
...
|
||||
int ret = pcie_endpoint_cap_init(d, 0x60);
|
||||
...
|
||||
pcie_ari_init(d, 0x100, 1);
|
||||
pcie_ari_init(d, 0x100);
|
||||
...
|
||||
memory_region_init(mr, ... )
|
||||
pcie_sriov_vf_register_bar(d, bar_nr, mr);
|
||||
|
||||
@@ -197,3 +197,13 @@ void machine_parse_smp_config(MachineState *ms,
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
unsigned int machine_topo_get_cores_per_socket(const MachineState *ms)
|
||||
{
|
||||
return ms->smp.cores * ms->smp.clusters * ms->smp.dies;
|
||||
}
|
||||
|
||||
unsigned int machine_topo_get_threads_per_socket(const MachineState *ms)
|
||||
{
|
||||
return ms->smp.threads * machine_topo_get_cores_per_socket(ms);
|
||||
}
|
||||
|
||||
@@ -41,6 +41,7 @@
|
||||
|
||||
GlobalProperty hw_compat_8_0[] = {
|
||||
{ "migration", "multifd-flush-after-each-section", "on"},
|
||||
{ TYPE_PCI_DEVICE, "x-pcie-ari-nextfn-1", "on" },
|
||||
};
|
||||
const size_t hw_compat_8_0_len = G_N_ELEMENTS(hw_compat_8_0);
|
||||
|
||||
|
||||
@@ -31,6 +31,7 @@ typedef enum VhostUserGpuRequest {
|
||||
VHOST_USER_GPU_UPDATE,
|
||||
VHOST_USER_GPU_DMABUF_SCANOUT,
|
||||
VHOST_USER_GPU_DMABUF_UPDATE,
|
||||
VHOST_USER_GPU_GET_EDID,
|
||||
} VhostUserGpuRequest;
|
||||
|
||||
typedef struct VhostUserGpuDisplayInfoReply {
|
||||
@@ -78,6 +79,10 @@ typedef struct VhostUserGpuDMABUFScanout {
|
||||
int fd_drm_fourcc;
|
||||
} QEMU_PACKED VhostUserGpuDMABUFScanout;
|
||||
|
||||
typedef struct VhostUserGpuEdidRequest {
|
||||
uint32_t scanout_id;
|
||||
} QEMU_PACKED VhostUserGpuEdidRequest;
|
||||
|
||||
typedef struct VhostUserGpuMsg {
|
||||
uint32_t request; /* VhostUserGpuRequest */
|
||||
uint32_t flags;
|
||||
@@ -88,6 +93,8 @@ typedef struct VhostUserGpuMsg {
|
||||
VhostUserGpuScanout scanout;
|
||||
VhostUserGpuUpdate update;
|
||||
VhostUserGpuDMABUFScanout dmabuf_scanout;
|
||||
VhostUserGpuEdidRequest edid_req;
|
||||
struct virtio_gpu_resp_edid resp_edid;
|
||||
struct virtio_gpu_resp_display_info display_info;
|
||||
uint64_t u64;
|
||||
} payload;
|
||||
@@ -99,6 +106,8 @@ static VhostUserGpuMsg m __attribute__ ((unused));
|
||||
|
||||
#define VHOST_USER_GPU_MSG_FLAG_REPLY 0x4
|
||||
|
||||
#define VHOST_USER_GPU_PROTOCOL_F_EDID 0
|
||||
|
||||
static void vhost_user_gpu_update_blocked(VhostUserGPU *g, bool blocked);
|
||||
|
||||
static void
|
||||
@@ -161,6 +170,9 @@ vhost_user_gpu_handle_display(VhostUserGPU *g, VhostUserGpuMsg *msg)
|
||||
.request = msg->request,
|
||||
.flags = VHOST_USER_GPU_MSG_FLAG_REPLY,
|
||||
.size = sizeof(uint64_t),
|
||||
.payload = {
|
||||
.u64 = (1 << VHOST_USER_GPU_PROTOCOL_F_EDID)
|
||||
}
|
||||
};
|
||||
|
||||
vhost_user_gpu_send_msg(g, &reply);
|
||||
@@ -184,6 +196,26 @@ vhost_user_gpu_handle_display(VhostUserGPU *g, VhostUserGpuMsg *msg)
|
||||
vhost_user_gpu_send_msg(g, &reply);
|
||||
break;
|
||||
}
|
||||
case VHOST_USER_GPU_GET_EDID: {
|
||||
VhostUserGpuEdidRequest *m = &msg->payload.edid_req;
|
||||
struct virtio_gpu_resp_edid resp = { {} };
|
||||
VhostUserGpuMsg reply = {
|
||||
.request = msg->request,
|
||||
.flags = VHOST_USER_GPU_MSG_FLAG_REPLY,
|
||||
.size = sizeof(reply.payload.resp_edid),
|
||||
};
|
||||
|
||||
if (m->scanout_id >= g->parent_obj.conf.max_outputs) {
|
||||
error_report("invalid scanout: %d", m->scanout_id);
|
||||
break;
|
||||
}
|
||||
|
||||
resp.hdr.type = VIRTIO_GPU_RESP_OK_EDID;
|
||||
virtio_gpu_base_generate_edid(VIRTIO_GPU_BASE(g), m->scanout_id, &resp);
|
||||
memcpy(&reply.payload.resp_edid, &resp, sizeof(resp));
|
||||
vhost_user_gpu_send_msg(g, &reply);
|
||||
break;
|
||||
}
|
||||
case VHOST_USER_GPU_SCANOUT: {
|
||||
VhostUserGpuScanout *m = &msg->payload.scanout;
|
||||
|
||||
@@ -489,7 +521,7 @@ vhost_user_gpu_guest_notifier_pending(VirtIODevice *vdev, int idx)
|
||||
|
||||
/*
|
||||
* Add the check for configure interrupt, Use VIRTIO_CONFIG_IRQ_IDX -1
|
||||
* as the Marco of configure interrupt's IDX, If this driver does not
|
||||
* as the macro of configure interrupt's IDX, If this driver does not
|
||||
* support, the function will return
|
||||
*/
|
||||
|
||||
@@ -506,7 +538,7 @@ vhost_user_gpu_guest_notifier_mask(VirtIODevice *vdev, int idx, bool mask)
|
||||
|
||||
/*
|
||||
* Add the check for configure interrupt, Use VIRTIO_CONFIG_IRQ_IDX -1
|
||||
* as the Marco of configure interrupt's IDX, If this driver does not
|
||||
* as the macro of configure interrupt's IDX, If this driver does not
|
||||
* support, the function will return
|
||||
*/
|
||||
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
#include "migration/blocker.h"
|
||||
#include "qapi/error.h"
|
||||
#include "qemu/error-report.h"
|
||||
#include "hw/display/edid.h"
|
||||
#include "trace.h"
|
||||
|
||||
void
|
||||
@@ -51,6 +52,22 @@ virtio_gpu_base_fill_display_info(VirtIOGPUBase *g,
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
virtio_gpu_base_generate_edid(VirtIOGPUBase *g, int scanout,
|
||||
struct virtio_gpu_resp_edid *edid)
|
||||
{
|
||||
qemu_edid_info info = {
|
||||
.width_mm = g->req_state[scanout].width_mm,
|
||||
.height_mm = g->req_state[scanout].height_mm,
|
||||
.prefx = g->req_state[scanout].width,
|
||||
.prefy = g->req_state[scanout].height,
|
||||
.refresh_rate = g->req_state[scanout].refresh_rate,
|
||||
};
|
||||
|
||||
edid->size = cpu_to_le32(sizeof(edid->edid));
|
||||
qemu_edid_generate(edid->edid, sizeof(edid->edid), &info);
|
||||
}
|
||||
|
||||
static void virtio_gpu_invalidate_display(void *opaque)
|
||||
{
|
||||
}
|
||||
|
||||
+1
-19
@@ -24,7 +24,6 @@
|
||||
#include "hw/virtio/virtio-gpu-bswap.h"
|
||||
#include "hw/virtio/virtio-gpu-pixman.h"
|
||||
#include "hw/virtio/virtio-bus.h"
|
||||
#include "hw/display/edid.h"
|
||||
#include "hw/qdev-properties.h"
|
||||
#include "qemu/log.h"
|
||||
#include "qemu/module.h"
|
||||
@@ -207,23 +206,6 @@ void virtio_gpu_get_display_info(VirtIOGPU *g,
|
||||
sizeof(display_info));
|
||||
}
|
||||
|
||||
static void
|
||||
virtio_gpu_generate_edid(VirtIOGPU *g, int scanout,
|
||||
struct virtio_gpu_resp_edid *edid)
|
||||
{
|
||||
VirtIOGPUBase *b = VIRTIO_GPU_BASE(g);
|
||||
qemu_edid_info info = {
|
||||
.width_mm = b->req_state[scanout].width_mm,
|
||||
.height_mm = b->req_state[scanout].height_mm,
|
||||
.prefx = b->req_state[scanout].width,
|
||||
.prefy = b->req_state[scanout].height,
|
||||
.refresh_rate = b->req_state[scanout].refresh_rate,
|
||||
};
|
||||
|
||||
edid->size = cpu_to_le32(sizeof(edid->edid));
|
||||
qemu_edid_generate(edid->edid, sizeof(edid->edid), &info);
|
||||
}
|
||||
|
||||
void virtio_gpu_get_edid(VirtIOGPU *g,
|
||||
struct virtio_gpu_ctrl_command *cmd)
|
||||
{
|
||||
@@ -242,7 +224,7 @@ void virtio_gpu_get_edid(VirtIOGPU *g,
|
||||
trace_virtio_gpu_cmd_get_edid(get_edid.scanout);
|
||||
memset(&edid, 0, sizeof(edid));
|
||||
edid.hdr.type = VIRTIO_GPU_RESP_OK_EDID;
|
||||
virtio_gpu_generate_edid(g, get_edid.scanout, &edid);
|
||||
virtio_gpu_base_generate_edid(VIRTIO_GPU_BASE(g), get_edid.scanout, &edid);
|
||||
virtio_gpu_ctrl_response(g, cmd, &edid.hdr, sizeof(edid));
|
||||
}
|
||||
|
||||
|
||||
+36
-26
@@ -114,7 +114,7 @@ static void pc_init1(MachineState *machine,
|
||||
X86MachineState *x86ms = X86_MACHINE(machine);
|
||||
MemoryRegion *system_memory = get_system_memory();
|
||||
MemoryRegion *system_io = get_system_io();
|
||||
PCIBus *pci_bus;
|
||||
PCIBus *pci_bus = NULL;
|
||||
ISABus *isa_bus;
|
||||
int piix3_devfn = -1;
|
||||
qemu_irq smi_irq;
|
||||
@@ -122,11 +122,10 @@ static void pc_init1(MachineState *machine,
|
||||
BusState *idebus[MAX_IDE_BUS];
|
||||
ISADevice *rtc_state;
|
||||
MemoryRegion *ram_memory;
|
||||
MemoryRegion *pci_memory;
|
||||
MemoryRegion *rom_memory;
|
||||
MemoryRegion *pci_memory = NULL;
|
||||
MemoryRegion *rom_memory = system_memory;
|
||||
ram_addr_t lowmem;
|
||||
uint64_t hole64_size;
|
||||
DeviceState *i440fx_host;
|
||||
uint64_t hole64_size = 0;
|
||||
|
||||
/*
|
||||
* Calculate ram split, for memory below and above 4G. It's a bit
|
||||
@@ -198,18 +197,39 @@ static void pc_init1(MachineState *machine,
|
||||
}
|
||||
|
||||
if (pcmc->pci_enabled) {
|
||||
Object *phb;
|
||||
|
||||
pci_memory = g_new(MemoryRegion, 1);
|
||||
memory_region_init(pci_memory, NULL, "pci", UINT64_MAX);
|
||||
rom_memory = pci_memory;
|
||||
i440fx_host = qdev_new(host_type);
|
||||
hole64_size = object_property_get_uint(OBJECT(i440fx_host),
|
||||
|
||||
phb = OBJECT(qdev_new(host_type));
|
||||
object_property_add_child(OBJECT(machine), "i440fx", phb);
|
||||
object_property_set_link(phb, PCI_HOST_PROP_RAM_MEM,
|
||||
OBJECT(ram_memory), &error_fatal);
|
||||
object_property_set_link(phb, PCI_HOST_PROP_PCI_MEM,
|
||||
OBJECT(pci_memory), &error_fatal);
|
||||
object_property_set_link(phb, PCI_HOST_PROP_SYSTEM_MEM,
|
||||
OBJECT(system_memory), &error_fatal);
|
||||
object_property_set_link(phb, PCI_HOST_PROP_IO_MEM,
|
||||
OBJECT(system_io), &error_fatal);
|
||||
object_property_set_uint(phb, PCI_HOST_BELOW_4G_MEM_SIZE,
|
||||
x86ms->below_4g_mem_size, &error_fatal);
|
||||
object_property_set_uint(phb, PCI_HOST_ABOVE_4G_MEM_SIZE,
|
||||
x86ms->above_4g_mem_size, &error_fatal);
|
||||
object_property_set_str(phb, I440FX_HOST_PROP_PCI_TYPE, pci_type,
|
||||
&error_fatal);
|
||||
sysbus_realize_and_unref(SYS_BUS_DEVICE(phb), &error_fatal);
|
||||
|
||||
pci_bus = PCI_BUS(qdev_get_child_bus(DEVICE(phb), "pci.0"));
|
||||
pci_bus_map_irqs(pci_bus,
|
||||
xen_enabled() ? xen_pci_slot_get_pirq
|
||||
: pc_pci_slot_get_pirq);
|
||||
pcms->bus = pci_bus;
|
||||
|
||||
hole64_size = object_property_get_uint(phb,
|
||||
PCI_HOST_PROP_PCI_HOLE64_SIZE,
|
||||
&error_abort);
|
||||
} else {
|
||||
pci_memory = NULL;
|
||||
rom_memory = system_memory;
|
||||
i440fx_host = NULL;
|
||||
hole64_size = 0;
|
||||
}
|
||||
|
||||
pc_guest_info_init(pcms);
|
||||
@@ -227,6 +247,9 @@ static void pc_init1(MachineState *machine,
|
||||
if (!xen_enabled()) {
|
||||
pc_memory_init(pcms, system_memory, rom_memory, hole64_size);
|
||||
} else {
|
||||
assert(machine->ram_size == x86ms->below_4g_mem_size +
|
||||
x86ms->above_4g_mem_size);
|
||||
|
||||
pc_system_flash_cleanup_unused(pcms);
|
||||
if (machine->kernel_filename != NULL) {
|
||||
/* For xen HVM direct kernel boot, load linux here */
|
||||
@@ -240,19 +263,7 @@ static void pc_init1(MachineState *machine,
|
||||
PIIX3State *piix3;
|
||||
PCIDevice *pci_dev;
|
||||
|
||||
pci_bus = i440fx_init(pci_type,
|
||||
i440fx_host,
|
||||
system_memory, system_io, machine->ram_size,
|
||||
x86ms->below_4g_mem_size,
|
||||
x86ms->above_4g_mem_size,
|
||||
pci_memory, ram_memory);
|
||||
pci_bus_map_irqs(pci_bus,
|
||||
xen_enabled() ? xen_pci_slot_get_pirq
|
||||
: pc_pci_slot_get_pirq);
|
||||
pcms->bus = pci_bus;
|
||||
|
||||
pci_dev = pci_create_simple_multifunction(pci_bus, -1, true,
|
||||
TYPE_PIIX3_DEVICE);
|
||||
pci_dev = pci_create_simple_multifunction(pci_bus, -1, TYPE_PIIX3_DEVICE);
|
||||
|
||||
if (xen_enabled()) {
|
||||
pci_device_set_intx_routing_notifier(
|
||||
@@ -275,7 +286,6 @@ static void pc_init1(MachineState *machine,
|
||||
rtc_state = ISA_DEVICE(object_resolve_path_component(OBJECT(pci_dev),
|
||||
"rtc"));
|
||||
} else {
|
||||
pci_bus = NULL;
|
||||
isa_bus = isa_bus_new(NULL, system_memory, system_io,
|
||||
&error_abort);
|
||||
|
||||
|
||||
+22
-19
@@ -100,12 +100,12 @@ static int ehci_create_ich9_with_companions(PCIBus *bus, int slot)
|
||||
return -1;
|
||||
}
|
||||
|
||||
ehci = pci_new_multifunction(PCI_DEVFN(slot, 7), true, name);
|
||||
ehci = pci_new_multifunction(PCI_DEVFN(slot, 7), name);
|
||||
pci_realize_and_unref(ehci, bus, &error_fatal);
|
||||
usbbus = QLIST_FIRST(&ehci->qdev.child_bus);
|
||||
|
||||
for (i = 0; i < 3; i++) {
|
||||
uhci = pci_new_multifunction(PCI_DEVFN(slot, comp[i].func), true,
|
||||
uhci = pci_new_multifunction(PCI_DEVFN(slot, comp[i].func),
|
||||
comp[i].name);
|
||||
qdev_prop_set_string(&uhci->qdev, "masterbus", usbbus->name);
|
||||
qdev_prop_set_uint32(&uhci->qdev, "firstport", comp[i].port);
|
||||
@@ -120,8 +120,7 @@ static void pc_q35_init(MachineState *machine)
|
||||
PCMachineState *pcms = PC_MACHINE(machine);
|
||||
PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(pcms);
|
||||
X86MachineState *x86ms = X86_MACHINE(machine);
|
||||
Q35PCIHost *q35_host;
|
||||
PCIHostState *phb;
|
||||
Object *phb;
|
||||
PCIBus *host_bus;
|
||||
PCIDevice *lpc;
|
||||
DeviceState *lpc_dev;
|
||||
@@ -207,10 +206,10 @@ static void pc_q35_init(MachineState *machine)
|
||||
}
|
||||
|
||||
/* create pci host bus */
|
||||
q35_host = Q35_HOST_DEVICE(qdev_new(TYPE_Q35_HOST_DEVICE));
|
||||
phb = OBJECT(qdev_new(TYPE_Q35_HOST_DEVICE));
|
||||
|
||||
if (pcmc->pci_enabled) {
|
||||
pci_hole64_size = object_property_get_uint(OBJECT(q35_host),
|
||||
pci_hole64_size = object_property_get_uint(phb,
|
||||
PCI_HOST_PROP_PCI_HOLE64_SIZE,
|
||||
&error_abort);
|
||||
}
|
||||
@@ -218,25 +217,29 @@ static void pc_q35_init(MachineState *machine)
|
||||
/* allocate ram and load rom/bios */
|
||||
pc_memory_init(pcms, system_memory, rom_memory, pci_hole64_size);
|
||||
|
||||
object_property_add_child(OBJECT(machine), "q35", OBJECT(q35_host));
|
||||
object_property_set_link(OBJECT(q35_host), MCH_HOST_PROP_RAM_MEM,
|
||||
object_property_add_child(OBJECT(machine), "q35", phb);
|
||||
object_property_set_link(phb, PCI_HOST_PROP_RAM_MEM,
|
||||
OBJECT(machine->ram), NULL);
|
||||
object_property_set_link(OBJECT(q35_host), MCH_HOST_PROP_PCI_MEM,
|
||||
object_property_set_link(phb, PCI_HOST_PROP_PCI_MEM,
|
||||
OBJECT(pci_memory), NULL);
|
||||
object_property_set_link(OBJECT(q35_host), MCH_HOST_PROP_SYSTEM_MEM,
|
||||
object_property_set_link(phb, PCI_HOST_PROP_SYSTEM_MEM,
|
||||
OBJECT(system_memory), NULL);
|
||||
object_property_set_link(OBJECT(q35_host), MCH_HOST_PROP_IO_MEM,
|
||||
object_property_set_link(phb, PCI_HOST_PROP_IO_MEM,
|
||||
OBJECT(system_io), NULL);
|
||||
object_property_set_int(OBJECT(q35_host), PCI_HOST_BELOW_4G_MEM_SIZE,
|
||||
object_property_set_int(phb, PCI_HOST_BELOW_4G_MEM_SIZE,
|
||||
x86ms->below_4g_mem_size, NULL);
|
||||
object_property_set_int(OBJECT(q35_host), PCI_HOST_ABOVE_4G_MEM_SIZE,
|
||||
object_property_set_int(phb, PCI_HOST_ABOVE_4G_MEM_SIZE,
|
||||
x86ms->above_4g_mem_size, NULL);
|
||||
object_property_set_bool(phb, PCI_HOST_BYPASS_IOMMU,
|
||||
pcms->default_bus_bypass_iommu, NULL);
|
||||
sysbus_realize_and_unref(SYS_BUS_DEVICE(phb), &error_fatal);
|
||||
|
||||
/* pci */
|
||||
sysbus_realize_and_unref(SYS_BUS_DEVICE(q35_host), &error_fatal);
|
||||
phb = PCI_HOST_BRIDGE(q35_host);
|
||||
host_bus = phb->bus;
|
||||
host_bus = PCI_BUS(qdev_get_child_bus(DEVICE(phb), "pcie.0"));
|
||||
pcms->bus = host_bus;
|
||||
|
||||
/* create ISA bus */
|
||||
lpc = pci_new_multifunction(PCI_DEVFN(ICH9_LPC_DEV, ICH9_LPC_FUNC), true,
|
||||
lpc = pci_new_multifunction(PCI_DEVFN(ICH9_LPC_DEV, ICH9_LPC_FUNC),
|
||||
TYPE_ICH9_LPC_DEVICE);
|
||||
qdev_prop_set_bit(DEVICE(lpc), "smm-enabled",
|
||||
x86_machine_is_smm_enabled(x86ms));
|
||||
@@ -301,7 +304,7 @@ static void pc_q35_init(MachineState *machine)
|
||||
ahci = pci_create_simple_multifunction(host_bus,
|
||||
PCI_DEVFN(ICH9_SATA1_DEV,
|
||||
ICH9_SATA1_FUNC),
|
||||
true, "ich9-ahci");
|
||||
"ich9-ahci");
|
||||
idebus[0] = qdev_get_child_bus(&ahci->qdev, "ide.0");
|
||||
idebus[1] = qdev_get_child_bus(&ahci->qdev, "ide.1");
|
||||
g_assert(MAX_SATA_PORTS == ahci_get_num_ports(ahci));
|
||||
@@ -323,7 +326,7 @@ static void pc_q35_init(MachineState *machine)
|
||||
smb = pci_create_simple_multifunction(host_bus,
|
||||
PCI_DEVFN(ICH9_SMB_DEV,
|
||||
ICH9_SMB_FUNC),
|
||||
true, TYPE_ICH9_SMB_DEVICE);
|
||||
TYPE_ICH9_SMB_DEVICE);
|
||||
pcms->smbus = I2C_BUS(qdev_get_child_bus(DEVICE(smb), "i2c"));
|
||||
|
||||
smbus_eeprom_init(pcms->smbus, 8, NULL, 0);
|
||||
|
||||
+1
-2
@@ -770,8 +770,7 @@ static void boston_mach_init(MachineState *machine)
|
||||
boston_lcd_event, NULL, s, NULL, true);
|
||||
|
||||
ahci = pci_create_simple_multifunction(&PCI_BRIDGE(&pcie2->root)->sec_bus,
|
||||
PCI_DEVFN(0, 0),
|
||||
true, TYPE_ICH9_AHCI);
|
||||
PCI_DEVFN(0, 0), TYPE_ICH9_AHCI);
|
||||
g_assert(ARRAY_SIZE(hd) == ahci_get_num_ports(ahci));
|
||||
ide_drive_get(hd, ahci_get_num_ports(ahci));
|
||||
ahci_ide_create_devs(ahci, hd);
|
||||
|
||||
+1
-1
@@ -297,7 +297,7 @@ static void mips_fuloong2e_init(MachineState *machine)
|
||||
/* South bridge -> IP5 */
|
||||
pci_dev = pci_create_simple_multifunction(pci_bus,
|
||||
PCI_DEVFN(FULOONG2E_VIA_SLOT, 0),
|
||||
true, TYPE_VT82C686B_ISA);
|
||||
TYPE_VT82C686B_ISA);
|
||||
object_property_add_alias(OBJECT(machine), "rtc-time",
|
||||
object_resolve_path_component(OBJECT(pci_dev),
|
||||
"rtc"),
|
||||
|
||||
+1
-1
@@ -1251,7 +1251,7 @@ void mips_malta_init(MachineState *machine)
|
||||
pci_bus_map_irqs(pci_bus, malta_pci_slot_get_pirq);
|
||||
|
||||
/* Southbridge */
|
||||
piix4 = pci_create_simple_multifunction(pci_bus, PIIX4_PCI_DEVFN, true,
|
||||
piix4 = pci_create_simple_multifunction(pci_bus, PIIX4_PCI_DEVFN,
|
||||
TYPE_PIIX4_PCI_DEVICE);
|
||||
isa_bus = ISA_BUS(qdev_get_child_bus(DEVICE(piix4), "isa.0"));
|
||||
|
||||
|
||||
+1
-1
@@ -431,7 +431,7 @@ static void igb_pci_realize(PCIDevice *pci_dev, Error **errp)
|
||||
hw_error("Failed to initialize AER capability");
|
||||
}
|
||||
|
||||
pcie_ari_init(pci_dev, 0x150, 1);
|
||||
pcie_ari_init(pci_dev, 0x150);
|
||||
|
||||
pcie_sriov_pf_init(pci_dev, IGB_CAP_SRIOV_OFFSET, TYPE_IGBVF,
|
||||
IGB_82576_VF_DEV_ID, IGB_MAX_VF_FUNCTIONS, IGB_MAX_VF_FUNCTIONS,
|
||||
|
||||
+1
-1
@@ -270,7 +270,7 @@ static void igbvf_pci_realize(PCIDevice *dev, Error **errp)
|
||||
hw_error("Failed to initialize AER capability");
|
||||
}
|
||||
|
||||
pcie_ari_init(dev, 0x150, 1);
|
||||
pcie_ari_init(dev, 0x150);
|
||||
}
|
||||
|
||||
static void igbvf_pci_uninit(PCIDevice *dev)
|
||||
|
||||
+3
-2
@@ -3362,7 +3362,7 @@ static bool virtio_net_guest_notifier_pending(VirtIODevice *vdev, int idx)
|
||||
}
|
||||
/*
|
||||
* Add the check for configure interrupt, Use VIRTIO_CONFIG_IRQ_IDX -1
|
||||
* as the Marco of configure interrupt's IDX, If this driver does not
|
||||
* as the macro of configure interrupt's IDX, If this driver does not
|
||||
* support, the function will return false
|
||||
*/
|
||||
|
||||
@@ -3394,7 +3394,7 @@ static void virtio_net_guest_notifier_mask(VirtIODevice *vdev, int idx,
|
||||
}
|
||||
/*
|
||||
*Add the check for configure interrupt, Use VIRTIO_CONFIG_IRQ_IDX -1
|
||||
* as the Marco of configure interrupt's IDX, If this driver does not
|
||||
* as the macro of configure interrupt's IDX, If this driver does not
|
||||
* support, the function will return
|
||||
*/
|
||||
|
||||
@@ -3951,6 +3951,7 @@ static void virtio_net_class_init(ObjectClass *klass, void *data)
|
||||
vdc->vmsd = &vmstate_virtio_net_device;
|
||||
vdc->primary_unplug_pending = primary_unplug_pending;
|
||||
vdc->get_vhost = virtio_net_get_vhost;
|
||||
vdc->toggle_device_iotlb = vhost_toggle_device_iotlb;
|
||||
}
|
||||
|
||||
static const TypeInfo virtio_net_info = {
|
||||
|
||||
+1
-1
@@ -8120,7 +8120,7 @@ static bool nvme_init_pci(NvmeCtrl *n, PCIDevice *pci_dev, Error **errp)
|
||||
pcie_endpoint_cap_init(pci_dev, 0x80);
|
||||
pcie_cap_flr_init(pci_dev);
|
||||
if (n->params.sriov_max_vfs) {
|
||||
pcie_ari_init(pci_dev, 0x100, 1);
|
||||
pcie_ari_init(pci_dev, 0x100);
|
||||
}
|
||||
|
||||
/* add one to max_ioqpairs to account for the admin queue pair */
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user