提交 e7b3ca08 编写于 作者: K Kyle McMartin

Merge branch 'parisc' from /home/kyle/repos/parisc-2.6.git

Conflicts:

	arch/parisc/hpux/sys_hpux.c
	arch/parisc/mm/ioremap.c
...@@ -35,12 +35,8 @@ FINAL_LD=$(CROSS_COMPILE)ld --warn-common --warn-section-align ...@@ -35,12 +35,8 @@ FINAL_LD=$(CROSS_COMPILE)ld --warn-common --warn-section-align
OBJCOPY_FLAGS =-O binary -R .note -R .comment -S OBJCOPY_FLAGS =-O binary -R .note -R .comment -S
GCC_VERSION := $(call cc-version) ifneq ($(call cc-ifversion, -lt, 0303, "bad"),)
ifneq ($(shell if [ -z $(GCC_VERSION) ] ; then echo "bad"; fi ;),) $(error Sorry, GCC v3.3 or above is required.)
$(error Sorry, couldn't find ($(cc-version)).)
endif
ifneq ($(shell if [ $(GCC_VERSION) -lt 0303 ] ; then echo "bad"; fi ;),)
$(error Sorry, your compiler is too old ($(GCC_VERSION)). GCC v3.3 or above is required.)
endif endif
cflags-y := -pipe cflags-y := -pipe
......
...@@ -35,13 +35,13 @@ int hpux_execve(struct pt_regs *regs) ...@@ -35,13 +35,13 @@ int hpux_execve(struct pt_regs *regs)
int error; int error;
char *filename; char *filename;
filename = getname((char *) regs->gr[26]); filename = getname((char __user *) regs->gr[26]);
error = PTR_ERR(filename); error = PTR_ERR(filename);
if (IS_ERR(filename)) if (IS_ERR(filename))
goto out; goto out;
error = do_execve(filename, (char **) regs->gr[25], error = do_execve(filename, (char __user * __user *) regs->gr[25],
(char **)regs->gr[24], regs); (char __user * __user *) regs->gr[24], regs);
if (error == 0) { if (error == 0) {
task_lock(current); task_lock(current);
...@@ -63,19 +63,19 @@ struct hpux_dirent { ...@@ -63,19 +63,19 @@ struct hpux_dirent {
}; };
struct getdents_callback { struct getdents_callback {
struct hpux_dirent *current_dir; struct hpux_dirent __user *current_dir;
struct hpux_dirent *previous; struct hpux_dirent __user *previous;
int count; int count;
int error; int error;
}; };
#define NAME_OFFSET(de) ((int) ((de)->d_name - (char *) (de))) #define NAME_OFFSET(de) ((int) ((de)->d_name - (char __user *) (de)))
#define ROUND_UP(x) (((x)+sizeof(long)-1) & ~(sizeof(long)-1)) #define ROUND_UP(x) (((x)+sizeof(long)-1) & ~(sizeof(long)-1))
static int filldir(void * __buf, const char * name, int namlen, loff_t offset, static int filldir(void * __buf, const char * name, int namlen, loff_t offset,
u64 ino, unsigned d_type) u64 ino, unsigned d_type)
{ {
struct hpux_dirent * dirent; struct hpux_dirent __user * dirent;
struct getdents_callback * buf = (struct getdents_callback *) __buf; struct getdents_callback * buf = (struct getdents_callback *) __buf;
ino_t d_ino; ino_t d_ino;
int reclen = ROUND_UP(NAME_OFFSET(dirent) + namlen + 1); int reclen = ROUND_UP(NAME_OFFSET(dirent) + namlen + 1);
...@@ -105,10 +105,10 @@ static int filldir(void * __buf, const char * name, int namlen, loff_t offset, ...@@ -105,10 +105,10 @@ static int filldir(void * __buf, const char * name, int namlen, loff_t offset,
#undef NAME_OFFSET #undef NAME_OFFSET
#undef ROUND_UP #undef ROUND_UP
int hpux_getdents(unsigned int fd, struct hpux_dirent *dirent, unsigned int count) int hpux_getdents(unsigned int fd, struct hpux_dirent __user *dirent, unsigned int count)
{ {
struct file * file; struct file * file;
struct hpux_dirent * lastdirent; struct hpux_dirent __user * lastdirent;
struct getdents_callback buf; struct getdents_callback buf;
int error = -EBADF; int error = -EBADF;
...@@ -143,7 +143,7 @@ int hpux_mount(const char *fs, const char *path, int mflag, ...@@ -143,7 +143,7 @@ int hpux_mount(const char *fs, const char *path, int mflag,
return -ENOSYS; return -ENOSYS;
} }
static int cp_hpux_stat(struct kstat *stat, struct hpux_stat64 *statbuf) static int cp_hpux_stat(struct kstat *stat, struct hpux_stat64 __user *statbuf)
{ {
struct hpux_stat64 tmp; struct hpux_stat64 tmp;
...@@ -169,7 +169,7 @@ static int cp_hpux_stat(struct kstat *stat, struct hpux_stat64 *statbuf) ...@@ -169,7 +169,7 @@ static int cp_hpux_stat(struct kstat *stat, struct hpux_stat64 *statbuf)
return copy_to_user(statbuf,&tmp,sizeof(tmp)) ? -EFAULT : 0; return copy_to_user(statbuf,&tmp,sizeof(tmp)) ? -EFAULT : 0;
} }
long hpux_stat64(char *filename, struct hpux_stat64 *statbuf) long hpux_stat64(char __user *filename, struct hpux_stat64 __user *statbuf)
{ {
struct kstat stat; struct kstat stat;
int error = vfs_stat(filename, &stat); int error = vfs_stat(filename, &stat);
...@@ -180,7 +180,7 @@ long hpux_stat64(char *filename, struct hpux_stat64 *statbuf) ...@@ -180,7 +180,7 @@ long hpux_stat64(char *filename, struct hpux_stat64 *statbuf)
return error; return error;
} }
long hpux_fstat64(unsigned int fd, struct hpux_stat64 *statbuf) long hpux_fstat64(unsigned int fd, struct hpux_stat64 __user *statbuf)
{ {
struct kstat stat; struct kstat stat;
int error = vfs_fstat(fd, &stat); int error = vfs_fstat(fd, &stat);
...@@ -191,7 +191,7 @@ long hpux_fstat64(unsigned int fd, struct hpux_stat64 *statbuf) ...@@ -191,7 +191,7 @@ long hpux_fstat64(unsigned int fd, struct hpux_stat64 *statbuf)
return error; return error;
} }
long hpux_lstat64(char *filename, struct hpux_stat64 *statbuf) long hpux_lstat64(char __user *filename, struct hpux_stat64 __user *statbuf)
{ {
struct kstat stat; struct kstat stat;
int error = vfs_lstat(filename, &stat); int error = vfs_lstat(filename, &stat);
......
...@@ -61,7 +61,7 @@ int hpux_ptrace(void) ...@@ -61,7 +61,7 @@ int hpux_ptrace(void)
return -ENOSYS; return -ENOSYS;
} }
int hpux_wait(int *stat_loc) int hpux_wait(int __user *stat_loc)
{ {
return sys_waitpid(-1, stat_loc, 0); return sys_waitpid(-1, stat_loc, 0);
} }
...@@ -255,7 +255,7 @@ asmlinkage long hpux_fstatfs(unsigned int fd, struct hpux_statfs __user * buf) ...@@ -255,7 +255,7 @@ asmlinkage long hpux_fstatfs(unsigned int fd, struct hpux_statfs __user * buf)
/* TODO: Are these put_user calls OK? Should they pass an int? /* TODO: Are these put_user calls OK? Should they pass an int?
* (I copied it from sys_i386.c like this.) * (I copied it from sys_i386.c like this.)
*/ */
static int hpux_uname(struct hpux_utsname *name) static int hpux_uname(struct hpux_utsname __user *name)
{ {
int error; int error;
...@@ -300,14 +300,14 @@ static int hpux_uname(struct hpux_utsname *name) ...@@ -300,14 +300,14 @@ static int hpux_uname(struct hpux_utsname *name)
/* Note: HP-UX just uses the old suser() function to check perms /* Note: HP-UX just uses the old suser() function to check perms
* in this system call. We'll use capable(CAP_SYS_ADMIN). * in this system call. We'll use capable(CAP_SYS_ADMIN).
*/ */
int hpux_utssys(char *ubuf, int n, int type) int hpux_utssys(char __user *ubuf, int n, int type)
{ {
int len; int len;
int error; int error;
switch( type ) { switch( type ) {
case 0: case 0:
/* uname(): */ /* uname(): */
return( hpux_uname( (struct hpux_utsname *)ubuf ) ); return hpux_uname((struct hpux_utsname __user *)ubuf);
break ; break ;
case 1: case 1:
/* Obsolete (used to be umask().) */ /* Obsolete (used to be umask().) */
...@@ -315,8 +315,9 @@ int hpux_utssys(char *ubuf, int n, int type) ...@@ -315,8 +315,9 @@ int hpux_utssys(char *ubuf, int n, int type)
break ; break ;
case 2: case 2:
/* ustat(): */ /* ustat(): */
return( hpux_ustat(new_decode_dev(n), (struct hpux_ustat *)ubuf) ); return hpux_ustat(new_decode_dev(n),
break ; (struct hpux_ustat __user *)ubuf);
break;
case 3: case 3:
/* setuname(): /* setuname():
* *
...@@ -332,7 +333,7 @@ int hpux_utssys(char *ubuf, int n, int type) ...@@ -332,7 +333,7 @@ int hpux_utssys(char *ubuf, int n, int type)
return -EINVAL ; return -EINVAL ;
/* Unlike Linux, HP-UX truncates it if n is too big: */ /* Unlike Linux, HP-UX truncates it if n is too big: */
len = (n <= __NEW_UTS_LEN) ? n : __NEW_UTS_LEN ; len = (n <= __NEW_UTS_LEN) ? n : __NEW_UTS_LEN ;
return( sys_sethostname(ubuf, len) ); return sys_sethostname(ubuf, len);
break ; break ;
case 4: case 4:
/* sethostname(): /* sethostname():
...@@ -346,7 +347,7 @@ int hpux_utssys(char *ubuf, int n, int type) ...@@ -346,7 +347,7 @@ int hpux_utssys(char *ubuf, int n, int type)
return -EINVAL ; return -EINVAL ;
/* Unlike Linux, HP-UX truncates it if n is too big: */ /* Unlike Linux, HP-UX truncates it if n is too big: */
len = (n <= __NEW_UTS_LEN) ? n : __NEW_UTS_LEN ; len = (n <= __NEW_UTS_LEN) ? n : __NEW_UTS_LEN ;
return( sys_sethostname(ubuf, len) ); return sys_sethostname(ubuf, len);
break ; break ;
case 5: case 5:
/* gethostname(): /* gethostname():
...@@ -356,7 +357,7 @@ int hpux_utssys(char *ubuf, int n, int type) ...@@ -356,7 +357,7 @@ int hpux_utssys(char *ubuf, int n, int type)
/* Unlike Linux, HP-UX returns an error if n==0: */ /* Unlike Linux, HP-UX returns an error if n==0: */
if ( n <= 0 ) if ( n <= 0 )
return -EINVAL ; return -EINVAL ;
return( sys_gethostname(ubuf, n) ); return sys_gethostname(ubuf, n);
break ; break ;
case 6: case 6:
/* Supposedly called from setuname() in libc. /* Supposedly called from setuname() in libc.
...@@ -420,7 +421,7 @@ int hpux_utssys(char *ubuf, int n, int type) ...@@ -420,7 +421,7 @@ int hpux_utssys(char *ubuf, int n, int type)
} }
} }
int hpux_getdomainname(char *name, int len) int hpux_getdomainname(char __user *name, int len)
{ {
int nlen; int nlen;
int err = -EFAULT; int err = -EFAULT;
...@@ -471,17 +472,18 @@ int hpux_sysfs(int opcode, unsigned long arg1, unsigned long arg2) ...@@ -471,17 +472,18 @@ int hpux_sysfs(int opcode, unsigned long arg1, unsigned long arg2)
printk(KERN_DEBUG "hpux_sysfs called with arg1='%lx'\n", arg1); printk(KERN_DEBUG "hpux_sysfs called with arg1='%lx'\n", arg1);
if ( opcode == 1 ) { /* GETFSIND */ if ( opcode == 1 ) { /* GETFSIND */
len = strlen_user((char *)arg1); char __user *user_fsname = (char __user *)arg1;
len = strlen_user(user_fsname);
printk(KERN_DEBUG "len of arg1 = %d\n", len); printk(KERN_DEBUG "len of arg1 = %d\n", len);
if (len == 0) if (len == 0)
return 0; return 0;
fsname = kmalloc(len, GFP_KERNEL); fsname = kmalloc(len, GFP_KERNEL);
if ( !fsname ) { if (!fsname) {
printk(KERN_DEBUG "failed to kmalloc fsname\n"); printk(KERN_DEBUG "failed to kmalloc fsname\n");
return 0; return 0;
} }
if ( copy_from_user(fsname, (char *)arg1, len) ) { if (copy_from_user(fsname, user_fsname, len)) {
printk(KERN_DEBUG "failed to copy_from_user fsname\n"); printk(KERN_DEBUG "failed to copy_from_user fsname\n");
kfree(fsname); kfree(fsname);
return 0; return 0;
...@@ -495,7 +497,7 @@ int hpux_sysfs(int opcode, unsigned long arg1, unsigned long arg2) ...@@ -495,7 +497,7 @@ int hpux_sysfs(int opcode, unsigned long arg1, unsigned long arg2)
fstype = 0; fstype = 0;
} else { } else {
fstype = 0; fstype = 0;
}; }
kfree(fsname); kfree(fsname);
......
...@@ -689,7 +689,9 @@ parse_tree_node(struct device *parent, int index, struct hardware_path *modpath) ...@@ -689,7 +689,9 @@ parse_tree_node(struct device *parent, int index, struct hardware_path *modpath)
.fn = check_parent, .fn = check_parent,
}; };
device_for_each_child(parent, &recurse_data, descend_children); if (device_for_each_child(parent, &recurse_data, descend_children))
/* nothing */;
return d.dev; return d.dev;
} }
...@@ -835,8 +837,8 @@ static void print_parisc_device(struct parisc_device *dev) ...@@ -835,8 +837,8 @@ static void print_parisc_device(struct parisc_device *dev)
static int count; static int count;
print_pa_hwpath(dev, hw_path); print_pa_hwpath(dev, hw_path);
printk(KERN_INFO "%d. %s at 0x%lx [%s] { %d, 0x%x, 0x%.3x, 0x%.5x }", printk(KERN_INFO "%d. %s at 0x%p [%s] { %d, 0x%x, 0x%.3x, 0x%.5x }",
++count, dev->name, dev->hpa.start, hw_path, dev->id.hw_type, ++count, dev->name, (void*) dev->hpa.start, hw_path, dev->id.hw_type,
dev->id.hversion_rev, dev->id.hversion, dev->id.sversion); dev->id.hversion_rev, dev->id.hversion, dev->id.sversion);
if (dev->num_addrs) { if (dev->num_addrs) {
......
...@@ -822,7 +822,8 @@ int module_finalize(const Elf_Ehdr *hdr, ...@@ -822,7 +822,8 @@ int module_finalize(const Elf_Ehdr *hdr,
me->name, strtab, symhdr); me->name, strtab, symhdr);
if(me->arch.got_count > MAX_GOTS) { if(me->arch.got_count > MAX_GOTS) {
printk(KERN_ERR "%s: Global Offset Table overflow (used %ld, allowed %d\n", me->name, me->arch.got_count, MAX_GOTS); printk(KERN_ERR "%s: Global Offset Table overflow (used %ld, allowed %d)\n",
me->name, me->arch.got_count, MAX_GOTS);
return -EINVAL; return -EINVAL;
} }
......
...@@ -342,7 +342,7 @@ pcxl_dma_init(void) ...@@ -342,7 +342,7 @@ pcxl_dma_init(void)
pcxl_res_map = (char *)__get_free_pages(GFP_KERNEL, pcxl_res_map = (char *)__get_free_pages(GFP_KERNEL,
get_order(pcxl_res_size)); get_order(pcxl_res_size));
memset(pcxl_res_map, 0, pcxl_res_size); memset(pcxl_res_map, 0, pcxl_res_size);
proc_gsc_root = proc_mkdir("gsc", 0); proc_gsc_root = proc_mkdir("gsc", NULL);
if (!proc_gsc_root) if (!proc_gsc_root)
printk(KERN_WARNING printk(KERN_WARNING
"pcxl_dma_init: Unable to create gsc /proc dir entry\n"); "pcxl_dma_init: Unable to create gsc /proc dir entry\n");
......
...@@ -200,8 +200,8 @@ static void ...@@ -200,8 +200,8 @@ static void
pcibios_link_hba_resources( struct resource *hba_res, struct resource *r) pcibios_link_hba_resources( struct resource *hba_res, struct resource *r)
{ {
if (!r->parent) { if (!r->parent) {
printk(KERN_EMERG "PCI: resource not parented! [%lx-%lx]\n", printk(KERN_EMERG "PCI: resource not parented! [%p-%p]\n",
r->start, r->end); (void*) r->start, (void*) r->end);
r->parent = hba_res; r->parent = hba_res;
/* reverse link is harder *sigh* */ /* reverse link is harder *sigh* */
......
...@@ -355,8 +355,8 @@ asmlinkage int sys_execve(struct pt_regs *regs) ...@@ -355,8 +355,8 @@ asmlinkage int sys_execve(struct pt_regs *regs)
error = PTR_ERR(filename); error = PTR_ERR(filename);
if (IS_ERR(filename)) if (IS_ERR(filename))
goto out; goto out;
error = do_execve(filename, (char __user **) regs->gr[25], error = do_execve(filename, (char __user * __user *) regs->gr[25],
(char __user **) regs->gr[24], regs); (char __user * __user *) regs->gr[24], regs);
if (error == 0) { if (error == 0) {
task_lock(current); task_lock(current);
current->ptrace &= ~PT_DTRACE; current->ptrace &= ~PT_DTRACE;
......
...@@ -153,8 +153,6 @@ static int __init processor_probe(struct parisc_device *dev) ...@@ -153,8 +153,6 @@ static int __init processor_probe(struct parisc_device *dev)
p->cpuid = cpuid; /* save CPU id */ p->cpuid = cpuid; /* save CPU id */
p->txn_addr = txn_addr; /* save CPU IRQ address */ p->txn_addr = txn_addr; /* save CPU IRQ address */
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
spin_lock_init(&p->lock);
/* /*
** FIXME: review if any other initialization is clobbered ** FIXME: review if any other initialization is clobbered
** for boot_cpu by the above memset(). ** for boot_cpu by the above memset().
......
...@@ -76,6 +76,7 @@ cpumask_t cpu_possible_map __read_mostly = CPU_MASK_ALL; /* Bitmap of Present CP ...@@ -76,6 +76,7 @@ cpumask_t cpu_possible_map __read_mostly = CPU_MASK_ALL; /* Bitmap of Present CP
EXPORT_SYMBOL(cpu_online_map); EXPORT_SYMBOL(cpu_online_map);
EXPORT_SYMBOL(cpu_possible_map); EXPORT_SYMBOL(cpu_possible_map);
DEFINE_PER_CPU(spinlock_t, ipi_lock) = SPIN_LOCK_UNLOCKED;
struct smp_call_struct { struct smp_call_struct {
void (*func) (void *info); void (*func) (void *info);
...@@ -167,10 +168,11 @@ ipi_interrupt(int irq, void *dev_id) ...@@ -167,10 +168,11 @@ ipi_interrupt(int irq, void *dev_id)
mb(); /* Order interrupt and bit testing. */ mb(); /* Order interrupt and bit testing. */
for (;;) { for (;;) {
spin_lock_irqsave(&(p->lock),flags); spinlock_t *lock = &per_cpu(ipi_lock, this_cpu);
spin_lock_irqsave(lock, flags);
ops = p->pending_ipi; ops = p->pending_ipi;
p->pending_ipi = 0; p->pending_ipi = 0;
spin_unlock_irqrestore(&(p->lock),flags); spin_unlock_irqrestore(lock, flags);
mb(); /* Order bit clearing and data access. */ mb(); /* Order bit clearing and data access. */
...@@ -275,12 +277,13 @@ static inline void ...@@ -275,12 +277,13 @@ static inline void
ipi_send(int cpu, enum ipi_message_type op) ipi_send(int cpu, enum ipi_message_type op)
{ {
struct cpuinfo_parisc *p = &cpu_data[cpu]; struct cpuinfo_parisc *p = &cpu_data[cpu];
spinlock_t *lock = &per_cpu(ipi_lock, cpu);
unsigned long flags; unsigned long flags;
spin_lock_irqsave(&(p->lock),flags); spin_lock_irqsave(lock, flags);
p->pending_ipi |= 1 << op; p->pending_ipi |= 1 << op;
gsc_writel(IPI_IRQ - CPU_IRQ_BASE, cpu_data[cpu].hpa); gsc_writel(IPI_IRQ - CPU_IRQ_BASE, cpu_data[cpu].hpa);
spin_unlock_irqrestore(&(p->lock),flags); spin_unlock_irqrestore(lock, flags);
} }
......
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
#include <linux/pagemap.h> /* for release_pages and page_cache_release */ #include <linux/pagemap.h> /* for release_pages and page_cache_release */
#include <asm/pgalloc.h> #include <asm/pgalloc.h>
#include <asm/pgtable.h>
#include <asm/tlb.h> #include <asm/tlb.h>
#include <asm/pdc_chassis.h> #include <asm/pdc_chassis.h>
#include <asm/mmzone.h> #include <asm/mmzone.h>
...@@ -453,6 +454,8 @@ unsigned long pcxl_dma_start __read_mostly; ...@@ -453,6 +454,8 @@ unsigned long pcxl_dma_start __read_mostly;
void __init mem_init(void) void __init mem_init(void)
{ {
int codesize, reservedpages, datasize, initsize;
high_memory = __va((max_pfn << PAGE_SHIFT)); high_memory = __va((max_pfn << PAGE_SHIFT));
#ifndef CONFIG_DISCONTIGMEM #ifndef CONFIG_DISCONTIGMEM
...@@ -467,7 +470,32 @@ void __init mem_init(void) ...@@ -467,7 +470,32 @@ void __init mem_init(void)
} }
#endif #endif
printk(KERN_INFO "Memory: %luk available\n", num_physpages << (PAGE_SHIFT-10)); codesize = (unsigned long)_etext - (unsigned long)_text;
datasize = (unsigned long)_edata - (unsigned long)_etext;
initsize = (unsigned long)__init_end - (unsigned long)__init_begin;
reservedpages = 0;
{
unsigned long pfn;
#ifdef CONFIG_DISCONTIGMEM
int i;
for (i = 0; i < npmem_ranges; i++) {
for (pfn = node_start_pfn(i); pfn < node_end_pfn(i); pfn++) {
if (PageReserved(pfn_to_page(pfn)))
reservedpages++;
}
}
#else /* !CONFIG_DISCONTIGMEM */
for (pfn = 0; pfn < max_pfn; pfn++) {
/*
* Only count reserved RAM pages
*/
if (PageReserved(pfn_to_page(pfn)))
reservedpages++;
}
#endif
}
#ifdef CONFIG_PA11 #ifdef CONFIG_PA11
if (hppa_dma_ops == &pcxl_dma_ops) { if (hppa_dma_ops == &pcxl_dma_ops) {
...@@ -481,6 +509,38 @@ void __init mem_init(void) ...@@ -481,6 +509,38 @@ void __init mem_init(void)
vmalloc_start = SET_MAP_OFFSET(MAP_START); vmalloc_start = SET_MAP_OFFSET(MAP_START);
#endif #endif
printk(KERN_INFO "Memory: %luk/%luk available (%dk kernel code, %dk reserved, %dk data, %dk init)\n",
(unsigned long)nr_free_pages() << (PAGE_SHIFT-10),
num_physpages << (PAGE_SHIFT-10),
codesize >> 10,
reservedpages << (PAGE_SHIFT-10),
datasize >> 10,
initsize >> 10
);
#ifdef CONFIG_DEBUG_KERNEL /* double-sanity-check paranoia */
printk("virtual kernel memory layout:\n"
" vmalloc : 0x%p - 0x%p (%4ld MB)\n"
" memory : 0x%p - 0x%p (%4ld MB)\n"
" .init : 0x%p - 0x%p (%4ld kB)\n"
" .data : 0x%p - 0x%p (%4ld kB)\n"
" .text : 0x%p - 0x%p (%4ld kB)\n",
(void*)VMALLOC_START, (void*)VMALLOC_END,
(VMALLOC_END - VMALLOC_START) >> 20,
__va(0), high_memory,
((unsigned long)high_memory - (unsigned long)__va(0)) >> 20,
__init_begin, __init_end,
((unsigned long)__init_end - (unsigned long)__init_begin) >> 10,
_etext, _edata,
((unsigned long)_edata - (unsigned long)_etext) >> 10,
_text, _etext,
((unsigned long)_etext - (unsigned long)_text) >> 10);
#endif
} }
unsigned long *empty_zero_page __read_mostly; unsigned long *empty_zero_page __read_mostly;
...@@ -548,7 +608,7 @@ void show_mem(void) ...@@ -548,7 +608,7 @@ void show_mem(void)
printk("Zone list for zone %d on node %d: ", j, i); printk("Zone list for zone %d on node %d: ", j, i);
for (k = 0; zl->zones[k] != NULL; k++) for (k = 0; zl->zones[k] != NULL; k++)
printk("[%d/%s] ", zone_to_nid(zl->zones[k]), zl->zones[k]->name); printk("[%ld/%s] ", zone_to_nid(zl->zones[k]), zl->zones[k]->name);
printk("\n"); printk("\n");
} }
} }
......
...@@ -26,7 +26,7 @@ ...@@ -26,7 +26,7 @@
*/ */
void __iomem * __ioremap(unsigned long phys_addr, unsigned long size, unsigned long flags) void __iomem * __ioremap(unsigned long phys_addr, unsigned long size, unsigned long flags)
{ {
void *addr; void __iomem *addr;
struct vm_struct *area; struct vm_struct *area;
unsigned long offset, last_addr; unsigned long offset, last_addr;
pgprot_t pgprot; pgprot_t pgprot;
...@@ -80,14 +80,14 @@ void __iomem * __ioremap(unsigned long phys_addr, unsigned long size, unsigned l ...@@ -80,14 +80,14 @@ void __iomem * __ioremap(unsigned long phys_addr, unsigned long size, unsigned l
if (!area) if (!area)
return NULL; return NULL;
addr = area->addr; addr = (void __iomem *) area->addr;
if (ioremap_page_range((unsigned long)addr, (unsigned long)addr + size, if (ioremap_page_range((unsigned long)addr, (unsigned long)addr + size,
phys_addr, pgprot)) { phys_addr, pgprot)) {
vfree(addr); vfree(addr);
return NULL; return NULL;
} }
return (void __iomem *) (offset + (char *)addr); return (void __iomem *) (offset + (char __iomem *)addr);
} }
EXPORT_SYMBOL(__ioremap); EXPORT_SYMBOL(__ioremap);
......
/*
* kmap/page table map and unmap support routines
*
* Copyright 1999,2000 Hewlett-Packard Company
* Copyright 2000 John Marvin <jsm at hp.com>
* Copyright 2000 Grant Grundler <grundler at parisc-linux.org>
* Copyright 2000 Philipp Rumpf <prumpf@tux.org>
*
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/*
** Stolen mostly from arch/parisc/kernel/pci-dma.c
*/
#include <linux/types.h>
#include <linux/mm.h>
#include <linux/string.h>
#include <linux/pci.h>
#include <linux/slab.h>
#include <linux/vmalloc.h>
#include <asm/uaccess.h>
#include <asm/pgalloc.h>
#include <asm/io.h>
#include <asm/page.h> /* get_order */
#undef flush_cache_all
#define flush_cache_all flush_all_caches
typedef void (*pte_iterator_t) (pte_t * pte, unsigned long arg);
#if 0
/* XXX This routine could be used with iterate_page() to replace
* unmap_uncached_page() and save a little code space but I didn't
* do that since I'm not certain whether this is the right path. -PB
*/
static void unmap_cached_pte(pte_t * pte, unsigned long addr, unsigned long arg)
{
pte_t page = *pte;
pte_clear(&init_mm, addr, pte);
if (!pte_none(page)) {
if (pte_present(page)) {
unsigned long map_nr = pte_pagenr(page);
if (map_nr < max_mapnr)
__free_page(mem_map + map_nr);
} else {
printk(KERN_CRIT
"Whee.. Swapped out page in kernel page table\n");
}
}
}
#endif
/* These two routines should probably check a few things... */
static void set_uncached(pte_t * pte, unsigned long arg)
{
pte_val(*pte) |= _PAGE_NO_CACHE;
}
static void set_cached(pte_t * pte, unsigned long arg)
{
pte_val(*pte) &= ~_PAGE_NO_CACHE;
}
static inline void iterate_pte(pmd_t * pmd, unsigned long address,
unsigned long size, pte_iterator_t op,
unsigned long arg)
{
pte_t *pte;
unsigned long end;
if (pmd_none(*pmd))
return;
if (pmd_bad(*pmd)) {
pmd_ERROR(*pmd);
pmd_clear(pmd);
return;
}
pte = pte_offset(pmd, address);
address &= ~PMD_MASK;
end = address + size;
if (end > PMD_SIZE)
end = PMD_SIZE;
do {
op(pte, arg);
address += PAGE_SIZE;
pte++;
} while (address < end);
}
static inline void iterate_pmd(pgd_t * dir, unsigned long address,
unsigned long size, pte_iterator_t op,
unsigned long arg)
{
pmd_t *pmd;
unsigned long end;
if (pgd_none(*dir))
return;
if (pgd_bad(*dir)) {
pgd_ERROR(*dir);
pgd_clear(dir);
return;
}
pmd = pmd_offset(dir, address);
address &= ~PGDIR_MASK;
end = address + size;
if (end > PGDIR_SIZE)
end = PGDIR_SIZE;
do {
iterate_pte(pmd, address, end - address, op, arg);
address = (address + PMD_SIZE) & PMD_MASK;
pmd++;
} while (address < end);
}
static void iterate_pages(unsigned long address, unsigned long size,
pte_iterator_t op, unsigned long arg)
{
pgd_t *dir;
unsigned long end = address + size;
dir = pgd_offset_k(address);
flush_cache_all();
do {
iterate_pmd(dir, address, end - address, op, arg);
address = (address + PGDIR_SIZE) & PGDIR_MASK;
dir++;
} while (address && (address < end));
flush_tlb_all();
}
void
kernel_set_cachemode(unsigned long vaddr, unsigned long size, int what)
{
switch (what) {
case IOMAP_FULL_CACHING:
iterate_pages(vaddr, size, set_cached, 0);
flush_tlb_range(NULL, vaddr, size);
break;
case IOMAP_NOCACHE_SER:
iterate_pages(vaddr, size, set_uncached, 0);
flush_tlb_range(NULL, vaddr, size);
break;
default:
printk(KERN_CRIT
"kernel_set_cachemode mode %d not understood\n",
what);
break;
}
}
...@@ -18,6 +18,6 @@ int __init oprofile_arch_init(struct oprofile_operations * ops) ...@@ -18,6 +18,6 @@ int __init oprofile_arch_init(struct oprofile_operations * ops)
} }
void oprofile_arch_exit() void oprofile_arch_exit(void)
{ {
} }
...@@ -235,7 +235,7 @@ static int __init ...@@ -235,7 +235,7 @@ static int __init
agp_ioc_init(void __iomem *ioc_regs) agp_ioc_init(void __iomem *ioc_regs)
{ {
struct _parisc_agp_info *info = &parisc_agp_info; struct _parisc_agp_info *info = &parisc_agp_info;
u64 *iova_base, *io_pdir, io_tlb_ps; u64 iova_base, *io_pdir, io_tlb_ps;
int io_tlb_shift; int io_tlb_shift;
printk(KERN_INFO DRVPFX "IO PDIR shared with sba_iommu\n"); printk(KERN_INFO DRVPFX "IO PDIR shared with sba_iommu\n");
......
...@@ -440,10 +440,10 @@ config HPLANCE ...@@ -440,10 +440,10 @@ config HPLANCE
config LASI_82596 config LASI_82596
tristate "Lasi ethernet" tristate "Lasi ethernet"
depends on NET_ETHERNET && PARISC && GSC_LASI depends on NET_ETHERNET && GSC
help help
Say Y here to support the on-board Intel 82596 ethernet controller Say Y here to support the builtin Intel 82596 ethernet controller
built into Hewlett-Packard PA-RISC machines. found in Hewlett-Packard PA-RISC machines with 10Mbit ethernet.
config MIPS_JAZZ_SONIC config MIPS_JAZZ_SONIC
tristate "MIPS JAZZ onboard SONIC Ethernet support" tristate "MIPS JAZZ onboard SONIC Ethernet support"
......
...@@ -384,7 +384,7 @@ struct i596_private { ...@@ -384,7 +384,7 @@ struct i596_private {
struct device *dev; struct device *dev;
}; };
static char init_setup[] = static const char init_setup[] =
{ {
0x8E, /* length, prefetch on */ 0x8E, /* length, prefetch on */
0xC8, /* fifo to 8, monitor off */ 0xC8, /* fifo to 8, monitor off */
...@@ -683,7 +683,7 @@ static int init_i596_mem(struct net_device *dev) ...@@ -683,7 +683,7 @@ static int init_i596_mem(struct net_device *dev)
enable_irq(dev->irq); /* enable IRQs from LAN */ enable_irq(dev->irq); /* enable IRQs from LAN */
DEB(DEB_INIT, printk("%s: queuing CmdConfigure\n", dev->name)); DEB(DEB_INIT, printk("%s: queuing CmdConfigure\n", dev->name));
memcpy(lp->cf_cmd.i596_config, init_setup, 14); memcpy(lp->cf_cmd.i596_config, init_setup, sizeof(init_setup));
lp->cf_cmd.cmd.command = CmdConfigure; lp->cf_cmd.cmd.command = CmdConfigure;
CHECK_WBACK(lp, &(lp->cf_cmd), sizeof(struct cf_cmd)); CHECK_WBACK(lp, &(lp->cf_cmd), sizeof(struct cf_cmd));
i596_add_cmd(dev, &lp->cf_cmd.cmd); i596_add_cmd(dev, &lp->cf_cmd.cmd);
...@@ -1156,32 +1156,12 @@ static int __devinit i82596_probe(struct net_device *dev, ...@@ -1156,32 +1156,12 @@ static int __devinit i82596_probe(struct net_device *dev,
dma_addr_t dma_addr; dma_addr_t dma_addr;
/* This lot is ensure things have been cache line aligned. */ /* This lot is ensure things have been cache line aligned. */
if (sizeof(struct i596_rfd) != 32) { BUILD_BUG_ON(sizeof(struct i596_rfd) != 32);
printk("82596: sizeof(struct i596_rfd) = %d\n", BUILD_BUG_ON(sizeof(struct i596_rbd) & 31);
(int)sizeof(struct i596_rfd)); BUILD_BUG_ON(sizeof(struct tx_cmd) & 31);
return -ENODEV; BUILD_BUG_ON(sizeof(struct i596_tbd) != 32);
}
if ((sizeof(struct i596_rbd) % 32) != 0) {
printk("82596: sizeof(struct i596_rbd) = %d\n",
(int)sizeof(struct i596_rbd));
return -ENODEV;
}
if ((sizeof(struct tx_cmd) % 32) != 0) {
printk("82596: sizeof(struct tx_cmd) = %d\n",
(int)sizeof(struct tx_cmd));
return -ENODEV;
}
if (sizeof(struct i596_tbd) != 32) {
printk("82596: sizeof(struct i596_tbd) = %d\n",
(int)sizeof(struct i596_tbd));
return -ENODEV;
}
#ifndef __LP64__ #ifndef __LP64__
if (sizeof(struct i596_private) > 4096) { BUILD_BUG_ON(sizeof(struct i596_private) > 4096);
printk("82596: sizeof(struct i596_private) = %d\n",
(int)sizeof(struct i596_private));
return -ENODEV;
}
#endif #endif
if (!dev->base_addr || !dev->irq) if (!dev->base_addr || !dev->irq)
......
...@@ -10,10 +10,6 @@ ...@@ -10,10 +10,6 @@
** the Free Software Foundation; either version 2 of the License, or ** the Free Software Foundation; either version 2 of the License, or
** (at your option) any later version. ** (at your option) any later version.
** **
** This Driver currently only supports the console (port 0) on the MUX.
** Additional work will be needed on this driver to enable the full
** functionality of the MUX.
**
*/ */
#include <linux/types.h> #include <linux/types.h>
...@@ -67,7 +63,7 @@ static int hppb_probe(struct parisc_device *dev) ...@@ -67,7 +63,7 @@ static int hppb_probe(struct parisc_device *dev)
} }
card = card->next; card = card->next;
} }
printk(KERN_INFO "Found GeckoBoa at 0x%lx\n", dev->hpa.start); printk(KERN_INFO "Found GeckoBoa at 0x%x\n", dev->hpa.start);
card->hpa = dev->hpa.start; card->hpa = dev->hpa.start;
card->mmio_region.name = "HP-PB Bus"; card->mmio_region.name = "HP-PB Bus";
...@@ -78,16 +74,18 @@ static int hppb_probe(struct parisc_device *dev) ...@@ -78,16 +74,18 @@ static int hppb_probe(struct parisc_device *dev)
status = ccio_request_resource(dev, &card->mmio_region); status = ccio_request_resource(dev, &card->mmio_region);
if(status < 0) { if(status < 0) {
printk(KERN_ERR "%s: failed to claim HP-PB bus space (%08lx, %08lx)\n", printk(KERN_ERR "%s: failed to claim HP-PB bus space (%08x, %08x)\n",
__FILE__, card->mmio_region.start, card->mmio_region.end); __FILE__, card->mmio_region.start, card->mmio_region.end);
} }
return 0; return 0;
} }
static struct parisc_device_id hppb_tbl[] = { static struct parisc_device_id hppb_tbl[] = {
{ HPHW_BCPORT, HVERSION_REV_ANY_ID, 0x500, 0xc }, { HPHW_BCPORT, HVERSION_REV_ANY_ID, 0x500, 0xc }, /* E25 and K */
{ HPHW_BCPORT, 0x0, 0x501, 0xc }, /* E35 */
{ HPHW_BCPORT, 0x0, 0x502, 0xc }, /* E45 */
{ HPHW_BCPORT, 0x0, 0x503, 0xc }, /* E55 */
{ 0, } { 0, }
}; };
......
...@@ -132,7 +132,7 @@ struct iosapic_irt { ...@@ -132,7 +132,7 @@ struct iosapic_irt {
struct vector_info { struct vector_info {
struct iosapic_info *iosapic; /* I/O SAPIC this vector is on */ struct iosapic_info *iosapic; /* I/O SAPIC this vector is on */
struct irt_entry *irte; /* IRT entry */ struct irt_entry *irte; /* IRT entry */
u32 *eoi_addr; /* precalculate EOI reg address */ u32 __iomem *eoi_addr; /* precalculate EOI reg address */
u32 eoi_data; /* IA64: ? PA: swapped txn_data */ u32 eoi_data; /* IA64: ? PA: swapped txn_data */
int txn_irq; /* virtual IRQ number for processor */ int txn_irq; /* virtual IRQ number for processor */
ulong txn_addr; /* IA64: id_eid PA: partial HPA */ ulong txn_addr; /* IA64: id_eid PA: partial HPA */
......
...@@ -980,7 +980,7 @@ LBA_PORT_IN(32, 0) ...@@ -980,7 +980,7 @@ LBA_PORT_IN(32, 0)
#define LBA_PORT_OUT(size, mask) \ #define LBA_PORT_OUT(size, mask) \
static void lba_pat_out##size (struct pci_hba_data *l, u16 addr, u##size val) \ static void lba_pat_out##size (struct pci_hba_data *l, u16 addr, u##size val) \
{ \ { \
void *where = (void *) PIOP_TO_GMMIO(LBA_DEV(l), addr); \ void __iomem *where = PIOP_TO_GMMIO(LBA_DEV(l), addr); \
DBG_PORT("%s(0x%p, 0x%x, 0x%x)\n", __FUNCTION__, l, addr, val); \ DBG_PORT("%s(0x%p, 0x%x, 0x%x)\n", __FUNCTION__, l, addr, val); \
WRITE_REG##size(val, where); \ WRITE_REG##size(val, where); \
/* flush the I/O down to the elroy at least */ \ /* flush the I/O down to the elroy at least */ \
...@@ -1406,13 +1406,20 @@ lba_hw_init(struct lba_device *d) ...@@ -1406,13 +1406,20 @@ lba_hw_init(struct lba_device *d)
return 0; return 0;
} }
/*
* Unfortunately, when firmware numbers busses, it doesn't take into account
* Cardbus bridges. So we have to renumber the busses to suit ourselves.
* Elroy/Mercury don't actually know what bus number they're attached to;
* we use bus 0 to indicate the directly attached bus and any other bus
* number will be taken care of by the PCI-PCI bridge.
*/
static unsigned int lba_next_bus = 0;
/* /*
** Determine if lba should claim this chip (return 0) or not (return 1). * Determine if lba should claim this chip (return 0) or not (return 1).
** If so, initialize the chip and tell other partners in crime they * If so, initialize the chip and tell other partners in crime they
** have work to do. * have work to do.
*/ */
static int __init static int __init
lba_driver_probe(struct parisc_device *dev) lba_driver_probe(struct parisc_device *dev)
{ {
...@@ -1478,9 +1485,7 @@ lba_driver_probe(struct parisc_device *dev) ...@@ -1478,9 +1485,7 @@ lba_driver_probe(struct parisc_device *dev)
return -ENODEV; return -ENODEV;
} }
/* /* Tell I/O SAPIC driver we have a IRQ handler/region. */
** Tell I/O SAPIC driver we have a IRQ handler/region.
*/
tmp_obj = iosapic_register(dev->hpa.start + LBA_IOSAPIC_BASE); tmp_obj = iosapic_register(dev->hpa.start + LBA_IOSAPIC_BASE);
/* NOTE: PCI devices (e.g. 103c:1005 graphics card) which don't /* NOTE: PCI devices (e.g. 103c:1005 graphics card) which don't
...@@ -1529,16 +1534,17 @@ lba_driver_probe(struct parisc_device *dev) ...@@ -1529,16 +1534,17 @@ lba_driver_probe(struct parisc_device *dev)
lba_legacy_resources(dev, lba_dev); lba_legacy_resources(dev, lba_dev);
} }
/* if (lba_dev->hba.bus_num.start < lba_next_bus)
** Tell PCI support another PCI bus was found. lba_dev->hba.bus_num.start = lba_next_bus;
** Walks PCI bus for us too.
*/
dev->dev.platform_data = lba_dev; dev->dev.platform_data = lba_dev;
lba_bus = lba_dev->hba.hba_bus = lba_bus = lba_dev->hba.hba_bus =
pci_scan_bus_parented(&dev->dev, lba_dev->hba.bus_num.start, pci_scan_bus_parented(&dev->dev, lba_dev->hba.bus_num.start,
cfg_ops, NULL); cfg_ops, NULL);
if (lba_bus) if (lba_bus) {
lba_next_bus = lba_bus->subordinate + 1;
pci_bus_add_devices(lba_bus); pci_bus_add_devices(lba_bus);
}
/* This is in lieu of calling pci_assign_unassigned_resources() */ /* This is in lieu of calling pci_assign_unassigned_resources() */
if (is_pdc_pat()) { if (is_pdc_pat()) {
......
...@@ -66,8 +66,8 @@ static char lcd_text_default[32] __read_mostly; ...@@ -66,8 +66,8 @@ static char lcd_text_default[32] __read_mostly;
static struct workqueue_struct *led_wq; static struct workqueue_struct *led_wq;
static void led_work_func(void *); static void led_work_func(struct work_struct *);
static DECLARE_WORK(led_task, led_work_func, NULL); static DECLARE_DELAYED_WORK(led_task, led_work_func);
#if 0 #if 0
#define DPRINTK(x) printk x #define DPRINTK(x) printk x
...@@ -136,7 +136,7 @@ static int start_task(void) ...@@ -136,7 +136,7 @@ static int start_task(void)
/* Create the work queue and queue the LED task */ /* Create the work queue and queue the LED task */
led_wq = create_singlethread_workqueue("led_wq"); led_wq = create_singlethread_workqueue("led_wq");
queue_work(led_wq, &led_task); queue_delayed_work(led_wq, &led_task, 0);
return 0; return 0;
} }
...@@ -443,7 +443,7 @@ static __inline__ int led_get_diskio_activity(void) ...@@ -443,7 +443,7 @@ static __inline__ int led_get_diskio_activity(void)
#define LED_UPDATE_INTERVAL (1 + (HZ*19/1000)) #define LED_UPDATE_INTERVAL (1 + (HZ*19/1000))
static void led_work_func (void *unused) static void led_work_func (struct work_struct *unused)
{ {
static unsigned long last_jiffies; static unsigned long last_jiffies;
static unsigned long count_HZ; /* counter in range 0..HZ */ static unsigned long count_HZ; /* counter in range 0..HZ */
...@@ -590,7 +590,7 @@ int __init register_led_driver(int model, unsigned long cmd_reg, unsigned long d ...@@ -590,7 +590,7 @@ int __init register_led_driver(int model, unsigned long cmd_reg, unsigned long d
/* Ensure the work is queued */ /* Ensure the work is queued */
if (led_wq) { if (led_wq) {
queue_work(led_wq, &led_task); queue_delayed_work(led_wq, &led_task, 0);
} }
return 0; return 0;
...@@ -660,7 +660,7 @@ int lcd_print( char *str ) ...@@ -660,7 +660,7 @@ int lcd_print( char *str )
/* re-queue the work */ /* re-queue the work */
if (led_wq) { if (led_wq) {
queue_work(led_wq, &led_task); queue_delayed_work(led_wq, &led_task, 0);
} }
return lcd_info.lcd_width; return lcd_info.lcd_width;
......
...@@ -82,7 +82,7 @@ ...@@ -82,7 +82,7 @@
} ) } )
static void deferred_poweroff(void *dummy) static void deferred_poweroff(struct work_struct *unused)
{ {
if (kill_cad_pid(SIGINT, 1)) { if (kill_cad_pid(SIGINT, 1)) {
/* just in case killing init process failed */ /* just in case killing init process failed */
...@@ -96,7 +96,7 @@ static void deferred_poweroff(void *dummy) ...@@ -96,7 +96,7 @@ static void deferred_poweroff(void *dummy)
* use schedule_work(). * use schedule_work().
*/ */
static DECLARE_WORK(poweroff_work, deferred_poweroff, NULL); static DECLARE_WORK(poweroff_work, deferred_poweroff);
static void poweroff(void) static void poweroff(void)
{ {
......
...@@ -109,7 +109,7 @@ static unsigned long piranha_bad_128k = 0; ...@@ -109,7 +109,7 @@ static unsigned long piranha_bad_128k = 0;
#ifdef SBA_AGP_SUPPORT #ifdef SBA_AGP_SUPPORT
static int sba_reserve_agpgart = 1; static int sba_reserve_agpgart = 1;
module_param(sba_reserve_agpgart, int, 1); module_param(sba_reserve_agpgart, int, 0444);
MODULE_PARM_DESC(sba_reserve_agpgart, "Reserve half of IO pdir as AGPGART"); MODULE_PARM_DESC(sba_reserve_agpgart, "Reserve half of IO pdir as AGPGART");
#endif #endif
...@@ -846,7 +846,7 @@ static void *sba_alloc_consistent(struct device *hwdev, size_t size, ...@@ -846,7 +846,7 @@ static void *sba_alloc_consistent(struct device *hwdev, size_t size,
if (!hwdev) { if (!hwdev) {
/* only support PCI */ /* only support PCI */
*dma_handle = 0; *dma_handle = 0;
return 0; return NULL;
} }
ret = (void *) __get_free_pages(gfp, get_order(size)); ret = (void *) __get_free_pages(gfp, get_order(size));
......
...@@ -51,7 +51,11 @@ ...@@ -51,7 +51,11 @@
#define MUX_NR 256 #define MUX_NR 256
static unsigned int port_cnt __read_mostly; static unsigned int port_cnt __read_mostly;
static struct uart_port mux_ports[MUX_NR]; struct mux_port {
struct uart_port port;
int enabled;
};
static struct mux_port mux_ports[MUX_NR];
static struct uart_driver mux_driver = { static struct uart_driver mux_driver = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
...@@ -66,7 +70,36 @@ static struct timer_list mux_timer; ...@@ -66,7 +70,36 @@ static struct timer_list mux_timer;
#define UART_PUT_CHAR(p, c) __raw_writel((c), (p)->membase + IO_DATA_REG_OFFSET) #define UART_PUT_CHAR(p, c) __raw_writel((c), (p)->membase + IO_DATA_REG_OFFSET)
#define UART_GET_FIFO_CNT(p) __raw_readl((p)->membase + IO_DCOUNT_REG_OFFSET) #define UART_GET_FIFO_CNT(p) __raw_readl((p)->membase + IO_DCOUNT_REG_OFFSET)
#define GET_MUX_PORTS(iodc_data) ((((iodc_data)[4] & 0xf0) >> 4) * 8) + 8
/**
* get_mux_port_count - Get the number of available ports on the Mux.
* @dev: The parisc device.
*
* This function is used to determine the number of ports the Mux
* supports. The IODC data reports the number of ports the Mux
* can support, but there are cases where not all the Mux ports
* are connected. This function can override the IODC and
* return the true port count.
*/
static int __init get_mux_port_count(struct parisc_device *dev)
{
int status;
u8 iodc_data[32];
unsigned long bytecnt;
/* If this is the built-in Mux for the K-Class (Eole CAP/MUX),
* we only need to allocate resources for 1 port since the
* other 7 ports are not connected.
*/
if(dev->id.hversion == 0x15)
return 1;
status = pdc_iodc_read(&bytecnt, dev->hpa.start, 0, iodc_data, 32);
BUG_ON(status != PDC_OK);
/* Return the number of ports specified in the iodc data. */
return ((((iodc_data)[4] & 0xf0) >> 4) * 8) + 8;
}
/** /**
* mux_tx_empty - Check if the transmitter fifo is empty. * mux_tx_empty - Check if the transmitter fifo is empty.
...@@ -250,7 +283,7 @@ static void mux_read(struct uart_port *port) ...@@ -250,7 +283,7 @@ static void mux_read(struct uart_port *port)
*/ */
static int mux_startup(struct uart_port *port) static int mux_startup(struct uart_port *port)
{ {
mod_timer(&mux_timer, jiffies + MUX_POLL_DELAY); mux_ports[port->line].enabled = 1;
return 0; return 0;
} }
...@@ -262,6 +295,7 @@ static int mux_startup(struct uart_port *port) ...@@ -262,6 +295,7 @@ static int mux_startup(struct uart_port *port)
*/ */
static void mux_shutdown(struct uart_port *port) static void mux_shutdown(struct uart_port *port)
{ {
mux_ports[port->line].enabled = 0;
} }
/** /**
...@@ -319,7 +353,7 @@ static int mux_request_port(struct uart_port *port) ...@@ -319,7 +353,7 @@ static int mux_request_port(struct uart_port *port)
* @port: Ptr to the uart_port. * @port: Ptr to the uart_port.
* @type: Bitmask of required configurations. * @type: Bitmask of required configurations.
* *
* Perform any autoconfiguration steps for the port. This functino is * Perform any autoconfiguration steps for the port. This function is
* called if the UPF_BOOT_AUTOCONF flag is specified for the port. * called if the UPF_BOOT_AUTOCONF flag is specified for the port.
* [Note: This is required for now because of a bug in the Serial core. * [Note: This is required for now because of a bug in the Serial core.
* rmk has already submitted a patch to linus, should be available for * rmk has already submitted a patch to linus, should be available for
...@@ -357,11 +391,11 @@ static void mux_poll(unsigned long unused) ...@@ -357,11 +391,11 @@ static void mux_poll(unsigned long unused)
int i; int i;
for(i = 0; i < port_cnt; ++i) { for(i = 0; i < port_cnt; ++i) {
if(!mux_ports[i].info) if(!mux_ports[i].enabled)
continue; continue;
mux_read(&mux_ports[i]); mux_read(&mux_ports[i].port);
mux_write(&mux_ports[i]); mux_write(&mux_ports[i].port);
} }
mod_timer(&mux_timer, jiffies + MUX_POLL_DELAY); mod_timer(&mux_timer, jiffies + MUX_POLL_DELAY);
...@@ -371,8 +405,17 @@ static void mux_poll(unsigned long unused) ...@@ -371,8 +405,17 @@ static void mux_poll(unsigned long unused)
#ifdef CONFIG_SERIAL_MUX_CONSOLE #ifdef CONFIG_SERIAL_MUX_CONSOLE
static void mux_console_write(struct console *co, const char *s, unsigned count) static void mux_console_write(struct console *co, const char *s, unsigned count)
{ {
while(count--) /* Wait until the FIFO drains. */
pdc_iodc_putc(*s++); while(UART_GET_FIFO_CNT(&mux_ports[0].port))
udelay(1);
while(count--) {
if(*s == '\n') {
UART_PUT_CHAR(&mux_ports[0].port, '\r');
}
UART_PUT_CHAR(&mux_ports[0].port, *s++);
}
} }
static int mux_console_setup(struct console *co, char *options) static int mux_console_setup(struct console *co, char *options)
...@@ -428,19 +471,14 @@ static struct uart_ops mux_pops = { ...@@ -428,19 +471,14 @@ static struct uart_ops mux_pops = {
*/ */
static int __init mux_probe(struct parisc_device *dev) static int __init mux_probe(struct parisc_device *dev)
{ {
int i, status, ports; int i, status;
u8 iodc_data[32];
unsigned long bytecnt;
struct uart_port *port;
status = pdc_iodc_read(&bytecnt, dev->hpa.start, 0, iodc_data, 32); int port_count = get_mux_port_count(dev);
if(status != PDC_OK) { printk(KERN_INFO "Serial mux driver (%d ports) Revision: 0.6\n", port_count);
printk(KERN_ERR "Serial mux: Unable to read IODC.\n");
return 1;
}
ports = GET_MUX_PORTS(iodc_data); dev_set_drvdata(&dev->dev, (void *)(long)port_count);
printk(KERN_INFO "Serial mux driver (%d ports) Revision: 0.3\n", ports); request_mem_region(dev->hpa.start + MUX_OFFSET,
port_count * MUX_LINE_OFFSET, "Mux");
if(!port_cnt) { if(!port_cnt) {
mux_driver.cons = MUX_CONSOLE; mux_driver.cons = MUX_CONSOLE;
...@@ -450,13 +488,10 @@ static int __init mux_probe(struct parisc_device *dev) ...@@ -450,13 +488,10 @@ static int __init mux_probe(struct parisc_device *dev)
printk(KERN_ERR "Serial mux: Unable to register driver.\n"); printk(KERN_ERR "Serial mux: Unable to register driver.\n");
return 1; return 1;
} }
init_timer(&mux_timer);
mux_timer.function = mux_poll;
} }
for(i = 0; i < ports; ++i, ++port_cnt) { for(i = 0; i < port_count; ++i, ++port_cnt) {
port = &mux_ports[port_cnt]; struct uart_port *port = &mux_ports[port_cnt].port;
port->iobase = 0; port->iobase = 0;
port->mapbase = dev->hpa.start + MUX_OFFSET + port->mapbase = dev->hpa.start + MUX_OFFSET +
(i * MUX_LINE_OFFSET); (i * MUX_LINE_OFFSET);
...@@ -477,27 +512,73 @@ static int __init mux_probe(struct parisc_device *dev) ...@@ -477,27 +512,73 @@ static int __init mux_probe(struct parisc_device *dev)
*/ */
port->timeout = HZ / 50; port->timeout = HZ / 50;
spin_lock_init(&port->lock); spin_lock_init(&port->lock);
status = uart_add_one_port(&mux_driver, port); status = uart_add_one_port(&mux_driver, port);
BUG_ON(status); BUG_ON(status);
} }
#ifdef CONFIG_SERIAL_MUX_CONSOLE
register_console(&mux_console);
#endif
return 0; return 0;
} }
static int __devexit mux_remove(struct parisc_device *dev)
{
int i, j;
int port_count = (long)dev_get_drvdata(&dev->dev);
/* Find Port 0 for this card in the mux_ports list. */
for(i = 0; i < port_cnt; ++i) {
if(mux_ports[i].port.mapbase == dev->hpa.start + MUX_OFFSET)
break;
}
BUG_ON(i + port_count > port_cnt);
/* Release the resources associated with each port on the device. */
for(j = 0; j < port_count; ++j, ++i) {
struct uart_port *port = &mux_ports[i].port;
uart_remove_one_port(&mux_driver, port);
if(port->membase)
iounmap(port->membase);
}
release_mem_region(dev->hpa.start + MUX_OFFSET, port_count * MUX_LINE_OFFSET);
return 0;
}
/* Hack. This idea was taken from the 8250_gsc.c on how to properly order
* the serial port detection in the proper order. The idea is we always
* want the builtin mux to be detected before addin mux cards, so we
* specifically probe for the builtin mux cards first.
*
* This table only contains the parisc_device_id of known builtin mux
* devices. All other mux cards will be detected by the generic mux_tbl.
*/
static struct parisc_device_id builtin_mux_tbl[] = {
{ HPHW_A_DIRECT, HVERSION_REV_ANY_ID, 0x15, 0x0000D }, /* All K-class */
{ HPHW_A_DIRECT, HVERSION_REV_ANY_ID, 0x44, 0x0000D }, /* E35, E45, and E55 */
{ 0, }
};
static struct parisc_device_id mux_tbl[] = { static struct parisc_device_id mux_tbl[] = {
{ HPHW_A_DIRECT, HVERSION_REV_ANY_ID, HVERSION_ANY_ID, 0x0000D }, { HPHW_A_DIRECT, HVERSION_REV_ANY_ID, HVERSION_ANY_ID, 0x0000D },
{ 0, } { 0, }
}; };
MODULE_DEVICE_TABLE(parisc, builtin_mux_tbl);
MODULE_DEVICE_TABLE(parisc, mux_tbl); MODULE_DEVICE_TABLE(parisc, mux_tbl);
static struct parisc_driver builtin_serial_mux_driver = {
.name = "builtin_serial_mux",
.id_table = builtin_mux_tbl,
.probe = mux_probe,
.remove = __devexit_p(mux_remove),
};
static struct parisc_driver serial_mux_driver = { static struct parisc_driver serial_mux_driver = {
.name = "serial_mux", .name = "serial_mux",
.id_table = mux_tbl, .id_table = mux_tbl,
.probe = mux_probe, .probe = mux_probe,
.remove = __devexit_p(mux_remove),
}; };
/** /**
...@@ -507,7 +588,21 @@ static struct parisc_driver serial_mux_driver = { ...@@ -507,7 +588,21 @@ static struct parisc_driver serial_mux_driver = {
*/ */
static int __init mux_init(void) static int __init mux_init(void)
{ {
return register_parisc_driver(&serial_mux_driver); register_parisc_driver(&builtin_serial_mux_driver);
register_parisc_driver(&serial_mux_driver);
if(port_cnt > 0) {
/* Start the Mux timer */
init_timer(&mux_timer);
mux_timer.function = mux_poll;
mod_timer(&mux_timer, jiffies + MUX_POLL_DELAY);
#ifdef CONFIG_SERIAL_MUX_CONSOLE
register_console(&mux_console);
#endif
}
return 0;
} }
/** /**
...@@ -517,14 +612,16 @@ static int __init mux_init(void) ...@@ -517,14 +612,16 @@ static int __init mux_init(void)
*/ */
static void __exit mux_exit(void) static void __exit mux_exit(void)
{ {
int i; /* Delete the Mux timer. */
if(port_cnt > 0) {
for (i = 0; i < port_cnt; i++) { del_timer(&mux_timer);
uart_remove_one_port(&mux_driver, &mux_ports[i]); #ifdef CONFIG_SERIAL_MUX_CONSOLE
if (mux_ports[i].membase) unregister_console(&mux_console);
iounmap(mux_ports[i].membase); #endif
} }
unregister_parisc_driver(&builtin_serial_mux_driver);
unregister_parisc_driver(&serial_mux_driver);
uart_unregister_driver(&mux_driver); uart_unregister_driver(&mux_driver);
} }
......
...@@ -236,7 +236,7 @@ int ccio_allocate_resource(const struct parisc_device *dev, ...@@ -236,7 +236,7 @@ int ccio_allocate_resource(const struct parisc_device *dev,
unsigned long min, unsigned long max, unsigned long align); unsigned long min, unsigned long max, unsigned long align);
#else /* !CONFIG_IOMMU_CCIO */ #else /* !CONFIG_IOMMU_CCIO */
#define ccio_get_iommu(dev) NULL #define ccio_get_iommu(dev) NULL
#define ccio_request_resource(dev, res) request_resource(&iomem_resource, res) #define ccio_request_resource(dev, res) insert_resource(&iomem_resource, res)
#define ccio_allocate_resource(dev, res, size, min, max, align) \ #define ccio_allocate_resource(dev, res, size, min, max, align) \
allocate_resource(&iomem_resource, res, size, min, max, \ allocate_resource(&iomem_resource, res, size, min, max, \
align, NULL, NULL) align, NULL, NULL)
......
...@@ -127,7 +127,11 @@ extern int npmem_ranges; ...@@ -127,7 +127,11 @@ extern int npmem_ranges;
/* This governs the relationship between virtual and physical addresses. /* This governs the relationship between virtual and physical addresses.
* If you alter it, make sure to take care of our various fixed mapping * If you alter it, make sure to take care of our various fixed mapping
* segments in fixmap.h */ * segments in fixmap.h */
#define __PAGE_OFFSET (0x10000000) #ifdef CONFIG_64BIT
#define __PAGE_OFFSET (0x40000000) /* 1GB */
#else
#define __PAGE_OFFSET (0x10000000) /* 256MB */
#endif
#define PAGE_OFFSET ((unsigned long)__PAGE_OFFSET) #define PAGE_OFFSET ((unsigned long)__PAGE_OFFSET)
......
...@@ -250,7 +250,7 @@ struct pdc_pat_pd_addr_map_entry { ...@@ -250,7 +250,7 @@ struct pdc_pat_pd_addr_map_entry {
#define PAT_GET_ENTITY(value) (((value) >> 56) & 0xffUL) #define PAT_GET_ENTITY(value) (((value) >> 56) & 0xffUL)
#define PAT_GET_DVI(value) (((value) >> 48) & 0xffUL) #define PAT_GET_DVI(value) (((value) >> 48) & 0xffUL)
#define PAT_GET_IOC(value) (((value) >> 40) & 0xffUL) #define PAT_GET_IOC(value) (((value) >> 40) & 0xffUL)
#define PAT_GET_MOD_PAGES(value)(((value) & 0xffffffUL) #define PAT_GET_MOD_PAGES(value) ((value) & 0xffffffUL)
/* /*
...@@ -303,35 +303,6 @@ extern int pdc_pat_io_pci_cfg_write(unsigned long pci_addr, int pci_size, u32 va ...@@ -303,35 +303,6 @@ extern int pdc_pat_io_pci_cfg_write(unsigned long pci_addr, int pci_size, u32 va
*/ */
extern int pdc_pat; /* arch/parisc/kernel/inventory.c */ extern int pdc_pat; /* arch/parisc/kernel/inventory.c */
/********************************************************************
* PDC_PAT_CELL[Return Cell Module] memaddr[0] conf_base_addr
* ----------------------------------------------------------
* Bit 0 to 51 - conf_base_addr
* Bit 52 to 62 - reserved
* Bit 63 - endianess bit
********************************************************************/
#define PAT_GET_CBA(value) ((value) & 0xfffffffffffff000UL)
/********************************************************************
* PDC_PAT_CELL[Return Cell Module] memaddr[1] mod_info
* ----------------------------------------------------
* Bit 0 to 7 - entity type
* 0 = central agent, 1 = processor,
* 2 = memory controller, 3 = system bus adapter,
* 4 = local bus adapter, 5 = processor bus converter,
* 6 = crossbar fabric connect, 7 = fabric interconnect,
* 8 to 254 reserved, 255 = unknown.
* Bit 8 to 15 - DVI
* Bit 16 to 23 - IOC functions
* Bit 24 to 39 - reserved
* Bit 40 to 63 - mod_pages
* number of 4K pages a module occupies starting at conf_base_addr
********************************************************************/
#define PAT_GET_ENTITY(value) (((value) >> 56) & 0xffUL)
#define PAT_GET_DVI(value) (((value) >> 48) & 0xffUL)
#define PAT_GET_IOC(value) (((value) >> 40) & 0xffUL)
#define PAT_GET_MOD_PAGES(value)(((value) & 0xffffffUL)
#endif /* __ASSEMBLY__ */ #endif /* __ASSEMBLY__ */
#endif /* ! __PARISC_PATPDC_H */ #endif /* ! __PARISC_PATPDC_H */
...@@ -87,7 +87,6 @@ struct cpuinfo_parisc { ...@@ -87,7 +87,6 @@ struct cpuinfo_parisc {
unsigned long hpa; /* Host Physical address */ unsigned long hpa; /* Host Physical address */
unsigned long txn_addr; /* MMIO addr of EIR or id_eid */ unsigned long txn_addr; /* MMIO addr of EIR or id_eid */
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
spinlock_t lock; /* synchronization for ipi's */
unsigned long pending_ipi; /* bitmap of type ipi_message_type */ unsigned long pending_ipi; /* bitmap of type ipi_message_type */
unsigned long ipi_count; /* number ipi Interrupts */ unsigned long ipi_count; /* number ipi Interrupts */
#endif #endif
......
...@@ -30,11 +30,11 @@ struct statfs { ...@@ -30,11 +30,11 @@ struct statfs {
struct statfs64 { struct statfs64 {
long f_type; long f_type;
long f_bsize; long f_bsize;
u64 f_blocks; __u64 f_blocks;
u64 f_bfree; __u64 f_bfree;
u64 f_bavail; __u64 f_bavail;
u64 f_files; __u64 f_files;
u64 f_ffree; __u64 f_ffree;
__kernel_fsid_t f_fsid; __kernel_fsid_t f_fsid;
long f_namelen; long f_namelen;
long f_frsize; long f_frsize;
......
...@@ -933,7 +933,7 @@ static int init_section_ref_ok(const char *name) ...@@ -933,7 +933,7 @@ static int init_section_ref_ok(const char *name)
".opd", /* see comment [OPD] at exit_section_ref_ok() */ ".opd", /* see comment [OPD] at exit_section_ref_ok() */
".toc1", /* used by ppc64 */ ".toc1", /* used by ppc64 */
".stab", ".stab",
".rodata", ".data.rel.ro", /* used by parisc64 */
".parainstructions", ".parainstructions",
".text.lock", ".text.lock",
"__bug_table", /* used by powerpc for BUG() */ "__bug_table", /* used by powerpc for BUG() */
...@@ -956,6 +956,7 @@ static int init_section_ref_ok(const char *name) ...@@ -956,6 +956,7 @@ static int init_section_ref_ok(const char *name)
".eh_frame", ".eh_frame",
".debug", ".debug",
".parainstructions", ".parainstructions",
".rodata",
NULL NULL
}; };
/* part of section name */ /* part of section name */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册