Commit 7286d2a3 authored by Linus Torvalds's avatar Linus Torvalds

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

Pull parisc updates from Helge Deller:

 - Added fw_cfg support for parisc on qemu

 - Added font support in sti text console driver for byte- and word-mode
   ROMs

 - Switch to more fine grained lws locks and improve spinlock handling

 - Add ioread64_hi_lo() and iowrite64_hi_lo() to avoid 0-day linking
   errors

 - Mark pointers volatile in __xchg8(), __xchg32() and __xchg64() to
   help compiler

 - Header file cleanups, mostly removal of unused HP-UX compat defines

 - Drop one bit from our O_NONBLOCK define to become now 000200000

 - Add MAP_UNINITIALIZED define to avoid userspace compile errors

 - Drop CONFIG_IDE from defconfigs

 - Speed up synchronize_caches() on UP machines

 - Rewrite tlb flush threshold calculation

 - Comment fixes and cleanups

* 'parisc-5.10-1' of git://git.kernel.org/pub/scm/linux/kernel/git/deller/parisc-linux:
  parisc/sticon: Add user font support
  parisc/sticon: Always register sticon console driver
  parisc: Add MAP_UNINITIALIZED define
  parisc: Improve spinlock handling
  parisc: Install vmlinuz instead of zImage file
  parisc: Rewrite tlb flush threshold calculation
  parisc: Switch to more fine grained lws locks
  parisc: Mark pointers volatile in __xchg8(), __xchg32() and __xchg64()
  parisc: Fix comments and enable interrupts later
  parisc: Add alternative patching to synchronize_caches define
  parisc: Add ioread64_hi_lo() and iowrite64_hi_lo()
  parisc: disable CONFIG_IDE in defconfigs
  parisc: Drop useless comments in uapi/asm/signal.h
  parisc: Define O_NONBLOCK to become 000200000
  parisc: Drop HP-UX specific fcntl and signal flags
  parisc: Avoid external interrupts when IPI finishes
  parisc: Add qemu fw_cfg interface
  fw_cfg: Add support for parisc architecture
parents 578a7155 7ff3f14d
...@@ -375,5 +375,6 @@ config KEXEC_FILE ...@@ -375,5 +375,6 @@ config KEXEC_FILE
endmenu endmenu
source "drivers/firmware/Kconfig"
source "drivers/parisc/Kconfig" source "drivers/parisc/Kconfig"
...@@ -52,10 +52,6 @@ CONFIG_BLK_DEV_LOOP=y ...@@ -52,10 +52,6 @@ CONFIG_BLK_DEV_LOOP=y
CONFIG_BLK_DEV_CRYPTOLOOP=y CONFIG_BLK_DEV_CRYPTOLOOP=y
CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM=y
CONFIG_BLK_DEV_RAM_SIZE=6144 CONFIG_BLK_DEV_RAM_SIZE=6144
CONFIG_IDE=y
CONFIG_BLK_DEV_IDECD=y
CONFIG_BLK_DEV_GENERIC=y
CONFIG_BLK_DEV_NS87415=y
CONFIG_BLK_DEV_SD=y CONFIG_BLK_DEV_SD=y
CONFIG_CHR_DEV_ST=y CONFIG_CHR_DEV_ST=y
CONFIG_BLK_DEV_SR=y CONFIG_BLK_DEV_SR=y
...@@ -65,6 +61,8 @@ CONFIG_SCSI_SYM53C8XX_2=y ...@@ -65,6 +61,8 @@ CONFIG_SCSI_SYM53C8XX_2=y
CONFIG_SCSI_ZALON=y CONFIG_SCSI_ZALON=y
CONFIG_SCSI_DH=y CONFIG_SCSI_DH=y
CONFIG_ATA=y CONFIG_ATA=y
CONFIG_ATA_GENERIC=y
CONFIG_PATA_NS87415=y
CONFIG_MD=y CONFIG_MD=y
CONFIG_BLK_DEV_MD=m CONFIG_BLK_DEV_MD=m
CONFIG_MD_LINEAR=m CONFIG_MD_LINEAR=m
......
...@@ -58,11 +58,6 @@ CONFIG_PCI_IOV=y ...@@ -58,11 +58,6 @@ CONFIG_PCI_IOV=y
CONFIG_DEVTMPFS=y CONFIG_DEVTMPFS=y
CONFIG_DEVTMPFS_MOUNT=y CONFIG_DEVTMPFS_MOUNT=y
CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_LOOP=y
CONFIG_IDE=y
CONFIG_IDE_GD=m
CONFIG_IDE_GD_ATAPI=y
CONFIG_BLK_DEV_IDECD=m
CONFIG_BLK_DEV_NS87415=y
# CONFIG_SCSI_PROC_FS is not set # CONFIG_SCSI_PROC_FS is not set
CONFIG_BLK_DEV_SD=y CONFIG_BLK_DEV_SD=y
CONFIG_BLK_DEV_SR=y CONFIG_BLK_DEV_SR=y
...@@ -76,6 +71,7 @@ CONFIG_SCSI_ZALON=y ...@@ -76,6 +71,7 @@ CONFIG_SCSI_ZALON=y
CONFIG_SCSI_QLA_ISCSI=m CONFIG_SCSI_QLA_ISCSI=m
CONFIG_SCSI_DH=y CONFIG_SCSI_DH=y
CONFIG_ATA=y CONFIG_ATA=y
CONFIG_PATA_NS87415=y
CONFIG_PATA_SIL680=y CONFIG_PATA_SIL680=y
CONFIG_ATA_GENERIC=y CONFIG_ATA_GENERIC=y
CONFIG_MD=y CONFIG_MD=y
......
...@@ -2,11 +2,15 @@ ...@@ -2,11 +2,15 @@
#ifndef __ASM_BARRIER_H #ifndef __ASM_BARRIER_H
#define __ASM_BARRIER_H #define __ASM_BARRIER_H
#include <asm/alternative.h>
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
/* The synchronize caches instruction executes as a nop on systems in /* The synchronize caches instruction executes as a nop on systems in
which all memory references are performed in order. */ which all memory references are performed in order. */
#define synchronize_caches() __asm__ __volatile__ ("sync" : : : "memory") #define synchronize_caches() asm volatile("sync" \
ALTERNATIVE(ALT_COND_NO_SMP, INSN_NOP) \
: : : "memory")
#if defined(CONFIG_SMP) #if defined(CONFIG_SMP)
#define mb() do { synchronize_caches(); } while (0) #define mb() do { synchronize_caches(); } while (0)
......
...@@ -14,22 +14,22 @@ ...@@ -14,22 +14,22 @@
extern void __xchg_called_with_bad_pointer(void); extern void __xchg_called_with_bad_pointer(void);
/* __xchg32/64 defined in arch/parisc/lib/bitops.c */ /* __xchg32/64 defined in arch/parisc/lib/bitops.c */
extern unsigned long __xchg8(char, char *); extern unsigned long __xchg8(char, volatile char *);
extern unsigned long __xchg32(int, int *); extern unsigned long __xchg32(int, volatile int *);
#ifdef CONFIG_64BIT #ifdef CONFIG_64BIT
extern unsigned long __xchg64(unsigned long, unsigned long *); extern unsigned long __xchg64(unsigned long, volatile unsigned long *);
#endif #endif
/* optimizer better get rid of switch since size is a constant */ /* optimizer better get rid of switch since size is a constant */
static inline unsigned long static inline unsigned long
__xchg(unsigned long x, __volatile__ void *ptr, int size) __xchg(unsigned long x, volatile void *ptr, int size)
{ {
switch (size) { switch (size) {
#ifdef CONFIG_64BIT #ifdef CONFIG_64BIT
case 8: return __xchg64(x, (unsigned long *) ptr); case 8: return __xchg64(x, (volatile unsigned long *) ptr);
#endif #endif
case 4: return __xchg32((int) x, (int *) ptr); case 4: return __xchg32((int) x, (volatile int *) ptr);
case 1: return __xchg8((char) x, (char *) ptr); case 1: return __xchg8((char) x, (volatile char *) ptr);
} }
__xchg_called_with_bad_pointer(); __xchg_called_with_bad_pointer();
return x; return x;
......
...@@ -16,7 +16,7 @@ static inline void ...@@ -16,7 +16,7 @@ static inline void
_futex_spin_lock_irqsave(u32 __user *uaddr, unsigned long int *flags) _futex_spin_lock_irqsave(u32 __user *uaddr, unsigned long int *flags)
{ {
extern u32 lws_lock_start[]; extern u32 lws_lock_start[];
long index = ((long)uaddr & 0xf0) >> 2; long index = ((long)uaddr & 0x3f8) >> 1;
arch_spinlock_t *s = (arch_spinlock_t *)&lws_lock_start[index]; arch_spinlock_t *s = (arch_spinlock_t *)&lws_lock_start[index];
local_irq_save(*flags); local_irq_save(*flags);
arch_spin_lock(s); arch_spin_lock(s);
...@@ -26,7 +26,7 @@ static inline void ...@@ -26,7 +26,7 @@ static inline void
_futex_spin_unlock_irqrestore(u32 __user *uaddr, unsigned long int *flags) _futex_spin_unlock_irqrestore(u32 __user *uaddr, unsigned long int *flags)
{ {
extern u32 lws_lock_start[]; extern u32 lws_lock_start[];
long index = ((long)uaddr & 0xf0) >> 2; long index = ((long)uaddr & 0x3f8) >> 1;
arch_spinlock_t *s = (arch_spinlock_t *)&lws_lock_start[index]; arch_spinlock_t *s = (arch_spinlock_t *)&lws_lock_start[index];
arch_spin_unlock(s); arch_spin_unlock(s);
local_irq_restore(*flags); local_irq_restore(*flags);
......
...@@ -4,8 +4,8 @@ ...@@ -4,8 +4,8 @@
#include <uapi/asm/socket.h> #include <uapi/asm/socket.h>
/* O_NONBLOCK clashes with the bits used for socket types. Therefore we /* O_NONBLOCK clashed with the bits used for socket types. Therefore we
* have to define SOCK_NONBLOCK to a different value here. * had to define SOCK_NONBLOCK to a different value here.
*/ */
#define SOCK_NONBLOCK 0x40000000 #define SOCK_NONBLOCK 0x40000000
......
...@@ -10,10 +10,18 @@ ...@@ -10,10 +10,18 @@
static inline int arch_spin_is_locked(arch_spinlock_t *x) static inline int arch_spin_is_locked(arch_spinlock_t *x)
{ {
volatile unsigned int *a = __ldcw_align(x); volatile unsigned int *a = __ldcw_align(x);
return *a == 0; return READ_ONCE(*a) == 0;
} }
#define arch_spin_lock(lock) arch_spin_lock_flags(lock, 0) static inline void arch_spin_lock(arch_spinlock_t *x)
{
volatile unsigned int *a;
a = __ldcw_align(x);
while (__ldcw(a) == 0)
while (*a == 0)
continue;
}
static inline void arch_spin_lock_flags(arch_spinlock_t *x, static inline void arch_spin_lock_flags(arch_spinlock_t *x,
unsigned long flags) unsigned long flags)
...@@ -25,10 +33,8 @@ static inline void arch_spin_lock_flags(arch_spinlock_t *x, ...@@ -25,10 +33,8 @@ static inline void arch_spin_lock_flags(arch_spinlock_t *x,
while (*a == 0) while (*a == 0)
if (flags & PSW_SM_I) { if (flags & PSW_SM_I) {
local_irq_enable(); local_irq_enable();
cpu_relax();
local_irq_disable(); local_irq_disable();
} else }
cpu_relax();
} }
#define arch_spin_lock_flags arch_spin_lock_flags #define arch_spin_lock_flags arch_spin_lock_flags
...@@ -44,12 +50,9 @@ static inline void arch_spin_unlock(arch_spinlock_t *x) ...@@ -44,12 +50,9 @@ static inline void arch_spin_unlock(arch_spinlock_t *x)
static inline int arch_spin_trylock(arch_spinlock_t *x) static inline int arch_spin_trylock(arch_spinlock_t *x)
{ {
volatile unsigned int *a; volatile unsigned int *a;
int ret;
a = __ldcw_align(x); a = __ldcw_align(x);
ret = __ldcw(a) != 0; return __ldcw(a) != 0;
return ret;
} }
/* /*
......
...@@ -3,22 +3,19 @@ ...@@ -3,22 +3,19 @@
#define _PARISC_FCNTL_H #define _PARISC_FCNTL_H
#define O_APPEND 000000010 #define O_APPEND 000000010
#define O_BLKSEEK 000000100 /* HPUX only */
#define O_CREAT 000000400 /* not fcntl */ #define O_CREAT 000000400 /* not fcntl */
#define O_EXCL 000002000 /* not fcntl */ #define O_EXCL 000002000 /* not fcntl */
#define O_LARGEFILE 000004000 #define O_LARGEFILE 000004000
#define __O_SYNC 000100000 #define __O_SYNC 000100000
#define O_SYNC (__O_SYNC|O_DSYNC) #define O_SYNC (__O_SYNC|O_DSYNC)
#define O_NONBLOCK 000200004 /* HPUX has separate NDELAY & NONBLOCK */ #define O_NONBLOCK 000200000
#define O_NOCTTY 000400000 /* not fcntl */ #define O_NOCTTY 000400000 /* not fcntl */
#define O_DSYNC 001000000 /* HPUX only */ #define O_DSYNC 001000000
#define O_RSYNC 002000000 /* HPUX only */
#define O_NOATIME 004000000 #define O_NOATIME 004000000
#define O_CLOEXEC 010000000 /* set close_on_exec */ #define O_CLOEXEC 010000000 /* set close_on_exec */
#define O_DIRECTORY 000010000 /* must be a directory */ #define O_DIRECTORY 000010000 /* must be a directory */
#define O_NOFOLLOW 000000200 /* don't follow links */ #define O_NOFOLLOW 000000200 /* don't follow links */
#define O_INVISIBLE 004000000 /* invisible I/O, for DMAPI/XDSM */
#define O_PATH 020000000 #define O_PATH 020000000
#define __O_TMPFILE 040000000 #define __O_TMPFILE 040000000
......
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
#define MAP_STACK 0x40000 /* give out an address that is best suited for process/thread stacks */ #define MAP_STACK 0x40000 /* give out an address that is best suited for process/thread stacks */
#define MAP_HUGETLB 0x80000 /* create a huge page mapping */ #define MAP_HUGETLB 0x80000 /* create a huge page mapping */
#define MAP_FIXED_NOREPLACE 0x100000 /* MAP_FIXED which doesn't unmap underlying mapping */ #define MAP_FIXED_NOREPLACE 0x100000 /* MAP_FIXED which doesn't unmap underlying mapping */
#define MAP_UNINITIALIZED 0 /* uninitialized anonymous mmap */
#define MS_SYNC 1 /* synchronous memory sync */ #define MS_SYNC 1 /* synchronous memory sync */
#define MS_ASYNC 2 /* sync memory asynchronously */ #define MS_ASYNC 2 /* sync memory asynchronously */
......
...@@ -35,11 +35,11 @@ ...@@ -35,11 +35,11 @@
#define SIGURG 29 #define SIGURG 29
#define SIGXFSZ 30 #define SIGXFSZ 30
#define SIGUNUSED 31 #define SIGUNUSED 31
#define SIGSYS 31 /* Linux doesn't use this */ #define SIGSYS 31
/* These should not be considered constants from userland. */ /* These should not be considered constants from userland. */
#define SIGRTMIN 32 #define SIGRTMIN 32
#define SIGRTMAX _NSIG /* it's 44 under HP/UX */ #define SIGRTMAX _NSIG
/* /*
* SA_FLAGS values: * SA_FLAGS values:
...@@ -61,7 +61,6 @@ ...@@ -61,7 +61,6 @@
#define SA_NODEFER 0x00000020 #define SA_NODEFER 0x00000020
#define SA_RESTART 0x00000040 #define SA_RESTART 0x00000040
#define SA_NOCLDWAIT 0x00000080 #define SA_NOCLDWAIT 0x00000080
#define _SA_SIGGFAULT 0x00000100 /* HPUX */
#define SA_NOMASK SA_NODEFER #define SA_NOMASK SA_NODEFER
#define SA_ONESHOT SA_RESETHAND #define SA_ONESHOT SA_RESETHAND
......
...@@ -43,7 +43,7 @@ fi ...@@ -43,7 +43,7 @@ fi
# Default install # Default install
if [ "$(basename $2)" = "zImage" ]; then if [ "$(basename $2)" = "vmlinuz" ]; then
# Compressed install # Compressed install
echo "Installing compressed kernel" echo "Installing compressed kernel"
base=vmlinuz base=vmlinuz
......
...@@ -383,12 +383,12 @@ EXPORT_SYMBOL(flush_kernel_icache_range_asm); ...@@ -383,12 +383,12 @@ EXPORT_SYMBOL(flush_kernel_icache_range_asm);
static unsigned long parisc_cache_flush_threshold __ro_after_init = FLUSH_THRESHOLD; static unsigned long parisc_cache_flush_threshold __ro_after_init = FLUSH_THRESHOLD;
#define FLUSH_TLB_THRESHOLD (16*1024) /* 16 KiB minimum TLB threshold */ #define FLUSH_TLB_THRESHOLD (16*1024) /* 16 KiB minimum TLB threshold */
static unsigned long parisc_tlb_flush_threshold __ro_after_init = FLUSH_TLB_THRESHOLD; static unsigned long parisc_tlb_flush_threshold __ro_after_init = ~0UL;
void __init parisc_setup_cache_timing(void) void __init parisc_setup_cache_timing(void)
{ {
unsigned long rangetime, alltime; unsigned long rangetime, alltime;
unsigned long size, start; unsigned long size;
unsigned long threshold; unsigned long threshold;
alltime = mfctl(16); alltime = mfctl(16);
...@@ -422,14 +422,9 @@ void __init parisc_setup_cache_timing(void) ...@@ -422,14 +422,9 @@ void __init parisc_setup_cache_timing(void)
goto set_tlb_threshold; goto set_tlb_threshold;
} }
size = 0; size = (unsigned long)_end - (unsigned long)_text;
start = (unsigned long) _text;
rangetime = mfctl(16); rangetime = mfctl(16);
while (start < (unsigned long) _end) { flush_tlb_kernel_range((unsigned long)_text, (unsigned long)_end);
flush_tlb_kernel_range(start, start + PAGE_SIZE);
start += PAGE_SIZE;
size += PAGE_SIZE;
}
rangetime = mfctl(16) - rangetime; rangetime = mfctl(16) - rangetime;
alltime = mfctl(16); alltime = mfctl(16);
...@@ -444,8 +439,11 @@ void __init parisc_setup_cache_timing(void) ...@@ -444,8 +439,11 @@ void __init parisc_setup_cache_timing(void)
threshold/1024); threshold/1024);
set_tlb_threshold: set_tlb_threshold:
if (threshold > parisc_tlb_flush_threshold) if (threshold > FLUSH_TLB_THRESHOLD)
parisc_tlb_flush_threshold = threshold; parisc_tlb_flush_threshold = threshold;
else
parisc_tlb_flush_threshold = FLUSH_TLB_THRESHOLD;
printk(KERN_INFO "TLB flush threshold set to %lu KiB\n", printk(KERN_INFO "TLB flush threshold set to %lu KiB\n",
parisc_tlb_flush_threshold/1024); parisc_tlb_flush_threshold/1024);
} }
......
...@@ -899,20 +899,20 @@ intr_check_sig: ...@@ -899,20 +899,20 @@ intr_check_sig:
* Only do signals if we are returning to user space * Only do signals if we are returning to user space
*/ */
LDREG PT_IASQ0(%r16), %r20 LDREG PT_IASQ0(%r16), %r20
cmpib,COND(=),n LINUX_GATEWAY_SPACE, %r20, intr_restore /* backward */ cmpib,COND(=),n LINUX_GATEWAY_SPACE, %r20, intr_restore /* forward */
LDREG PT_IASQ1(%r16), %r20 LDREG PT_IASQ1(%r16), %r20
cmpib,COND(=),n LINUX_GATEWAY_SPACE, %r20, intr_restore /* backward */ cmpib,COND(=),n LINUX_GATEWAY_SPACE, %r20, intr_restore /* forward */
/* NOTE: We need to enable interrupts if we have to deliver
* signals. We used to do this earlier but it caused kernel
* stack overflows. */
ssm PSW_SM_I, %r0
copy %r0, %r25 /* long in_syscall = 0 */ copy %r0, %r25 /* long in_syscall = 0 */
#ifdef CONFIG_64BIT #ifdef CONFIG_64BIT
ldo -16(%r30),%r29 /* Reference param save area */ ldo -16(%r30),%r29 /* Reference param save area */
#endif #endif
/* NOTE: We need to enable interrupts if we have to deliver
* signals. We used to do this earlier but it caused kernel
* stack overflows. */
ssm PSW_SM_I, %r0
BL do_notify_resume,%r2 BL do_notify_resume,%r2
copy %r16, %r26 /* struct pt_regs *regs */ copy %r16, %r26 /* struct pt_regs *regs */
......
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/mm.h> #include <linux/mm.h>
#include <linux/platform_device.h>
#include <asm/hardware.h> #include <asm/hardware.h>
#include <asm/io.h> #include <asm/io.h>
#include <asm/mmzone.h> #include <asm/mmzone.h>
...@@ -641,4 +642,33 @@ void __init do_device_inventory(void) ...@@ -641,4 +642,33 @@ void __init do_device_inventory(void)
if (pa_serialize_tlb_flushes) if (pa_serialize_tlb_flushes)
pr_info("Merced bus found: Enable PxTLB serialization.\n"); pr_info("Merced bus found: Enable PxTLB serialization.\n");
#endif #endif
#if defined(CONFIG_FW_CFG_SYSFS)
if (running_on_qemu) {
struct resource res[3] = {0,};
unsigned int base;
base = ((unsigned long long) PAGE0->pad0[2] << 32)
| PAGE0->pad0[3]; /* SeaBIOS stored it here */
res[0].name = "fw_cfg";
res[0].start = base;
res[0].end = base + 8 - 1;
res[0].flags = IORESOURCE_MEM;
res[1].name = "ctrl";
res[1].start = 0;
res[1].flags = IORESOURCE_REG;
res[2].name = "data";
res[2].start = 4;
res[2].flags = IORESOURCE_REG;
if (base) {
pr_info("Found qemu fw_cfg interface at %#08x\n", base);
platform_device_register_simple("fw_cfg",
PLATFORM_DEVID_NONE, res, 3);
}
}
#endif
} }
...@@ -173,9 +173,12 @@ ipi_interrupt(int irq, void *dev_id) ...@@ -173,9 +173,12 @@ ipi_interrupt(int irq, void *dev_id)
this_cpu, which); this_cpu, which);
return IRQ_NONE; return IRQ_NONE;
} /* Switch */ } /* Switch */
/* let in any pending interrupts */
/* before doing more, let in any pending interrupts */
if (ops) {
local_irq_enable(); local_irq_enable();
local_irq_disable(); local_irq_disable();
}
} /* while (ops) */ } /* while (ops) */
} }
return IRQ_HANDLED; return IRQ_HANDLED;
......
...@@ -571,8 +571,8 @@ lws_compare_and_swap: ...@@ -571,8 +571,8 @@ lws_compare_and_swap:
ldil L%lws_lock_start, %r20 ldil L%lws_lock_start, %r20
ldo R%lws_lock_start(%r20), %r28 ldo R%lws_lock_start(%r20), %r28
/* Extract four bits from r26 and hash lock (Bits 4-7) */ /* Extract eight bits from r26 and hash lock (Bits 3-11) */
extru %r26, 27, 4, %r20 extru %r26, 28, 8, %r20
/* Find lock to use, the hash is either one of 0 to /* Find lock to use, the hash is either one of 0 to
15, multiplied by 16 (keep it 16-byte aligned) 15, multiplied by 16 (keep it 16-byte aligned)
...@@ -761,8 +761,8 @@ cas2_lock_start: ...@@ -761,8 +761,8 @@ cas2_lock_start:
ldil L%lws_lock_start, %r20 ldil L%lws_lock_start, %r20
ldo R%lws_lock_start(%r20), %r28 ldo R%lws_lock_start(%r20), %r28
/* Extract four bits from r26 and hash lock (Bits 4-7) */ /* Extract eight bits from r26 and hash lock (Bits 3-11) */
extru %r26, 27, 4, %r20 extru %r26, 28, 8, %r20
/* Find lock to use, the hash is either one of 0 to /* Find lock to use, the hash is either one of 0 to
15, multiplied by 16 (keep it 16-byte aligned) 15, multiplied by 16 (keep it 16-byte aligned)
...@@ -950,7 +950,7 @@ END(sys_call_table64) ...@@ -950,7 +950,7 @@ END(sys_call_table64)
.align L1_CACHE_BYTES .align L1_CACHE_BYTES
ENTRY(lws_lock_start) ENTRY(lws_lock_start)
/* lws locks */ /* lws locks */
.rept 16 .rept 256
/* Keep locks aligned at 16-bytes */ /* Keep locks aligned at 16-bytes */
.word 1 .word 1
.word 0 .word 0
......
...@@ -18,7 +18,7 @@ arch_spinlock_t __atomic_hash[ATOMIC_HASH_SIZE] __lock_aligned = { ...@@ -18,7 +18,7 @@ arch_spinlock_t __atomic_hash[ATOMIC_HASH_SIZE] __lock_aligned = {
#endif #endif
#ifdef CONFIG_64BIT #ifdef CONFIG_64BIT
unsigned long __xchg64(unsigned long x, unsigned long *ptr) unsigned long __xchg64(unsigned long x, volatile unsigned long *ptr)
{ {
unsigned long temp, flags; unsigned long temp, flags;
...@@ -30,7 +30,7 @@ unsigned long __xchg64(unsigned long x, unsigned long *ptr) ...@@ -30,7 +30,7 @@ unsigned long __xchg64(unsigned long x, unsigned long *ptr)
} }
#endif #endif
unsigned long __xchg32(int x, int *ptr) unsigned long __xchg32(int x, volatile int *ptr)
{ {
unsigned long flags; unsigned long flags;
long temp; long temp;
...@@ -43,7 +43,7 @@ unsigned long __xchg32(int x, int *ptr) ...@@ -43,7 +43,7 @@ unsigned long __xchg32(int x, int *ptr)
} }
unsigned long __xchg8(char x, char *ptr) unsigned long __xchg8(char x, volatile char *ptr)
{ {
unsigned long flags; unsigned long flags;
long temp; long temp;
......
...@@ -346,6 +346,16 @@ u64 ioread64be(const void __iomem *addr) ...@@ -346,6 +346,16 @@ u64 ioread64be(const void __iomem *addr)
return *((u64 *)addr); return *((u64 *)addr);
} }
u64 ioread64_hi_lo(const void __iomem *addr)
{
u32 low, high;
high = ioread32(addr + sizeof(u32));
low = ioread32(addr);
return low + ((u64)high << 32);
}
void iowrite8(u8 datum, void __iomem *addr) void iowrite8(u8 datum, void __iomem *addr)
{ {
if (unlikely(INDIRECT_ADDR(addr))) { if (unlikely(INDIRECT_ADDR(addr))) {
...@@ -409,6 +419,12 @@ void iowrite64be(u64 datum, void __iomem *addr) ...@@ -409,6 +419,12 @@ void iowrite64be(u64 datum, void __iomem *addr)
} }
} }
void iowrite64_hi_lo(u64 val, void __iomem *addr)
{
iowrite32(val >> 32, addr + sizeof(u32));
iowrite32(val, addr);
}
/* Repeating interfaces */ /* Repeating interfaces */
void ioread8_rep(const void __iomem *addr, void *dst, unsigned long count) void ioread8_rep(const void __iomem *addr, void *dst, unsigned long count)
...@@ -511,6 +527,7 @@ EXPORT_SYMBOL(ioread32); ...@@ -511,6 +527,7 @@ EXPORT_SYMBOL(ioread32);
EXPORT_SYMBOL(ioread32be); EXPORT_SYMBOL(ioread32be);
EXPORT_SYMBOL(ioread64); EXPORT_SYMBOL(ioread64);
EXPORT_SYMBOL(ioread64be); EXPORT_SYMBOL(ioread64be);
EXPORT_SYMBOL(ioread64_hi_lo);
EXPORT_SYMBOL(iowrite8); EXPORT_SYMBOL(iowrite8);
EXPORT_SYMBOL(iowrite16); EXPORT_SYMBOL(iowrite16);
EXPORT_SYMBOL(iowrite16be); EXPORT_SYMBOL(iowrite16be);
...@@ -518,6 +535,7 @@ EXPORT_SYMBOL(iowrite32); ...@@ -518,6 +535,7 @@ EXPORT_SYMBOL(iowrite32);
EXPORT_SYMBOL(iowrite32be); EXPORT_SYMBOL(iowrite32be);
EXPORT_SYMBOL(iowrite64); EXPORT_SYMBOL(iowrite64);
EXPORT_SYMBOL(iowrite64be); EXPORT_SYMBOL(iowrite64be);
EXPORT_SYMBOL(iowrite64_hi_lo);
EXPORT_SYMBOL(ioread8_rep); EXPORT_SYMBOL(ioread8_rep);
EXPORT_SYMBOL(ioread16_rep); EXPORT_SYMBOL(ioread16_rep);
EXPORT_SYMBOL(ioread32_rep); EXPORT_SYMBOL(ioread32_rep);
......
...@@ -186,7 +186,7 @@ config RASPBERRYPI_FIRMWARE ...@@ -186,7 +186,7 @@ config RASPBERRYPI_FIRMWARE
config FW_CFG_SYSFS config FW_CFG_SYSFS
tristate "QEMU fw_cfg device support in sysfs" tristate "QEMU fw_cfg device support in sysfs"
depends on SYSFS && (ARM || ARM64 || PPC_PMAC || SPARC || X86) depends on SYSFS && (ARM || ARM64 || PARISC || PPC_PMAC || SPARC || X86)
depends on HAS_IOPORT_MAP depends on HAS_IOPORT_MAP
default n default n
help help
......
...@@ -215,6 +215,9 @@ static void fw_cfg_io_cleanup(void) ...@@ -215,6 +215,9 @@ static void fw_cfg_io_cleanup(void)
# define FW_CFG_CTRL_OFF 0x08 # define FW_CFG_CTRL_OFF 0x08
# define FW_CFG_DATA_OFF 0x00 # define FW_CFG_DATA_OFF 0x00
# define FW_CFG_DMA_OFF 0x10 # define FW_CFG_DMA_OFF 0x10
# elif defined(CONFIG_PARISC) /* parisc */
# define FW_CFG_CTRL_OFF 0x00
# define FW_CFG_DATA_OFF 0x04
# elif (defined(CONFIG_PPC_PMAC) || defined(CONFIG_SPARC32)) /* ppc/mac,sun4m */ # elif (defined(CONFIG_PPC_PMAC) || defined(CONFIG_SPARC32)) /* ppc/mac,sun4m */
# define FW_CFG_CTRL_OFF 0x00 # define FW_CFG_CTRL_OFF 0x00
# define FW_CFG_DATA_OFF 0x02 # define FW_CFG_DATA_OFF 0x02
......
...@@ -119,6 +119,7 @@ config STI_CONSOLE ...@@ -119,6 +119,7 @@ config STI_CONSOLE
bool "STI text console" bool "STI text console"
depends on PARISC && HAS_IOMEM depends on PARISC && HAS_IOMEM
select FONT_SUPPORT select FONT_SUPPORT
select CRC32
default y default y
help help
The STI console is the builtin display/keyboard on HP-PARISC The STI console is the builtin display/keyboard on HP-PARISC
......
This diff is collapsed.
This diff is collapsed.
...@@ -4,12 +4,6 @@ ...@@ -4,12 +4,6 @@
/* generic STI structures & functions */ /* generic STI structures & functions */
#if 0
#define DPRINTK(x) printk x
#else
#define DPRINTK(x)
#endif
#define MAX_STI_ROMS 4 /* max no. of ROMs which this driver handles */ #define MAX_STI_ROMS 4 /* max no. of ROMs which this driver handles */
#define STI_REGION_MAX 8 /* hardcoded STI constants */ #define STI_REGION_MAX 8 /* hardcoded STI constants */
...@@ -246,8 +240,12 @@ struct sti_rom_font { ...@@ -246,8 +240,12 @@ struct sti_rom_font {
/* sticore internal font handling */ /* sticore internal font handling */
struct sti_cooked_font { struct sti_cooked_font {
struct sti_rom_font *raw; struct sti_rom_font *raw; /* native ptr for STI functions */
void *raw_ptr; /* kmalloc'ed font data */
struct sti_cooked_font *next_font; struct sti_cooked_font *next_font;
int height, width;
int refcount;
u32 crc;
}; };
struct sti_cooked_rom { struct sti_cooked_rom {
...@@ -341,9 +339,6 @@ struct sti_all_data { ...@@ -341,9 +339,6 @@ struct sti_all_data {
struct sti_struct { struct sti_struct {
spinlock_t lock; spinlock_t lock;
/* the following fields needs to be filled in by the word/byte routines */
int font_width;
int font_height;
/* char **mon_strings; */ /* char **mon_strings; */
int sti_mem_request; int sti_mem_request;
u32 graphics_id[2]; u32 graphics_id[2];
...@@ -362,6 +357,7 @@ struct sti_struct { ...@@ -362,6 +357,7 @@ struct sti_struct {
struct sti_glob_cfg *glob_cfg; /* points into sti_all_data */ struct sti_glob_cfg *glob_cfg; /* points into sti_all_data */
int wordmode;
struct sti_cooked_font *font; /* ptr to selected font (cooked) */ struct sti_cooked_font *font; /* ptr to selected font (cooked) */
struct pci_dev *pd; struct pci_dev *pd;
...@@ -380,6 +376,7 @@ struct sti_struct { ...@@ -380,6 +376,7 @@ struct sti_struct {
/* sticore interface functions */ /* sticore interface functions */
struct sti_struct *sti_get_rom(unsigned int index); /* 0: default sti */ struct sti_struct *sti_get_rom(unsigned int index); /* 0: default sti */
void sti_font_convert_bytemode(struct sti_struct *sti, struct sti_cooked_font *f);
/* sticore main function to call STI firmware */ /* sticore main function to call STI firmware */
...@@ -391,12 +388,14 @@ int sti_call(const struct sti_struct *sti, unsigned long func, ...@@ -391,12 +388,14 @@ int sti_call(const struct sti_struct *sti, unsigned long func,
/* functions to call the STI ROM directly */ /* functions to call the STI ROM directly */
void sti_putc(struct sti_struct *sti, int c, int y, int x); void sti_putc(struct sti_struct *sti, int c, int y, int x,
struct sti_cooked_font *font);
void sti_set(struct sti_struct *sti, int src_y, int src_x, void sti_set(struct sti_struct *sti, int src_y, int src_x,
int height, int width, u8 color); int height, int width, u8 color);
void sti_clear(struct sti_struct *sti, int src_y, int src_x, void sti_clear(struct sti_struct *sti, int src_y, int src_x,
int height, int width, int c); int height, int width, int c, struct sti_cooked_font *font);
void sti_bmove(struct sti_struct *sti, int src_y, int src_x, void sti_bmove(struct sti_struct *sti, int src_y, int src_x,
int dst_y, int dst_x, int height, int width); int dst_y, int dst_x, int height, int width,
struct sti_cooked_font *font);
#endif /* STICORE_H */ #endif /* STICORE_H */
...@@ -39,6 +39,5 @@ ...@@ -39,6 +39,5 @@
#define MADV_SOFT_OFFLINE 101 #define MADV_SOFT_OFFLINE 101
/* MAP_32BIT is undefined on parisc, fix it for perf */ /* MAP_32BIT is undefined on parisc, fix it for perf */
#define MAP_32BIT 0 #define MAP_32BIT 0
/* MAP_UNINITIALIZED is undefined on parisc, fix it for perf */
#define MAP_UNINITIALIZED 0 #define MAP_UNINITIALIZED 0
#endif #endif
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