From: Andrew Morton Kills the Vaio: no netconsole, fails at "mountL could not find filesystem /dev/root" in initrd. Cc: Andi Kleen Signed-off-by: Andrew Morton --- arch/i386/pci/mmconfig.c | 14 ++++++----- arch/i386/pci/pci.h | 43 ----------------------------------- arch/x86_64/pci/mmconfig.c | 12 ++++----- 3 files changed, 14 insertions(+), 55 deletions(-) diff -puN arch/i386/pci/mmconfig.c~revert-x86_64-mm-pci-mmconfig-eax arch/i386/pci/mmconfig.c --- a/arch/i386/pci/mmconfig.c~revert-x86_64-mm-pci-mmconfig-eax +++ a/arch/i386/pci/mmconfig.c @@ -82,15 +82,16 @@ static int pci_mmcfg_read(unsigned int s switch (len) { case 1: - *value = mmio_config_readb(mmcfg_virt_addr + reg); + *value = readb(mmcfg_virt_addr + reg); break; case 2: - *value = mmio_config_readw(mmcfg_virt_addr + reg); + *value = readw(mmcfg_virt_addr + reg); break; case 4: - *value = mmio_config_readl(mmcfg_virt_addr + reg); + *value = readl(mmcfg_virt_addr + reg); break; } + spin_unlock_irqrestore(&pci_config_lock, flags); return 0; @@ -115,15 +116,16 @@ static int pci_mmcfg_write(unsigned int switch (len) { case 1: - mmio_config_writeb(mmcfg_virt_addr, value); + writeb(value, mmcfg_virt_addr + reg); break; case 2: - mmio_config_writew(mmcfg_virt_addr, value); + writew(value, mmcfg_virt_addr + reg); break; case 4: - mmio_config_writel(mmcfg_virt_addr, value); + writel(value, mmcfg_virt_addr + reg); break; } + spin_unlock_irqrestore(&pci_config_lock, flags); return 0; diff -puN arch/i386/pci/pci.h~revert-x86_64-mm-pci-mmconfig-eax arch/i386/pci/pci.h --- a/arch/i386/pci/pci.h~revert-x86_64-mm-pci-mmconfig-eax +++ a/arch/i386/pci/pci.h @@ -104,46 +104,3 @@ extern DECLARE_BITMAP(pci_mmcfg_fallback extern int __init pci_mmcfg_arch_reachable(unsigned int seg, unsigned int bus, unsigned int devfn); extern int __init pci_mmcfg_arch_init(void); - -/* - * AMD Fam10h CPUs are buggy, and cannot access MMIO config space - * on their northbrige except through the * %eax register. As such, you MUST - * NOT use normal IOMEM accesses, you need to only use the magic mmio-config - * accessor functions. - * In fact just use pci_config_*, nothing else please. - */ -static inline unsigned char mmio_config_readb(void __iomem *pos) -{ - u8 val; - asm volatile("movb (%1),%%al" : "=a" (val) : "r" (pos)); - return val; -} - -static inline unsigned short mmio_config_readw(void __iomem *pos) -{ - u16 val; - asm volatile("movw (%1),%%ax" : "=a" (val) : "r" (pos)); - return val; -} - -static inline unsigned int mmio_config_readl(void __iomem *pos) -{ - u32 val; - asm volatile("movl (%1),%%eax" : "=a" (val) : "r" (pos)); - return val; -} - -static inline void mmio_config_writeb(void __iomem *pos, u8 val) -{ - asm volatile("movb %%al,(%1)" :: "a" (val), "r" (pos) : "memory"); -} - -static inline void mmio_config_writew(void __iomem *pos, u16 val) -{ - asm volatile("movw %%ax,(%1)" :: "a" (val), "r" (pos) : "memory"); -} - -static inline void mmio_config_writel(void __iomem *pos, u32 val) -{ - asm volatile("movl %%eax,(%1)" :: "a" (val), "r" (pos) : "memory"); -} diff -puN arch/x86_64/pci/mmconfig.c~revert-x86_64-mm-pci-mmconfig-eax arch/x86_64/pci/mmconfig.c --- a/arch/x86_64/pci/mmconfig.c~revert-x86_64-mm-pci-mmconfig-eax +++ a/arch/x86_64/pci/mmconfig.c @@ -66,13 +66,13 @@ static int pci_mmcfg_read(unsigned int s switch (len) { case 1: - *value = mmio_config_readb(addr + reg); + *value = readb(addr + reg); break; case 2: - *value = mmio_config_readw(addr + reg); + *value = readw(addr + reg); break; case 4: - *value = mmio_config_readl(addr + reg); + *value = readl(addr + reg); break; } @@ -94,13 +94,13 @@ static int pci_mmcfg_write(unsigned int switch (len) { case 1: - mmio_config_writeb(addr + reg, value); + writeb(value, addr + reg); break; case 2: - mmio_config_writew(addr + reg, value); + writew(value, addr + reg); break; case 4: - mmio_config_writel(addr + reg, value); + writel(value, addr + reg); break; } _