Date: Mon, 08 Mar 1999 19:27:59 +0100 From: Tor.Egge@fast.no To: mike@smith.net.au Cc: henrich@flnet.com, freebsd-hackers@FreeBSD.ORG, freebsd-smp@FreeBSD.ORG Subject: Re: Erorr: isa_dmainit(2, 1024) failed Message-ID: <199903081827.TAA70476@midten.fast.no> In-Reply-To: Your message of "Mon, 08 Mar 1999 09:40:28 -0800" References: <199903081740.JAA06967@dingo.cdrom.com>
next in thread | previous in thread | raw e-mail | index | archive | help
----Next_Part(Mon_Mar__8_19:22:22_1999)-- Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit > > How does one fix this? :) > > With a text editor. Find the code that does it wrong, change it and > recompile. Send us the diffs when you're done. > > Actually, fixing it "right" will be very difficult. I suspect that the > ISA DMA code will need a statically-allocated buffer to overcome this. I've been using the appended patch to use SoundBlaster AWE64 Gold on a machine with 512 MB memory. - Tor Egge ----Next_Part(Mon_Mar__8_19:22:22_1999)-- Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit Index: sys/i386/include/pmap.h =================================================================== RCS file: /home/ncvs/src/sys/i386/include/pmap.h,v retrieving revision 1.58 diff -u -r1.58 pmap.h --- pmap.h 1999/03/02 16:20:39 1.58 +++ pmap.h 1999/03/03 15:24:59 @@ -265,6 +285,7 @@ void putfmtrr __P((void)); void pmap_setdevram __P((unsigned long long, unsigned)); void pmap_setvidram __P((void)); +int pmap_defer_avail __P((vm_offset_t)); #endif /* KERNEL */ Index: sys/i386/i386/pmap.c =================================================================== RCS file: /home/ncvs/src/sys/i386/i386/pmap.c,v retrieving revision 1.223 diff -u -r1.223 pmap.c --- pmap.c 1999/02/19 14:25:33 1.223 +++ pmap.c 1999/02/26 04:25:22 @@ -71,6 +71,7 @@ #include "opt_disable_pse.h" #include "opt_pmap.h" #include "opt_msgbuf.h" +#include "isa.h" #include <sys/param.h> #include <sys/systm.h> @@ -3411,6 +3623,16 @@ return val; } +int +pmap_defer_avail(vm_offset_t pa) +{ +#if NISA > 0 + if (pa >= 0x0 && pa < 0x1000000) + return 1; +#endif + return 0; +} + void pmap_activate(struct proc *p) { Index: sys/i386/i386/machdep.c =================================================================== RCS file: /home/ncvs/src/sys/i386/i386/machdep.c,v retrieving revision 1.326 diff -u -r1.326 machdep.c --- machdep.c 1999/02/13 17:45:15 1.326 +++ machdep.c 1999/02/18 15:20:53 @@ -1544,7 +1545,9 @@ * so that we keep going. The first bad page * will terminate the loop. */ - if (phys_avail[pa_indx] == target_page) { + if (phys_avail[pa_indx] == target_page && + pmap_defer_avail(target_page) == + pmap_defer_avail(target_page - PAGE_SIZE)) { phys_avail[pa_indx] += PAGE_SIZE; if (speculative_mprobe == TRUE && phys_avail[pa_indx] >= (64*1024*1024)) Index: sys/vm/vm_page.c =================================================================== RCS file: /home/ncvs/src/sys/vm/vm_page.c,v retrieving revision 1.127 diff -u -r1.127 vm_page.c --- vm_page.c 1999/02/24 21:26:26 1.127 +++ vm_page.c 1999/02/26 04:10:32 @@ -201,11 +203,13 @@ register vm_page_t m; register struct vm_page **bucket; vm_size_t npages, page_range; + vm_size_t tmpnpages; register vm_offset_t new_start; int i; vm_offset_t pa; int nblocks; vm_offset_t first_managed_page; + int pass; /* the biggest memory array is the second group of pages */ vm_offset_t start; @@ -324,22 +328,30 @@ cnt.v_page_count = 0; cnt.v_free_count = 0; - for (i = 0; phys_avail[i + 1] && npages > 0; i += 2) { - if (i == biggestone) - pa = ptoa(first_managed_page); - else - pa = phys_avail[i]; - while (pa < phys_avail[i + 1] && npages-- > 0) { - ++cnt.v_page_count; - ++cnt.v_free_count; - m = PHYS_TO_VM_PAGE(pa); - m->phys_addr = pa; - m->flags = 0; - m->pc = (pa >> PAGE_SHIFT) & PQ_L2_MASK; - m->queue = m->pc + PQ_FREE; - TAILQ_INSERT_TAIL(vm_page_queues[m->queue].pl, m, pageq); - ++(*vm_page_queues[m->queue].lcnt); - pa += PAGE_SIZE; + for (pass = 0; pass < 2; pass++) { + tmpnpages = npages; + for (i = 0; phys_avail[i + 1] && npages > 0; i += 2) { + if (i == biggestone) + pa = ptoa(first_managed_page); + else + pa = phys_avail[i]; + while (pa < phys_avail[i + 1] && tmpnpages-- > 0) { + if (pass != pmap_defer_avail(pa)) { + pa += PAGE_SIZE; + continue; + } + ++cnt.v_page_count; + ++cnt.v_free_count; + m = PHYS_TO_VM_PAGE(pa); + m->phys_addr = pa; + m->flags = 0; + m->pc = (pa >> PAGE_SHIFT) & PQ_L2_MASK; + m->queue = m->pc + PQ_FREE; + TAILQ_INSERT_TAIL(vm_page_queues[m->queue].pl, + m, pageq); + ++(*vm_page_queues[m->queue].lcnt); + pa += PAGE_SIZE; + } } } return (mapped); ----Next_Part(Mon_Mar__8_19:22:22_1999)---- To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-smp" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199903081827.TAA70476>