Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 6 Sep 2010 13:04:18 +0530
From:      "Jayachandran C." <c.jayachandran@gmail.com>
To:        freebsd-mips@freebsd.org
Cc:        gonzo@freebsd.org
Subject:   Re: busdma_machdep.c with more than 512M memory
Message-ID:  <AANLkTim2gqj=cbgM35rD5oyMD43rWFY1cjyY4A4CoR99@mail.gmail.com>
In-Reply-To: <AANLkTimjmpOBOAncY9K9AhCodvp27t=XTQ9qZp4q8%2Bvv@mail.gmail.com>
References:  <AANLkTimjmpOBOAncY9K9AhCodvp27t=XTQ9qZp4q8%2Bvv@mail.gmail.com>

index | next in thread | previous in thread | raw e-mail

[-- Attachment #1 --]
On Wed, Sep 1, 2010 at 12:37 PM, Jayachandran C.
<c.jayachandran@gmail.com> wrote:
> I was looking at a few crashes I see with PCI drivers, and I think it
> is caused by an issue in busdma_machdep.c where physical address is
> directly converted using MIPS_PHYS_TO_KSEG1. I have not looked at it
> in detail, but it looks obviously wrong.
>
> Any suggestions on how to fix thiis is welcome, it probably needs an
> uncached TLB entry. On 64bit we could use XKPHYS uncached.
>
>
> ---
>  632         if (newmap->flags & DMAMAP_UNCACHEABLE) {
>  633                 void *tmpaddr = (void *)*vaddr;
>  634
>  635                 if (tmpaddr) {
>  636                         tmpaddr = (void
> *)MIPS_PHYS_TO_KSEG1(vtophys(tmpaddr));
>  637                         newmap->origbuffer = *vaddr;
>  638                         newmap->allocbuffer = tmpaddr;
>  639                         mips_dcache_wbinv_range((vm_offset_t)*vaddr,
>  640                             dmat->maxsize);
>  641                         *vaddr = tmpaddr;
>  642                 }
> ---
> 1361                 bpage->busaddr = pmap_kextract(bpage->vaddr);
> 1362                 bpage->vaddr_nocache =
> 1363                     (vm_offset_t)MIPS_PHYS_TO_KSEG1(bpage->busaddr);
> 1364                 mtx_lock(&bounce_lock);

Based on Juli's suggestion, I have a patch (attached) to switch the
calls to pmap_mapdev/pmap_unmapdev.

Seems to work for me now, please review.

Thanks,
JC.

[-- Attachment #2 --]
Index: sys/mips/mips/busdma_machdep.c
===================================================================
--- sys/mips/mips/busdma_machdep.c	(revision 211984)
+++ sys/mips/mips/busdma_machdep.c	(working copy)
@@ -620,6 +620,7 @@
                     0ul, dmat->lowaddr, dmat->alignment? dmat->alignment : 1ul,
                     dmat->boundary);
         }
+
         if (*vaddr == NULL) {
 		if (newmap != NULL) {
 			_busdma_free_dmamap(newmap);
@@ -633,7 +634,8 @@
 		void *tmpaddr = (void *)*vaddr;
 
 		if (tmpaddr) {
-			tmpaddr = (void *)MIPS_PHYS_TO_KSEG1(vtophys(tmpaddr));
+			printf("uncache mapping %p %lx\n", tmpaddr, (u_long)vtophys(tmpaddr));
+			tmpaddr = (void *)pmap_mapdev(vtophys(tmpaddr), dmat->maxsize);
 			newmap->origbuffer = *vaddr;
 			newmap->allocbuffer = tmpaddr;
 			mips_dcache_wbinv_range((vm_offset_t)*vaddr,
@@ -660,6 +662,9 @@
 		vaddr = map->origbuffer;
 	}
 
+	if (map->flags & DMAMAP_UNCACHEABLE) 
+		pmap_unmapdev((vm_offset_t)map->allocbuffer, dmat->maxsize);
+
         if (map->flags & DMAMAP_MALLOCUSED)
 		free(vaddr, M_DEVBUF);
         else
@@ -1359,8 +1364,9 @@
 			break;
 		}
 		bpage->busaddr = pmap_kextract(bpage->vaddr);
-		bpage->vaddr_nocache = 
-		    (vm_offset_t)MIPS_PHYS_TO_KSEG1(bpage->busaddr);
+		bpage->vaddr_nocache = (vm_offset_t)pmap_mapdev(bpage->busaddr, PAGE_SIZE);
+		printf("bounce mapping %p %p\n", (void *)bpage->busaddr,
+		    (void *)bpage->vaddr_nocache);
 		mtx_lock(&bounce_lock);
 		STAILQ_INSERT_TAIL(&bz->bounce_page_list, bpage, links);
 		total_bpages++;
help

Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?AANLkTim2gqj=cbgM35rD5oyMD43rWFY1cjyY4A4CoR99>