mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-11-01 17:08:10 +00:00
2e2ac4a332
The goldfish TTY device was clearly defined as having little-endian registers, but the switch to __raw_{read,write}l(() broke its driver when running on big-endian kernels (if anyone ever tried this). The m68k qemu implementation got this wrong, and assumed native-endian registers. While this is a bug in qemu, it is probably impossible to fix that since there is no way of knowing which other operating systems have started relying on that bug over the years. Hence revert commitda31de35cd
("tty: goldfish: use __raw_writel()/__raw_readl()", and define gf_ioread32()/gf_iowrite32() to be able to use accessors defined by the architecture. Cc: stable@vger.kernel.org # v5.11+ Fixes:da31de35cd
("tty: goldfish: use __raw_writel()/__raw_readl()") Signed-off-by: Laurent Vivier <laurent@vivier.eu> Link: https://lore.kernel.org/r/20220406201523.243733-2-laurent@vivier.eu [geert: Add rationale based on Arnd's comments] Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
40 lines
878 B
C
40 lines
878 B
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#ifndef __LINUX_GOLDFISH_H
|
|
#define __LINUX_GOLDFISH_H
|
|
|
|
#include <linux/kernel.h>
|
|
#include <linux/types.h>
|
|
#include <linux/io.h>
|
|
|
|
/* Helpers for Goldfish virtual platform */
|
|
|
|
#ifndef gf_ioread32
|
|
#define gf_ioread32 ioread32
|
|
#endif
|
|
#ifndef gf_iowrite32
|
|
#define gf_iowrite32 iowrite32
|
|
#endif
|
|
|
|
static inline void gf_write_ptr(const void *ptr, void __iomem *portl,
|
|
void __iomem *porth)
|
|
{
|
|
const unsigned long addr = (unsigned long)ptr;
|
|
|
|
gf_iowrite32(lower_32_bits(addr), portl);
|
|
#ifdef CONFIG_64BIT
|
|
gf_iowrite32(upper_32_bits(addr), porth);
|
|
#endif
|
|
}
|
|
|
|
static inline void gf_write_dma_addr(const dma_addr_t addr,
|
|
void __iomem *portl,
|
|
void __iomem *porth)
|
|
{
|
|
gf_iowrite32(lower_32_bits(addr), portl);
|
|
#ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT
|
|
gf_iowrite32(upper_32_bits(addr), porth);
|
|
#endif
|
|
}
|
|
|
|
|
|
#endif /* __LINUX_GOLDFISH_H */
|