mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-04 08:13:54 -06:00
Pull request
Farhan Ali's s390x host PCI support for the block/nvme.c driver. -----BEGIN PGP SIGNATURE----- iQEzBAABCgAdFiEEhpWov9P5fNqsNXdanKSrs4Grc8gFAmgcviUACgkQnKSrs4Gr c8hRswgAupxH5Zhx50F7GzwZyu9TCF2sphEPd2VuFVxze8Sg6mXnJq5BFTjv9IuC 0trPppfDyKFKujDk+FA3pl9bT45btm0xctNbFYNRS3HXrVUyMQLy73MlFF2twa5g U3uiX2d7DAYOdi5O1Cn3bhlByDh4qSko7YyUDFKio+WU57cdJxEd+pUqwyVXrU3E AMC2ZmJdKFGGC+tWxBIAuWNc5apq9yzbiywR8z62/Z2IC+Bym0RpvCbdklqcZb8O tpGxDKN8bY6s+hy1NZmA8eBA/iCiu6SUFmNpoe2vSwCFEk9R3gi+UNcuTVt3FaWO lgzoZSOelmI3JkF0UBqvKsPXt3fdJw== =KII7 -----END PGP SIGNATURE----- Merge tag 'block-pull-request' of https://gitlab.com/stefanha/qemu into staging Pull request Farhan Ali's s390x host PCI support for the block/nvme.c driver. # -----BEGIN PGP SIGNATURE----- # # iQEzBAABCgAdFiEEhpWov9P5fNqsNXdanKSrs4Grc8gFAmgcviUACgkQnKSrs4Gr # c8hRswgAupxH5Zhx50F7GzwZyu9TCF2sphEPd2VuFVxze8Sg6mXnJq5BFTjv9IuC # 0trPppfDyKFKujDk+FA3pl9bT45btm0xctNbFYNRS3HXrVUyMQLy73MlFF2twa5g # U3uiX2d7DAYOdi5O1Cn3bhlByDh4qSko7YyUDFKio+WU57cdJxEd+pUqwyVXrU3E # AMC2ZmJdKFGGC+tWxBIAuWNc5apq9yzbiywR8z62/Z2IC+Bym0RpvCbdklqcZb8O # tpGxDKN8bY6s+hy1NZmA8eBA/iCiu6SUFmNpoe2vSwCFEk9R3gi+UNcuTVt3FaWO # lgzoZSOelmI3JkF0UBqvKsPXt3fdJw== # =KII7 # -----END PGP SIGNATURE----- # gpg: Signature made Thu 08 May 2025 10:22:29 EDT # gpg: using RSA key 8695A8BFD3F97CDAAC35775A9CA4ABB381AB73C8 # gpg: Good signature from "Stefan Hajnoczi <stefanha@redhat.com>" [ultimate] # gpg: aka "Stefan Hajnoczi <stefanha@gmail.com>" [ultimate] # Primary key fingerprint: 8695 A8BF D3F9 7CDA AC35 775A 9CA4 ABB3 81AB 73C8 * tag 'block-pull-request' of https://gitlab.com/stefanha/qemu: block/nvme: Use host PCI MMIO API include: Add a header to define host PCI MMIO functions util: Add functions for s390x mmio read/write Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
commit
6b18f6e342
5 changed files with 331 additions and 18 deletions
|
@ -133,4 +133,6 @@ elif cpu in ['ppc', 'ppc64']
|
|||
util_ss.add(files('cpuinfo-ppc.c'))
|
||||
elif cpu in ['riscv32', 'riscv64']
|
||||
util_ss.add(files('cpuinfo-riscv.c'))
|
||||
elif cpu == 's390x'
|
||||
util_ss.add(files('s390x_pci_mmio.c'))
|
||||
endif
|
||||
|
|
146
util/s390x_pci_mmio.c
Normal file
146
util/s390x_pci_mmio.c
Normal file
|
@ -0,0 +1,146 @@
|
|||
/*
|
||||
* s390x PCI MMIO definitions
|
||||
*
|
||||
* Copyright 2025 IBM Corp.
|
||||
* Author(s): Farhan Ali <alifm@linux.ibm.com>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||
*/
|
||||
|
||||
#include "qemu/osdep.h"
|
||||
#include <sys/syscall.h>
|
||||
#include "qemu/s390x_pci_mmio.h"
|
||||
#include "elf.h"
|
||||
|
||||
union register_pair {
|
||||
unsigned __int128 pair;
|
||||
struct {
|
||||
uint64_t even;
|
||||
uint64_t odd;
|
||||
};
|
||||
};
|
||||
|
||||
static bool is_mio_supported;
|
||||
|
||||
static __attribute__((constructor)) void check_is_mio_supported(void)
|
||||
{
|
||||
is_mio_supported = !!(qemu_getauxval(AT_HWCAP) & HWCAP_S390_PCI_MIO);
|
||||
}
|
||||
|
||||
static uint64_t s390x_pcilgi(const void *ioaddr, size_t len)
|
||||
{
|
||||
union register_pair ioaddr_len = { .even = (uint64_t)ioaddr,
|
||||
.odd = len };
|
||||
uint64_t val;
|
||||
int cc;
|
||||
|
||||
asm volatile(
|
||||
/* pcilgi */
|
||||
".insn rre,0xb9d60000,%[val],%[ioaddr_len]\n"
|
||||
"ipm %[cc]\n"
|
||||
"srl %[cc],28\n"
|
||||
: [cc] "=d"(cc), [val] "=d"(val),
|
||||
[ioaddr_len] "+d"(ioaddr_len.pair) :: "cc");
|
||||
|
||||
if (cc) {
|
||||
val = -1ULL;
|
||||
}
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
static void s390x_pcistgi(void *ioaddr, uint64_t val, size_t len)
|
||||
{
|
||||
union register_pair ioaddr_len = {.even = (uint64_t)ioaddr, .odd = len};
|
||||
|
||||
asm volatile (
|
||||
/* pcistgi */
|
||||
".insn rre,0xb9d40000,%[val],%[ioaddr_len]\n"
|
||||
: [ioaddr_len] "+d" (ioaddr_len.pair)
|
||||
: [val] "d" (val)
|
||||
: "cc", "memory");
|
||||
}
|
||||
|
||||
uint8_t s390x_pci_mmio_read_8(const void *ioaddr)
|
||||
{
|
||||
uint8_t val = 0;
|
||||
|
||||
if (is_mio_supported) {
|
||||
val = s390x_pcilgi(ioaddr, sizeof(val));
|
||||
} else {
|
||||
syscall(__NR_s390_pci_mmio_read, ioaddr, &val, sizeof(val));
|
||||
}
|
||||
return val;
|
||||
}
|
||||
|
||||
uint16_t s390x_pci_mmio_read_16(const void *ioaddr)
|
||||
{
|
||||
uint16_t val = 0;
|
||||
|
||||
if (is_mio_supported) {
|
||||
val = s390x_pcilgi(ioaddr, sizeof(val));
|
||||
} else {
|
||||
syscall(__NR_s390_pci_mmio_read, ioaddr, &val, sizeof(val));
|
||||
}
|
||||
return val;
|
||||
}
|
||||
|
||||
uint32_t s390x_pci_mmio_read_32(const void *ioaddr)
|
||||
{
|
||||
uint32_t val = 0;
|
||||
|
||||
if (is_mio_supported) {
|
||||
val = s390x_pcilgi(ioaddr, sizeof(val));
|
||||
} else {
|
||||
syscall(__NR_s390_pci_mmio_read, ioaddr, &val, sizeof(val));
|
||||
}
|
||||
return val;
|
||||
}
|
||||
|
||||
uint64_t s390x_pci_mmio_read_64(const void *ioaddr)
|
||||
{
|
||||
uint64_t val = 0;
|
||||
|
||||
if (is_mio_supported) {
|
||||
val = s390x_pcilgi(ioaddr, sizeof(val));
|
||||
} else {
|
||||
syscall(__NR_s390_pci_mmio_read, ioaddr, &val, sizeof(val));
|
||||
}
|
||||
return val;
|
||||
}
|
||||
|
||||
void s390x_pci_mmio_write_8(void *ioaddr, uint8_t val)
|
||||
{
|
||||
if (is_mio_supported) {
|
||||
s390x_pcistgi(ioaddr, val, sizeof(val));
|
||||
} else {
|
||||
syscall(__NR_s390_pci_mmio_write, ioaddr, &val, sizeof(val));
|
||||
}
|
||||
}
|
||||
|
||||
void s390x_pci_mmio_write_16(void *ioaddr, uint16_t val)
|
||||
{
|
||||
if (is_mio_supported) {
|
||||
s390x_pcistgi(ioaddr, val, sizeof(val));
|
||||
} else {
|
||||
syscall(__NR_s390_pci_mmio_write, ioaddr, &val, sizeof(val));
|
||||
}
|
||||
}
|
||||
|
||||
void s390x_pci_mmio_write_32(void *ioaddr, uint32_t val)
|
||||
{
|
||||
if (is_mio_supported) {
|
||||
s390x_pcistgi(ioaddr, val, sizeof(val));
|
||||
} else {
|
||||
syscall(__NR_s390_pci_mmio_write, ioaddr, &val, sizeof(val));
|
||||
}
|
||||
}
|
||||
|
||||
void s390x_pci_mmio_write_64(void *ioaddr, uint64_t val)
|
||||
{
|
||||
if (is_mio_supported) {
|
||||
s390x_pcistgi(ioaddr, val, sizeof(val));
|
||||
} else {
|
||||
syscall(__NR_s390_pci_mmio_write, ioaddr, &val, sizeof(val));
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue