# HG changeset patch # User Taylor R Campbell # Date 1733687874 0 # Sun Dec 08 19:57:54 2024 +0000 # Branch trunk # Node ID 1540d49ea628daa5a14fd14d9b575f0417e90542 # Parent c6804942bc0cd7b4a4f16abba36a9489c9814d80 # EXP-Topic riastradh-pr58305-nouveaucorenotifiertimeout drm: Use rmb/wmb to order potential prefetchable/write-combining I/O. Don't use membar_consumer/producer, which only order normal memory operations in CPU/CPU synchronization, not prefetchable / write-combining memory operations or CPU/device synchronization. Normally this should use either bus_space_barrier (for prefetchable / write-combining) or bus_dmamap_sync (for CPU/device), depending on how the memory was mapped. But threading those through the drm, nouveau, and radeon abstractions is a lot of work and likely not worth the effort. So we'll use the Linux mmio barrier naming for now. Candidate fix for (among other possible issues): PR port-amd64/58305: nouveau on Lenovo W701 doesn't display diff -r c6804942bc0c -r 1540d49ea628 sys/external/bsd/drm2/dist/drm/nouveau/nouveau_bo.c --- a/sys/external/bsd/drm2/dist/drm/nouveau/nouveau_bo.c Sat Dec 07 23:25:19 2024 +0000 +++ b/sys/external/bsd/drm2/dist/drm/nouveau/nouveau_bo.c Sun Dec 08 19:57:54 2024 +0000 @@ -634,7 +634,7 @@ ioread16_native(const void __iomem *ptr) uint16_t v; v = *(const uint16_t __iomem *)ptr; - membar_consumer(); + rmb(); return v; } @@ -646,7 +646,7 @@ ioread32_native(const void __iomem *ptr) uint32_t v; v = *(const uint32_t __iomem *)ptr; - membar_consumer(); + rmb(); return v; } @@ -655,7 +655,7 @@ static inline void iowrite16_native(uint16_t v, void __iomem *ptr) { - membar_producer(); + wmb(); *(uint16_t __iomem *)ptr = v; } @@ -663,7 +663,7 @@ static inline void iowrite32_native(uint32_t v, void __iomem *ptr) { - membar_producer(); + wmb(); *(uint32_t __iomem *)ptr = v; } #endif diff -r c6804942bc0c -r 1540d49ea628 sys/external/bsd/drm2/dist/drm/nouveau/nvkm/core/nouveau_nvkm_core_gpuobj.c --- a/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/core/nouveau_nvkm_core_gpuobj.c Sat Dec 07 23:25:19 2024 +0000 +++ b/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/core/nouveau_nvkm_core_gpuobj.c Sun Dec 08 19:57:54 2024 +0000 @@ -51,7 +51,7 @@ ioread32_native(const void __iomem *ptr) uint32_t v; v = *(const uint32_t __iomem *)ptr; - membar_consumer(); + rmb(); return v; } @@ -60,7 +60,7 @@ static inline void iowrite32_native(uint32_t v, void __iomem *ptr) { - membar_producer(); + wmb(); *(uint32_t __iomem *)ptr = v; } diff -r c6804942bc0c -r 1540d49ea628 sys/external/bsd/drm2/dist/drm/nouveau/nvkm/subdev/devinit/fbmem.h --- a/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/subdev/devinit/fbmem.h Sat Dec 07 23:25:19 2024 +0000 +++ b/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/subdev/devinit/fbmem.h Sun Dec 08 19:57:54 2024 +0000 @@ -80,7 +80,7 @@ ioread32(const void __iomem *p) { const uint32_t v = *(const uint32_t __iomem *)p; - membar_consumer(); + rmb(); return v; /* XXX nouveau byte order */ } @@ -89,7 +89,7 @@ static inline void iowrite32(uint32_t v, void __iomem *p) { - membar_producer(); + wmb(); *(uint32_t __iomem *)p = v; /* XXX nouveau byte order */ } #endif diff -r c6804942bc0c -r 1540d49ea628 sys/external/bsd/drm2/dist/drm/radeon/radeon_r300.c --- a/sys/external/bsd/drm2/dist/drm/radeon/radeon_r300.c Sat Dec 07 23:25:19 2024 +0000 +++ b/sys/external/bsd/drm2/dist/drm/radeon/radeon_r300.c Sun Dec 08 19:57:54 2024 +0000 @@ -136,7 +136,7 @@ static inline void fake_writel(uint32_t v, void __iomem *ptr) { - membar_producer(); + wmb(); *(uint32_t __iomem *)ptr = v; } #endif diff -r c6804942bc0c -r 1540d49ea628 sys/external/bsd/drm2/dist/drm/radeon/radeon_r600.c --- a/sys/external/bsd/drm2/dist/drm/radeon/radeon_r600.c Sat Dec 07 23:25:19 2024 +0000 +++ b/sys/external/bsd/drm2/dist/drm/radeon/radeon_r600.c Sun Dec 08 19:57:54 2024 +0000 @@ -1091,7 +1091,7 @@ fake_readl(const void __iomem *ptr) uint32_t v; v = *(const uint32_t __iomem *)ptr; - membar_consumer(); + rmb(); return v; } diff -r c6804942bc0c -r 1540d49ea628 sys/external/bsd/drm2/dist/drm/radeon/radeon_rs600.c --- a/sys/external/bsd/drm2/dist/drm/radeon/radeon_rs600.c Sat Dec 07 23:25:19 2024 +0000 +++ b/sys/external/bsd/drm2/dist/drm/radeon/radeon_rs600.c Sun Dec 08 19:57:54 2024 +0000 @@ -663,7 +663,7 @@ static inline void fake_writeq(uint64_t v, void __iomem *ptr) { - membar_producer(); + wmb(); *(uint64_t __iomem *)ptr = v; } #endif