Commit b84449dc authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'parisc-4.15-3' of git://git.kernel.org/pub/scm/linux/kernel/git/deller/parisc-linux

Pull parisc fixes from Helge Deller:

 - Many small fixes to show the real physical addresses of devices
   instead of hashed addresses.

 - One important fix to unbreak 32-bit SMP support: We forgot to 16-byte
   align the spinlocks in the assembler code.

 - Qemu support: The host will get a chance to sleep when the parisc
   guest is idle. We use the same mechanism as the power architecture by
   overlaying the "or %r10,%r10,%r10" instruction which is simply a nop
   on real hardware.

* 'parisc-4.15-3' of git://git.kernel.org/pub/scm/linux/kernel/git/deller/parisc-linux:
  parisc: qemu idle sleep support
  parisc: Fix alignment of pa_tlb_lock in assembly on 32-bit SMP kernel
  parisc: Show unhashed EISA EEPROM address
  parisc: Show unhashed HPA of Dino chip
  parisc: Show initial kernel memory layout unhashed
  parisc: Show unhashed hardware inventory
parents 9cfd403a 310d8278
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
for the semaphore. */ for the semaphore. */
#define __PA_LDCW_ALIGNMENT 16 #define __PA_LDCW_ALIGNMENT 16
#define __PA_LDCW_ALIGN_ORDER 4
#define __ldcw_align(a) ({ \ #define __ldcw_align(a) ({ \
unsigned long __ret = (unsigned long) &(a)->lock[0]; \ unsigned long __ret = (unsigned long) &(a)->lock[0]; \
__ret = (__ret + __PA_LDCW_ALIGNMENT - 1) \ __ret = (__ret + __PA_LDCW_ALIGNMENT - 1) \
...@@ -29,6 +30,7 @@ ...@@ -29,6 +30,7 @@
ldcd). */ ldcd). */
#define __PA_LDCW_ALIGNMENT 4 #define __PA_LDCW_ALIGNMENT 4
#define __PA_LDCW_ALIGN_ORDER 2
#define __ldcw_align(a) (&(a)->slock) #define __ldcw_align(a) (&(a)->slock)
#define __LDCW "ldcw,co" #define __LDCW "ldcw,co"
......
...@@ -870,7 +870,7 @@ static void print_parisc_device(struct parisc_device *dev) ...@@ -870,7 +870,7 @@ static void print_parisc_device(struct parisc_device *dev)
static int count; static int count;
print_pa_hwpath(dev, hw_path); print_pa_hwpath(dev, hw_path);
printk(KERN_INFO "%d. %s at 0x%p [%s] { %d, 0x%x, 0x%.3x, 0x%.5x }", printk(KERN_INFO "%d. %s at 0x%px [%s] { %d, 0x%x, 0x%.3x, 0x%.5x }",
++count, dev->name, (void*) dev->hpa.start, hw_path, dev->id.hw_type, ++count, dev->name, (void*) dev->hpa.start, hw_path, dev->id.hw_type,
dev->id.hversion_rev, dev->id.hversion, dev->id.sversion); dev->id.hversion_rev, dev->id.hversion, dev->id.sversion);
......
...@@ -35,6 +35,7 @@ ...@@ -35,6 +35,7 @@
#include <asm/pgtable.h> #include <asm/pgtable.h>
#include <asm/signal.h> #include <asm/signal.h>
#include <asm/unistd.h> #include <asm/unistd.h>
#include <asm/ldcw.h>
#include <asm/thread_info.h> #include <asm/thread_info.h>
#include <linux/linkage.h> #include <linux/linkage.h>
...@@ -46,6 +47,14 @@ ...@@ -46,6 +47,14 @@
#endif #endif
.import pa_tlb_lock,data .import pa_tlb_lock,data
.macro load_pa_tlb_lock reg
#if __PA_LDCW_ALIGNMENT > 4
load32 PA(pa_tlb_lock) + __PA_LDCW_ALIGNMENT-1, \reg
depi 0,31,__PA_LDCW_ALIGN_ORDER, \reg
#else
load32 PA(pa_tlb_lock), \reg
#endif
.endm
/* space_to_prot macro creates a prot id from a space id */ /* space_to_prot macro creates a prot id from a space id */
...@@ -457,7 +466,7 @@ ...@@ -457,7 +466,7 @@
.macro tlb_lock spc,ptp,pte,tmp,tmp1,fault .macro tlb_lock spc,ptp,pte,tmp,tmp1,fault
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
cmpib,COND(=),n 0,\spc,2f cmpib,COND(=),n 0,\spc,2f
load32 PA(pa_tlb_lock),\tmp load_pa_tlb_lock \tmp
1: LDCW 0(\tmp),\tmp1 1: LDCW 0(\tmp),\tmp1
cmpib,COND(=) 0,\tmp1,1b cmpib,COND(=) 0,\tmp1,1b
nop nop
...@@ -480,7 +489,7 @@ ...@@ -480,7 +489,7 @@
/* Release pa_tlb_lock lock. */ /* Release pa_tlb_lock lock. */
.macro tlb_unlock1 spc,tmp .macro tlb_unlock1 spc,tmp
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
load32 PA(pa_tlb_lock),\tmp load_pa_tlb_lock \tmp
tlb_unlock0 \spc,\tmp tlb_unlock0 \spc,\tmp
#endif #endif
.endm .endm
......
...@@ -36,6 +36,7 @@ ...@@ -36,6 +36,7 @@
#include <asm/assembly.h> #include <asm/assembly.h>
#include <asm/pgtable.h> #include <asm/pgtable.h>
#include <asm/cache.h> #include <asm/cache.h>
#include <asm/ldcw.h>
#include <linux/linkage.h> #include <linux/linkage.h>
.text .text
...@@ -333,8 +334,12 @@ ENDPROC_CFI(flush_data_cache_local) ...@@ -333,8 +334,12 @@ ENDPROC_CFI(flush_data_cache_local)
.macro tlb_lock la,flags,tmp .macro tlb_lock la,flags,tmp
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
ldil L%pa_tlb_lock,%r1 #if __PA_LDCW_ALIGNMENT > 4
ldo R%pa_tlb_lock(%r1),\la load32 pa_tlb_lock + __PA_LDCW_ALIGNMENT-1, \la
depi 0,31,__PA_LDCW_ALIGN_ORDER, \la
#else
load32 pa_tlb_lock, \la
#endif
rsm PSW_SM_I,\flags rsm PSW_SM_I,\flags
1: LDCW 0(\la),\tmp 1: LDCW 0(\la),\tmp
cmpib,<>,n 0,\tmp,3f cmpib,<>,n 0,\tmp,3f
......
...@@ -39,6 +39,7 @@ ...@@ -39,6 +39,7 @@
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/mm.h> #include <linux/mm.h>
#include <linux/fs.h> #include <linux/fs.h>
#include <linux/cpu.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/personality.h> #include <linux/personality.h>
#include <linux/ptrace.h> #include <linux/ptrace.h>
...@@ -183,6 +184,44 @@ int dump_task_fpu (struct task_struct *tsk, elf_fpregset_t *r) ...@@ -183,6 +184,44 @@ int dump_task_fpu (struct task_struct *tsk, elf_fpregset_t *r)
return 1; return 1;
} }
/*
* Idle thread support
*
* Detect when running on QEMU with SeaBIOS PDC Firmware and let
* QEMU idle the host too.
*/
int running_on_qemu __read_mostly;
void __cpuidle arch_cpu_idle_dead(void)
{
/* nop on real hardware, qemu will offline CPU. */
asm volatile("or %%r31,%%r31,%%r31\n":::);
}
void __cpuidle arch_cpu_idle(void)
{
local_irq_enable();
/* nop on real hardware, qemu will idle sleep. */
asm volatile("or %%r10,%%r10,%%r10\n":::);
}
static int __init parisc_idle_init(void)
{
const char *marker;
/* check QEMU/SeaBIOS marker in PAGE0 */
marker = (char *) &PAGE0->pad0;
running_on_qemu = (memcmp(marker, "SeaBIOS", 8) == 0);
if (!running_on_qemu)
cpu_idle_poll_ctrl(1);
return 0;
}
arch_initcall(parisc_idle_init);
/* /*
* Copy architecture-specific thread state * Copy architecture-specific thread state
*/ */
......
...@@ -631,11 +631,11 @@ void __init mem_init(void) ...@@ -631,11 +631,11 @@ void __init mem_init(void)
mem_init_print_info(NULL); mem_init_print_info(NULL);
#ifdef CONFIG_DEBUG_KERNEL /* double-sanity-check paranoia */ #ifdef CONFIG_DEBUG_KERNEL /* double-sanity-check paranoia */
printk("virtual kernel memory layout:\n" printk("virtual kernel memory layout:\n"
" vmalloc : 0x%p - 0x%p (%4ld MB)\n" " vmalloc : 0x%px - 0x%px (%4ld MB)\n"
" memory : 0x%p - 0x%p (%4ld MB)\n" " memory : 0x%px - 0x%px (%4ld MB)\n"
" .init : 0x%p - 0x%p (%4ld kB)\n" " .init : 0x%px - 0x%px (%4ld kB)\n"
" .data : 0x%p - 0x%p (%4ld kB)\n" " .data : 0x%px - 0x%px (%4ld kB)\n"
" .text : 0x%p - 0x%p (%4ld kB)\n", " .text : 0x%px - 0x%px (%4ld kB)\n",
(void*)VMALLOC_START, (void*)VMALLOC_END, (void*)VMALLOC_START, (void*)VMALLOC_END,
(VMALLOC_END - VMALLOC_START) >> 20, (VMALLOC_END - VMALLOC_START) >> 20,
......
...@@ -303,7 +303,7 @@ static void dino_mask_irq(struct irq_data *d) ...@@ -303,7 +303,7 @@ static void dino_mask_irq(struct irq_data *d)
struct dino_device *dino_dev = irq_data_get_irq_chip_data(d); struct dino_device *dino_dev = irq_data_get_irq_chip_data(d);
int local_irq = gsc_find_local_irq(d->irq, dino_dev->global_irq, DINO_LOCAL_IRQS); int local_irq = gsc_find_local_irq(d->irq, dino_dev->global_irq, DINO_LOCAL_IRQS);
DBG(KERN_WARNING "%s(0x%p, %d)\n", __func__, dino_dev, d->irq); DBG(KERN_WARNING "%s(0x%px, %d)\n", __func__, dino_dev, d->irq);
/* Clear the matching bit in the IMR register */ /* Clear the matching bit in the IMR register */
dino_dev->imr &= ~(DINO_MASK_IRQ(local_irq)); dino_dev->imr &= ~(DINO_MASK_IRQ(local_irq));
...@@ -316,7 +316,7 @@ static void dino_unmask_irq(struct irq_data *d) ...@@ -316,7 +316,7 @@ static void dino_unmask_irq(struct irq_data *d)
int local_irq = gsc_find_local_irq(d->irq, dino_dev->global_irq, DINO_LOCAL_IRQS); int local_irq = gsc_find_local_irq(d->irq, dino_dev->global_irq, DINO_LOCAL_IRQS);
u32 tmp; u32 tmp;
DBG(KERN_WARNING "%s(0x%p, %d)\n", __func__, dino_dev, d->irq); DBG(KERN_WARNING "%s(0x%px, %d)\n", __func__, dino_dev, d->irq);
/* /*
** clear pending IRQ bits ** clear pending IRQ bits
...@@ -396,7 +396,7 @@ static irqreturn_t dino_isr(int irq, void *intr_dev) ...@@ -396,7 +396,7 @@ static irqreturn_t dino_isr(int irq, void *intr_dev)
if (mask) { if (mask) {
if (--ilr_loop > 0) if (--ilr_loop > 0)
goto ilr_again; goto ilr_again;
printk(KERN_ERR "Dino 0x%p: stuck interrupt %d\n", printk(KERN_ERR "Dino 0x%px: stuck interrupt %d\n",
dino_dev->hba.base_addr, mask); dino_dev->hba.base_addr, mask);
return IRQ_NONE; return IRQ_NONE;
} }
...@@ -553,7 +553,7 @@ dino_fixup_bus(struct pci_bus *bus) ...@@ -553,7 +553,7 @@ dino_fixup_bus(struct pci_bus *bus)
struct pci_dev *dev; struct pci_dev *dev;
struct dino_device *dino_dev = DINO_DEV(parisc_walk_tree(bus->bridge)); struct dino_device *dino_dev = DINO_DEV(parisc_walk_tree(bus->bridge));
DBG(KERN_WARNING "%s(0x%p) bus %d platform_data 0x%p\n", DBG(KERN_WARNING "%s(0x%px) bus %d platform_data 0x%px\n",
__func__, bus, bus->busn_res.start, __func__, bus, bus->busn_res.start,
bus->bridge->platform_data); bus->bridge->platform_data);
...@@ -854,7 +854,7 @@ static int __init dino_common_init(struct parisc_device *dev, ...@@ -854,7 +854,7 @@ static int __init dino_common_init(struct parisc_device *dev,
res->flags = IORESOURCE_IO; /* do not mark it busy ! */ res->flags = IORESOURCE_IO; /* do not mark it busy ! */
if (request_resource(&ioport_resource, res) < 0) { if (request_resource(&ioport_resource, res) < 0) {
printk(KERN_ERR "%s: request I/O Port region failed " printk(KERN_ERR "%s: request I/O Port region failed "
"0x%lx/%lx (hpa 0x%p)\n", "0x%lx/%lx (hpa 0x%px)\n",
name, (unsigned long)res->start, (unsigned long)res->end, name, (unsigned long)res->start, (unsigned long)res->end,
dino_dev->hba.base_addr); dino_dev->hba.base_addr);
return 1; return 1;
......
...@@ -106,7 +106,7 @@ static int __init eisa_eeprom_init(void) ...@@ -106,7 +106,7 @@ static int __init eisa_eeprom_init(void)
return retval; return retval;
} }
printk(KERN_INFO "EISA EEPROM at 0x%p\n", eisa_eeprom_addr); printk(KERN_INFO "EISA EEPROM at 0x%px\n", eisa_eeprom_addr);
return 0; return 0;
} }
......
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