Login
[x]
Log in using an account from:
Fedora Account System
Red Hat Associate
Red Hat Customer
Or login using a Red Hat Bugzilla account
Forgot Password
Login:
Hide Forgot
Create an Account
Red Hat Bugzilla – Attachment 160778 Details for
Bug 240006
mmap of VGA frame buffer causes MCA on ia64
[?]
New
Simple Search
Advanced Search
My Links
Browse
Requests
Reports
Current State
Search
Tabular reports
Graphical reports
Duplicates
Other Reports
User Changes
Plotly Reports
Bug Status
Bug Severity
Non-Defaults
|
Product Dashboard
Help
Page Help!
Bug Writing Guidelines
What's new
Browser Support Policy
5.0.4.rh83 Release notes
FAQ
Guides index
User guide
Web Services
Contact
Legal
This site requires JavaScript to be enabled to function correctly, please enable it.
[patch]
linux-2.6-ia64-ioremap-avoid-unsupported-attrs.patch
linux-2.6-ia64-ioremap-avoid-unsupported-attrs.patch (text/plain), 4.24 KB, created by
Jarod Wilson
on 2007-08-06 22:30:02 UTC
(
hide
)
Description:
linux-2.6-ia64-ioremap-avoid-unsupported-attrs.patch
Filename:
MIME Type:
Creator:
Jarod Wilson
Created:
2007-08-06 22:30:02 UTC
Size:
4.24 KB
patch
obsolete
>[PATCH] ia64: make ioremap avoid unsupported attributes > >Example memory map (from HP sx1000 with VGA enabled): > 0x00000 - 0x9FFFF supports only WB (cacheable) access > 0xA0000 - 0xBFFFF supports only UC (uncacheable) access > 0xC0000 - 0xFFFFF supports only WB (cacheable) access > >pci_read_rom() indirectly uses ioremap(0xC0000) to read the shadow VGA option >ROM. ioremap() used to default to a 16MB or 64MB UC kernel identity mapping, >which would cause an MCA when reading 0xC0000 since only WB is supported there. > >X uses reads the option ROM to initialize devices. A smaller test case is: > # echo 1 > /sys/bus/pci/devices/0000:aa:03.0/rom > # cp /sys/bus/pci/devices/0000:aa:03.0/rom x > >To avoid this, we can use the same ioremap_page_range() strategy that most >architectures use for all ioremaps. These page table mappings come out of the >vmalloc area. On ia64, these are in region 5 (0xA... addresses) and typically >use 16KB or 64KB mappings instead of 16MB or 64MB mappings. The smaller >mappings give more flexibility to use the correct attributes. > >Signed-off-by: Bjorn Helgaas <bjorn.helgaas@hp.com> > >diff -Naurp linux-2.6.18.ia64.orig/arch/ia64/mm/ioremap.c linux-2.6.18.ia64/arch/ia64/mm/ioremap.c >--- linux-2.6.18.ia64.orig/arch/ia64/mm/ioremap.c 2007-08-06 15:15:01.000000000 -0400 >+++ linux-2.6.18.ia64/arch/ia64/mm/ioremap.c 2007-08-06 15:17:48.000000000 -0400 >@@ -1,5 +1,5 @@ > /* >- * (c) Copyright 2006 Hewlett-Packard Development Company, L.P. >+ * (c) Copyright 2006, 2007 Hewlett-Packard Development Company, L.P. > * Bjorn Helgaas <bjorn.helgaas@hp.com> > * > * This program is free software; you can redistribute it and/or modify >@@ -10,6 +10,8 @@ > #include <linux/compiler.h> > #include <linux/module.h> > #include <linux/efi.h> >+#include <linux/io.h> >+#include <linux/vmalloc.h> > #include <asm/io.h> > #include <asm/meminit.h> > >@@ -27,8 +29,13 @@ __ioremap (unsigned long phys_addr, unsi > void __iomem * > ioremap (unsigned long phys_addr, unsigned long size) > { >+ void __iomem *addr; >+ struct vm_struct *area; >+ unsigned long offset; >+ pgprot_t prot; > u64 attr; > unsigned long gran_base, gran_size; >+ unsigned long page_base; > > /* > * For things in kern_memmap, we must use the same attribute >@@ -50,6 +57,41 @@ ioremap (unsigned long phys_addr, unsign > if (efi_mem_attribute(gran_base, gran_size) & EFI_MEMORY_WB) > return (void __iomem *) phys_to_virt(phys_addr); > >+ /* >+ * WB is not supported for the whole granule, so we can't use >+ * the region 7 identity mapping. If we can safely cover the >+ * area with kernel page table mappings, we can use those >+ * instead. >+ */ >+ page_base = phys_addr & PAGE_MASK; >+ size = PAGE_ALIGN(phys_addr + size) - page_base; >+ if (efi_mem_attribute(page_base, size) & EFI_MEMORY_WB) { >+ prot = PAGE_KERNEL; >+ >+ /* >+ * Mappings have to be page-aligned >+ */ >+ offset = phys_addr & ~PAGE_MASK; >+ phys_addr &= PAGE_MASK; >+ >+ /* >+ * Ok, go for it.. >+ */ >+ area = get_vm_area(size, VM_IOREMAP); >+ if (!area) >+ return NULL; >+ >+ area->phys_addr = phys_addr; >+ addr = (void __iomem *) area->addr; >+ if (ioremap_page_range((unsigned long) addr, >+ (unsigned long) addr + size, phys_addr, prot)) { >+ vunmap((void __force *) addr); >+ return NULL; >+ } >+ >+ return (void __iomem *) (offset + (char __iomem *)addr); >+ } >+ > return __ioremap(phys_addr, size); > } > EXPORT_SYMBOL(ioremap); >@@ -63,3 +105,11 @@ ioremap_nocache (unsigned long phys_addr > return __ioremap(phys_addr, size); > } > EXPORT_SYMBOL(ioremap_nocache); >+ >+void >+iounmap (volatile void __iomem *addr) >+{ >+ if (REGION_NUMBER(addr) == RGN_GATE) >+ vunmap((void __force *) addr); >+} >+EXPORT_SYMBOL(iounmap); >diff -Naurp linux-2.6.18.ia64.orig/include/asm-ia64/io.h linux-2.6.18.ia64/include/asm-ia64/io.h >--- linux-2.6.18.ia64.orig/include/asm-ia64/io.h 2007-08-06 15:14:59.000000000 -0400 >+++ linux-2.6.18.ia64/include/asm-ia64/io.h 2007-08-06 15:17:00.000000000 -0400 >@@ -458,11 +458,7 @@ __writeq (unsigned long val, volatile vo > > extern void __iomem * ioremap(unsigned long offset, unsigned long size); > extern void __iomem * ioremap_nocache (unsigned long offset, unsigned long size); >- >-static inline void >-iounmap (volatile void __iomem *addr) >-{ >-} >+extern void iounmap (volatile void __iomem *addr); > > /* Use normal IO mappings for DMI */ > #define dmi_ioremap ioremap
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 240006
:
154633
|
154634
|
154635
|
154636
|
154637
|
160776
|
160777
|
160778
|
160779
|
160780
|
160812
|
161671
|
162020