diff options
author | Ralf Baechle <ralf@linux-mips.org> | 2000-02-23 00:40:54 +0000 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2000-02-23 00:40:54 +0000 |
commit | 529c593ece216e4aaffd36bd940cb94f1fa63129 (patch) | |
tree | 78f1c0b805f5656aa7b0417a043c5346f700a2cf /arch/sparc64/kernel | |
parent | 0bd079751d25808d1972baee5c4eaa1db2227257 (diff) |
Merge with 2.3.43. I did ignore all modifications to the qlogicisp.c
driver due to the Origin A64 hacks.
Diffstat (limited to 'arch/sparc64/kernel')
-rw-r--r-- | arch/sparc64/kernel/Makefile | 8 | ||||
-rw-r--r-- | arch/sparc64/kernel/ioctl32.c | 277 | ||||
-rw-r--r-- | arch/sparc64/kernel/irq.c | 29 | ||||
-rw-r--r-- | arch/sparc64/kernel/pci.c | 7 | ||||
-rw-r--r-- | arch/sparc64/kernel/pci_impl.h | 17 | ||||
-rw-r--r-- | arch/sparc64/kernel/pci_psycho.c | 111 | ||||
-rw-r--r-- | arch/sparc64/kernel/pci_sabre.c | 110 | ||||
-rw-r--r-- | arch/sparc64/kernel/rtrap.S | 20 | ||||
-rw-r--r-- | arch/sparc64/kernel/sparc64_ksyms.c | 17 |
9 files changed, 302 insertions, 294 deletions
diff --git a/arch/sparc64/kernel/Makefile b/arch/sparc64/kernel/Makefile index c84f5872e..f06ece682 100644 --- a/arch/sparc64/kernel/Makefile +++ b/arch/sparc64/kernel/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.50 1999/12/21 04:02:24 davem Exp $ +# $Id: Makefile,v 1.51 2000/02/08 05:11:31 jj Exp $ # Makefile for the linux kernel. # # Note! Dependencies are done automagically by 'make dep', which also @@ -19,13 +19,13 @@ O_TARGET := kernel.o O_OBJS := process.o setup.o cpu.o idprom.o \ traps.o devices.o auxio.o \ irq.o ptrace.o time.o sys_sparc.o signal.o \ - unaligned.o central.o pci.o pci_common.o pci_iommu.o \ - pci_psycho.o pci_sabre.o starfire.o semaphore.o \ + unaligned.o central.o pci.o starfire.o semaphore.o \ power.o sbus.o iommu_common.o OX_OBJS := sparc64_ksyms.o ifdef CONFIG_PCI - O_OBJS += ebus.o + O_OBJS += ebus.o pci_common.o pci_iommu.o \ + pci_psycho.o pci_sabre.o endif ifdef CONFIG_SUNOS_EMUL diff --git a/arch/sparc64/kernel/ioctl32.c b/arch/sparc64/kernel/ioctl32.c index d51e36f61..04a5b6f7f 100644 --- a/arch/sparc64/kernel/ioctl32.c +++ b/arch/sparc64/kernel/ioctl32.c @@ -1,4 +1,4 @@ -/* $Id: ioctl32.c,v 1.76 2000/01/31 21:10:15 davem Exp $ +/* $Id: ioctl32.c,v 1.79 2000/02/08 20:24:25 davem Exp $ * ioctl32.c: Conversion between 32bit and 64bit native ioctls. * * Copyright (C) 1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz) @@ -17,7 +17,9 @@ #include <linux/if.h> #include <linux/malloc.h> #include <linux/hdreg.h> +#if 0 /* New RAID code is half-merged... -DaveM */ #include <linux/md.h> +#endif #include <linux/kd.h> #include <linux/route.h> #include <linux/skbuff.h> @@ -61,6 +63,18 @@ #include <linux/soundcard.h> +#include <linux/atm.h> +#include <linux/atmarp.h> +#include <linux/atmclip.h> +#include <linux/atmdev.h> +#include <linux/atmioc.h> +#include <linux/atmlec.h> +#include <linux/atmmpc.h> +#include <linux/atmsvc.h> +#include <linux/atm_tcp.h> +#include <linux/sonet.h> +#include <linux/atm_suni.h> + /* Use this to get at 32-bit user passed pointers. See sys_sparc32.c for description about these. */ #define A(__x) ((unsigned long)(__x)) @@ -1753,6 +1767,217 @@ static int do_smb_getmountuid(unsigned int fd, unsigned int cmd, unsigned long a return err; } +struct atmif_sioc32 { + int number; + int length; + __kernel_caddr_t32 arg; +}; + +struct atm_iobuf32 { + int length; + __kernel_caddr_t32 buffer; +}; + +#define ATM_GETLINKRATE32 _IOW('a', ATMIOC_ITF+1, struct atmif_sioc32) +#define ATM_GETNAMES32 _IOW('a', ATMIOC_ITF+3, struct atm_iobuf32) +#define ATM_GETTYPE32 _IOW('a', ATMIOC_ITF+4, struct atmif_sioc32) +#define ATM_GETESI32 _IOW('a', ATMIOC_ITF+5, struct atmif_sioc32) +#define ATM_GETADDR32 _IOW('a', ATMIOC_ITF+6, struct atmif_sioc32) +#define ATM_RSTADDR32 _IOW('a', ATMIOC_ITF+7, struct atmif_sioc32) +#define ATM_ADDADDR32 _IOW('a', ATMIOC_ITF+8, struct atmif_sioc32) +#define ATM_DELADDR32 _IOW('a', ATMIOC_ITF+9, struct atmif_sioc32) +#define ATM_GETCIRANGE32 _IOW('a', ATMIOC_ITF+10, struct atmif_sioc32) +#define ATM_SETCIRANGE32 _IOW('a', ATMIOC_ITF+11, struct atmif_sioc32) +#define ATM_SETESI32 _IOW('a', ATMIOC_ITF+12, struct atmif_sioc32) +#define ATM_SETESIF32 _IOW('a', ATMIOC_ITF+13, struct atmif_sioc32) +#define ATM_GETSTAT32 _IOW('a', ATMIOC_SARCOM+0, struct atmif_sioc32) +#define ATM_GETSTATZ32 _IOW('a', ATMIOC_SARCOM+1, struct atmif_sioc32) + +static struct { + unsigned int cmd32; + unsigned int cmd; +} atm_ioctl_map[] = { + { ATM_GETLINKRATE32, ATM_GETLINKRATE }, + { ATM_GETNAMES32, ATM_GETNAMES }, + { ATM_GETTYPE32, ATM_GETTYPE }, + { ATM_GETESI32, ATM_GETESI }, + { ATM_GETADDR32, ATM_GETADDR }, + { ATM_RSTADDR32, ATM_RSTADDR }, + { ATM_ADDADDR32, ATM_ADDADDR }, + { ATM_DELADDR32, ATM_DELADDR }, + { ATM_GETCIRANGE32, ATM_GETCIRANGE }, + { ATM_SETCIRANGE32, ATM_SETCIRANGE }, + { ATM_SETESI32, ATM_SETESI }, + { ATM_SETESIF32, ATM_SETESIF }, + { ATM_GETSTAT32, ATM_GETSTAT }, + { ATM_GETSTATZ32, ATM_GETSTATZ } +}; + +#define NR_ATM_IOCTL (sizeof(atm_ioctl_map)/sizeof(atm_ioctl_map[0])) + + +static int do_atm_iobuf(unsigned int fd, unsigned int cmd, unsigned long arg) +{ + struct atm_iobuf32 iobuf32; + struct atm_iobuf iobuf = { 0, NULL }; + mm_segment_t old_fs; + int err; + + err = copy_from_user(&iobuf32, (struct atm_iobuf32*)arg, + sizeof(struct atm_iobuf32)); + if (err) + return -EFAULT; + + iobuf.length = iobuf32.length; + + if (iobuf32.buffer == (__kernel_caddr_t32) NULL || iobuf32.length == 0) { + iobuf.buffer = (void*)(unsigned long)iobuf32.buffer; + } else { + iobuf.buffer = kmalloc(iobuf.length, GFP_KERNEL); + if (iobuf.buffer == NULL) { + err = -ENOMEM; + goto out; + } + + err = copy_from_user(iobuf.buffer, A(iobuf32.buffer), iobuf.length); + if (err) { + err = -EFAULT; + goto out; + } + } + + old_fs = get_fs(); set_fs (KERNEL_DS); + err = sys_ioctl (fd, cmd, (unsigned long)&iobuf); + set_fs (old_fs); + if(err) + goto out; + + if(iobuf.buffer && iobuf.length > 0) { + err = copy_to_user(A(iobuf32.buffer), iobuf.buffer, iobuf.length); + if (err) { + err = -EFAULT; + goto out; + } + } + err = __put_user(iobuf.length, &(((struct atm_iobuf32*)arg)->length)); + + out: + if(iobuf32.buffer && iobuf32.length > 0) + kfree(iobuf.buffer); + + return err; +} + + +static int do_atmif_sioc(unsigned int fd, unsigned int cmd, unsigned long arg) +{ + struct atmif_sioc32 sioc32; + struct atmif_sioc sioc = { 0, 0, NULL }; + mm_segment_t old_fs; + int err; + + err = copy_from_user(&sioc32, (struct atmif_sioc32*)arg, + sizeof(struct atmif_sioc32)); + if (err) + return -EFAULT; + + sioc.number = sioc32.number; + sioc.length = sioc32.length; + + if (sioc32.arg == (__kernel_caddr_t32) NULL || sioc32.length == 0) { + sioc.arg = (void*)(unsigned long)sioc32.arg; + } else { + sioc.arg = kmalloc(sioc.length, GFP_KERNEL); + if (sioc.arg == NULL) { + err = -ENOMEM; + goto out; + } + + err = copy_from_user(sioc.arg, A(sioc32.arg), sioc32.length); + if (err) { + err = -EFAULT; + goto out; + } + } + + old_fs = get_fs(); set_fs (KERNEL_DS); + err = sys_ioctl (fd, cmd, (unsigned long)&sioc); + set_fs (old_fs); + if(err) { + goto out; + } + + if(sioc.arg && sioc.length > 0) { + err = copy_to_user(A(sioc32.arg), sioc.arg, sioc.length); + if (err) { + err = -EFAULT; + goto out; + } + } + err = __put_user(sioc.length, &(((struct atmif_sioc32*)arg)->length)); + + out: + if(sioc32.arg && sioc32.length > 0) + kfree(sioc.arg); + + return err; +} + + +static int do_atm_ioctl(unsigned int fd, unsigned int cmd32, unsigned long arg) +{ + int i; + unsigned int cmd = 0; + + switch (cmd32) { + case SUNI_GETLOOP: + case SUNI_SETLOOP: + case SONET_GETSTAT: + case SONET_GETSTATZ: + case SONET_GETDIAG: + case SONET_SETDIAG: + case SONET_CLRDIAG: + case SONET_SETFRAMING: + case SONET_GETFRAMING: + case SONET_GETFRSENSE: + return do_atmif_sioc(fd, cmd32, arg); + } + + if (cmd == 0) { + for (i = 0; i < NR_ATM_IOCTL; i++) { + if (cmd32 == atm_ioctl_map[i].cmd32) { + cmd = atm_ioctl_map[i].cmd; + break; + } + } + if (i == NR_ATM_IOCTL) { + return -EINVAL; + } + } + + switch (cmd) { + case ATM_GETNAMES: + return do_atm_iobuf(fd, cmd, arg); + + case ATM_GETLINKRATE: + case ATM_GETTYPE: + case ATM_GETESI: + case ATM_GETADDR: + case ATM_RSTADDR: + case ATM_ADDADDR: + case ATM_DELADDR: + case ATM_GETCIRANGE: + case ATM_SETCIRANGE: + case ATM_SETESI: + case ATM_SETESIF: + case ATM_GETSTAT: + case ATM_GETSTATZ: + return do_atmif_sioc(fd, cmd, arg); + } + + return -EINVAL; +} + asmlinkage int sys32_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg) { struct file * filp; @@ -1945,6 +2170,33 @@ asmlinkage int sys32_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg) error = do_smb_getmountuid(fd, cmd, arg); goto out; + case ATM_GETLINKRATE32: + case ATM_GETNAMES32: + case ATM_GETTYPE32: + case ATM_GETESI32: + case ATM_GETADDR32: + case ATM_RSTADDR32: + case ATM_ADDADDR32: + case ATM_DELADDR32: + case ATM_GETCIRANGE32: + case ATM_SETCIRANGE32: + case ATM_SETESI32: + case ATM_SETESIF32: + case ATM_GETSTAT32: + case ATM_GETSTATZ32: + case SUNI_GETLOOP: + case SUNI_SETLOOP: + case SONET_GETSTAT: + case SONET_GETSTATZ: + case SONET_GETDIAG: + case SONET_SETDIAG: + case SONET_CLRDIAG: + case SONET_SETFRAMING: + case SONET_GETFRAMING: + case SONET_GETFRSENSE: + error = do_atm_ioctl(fd, cmd, arg); + goto out; + /* List here exlicitly which ioctl's are known to have * compatable types passed or none at all... */ @@ -2062,12 +2314,16 @@ asmlinkage int sys32_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg) case BLKRRPART: case BLKFLSBUF: case BLKRASET: - + +#if 0 /* New RAID code is being merged, fix up to handle + * new RAID ioctls when fully merged in 2.3.x -DaveM + */ /* 0x09 */ case REGISTER_DEV: case REGISTER_DEV_NEW: case START_MD: case STOP_MD: +#endif /* Big K */ case PIO_FONT: @@ -2454,6 +2710,23 @@ asmlinkage int sys32_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg) /* SMB ioctls which do not need any translations */ case SMB_IOC_NEWCONN: + /* Little a */ + case ATMSIGD_CTRL: + case ATMARPD_CTRL: + case ATMLEC_CTRL: + case ATMLEC_MCAST: + case ATMLEC_DATA: + case ATM_SETSC: + case SIOCSIFATMTCP: + case SIOCMKCLIP: + case ATMARP_MKIP: + case ATMARP_SETENTRY: + case ATMARP_ENCAP: + case ATMTCP_CREATE: + case ATMTCP_REMOVE: + case ATMMPC_CTRL: + case ATMMPC_DATA: + error = sys_ioctl (fd, cmd, arg); goto out; diff --git a/arch/sparc64/kernel/irq.c b/arch/sparc64/kernel/irq.c index 820b93bb4..a09303971 100644 --- a/arch/sparc64/kernel/irq.c +++ b/arch/sparc64/kernel/irq.c @@ -1,4 +1,4 @@ -/* $Id: irq.c,v 1.81 2000/01/21 06:33:59 davem Exp $ +/* $Id: irq.c,v 1.82 2000/02/09 11:15:07 davem Exp $ * irq.c: UltraSparc IRQ handling/init/registry. * * Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu) @@ -11,6 +11,7 @@ #include <linux/errno.h> #include <linux/kernel_stat.h> #include <linux/signal.h> +#include <linux/mm.h> #include <linux/interrupt.h> #include <linux/malloc.h> #include <linux/random.h> /* XXX ADD add_foo_randomness() calls... -DaveM */ @@ -546,8 +547,6 @@ unsigned int local_bh_count; #define irq_enter(cpu, irq) (local_irq_count++) #define irq_exit(cpu, irq) (local_irq_count--) #else -atomic_t global_bh_lock = ATOMIC_INIT(0); -spinlock_t global_bh_count = SPIN_LOCK_UNLOCKED; /* Who has global_irq_lock. */ unsigned char global_irq_holder = NO_PROC_ID; @@ -573,24 +572,12 @@ static void show(char * str) atomic_read(&global_irq_count), cpu_data[0].irq_count, cpu_data[1].irq_count); printk("bh: %d [%u %u]\n", - (spin_is_locked(&global_bh_count) ? 1 : 0), + (spin_is_locked(&global_bh_lock) ? 1 : 0), cpu_data[0].bh_count, cpu_data[1].bh_count); } #define MAXCOUNT 100000000 -static inline void wait_on_bh(void) -{ - int count = MAXCOUNT; - do { - if(!--count) { - show("wait_on_bh"); - count = 0; - } - membar("#LoadLoad"); - } while(spin_is_locked(&global_bh_count)); -} - #define SYNC_OTHER_ULTRAS(x) udelay(x+1) static inline void wait_on_irq(int cpu) @@ -599,7 +586,7 @@ static inline void wait_on_irq(int cpu) for(;;) { membar("#LoadLoad"); if (!atomic_read (&global_irq_count)) { - if (local_bh_count || ! spin_is_locked(&global_bh_count)) + if (local_bh_count || ! spin_is_locked(&global_bh_lock)) break; } spin_unlock (&global_irq_lock); @@ -616,7 +603,7 @@ static inline void wait_on_irq(int cpu) continue; if (spin_is_locked (&global_irq_lock)) continue; - if (!local_bh_count && spin_is_locked (&global_bh_count)) + if (!local_bh_count && spin_is_locked (&global_bh_lock)) continue; if (spin_trylock(&global_irq_lock)) break; @@ -624,12 +611,6 @@ static inline void wait_on_irq(int cpu) } } -void synchronize_bh(void) -{ - if (spin_is_locked (&global_bh_count) && !in_interrupt()) - wait_on_bh(); -} - void synchronize_irq(void) { if (atomic_read(&global_irq_count)) { diff --git a/arch/sparc64/kernel/pci.c b/arch/sparc64/kernel/pci.c index 01fea4f59..3cf95bb86 100644 --- a/arch/sparc64/kernel/pci.c +++ b/arch/sparc64/kernel/pci.c @@ -1,4 +1,4 @@ -/* $Id: pci.c,v 1.14 2000/01/13 00:05:43 davem Exp $ +/* $Id: pci.c,v 1.15 2000/02/08 05:11:29 jj Exp $ * pci.c: UltraSparc PCI controller support. * * Copyright (C) 1997, 1998, 1999 David S. Miller (davem@redhat.com) @@ -20,11 +20,6 @@ #include <asm/irq.h> #include <asm/ebus.h> -#ifndef NEW_PCI_DMA_MAP -unsigned long pci_dvma_v2p_hash[PCI_DVMA_HASHSZ]; -unsigned long pci_dvma_p2v_hash[PCI_DVMA_HASHSZ]; -#endif - unsigned long pci_memspace_mask = 0xffffffffUL; #ifndef CONFIG_PCI diff --git a/arch/sparc64/kernel/pci_impl.h b/arch/sparc64/kernel/pci_impl.h index 12b6af71e..eeda574f7 100644 --- a/arch/sparc64/kernel/pci_impl.h +++ b/arch/sparc64/kernel/pci_impl.h @@ -1,4 +1,4 @@ -/* $Id: pci_impl.h,v 1.4 1999/12/17 12:32:03 jj Exp $ +/* $Id: pci_impl.h,v 1.5 2000/02/08 05:11:32 jj Exp $ * pci_impl.h: Helper definitions for PCI controller support. * * Copyright (C) 1999 David S. Miller (davem@redhat.com) @@ -34,21 +34,6 @@ extern void pci_scan_for_target_abort(struct pci_controller_info *, struct pci_p extern void pci_scan_for_master_abort(struct pci_controller_info *, struct pci_pbm_info *, struct pci_bus *); extern void pci_scan_for_parity_error(struct pci_controller_info *, struct pci_pbm_info *, struct pci_bus *); -#ifndef NEW_PCI_DMA_MAP -/* IOMMU/DVMA initialization. */ -#define PCI_DVMA_HASH_NONE ~0UL -static __inline__ void set_dvma_hash(unsigned long dvma_offset, - unsigned long paddr, - unsigned long daddr) -{ - unsigned long dvma_addr = dvma_offset + daddr; - unsigned long vaddr = (unsigned long)__va(paddr); - - pci_dvma_v2p_hash[pci_dvma_ahashfn(paddr)] = dvma_addr - vaddr; - pci_dvma_p2v_hash[pci_dvma_ahashfn(dvma_addr)] = vaddr - dvma_addr; -} -#endif - /* Configuration space access. */ extern spinlock_t pci_poke_lock; extern volatile int pci_poke_in_progress; diff --git a/arch/sparc64/kernel/pci_psycho.c b/arch/sparc64/kernel/pci_psycho.c index 1ff768056..c9bd41c19 100644 --- a/arch/sparc64/kernel/pci_psycho.c +++ b/arch/sparc64/kernel/pci_psycho.c @@ -1,4 +1,4 @@ -/* $Id: pci_psycho.c,v 1.10 2000/01/28 13:42:00 jj Exp $ +/* $Id: pci_psycho.c,v 1.11 2000/02/08 05:11:32 jj Exp $ * pci_psycho.c: PSYCHO/U2P specific PCI controller support. * * Copyright (C) 1997, 1998, 1999 David S. Miller (davem@caipfs.rutgers.edu) @@ -1219,12 +1219,6 @@ static void __init psycho_scan_bus(struct pci_controller_info *p) static void __init psycho_iommu_init(struct pci_controller_info *p) { -#ifndef NEW_PCI_DMA_MAP - struct linux_mlist_p1275 *mlist; - unsigned long n; - iopte_t *iopte; - int tsbsize = 32; -#endif extern int this_is_starfire; extern void *starfire_hookup(int); unsigned long tsbbase, i; @@ -1258,19 +1252,11 @@ static void __init psycho_iommu_init(struct pci_controller_info *p) control &= ~(PSYCHO_IOMMU_CTRL_DENAB); psycho_write(p->controller_regs + PSYCHO_IOMMU_CONTROL, control); -#ifndef NEW_PCI_DMA_MAP - /* Using assumed page size 64K with 32K entries we need 256KB iommu page - * table (32K ioptes * 8 bytes per iopte). This is - * page order 5 on UltraSparc. - */ - tsbbase = __get_free_pages(GFP_KERNEL, 5); -#else /* Using assumed page size 8K with 128K entries we need 1MB iommu page * table (128K ioptes * 8 bytes per iopte). This is * page order 7 on UltraSparc. */ tsbbase = __get_free_pages(GFP_KERNEL, 7); -#endif if (!tsbbase) { prom_printf("PSYCHO_IOMMU: Error, gfp(tsb) failed.\n"); prom_halt(); @@ -1278,112 +1264,17 @@ static void __init psycho_iommu_init(struct pci_controller_info *p) p->iommu.page_table = (iopte_t *)tsbbase; p->iommu.page_table_sz_bits = 17; p->iommu.page_table_map_base = 0xc0000000; -#ifndef NEW_PCI_DMA_MAP - memset((char *)tsbbase, 0, PAGE_SIZE << 5); -#else memset((char *)tsbbase, 0, PAGE_SIZE << 7); -#endif /* Make sure DMA address 0 is never returned just to allow catching of buggy drivers. */ p->iommu.lowest_free[0] = 1; -#ifndef NEW_PCI_DMA_MAP - iopte = (iopte_t *)tsbbase; - /* Initialize to "none" settings. */ - for(i = 0; i < PCI_DVMA_HASHSZ; i++) { - pci_dvma_v2p_hash[i] = PCI_DVMA_HASH_NONE; - pci_dvma_p2v_hash[i] = PCI_DVMA_HASH_NONE; - } - - n = 0; - mlist = *prom_meminfo()->p1275_totphys; - while (mlist) { - unsigned long paddr = mlist->start_adr; - unsigned long num_bytes = mlist->num_bytes; - - if(paddr >= (((unsigned long) high_memory) - PAGE_OFFSET)) - goto next; - - if((paddr + num_bytes) >= (((unsigned long) high_memory) - PAGE_OFFSET)) - num_bytes = (((unsigned long) high_memory) - PAGE_OFFSET) - paddr; - - /* Align base and length so we map whole hash table sized chunks - * at a time (and therefore full 64K IOMMU pages). - */ - paddr &= ~((1UL << 24UL) - 1); - num_bytes = (num_bytes + ((1UL << 24UL) - 1)) & ~((1UL << 24) - 1); - - /* Move up the base for mappings already created. */ - while(pci_dvma_v2p_hash[pci_dvma_ahashfn(paddr)] != - PCI_DVMA_HASH_NONE) { - paddr += (1UL << 24UL); - num_bytes -= (1UL << 24UL); - if(num_bytes == 0UL) - goto next; - } - - /* Move down the size for tail mappings already created. */ - while(pci_dvma_v2p_hash[pci_dvma_ahashfn(paddr + num_bytes - (1UL << 24UL))] != - PCI_DVMA_HASH_NONE) { - num_bytes -= (1UL << 24UL); - if(num_bytes == 0UL) - goto next; - } - - /* Now map the rest. */ - for (i = 0; i < ((num_bytes + ((1 << 16) - 1)) >> 16); i++) { - iopte_val(*iopte) = ((IOPTE_VALID | IOPTE_64K | - IOPTE_CACHE | IOPTE_WRITE) | - (paddr & IOPTE_PAGE)); - - if (!(n & 0xff)) - set_dvma_hash(0x80000000, paddr, (n << 16)); - - if (++n > (tsbsize * 1024)) - goto out; - - paddr += (1 << 16); - iopte++; - } - next: - mlist = mlist->theres_more; - } -out: - if (mlist) { - prom_printf("WARNING: not all physical memory mapped in IOMMU\n"); - prom_printf("Try booting with mem=xxxM or similar\n"); - prom_halt(); - } -#endif psycho_write(p->controller_regs + PSYCHO_IOMMU_TSBBASE, __pa(tsbbase)); control = psycho_read(p->controller_regs + PSYCHO_IOMMU_CONTROL); -#ifndef NEW_PCI_DMA_MAP - control &= ~(PSYCHO_IOMMU_CTRL_TSBSZ); - control |= (PSYCHO_IOMMU_CTRL_TBWSZ | PSYCHO_IOMMU_CTRL_ENAB); - switch(tsbsize) { - case 8: - p->iommu.page_table_map_base = 0xe0000000; - control |= PSYCHO_IOMMU_TSBSZ_8K; - break; - case 16: - p->iommu.page_table_map_base = 0xc0000000; - control |= PSYCHO_IOMMU_TSBSZ_16K; - break; - case 32: - p->iommu.page_table_map_base = 0x80000000; - control |= PSYCHO_IOMMU_TSBSZ_32K; - break; - default: - prom_printf("iommu_init: Illegal TSB size %d\n", tsbsize); - prom_halt(); - break; - } -#else control &= ~(PSYCHO_IOMMU_CTRL_TSBSZ | PSYCHO_IOMMU_CTRL_TBWSZ); control |= (PSYCHO_IOMMU_TSBSZ_128K | PSYCHO_IOMMU_CTRL_ENAB); -#endif psycho_write(p->controller_regs + PSYCHO_IOMMU_CONTROL, control); /* If necessary, hook us up for starfire IRQ translations. */ diff --git a/arch/sparc64/kernel/pci_sabre.c b/arch/sparc64/kernel/pci_sabre.c index 44247c371..bbf10cac1 100644 --- a/arch/sparc64/kernel/pci_sabre.c +++ b/arch/sparc64/kernel/pci_sabre.c @@ -1,4 +1,4 @@ -/* $Id: pci_sabre.c,v 1.11 2000/01/28 13:42:01 jj Exp $ +/* $Id: pci_sabre.c,v 1.12 2000/02/08 05:11:33 jj Exp $ * pci_sabre.c: Sabre specific PCI controller support. * * Copyright (C) 1997, 1998, 1999 David S. Miller (davem@caipfs.rutgers.edu) @@ -1107,11 +1107,6 @@ static void __init sabre_scan_bus(struct pci_controller_info *p) static void __init sabre_iommu_init(struct pci_controller_info *p, int tsbsize, unsigned long dvma_offset) { -#ifndef NEW_PCI_DMA_MAP - struct linux_mlist_p1275 *mlist; - unsigned long n; - iopte_t *iopte; -#endif unsigned long tsbbase, i, order; u64 control; @@ -1154,99 +1149,9 @@ static void __init sabre_iommu_init(struct pci_controller_info *p, of buggy drivers. */ p->iommu.lowest_free[0] = 1; -#ifndef NEW_PCI_DMA_MAP - iopte = (iopte_t *)tsbbase; - - /* Initialize to "none" settings. */ - for(i = 0; i < PCI_DVMA_HASHSZ; i++) { - pci_dvma_v2p_hash[i] = PCI_DVMA_HASH_NONE; - pci_dvma_p2v_hash[i] = PCI_DVMA_HASH_NONE; - } - - n = 0; - mlist = *prom_meminfo()->p1275_totphys; - while (mlist) { - unsigned long paddr = mlist->start_adr; - unsigned long num_bytes = mlist->num_bytes; - - if(paddr >= (((unsigned long) high_memory) - PAGE_OFFSET)) - goto next; - - if((paddr + num_bytes) >= (((unsigned long) high_memory) - PAGE_OFFSET)) - num_bytes = - (((unsigned long) high_memory) - - PAGE_OFFSET) - paddr; - - /* Align base and length so we map whole hash table sized chunks - * at a time (and therefore full 64K IOMMU pages). - */ - paddr &= ~((1UL << 24UL) - 1); - num_bytes = (num_bytes + ((1UL << 24UL) - 1)) & ~((1UL << 24) - 1); - - /* Move up the base for mappings already created. */ - while(pci_dvma_v2p_hash[pci_dvma_ahashfn(paddr)] != - PCI_DVMA_HASH_NONE) { - paddr += (1UL << 24UL); - num_bytes -= (1UL << 24UL); - if(num_bytes == 0UL) - goto next; - } - - /* Move down the size for tail mappings already created. */ - while(pci_dvma_v2p_hash[pci_dvma_ahashfn(paddr + num_bytes - (1UL << 24UL))] != - PCI_DVMA_HASH_NONE) { - num_bytes -= (1UL << 24UL); - if(num_bytes == 0UL) - goto next; - } - - /* Now map the rest. */ - for (i = 0; i < ((num_bytes + ((1 << 16) - 1)) >> 16); i++) { - iopte_val(*iopte) = ((IOPTE_VALID | IOPTE_64K | - IOPTE_CACHE | IOPTE_WRITE) | - (paddr & IOPTE_PAGE)); - - if (!(n & 0xff)) - set_dvma_hash(dvma_offset, paddr, (n << 16)); - if (++n > (tsbsize * 1024)) - goto out; - - paddr += (1 << 16); - iopte++; - } - next: - mlist = mlist->theres_more; - } -out: - if (mlist) { - prom_printf("WARNING: not all physical memory mapped in IOMMU\n"); - prom_printf("Try booting with mem=xxxM or similar\n"); - prom_halt(); - } -#endif - sabre_write(p->controller_regs + SABRE_IOMMU_TSBBASE, __pa(tsbbase)); control = sabre_read(p->controller_regs + SABRE_IOMMU_CONTROL); -#ifndef NEW_PCI_DMA_MAP - control &= ~(SABRE_IOMMUCTRL_TSBSZ); - control |= (SABRE_IOMMUCTRL_TBWSZ | SABRE_IOMMUCTRL_ENAB); - switch(tsbsize) { - case 8: - control |= SABRE_IOMMU_TSBSZ_8K; - break; - case 16: - control |= SABRE_IOMMU_TSBSZ_16K; - break; - case 32: - control |= SABRE_IOMMU_TSBSZ_32K; - break; - default: - prom_printf("iommu_init: Illegal TSB size %d\n", tsbsize); - prom_halt(); - break; - } -#else control &= ~(SABRE_IOMMUCTRL_TSBSZ | SABRE_IOMMUCTRL_TBWSZ); control |= SABRE_IOMMUCTRL_ENAB; switch(tsbsize) { @@ -1263,7 +1168,6 @@ out: prom_halt(); break; } -#endif sabre_write(p->controller_regs + SABRE_IOMMU_CONTROL, control); } @@ -1472,17 +1376,6 @@ void __init sabre_init(int pnode) } switch(vdma[1]) { -#ifndef NEW_PCI_DMA_MAP - case 0x20000000: - tsbsize = 8; - break; - case 0x40000000: - tsbsize = 16; - break; - case 0x80000000: - tsbsize = 32; - break; -#else case 0x20000000: tsbsize = 64; break; @@ -1490,7 +1383,6 @@ void __init sabre_init(int pnode) case 0x80000000: tsbsize = 128; break; -#endif default: prom_printf("SABRE: strange virtual-dma size.\n"); prom_halt(); diff --git a/arch/sparc64/kernel/rtrap.S b/arch/sparc64/kernel/rtrap.S index bb6d7398e..d059a5a28 100644 --- a/arch/sparc64/kernel/rtrap.S +++ b/arch/sparc64/kernel/rtrap.S @@ -1,4 +1,4 @@ -/* $Id: rtrap.S,v 1.47 1999/07/30 09:35:23 davem Exp $ +/* $Id: rtrap.S,v 1.48 2000/02/09 11:15:07 davem Exp $ * rtrap.S: Preparing for return from trap on Sparc V9. * * Copyright (C) 1997,1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz) @@ -20,15 +20,17 @@ .globl rtrap_clr_l6, rtrap rtrap_clr_l6: clr %l6 /* Fall through */ -rtrap: sethi %hi(bh_active), %l2 - sethi %hi(bh_mask), %l1 - ldx [%l2 + %lo(bh_active)], %l4 - ldx [%l1 + %lo(bh_mask)], %l7 - - andcc %l4, %l7, %g0 - be,pt %xcc, 2f +rtrap: lduw [%g6 + AOFF_task_processor], %l0 + sethi %hi(softirq_state), %l2 + or %l2, %lo(softirq_state), %l2 + sllx %l0, 6, %l0 + ldx [%l2 + %l0], %l1 + srlx %l1, 32, %l2 + + andcc %l1, %l2, %g0 + be,pt %icc, 2f nop - call do_bottom_half + call do_softirq nop 2: ldx [%sp + PTREGS_OFF + PT_V9_TSTATE], %l1 sethi %hi(0xf << 20), %l4 diff --git a/arch/sparc64/kernel/sparc64_ksyms.c b/arch/sparc64/kernel/sparc64_ksyms.c index c48a1f6e4..ff3843651 100644 --- a/arch/sparc64/kernel/sparc64_ksyms.c +++ b/arch/sparc64/kernel/sparc64_ksyms.c @@ -1,4 +1,4 @@ -/* $Id: sparc64_ksyms.c,v 1.72 2000/01/28 13:41:59 jj Exp $ +/* $Id: sparc64_ksyms.c,v 1.74 2000/02/09 11:15:07 davem Exp $ * arch/sparc64/kernel/sparc64_ksyms.c: Sparc64 specific ksyms support. * * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu) @@ -127,11 +127,6 @@ EXPORT_SYMBOL_PRIVATE(write_unlock); /* Kernel wide locking */ EXPORT_SYMBOL(kernel_flag); -/* Software-IRQ BH locking */ -EXPORT_SYMBOL(global_bh_lock); -EXPORT_SYMBOL(global_bh_count); -EXPORT_SYMBOL(synchronize_bh); - /* Hard IRQ locking */ EXPORT_SYMBOL(global_irq_holder); EXPORT_SYMBOL(global_irq_lock); @@ -160,8 +155,8 @@ EXPORT_SYMBOL(_do_write_unlock); #endif #else -EXPORT_SYMBOL(local_irq_count); EXPORT_SYMBOL(local_bh_count); +EXPORT_SYMBOL(local_irq_count); #endif /* rw semaphores */ @@ -194,12 +189,8 @@ EXPORT_SYMBOL(sbus_unmap_sg); EXPORT_SYMBOL(sbus_dma_sync_single); EXPORT_SYMBOL(sbus_dma_sync_sg); #endif -#if CONFIG_PCI +#ifdef CONFIG_PCI EXPORT_SYMBOL(ebus_chain); -#ifndef NEW_PCI_DMA_MAP -EXPORT_SYMBOL(pci_dvma_v2p_hash); -EXPORT_SYMBOL(pci_dvma_p2v_hash); -#endif EXPORT_SYMBOL(pci_memspace_mask); EXPORT_SYMBOL(empty_zero_page); EXPORT_SYMBOL(outsb); @@ -208,8 +199,6 @@ EXPORT_SYMBOL(outsl); EXPORT_SYMBOL(insb); EXPORT_SYMBOL(insw); EXPORT_SYMBOL(insl); -#endif -#ifdef NEW_PCI_DMA_MAP EXPORT_SYMBOL(pci_alloc_consistent); EXPORT_SYMBOL(pci_free_consistent); EXPORT_SYMBOL(pci_map_single); |