aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/bochs
diff options
context:
space:
mode:
authorGerd Hoffmann <kraxel@redhat.com>2014-11-19 06:28:10 -0500
committerDave Airlie <airlied@redhat.com>2014-11-19 20:26:54 -0500
commit9ecdb039b7517dc10b8c3e6dbeb40859178ac28e (patch)
treeccfa96d234aba069be442c9569ed3226f132045d /drivers/gpu/drm/bochs
parentfbd2f9fe97726944f98d9a5813d08372446b6a37 (diff)
bochs: add endian switching support
Recently (qemu 2.2+) the qemu stdvga got a register to switch the vga framebuffer endianness. This patch adds code to explicitly set the endianness of the framebuffer. In most cases this has no effect as the default is guest architecture endianness. It is needed though in case a architecture supports both big and little endian, i.e. for ppc64le. Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/bochs')
-rw-r--r--drivers/gpu/drm/bochs/bochs_hw.c20
1 files changed, 19 insertions, 1 deletions
diff --git a/drivers/gpu/drm/bochs/bochs_hw.c b/drivers/gpu/drm/bochs/bochs_hw.c
index e8b1dacc4911..460389702d31 100644
--- a/drivers/gpu/drm/bochs/bochs_hw.c
+++ b/drivers/gpu/drm/bochs/bochs_hw.c
@@ -51,7 +51,7 @@ int bochs_hw_init(struct drm_device *dev, uint32_t flags)
51{ 51{
52 struct bochs_device *bochs = dev->dev_private; 52 struct bochs_device *bochs = dev->dev_private;
53 struct pci_dev *pdev = dev->pdev; 53 struct pci_dev *pdev = dev->pdev;
54 unsigned long addr, size, mem, ioaddr, iosize; 54 unsigned long addr, size, mem, ioaddr, iosize, qext_size;
55 u16 id; 55 u16 id;
56 56
57 if (pdev->resource[2].flags & IORESOURCE_MEM) { 57 if (pdev->resource[2].flags & IORESOURCE_MEM) {
@@ -115,6 +115,24 @@ int bochs_hw_init(struct drm_device *dev, uint32_t flags)
115 size / 1024, addr, 115 size / 1024, addr,
116 bochs->ioports ? "ioports" : "mmio", 116 bochs->ioports ? "ioports" : "mmio",
117 ioaddr); 117 ioaddr);
118
119 if (bochs->mmio && pdev->revision >= 2) {
120 qext_size = readl(bochs->mmio + 0x600);
121 if (qext_size < 4 || qext_size > iosize)
122 goto noext;
123 DRM_DEBUG("Found qemu ext regs, size %ld\n", qext_size);
124 if (qext_size >= 8) {
125#ifdef __BIG_ENDIAN
126 writel(0xbebebebe, bochs->mmio + 0x604);
127#else
128 writel(0x1e1e1e1e, bochs->mmio + 0x604);
129#endif
130 DRM_DEBUG(" qext endian: 0x%x\n",
131 readl(bochs->mmio + 0x604));
132 }
133 }
134
135noext:
118 return 0; 136 return 0;
119} 137}
120 138