virtio/qemu: fixes for 4.6
A couple of fixes for virtio and for the new QEMU fw cfg driver. Signed-off-by: Michael S. Tsirkin <mst@redhat.com> -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQEcBAABAgAGBQJXBlD5AAoJECgfDbjSjVRpgBEIALM/FXdZHX4TE1eCSxQE341e 28/1HjeNH7IKehj2yypakopTRBPUXo7P+pyQXzsIdu3hQGA9/dqyA/1jAxfqV92/ NN6SEqiNAWR/lIXc9a2NPDtve96v1A1E5MNzjiVuEzLUqGOVDZTzvOeqEIvE/425 GIkkHR3bKpshHulg2UENXSVlG0sGy8fLkA8a9GswXsr45kVzACimqXgtuvTvA8lU 2beWDjsg485mMyi9a1gv2fk66yGFZQFKqZFVxo26SXZtai1Hn1as46YTrqrhNWuk mpNMJ8nLBR3IGbUkJs2k9okTf4cCoNdC782ZemzRKth3Kv6KEiDvVlTwUoD7CPQ= =47wT -----END PGP SIGNATURE----- Merge tag 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost Pull virtio/qemu fixes from Michael S Tsirkin: "A couple of fixes for virtio and for the new QEMU fw cfg driver" * tag 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost: virtio: add VIRTIO_CONFIG_S_NEEDS_RESET device status bit MAINTAINERS: add entry for QEMU firmware: qemu_fw_cfg.c: hold ACPI global lock during device access virtio: virtio 1.0 cs04 spec compliance for reset qemu_fw_cfg: don't leak kobj on init error
This commit is contained in:
commit
d3436a1d03
|
@ -9142,6 +9142,13 @@ T: git git://github.com/KrasnikovEugene/wcn36xx.git
|
|||
S: Supported
|
||||
F: drivers/net/wireless/ath/wcn36xx/
|
||||
|
||||
QEMU MACHINE EMULATOR AND VIRTUALIZER SUPPORT
|
||||
M: Gabriel Somlo <somlo@cmu.edu>
|
||||
M: "Michael S. Tsirkin" <mst@redhat.com>
|
||||
L: qemu-devel@nongnu.org
|
||||
S: Maintained
|
||||
F: drivers/firmware/qemu_fw_cfg.c
|
||||
|
||||
RADOS BLOCK DEVICE (RBD)
|
||||
M: Ilya Dryomov <idryomov@gmail.com>
|
||||
M: Sage Weil <sage@redhat.com>
|
||||
|
|
|
@ -77,12 +77,28 @@ static inline u16 fw_cfg_sel_endianness(u16 key)
|
|||
static inline void fw_cfg_read_blob(u16 key,
|
||||
void *buf, loff_t pos, size_t count)
|
||||
{
|
||||
u32 glk;
|
||||
acpi_status status;
|
||||
|
||||
/* If we have ACPI, ensure mutual exclusion against any potential
|
||||
* device access by the firmware, e.g. via AML methods:
|
||||
*/
|
||||
status = acpi_acquire_global_lock(ACPI_WAIT_FOREVER, &glk);
|
||||
if (ACPI_FAILURE(status) && status != AE_NOT_CONFIGURED) {
|
||||
/* Should never get here */
|
||||
WARN(1, "fw_cfg_read_blob: Failed to lock ACPI!\n");
|
||||
memset(buf, 0, count);
|
||||
return;
|
||||
}
|
||||
|
||||
mutex_lock(&fw_cfg_dev_lock);
|
||||
iowrite16(fw_cfg_sel_endianness(key), fw_cfg_reg_ctrl);
|
||||
while (pos-- > 0)
|
||||
ioread8(fw_cfg_reg_data);
|
||||
ioread8_rep(fw_cfg_reg_data, buf, count);
|
||||
mutex_unlock(&fw_cfg_dev_lock);
|
||||
|
||||
acpi_release_global_lock(glk);
|
||||
}
|
||||
|
||||
/* clean up fw_cfg device i/o */
|
||||
|
@ -727,12 +743,18 @@ device_param_cb(mmio, &fw_cfg_cmdline_param_ops, NULL, S_IRUSR);
|
|||
|
||||
static int __init fw_cfg_sysfs_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
/* create /sys/firmware/qemu_fw_cfg/ top level directory */
|
||||
fw_cfg_top_ko = kobject_create_and_add("qemu_fw_cfg", firmware_kobj);
|
||||
if (!fw_cfg_top_ko)
|
||||
return -ENOMEM;
|
||||
|
||||
return platform_driver_register(&fw_cfg_sysfs_driver);
|
||||
ret = platform_driver_register(&fw_cfg_sysfs_driver);
|
||||
if (ret)
|
||||
fw_cfg_kobj_cleanup(fw_cfg_top_ko);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void __exit fw_cfg_sysfs_exit(void)
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
*
|
||||
*/
|
||||
|
||||
#include <linux/delay.h>
|
||||
#define VIRTIO_PCI_NO_LEGACY
|
||||
#include "virtio_pci_common.h"
|
||||
|
||||
|
@ -271,9 +272,13 @@ static void vp_reset(struct virtio_device *vdev)
|
|||
struct virtio_pci_device *vp_dev = to_vp_device(vdev);
|
||||
/* 0 status means a reset. */
|
||||
vp_iowrite8(0, &vp_dev->common->device_status);
|
||||
/* Flush out the status write, and flush in device writes,
|
||||
* including MSI-X interrupts, if any. */
|
||||
vp_ioread8(&vp_dev->common->device_status);
|
||||
/* After writing 0 to device_status, the driver MUST wait for a read of
|
||||
* device_status to return 0 before reinitializing the device.
|
||||
* This will flush out the status write, and flush in device writes,
|
||||
* including MSI-X interrupts, if any.
|
||||
*/
|
||||
while (vp_ioread8(&vp_dev->common->device_status))
|
||||
msleep(1);
|
||||
/* Flush pending VQ/configuration callbacks. */
|
||||
vp_synchronize_vectors(vdev);
|
||||
}
|
||||
|
|
|
@ -40,6 +40,8 @@
|
|||
#define VIRTIO_CONFIG_S_DRIVER_OK 4
|
||||
/* Driver has finished configuring features */
|
||||
#define VIRTIO_CONFIG_S_FEATURES_OK 8
|
||||
/* Device entered invalid state, driver must reset it */
|
||||
#define VIRTIO_CONFIG_S_NEEDS_RESET 0x40
|
||||
/* We've given up on this device. */
|
||||
#define VIRTIO_CONFIG_S_FAILED 0x80
|
||||
|
||||
|
|
Loading…
Reference in New Issue