Commit 61434392 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'upstream' of git://git.kernel.org/pub/scm/linux/kernel/git/ralf/upstream-linus

* 'upstream' of git://git.kernel.org/pub/scm/linux/kernel/git/ralf/upstream-linus:
  [MIPS] XSS1500: Fix compilation
  [MIPS] Bigsur: make defconfig more useful.
  [MIPS] Alchemy: work around clock misdetection on early Au1000
  [MIPS] Add missing 4KEC TLB refill handler
  [MIPS] BCM1480: Fix PCI/HT IO access
  [MIPS] Fix the installation condition of MIPS clocksource
  [MIPS] Check for GCC r10k-cache-barrier support
  [MIPS] I8253: Export i2853_lock to modules.
  [MIPS] VPE loader: Check result of memory allocation.
parents 0e45adb8 f9e8b782
...@@ -482,10 +482,13 @@ endif ...@@ -482,10 +482,13 @@ endif
# be 16kb aligned or the handling of the current variable will break. # be 16kb aligned or the handling of the current variable will break.
# Simplified: what IP22 does at 128MB+ in ksegN, IP28 does at 512MB+ in xkphys # Simplified: what IP22 does at 128MB+ in ksegN, IP28 does at 512MB+ in xkphys
# #
#core-$(CONFIG_SGI_IP28) += arch/mips/sgi-ip22/ arch/mips/arc/arc_con.o ifdef CONFIG_SGI_IP28
ifeq ($(call cc-option-yn,-mr10k-cache-barrier=1), n)
$(error gcc doesn't support needed option -mr10k-cache-barrier=1)
endif
endif
core-$(CONFIG_SGI_IP28) += arch/mips/sgi-ip22/ core-$(CONFIG_SGI_IP28) += arch/mips/sgi-ip22/
cflags-$(CONFIG_SGI_IP28) += -mr10k-cache-barrier=1 -Iinclude/asm-mips/mach-ip28 cflags-$(CONFIG_SGI_IP28) += -mr10k-cache-barrier=1 -Iinclude/asm-mips/mach-ip28
#cflags-$(CONFIG_SGI_IP28) += -Iinclude/asm-mips/mach-ip28
load-$(CONFIG_SGI_IP28) += 0xa800000020004000 load-$(CONFIG_SGI_IP28) += 0xa800000020004000
# #
......
...@@ -22,24 +22,24 @@ struct cpu_spec* cur_cpu_spec[NR_CPUS]; ...@@ -22,24 +22,24 @@ struct cpu_spec* cur_cpu_spec[NR_CPUS];
/* With some thought, we can probably use the mask to reduce the /* With some thought, we can probably use the mask to reduce the
* size of the table. * size of the table.
*/ */
struct cpu_spec cpu_specs[] = { struct cpu_spec cpu_specs[] = {
{ 0xffffffff, 0x00030100, "Au1000 DA", 1, 0 }, { 0xffffffff, 0x00030100, "Au1000 DA", 1, 0, 1 },
{ 0xffffffff, 0x00030201, "Au1000 HA", 1, 0 }, { 0xffffffff, 0x00030201, "Au1000 HA", 1, 0, 1 },
{ 0xffffffff, 0x00030202, "Au1000 HB", 1, 0 }, { 0xffffffff, 0x00030202, "Au1000 HB", 1, 0, 1 },
{ 0xffffffff, 0x00030203, "Au1000 HC", 1, 1 }, { 0xffffffff, 0x00030203, "Au1000 HC", 1, 1, 0 },
{ 0xffffffff, 0x00030204, "Au1000 HD", 1, 1 }, { 0xffffffff, 0x00030204, "Au1000 HD", 1, 1, 0 },
{ 0xffffffff, 0x01030200, "Au1500 AB", 1, 1 }, { 0xffffffff, 0x01030200, "Au1500 AB", 1, 1, 0 },
{ 0xffffffff, 0x01030201, "Au1500 AC", 0, 1 }, { 0xffffffff, 0x01030201, "Au1500 AC", 0, 1, 0 },
{ 0xffffffff, 0x01030202, "Au1500 AD", 0, 1 }, { 0xffffffff, 0x01030202, "Au1500 AD", 0, 1, 0 },
{ 0xffffffff, 0x02030200, "Au1100 AB", 1, 1 }, { 0xffffffff, 0x02030200, "Au1100 AB", 1, 1, 0 },
{ 0xffffffff, 0x02030201, "Au1100 BA", 1, 1 }, { 0xffffffff, 0x02030201, "Au1100 BA", 1, 1, 0 },
{ 0xffffffff, 0x02030202, "Au1100 BC", 1, 1 }, { 0xffffffff, 0x02030202, "Au1100 BC", 1, 1, 0 },
{ 0xffffffff, 0x02030203, "Au1100 BD", 0, 1 }, { 0xffffffff, 0x02030203, "Au1100 BD", 0, 1, 0 },
{ 0xffffffff, 0x02030204, "Au1100 BE", 0, 1 }, { 0xffffffff, 0x02030204, "Au1100 BE", 0, 1, 0 },
{ 0xffffffff, 0x03030200, "Au1550 AA", 0, 1 }, { 0xffffffff, 0x03030200, "Au1550 AA", 0, 1, 0 },
{ 0xffffffff, 0x04030200, "Au1200 AB", 0, 0 }, { 0xffffffff, 0x04030200, "Au1200 AB", 0, 0, 0 },
{ 0xffffffff, 0x04030201, "Au1200 AC", 1, 0 }, { 0xffffffff, 0x04030201, "Au1200 AC", 1, 0, 0 },
{ 0x00000000, 0x00000000, "Unknown Au1xxx", 1, 0 }, { 0x00000000, 0x00000000, "Unknown Au1xxx", 1, 0, 0 }
}; };
void void
......
...@@ -57,7 +57,7 @@ void __init plat_mem_setup(void) ...@@ -57,7 +57,7 @@ void __init plat_mem_setup(void)
{ {
struct cpu_spec *sp; struct cpu_spec *sp;
char *argptr; char *argptr;
unsigned long prid, cpupll, bclk = 1; unsigned long prid, cpufreq, bclk = 1;
set_cpuspec(); set_cpuspec();
sp = cur_cpu_spec[0]; sp = cur_cpu_spec[0];
...@@ -65,8 +65,15 @@ void __init plat_mem_setup(void) ...@@ -65,8 +65,15 @@ void __init plat_mem_setup(void)
board_setup(); /* board specific setup */ board_setup(); /* board specific setup */
prid = read_c0_prid(); prid = read_c0_prid();
cpupll = (au_readl(0xB1900060) & 0x3F) * 12; if (sp->cpu_pll_wo)
printk("(PRId %08lx) @ %ldMHZ\n", prid, cpupll); #ifdef CONFIG_SOC_AU1000_FREQUENCY
cpufreq = CONFIG_SOC_AU1000_FREQUENCY / 1000000;
#else
cpufreq = 396;
#endif
else
cpufreq = (au_readl(SYS_CPUPLL) & 0x3F) * 12;
printk(KERN_INFO "(PRID %08lx) @ %ld MHz\n", prid, cpufreq);
bclk = sp->cpu_bclk; bclk = sp->cpu_bclk;
if (bclk) if (bclk)
......
...@@ -209,18 +209,22 @@ unsigned long cal_r4koff(void) ...@@ -209,18 +209,22 @@ unsigned long cal_r4koff(void)
while (au_readl(SYS_COUNTER_CNTRL) & SYS_CNTRL_C1S); while (au_readl(SYS_COUNTER_CNTRL) & SYS_CNTRL_C1S);
au_writel(0, SYS_TOYWRITE); au_writel(0, SYS_TOYWRITE);
while (au_readl(SYS_COUNTER_CNTRL) & SYS_CNTRL_C1S); while (au_readl(SYS_COUNTER_CNTRL) & SYS_CNTRL_C1S);
} else
no_au1xxx_32khz = 1;
cpu_speed = (au_readl(SYS_CPUPLL) & 0x0000003f) * /*
AU1000_SRC_CLK; * On early Au1000, sys_cpupll was write-only. Since these
} * silicon versions of Au1000 are not sold by AMD, we don't bend
else { * over backwards trying to determine the frequency.
/* The 32KHz oscillator isn't running, so assume there */
* isn't one and grab the processor speed from the PLL. if (cur_cpu_spec[0]->cpu_pll_wo)
* NOTE: some old silicon doesn't allow reading the PLL. #ifdef CONFIG_SOC_AU1000_FREQUENCY
*/ cpu_speed = CONFIG_SOC_AU1000_FREQUENCY;
#else
cpu_speed = 396000000;
#endif
else
cpu_speed = (au_readl(SYS_CPUPLL) & 0x0000003f) * AU1000_SRC_CLK; cpu_speed = (au_readl(SYS_CPUPLL) & 0x0000003f) * AU1000_SRC_CLK;
no_au1xxx_32khz = 1;
}
mips_hpt_frequency = cpu_speed; mips_hpt_frequency = cpu_speed;
// Equation: Baudrate = CPU / (SD * 2 * CLKDIV * 16) // Equation: Baudrate = CPU / (SD * 2 * CLKDIV * 16)
set_au1x00_uart_baud_base(cpu_speed / (2 * ((int)(au_readl(SYS_POWERCTRL)&0x03) + 2) * 16)); set_au1x00_uart_baud_base(cpu_speed / (2 * ((int)(au_readl(SYS_POWERCTRL)&0x03) + 2) * 16));
......
...@@ -33,11 +33,10 @@ ...@@ -33,11 +33,10 @@
#include <asm/cpu.h> #include <asm/cpu.h>
#include <asm/bootinfo.h> #include <asm/bootinfo.h>
#include <asm/irq.h> #include <asm/irq.h>
#include <asm/keyboard.h>
#include <asm/mipsregs.h> #include <asm/mipsregs.h>
#include <asm/reboot.h> #include <asm/reboot.h>
#include <asm/pgtable.h> #include <asm/pgtable.h>
#include <asm/au1000.h> #include <asm/mach-au1x00/au1000.h>
void board_reset(void) void board_reset(void)
{ {
......
...@@ -45,7 +45,7 @@ ...@@ -45,7 +45,7 @@
#include <asm/io.h> #include <asm/io.h>
#include <asm/mipsregs.h> #include <asm/mipsregs.h>
#include <asm/system.h> #include <asm/system.h>
#include <asm/au1000.h> #include <asm/mach-au1x00/au1000.h>
struct au1xxx_irqmap __initdata au1xxx_irq_map[] = { struct au1xxx_irqmap __initdata au1xxx_irq_map[] = {
{ AU1500_GPIO_204, INTC_INT_HIGH_LEVEL, 0}, { AU1500_GPIO_204, INTC_INT_HIGH_LEVEL, 0},
......
This diff is collapsed.
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include <asm/time.h> #include <asm/time.h>
DEFINE_SPINLOCK(i8253_lock); DEFINE_SPINLOCK(i8253_lock);
EXPORT_SYMBOL(i8253_lock);
/* /*
* Initialize the PIT timer. * Initialize the PIT timer.
......
...@@ -157,6 +157,6 @@ void __init time_init(void) ...@@ -157,6 +157,6 @@ void __init time_init(void)
{ {
plat_time_init(); plat_time_init();
if (mips_clockevent_init() || !cpu_has_mfc0_count_bug()) if (!mips_clockevent_init() || !cpu_has_mfc0_count_bug())
init_mips_clocksource(); init_mips_clocksource();
} }
...@@ -262,13 +262,21 @@ void dump_mtregs(void) ...@@ -262,13 +262,21 @@ void dump_mtregs(void)
/* Find some VPE program space */ /* Find some VPE program space */
static void *alloc_progmem(unsigned long len) static void *alloc_progmem(unsigned long len)
{ {
void *addr;
#ifdef CONFIG_MIPS_VPE_LOADER_TOM #ifdef CONFIG_MIPS_VPE_LOADER_TOM
/* this means you must tell linux to use less memory than you physically have */ /*
return pfn_to_kaddr(max_pfn); * This means you must tell Linux to use less memory than you
* physically have, for example by passing a mem= boot argument.
*/
addr = pfn_to_kaddr(max_pfn);
memset(addr, 0, len);
#else #else
// simple grab some mem for now /* simple grab some mem for now */
return kmalloc(len, GFP_KERNEL); addr = kzalloc(len, GFP_KERNEL);
#endif #endif
return addr;
} }
static void release_progmem(void *ptr) static void release_progmem(void *ptr)
...@@ -884,9 +892,10 @@ static int vpe_elfload(struct vpe * v) ...@@ -884,9 +892,10 @@ static int vpe_elfload(struct vpe * v)
} }
v->load_addr = alloc_progmem(mod.core_size); v->load_addr = alloc_progmem(mod.core_size);
memset(v->load_addr, 0, mod.core_size); if (!v->load_addr)
return -ENOMEM;
printk("VPE loader: loading to %p\n", v->load_addr); pr_info("VPE loader: loading to %p\n", v->load_addr);
if (relocate) { if (relocate) {
for (i = 0; i < hdr->e_shnum; i++) { for (i = 0; i < hdr->e_shnum; i++) {
......
...@@ -307,6 +307,7 @@ static void __cpuinit build_tlb_write_entry(u32 **p, struct uasm_label **l, ...@@ -307,6 +307,7 @@ static void __cpuinit build_tlb_write_entry(u32 **p, struct uasm_label **l,
case CPU_R12000: case CPU_R12000:
case CPU_R14000: case CPU_R14000:
case CPU_4KC: case CPU_4KC:
case CPU_4KEC:
case CPU_SB1: case CPU_SB1:
case CPU_SB1A: case CPU_SB1A:
case CPU_4KSC: case CPU_4KSC:
......
...@@ -185,8 +185,8 @@ static struct resource bcm1480_mem_resource = { ...@@ -185,8 +185,8 @@ static struct resource bcm1480_mem_resource = {
static struct resource bcm1480_io_resource = { static struct resource bcm1480_io_resource = {
.name = "BCM1480 PCI I/O", .name = "BCM1480 PCI I/O",
.start = 0x2c000000UL, .start = A_BCM1480_PHYS_PCI_IO_MATCH_BYTES,
.end = 0x2dffffffUL, .end = A_BCM1480_PHYS_PCI_IO_MATCH_BYTES + 0x1ffffffUL,
.flags = IORESOURCE_IO, .flags = IORESOURCE_IO,
}; };
...@@ -194,6 +194,7 @@ struct pci_controller bcm1480_controller = { ...@@ -194,6 +194,7 @@ struct pci_controller bcm1480_controller = {
.pci_ops = &bcm1480_pci_ops, .pci_ops = &bcm1480_pci_ops,
.mem_resource = &bcm1480_mem_resource, .mem_resource = &bcm1480_mem_resource,
.io_resource = &bcm1480_io_resource, .io_resource = &bcm1480_io_resource,
.io_offset = A_BCM1480_PHYS_PCI_IO_MATCH_BYTES,
}; };
...@@ -251,6 +252,7 @@ static int __init bcm1480_pcibios_init(void) ...@@ -251,6 +252,7 @@ static int __init bcm1480_pcibios_init(void)
bcm1480_controller.io_map_base = (unsigned long) bcm1480_controller.io_map_base = (unsigned long)
ioremap(A_BCM1480_PHYS_PCI_IO_MATCH_BYTES, 65536); ioremap(A_BCM1480_PHYS_PCI_IO_MATCH_BYTES, 65536);
bcm1480_controller.io_map_base -= bcm1480_controller.io_offset;
set_io_port_base(bcm1480_controller.io_map_base); set_io_port_base(bcm1480_controller.io_map_base);
isa_slot_offset = (unsigned long) isa_slot_offset = (unsigned long)
ioremap(A_BCM1480_PHYS_PCI_MEM_MATCH_BYTES, 1024*1024); ioremap(A_BCM1480_PHYS_PCI_MEM_MATCH_BYTES, 1024*1024);
......
...@@ -180,8 +180,8 @@ static struct resource bcm1480ht_mem_resource = { ...@@ -180,8 +180,8 @@ static struct resource bcm1480ht_mem_resource = {
static struct resource bcm1480ht_io_resource = { static struct resource bcm1480ht_io_resource = {
.name = "BCM1480 HT I/O", .name = "BCM1480 HT I/O",
.start = 0x00000000UL, .start = A_BCM1480_PHYS_HT_IO_MATCH_BYTES,
.end = 0x01ffffffUL, .end = A_BCM1480_PHYS_HT_IO_MATCH_BYTES + 0x01ffffffUL,
.flags = IORESOURCE_IO, .flags = IORESOURCE_IO,
}; };
...@@ -191,29 +191,22 @@ struct pci_controller bcm1480ht_controller = { ...@@ -191,29 +191,22 @@ struct pci_controller bcm1480ht_controller = {
.io_resource = &bcm1480ht_io_resource, .io_resource = &bcm1480ht_io_resource,
.index = 1, .index = 1,
.get_busno = bcm1480ht_pcibios_get_busno, .get_busno = bcm1480ht_pcibios_get_busno,
.io_offset = A_BCM1480_PHYS_HT_IO_MATCH_BYTES,
}; };
static int __init bcm1480ht_pcibios_init(void) static int __init bcm1480ht_pcibios_init(void)
{ {
uint32_t cmdreg;
ht_cfg_space = ioremap(A_BCM1480_PHYS_HT_CFG_MATCH_BITS, 16*1024*1024); ht_cfg_space = ioremap(A_BCM1480_PHYS_HT_CFG_MATCH_BITS, 16*1024*1024);
/* /* CFE doesn't always init all HT paths, so we always scan */
* See if the PCI bus has been configured by the firmware.
*/
cmdreg = READCFG32(CFGOFFSET(0, PCI_DEVFN(PCI_BRIDGE_DEVICE, 0),
PCI_COMMAND));
if (!(cmdreg & PCI_COMMAND_MASTER)) {
printk("HT: Skipping HT probe. Bus is not initialized.\n");
iounmap(ht_cfg_space);
return 1; /* XXX */
}
bcm1480ht_bus_status |= PCI_BUS_ENABLED; bcm1480ht_bus_status |= PCI_BUS_ENABLED;
ht_eoi_space = (unsigned long) ht_eoi_space = (unsigned long)
ioremap(A_BCM1480_PHYS_HT_SPECIAL_MATCH_BYTES, ioremap(A_BCM1480_PHYS_HT_SPECIAL_MATCH_BYTES,
4 * 1024 * 1024); 4 * 1024 * 1024);
bcm1480ht_controller.io_map_base = (unsigned long)
ioremap(A_BCM1480_PHYS_HT_IO_MATCH_BYTES, 65536);
bcm1480ht_controller.io_map_base -= bcm1480ht_controller.io_offset;
register_pci_controller(&bcm1480ht_controller); register_pci_controller(&bcm1480ht_controller);
......
...@@ -1786,6 +1786,7 @@ struct cpu_spec { ...@@ -1786,6 +1786,7 @@ struct cpu_spec {
char *cpu_name; char *cpu_name;
unsigned char cpu_od; /* Set Config[OD] */ unsigned char cpu_od; /* Set Config[OD] */
unsigned char cpu_bclk; /* Enable BCLK switching */ unsigned char cpu_bclk; /* Enable BCLK switching */
unsigned char cpu_pll_wo; /* sys_cpupll reg. write-only */
}; };
extern struct cpu_spec cpu_specs[]; extern struct cpu_spec cpu_specs[];
......
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