Commit d8b74276 authored by Aaro Koskinen's avatar Aaro Koskinen Committed by Ralf Baechle

MIPS: cavium-octeon: fix I/O space setup on non-PCI systems

Fix I/O space setup, so that on non-PCI systems using inb()/outb()
won't crash the system. Some drivers may try to probe I/O space and for
that purpose we can just allocate some normal memory initially. Drivers
trying to reserve a region will fail early as we set the size to 0. If
a real I/O space is present, the PCI/PCIe support code will re-adjust
the values accordingly.

Tested with EdgeRouter Lite by enabling CONFIG_SERIO_I8042 that caused
the originally reported crash.
Reported-by: default avatarFaidon Liambotis <paravoid@debian.org>
Signed-off-by: default avatarAaro Koskinen <aaro.koskinen@iki.fi>
Acked-by: default avatarDavid Daney <david.daney@cavium.com>
Cc: linux-mips@linux-mips.org
Patchwork: https://patchwork.linux-mips.org/patch/5626/Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
parent 83eefabf
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
* written by Ralf Baechle <ralf@linux-mips.org> * written by Ralf Baechle <ralf@linux-mips.org>
*/ */
#include <linux/compiler.h> #include <linux/compiler.h>
#include <linux/vmalloc.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/console.h> #include <linux/console.h>
...@@ -1139,3 +1140,30 @@ static int __init edac_devinit(void) ...@@ -1139,3 +1140,30 @@ static int __init edac_devinit(void)
return err; return err;
} }
device_initcall(edac_devinit); device_initcall(edac_devinit);
static void __initdata *octeon_dummy_iospace;
static int __init octeon_no_pci_init(void)
{
/*
* Initially assume there is no PCI. The PCI/PCIe platform code will
* later re-initialize these to correct values if they are present.
*/
octeon_dummy_iospace = vzalloc(IO_SPACE_LIMIT);
set_io_port_base((unsigned long)octeon_dummy_iospace);
ioport_resource.start = MAX_RESOURCE;
ioport_resource.end = 0;
return 0;
}
core_initcall(octeon_no_pci_init);
static int __init octeon_no_pci_release(void)
{
/*
* Release the allocated memory if a real IO space is there.
*/
if ((unsigned long)octeon_dummy_iospace != mips_io_port_base)
vfree(octeon_dummy_iospace);
return 0;
}
late_initcall(octeon_no_pci_release);
...@@ -586,15 +586,16 @@ static int __init octeon_pci_setup(void) ...@@ -586,15 +586,16 @@ static int __init octeon_pci_setup(void)
else else
octeon_dma_bar_type = OCTEON_DMA_BAR_TYPE_BIG; octeon_dma_bar_type = OCTEON_DMA_BAR_TYPE_BIG;
/* PCI I/O and PCI MEM values */
set_io_port_base(OCTEON_PCI_IOSPACE_BASE);
ioport_resource.start = 0;
ioport_resource.end = OCTEON_PCI_IOSPACE_SIZE - 1;
if (!octeon_is_pci_host()) { if (!octeon_is_pci_host()) {
pr_notice("Not in host mode, PCI Controller not initialized\n"); pr_notice("Not in host mode, PCI Controller not initialized\n");
return 0; return 0;
} }
/* PCI I/O and PCI MEM values */
set_io_port_base(OCTEON_PCI_IOSPACE_BASE);
ioport_resource.start = 0;
ioport_resource.end = OCTEON_PCI_IOSPACE_SIZE - 1;
pr_notice("%s Octeon big bar support\n", pr_notice("%s Octeon big bar support\n",
(octeon_dma_bar_type == (octeon_dma_bar_type ==
OCTEON_DMA_BAR_TYPE_BIG) ? "Enabling" : "Disabling"); OCTEON_DMA_BAR_TYPE_BIG) ? "Enabling" : "Disabling");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment