Module Name: src Committed By: christos Date: Sat Jan 23 20:00:19 UTC 2021
Modified Files: src/sys/dev/pci: virtio_pci.c Log Message: Provide a generic bus_space_write_8 function that is bi-endian. To generate a diff of this commit: cvs rdiff -u -r1.18 -r1.19 src/sys/dev/pci/virtio_pci.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/pci/virtio_pci.c diff -u src/sys/dev/pci/virtio_pci.c:1.18 src/sys/dev/pci/virtio_pci.c:1.19 --- src/sys/dev/pci/virtio_pci.c:1.18 Thu Jan 21 15:48:33 2021 +++ src/sys/dev/pci/virtio_pci.c Sat Jan 23 15:00:19 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: virtio_pci.c,v 1.18 2021/01/21 20:48:33 reinoud Exp $ */ +/* $NetBSD: virtio_pci.c,v 1.19 2021/01/23 20:00:19 christos Exp $ */ /* * Copyright (c) 2020 The NetBSD Foundation, Inc. @@ -28,12 +28,13 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: virtio_pci.c,v 1.18 2021/01/21 20:48:33 reinoud Exp $"); +__KERNEL_RCSID(0, "$NetBSD: virtio_pci.c,v 1.19 2021/01/23 20:00:19 christos Exp $"); #include <sys/param.h> #include <sys/systm.h> #include <sys/kmem.h> #include <sys/module.h> +#include <sys/endian.h> #include <sys/interrupt.h> #include <sys/device.h> @@ -731,9 +732,20 @@ virtio_pci_read_queue_size_10(struct vir * By definition little endian only in v1.0 and 8 byters are allowed to be * written as two 4 byters */ -#define bus_space_write_le_8(iot, ioh, reg, val) \ - bus_space_write_4(iot, ioh, reg, ((uint64_t) (val)) & 0xffffffff); \ - bus_space_write_4(iot, ioh, reg + 4, ((uint64_t) (val)) >> 32); +#ifndef __HAVE_BUS_SPACE_8 +static __inline void +bus_space_write_8(bus_space_tag_t iot, bus_space_handle_t ioh, + bus_size_t offset, uint64_t value) +{ +#if _QUAD_HIGHWORD + bus_space_write_4(iot, ioh, offset, BUS_ADDR_LO32(value)); + bus_space_write_4(iot, ioh, offset + 4, BUS_ADDR_HI32(value)); +#else + bus_space_write_4(iot, ioh, offset, BUS_ADDR_HI32(value)); + bus_space_write_4(iot, ioh, offset + 4, BUS_ADDR_LO32(value)); +#endif +} +#endif static void virtio_pci_setup_queue_10(struct virtio_softc *sc, uint16_t idx, uint64_t addr) @@ -747,15 +759,15 @@ virtio_pci_setup_queue_10(struct virtio_ bus_space_write_2(iot, ioh, VIRTIO_CONFIG1_QUEUE_SELECT, vq->vq_index); if (addr == 0) { bus_space_write_2(iot, ioh, VIRTIO_CONFIG1_QUEUE_ENABLE, 0); - bus_space_write_le_8(iot, ioh, VIRTIO_CONFIG1_QUEUE_DESC, 0); - bus_space_write_le_8(iot, ioh, VIRTIO_CONFIG1_QUEUE_AVAIL, 0); - bus_space_write_le_8(iot, ioh, VIRTIO_CONFIG1_QUEUE_USED, 0); + bus_space_write_8(iot, ioh, VIRTIO_CONFIG1_QUEUE_DESC, 0); + bus_space_write_8(iot, ioh, VIRTIO_CONFIG1_QUEUE_AVAIL, 0); + bus_space_write_8(iot, ioh, VIRTIO_CONFIG1_QUEUE_USED, 0); } else { - bus_space_write_le_8(iot, ioh, + bus_space_write_8(iot, ioh, VIRTIO_CONFIG1_QUEUE_DESC, addr); - bus_space_write_le_8(iot, ioh, + bus_space_write_8(iot, ioh, VIRTIO_CONFIG1_QUEUE_AVAIL, addr + vq->vq_availoffset); - bus_space_write_le_8(iot, ioh, + bus_space_write_8(iot, ioh, VIRTIO_CONFIG1_QUEUE_USED, addr + vq->vq_usedoffset); bus_space_write_2(iot, ioh, VIRTIO_CONFIG1_QUEUE_ENABLE, 1); @@ -771,7 +783,6 @@ virtio_pci_setup_queue_10(struct virtio_ VIRTIO_CONFIG1_QUEUE_MSIX_VECTOR, vec); } } -#undef bus_space_write_le_8 static void virtio_pci_set_status_10(struct virtio_softc *sc, int status)