mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-03 00:54:09 +08:00
parisc architecture fixes for kernel v6.5-rc6:
- Fix LWS code to use same lock words as for the parisc lightweight spinlocks - Use PTR_ERR_OR_ZERO() in pdt init code - Fix lots of sparse warnings -----BEGIN PGP SIGNATURE----- iHUEABYKAB0WIQS86RI+GtKfB8BJu973ErUQojoPXwUCZNZG5AAKCRD3ErUQojoP X4tuAP90TJxRks6fRoqZfiNQEd5gXXWnSY5fhbwsMvEONQChcgEAhUVEJB+oYfH1 XZC0Sy1+hJtYuPHUMmJi8aKlKfbkSAw= =LvUn -----END PGP SIGNATURE----- Merge tag 'parisc-for-6.5-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/deller/parisc-linux Pull parisc architecture fixes from Helge Deller: "A bugfix in the LWS code, which used different lock words than the parisc lightweight spinlock checks. This inconsistency triggered false positives when the lightweight spinlock checks checked the locks of mutexes. The other patches are trivial cleanups and most of them fix sparse warnings. Summary: - Fix LWS code to use same lock words as for the parisc lightweight spinlocks - Use PTR_ERR_OR_ZERO() in pdt init code - Fix lots of sparse warnings" * tag 'parisc-for-6.5-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/deller/parisc-linux: parisc: perf: Make cpu_device variable static parisc: ftrace: Add declaration for ftrace_function_trampoline() parisc: boot: Nuke some sparse warnings in decompressor parisc: processor: Include asm/smp.h for init_per_cpu() parisc: unaligned: Include linux/sysctl.h for unaligned_enabled parisc: Move proc_mckinley_root and proc_runway_root to sba_iommu parisc: dma: Add prototype for pcxl_dma_start parisc: parisc_ksyms: Include libgcc.h for libgcc prototypes parisc: ucmpdi2: Fix no previous prototype for '__ucmpdi2' warning parisc: firmware: Mark pdc_result buffers local parisc: firmware: Fix sparse context imbalance warnings parisc: signal: Fix sparse incorrect type in assignment warning parisc: ioremap: Fix sparse warnings parisc: fault: Use C99 arrary initializers parisc: pdt: Use PTR_ERR_OR_ZERO() to simplify code parisc: Fix lightweight spinlock checks to not break futexes
This commit is contained in:
commit
feb0eee9aa
@ -2,7 +2,7 @@
|
||||
#
|
||||
config LIGHTWEIGHT_SPINLOCK_CHECK
|
||||
bool "Enable lightweight spinlock checks"
|
||||
depends on SMP && !DEBUG_SPINLOCK
|
||||
depends on DEBUG_KERNEL && SMP && !DEBUG_SPINLOCK
|
||||
default y
|
||||
help
|
||||
Add checks with low performance impact to the spinlock functions
|
||||
|
@ -117,7 +117,7 @@ char *strchr(const char *s, int c)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int puts(const char *s)
|
||||
static int puts(const char *s)
|
||||
{
|
||||
const char *nuline = s;
|
||||
|
||||
@ -172,7 +172,7 @@ static int print_num(unsigned long num, int base)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int printf(const char *fmt, ...)
|
||||
static int printf(const char *fmt, ...)
|
||||
{
|
||||
va_list args;
|
||||
int i = 0;
|
||||
@ -204,13 +204,13 @@ void abort(void)
|
||||
}
|
||||
|
||||
#undef malloc
|
||||
void *malloc(size_t size)
|
||||
static void *malloc(size_t size)
|
||||
{
|
||||
return malloc_gzip(size);
|
||||
}
|
||||
|
||||
#undef free
|
||||
void free(void *ptr)
|
||||
static void free(void *ptr)
|
||||
{
|
||||
return free_gzip(ptr);
|
||||
}
|
||||
@ -278,7 +278,7 @@ static void parse_elf(void *output)
|
||||
free(phdrs);
|
||||
}
|
||||
|
||||
unsigned long decompress_kernel(unsigned int started_wide,
|
||||
asmlinkage unsigned long __visible decompress_kernel(unsigned int started_wide,
|
||||
unsigned int command_line,
|
||||
const unsigned int rd_start,
|
||||
const unsigned int rd_end)
|
||||
|
@ -14,6 +14,8 @@
|
||||
#define dma_outb outb
|
||||
#define dma_inb inb
|
||||
|
||||
extern unsigned long pcxl_dma_start;
|
||||
|
||||
/*
|
||||
** DMA_CHUNK_SIZE is used by the SCSI mid-layer to break up
|
||||
** (or rather not merge) DMAs into manageable chunks.
|
||||
|
@ -12,6 +12,10 @@ extern void mcount(void);
|
||||
extern unsigned long sys_call_table[];
|
||||
|
||||
extern unsigned long return_address(unsigned int);
|
||||
struct ftrace_regs;
|
||||
extern void ftrace_function_trampoline(unsigned long parent,
|
||||
unsigned long self_addr, unsigned long org_sp_gr3,
|
||||
struct ftrace_regs *fregs);
|
||||
|
||||
#ifdef CONFIG_DYNAMIC_FTRACE
|
||||
extern void ftrace_caller(void);
|
||||
|
@ -7,8 +7,6 @@
|
||||
#include <asm/processor.h>
|
||||
#include <asm/spinlock_types.h>
|
||||
|
||||
#define SPINLOCK_BREAK_INSN 0x0000c006 /* break 6,6 */
|
||||
|
||||
static inline void arch_spin_val_check(int lock_val)
|
||||
{
|
||||
if (IS_ENABLED(CONFIG_LIGHTWEIGHT_SPINLOCK_CHECK))
|
||||
|
@ -4,6 +4,10 @@
|
||||
|
||||
#define __ARCH_SPIN_LOCK_UNLOCKED_VAL 0x1a46
|
||||
|
||||
#define SPINLOCK_BREAK_INSN 0x0000c006 /* break 6,6 */
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
typedef struct {
|
||||
#ifdef CONFIG_PA20
|
||||
volatile unsigned int slock;
|
||||
@ -27,6 +31,8 @@ typedef struct {
|
||||
volatile unsigned int counter;
|
||||
} arch_rwlock_t;
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
#define __ARCH_RW_LOCK_UNLOCKED__ 0x01000000
|
||||
#define __ARCH_RW_LOCK_UNLOCKED { .lock_mutex = __ARCH_SPIN_LOCK_UNLOCKED, \
|
||||
.counter = __ARCH_RW_LOCK_UNLOCKED__ }
|
||||
|
@ -74,8 +74,8 @@
|
||||
static DEFINE_SPINLOCK(pdc_lock);
|
||||
#endif
|
||||
|
||||
unsigned long pdc_result[NUM_PDC_RESULT] __aligned(8);
|
||||
unsigned long pdc_result2[NUM_PDC_RESULT] __aligned(8);
|
||||
static unsigned long pdc_result[NUM_PDC_RESULT] __aligned(8);
|
||||
static unsigned long pdc_result2[NUM_PDC_RESULT] __aligned(8);
|
||||
|
||||
#ifdef CONFIG_64BIT
|
||||
#define WIDE_FIRMWARE 0x1
|
||||
@ -334,7 +334,7 @@ int __pdc_cpu_rendezvous(void)
|
||||
/**
|
||||
* pdc_cpu_rendezvous_lock - Lock PDC while transitioning to rendezvous state
|
||||
*/
|
||||
void pdc_cpu_rendezvous_lock(void)
|
||||
void pdc_cpu_rendezvous_lock(void) __acquires(&pdc_lock)
|
||||
{
|
||||
spin_lock(&pdc_lock);
|
||||
}
|
||||
@ -342,7 +342,7 @@ void pdc_cpu_rendezvous_lock(void)
|
||||
/**
|
||||
* pdc_cpu_rendezvous_unlock - Unlock PDC after reaching rendezvous state
|
||||
*/
|
||||
void pdc_cpu_rendezvous_unlock(void)
|
||||
void pdc_cpu_rendezvous_unlock(void) __releases(&pdc_lock)
|
||||
{
|
||||
spin_unlock(&pdc_lock);
|
||||
}
|
||||
|
@ -53,7 +53,7 @@ static void __hot prepare_ftrace_return(unsigned long *parent,
|
||||
|
||||
static ftrace_func_t ftrace_func;
|
||||
|
||||
void notrace __hot ftrace_function_trampoline(unsigned long parent,
|
||||
asmlinkage void notrace __hot ftrace_function_trampoline(unsigned long parent,
|
||||
unsigned long self_addr,
|
||||
unsigned long org_sp_gr3,
|
||||
struct ftrace_regs *fregs)
|
||||
|
@ -14,6 +14,7 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/syscalls.h>
|
||||
#include <linux/libgcc.h>
|
||||
|
||||
#include <linux/string.h>
|
||||
EXPORT_SYMBOL(memset);
|
||||
@ -92,12 +93,6 @@ EXPORT_SYMBOL($$divI_12);
|
||||
EXPORT_SYMBOL($$divI_14);
|
||||
EXPORT_SYMBOL($$divI_15);
|
||||
|
||||
extern void __ashrdi3(void);
|
||||
extern void __ashldi3(void);
|
||||
extern void __lshrdi3(void);
|
||||
extern void __muldi3(void);
|
||||
extern void __ucmpdi2(void);
|
||||
|
||||
EXPORT_SYMBOL(__ashrdi3);
|
||||
EXPORT_SYMBOL(__ashldi3);
|
||||
EXPORT_SYMBOL(__lshrdi3);
|
||||
|
@ -39,7 +39,7 @@ static struct proc_dir_entry * proc_gsc_root __read_mostly = NULL;
|
||||
static unsigned long pcxl_used_bytes __read_mostly;
|
||||
static unsigned long pcxl_used_pages __read_mostly;
|
||||
|
||||
extern unsigned long pcxl_dma_start; /* Start of pcxl dma mapping area */
|
||||
unsigned long pcxl_dma_start __ro_after_init; /* pcxl dma mapping area start */
|
||||
static DEFINE_SPINLOCK(pcxl_res_lock);
|
||||
static char *pcxl_res_map;
|
||||
static int pcxl_res_hint;
|
||||
@ -381,7 +381,7 @@ pcxl_dma_init(void)
|
||||
pcxl_res_map = (char *)__get_free_pages(GFP_KERNEL,
|
||||
get_order(pcxl_res_size));
|
||||
memset(pcxl_res_map, 0, pcxl_res_size);
|
||||
proc_gsc_root = proc_mkdir("gsc", NULL);
|
||||
proc_gsc_root = proc_mkdir("bus/gsc", NULL);
|
||||
if (!proc_gsc_root)
|
||||
printk(KERN_WARNING
|
||||
"pcxl_dma_init: Unable to create gsc /proc dir entry\n");
|
||||
|
@ -354,10 +354,8 @@ static int __init pdt_initcall(void)
|
||||
return -ENODEV;
|
||||
|
||||
kpdtd_task = kthread_run(pdt_mainloop, NULL, "kpdtd");
|
||||
if (IS_ERR(kpdtd_task))
|
||||
return PTR_ERR(kpdtd_task);
|
||||
|
||||
return 0;
|
||||
return PTR_ERR_OR_ZERO(kpdtd_task);
|
||||
}
|
||||
|
||||
late_initcall(pdt_initcall);
|
||||
|
@ -57,7 +57,7 @@ struct rdr_tbl_ent {
|
||||
static int perf_processor_interface __read_mostly = UNKNOWN_INTF;
|
||||
static int perf_enabled __read_mostly;
|
||||
static DEFINE_SPINLOCK(perf_lock);
|
||||
struct parisc_device *cpu_device __read_mostly;
|
||||
static struct parisc_device *cpu_device __read_mostly;
|
||||
|
||||
/* RDRs to write for PCX-W */
|
||||
static const int perf_rdrs_W[] =
|
||||
|
@ -26,6 +26,7 @@
|
||||
#include <asm/processor.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/pdc.h>
|
||||
#include <asm/smp.h>
|
||||
#include <asm/pdcpat.h>
|
||||
#include <asm/irq.h> /* for struct irq_region */
|
||||
#include <asm/parisc-device.h>
|
||||
|
@ -40,11 +40,6 @@
|
||||
|
||||
static char __initdata command_line[COMMAND_LINE_SIZE];
|
||||
|
||||
/* Intended for ccio/sba/cpu statistics under /proc/bus/{runway|gsc} */
|
||||
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;
|
||||
|
||||
static void __init setup_cmdline(char **cmdline_p)
|
||||
{
|
||||
extern unsigned int boot_args[];
|
||||
@ -196,48 +191,6 @@ const struct seq_operations cpuinfo_op = {
|
||||
.show = show_cpuinfo
|
||||
};
|
||||
|
||||
static void __init parisc_proc_mkdir(void)
|
||||
{
|
||||
/*
|
||||
** Can't call proc_mkdir() until after proc_root_init() has been
|
||||
** called by start_kernel(). In other words, this code can't
|
||||
** live in arch/.../setup.c because start_parisc() calls
|
||||
** start_kernel().
|
||||
*/
|
||||
switch (boot_cpu_data.cpu_type) {
|
||||
case pcxl:
|
||||
case pcxl2:
|
||||
if (NULL == proc_gsc_root)
|
||||
{
|
||||
proc_gsc_root = proc_mkdir("bus/gsc", NULL);
|
||||
}
|
||||
break;
|
||||
case pcxt_:
|
||||
case pcxu:
|
||||
case pcxu_:
|
||||
case pcxw:
|
||||
case pcxw_:
|
||||
case pcxw2:
|
||||
if (NULL == proc_runway_root)
|
||||
{
|
||||
proc_runway_root = proc_mkdir("bus/runway", NULL);
|
||||
}
|
||||
break;
|
||||
case mako:
|
||||
case mako2:
|
||||
if (NULL == proc_mckinley_root)
|
||||
{
|
||||
proc_mckinley_root = proc_mkdir("bus/mckinley", NULL);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
/* FIXME: this was added to prevent the compiler
|
||||
* complaining about missing pcx, pcxs and pcxt
|
||||
* I'm assuming they have neither gsc nor runway */
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static struct resource central_bus = {
|
||||
.name = "Central Bus",
|
||||
.start = F_EXTEND(0xfff80000),
|
||||
@ -294,7 +247,6 @@ static int __init parisc_init(void)
|
||||
{
|
||||
u32 osid = (OS_ID_LINUX << 16);
|
||||
|
||||
parisc_proc_mkdir();
|
||||
parisc_init_resources();
|
||||
do_device_inventory(); /* probe for hardware */
|
||||
|
||||
|
@ -423,7 +423,7 @@ static void check_syscallno_in_delay_branch(struct pt_regs *regs)
|
||||
regs->gr[31] -= 8; /* delayed branching */
|
||||
|
||||
/* Get assembler opcode of code in delay branch */
|
||||
uaddr = (unsigned int *) ((regs->gr[31] & ~3) + 4);
|
||||
uaddr = (u32 __user *) ((regs->gr[31] & ~3) + 4);
|
||||
err = get_user(opcode, uaddr);
|
||||
if (err)
|
||||
return;
|
||||
|
@ -39,6 +39,7 @@ registers).
|
||||
#include <asm/assembly.h>
|
||||
#include <asm/processor.h>
|
||||
#include <asm/cache.h>
|
||||
#include <asm/spinlock_types.h>
|
||||
|
||||
#include <linux/linkage.h>
|
||||
|
||||
@ -66,6 +67,16 @@ registers).
|
||||
stw \reg1, 0(%sr2,\reg2)
|
||||
.endm
|
||||
|
||||
/* raise exception if spinlock content is not zero or
|
||||
* __ARCH_SPIN_LOCK_UNLOCKED_VAL */
|
||||
.macro spinlock_check spin_val,tmpreg
|
||||
#ifdef CONFIG_LIGHTWEIGHT_SPINLOCK_CHECK
|
||||
ldi __ARCH_SPIN_LOCK_UNLOCKED_VAL, \tmpreg
|
||||
andcm,= \spin_val, \tmpreg, %r0
|
||||
.word SPINLOCK_BREAK_INSN
|
||||
#endif
|
||||
.endm
|
||||
|
||||
.text
|
||||
|
||||
.import syscall_exit,code
|
||||
@ -508,7 +519,8 @@ lws_start:
|
||||
|
||||
lws_exit_noerror:
|
||||
lws_pagefault_enable %r1,%r21
|
||||
stw,ma %r20, 0(%sr2,%r20)
|
||||
ldi __ARCH_SPIN_LOCK_UNLOCKED_VAL, %r21
|
||||
stw,ma %r21, 0(%sr2,%r20)
|
||||
ssm PSW_SM_I, %r0
|
||||
b lws_exit
|
||||
copy %r0, %r21
|
||||
@ -521,7 +533,8 @@ lws_wouldblock:
|
||||
|
||||
lws_pagefault:
|
||||
lws_pagefault_enable %r1,%r21
|
||||
stw,ma %r20, 0(%sr2,%r20)
|
||||
ldi __ARCH_SPIN_LOCK_UNLOCKED_VAL, %r21
|
||||
stw,ma %r21, 0(%sr2,%r20)
|
||||
ssm PSW_SM_I, %r0
|
||||
ldo 3(%r0),%r28
|
||||
b lws_exit
|
||||
@ -619,6 +632,7 @@ lws_compare_and_swap:
|
||||
|
||||
/* Try to acquire the lock */
|
||||
LDCW 0(%sr2,%r20), %r28
|
||||
spinlock_check %r28, %r21
|
||||
comclr,<> %r0, %r28, %r0
|
||||
b,n lws_wouldblock
|
||||
|
||||
@ -772,6 +786,7 @@ cas2_lock_start:
|
||||
|
||||
/* Try to acquire the lock */
|
||||
LDCW 0(%sr2,%r20), %r28
|
||||
spinlock_check %r28, %r21
|
||||
comclr,<> %r0, %r28, %r0
|
||||
b,n lws_wouldblock
|
||||
|
||||
@ -1001,6 +1016,7 @@ atomic_xchg_start:
|
||||
|
||||
/* Try to acquire the lock */
|
||||
LDCW 0(%sr2,%r20), %r28
|
||||
spinlock_check %r28, %r21
|
||||
comclr,<> %r0, %r28, %r0
|
||||
b,n lws_wouldblock
|
||||
|
||||
@ -1199,6 +1215,7 @@ atomic_store_start:
|
||||
|
||||
/* Try to acquire the lock */
|
||||
LDCW 0(%sr2,%r20), %r28
|
||||
spinlock_check %r28, %r21
|
||||
comclr,<> %r0, %r28, %r0
|
||||
b,n lws_wouldblock
|
||||
|
||||
@ -1330,7 +1347,7 @@ ENTRY(lws_lock_start)
|
||||
/* lws locks */
|
||||
.rept 256
|
||||
/* Keep locks aligned at 16-bytes */
|
||||
.word 1
|
||||
.word __ARCH_SPIN_LOCK_UNLOCKED_VAL
|
||||
.word 0
|
||||
.word 0
|
||||
.word 0
|
||||
|
@ -11,6 +11,7 @@
|
||||
#include <linux/signal.h>
|
||||
#include <linux/ratelimit.h>
|
||||
#include <linux/uaccess.h>
|
||||
#include <linux/sysctl.h>
|
||||
#include <asm/unaligned.h>
|
||||
#include <asm/hardirq.h>
|
||||
#include <asm/traps.h>
|
||||
|
@ -1,5 +1,6 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
#include <linux/module.h>
|
||||
#include <linux/libgcc.h>
|
||||
|
||||
union ull_union {
|
||||
unsigned long long ull;
|
||||
@ -9,7 +10,7 @@ union ull_union {
|
||||
} ui;
|
||||
};
|
||||
|
||||
int __ucmpdi2(unsigned long long a, unsigned long long b)
|
||||
word_type __ucmpdi2(unsigned long long a, unsigned long long b)
|
||||
{
|
||||
union ull_union au = {.ull = a};
|
||||
union ull_union bu = {.ull = b};
|
||||
|
@ -192,31 +192,31 @@ int fixup_exception(struct pt_regs *regs)
|
||||
* For implementation see handle_interruption() in traps.c
|
||||
*/
|
||||
static const char * const trap_description[] = {
|
||||
[1] "High-priority machine check (HPMC)",
|
||||
[2] "Power failure interrupt",
|
||||
[3] "Recovery counter trap",
|
||||
[5] "Low-priority machine check",
|
||||
[6] "Instruction TLB miss fault",
|
||||
[7] "Instruction access rights / protection trap",
|
||||
[8] "Illegal instruction trap",
|
||||
[9] "Break instruction trap",
|
||||
[10] "Privileged operation trap",
|
||||
[11] "Privileged register trap",
|
||||
[12] "Overflow trap",
|
||||
[13] "Conditional trap",
|
||||
[14] "FP Assist Exception trap",
|
||||
[15] "Data TLB miss fault",
|
||||
[16] "Non-access ITLB miss fault",
|
||||
[17] "Non-access DTLB miss fault",
|
||||
[18] "Data memory protection/unaligned access trap",
|
||||
[19] "Data memory break trap",
|
||||
[20] "TLB dirty bit trap",
|
||||
[21] "Page reference trap",
|
||||
[22] "Assist emulation trap",
|
||||
[25] "Taken branch trap",
|
||||
[26] "Data memory access rights trap",
|
||||
[27] "Data memory protection ID trap",
|
||||
[28] "Unaligned data reference trap",
|
||||
[1] = "High-priority machine check (HPMC)",
|
||||
[2] = "Power failure interrupt",
|
||||
[3] = "Recovery counter trap",
|
||||
[5] = "Low-priority machine check",
|
||||
[6] = "Instruction TLB miss fault",
|
||||
[7] = "Instruction access rights / protection trap",
|
||||
[8] = "Illegal instruction trap",
|
||||
[9] = "Break instruction trap",
|
||||
[10] = "Privileged operation trap",
|
||||
[11] = "Privileged register trap",
|
||||
[12] = "Overflow trap",
|
||||
[13] = "Conditional trap",
|
||||
[14] = "FP Assist Exception trap",
|
||||
[15] = "Data TLB miss fault",
|
||||
[16] = "Non-access ITLB miss fault",
|
||||
[17] = "Non-access DTLB miss fault",
|
||||
[18] = "Data memory protection/unaligned access trap",
|
||||
[19] = "Data memory break trap",
|
||||
[20] = "TLB dirty bit trap",
|
||||
[21] = "Page reference trap",
|
||||
[22] = "Assist emulation trap",
|
||||
[25] = "Taken branch trap",
|
||||
[26] = "Data memory access rights trap",
|
||||
[27] = "Data memory protection ID trap",
|
||||
[28] = "Unaligned data reference trap",
|
||||
};
|
||||
|
||||
const char *trap_name(unsigned long code)
|
||||
|
@ -523,10 +523,6 @@ void mark_rodata_ro(void)
|
||||
void *parisc_vmalloc_start __ro_after_init;
|
||||
EXPORT_SYMBOL(parisc_vmalloc_start);
|
||||
|
||||
#ifdef CONFIG_PA11
|
||||
unsigned long pcxl_dma_start __ro_after_init;
|
||||
#endif
|
||||
|
||||
void __init mem_init(void)
|
||||
{
|
||||
/* Do sanity checks on IPC (compat) structures */
|
||||
|
@ -27,7 +27,7 @@
|
||||
*/
|
||||
void __iomem *ioremap(unsigned long phys_addr, unsigned long size)
|
||||
{
|
||||
void __iomem *addr;
|
||||
uintptr_t addr;
|
||||
struct vm_struct *area;
|
||||
unsigned long offset, last_addr;
|
||||
pgprot_t pgprot;
|
||||
@ -79,10 +79,9 @@ void __iomem *ioremap(unsigned long phys_addr, unsigned long size)
|
||||
if (!area)
|
||||
return NULL;
|
||||
|
||||
addr = (void __iomem *) area->addr;
|
||||
if (ioremap_page_range((unsigned long)addr, (unsigned long)addr + size,
|
||||
phys_addr, pgprot)) {
|
||||
vunmap(addr);
|
||||
addr = (uintptr_t) area->addr;
|
||||
if (ioremap_page_range(addr, addr + size, phys_addr, pgprot)) {
|
||||
vunmap(area->addr);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -121,6 +121,8 @@ module_param(sba_reserve_agpgart, int, 0444);
|
||||
MODULE_PARM_DESC(sba_reserve_agpgart, "Reserve half of IO pdir as AGPGART");
|
||||
#endif
|
||||
|
||||
struct proc_dir_entry *proc_runway_root __ro_after_init;
|
||||
struct proc_dir_entry *proc_mckinley_root __ro_after_init;
|
||||
|
||||
/************************************
|
||||
** SBA register read and write support
|
||||
@ -1968,11 +1970,15 @@ static int __init sba_driver_callback(struct parisc_device *dev)
|
||||
#ifdef CONFIG_PROC_FS
|
||||
switch (dev->id.hversion) {
|
||||
case PLUTO_MCKINLEY_PORT:
|
||||
if (!proc_mckinley_root)
|
||||
proc_mckinley_root = proc_mkdir("bus/mckinley", NULL);
|
||||
root = proc_mckinley_root;
|
||||
break;
|
||||
case ASTRO_RUNWAY_PORT:
|
||||
case IKE_MERCED_PORT:
|
||||
default:
|
||||
if (!proc_runway_root)
|
||||
proc_runway_root = proc_mkdir("bus/runway", NULL);
|
||||
root = proc_runway_root;
|
||||
break;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user