mirror of
https://github.com/torvalds/linux.git
synced 2024-11-22 12:11:40 +00:00
parisc architecture fixes and updates for kernel v6.5-rc1:
* Add missing cacheflush() syscall * Fix STI console on 64-bit-only machines * Move kernel debug options to Kconfig.debug * Lots of warning fixes in arch/parisc/ and drivers/parisc/ when compiled with W=1 * Enable some more graphics drivers in refreshed defconfigs -----BEGIN PGP SIGNATURE----- iHUEABYKAB0WIQS86RI+GtKfB8BJu973ErUQojoPXwUCZKGMPAAKCRD3ErUQojoP X5CCAQDKAsFxDHvt+zp9uopkBA6QxETx1t3dCEkY9qO5Mi1rHwEA1jMBqxfZXiVK YtI75ZKfyRzBNFpZBRLHz1doj1HwzAg= =ja8Z -----END PGP SIGNATURE----- Merge tag 'parisc-for-6.5-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/deller/parisc-linux Pull parisc updates from Helge Deller: - Add missing cacheflush() syscall - Fix STI console on 64-bit-only machines - Move kernel debug options to Kconfig.debug - Lots of warning fixes in arch/parisc/ and drivers/parisc/ when compiled with W=1 - Enable some more graphics drivers in refreshed defconfigs * tag 'parisc-for-6.5-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/deller/parisc-linux: (29 commits) parisc: Refresh defconfigs parisc: irq: Add irq-related function declarations parisc: Move init function declarations into header file parisc: dino: Make dino_init() returning void parisc: lba_pci: Mark two variables __maybe_unused parisc: unaligned: Include header file to avoid missing prototype warnings parisc: signal: Mark do_notify_resume() and sys_rt_sigreturn() asmlinkage parisc: unwind: Mark start and stop variables __maybe_unused parisc: init: Drop unused variable end_paddr parisc: traps: Mark functions static parisc: processor: Fix kdoc for init_cpu_profiler() parisc: sys_parisc: parisc_personality() is called from asm code parisc: ccio-dma: Fix kdoc and compiler warnings parisc: pdc_stable: Fix kdoc and compiler warnings parisc: pci-dma: Make pcxl_alloc_range() static parisc: Mark image_size __maybe_unused in perf_write() parisc: module: Mark symindex __maybe_unused parisc: pdc_chassis: Fix kdoc warnings parisc: firmware: Fix kdoc warnings parisc: drivers: Fix kdoc warnings ...
This commit is contained in:
commit
ed77ac92a1
@ -304,16 +304,6 @@ config IRQSTACKS
|
||||
for handling hard and soft interrupts. This can help avoid
|
||||
overflowing the process kernel stacks.
|
||||
|
||||
config TLB_PTLOCK
|
||||
bool "Use page table locks in TLB fault handler"
|
||||
depends on SMP
|
||||
default n
|
||||
help
|
||||
Select this option to enable page table locking in the TLB
|
||||
fault handler. This ensures that page table entries are
|
||||
updated consistently on SMP machines at the expense of some
|
||||
loss in performance.
|
||||
|
||||
config HOTPLUG_CPU
|
||||
bool
|
||||
default y if SMP
|
||||
@ -346,7 +336,7 @@ config NR_CPUS
|
||||
int "Maximum number of CPUs (2-32)"
|
||||
range 2 32
|
||||
depends on SMP
|
||||
default "4" if 64BIT
|
||||
default "8" if 64BIT
|
||||
default "16"
|
||||
|
||||
config KEXEC
|
||||
|
@ -10,3 +10,14 @@ config LIGHTWEIGHT_SPINLOCK_CHECK
|
||||
spinlock debugging you should choose the DEBUG_SPINLOCK option
|
||||
which will detect unitialized spinlocks too.
|
||||
If unsure say Y here.
|
||||
|
||||
config TLB_PTLOCK
|
||||
bool "Use page table locks in TLB fault handler"
|
||||
depends on SMP
|
||||
default n
|
||||
help
|
||||
Select this option to enable page table locking in the TLB
|
||||
fault handler. This ensures that page table entries are
|
||||
updated consistently on SMP machines at the expense of some
|
||||
loss in performance.
|
||||
|
||||
|
@ -82,7 +82,6 @@ CONFIG_TUN=m
|
||||
# CONFIG_NET_VENDOR_AMD is not set
|
||||
# CONFIG_NET_VENDOR_ATHEROS is not set
|
||||
# CONFIG_NET_VENDOR_BROADCOM is not set
|
||||
# CONFIG_NET_VENDOR_BROCADE is not set
|
||||
# CONFIG_NET_VENDOR_CHELSIO is not set
|
||||
# CONFIG_NET_VENDOR_CISCO is not set
|
||||
CONFIG_NET_TULIP=y
|
||||
@ -97,6 +96,7 @@ CONFIG_LASI_82596=y
|
||||
# CONFIG_NET_VENDOR_NVIDIA is not set
|
||||
# CONFIG_NET_VENDOR_OKI is not set
|
||||
# CONFIG_NET_VENDOR_QLOGIC is not set
|
||||
# CONFIG_NET_VENDOR_BROCADE is not set
|
||||
# CONFIG_NET_VENDOR_RDC is not set
|
||||
# CONFIG_NET_VENDOR_REALTEK is not set
|
||||
# CONFIG_NET_VENDOR_SEEQ is not set
|
||||
@ -129,17 +129,53 @@ CONFIG_PRINTER=m
|
||||
CONFIG_PPDEV=m
|
||||
# CONFIG_HW_RANDOM is not set
|
||||
CONFIG_I2C=y
|
||||
# CONFIG_HWMON is not set
|
||||
CONFIG_HWMON=m
|
||||
CONFIG_DRM=m
|
||||
CONFIG_DRM_DP_CEC=y
|
||||
# CONFIG_DRM_I2C_CH7006 is not set
|
||||
# CONFIG_DRM_I2C_SIL164 is not set
|
||||
CONFIG_DRM_RADEON=m
|
||||
CONFIG_DRM_NOUVEAU=m
|
||||
# CONFIG_DRM_NOUVEAU_BACKLIGHT is not set
|
||||
CONFIG_DRM_VGEM=m
|
||||
CONFIG_DRM_UDL=m
|
||||
CONFIG_DRM_MGAG200=m
|
||||
CONFIG_FB=y
|
||||
CONFIG_FB_FOREIGN_ENDIAN=y
|
||||
CONFIG_FB_MODE_HELPERS=y
|
||||
CONFIG_FB_PM2=m
|
||||
CONFIG_FB_PM2_FIFO_DISCONNECT=y
|
||||
CONFIG_FB_NVIDIA=m
|
||||
CONFIG_FB_NVIDIA_I2C=y
|
||||
# CONFIG_FB_NVIDIA_BACKLIGHT is not set
|
||||
CONFIG_FB_RIVA=m
|
||||
CONFIG_FB_RIVA_I2C=y
|
||||
# CONFIG_FB_RIVA_BACKLIGHT is not set
|
||||
CONFIG_FB_MATROX=m
|
||||
CONFIG_FB_MATROX_MILLENIUM=y
|
||||
CONFIG_FB_MATROX_MYSTIQUE=y
|
||||
CONFIG_FB_MATROX_G=y
|
||||
CONFIG_FB_MATROX_I2C=m
|
||||
CONFIG_FB_MATROX_MAVEN=m
|
||||
CONFIG_FB_ATY128=m
|
||||
# CONFIG_FB_ATY128_BACKLIGHT is not set
|
||||
CONFIG_FB_ATY=m
|
||||
CONFIG_FB_ATY_CT=y
|
||||
CONFIG_FB_ATY_GX=y
|
||||
# CONFIG_FB_ATY_BACKLIGHT is not set
|
||||
CONFIG_FB_S3=m
|
||||
CONFIG_FB_SAVAGE=m
|
||||
CONFIG_FB_SAVAGE_I2C=y
|
||||
CONFIG_FB_SAVAGE_ACCEL=y
|
||||
CONFIG_FB_SIS=m
|
||||
CONFIG_FB_SIS_300=y
|
||||
CONFIG_FB_SIS_315=y
|
||||
CONFIG_FB_VOODOO1=m
|
||||
CONFIG_FB_TRIDENT=m
|
||||
CONFIG_FB_SMSCUFX=m
|
||||
CONFIG_FB_UDL=m
|
||||
CONFIG_DUMMY_CONSOLE_COLUMNS=128
|
||||
CONFIG_DUMMY_CONSOLE_ROWS=48
|
||||
CONFIG_FRAMEBUFFER_CONSOLE=y
|
||||
CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y
|
||||
CONFIG_LOGO=y
|
||||
# CONFIG_LOGO_LINUX_MONO is not set
|
||||
# CONFIG_LOGO_LINUX_VGA16 is not set
|
||||
@ -216,17 +252,17 @@ CONFIG_CIFS_XATTR=y
|
||||
CONFIG_CIFS_POSIX=y
|
||||
# CONFIG_CIFS_DEBUG is not set
|
||||
CONFIG_CRYPTO_TEST=m
|
||||
CONFIG_CRYPTO_HMAC=y
|
||||
CONFIG_CRYPTO_MD5=y
|
||||
CONFIG_CRYPTO_MICHAEL_MIC=m
|
||||
CONFIG_CRYPTO_SHA1=y
|
||||
CONFIG_CRYPTO_WP512=m
|
||||
CONFIG_CRYPTO_BLOWFISH=m
|
||||
CONFIG_CRYPTO_CAST5=m
|
||||
CONFIG_CRYPTO_CAST6=m
|
||||
CONFIG_CRYPTO_DES=y
|
||||
CONFIG_CRYPTO_SERPENT=m
|
||||
CONFIG_CRYPTO_TWOFISH=m
|
||||
CONFIG_CRYPTO_HMAC=y
|
||||
CONFIG_CRYPTO_MD5=y
|
||||
CONFIG_CRYPTO_MICHAEL_MIC=m
|
||||
CONFIG_CRYPTO_SHA1=y
|
||||
CONFIG_CRYPTO_WP512=m
|
||||
CONFIG_CRYPTO_DEFLATE=y
|
||||
CONFIG_CRC_CCITT=m
|
||||
CONFIG_CRC_T10DIF=y
|
||||
|
@ -20,9 +20,6 @@ CONFIG_USER_NS=y
|
||||
CONFIG_RELAY=y
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
CONFIG_CC_OPTIMIZE_FOR_SIZE=y
|
||||
# CONFIG_COMPAT_BRK is not set
|
||||
CONFIG_PA8X00=y
|
||||
CONFIG_64BIT=y
|
||||
CONFIG_SMP=y
|
||||
CONFIG_HPPB=y
|
||||
CONFIG_IOMMU_CCIO=y
|
||||
@ -37,6 +34,7 @@ CONFIG_MODULE_FORCE_UNLOAD=y
|
||||
CONFIG_MODVERSIONS=y
|
||||
CONFIG_BLK_DEV_INTEGRITY=y
|
||||
CONFIG_BINFMT_MISC=m
|
||||
# CONFIG_COMPAT_BRK is not set
|
||||
# CONFIG_COMPACTION is not set
|
||||
CONFIG_MEMORY_FAILURE=y
|
||||
CONFIG_NET=y
|
||||
@ -103,7 +101,6 @@ CONFIG_TUN=y
|
||||
# CONFIG_NET_VENDOR_AMD is not set
|
||||
# CONFIG_NET_VENDOR_ATHEROS is not set
|
||||
# CONFIG_NET_VENDOR_BROADCOM is not set
|
||||
# CONFIG_NET_VENDOR_BROCADE is not set
|
||||
# CONFIG_NET_VENDOR_CHELSIO is not set
|
||||
# CONFIG_NET_VENDOR_CISCO is not set
|
||||
CONFIG_NET_TULIP=y
|
||||
@ -121,6 +118,7 @@ CONFIG_E1000=y
|
||||
# CONFIG_NET_VENDOR_OKI is not set
|
||||
CONFIG_QLA3XXX=m
|
||||
CONFIG_QLCNIC=m
|
||||
# CONFIG_NET_VENDOR_BROCADE is not set
|
||||
# CONFIG_NET_VENDOR_RDC is not set
|
||||
# CONFIG_NET_VENDOR_REALTEK is not set
|
||||
# CONFIG_NET_VENDOR_SEEQ is not set
|
||||
@ -186,7 +184,6 @@ CONFIG_WATCHDOG=y
|
||||
CONFIG_SOFT_WATCHDOG=m
|
||||
CONFIG_SSB=m
|
||||
CONFIG_SSB_DRIVER_PCICORE=y
|
||||
CONFIG_HTC_PASIC3=m
|
||||
CONFIG_LPC_SCH=m
|
||||
CONFIG_MFD_SM501=m
|
||||
CONFIG_REGULATOR=y
|
||||
@ -196,14 +193,46 @@ CONFIG_MEDIA_SUPPORT=m
|
||||
CONFIG_AGP=y
|
||||
CONFIG_AGP_PARISC=y
|
||||
CONFIG_DRM=y
|
||||
# CONFIG_DRM_I2C_CH7006 is not set
|
||||
# CONFIG_DRM_I2C_SIL164 is not set
|
||||
CONFIG_DRM_RADEON=y
|
||||
CONFIG_DRM_NOUVEAU=m
|
||||
# CONFIG_DRM_NOUVEAU_BACKLIGHT is not set
|
||||
CONFIG_DRM_MGAG200=m
|
||||
CONFIG_FB=y
|
||||
CONFIG_FB_MATROX=y
|
||||
CONFIG_FB_PM2=m
|
||||
CONFIG_FB_PM2_FIFO_DISCONNECT=y
|
||||
CONFIG_FB_NVIDIA=m
|
||||
CONFIG_FB_NVIDIA_I2C=y
|
||||
# CONFIG_FB_NVIDIA_BACKLIGHT is not set
|
||||
CONFIG_FB_RIVA=m
|
||||
CONFIG_FB_RIVA_I2C=y
|
||||
# CONFIG_FB_RIVA_BACKLIGHT is not set
|
||||
CONFIG_FB_MATROX=m
|
||||
CONFIG_FB_MATROX_MILLENIUM=y
|
||||
CONFIG_FB_MATROX_MYSTIQUE=y
|
||||
CONFIG_FB_MATROX_G=y
|
||||
CONFIG_FB_MATROX_I2C=y
|
||||
CONFIG_FB_MATROX_MAVEN=y
|
||||
CONFIG_FB_MATROX_I2C=m
|
||||
CONFIG_FB_MATROX_MAVEN=m
|
||||
CONFIG_FB_RADEON=y
|
||||
# CONFIG_FB_RADEON_BACKLIGHT is not set
|
||||
CONFIG_FB_ATY128=m
|
||||
# CONFIG_FB_ATY128_BACKLIGHT is not set
|
||||
CONFIG_FB_ATY=m
|
||||
CONFIG_FB_ATY_CT=y
|
||||
CONFIG_FB_ATY_GX=y
|
||||
# CONFIG_FB_ATY_BACKLIGHT is not set
|
||||
CONFIG_FB_S3=m
|
||||
CONFIG_FB_SAVAGE=m
|
||||
CONFIG_FB_SAVAGE_I2C=y
|
||||
CONFIG_FB_SAVAGE_ACCEL=y
|
||||
CONFIG_FB_SIS=m
|
||||
CONFIG_FB_SIS_300=y
|
||||
CONFIG_FB_SIS_315=y
|
||||
CONFIG_FB_VOODOO1=m
|
||||
CONFIG_FB_TRIDENT=m
|
||||
CONFIG_FB_SMSCUFX=m
|
||||
CONFIG_FB_UDL=m
|
||||
CONFIG_LOGO=y
|
||||
# CONFIG_LOGO_LINUX_CLUT224 is not set
|
||||
CONFIG_HIDRAW=y
|
||||
@ -257,12 +286,12 @@ CONFIG_NLS_ISO8859_1=m
|
||||
CONFIG_NLS_ISO8859_2=m
|
||||
CONFIG_NLS_UTF8=m
|
||||
CONFIG_CRYPTO_MANAGER=y
|
||||
CONFIG_CRYPTO_FCRYPT=m
|
||||
CONFIG_CRYPTO_ECB=m
|
||||
CONFIG_CRYPTO_PCBC=m
|
||||
CONFIG_CRYPTO_MD4=m
|
||||
CONFIG_CRYPTO_MD5=y
|
||||
CONFIG_CRYPTO_MICHAEL_MIC=m
|
||||
CONFIG_CRYPTO_FCRYPT=m
|
||||
CONFIG_CRYPTO_DEFLATE=m
|
||||
# CONFIG_CRYPTO_HW is not set
|
||||
CONFIG_CRC_CCITT=m
|
||||
|
@ -31,6 +31,11 @@ static inline unsigned long arch_local_irq_save(void)
|
||||
|
||||
static inline void arch_local_irq_restore(unsigned long flags)
|
||||
{
|
||||
/* warn if IRQs are on although they should be off */
|
||||
if (IS_ENABLED(CONFIG_LIGHTWEIGHT_SPINLOCK_CHECK))
|
||||
if (arch_local_save_flags() & PSW_I)
|
||||
asm volatile("break 6,6\n"); /* SPINLOCK_BREAK_INSN */
|
||||
|
||||
asm volatile("mtsm %0" : : "r" (flags) : "memory");
|
||||
}
|
||||
|
||||
|
@ -88,8 +88,8 @@ int pdc_iodc_print(const unsigned char *str, unsigned count);
|
||||
|
||||
void pdc_emergency_unlock(void);
|
||||
int pdc_sti_call(unsigned long func, unsigned long flags,
|
||||
unsigned long inptr, unsigned long outputr,
|
||||
unsigned long glob_cfg);
|
||||
unsigned long inptr, unsigned long outputr,
|
||||
unsigned long glob_cfg, int do_call64);
|
||||
|
||||
int __pdc_cpu_rendezvous(void);
|
||||
void pdc_cpu_rendezvous_lock(void);
|
||||
|
@ -11,6 +11,7 @@
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#include <linux/threads.h>
|
||||
#include <linux/irqreturn.h>
|
||||
|
||||
#include <asm/assembly.h>
|
||||
#include <asm/prefetch.h>
|
||||
@ -291,6 +292,40 @@ extern void __noreturn toc_intr(struct pt_regs *regs);
|
||||
extern void toc_handler(void);
|
||||
extern unsigned int toc_handler_size;
|
||||
extern unsigned int toc_handler_csum;
|
||||
extern void do_cpu_irq_mask(struct pt_regs *);
|
||||
extern irqreturn_t timer_interrupt(int, void *);
|
||||
extern irqreturn_t ipi_interrupt(int, void *);
|
||||
|
||||
/* called from assembly code: */
|
||||
extern void start_parisc(void);
|
||||
extern void smp_callin(unsigned long);
|
||||
extern void sys_rt_sigreturn(struct pt_regs *, int);
|
||||
extern void do_notify_resume(struct pt_regs *, long);
|
||||
extern long do_syscall_trace_enter(struct pt_regs *);
|
||||
extern void do_syscall_trace_exit(struct pt_regs *);
|
||||
|
||||
/* CPU startup and info */
|
||||
struct seq_file;
|
||||
extern void early_trap_init(void);
|
||||
extern void collect_boot_cpu_data(void);
|
||||
extern int show_cpuinfo (struct seq_file *m, void *v);
|
||||
|
||||
/* driver code in driver/parisc */
|
||||
extern void gsc_init(void);
|
||||
extern void processor_init(void);
|
||||
extern void ccio_init(void);
|
||||
extern void hppb_init(void);
|
||||
extern void dino_init(void);
|
||||
extern void iosapic_init(void);
|
||||
extern void lba_init(void);
|
||||
extern void sba_init(void);
|
||||
extern void parisc_eisa_init(void);
|
||||
struct parisc_device;
|
||||
struct resource;
|
||||
extern void sba_distributed_lmmio(struct parisc_device *, struct resource *);
|
||||
extern void sba_directed_lmmio(struct parisc_device *, struct resource *);
|
||||
extern void lba_set_iregs(struct parisc_device *lba, u32 ibase, u32 imask);
|
||||
extern void ccio_cujo20_fixup(struct parisc_device *dev, u32 iovp);
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
|
12
arch/parisc/include/uapi/asm/cachectl.h
Normal file
12
arch/parisc/include/uapi/asm/cachectl.h
Normal file
@ -0,0 +1,12 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
||||
#ifndef _ASM_CACHECTL
|
||||
#define _ASM_CACHECTL
|
||||
|
||||
/*
|
||||
* Options for cacheflush system call
|
||||
*/
|
||||
#define ICACHE (1<<0) /* flush instruction cache */
|
||||
#define DCACHE (1<<1) /* writeback and flush data cache */
|
||||
#define BCACHE (ICACHE|DCACHE) /* flush both caches */
|
||||
|
||||
#endif /* _ASM_CACHECTL */
|
@ -40,11 +40,6 @@ int audit_classify_arch(int arch)
|
||||
|
||||
int audit_classify_syscall(int abi, unsigned syscall)
|
||||
{
|
||||
#ifdef CONFIG_COMPAT
|
||||
extern int parisc32_classify_syscall(unsigned);
|
||||
if (abi == AUDIT_ARCH_PARISC)
|
||||
return parisc32_classify_syscall(syscall);
|
||||
#endif
|
||||
switch (syscall) {
|
||||
case __NR_open:
|
||||
return AUDITSC_OPEN;
|
||||
@ -55,6 +50,10 @@ int audit_classify_syscall(int abi, unsigned syscall)
|
||||
case __NR_openat2:
|
||||
return AUDITSC_OPENAT2;
|
||||
default:
|
||||
#ifdef CONFIG_COMPAT
|
||||
if (abi == AUDIT_ARCH_PARISC)
|
||||
return AUDITSC_COMPAT;
|
||||
#endif
|
||||
return AUDITSC_NATIVE;
|
||||
}
|
||||
}
|
||||
|
@ -19,6 +19,7 @@
|
||||
#include <linux/pagemap.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/sched/mm.h>
|
||||
#include <linux/syscalls.h>
|
||||
#include <asm/pdc.h>
|
||||
#include <asm/cache.h>
|
||||
#include <asm/cacheflush.h>
|
||||
@ -28,6 +29,7 @@
|
||||
#include <asm/sections.h>
|
||||
#include <asm/shmparam.h>
|
||||
#include <asm/mmu_context.h>
|
||||
#include <asm/cachectl.h>
|
||||
|
||||
int split_tlb __ro_after_init;
|
||||
int dcache_stride __ro_after_init;
|
||||
@ -790,3 +792,50 @@ void invalidate_kernel_vmap_range(void *vaddr, int size)
|
||||
flush_tlb_kernel_range(start, end);
|
||||
}
|
||||
EXPORT_SYMBOL(invalidate_kernel_vmap_range);
|
||||
|
||||
|
||||
SYSCALL_DEFINE3(cacheflush, unsigned long, addr, unsigned long, bytes,
|
||||
unsigned int, cache)
|
||||
{
|
||||
unsigned long start, end;
|
||||
ASM_EXCEPTIONTABLE_VAR(error);
|
||||
|
||||
if (bytes == 0)
|
||||
return 0;
|
||||
if (!access_ok((void __user *) addr, bytes))
|
||||
return -EFAULT;
|
||||
|
||||
end = addr + bytes;
|
||||
|
||||
if (cache & DCACHE) {
|
||||
start = addr;
|
||||
__asm__ __volatile__ (
|
||||
#ifdef CONFIG_64BIT
|
||||
"1: cmpb,*<<,n %0,%2,1b\n"
|
||||
#else
|
||||
"1: cmpb,<<,n %0,%2,1b\n"
|
||||
#endif
|
||||
" fic,m %3(%4,%0)\n"
|
||||
"2: sync\n"
|
||||
ASM_EXCEPTIONTABLE_ENTRY_EFAULT(1b, 2b)
|
||||
: "+r" (start), "+r" (error)
|
||||
: "r" (end), "r" (dcache_stride), "i" (SR_USER));
|
||||
}
|
||||
|
||||
if (cache & ICACHE && error == 0) {
|
||||
start = addr;
|
||||
__asm__ __volatile__ (
|
||||
#ifdef CONFIG_64BIT
|
||||
"1: cmpb,*<<,n %0,%2,1b\n"
|
||||
#else
|
||||
"1: cmpb,<<,n %0,%2,1b\n"
|
||||
#endif
|
||||
" fdc,m %3(%4,%0)\n"
|
||||
"2: sync\n"
|
||||
ASM_EXCEPTIONTABLE_ENTRY_EFAULT(1b, 2b)
|
||||
: "+r" (start), "+r" (error)
|
||||
: "r" (end), "r" (icache_stride), "i" (SR_USER));
|
||||
}
|
||||
|
||||
return error;
|
||||
}
|
||||
|
@ -26,19 +26,3 @@ unsigned int parisc32_signal_class[] = {
|
||||
#include <asm-generic/audit_signal.h>
|
||||
~0U
|
||||
};
|
||||
|
||||
int parisc32_classify_syscall(unsigned syscall)
|
||||
{
|
||||
switch (syscall) {
|
||||
case __NR_open:
|
||||
return AUDITSC_OPEN;
|
||||
case __NR_openat:
|
||||
return AUDITSC_OPENAT;
|
||||
case __NR_execve:
|
||||
return AUDITSC_EXECVE;
|
||||
case __NR_openat2:
|
||||
return AUDITSC_OPENAT2;
|
||||
default:
|
||||
return AUDITSC_COMPAT;
|
||||
}
|
||||
}
|
||||
|
@ -4,7 +4,7 @@
|
||||
*
|
||||
* Copyright (c) 1999 The Puffin Group
|
||||
* Copyright (c) 2001 Matthew Wilcox for Hewlett Packard
|
||||
* Copyright (c) 2001 Helge Deller <deller@gmx.de>
|
||||
* Copyright (c) 2001-2023 Helge Deller <deller@gmx.de>
|
||||
* Copyright (c) 2001,2002 Ryan Bradetich
|
||||
* Copyright (c) 2004-2005 Thibaut VARENE <varenet@parisc-linux.org>
|
||||
*
|
||||
@ -74,13 +74,13 @@ static int descend_children(struct device * dev, void * data)
|
||||
}
|
||||
|
||||
/**
|
||||
* for_each_padev - Iterate over all devices in the tree
|
||||
* @fn: Function to call for each device.
|
||||
* @data: Data to pass to the called function.
|
||||
* for_each_padev - Iterate over all devices in the tree
|
||||
* @fn: Function to call for each device.
|
||||
* @data: Data to pass to the called function.
|
||||
*
|
||||
* This performs a depth-first traversal of the tree, calling the
|
||||
* function passed for each node. It calls the function for parents
|
||||
* before children.
|
||||
* This performs a depth-first traversal of the tree, calling the
|
||||
* function passed for each node. It calls the function for parents
|
||||
* before children.
|
||||
*/
|
||||
|
||||
static int for_each_padev(int (*fn)(struct device *, void *), void * data)
|
||||
@ -280,7 +280,7 @@ int __init machine_has_merced_bus(void)
|
||||
|
||||
/**
|
||||
* find_pa_parent_type - Find a parent of a specific type
|
||||
* @dev: The device to start searching from
|
||||
* @padev: The device to start searching from
|
||||
* @type: The device type to search for.
|
||||
*
|
||||
* Walks up the device tree looking for a device of the specified type.
|
||||
@ -344,8 +344,8 @@ static char *print_hwpath(struct hardware_path *path, char *output)
|
||||
|
||||
/**
|
||||
* print_pa_hwpath - Returns hardware path for PA devices
|
||||
* dev: The device to return the path for
|
||||
* output: Pointer to a previously-allocated array to place the path in.
|
||||
* @dev: The device to return the path for
|
||||
* @output: Pointer to a previously-allocated array to place the path in.
|
||||
*
|
||||
* This function fills in the output array with a human-readable path
|
||||
* to a PA device. This string is compatible with that used by PDC, and
|
||||
@ -379,8 +379,8 @@ EXPORT_SYMBOL(get_pci_node_path);
|
||||
|
||||
/**
|
||||
* print_pci_hwpath - Returns hardware path for PCI devices
|
||||
* dev: The device to return the path for
|
||||
* output: Pointer to a previously-allocated array to place the path in.
|
||||
* @dev: The device to return the path for
|
||||
* @output: Pointer to a previously-allocated array to place the path in.
|
||||
*
|
||||
* This function fills in the output array with a human-readable path
|
||||
* to a PCI device. This string is compatible with that used by PDC, and
|
||||
@ -415,7 +415,8 @@ static void setup_bus_id(struct parisc_device *padev)
|
||||
dev_set_name(&padev->dev, name);
|
||||
}
|
||||
|
||||
struct parisc_device * __init create_tree_node(char id, struct device *parent)
|
||||
static struct parisc_device * __init create_tree_node(char id,
|
||||
struct device *parent)
|
||||
{
|
||||
struct parisc_device *dev = kzalloc(sizeof(*dev), GFP_KERNEL);
|
||||
if (!dev)
|
||||
@ -741,7 +742,7 @@ parse_tree_node(struct device *parent, int index, struct hardware_path *modpath)
|
||||
};
|
||||
|
||||
if (device_for_each_child(parent, &recurse_data, descend_children))
|
||||
/* nothing */;
|
||||
{ /* nothing */ };
|
||||
|
||||
return d.dev;
|
||||
}
|
||||
@ -771,8 +772,8 @@ EXPORT_SYMBOL(hwpath_to_device);
|
||||
|
||||
/**
|
||||
* device_to_hwpath - Populates the hwpath corresponding to the given device.
|
||||
* @param dev the target device
|
||||
* @param path pointer to a previously allocated hwpath struct to be filled in
|
||||
* @dev: the target device
|
||||
* @path: pointer to a previously allocated hwpath struct to be filled in
|
||||
*/
|
||||
void device_to_hwpath(struct device *dev, struct hardware_path *path)
|
||||
{
|
||||
|
@ -134,7 +134,7 @@ static unsigned long f_extend(unsigned long address)
|
||||
|
||||
/**
|
||||
* convert_to_wide - Convert the return buffer addresses into kernel addresses.
|
||||
* @address: The return buffer from PDC.
|
||||
* @addr: The return buffer from PDC.
|
||||
*
|
||||
* This function is used to convert the return buffer addresses retrieved from PDC
|
||||
* into kernel addresses when the PDC address size and kernel address size are
|
||||
@ -160,6 +160,8 @@ void set_firmware_width_unlocked(void)
|
||||
|
||||
ret = mem_pdc_call(PDC_MODEL, PDC_MODEL_CAPABILITIES,
|
||||
__pa(pdc_result), 0);
|
||||
if (ret < 0)
|
||||
return;
|
||||
convert_to_wide(pdc_result);
|
||||
if (pdc_result[0] != NARROW_FIRMWARE)
|
||||
parisc_narrow_firmware = 0;
|
||||
@ -255,8 +257,8 @@ int __init pdc_instr(unsigned int *instr)
|
||||
|
||||
/**
|
||||
* pdc_chassis_info - Return chassis information.
|
||||
* @result: The return buffer.
|
||||
* @chassis_info: The memory buffer address.
|
||||
* @led_info: The size of the memory buffer address.
|
||||
* @len: The size of the memory buffer address.
|
||||
*
|
||||
* An HVERSION dependent call for returning the chassis information.
|
||||
@ -280,7 +282,8 @@ int __init pdc_chassis_info(struct pdc_chassis_info *chassis_info, void *led_inf
|
||||
|
||||
/**
|
||||
* pdc_pat_chassis_send_log - Sends a PDC PAT CHASSIS log message.
|
||||
* @retval: -1 on error, 0 on success. Other value are PDC errors
|
||||
* @state: state of the machine
|
||||
* @data: value for that state
|
||||
*
|
||||
* Must be correctly formatted or expect system crash
|
||||
*/
|
||||
@ -303,7 +306,7 @@ int pdc_pat_chassis_send_log(unsigned long state, unsigned long data)
|
||||
|
||||
/**
|
||||
* pdc_chassis_disp - Updates chassis code
|
||||
* @retval: -1 on error, 0 on success
|
||||
* @disp: value to show on display
|
||||
*/
|
||||
int pdc_chassis_disp(unsigned long disp)
|
||||
{
|
||||
@ -318,8 +321,7 @@ int pdc_chassis_disp(unsigned long disp)
|
||||
}
|
||||
|
||||
/**
|
||||
* pdc_cpu_rendenzvous - Stop currently executing CPU
|
||||
* @retval: -1 on error, 0 on success
|
||||
* __pdc_cpu_rendezvous - Stop currently executing CPU and do not return.
|
||||
*/
|
||||
int __pdc_cpu_rendezvous(void)
|
||||
{
|
||||
@ -347,7 +349,7 @@ void pdc_cpu_rendezvous_unlock(void)
|
||||
|
||||
/**
|
||||
* pdc_pat_get_PDC_entrypoint - Get PDC entry point for current CPU
|
||||
* @retval: -1 on error, 0 on success
|
||||
* @pdc_entry: pointer to where the PDC entry point should be stored
|
||||
*/
|
||||
int pdc_pat_get_PDC_entrypoint(unsigned long *pdc_entry)
|
||||
{
|
||||
@ -369,7 +371,7 @@ int pdc_pat_get_PDC_entrypoint(unsigned long *pdc_entry)
|
||||
}
|
||||
/**
|
||||
* pdc_chassis_warn - Fetches chassis warnings
|
||||
* @retval: -1 on error, 0 on success
|
||||
* @warn: The warning value to be shown
|
||||
*/
|
||||
int pdc_chassis_warn(unsigned long *warn)
|
||||
{
|
||||
@ -521,6 +523,7 @@ int pdc_model_info(struct pdc_model *model)
|
||||
|
||||
/**
|
||||
* pdc_model_sysmodel - Get the system model name.
|
||||
* @os_id: The operating system ID asked for (an OS_ID_* value)
|
||||
* @name: A char array of at least 81 characters.
|
||||
*
|
||||
* Get system model name from PDC ROM (e.g. 9000/715 or 9000/778/B160L).
|
||||
@ -549,7 +552,7 @@ int pdc_model_sysmodel(unsigned int os_id, char *name)
|
||||
|
||||
/**
|
||||
* pdc_model_versions - Identify the version number of each processor.
|
||||
* @cpu_id: The return buffer.
|
||||
* @versions: The return buffer.
|
||||
* @id: The id of the processor to check.
|
||||
*
|
||||
* Returns the version number for each processor component.
|
||||
@ -996,8 +999,8 @@ int pdc_pci_irt(unsigned long num_entries, unsigned long hpa, void *tbl)
|
||||
|
||||
/**
|
||||
* pdc_pci_config_read - read PCI config space.
|
||||
* @hpa token from PDC to indicate which PCI device
|
||||
* @pci_addr configuration space address to read from
|
||||
* @hpa: Token from PDC to indicate which PCI device
|
||||
* @cfg_addr: Configuration space address to read from
|
||||
*
|
||||
* Read PCI Configuration space *before* linux PCI subsystem is running.
|
||||
*/
|
||||
@ -1019,9 +1022,9 @@ unsigned int pdc_pci_config_read(void *hpa, unsigned long cfg_addr)
|
||||
|
||||
/**
|
||||
* pdc_pci_config_write - read PCI config space.
|
||||
* @hpa token from PDC to indicate which PCI device
|
||||
* @pci_addr configuration space address to write
|
||||
* @val value we want in the 32-bit register
|
||||
* @hpa: Token from PDC to indicate which PCI device
|
||||
* @cfg_addr: Configuration space address to write
|
||||
* @val: Value we want in the 32-bit register
|
||||
*
|
||||
* Write PCI Configuration space *before* linux PCI subsystem is running.
|
||||
*/
|
||||
@ -1389,17 +1392,25 @@ int pdc_iodc_getc(void)
|
||||
}
|
||||
|
||||
int pdc_sti_call(unsigned long func, unsigned long flags,
|
||||
unsigned long inptr, unsigned long outputr,
|
||||
unsigned long glob_cfg)
|
||||
unsigned long inptr, unsigned long outputr,
|
||||
unsigned long glob_cfg, int do_call64)
|
||||
{
|
||||
int retval;
|
||||
int retval = 0;
|
||||
unsigned long irqflags;
|
||||
|
||||
spin_lock_irqsave(&pdc_lock, irqflags);
|
||||
retval = real32_call(func, flags, inptr, outputr, glob_cfg);
|
||||
spin_unlock_irqrestore(&pdc_lock, irqflags);
|
||||
spin_lock_irqsave(&pdc_lock, irqflags);
|
||||
if (IS_ENABLED(CONFIG_64BIT) && do_call64) {
|
||||
#ifdef CONFIG_64BIT
|
||||
retval = real64_call(func, flags, inptr, outputr, glob_cfg);
|
||||
#else
|
||||
WARN_ON(1);
|
||||
#endif
|
||||
} else {
|
||||
retval = real32_call(func, flags, inptr, outputr, glob_cfg);
|
||||
}
|
||||
spin_unlock_irqrestore(&pdc_lock, irqflags);
|
||||
|
||||
return retval;
|
||||
return retval;
|
||||
}
|
||||
EXPORT_SYMBOL(pdc_sti_call);
|
||||
|
||||
@ -1549,7 +1560,7 @@ int pdc_pat_get_irt(void *r_addr, unsigned long cell_num)
|
||||
|
||||
/**
|
||||
* pdc_pat_pd_get_addr_map - Retrieve information about memory address ranges.
|
||||
* @actlen: The return buffer.
|
||||
* @actual_len: The return buffer.
|
||||
* @mem_addr: Pointer to the memory buffer.
|
||||
* @count: The number of bytes to read from the buffer.
|
||||
* @offset: The offset with respect to the beginning of the buffer.
|
||||
@ -1572,7 +1583,7 @@ int pdc_pat_pd_get_addr_map(unsigned long *actual_len, void *mem_addr,
|
||||
}
|
||||
|
||||
/**
|
||||
* pdc_pat_pd_get_PDC_interface_revisions - Retrieve PDC interface revisions.
|
||||
* pdc_pat_pd_get_pdc_revisions - Retrieve PDC interface revisions.
|
||||
* @legacy_rev: The legacy revision.
|
||||
* @pat_rev: The PAT revision.
|
||||
* @pdc_cap: The PDC capabilities.
|
||||
@ -1627,7 +1638,7 @@ int pdc_pat_io_pci_cfg_read(unsigned long pci_addr, int pci_size, u32 *mem_addr)
|
||||
* pdc_pat_io_pci_cfg_write - Retrieve information about memory address ranges.
|
||||
* @pci_addr: PCI configuration space address for which the write request is being made.
|
||||
* @pci_size: Size of write in bytes. Valid values are 1, 2, and 4.
|
||||
* @value: Pointer to 1, 2, or 4 byte value in low order end of argument to be
|
||||
* @val: Pointer to 1, 2, or 4 byte value in low order end of argument to be
|
||||
* written to PCI Config space.
|
||||
*
|
||||
*/
|
||||
@ -1645,7 +1656,7 @@ int pdc_pat_io_pci_cfg_write(unsigned long pci_addr, int pci_size, u32 val)
|
||||
}
|
||||
|
||||
/**
|
||||
* pdc_pat_mem_pdc_info - Retrieve information about page deallocation table
|
||||
* pdc_pat_mem_pdt_info - Retrieve information about page deallocation table
|
||||
* @rinfo: memory pdt information
|
||||
*
|
||||
*/
|
||||
|
@ -24,9 +24,6 @@
|
||||
|
||||
#undef PARISC_IRQ_CR16_COUNTS
|
||||
|
||||
extern irqreturn_t timer_interrupt(int, void *);
|
||||
extern irqreturn_t ipi_interrupt(int, void *);
|
||||
|
||||
#define EIEM_MASK(irq) (1UL<<(CPU_IRQ_MAX - irq))
|
||||
|
||||
/* Bits in EIEM correlate with cpu_irq_action[].
|
||||
@ -489,7 +486,7 @@ void do_softirq_own_stack(void)
|
||||
#endif /* CONFIG_IRQSTACKS */
|
||||
|
||||
/* ONLY called from entry.S:intr_extint() */
|
||||
void do_cpu_irq_mask(struct pt_regs *regs)
|
||||
asmlinkage void do_cpu_irq_mask(struct pt_regs *regs)
|
||||
{
|
||||
struct pt_regs *old_regs;
|
||||
unsigned long eirr_val;
|
||||
|
@ -845,7 +845,7 @@ int module_finalize(const Elf_Ehdr *hdr,
|
||||
const char *strtab = NULL;
|
||||
const Elf_Shdr *s;
|
||||
char *secstrings;
|
||||
int symindex = -1;
|
||||
int symindex __maybe_unused = -1;
|
||||
Elf_Sym *newptr, *oldptr;
|
||||
Elf_Shdr *symhdr = NULL;
|
||||
#ifdef DEBUG
|
||||
|
@ -245,7 +245,7 @@ static void unmap_uncached_pages(unsigned long vaddr, unsigned long size)
|
||||
PCXL_SEARCH_LOOP(idx, mask, size); \
|
||||
}
|
||||
|
||||
unsigned long
|
||||
static unsigned long
|
||||
pcxl_alloc_range(size_t size)
|
||||
{
|
||||
int res_idx;
|
||||
|
@ -40,7 +40,7 @@ static unsigned int pdc_chassis_enabled __read_mostly = 1;
|
||||
|
||||
/**
|
||||
* pdc_chassis_setup() - Enable/disable pdc_chassis code at boot time.
|
||||
* @str configuration param: 0 to disable chassis log
|
||||
* @str: configuration param: 0 to disable chassis log
|
||||
* @return 1
|
||||
*/
|
||||
|
||||
@ -55,7 +55,6 @@ __setup("pdcchassis=", pdc_chassis_setup);
|
||||
|
||||
/**
|
||||
* pdc_chassis_checkold() - Checks for old PDC_CHASSIS compatibility
|
||||
* @pdc_chassis_old: 1 if old pdc chassis style
|
||||
*
|
||||
* Currently, only E class and A180 are known to work with this.
|
||||
* Inspired by Christoph Plattner
|
||||
@ -80,6 +79,9 @@ static void __init pdc_chassis_checkold(void)
|
||||
|
||||
/**
|
||||
* pdc_chassis_panic_event() - Called by the panic handler.
|
||||
* @this: unused
|
||||
* @event: unused
|
||||
* @ptr: unused
|
||||
*
|
||||
* As soon as a panic occurs, we should inform the PDC.
|
||||
*/
|
||||
@ -88,7 +90,7 @@ static int pdc_chassis_panic_event(struct notifier_block *this,
|
||||
unsigned long event, void *ptr)
|
||||
{
|
||||
pdc_chassis_send_status(PDC_CHASSIS_DIRECT_PANIC);
|
||||
return NOTIFY_DONE;
|
||||
return NOTIFY_DONE;
|
||||
}
|
||||
|
||||
|
||||
@ -99,7 +101,10 @@ static struct notifier_block pdc_chassis_panic_block = {
|
||||
|
||||
|
||||
/**
|
||||
* parisc_reboot_event() - Called by the reboot handler.
|
||||
* pdc_chassis_reboot_event() - Called by the reboot handler.
|
||||
* @this: unused
|
||||
* @event: unused
|
||||
* @ptr: unused
|
||||
*
|
||||
* As soon as a reboot occurs, we should inform the PDC.
|
||||
*/
|
||||
@ -108,7 +113,7 @@ static int pdc_chassis_reboot_event(struct notifier_block *this,
|
||||
unsigned long event, void *ptr)
|
||||
{
|
||||
pdc_chassis_send_status(PDC_CHASSIS_DIRECT_SHUTDOWN);
|
||||
return NOTIFY_DONE;
|
||||
return NOTIFY_DONE;
|
||||
}
|
||||
|
||||
|
||||
@ -148,7 +153,7 @@ void __init parisc_pdc_chassis_init(void)
|
||||
/**
|
||||
* pdc_chassis_send_status() - Sends a predefined message to the chassis,
|
||||
* and changes the front panel LEDs according to the new system state
|
||||
* @retval: PDC call return value.
|
||||
* @message: Type of message, one of PDC_CHASSIS_DIRECT_* values.
|
||||
*
|
||||
* Only machines with 64 bits PDC PAT and those reported in
|
||||
* pdc_chassis_checkold() are supported atm.
|
||||
|
@ -23,6 +23,7 @@
|
||||
#include <asm/pdc.h>
|
||||
#include <asm/pdcpat.h>
|
||||
#include <asm/sections.h>
|
||||
#include <asm/pgtable.h>
|
||||
|
||||
enum pdt_access_type {
|
||||
PDT_NONE,
|
||||
|
@ -288,7 +288,7 @@ static ssize_t perf_read(struct file *file, char __user *buf, size_t cnt, loff_t
|
||||
static ssize_t perf_write(struct file *file, const char __user *buf,
|
||||
size_t count, loff_t *ppos)
|
||||
{
|
||||
size_t image_size;
|
||||
size_t image_size __maybe_unused;
|
||||
uint32_t image_type;
|
||||
uint32_t interface_type;
|
||||
uint32_t test;
|
||||
|
@ -58,7 +58,7 @@ DEFINE_PER_CPU(struct cpuinfo_parisc, cpu_data);
|
||||
*/
|
||||
|
||||
/**
|
||||
* init_cpu_profiler - enable/setup per cpu profiling hooks.
|
||||
* init_percpu_prof - enable/setup per cpu profiling hooks.
|
||||
* @cpunum: The processor instance.
|
||||
*
|
||||
* FIXME: doesn't do much yet...
|
||||
|
@ -45,7 +45,7 @@ struct proc_dir_entry * proc_runway_root __read_mostly = NULL;
|
||||
struct proc_dir_entry * proc_gsc_root __read_mostly = NULL;
|
||||
struct proc_dir_entry * proc_mckinley_root __read_mostly = NULL;
|
||||
|
||||
void __init setup_cmdline(char **cmdline_p)
|
||||
static void __init setup_cmdline(char **cmdline_p)
|
||||
{
|
||||
extern unsigned int boot_args[];
|
||||
char *p;
|
||||
@ -86,7 +86,7 @@ void __init setup_cmdline(char **cmdline_p)
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PA11
|
||||
void __init dma_ops_init(void)
|
||||
static void __init dma_ops_init(void)
|
||||
{
|
||||
switch (boot_cpu_data.cpu_type) {
|
||||
case pcx:
|
||||
@ -106,8 +106,6 @@ void __init dma_ops_init(void)
|
||||
}
|
||||
#endif
|
||||
|
||||
extern void collect_boot_cpu_data(void);
|
||||
|
||||
void __init setup_arch(char **cmdline_p)
|
||||
{
|
||||
#ifdef CONFIG_64BIT
|
||||
@ -167,10 +165,7 @@ void __init setup_arch(char **cmdline_p)
|
||||
|
||||
/*
|
||||
* Display CPU info for all CPUs.
|
||||
* for parisc this is in processor.c
|
||||
*/
|
||||
extern int show_cpuinfo (struct seq_file *m, void *v);
|
||||
|
||||
static void *
|
||||
c_start (struct seq_file *m, loff_t *pos)
|
||||
{
|
||||
@ -295,16 +290,6 @@ static int __init parisc_init_resources(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
extern void gsc_init(void);
|
||||
extern void processor_init(void);
|
||||
extern void ccio_init(void);
|
||||
extern void hppb_init(void);
|
||||
extern void dino_init(void);
|
||||
extern void iosapic_init(void);
|
||||
extern void lba_init(void);
|
||||
extern void sba_init(void);
|
||||
extern void eisa_init(void);
|
||||
|
||||
static int __init parisc_init(void)
|
||||
{
|
||||
u32 osid = (OS_ID_LINUX << 16);
|
||||
@ -370,7 +355,7 @@ static int __init parisc_init(void)
|
||||
gsc_init();
|
||||
#endif
|
||||
#ifdef CONFIG_EISA
|
||||
eisa_init();
|
||||
parisc_eisa_init();
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_HPPB)
|
||||
@ -391,8 +376,6 @@ arch_initcall(parisc_init);
|
||||
|
||||
void __init start_parisc(void)
|
||||
{
|
||||
extern void early_trap_init(void);
|
||||
|
||||
int ret, cpunum;
|
||||
struct pdc_coproc_cfg coproc_cfg;
|
||||
|
||||
|
@ -73,7 +73,7 @@ restore_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs)
|
||||
return err;
|
||||
}
|
||||
|
||||
void
|
||||
asmlinkage void
|
||||
sys_rt_sigreturn(struct pt_regs *regs, int in_syscall)
|
||||
{
|
||||
struct rt_sigframe __user *frame;
|
||||
@ -176,7 +176,7 @@ get_sigframe(struct k_sigaction *ka, unsigned long sp, size_t frame_size)
|
||||
}
|
||||
|
||||
static long
|
||||
setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs, int in_syscall)
|
||||
setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs, long in_syscall)
|
||||
|
||||
{
|
||||
unsigned long flags = 0;
|
||||
@ -211,7 +211,7 @@ setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs, int in_sysc
|
||||
|
||||
static long
|
||||
setup_rt_frame(struct ksignal *ksig, sigset_t *set, struct pt_regs *regs,
|
||||
int in_syscall)
|
||||
long in_syscall)
|
||||
{
|
||||
struct rt_sigframe __user *frame;
|
||||
unsigned long rp, usp;
|
||||
@ -380,7 +380,7 @@ setup_rt_frame(struct ksignal *ksig, sigset_t *set, struct pt_regs *regs,
|
||||
*/
|
||||
|
||||
static void
|
||||
handle_signal(struct ksignal *ksig, struct pt_regs *regs, int in_syscall)
|
||||
handle_signal(struct ksignal *ksig, struct pt_regs *regs, long in_syscall)
|
||||
{
|
||||
int ret;
|
||||
sigset_t *oldset = sigmask_to_save();
|
||||
@ -578,7 +578,7 @@ static void do_signal(struct pt_regs *regs, long in_syscall)
|
||||
restore_saved_sigmask();
|
||||
}
|
||||
|
||||
void do_notify_resume(struct pt_regs *regs, long in_syscall)
|
||||
asmlinkage void do_notify_resume(struct pt_regs *regs, long in_syscall)
|
||||
{
|
||||
if (test_thread_flag(TIF_SIGPENDING) ||
|
||||
test_thread_flag(TIF_NOTIFY_SIGNAL))
|
||||
|
@ -24,6 +24,7 @@
|
||||
#include <linux/personality.h>
|
||||
#include <linux/random.h>
|
||||
#include <linux/compat.h>
|
||||
#include <linux/elf-randomize.h>
|
||||
|
||||
/*
|
||||
* Construct an artificial page offset for the mapping based on the physical
|
||||
@ -339,7 +340,7 @@ asmlinkage long parisc_fallocate(int fd, int mode, u32 offhi, u32 offlo,
|
||||
((u64)lenhi << 32) | lenlo);
|
||||
}
|
||||
|
||||
long parisc_personality(unsigned long personality)
|
||||
asmlinkage long parisc_personality(unsigned long personality)
|
||||
{
|
||||
long err;
|
||||
|
||||
|
@ -400,6 +400,7 @@
|
||||
353 common pkey_free sys_pkey_free
|
||||
354 common rseq sys_rseq
|
||||
355 common kexec_file_load sys_kexec_file_load sys_kexec_file_load
|
||||
356 common cacheflush sys_cacheflush
|
||||
# up to 402 is unassigned and reserved for arch specific syscalls
|
||||
403 32 clock_gettime64 sys_clock_gettime sys_clock_gettime
|
||||
404 32 clock_settime64 sys_clock_settime sys_clock_settime
|
||||
|
@ -338,7 +338,7 @@ static void default_trap(int code, struct pt_regs *regs)
|
||||
void (*cpu_lpmc) (int code, struct pt_regs *regs) __read_mostly = default_trap;
|
||||
|
||||
|
||||
void transfer_pim_to_trap_frame(struct pt_regs *regs)
|
||||
static void transfer_pim_to_trap_frame(struct pt_regs *regs)
|
||||
{
|
||||
register int i;
|
||||
extern unsigned int hpmc_pim_data[];
|
||||
@ -800,14 +800,13 @@ void notrace handle_interruption(int code, struct pt_regs *regs)
|
||||
}
|
||||
|
||||
|
||||
void __init initialize_ivt(const void *iva)
|
||||
static void __init initialize_ivt(const void *iva)
|
||||
{
|
||||
extern const u32 os_hpmc[];
|
||||
|
||||
int i;
|
||||
u32 check = 0;
|
||||
u32 *ivap;
|
||||
u32 *hpmcp;
|
||||
u32 instr;
|
||||
|
||||
if (strcmp((const char *)iva, "cows can fly"))
|
||||
@ -840,8 +839,6 @@ void __init initialize_ivt(const void *iva)
|
||||
/* Setup IVA and compute checksum for HPMC handler */
|
||||
ivap[6] = (u32)__pa(os_hpmc);
|
||||
|
||||
hpmcp = (u32 *)os_hpmc;
|
||||
|
||||
for (i=0; i<8; i++)
|
||||
check += ivap[i];
|
||||
|
||||
|
@ -11,6 +11,7 @@
|
||||
#include <linux/signal.h>
|
||||
#include <linux/ratelimit.h>
|
||||
#include <linux/uaccess.h>
|
||||
#include <asm/unaligned.h>
|
||||
#include <asm/hardirq.h>
|
||||
#include <asm/traps.h>
|
||||
|
||||
|
@ -24,12 +24,13 @@
|
||||
#include <asm/unwind.h>
|
||||
#include <asm/switch_to.h>
|
||||
#include <asm/sections.h>
|
||||
#include <asm/ftrace.h>
|
||||
|
||||
/* #define DEBUG 1 */
|
||||
#ifdef DEBUG
|
||||
#define dbg(x...) pr_debug(x)
|
||||
#else
|
||||
#define dbg(x...)
|
||||
#define dbg(x...) do { } while (0)
|
||||
#endif
|
||||
|
||||
#define KERNEL_START (KERNEL_BINARY_TEXT_START)
|
||||
@ -179,7 +180,7 @@ void unwind_table_remove(struct unwind_table *table)
|
||||
/* Called from setup_arch to import the kernel unwind info */
|
||||
int __init unwind_init(void)
|
||||
{
|
||||
long start, stop;
|
||||
long start __maybe_unused, stop __maybe_unused;
|
||||
register unsigned long gp __asm__ ("r27");
|
||||
|
||||
start = (long)&__start___unwind[0];
|
||||
|
@ -626,12 +626,10 @@ static void __init pagetable_init(void)
|
||||
|
||||
for (range = 0; range < npmem_ranges; range++) {
|
||||
unsigned long start_paddr;
|
||||
unsigned long end_paddr;
|
||||
unsigned long size;
|
||||
|
||||
start_paddr = pmem_ranges[range].start_pfn << PAGE_SHIFT;
|
||||
size = pmem_ranges[range].pages << PAGE_SHIFT;
|
||||
end_paddr = start_paddr + size;
|
||||
|
||||
map_pages((unsigned long)__va(start_paddr), start_paddr,
|
||||
size, PAGE_KERNEL, 0);
|
||||
|
@ -97,7 +97,6 @@
|
||||
#define DBG_RUN_SG(x...)
|
||||
#endif
|
||||
|
||||
#define CCIO_INLINE inline
|
||||
#define WRITE_U32(value, addr) __raw_writel(value, addr)
|
||||
#define READ_U32(addr) __raw_readl(addr)
|
||||
|
||||
@ -330,7 +329,8 @@ static int ioc_count;
|
||||
/**
|
||||
* ccio_alloc_range - Allocate pages in the ioc's resource map.
|
||||
* @ioc: The I/O Controller.
|
||||
* @pages_needed: The requested number of pages to be mapped into the
|
||||
* @dev: The PCI device.
|
||||
* @size: The requested number of bytes to be mapped into the
|
||||
* I/O Pdir...
|
||||
*
|
||||
* This function searches the resource map of the ioc to locate a range
|
||||
@ -552,7 +552,7 @@ static u32 hint_lookup[] = {
|
||||
* (Load Coherence Index) instruction. The 8 bits used for the virtual
|
||||
* index are bits 12:19 of the value returned by LCI.
|
||||
*/
|
||||
static void CCIO_INLINE
|
||||
static void
|
||||
ccio_io_pdir_entry(u64 *pdir_ptr, space_t sid, unsigned long vba,
|
||||
unsigned long hints)
|
||||
{
|
||||
@ -623,7 +623,7 @@ ccio_io_pdir_entry(u64 *pdir_ptr, space_t sid, unsigned long vba,
|
||||
*
|
||||
* FIXME: Can we change the byte_cnt to pages_mapped?
|
||||
*/
|
||||
static CCIO_INLINE void
|
||||
static void
|
||||
ccio_clear_io_tlb(struct ioc *ioc, dma_addr_t iovp, size_t byte_cnt)
|
||||
{
|
||||
u32 chain_size = 1 << ioc->chainid_shift;
|
||||
@ -656,7 +656,7 @@ ccio_clear_io_tlb(struct ioc *ioc, dma_addr_t iovp, size_t byte_cnt)
|
||||
*
|
||||
* FIXME: Can we change byte_cnt to pages_mapped?
|
||||
*/
|
||||
static CCIO_INLINE void
|
||||
static void
|
||||
ccio_mark_invalid(struct ioc *ioc, dma_addr_t iova, size_t byte_cnt)
|
||||
{
|
||||
u32 iovp = (u32)CCIO_IOVP(iova);
|
||||
@ -795,9 +795,10 @@ ccio_map_page(struct device *dev, struct page *page, unsigned long offset,
|
||||
/**
|
||||
* ccio_unmap_page - Unmap an address range from the IOMMU.
|
||||
* @dev: The PCI device.
|
||||
* @addr: The start address of the DMA region.
|
||||
* @iova: The start address of the DMA region.
|
||||
* @size: The length of the DMA region.
|
||||
* @direction: The direction of the DMA transaction (to/from device).
|
||||
* @attrs: attributes
|
||||
*/
|
||||
static void
|
||||
ccio_unmap_page(struct device *dev, dma_addr_t iova, size_t size,
|
||||
@ -838,6 +839,8 @@ ccio_unmap_page(struct device *dev, dma_addr_t iova, size_t size,
|
||||
* @dev: The PCI device.
|
||||
* @size: The length of the DMA region.
|
||||
* @dma_handle: The DMA address handed back to the device (not the cpu).
|
||||
* @flag: allocation flags
|
||||
* @attrs: attributes
|
||||
*
|
||||
* This function implements the pci_alloc_consistent function.
|
||||
*/
|
||||
@ -872,6 +875,7 @@ ccio_alloc(struct device *dev, size_t size, dma_addr_t *dma_handle, gfp_t flag,
|
||||
* @size: The length of the DMA region.
|
||||
* @cpu_addr: The cpu address returned from the ccio_alloc_consistent.
|
||||
* @dma_handle: The device address returned from the ccio_alloc_consistent.
|
||||
* @attrs: attributes
|
||||
*
|
||||
* This function implements the pci_free_consistent function.
|
||||
*/
|
||||
@ -901,6 +905,7 @@ ccio_free(struct device *dev, size_t size, void *cpu_addr,
|
||||
* @sglist: The scatter/gather list to be mapped in the IOMMU.
|
||||
* @nents: The number of entries in the scatter/gather list.
|
||||
* @direction: The direction of the DMA transaction (to/from device).
|
||||
* @attrs: attributes
|
||||
*
|
||||
* This function implements the pci_map_sg function.
|
||||
*/
|
||||
@ -980,6 +985,7 @@ ccio_map_sg(struct device *dev, struct scatterlist *sglist, int nents,
|
||||
* @sglist: The scatter/gather list to be unmapped from the IOMMU.
|
||||
* @nents: The number of entries in the scatter/gather list.
|
||||
* @direction: The direction of the DMA transaction (to/from device).
|
||||
* @attrs: attributes
|
||||
*
|
||||
* This function implements the pci_unmap_sg function.
|
||||
*/
|
||||
|
@ -924,8 +924,6 @@ static const char cujo_vers[][4] = {
|
||||
"2.0"
|
||||
};
|
||||
|
||||
void ccio_cujo20_fixup(struct parisc_device *dev, u32 iovp);
|
||||
|
||||
/*
|
||||
** Determine if dino should claim this chip (return 0) or not (return 1).
|
||||
** If so, initialize the chip appropriately (card-mode vs bridge mode).
|
||||
@ -1086,9 +1084,8 @@ static struct parisc_driver dino_driver __refdata = {
|
||||
* This is the only routine which is NOT static.
|
||||
* Must be called exactly once before pci_init().
|
||||
*/
|
||||
int __init dino_init(void)
|
||||
void __init dino_init(void)
|
||||
{
|
||||
register_parisc_driver(&dino_driver);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -400,7 +400,7 @@ static struct parisc_driver eisa_driver __refdata = {
|
||||
.probe = eisa_probe,
|
||||
};
|
||||
|
||||
void __init eisa_init(void)
|
||||
void __init parisc_eisa_init(void)
|
||||
{
|
||||
register_parisc_driver(&eisa_driver);
|
||||
}
|
||||
|
@ -404,7 +404,7 @@ static int elroy_cfg_read(struct pci_bus *bus, unsigned int devfn, int pos, int
|
||||
static void
|
||||
lba_wr_cfg(struct lba_device *d, u32 tok, u8 reg, u32 data, u32 size)
|
||||
{
|
||||
int error = 0;
|
||||
int error __maybe_unused = 0;
|
||||
u32 arb_mask = 0;
|
||||
u32 error_config = 0;
|
||||
u32 status_control = 0;
|
||||
@ -1018,7 +1018,7 @@ static void
|
||||
lba_pat_resources(struct parisc_device *pa_dev, struct lba_device *lba_dev)
|
||||
{
|
||||
unsigned long bytecnt;
|
||||
long io_count;
|
||||
long io_count __maybe_unused;
|
||||
long status; /* PDC return status */
|
||||
long pa_count;
|
||||
pdc_pat_cell_mod_maddr_block_t *pa_pdc_cell; /* PA_VIEW */
|
||||
@ -1164,10 +1164,6 @@ lba_pat_resources(struct parisc_device *pa_dev, struct lba_device *lba_dev)
|
||||
#endif /* CONFIG_64BIT */
|
||||
|
||||
|
||||
extern void sba_distributed_lmmio(struct parisc_device *, struct resource *);
|
||||
extern void sba_directed_lmmio(struct parisc_device *, struct resource *);
|
||||
|
||||
|
||||
static void
|
||||
lba_legacy_resources(struct parisc_device *pa_dev, struct lba_device *lba_dev)
|
||||
{
|
||||
|
@ -509,6 +509,8 @@ static struct pdcspath_entry *pdcspath_entries[] = {
|
||||
|
||||
/**
|
||||
* pdcs_size_read - Stable Storage size output.
|
||||
* @kobj: The kobject used to share data with userspace.
|
||||
* @attr: The kobject attributes.
|
||||
* @buf: The output buffer to write to.
|
||||
*/
|
||||
static ssize_t pdcs_size_read(struct kobject *kobj,
|
||||
@ -528,6 +530,8 @@ static ssize_t pdcs_size_read(struct kobject *kobj,
|
||||
|
||||
/**
|
||||
* pdcs_auto_read - Stable Storage autoboot/search flag output.
|
||||
* @kobj: The kobject used to share data with userspace.
|
||||
* @attr: The kobject attributes.
|
||||
* @buf: The output buffer to write to.
|
||||
* @knob: The PF_AUTOBOOT or PF_AUTOSEARCH flag
|
||||
*/
|
||||
@ -554,6 +558,8 @@ static ssize_t pdcs_auto_read(struct kobject *kobj,
|
||||
|
||||
/**
|
||||
* pdcs_autoboot_read - Stable Storage autoboot flag output.
|
||||
* @kobj: The kobject used to share data with userspace.
|
||||
* @attr: The kobject attributes.
|
||||
* @buf: The output buffer to write to.
|
||||
*/
|
||||
static ssize_t pdcs_autoboot_read(struct kobject *kobj,
|
||||
@ -564,6 +570,8 @@ static ssize_t pdcs_autoboot_read(struct kobject *kobj,
|
||||
|
||||
/**
|
||||
* pdcs_autosearch_read - Stable Storage autoboot flag output.
|
||||
* @kobj: The kobject used to share data with userspace.
|
||||
* @attr: The kobject attributes.
|
||||
* @buf: The output buffer to write to.
|
||||
*/
|
||||
static ssize_t pdcs_autosearch_read(struct kobject *kobj,
|
||||
@ -574,6 +582,8 @@ static ssize_t pdcs_autosearch_read(struct kobject *kobj,
|
||||
|
||||
/**
|
||||
* pdcs_timer_read - Stable Storage timer count output (in seconds).
|
||||
* @kobj: The kobject used to share data with userspace.
|
||||
* @attr: The kobject attributes.
|
||||
* @buf: The output buffer to write to.
|
||||
*
|
||||
* The value of the timer field correponds to a number of seconds in powers of 2.
|
||||
@ -601,6 +611,8 @@ static ssize_t pdcs_timer_read(struct kobject *kobj,
|
||||
|
||||
/**
|
||||
* pdcs_osid_read - Stable Storage OS ID register output.
|
||||
* @kobj: The kobject used to share data with userspace.
|
||||
* @attr: The kobject attributes.
|
||||
* @buf: The output buffer to write to.
|
||||
*/
|
||||
static ssize_t pdcs_osid_read(struct kobject *kobj,
|
||||
@ -619,6 +631,8 @@ static ssize_t pdcs_osid_read(struct kobject *kobj,
|
||||
|
||||
/**
|
||||
* pdcs_osdep1_read - Stable Storage OS-Dependent data area 1 output.
|
||||
* @kobj: The kobject used to share data with userspace.
|
||||
* @attr: The kobject attributes.
|
||||
* @buf: The output buffer to write to.
|
||||
*
|
||||
* This can hold 16 bytes of OS-Dependent data.
|
||||
@ -645,6 +659,8 @@ static ssize_t pdcs_osdep1_read(struct kobject *kobj,
|
||||
|
||||
/**
|
||||
* pdcs_diagnostic_read - Stable Storage Diagnostic register output.
|
||||
* @kobj: The kobject used to share data with userspace.
|
||||
* @attr: The kobject attributes.
|
||||
* @buf: The output buffer to write to.
|
||||
*
|
||||
* I have NFC how to interpret the content of that register ;-).
|
||||
@ -669,6 +685,8 @@ static ssize_t pdcs_diagnostic_read(struct kobject *kobj,
|
||||
|
||||
/**
|
||||
* pdcs_fastsize_read - Stable Storage FastSize register output.
|
||||
* @kobj: The kobject used to share data with userspace.
|
||||
* @attr: The kobject attributes.
|
||||
* @buf: The output buffer to write to.
|
||||
*
|
||||
* This register holds the amount of system RAM to be tested during boot sequence.
|
||||
@ -697,6 +715,8 @@ static ssize_t pdcs_fastsize_read(struct kobject *kobj,
|
||||
|
||||
/**
|
||||
* pdcs_osdep2_read - Stable Storage OS-Dependent data area 2 output.
|
||||
* @kobj: The kobject used to share data with userspace.
|
||||
* @attr: The kobject attributes.
|
||||
* @buf: The output buffer to write to.
|
||||
*
|
||||
* This can hold pdcs_size - 224 bytes of OS-Dependent data, when available.
|
||||
@ -729,6 +749,8 @@ static ssize_t pdcs_osdep2_read(struct kobject *kobj,
|
||||
|
||||
/**
|
||||
* pdcs_auto_write - This function handles autoboot/search flag modifying.
|
||||
* @kobj: The kobject used to share data with userspace.
|
||||
* @attr: The kobject attributes.
|
||||
* @buf: The input buffer to read from.
|
||||
* @count: The number of bytes to be read.
|
||||
* @knob: The PF_AUTOBOOT or PF_AUTOSEARCH flag
|
||||
@ -801,6 +823,8 @@ parse_error:
|
||||
|
||||
/**
|
||||
* pdcs_autoboot_write - This function handles autoboot flag modifying.
|
||||
* @kobj: The kobject used to share data with userspace.
|
||||
* @attr: The kobject attributes.
|
||||
* @buf: The input buffer to read from.
|
||||
* @count: The number of bytes to be read.
|
||||
*
|
||||
@ -817,6 +841,8 @@ static ssize_t pdcs_autoboot_write(struct kobject *kobj,
|
||||
|
||||
/**
|
||||
* pdcs_autosearch_write - This function handles autosearch flag modifying.
|
||||
* @kobj: The kobject used to share data with userspace.
|
||||
* @attr: The kobject attributes.
|
||||
* @buf: The input buffer to read from.
|
||||
* @count: The number of bytes to be read.
|
||||
*
|
||||
@ -833,6 +859,8 @@ static ssize_t pdcs_autosearch_write(struct kobject *kobj,
|
||||
|
||||
/**
|
||||
* pdcs_osdep1_write - Stable Storage OS-Dependent data area 1 input.
|
||||
* @kobj: The kobject used to share data with userspace.
|
||||
* @attr: The kobject attributes.
|
||||
* @buf: The input buffer to read from.
|
||||
* @count: The number of bytes to be read.
|
||||
*
|
||||
@ -870,6 +898,8 @@ static ssize_t pdcs_osdep1_write(struct kobject *kobj,
|
||||
|
||||
/**
|
||||
* pdcs_osdep2_write - Stable Storage OS-Dependent data area 2 input.
|
||||
* @kobj: The kobject used to share data with userspace.
|
||||
* @attr: The kobject attributes.
|
||||
* @buf: The input buffer to read from.
|
||||
* @count: The number of bytes to be read.
|
||||
*
|
||||
@ -1023,7 +1053,7 @@ pdcs_unregister_pathentries(void)
|
||||
static int __init
|
||||
pdc_stable_init(void)
|
||||
{
|
||||
int rc = 0, error = 0;
|
||||
int rc = 0, error;
|
||||
u32 result;
|
||||
|
||||
/* find the size of the stable storage */
|
||||
@ -1052,6 +1082,10 @@ pdc_stable_init(void)
|
||||
|
||||
/* Don't forget the root entries */
|
||||
error = sysfs_create_group(stable_kobj, &pdcs_attr_group);
|
||||
if (error) {
|
||||
rc = -ENOMEM;
|
||||
goto fail_ksetreg;
|
||||
}
|
||||
|
||||
/* register the paths kset as a child of the stable kset */
|
||||
paths_kset = kset_create_and_add("paths", NULL, stable_kobj);
|
||||
|
@ -95,8 +95,6 @@
|
||||
#define DBG_RES(x...)
|
||||
#endif
|
||||
|
||||
#define SBA_INLINE __inline__
|
||||
|
||||
#define DEFAULT_DMA_HINT_REG 0
|
||||
|
||||
struct sba_device *sba_list;
|
||||
@ -332,13 +330,14 @@ static unsigned long ptr_to_pide(struct ioc *ioc, unsigned long *res_ptr,
|
||||
/**
|
||||
* sba_search_bitmap - find free space in IO PDIR resource bitmap
|
||||
* @ioc: IO MMU structure which owns the pdir we are interested in.
|
||||
* @dev: device to query the bitmap for
|
||||
* @bits_wanted: number of entries we need.
|
||||
*
|
||||
* Find consecutive free bits in resource bitmap.
|
||||
* Each bit represents one entry in the IO Pdir.
|
||||
* Cool perf optimization: search for log2(size) bits at a time.
|
||||
*/
|
||||
static SBA_INLINE unsigned long
|
||||
static unsigned long
|
||||
sba_search_bitmap(struct ioc *ioc, struct device *dev,
|
||||
unsigned long bits_wanted)
|
||||
{
|
||||
@ -431,6 +430,7 @@ sba_search_bitmap(struct ioc *ioc, struct device *dev,
|
||||
/**
|
||||
* sba_alloc_range - find free bits and mark them in IO PDIR resource bitmap
|
||||
* @ioc: IO MMU structure which owns the pdir we are interested in.
|
||||
* @dev: device for which pages should be alloced
|
||||
* @size: number of bytes to create a mapping for
|
||||
*
|
||||
* Given a size, find consecutive unmarked and then mark those bits in the
|
||||
@ -490,7 +490,7 @@ sba_alloc_range(struct ioc *ioc, struct device *dev, size_t size)
|
||||
*
|
||||
* clear bits in the ioc's resource map
|
||||
*/
|
||||
static SBA_INLINE void
|
||||
static void
|
||||
sba_free_range(struct ioc *ioc, dma_addr_t iova, size_t size)
|
||||
{
|
||||
unsigned long iovp = SBA_IOVP(ioc, iova);
|
||||
@ -568,7 +568,7 @@ typedef unsigned long space_t;
|
||||
* IOMMU uses little endian for the pdir.
|
||||
*/
|
||||
|
||||
static void SBA_INLINE
|
||||
static void
|
||||
sba_io_pdir_entry(u64 *pdir_ptr, space_t sid, unsigned long vba,
|
||||
unsigned long hint)
|
||||
{
|
||||
@ -609,7 +609,7 @@ sba_io_pdir_entry(u64 *pdir_ptr, space_t sid, unsigned long vba,
|
||||
* must be a power of 2. The "Cool perf optimization" in the
|
||||
* allocation routine helps keep that true.
|
||||
*/
|
||||
static SBA_INLINE void
|
||||
static void
|
||||
sba_mark_invalid(struct ioc *ioc, dma_addr_t iova, size_t byte_cnt)
|
||||
{
|
||||
u32 iovp = (u32) SBA_IOVP(ioc,iova);
|
||||
@ -793,6 +793,7 @@ sba_map_page(struct device *dev, struct page *page, unsigned long offset,
|
||||
* @iova: IOVA of driver buffer previously mapped.
|
||||
* @size: number of bytes mapped in driver buffer.
|
||||
* @direction: R/W or both.
|
||||
* @attrs: attributes
|
||||
*
|
||||
* See Documentation/core-api/dma-api-howto.rst
|
||||
*/
|
||||
@ -872,6 +873,8 @@ sba_unmap_page(struct device *dev, dma_addr_t iova, size_t size,
|
||||
* @hwdev: instance of PCI owned by the driver that's asking.
|
||||
* @size: number of bytes mapped in driver buffer.
|
||||
* @dma_handle: IOVA of new buffer.
|
||||
* @gfp: allocation flags
|
||||
* @attrs: attributes
|
||||
*
|
||||
* See Documentation/core-api/dma-api-howto.rst
|
||||
*/
|
||||
@ -902,7 +905,8 @@ static void *sba_alloc(struct device *hwdev, size_t size, dma_addr_t *dma_handle
|
||||
* @hwdev: instance of PCI owned by the driver that's asking.
|
||||
* @size: number of bytes mapped in driver buffer.
|
||||
* @vaddr: virtual address IOVA of "consistent" buffer.
|
||||
* @dma_handler: IO virtual address of "consistent" buffer.
|
||||
* @dma_handle: IO virtual address of "consistent" buffer.
|
||||
* @attrs: attributes
|
||||
*
|
||||
* See Documentation/core-api/dma-api-howto.rst
|
||||
*/
|
||||
@ -938,6 +942,7 @@ int dump_run_sg = 0;
|
||||
* @sglist: array of buffer/length pairs
|
||||
* @nents: number of entries in list
|
||||
* @direction: R/W or both.
|
||||
* @attrs: attributes
|
||||
*
|
||||
* See Documentation/core-api/dma-api-howto.rst
|
||||
*/
|
||||
@ -946,7 +951,7 @@ sba_map_sg(struct device *dev, struct scatterlist *sglist, int nents,
|
||||
enum dma_data_direction direction, unsigned long attrs)
|
||||
{
|
||||
struct ioc *ioc;
|
||||
int coalesced, filled = 0;
|
||||
int filled = 0;
|
||||
unsigned long flags;
|
||||
|
||||
DBG_RUN_SG("%s() START %d entries\n", __func__, nents);
|
||||
@ -985,7 +990,7 @@ sba_map_sg(struct device *dev, struct scatterlist *sglist, int nents,
|
||||
** w/o this association, we wouldn't have coherent DMA!
|
||||
** Access to the virtual address is what forces a two pass algorithm.
|
||||
*/
|
||||
coalesced = iommu_coalesce_chunks(ioc, dev, sglist, nents, sba_alloc_range);
|
||||
iommu_coalesce_chunks(ioc, dev, sglist, nents, sba_alloc_range);
|
||||
|
||||
/*
|
||||
** Program the I/O Pdir
|
||||
@ -1022,6 +1027,7 @@ sba_map_sg(struct device *dev, struct scatterlist *sglist, int nents,
|
||||
* @sglist: array of buffer/length pairs
|
||||
* @nents: number of entries in list
|
||||
* @direction: R/W or both.
|
||||
* @attrs: attributes
|
||||
*
|
||||
* See Documentation/core-api/dma-api-howto.rst
|
||||
*/
|
||||
@ -1229,8 +1235,6 @@ struct ibase_data_struct {
|
||||
|
||||
static int setup_ibase_imask_callback(struct device *dev, void *data)
|
||||
{
|
||||
/* lba_set_iregs() is in drivers/parisc/lba_pci.c */
|
||||
extern void lba_set_iregs(struct parisc_device *, u32, u32);
|
||||
struct parisc_device *lba = to_parisc_device(dev);
|
||||
struct ibase_data_struct *ibd = data;
|
||||
int rope_num = (lba->hpa.start >> 13) & 0xf;
|
||||
@ -1992,7 +1996,7 @@ void __init sba_init(void)
|
||||
|
||||
/**
|
||||
* sba_get_iommu - Assign the iommu pointer for the pci bus controller.
|
||||
* @dev: The parisc device.
|
||||
* @pci_hba: The parisc device.
|
||||
*
|
||||
* Returns the appropriate IOMMU data for the given parisc PCI controller.
|
||||
* This is cached and used later for PCI DMA Mapping.
|
||||
@ -2012,7 +2016,7 @@ void * sba_get_iommu(struct parisc_device *pci_hba)
|
||||
|
||||
/**
|
||||
* sba_directed_lmmio - return first directed LMMIO range routed to rope
|
||||
* @pa_dev: The parisc device.
|
||||
* @pci_hba: The parisc device.
|
||||
* @r: resource PCI host controller wants start/end fields assigned.
|
||||
*
|
||||
* For the given parisc PCI controller, determine if any direct ranges
|
||||
@ -2054,7 +2058,7 @@ void sba_directed_lmmio(struct parisc_device *pci_hba, struct resource *r)
|
||||
|
||||
/**
|
||||
* sba_distributed_lmmio - return portion of distributed LMMIO range
|
||||
* @pa_dev: The parisc device.
|
||||
* @pci_hba: The parisc device.
|
||||
* @r: resource PCI host controller wants start/end fields assigned.
|
||||
*
|
||||
* For the given parisc PCI controller, return portion of distributed LMMIO
|
||||
|
@ -71,9 +71,9 @@
|
||||
|
||||
#include <video/sticore.h>
|
||||
|
||||
/* REGION_BASE(fb_info, index) returns the virtual address for region <index> */
|
||||
/* REGION_BASE(fb_info, index) returns the physical address for region <index> */
|
||||
#define REGION_BASE(fb_info, index) \
|
||||
F_EXTEND(fb_info->sti->glob_cfg->region_ptrs[index])
|
||||
F_EXTEND(fb_info->sti->regions_phys[index])
|
||||
|
||||
#define NGLEDEVDEPROM_CRT_REGION 1
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
* core code for console driver using HP's STI firmware
|
||||
*
|
||||
* Copyright (C) 2000 Philipp Rumpf <prumpf@tux.org>
|
||||
* Copyright (C) 2001-2020 Helge Deller <deller@gmx.de>
|
||||
* Copyright (C) 2001-2023 Helge Deller <deller@gmx.de>
|
||||
* Copyright (C) 2001-2002 Thomas Bogendoerfer <tsbogend@alpha.franken.de>
|
||||
*
|
||||
* TODO:
|
||||
@ -41,6 +41,26 @@ static struct sti_struct *default_sti __read_mostly;
|
||||
static int num_sti_roms __read_mostly;
|
||||
static struct sti_struct *sti_roms[MAX_STI_ROMS] __read_mostly;
|
||||
|
||||
static void *store_sti_val(struct sti_struct *sti, void *ptr, unsigned long val)
|
||||
{
|
||||
u32 *ptr32 = ptr;
|
||||
|
||||
if (IS_ENABLED(CONFIG_64BIT) && sti->do_call64) {
|
||||
/* used for 64-bit STI ROM */
|
||||
unsigned long *ptr64 = ptr;
|
||||
|
||||
ptr64 = PTR_ALIGN(ptr64, sizeof(void *));
|
||||
*ptr64++ = val;
|
||||
return ptr64;
|
||||
}
|
||||
|
||||
/* used for 32-bit STI ROM */
|
||||
*ptr32++ = val;
|
||||
return ptr32;
|
||||
}
|
||||
|
||||
#define store_sti_ptr(sti, dest, ptr) \
|
||||
store_sti_val(sti, dest, STI_PTR(ptr))
|
||||
|
||||
/* The colour indices used by STI are
|
||||
* 0 - Black
|
||||
@ -87,7 +107,7 @@ static int sti_init_graph(struct sti_struct *sti)
|
||||
memset(inptr, 0, sizeof(*inptr));
|
||||
inptr->text_planes = 3; /* # of text planes (max 3 for STI) */
|
||||
memset(inptr_ext, 0, sizeof(*inptr_ext));
|
||||
inptr->ext_ptr = STI_PTR(inptr_ext);
|
||||
store_sti_ptr(sti, &inptr->ext_ptr, inptr_ext);
|
||||
outptr->errno = 0;
|
||||
|
||||
ret = sti_call(sti, sti->init_graph, &default_init_flags, inptr,
|
||||
@ -118,7 +138,7 @@ static void sti_inq_conf(struct sti_struct *sti)
|
||||
unsigned long flags;
|
||||
s32 ret;
|
||||
|
||||
outptr->ext_ptr = STI_PTR(&sti->sti_data->inq_outptr_ext);
|
||||
store_sti_ptr(sti, &outptr->ext_ptr, &sti->sti_data->inq_outptr_ext);
|
||||
|
||||
do {
|
||||
spin_lock_irqsave(&sti->lock, flags);
|
||||
@ -138,9 +158,9 @@ void
|
||||
sti_putc(struct sti_struct *sti, int c, int y, int x,
|
||||
struct sti_cooked_font *font)
|
||||
{
|
||||
struct sti_font_inptr *inptr = &sti->sti_data->font_inptr;
|
||||
struct sti_font_inptr *inptr;
|
||||
struct sti_font_inptr inptr_default = {
|
||||
.font_start_addr = STI_PTR(font->raw),
|
||||
.font_start_addr = (void *)STI_PTR(font->raw),
|
||||
.index = c_index(sti, c),
|
||||
.fg_color = c_fg(sti, c),
|
||||
.bg_color = c_bg(sti, c),
|
||||
@ -153,7 +173,14 @@ sti_putc(struct sti_struct *sti, int c, int y, int x,
|
||||
|
||||
do {
|
||||
spin_lock_irqsave(&sti->lock, flags);
|
||||
*inptr = inptr_default;
|
||||
inptr = &inptr_default;
|
||||
if (IS_ENABLED(CONFIG_64BIT) && !sti->do_call64) {
|
||||
/* copy below 4G if calling 32-bit on LP64 kernel */
|
||||
inptr = &sti->sti_data->font_inptr;
|
||||
*inptr = inptr_default;
|
||||
/* skip first 4 bytes for 32-bit STI call */
|
||||
inptr = (void *)(((unsigned long)inptr) + sizeof(u32));
|
||||
}
|
||||
ret = sti_call(sti, sti->font_unpmv, &default_font_flags,
|
||||
inptr, outptr, sti->glob_cfg);
|
||||
spin_unlock_irqrestore(&sti->lock, flags);
|
||||
@ -170,7 +197,7 @@ void
|
||||
sti_set(struct sti_struct *sti, int src_y, int src_x,
|
||||
int height, int width, u8 color)
|
||||
{
|
||||
struct sti_blkmv_inptr *inptr = &sti->sti_data->blkmv_inptr;
|
||||
struct sti_blkmv_inptr *inptr;
|
||||
struct sti_blkmv_inptr inptr_default = {
|
||||
.fg_color = color,
|
||||
.bg_color = color,
|
||||
@ -187,7 +214,12 @@ sti_set(struct sti_struct *sti, int src_y, int src_x,
|
||||
|
||||
do {
|
||||
spin_lock_irqsave(&sti->lock, flags);
|
||||
*inptr = inptr_default;
|
||||
inptr = &inptr_default;
|
||||
if (IS_ENABLED(CONFIG_64BIT) && !sti->do_call64) {
|
||||
/* copy below 4G if calling 32-bit on LP64 kernel */
|
||||
inptr = &sti->sti_data->blkmv_inptr;
|
||||
*inptr = inptr_default;
|
||||
}
|
||||
ret = sti_call(sti, sti->block_move, &clear_blkmv_flags,
|
||||
inptr, outptr, sti->glob_cfg);
|
||||
spin_unlock_irqrestore(&sti->lock, flags);
|
||||
@ -198,7 +230,7 @@ void
|
||||
sti_clear(struct sti_struct *sti, int src_y, int src_x,
|
||||
int height, int width, int c, struct sti_cooked_font *font)
|
||||
{
|
||||
struct sti_blkmv_inptr *inptr = &sti->sti_data->blkmv_inptr;
|
||||
struct sti_blkmv_inptr *inptr;
|
||||
struct sti_blkmv_inptr inptr_default = {
|
||||
.fg_color = c_fg(sti, c),
|
||||
.bg_color = c_bg(sti, c),
|
||||
@ -215,7 +247,12 @@ sti_clear(struct sti_struct *sti, int src_y, int src_x,
|
||||
|
||||
do {
|
||||
spin_lock_irqsave(&sti->lock, flags);
|
||||
*inptr = inptr_default;
|
||||
inptr = &inptr_default;
|
||||
if (IS_ENABLED(CONFIG_64BIT) && !sti->do_call64) {
|
||||
/* copy below 4G if calling 32-bit on LP64 kernel */
|
||||
inptr = &sti->sti_data->blkmv_inptr;
|
||||
*inptr = inptr_default;
|
||||
}
|
||||
ret = sti_call(sti, sti->block_move, &clear_blkmv_flags,
|
||||
inptr, outptr, sti->glob_cfg);
|
||||
spin_unlock_irqrestore(&sti->lock, flags);
|
||||
@ -231,7 +268,7 @@ sti_bmove(struct sti_struct *sti, int src_y, int src_x,
|
||||
int dst_y, int dst_x, int height, int width,
|
||||
struct sti_cooked_font *font)
|
||||
{
|
||||
struct sti_blkmv_inptr *inptr = &sti->sti_data->blkmv_inptr;
|
||||
struct sti_blkmv_inptr *inptr;
|
||||
struct sti_blkmv_inptr inptr_default = {
|
||||
.src_x = src_x * font->width,
|
||||
.src_y = src_y * font->height,
|
||||
@ -246,7 +283,12 @@ sti_bmove(struct sti_struct *sti, int src_y, int src_x,
|
||||
|
||||
do {
|
||||
spin_lock_irqsave(&sti->lock, flags);
|
||||
*inptr = inptr_default;
|
||||
inptr = &inptr_default;
|
||||
if (IS_ENABLED(CONFIG_64BIT) && !sti->do_call64) {
|
||||
/* copy below 4G if calling 32-bit on LP64 kernel */
|
||||
inptr = &sti->sti_data->blkmv_inptr;
|
||||
*inptr = inptr_default;
|
||||
}
|
||||
ret = sti_call(sti, sti->block_move, &default_blkmv_flags,
|
||||
inptr, outptr, sti->glob_cfg);
|
||||
spin_unlock_irqrestore(&sti->lock, flags);
|
||||
@ -359,42 +401,31 @@ __setup("sti_font=", sti_font_setup);
|
||||
|
||||
|
||||
|
||||
static void sti_dump_globcfg(struct sti_glob_cfg *glob_cfg,
|
||||
unsigned int sti_mem_request)
|
||||
static void sti_dump_globcfg(struct sti_struct *sti)
|
||||
{
|
||||
struct sti_glob_cfg_ext *cfg;
|
||||
struct sti_glob_cfg *glob_cfg = sti->glob_cfg;
|
||||
struct sti_glob_cfg_ext *cfg = &sti->sti_data->glob_cfg_ext;
|
||||
|
||||
pr_debug("%d text planes\n"
|
||||
"%4d x %4d screen resolution\n"
|
||||
"%4d x %4d offscreen\n"
|
||||
"%4d x %4d layout\n"
|
||||
"regions at %08x %08x %08x %08x\n"
|
||||
"regions at %08x %08x %08x %08x\n"
|
||||
"reent_lvl %d\n"
|
||||
"save_addr %08x\n",
|
||||
"%4d x %4d layout\n",
|
||||
glob_cfg->text_planes,
|
||||
glob_cfg->onscreen_x, glob_cfg->onscreen_y,
|
||||
glob_cfg->offscreen_x, glob_cfg->offscreen_y,
|
||||
glob_cfg->total_x, glob_cfg->total_y,
|
||||
glob_cfg->region_ptrs[0], glob_cfg->region_ptrs[1],
|
||||
glob_cfg->region_ptrs[2], glob_cfg->region_ptrs[3],
|
||||
glob_cfg->region_ptrs[4], glob_cfg->region_ptrs[5],
|
||||
glob_cfg->region_ptrs[6], glob_cfg->region_ptrs[7],
|
||||
glob_cfg->reent_lvl,
|
||||
glob_cfg->save_addr);
|
||||
glob_cfg->total_x, glob_cfg->total_y);
|
||||
|
||||
/* dump extended cfg */
|
||||
cfg = PTR_STI((unsigned long)glob_cfg->ext_ptr);
|
||||
pr_debug("monitor %d\n"
|
||||
"in friendly mode: %d\n"
|
||||
"power consumption %d watts\n"
|
||||
"freq ref %d\n"
|
||||
"sti_mem_addr %08x (size=%d bytes)\n",
|
||||
"sti_mem_addr %px (size=%d bytes)\n",
|
||||
cfg->curr_mon,
|
||||
cfg->friendly_boot,
|
||||
cfg->power,
|
||||
cfg->freq_ref,
|
||||
cfg->sti_mem_addr, sti_mem_request);
|
||||
cfg->sti_mem_addr, sti->sti_mem_request);
|
||||
}
|
||||
|
||||
static void sti_dump_outptr(struct sti_struct *sti)
|
||||
@ -414,7 +445,7 @@ static int sti_init_glob_cfg(struct sti_struct *sti, unsigned long rom_address,
|
||||
{
|
||||
struct sti_glob_cfg *glob_cfg;
|
||||
struct sti_glob_cfg_ext *glob_cfg_ext;
|
||||
void *save_addr;
|
||||
void *save_addr, *ptr;
|
||||
void *sti_mem_addr;
|
||||
int i, size;
|
||||
|
||||
@ -432,9 +463,7 @@ static int sti_init_glob_cfg(struct sti_struct *sti, unsigned long rom_address,
|
||||
save_addr = &sti->sti_data->save_addr;
|
||||
sti_mem_addr = &sti->sti_data->sti_mem_addr;
|
||||
|
||||
glob_cfg->ext_ptr = STI_PTR(glob_cfg_ext);
|
||||
glob_cfg->save_addr = STI_PTR(save_addr);
|
||||
for (i=0; i<8; i++) {
|
||||
for (i = 0; i < STI_REGION_MAX; i++) {
|
||||
unsigned long newhpa, len;
|
||||
|
||||
if (sti->pd) {
|
||||
@ -457,13 +486,10 @@ static int sti_init_glob_cfg(struct sti_struct *sti, unsigned long rom_address,
|
||||
REGION_OFFSET_TO_PHYS(sti->regions[i], newhpa);
|
||||
|
||||
len = sti->regions[i].region_desc.length * 4096;
|
||||
if (len)
|
||||
glob_cfg->region_ptrs[i] = sti->regions_phys[i];
|
||||
|
||||
pr_debug("region #%d: phys %08lx, region_ptr %08x, len=%lukB, "
|
||||
pr_debug("region #%d: phys %08lx, len=%lukB, "
|
||||
"btlb=%d, sysonly=%d, cache=%d, last=%d\n",
|
||||
i, sti->regions_phys[i], glob_cfg->region_ptrs[i],
|
||||
len/1024,
|
||||
i, sti->regions_phys[i], len / 1024,
|
||||
sti->regions[i].region_desc.btlb,
|
||||
sti->regions[i].region_desc.sys_only,
|
||||
sti->regions[i].region_desc.cache,
|
||||
@ -474,11 +500,16 @@ static int sti_init_glob_cfg(struct sti_struct *sti, unsigned long rom_address,
|
||||
break;
|
||||
}
|
||||
|
||||
if (++i<8 && sti->regions[i].region)
|
||||
pr_warn("future ptr (0x%8x) not yet supported !\n",
|
||||
sti->regions[i].region);
|
||||
ptr = &glob_cfg->region_ptrs;
|
||||
for (i = 0; i < STI_REGION_MAX; i++)
|
||||
ptr = store_sti_val(sti, ptr, sti->regions_phys[i]);
|
||||
|
||||
glob_cfg_ext->sti_mem_addr = STI_PTR(sti_mem_addr);
|
||||
*(s32 *)ptr = 0; /* set reent_lvl */
|
||||
ptr += sizeof(s32);
|
||||
ptr = store_sti_ptr(sti, ptr, save_addr);
|
||||
ptr = store_sti_ptr(sti, ptr, glob_cfg_ext);
|
||||
|
||||
store_sti_ptr(sti, &glob_cfg_ext->sti_mem_addr, sti_mem_addr);
|
||||
|
||||
sti->glob_cfg = glob_cfg;
|
||||
|
||||
@ -802,10 +833,19 @@ static int sti_read_rom(int wordmode, struct sti_struct *sti,
|
||||
raw->alt_code_type == ALT_CODE_TYPE_PA_RISC_64
|
||||
? "and 64 " : "");
|
||||
|
||||
sti->font_unpmv = address + (raw->font_unpmv & 0x03ffffff);
|
||||
sti->block_move = address + (raw->block_move & 0x03ffffff);
|
||||
sti->init_graph = address + (raw->init_graph & 0x03ffffff);
|
||||
sti->inq_conf = address + (raw->inq_conf & 0x03ffffff);
|
||||
if (IS_ENABLED(CONFIG_64BIT) &&
|
||||
raw->alt_code_type == ALT_CODE_TYPE_PA_RISC_64) {
|
||||
sti->do_call64 = 1;
|
||||
sti->font_unpmv = address + (raw->font_unp_addr & 0x03ffffff);
|
||||
sti->block_move = address + (raw->block_move_addr & 0x03ffffff);
|
||||
sti->init_graph = address + (raw->init_graph_addr & 0x03ffffff);
|
||||
sti->inq_conf = address + (raw->inq_conf_addr & 0x03ffffff);
|
||||
} else {
|
||||
sti->font_unpmv = address + (raw->font_unpmv & 0x03ffffff);
|
||||
sti->block_move = address + (raw->block_move & 0x03ffffff);
|
||||
sti->init_graph = address + (raw->init_graph & 0x03ffffff);
|
||||
sti->inq_conf = address + (raw->inq_conf & 0x03ffffff);
|
||||
}
|
||||
|
||||
sti->rom = cooked;
|
||||
sti->rom->raw = raw;
|
||||
@ -818,7 +858,13 @@ static int sti_read_rom(int wordmode, struct sti_struct *sti,
|
||||
sti_font_convert_bytemode(sti, sti->font);
|
||||
sti_dump_font(sti->font);
|
||||
|
||||
pr_info(" using %d-bit STI ROM functions\n",
|
||||
(IS_ENABLED(CONFIG_64BIT) && sti->do_call64) ? 64 : 32);
|
||||
|
||||
sti->sti_mem_request = raw->sti_mem_req;
|
||||
pr_debug(" mem_request = %d, reentsize %d\n",
|
||||
sti->sti_mem_request, raw->reentsize);
|
||||
|
||||
sti->graphics_id[0] = raw->graphics_id[0];
|
||||
sti->graphics_id[1] = raw->graphics_id[1];
|
||||
|
||||
@ -876,10 +922,12 @@ static struct sti_struct *sti_try_rom_generic(unsigned long address,
|
||||
spin_lock_init(&sti->lock);
|
||||
|
||||
test_rom:
|
||||
/* if we can't read the ROM, bail out early. Not being able
|
||||
* to read the hpa is okay, for romless sti */
|
||||
if (pdc_add_valid(address))
|
||||
/* pdc_add_valid() works only on 32-bit kernels */
|
||||
if ((!IS_ENABLED(CONFIG_64BIT) ||
|
||||
(boot_cpu_data.pdc.capabilities & PDC_MODEL_OS32)) &&
|
||||
pdc_add_valid(address)) {
|
||||
goto out_err;
|
||||
}
|
||||
|
||||
sig = gsc_readl(address);
|
||||
|
||||
@ -949,7 +997,7 @@ test_rom:
|
||||
goto out_err;
|
||||
|
||||
sti_inq_conf(sti);
|
||||
sti_dump_globcfg(sti->glob_cfg, sti->sti_mem_request);
|
||||
sti_dump_globcfg(sti);
|
||||
sti_dump_outptr(sti);
|
||||
|
||||
pr_info(" graphics card name: %s\n",
|
||||
@ -1135,14 +1183,15 @@ int sti_call(const struct sti_struct *sti, unsigned long func,
|
||||
unsigned long _glob_cfg = STI_PTR(glob_cfg);
|
||||
int ret;
|
||||
|
||||
#ifdef CONFIG_64BIT
|
||||
/* Check for overflow when using 32bit STI on 64bit kernel. */
|
||||
if (WARN_ONCE(_flags>>32 || _inptr>>32 || _outptr>>32 || _glob_cfg>>32,
|
||||
if (WARN_ONCE(IS_ENABLED(CONFIG_64BIT) && !sti->do_call64 &&
|
||||
(upper_32_bits(_flags) || upper_32_bits(_inptr) ||
|
||||
upper_32_bits(_outptr) || upper_32_bits(_glob_cfg)),
|
||||
"Out of 32bit-range pointers!"))
|
||||
return -1;
|
||||
#endif
|
||||
|
||||
ret = pdc_sti_call(func, _flags, _inptr, _outptr, _glob_cfg);
|
||||
ret = pdc_sti_call(func, _flags, _inptr, _outptr, _glob_cfg,
|
||||
sti->do_call64);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@ -39,7 +39,6 @@ struct fb_info;
|
||||
#define STI_WAIT 1
|
||||
|
||||
#define STI_PTR(p) ( virt_to_phys(p) )
|
||||
#define PTR_STI(p) ( phys_to_virt((unsigned long)p) )
|
||||
|
||||
#define sti_onscreen_x(sti) (sti->glob_cfg->onscreen_x)
|
||||
#define sti_onscreen_y(sti) (sti->glob_cfg->onscreen_y)
|
||||
@ -78,8 +77,8 @@ struct sti_glob_cfg_ext {
|
||||
u8 friendly_boot; /* in friendly boot mode */
|
||||
s16 power; /* power calculation (in Watts) */
|
||||
s32 freq_ref; /* frequency reference */
|
||||
u32 sti_mem_addr; /* pointer to global sti memory (size=sti_mem_request) */
|
||||
u32 future_ptr; /* pointer to future data */
|
||||
u32 *sti_mem_addr; /* pointer to global sti memory (size=sti_mem_request) */
|
||||
u32 *future_ptr; /* pointer to future data */
|
||||
};
|
||||
|
||||
struct sti_glob_cfg {
|
||||
@ -90,10 +89,10 @@ struct sti_glob_cfg {
|
||||
s16 offscreen_y; /* offset height in pixels */
|
||||
s16 total_x; /* frame buffer width in pixels */
|
||||
s16 total_y; /* frame buffer height in pixels */
|
||||
u32 region_ptrs[STI_REGION_MAX]; /* region pointers */
|
||||
u32 *region_ptrs[STI_REGION_MAX]; /* region pointers */
|
||||
s32 reent_lvl; /* storage for reentry level value */
|
||||
u32 save_addr; /* where to save or restore reentrant state */
|
||||
u32 ext_ptr; /* pointer to extended glob_cfg data structure */
|
||||
u32 *save_addr; /* where to save or restore reentrant state */
|
||||
u32 *ext_ptr; /* pointer to extended glob_cfg data structure */
|
||||
};
|
||||
|
||||
|
||||
@ -119,26 +118,26 @@ struct sti_init_flags {
|
||||
u32 caller_kernel : 1; /* set only by kernel for each call */
|
||||
u32 caller_other : 1; /* set only by non-[BR/K] caller */
|
||||
u32 pad : 14; /* pad to word boundary */
|
||||
u32 future_ptr; /* pointer to future data */
|
||||
u32 *future_ptr; /* pointer to future data */
|
||||
};
|
||||
|
||||
struct sti_init_inptr_ext {
|
||||
u8 config_mon_type; /* configure to monitor type */
|
||||
u8 pad[1]; /* pad to word boundary */
|
||||
u16 inflight_data; /* inflight data possible on PCI */
|
||||
u32 future_ptr; /* pointer to future data */
|
||||
u32 *future_ptr; /* pointer to future data */
|
||||
};
|
||||
|
||||
struct sti_init_inptr {
|
||||
s32 text_planes; /* number of planes to use for text */
|
||||
u32 ext_ptr; /* pointer to extended init_graph inptr data structure*/
|
||||
u32 *ext_ptr; /* pointer to extended init_graph inptr data structure*/
|
||||
};
|
||||
|
||||
|
||||
struct sti_init_outptr {
|
||||
s32 errno; /* error number on failure */
|
||||
s32 text_planes; /* number of planes used for text */
|
||||
u32 future_ptr; /* pointer to future data */
|
||||
u32 *future_ptr; /* pointer to future data */
|
||||
};
|
||||
|
||||
|
||||
@ -148,17 +147,17 @@ struct sti_init_outptr {
|
||||
struct sti_conf_flags {
|
||||
u32 wait : 1; /* should routine idle wait or not */
|
||||
u32 pad : 31; /* pad to word boundary */
|
||||
u32 future_ptr; /* pointer to future data */
|
||||
u32 *future_ptr; /* pointer to future data */
|
||||
};
|
||||
|
||||
struct sti_conf_inptr {
|
||||
u32 future_ptr; /* pointer to future data */
|
||||
u32 *future_ptr; /* pointer to future data */
|
||||
};
|
||||
|
||||
struct sti_conf_outptr_ext {
|
||||
u32 crt_config[3]; /* hardware specific X11/OGL information */
|
||||
u32 crt_hdw[3];
|
||||
u32 future_ptr;
|
||||
u32 *future_ptr;
|
||||
};
|
||||
|
||||
struct sti_conf_outptr {
|
||||
@ -174,7 +173,7 @@ struct sti_conf_outptr {
|
||||
s32 planes; /* number of fb planes in system */
|
||||
u8 dev_name[STI_DEV_NAME_LENGTH]; /* null terminated product name */
|
||||
u32 attributes; /* flags denoting attributes */
|
||||
u32 ext_ptr; /* pointer to future data */
|
||||
u32 *ext_ptr; /* pointer to future data */
|
||||
};
|
||||
|
||||
struct sti_rom {
|
||||
@ -258,25 +257,25 @@ struct sti_cooked_rom {
|
||||
/* STI font printing function structs */
|
||||
|
||||
struct sti_font_inptr {
|
||||
u32 font_start_addr; /* address of font start */
|
||||
u32 *font_start_addr; /* address of font start */
|
||||
s16 index; /* index into font table of character */
|
||||
u8 fg_color; /* foreground color of character */
|
||||
u8 bg_color; /* background color of character */
|
||||
s16 dest_x; /* X location of character upper left */
|
||||
s16 dest_y; /* Y location of character upper left */
|
||||
u32 future_ptr; /* pointer to future data */
|
||||
u32 *future_ptr; /* pointer to future data */
|
||||
};
|
||||
|
||||
struct sti_font_flags {
|
||||
u32 wait : 1; /* should routine idle wait or not */
|
||||
u32 non_text : 1; /* font unpack/move in non_text planes =1, text =0 */
|
||||
u32 pad : 30; /* pad to word boundary */
|
||||
u32 future_ptr; /* pointer to future data */
|
||||
u32 *future_ptr; /* pointer to future data */
|
||||
};
|
||||
|
||||
struct sti_font_outptr {
|
||||
s32 errno; /* error number on failure */
|
||||
u32 future_ptr; /* pointer to future data */
|
||||
u32 *future_ptr; /* pointer to future data */
|
||||
};
|
||||
|
||||
/* STI blockmove structs */
|
||||
@ -287,7 +286,7 @@ struct sti_blkmv_flags {
|
||||
u32 clear : 1; /* clear during move? */
|
||||
u32 non_text : 1; /* block move in non_text planes =1, text =0 */
|
||||
u32 pad : 28; /* pad to word boundary */
|
||||
u32 future_ptr; /* pointer to future data */
|
||||
u32 *future_ptr; /* pointer to future data */
|
||||
};
|
||||
|
||||
struct sti_blkmv_inptr {
|
||||
@ -299,12 +298,12 @@ struct sti_blkmv_inptr {
|
||||
s16 dest_y; /* dest upper left pixel y location */
|
||||
s16 width; /* block width in pixels */
|
||||
s16 height; /* block height in pixels */
|
||||
u32 future_ptr; /* pointer to future data */
|
||||
u32 *future_ptr; /* pointer to future data */
|
||||
};
|
||||
|
||||
struct sti_blkmv_outptr {
|
||||
s32 errno; /* error number on failure */
|
||||
u32 future_ptr; /* pointer to future data */
|
||||
u32 *future_ptr; /* pointer to future data */
|
||||
};
|
||||
|
||||
|
||||
@ -351,6 +350,7 @@ struct sti_struct {
|
||||
unsigned long block_move;
|
||||
unsigned long init_graph;
|
||||
unsigned long inq_conf;
|
||||
int do_call64; /* call 64-bit code */
|
||||
|
||||
/* all following fields are initialized by the generic routines */
|
||||
int text_planes;
|
||||
|
Loading…
Reference in New Issue
Block a user