From owner-freebsd-stable@FreeBSD.ORG Sat Apr 29 18:57:13 2006 Return-Path: X-Original-To: freebsd-stable@freebsd.org Delivered-To: freebsd-stable@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 65E5B16A416 for ; Sat, 29 Apr 2006 18:57:13 +0000 (UTC) (envelope-from bryants@gmail.com) Received: from nz-out-0102.google.com (nz-out-0102.google.com [64.233.162.201]) by mx1.FreeBSD.org (Postfix) with ESMTP id BF8CF43D6E for ; Sat, 29 Apr 2006 18:56:59 +0000 (GMT) (envelope-from bryants@gmail.com) Received: by nz-out-0102.google.com with SMTP id i28so2152084nzi for ; Sat, 29 Apr 2006 11:56:59 -0700 (PDT) DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=beta; d=gmail.com; h=received:message-id:date:from:to:subject:mime-version:content-type; b=BqJDDtTSEiPPHzhr4oAsUX3JueTlAxaJvTD/FBD/bIWJpHsCgheCf/NfVCCHTQVxDy68bJ7ZegCxcN1m+dM5H1oiaGr+msoEVzNJjffNY2U9rBKBZ2pwso1iXmVWtyHaxzk6am5N/5f0w1OonV5hAhvgnis0a/P/TDw53mY/BqU= Received: by 10.36.65.17 with SMTP id n17mr6853879nza; Sat, 29 Apr 2006 11:56:59 -0700 (PDT) Received: by 10.36.61.9 with HTTP; Sat, 29 Apr 2006 11:56:59 -0700 (PDT) Message-ID: Date: Sat, 29 Apr 2006 14:56:59 -0400 From: "Sean Bryant" To: freebsd-stable@freebsd.org MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_Part_1852_19298826.1146337019298" Subject: [patch[ twa, bus_dma.h, busdma_machdep.c (amd64) X-BeenThere: freebsd-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Production branch of FreeBSD source code List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 29 Apr 2006 18:57:15 -0000 ------=_Part_1852_19298826.1146337019298 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: base64 Content-Disposition: inline SSBsb2FkZWQgdXAgNi4xLVN0YWJsZSBvbiBhIER1YWwgRHVhbCBDb3JlIE9wdGVyb24sIHdpdGgg YSAzd2FyZQo5NTUwc3gtNGxwIHJhaWQgY2FyZCBpbiBpdCBhbmQgbm90aWNlZCBhIGhvcnJpZCBi b290IHRpbWUuCldlbGwgYWZ0ZXIgaW52ZXN0aWdhdGluZyB0aGUgaXNzdWUgaXQgdHVybnMgb3V0 IHRoZSB0d2EgZHJpdmVyIGhhZApwcm9ibGVtcyBjcmVhdGluZyB0aGUgYnVzX2RtYW1hcHMuIEl0 IHdhcyBjcmVhdGluZyAyNTUgcmVxdWVzdCBidWZmZXJzCmFuZCBnaXZpbmcgZWFjaCBvZiB0aGVt IGEgZG1hIG1hcC4KWWlwcGllISBUaGlzIGxlYXZlcyBtZSB3aXRoIGFib3V0IGEgNyAtIDEwIG1p bnV0ZSBib290IHRpbWUuCgpUbyBjb3JyZWN0IHRoaXMgcHJvYmxlbSBJIGNyZWF0ZWQgYSBidXNf ZG1hbWFwX2NyZWF0ZV92IChzaG91bGQgcHJvYmFibHkKYmUgY2FsbGVkIGJ1c19kbWFtYXBfY3Jl YXRlX21hbnkgYXMgbXV4IHN1Z2dlc3RlZCkgYW5kIHRoaXMgY3JlYXRlcyBhCmxhcmdlIGFtb3Vu dCBvZiBkbWEgbWFwcyBhbGwgYXQgb25jZS4KT2J2aW91c2x5IHRvIHRlc3QgSSBtb2RpZmllZCB0 aGUgdHdhIGRyaXZlciB0byB1c2UgdGhlIG5ldyBmdW5jdGlvbi4KSSd2ZSBzZWVuIG5vIHByb2Js ZW1zIHNvIGZhci4gbGV0IG1lIGtub3cgaWYgeW91IHNlZSBhbnkgZ2xhcmluZyBlcnJvcnMuCkFz IHRoZXJlIGFyZSBwcm9iYWJseSBzb21lLiBEaXNrIHBlcmZvcm1hbmNlIHJlbWFpbmVkIHRoZSBz YW1lIGp1c3QKc3BlZWQgdXAgYm9vdCB0aW1lIGNvbnNpZGVyYWJseS4gVGhpcyBpcyBvbmx5IHRl c3RlZCB3aXRoIGFtZDY0IGNvZGUuClRoZSBjb2RlICpzaG91bGQqIHdvcmsgd2l0aCBpMzg2LCBi dXQgSSB3YXNuJ3QgYWJsZSB0byB0ZXN0IGl0LiBQbGVhc2UKdGVzdCBhbmQgbGV0IG1lIGtub3cg b2YgYW55IHByb2JsZW1zLgoKQW5kIEkgYXBvbG9naXplIGFoZWFkIG9mIHRpbWUgaWYgdGhpcyBp cyB1c2VsZXNzIEkgZG9uJ3Qga25vdyBtdWNoIGFib3V0CnRoZSB0b3BpYyBidXQgd2FzIGluIG5l ZWQgb2YgYSBxdWljayBmaXguCi0tClNlYW4gQnJ5YW50Cg== ------=_Part_1852_19298826.1146337019298 Content-Type: application/octet-stream; name=busdma_machdep.c.patch Content-Transfer-Encoding: 7bit X-Attachment-Id: f_emmbbiyz Content-Disposition: attachment; filename="busdma_machdep.c.patch" --- /sys/amd64/amd64/busdma_machdep.c Tue Mar 28 01:28:37 2006 +++ /sys/amd64/amd64/busdma_machdep.c Thu Apr 27 11:55:55 2006 @@ -355,6 +355,107 @@ } /* + * Allocate a vector of handles for mapping from kva/uva/physical + * address space into bus device space + */ +int +bus_dmamap_create_v(bus_dma_tag_t dmat, int flags, bus_dmamap_t *mapp, size_t num) +{ + int error; + + error = 0; + + int i; + + i = 0; + + if (dmat->segments == NULL) { + dmat->segments = (bus_dma_segment_t *)malloc( + sizeof(bus_dma_segment_t) * dmat->nsegments, M_DEVBUF, + M_NOWAIT); + if (dmat->segments == NULL) { + CTR3(KTR_BUSDMA, "%s: tag %p error %d", + __func__, dmat, ENOMEM); + return (ENOMEM); + } + } + + /* + * Bouncing might be required if the driver asks for an active + * exclusion region, a data alignment that is stricter than 1, and/or + * an active address boundary. + */ + if (dmat->flags & BUS_DMA_COULD_BOUNCE) { + + /* Must bounce */ + struct bounce_zone *bz; + int maxpages; + + if (dmat->bounce_zone == NULL) { + if ((error = alloc_bounce_zone(dmat)) != 0) + return (error); + } + bz = dmat->bounce_zone; + + *mapp = (bus_dmamap_t)malloc(sizeof(**mapp) * num, M_DEVBUF, + M_NOWAIT | M_ZERO); + + if (*mapp == NULL) { + CTR3(KTR_BUSDMA, "%s: tag %p error %d", + __func__, dmat, ENOMEM); + return (ENOMEM); + } + + + + /* Initialize the new map */ + + bus_dmamap_t *tempp = mapp; + + for(; i < num; i++) { + STAILQ_INIT(&((*mapp)->bpages)); + (*mapp)++; + } + + mapp = tempp; + + /* + * Attempt to add pages to our pool on a per-instance + * basis up to a sane limit. + */ + if (dmat->alignment > 1) + maxpages = MAX_BPAGES; + else + maxpages = MIN(MAX_BPAGES, Maxmem -atop(dmat->lowaddr)); + if ((dmat->flags & BUS_DMA_MIN_ALLOC_COMP) == 0 + || (dmat->map_count > 0 && bz->total_bpages < maxpages)) { + int pages; + + pages = MAX(atop(dmat->maxsize), 1); + pages = MIN(maxpages - bz->total_bpages, pages); + pages = MAX(pages, 1); + if (alloc_bounce_pages(dmat, pages) < pages) + error = ENOMEM; + + if ((dmat->flags & BUS_DMA_MIN_ALLOC_COMP) == 0) { + if (error == 0) + dmat->flags |= BUS_DMA_MIN_ALLOC_COMP; + } else { + error = 0; + } + } + } else { + *mapp = NULL; + } + if (error == 0) + dmat->map_count += num; + CTR4(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d", + __func__, dmat, dmat->flags, error); + return (error); +} + + +/* * Allocate a handle for mapping from kva/uva/physical * address space into bus device space. */ ------=_Part_1852_19298826.1146337019298 Content-Type: application/octet-stream; name=bus_dma.h.patch Content-Transfer-Encoding: 7bit X-Attachment-Id: f_emmbfmqf Content-Disposition: attachment; filename="bus_dma.h.patch" --- /sys/sys/bus_dma.h Tue Mar 15 09:57:29 2005 +++ /sys/sys/bus_dma.h Tue Apr 25 21:49:13 2006 @@ -225,6 +225,12 @@ int bus_dmamap_create(bus_dma_tag_t dmat, int flags, bus_dmamap_t *mapp); /* + * Allocate a vector of handles + * + */ +int bus_dmamap_create_v(bus_dma_tag_t dmat, int flags, bus_dmamap_t *mapp, size_t num); + +/* * Destroy a handle for mapping from kva/uva/physical * address space into bus device space. */ ------=_Part_1852_19298826.1146337019298 Content-Type: application/octet-stream; name=tw_osl_freebsd.c.patch Content-Transfer-Encoding: 7bit X-Attachment-Id: f_emmbfrdy Content-Disposition: attachment; filename="tw_osl_freebsd.c.patch" --- /sys/dev/twa/tw_osl_freebsd.c Wed Dec 7 13:18:05 2005 +++ /sys/dev/twa/tw_osl_freebsd.c Thu Apr 27 12:50:12 2006 @@ -89,6 +89,7 @@ TW_INT32 unit = minor(dev); struct twa_softc *sc = devclass_get_softc(twa_devclass, unit); + tw_osli_dbg_dprintf(5, sc, "entered"); sc->state |= TW_OSLI_CTLR_STATE_OPEN; return(0); @@ -144,7 +145,6 @@ { struct twa_softc *sc = (struct twa_softc *)(dev->si_drv1); TW_INT32 error; - tw_osli_dbg_dprintf(5, sc, "entered"); switch (cmd) { @@ -224,6 +224,7 @@ { static TW_UINT8 first_ctlr = 1; + tw_osli_dbg_printf(3, "entered"); if (tw_cl_ctlr_supported(pci_get_vendor(dev), pci_get_device(dev))) { @@ -264,6 +265,7 @@ TW_INT32 bar_size; TW_INT32 error; + tw_osli_dbg_dprintf(3, sc, "entered"); sc->ctlr_handle.osl_ctlr_ctxt = sc; @@ -279,6 +281,8 @@ mtx_init(sc->q_lock, "tw_osl_q_lock", NULL, MTX_SPIN); sysctl_ctx_init(&sc->sysctl_ctxt); + + sc->sysctl_tree = SYSCTL_ADD_NODE(&sc->sysctl_ctxt, SYSCTL_STATIC_CHILDREN(_hw), OID_AUTO, device_get_nameunit(dev), CTLFLAG_RD, 0, ""); @@ -308,6 +312,7 @@ return(ENXIO); } + /* Force the busmaster enable bit on, in case the BIOS forgot. */ command |= PCIM_CMD_BUSMASTEREN; pci_write_config(dev, PCIR_COMMAND, command, 2); @@ -340,6 +345,7 @@ sc->bus_tag = rman_get_bustag(sc->reg_res); sc->bus_handle = rman_get_bushandle(sc->reg_res); + /* Allocate and register our interrupt. */ sc->irq_res_id = 0; if ((sc->irq_res = bus_alloc_resource(sc->bus_dev, SYS_RES_IRQ, @@ -386,6 +392,7 @@ return(error); } + /* Initialize the Common Layer for this controller. */ if ((error = tw_cl_init_ctlr(&sc->ctlr_handle, sc->flags, sc->device_id, TW_OSLI_MAX_NUM_IOS, TW_OSLI_MAX_NUM_AENS, @@ -467,7 +474,8 @@ TW_UINT32 per_req_dma_mem_size; #endif /* TW_OSL_DMA_MEM_ALLOC_PER_REQUEST */ TW_INT32 error; - TW_INT32 i; + TW_INT32 i = 0; + tw_osli_dbg_dprintf(3, sc, "entered"); @@ -700,10 +708,11 @@ tw_osli_req_q_init(sc, TW_OSLI_FREE_Q); tw_osli_req_q_init(sc, TW_OSLI_BUSY_Q); + if ((sc->req_ctxt_buf = (struct tw_osli_req_context *) malloc((sizeof(struct tw_osli_req_context) * TW_OSLI_MAX_NUM_IOS), - TW_OSLI_MALLOC_CLASS, M_WAITOK)) == NULL) { + TW_OSLI_MALLOC_CLASS, M_WAITOK | M_ZERO)) == NULL) { tw_osli_printf(sc, "error = %d", TW_CL_SEVERITY_ERROR_STRING, TW_CL_MESSAGE_SOURCE_FREEBSD_DRIVER, @@ -712,21 +721,39 @@ ENOMEM); return(ENOMEM); } - bzero(sc->req_ctxt_buf, - sizeof(struct tw_osli_req_context) * TW_OSLI_MAX_NUM_IOS); + + bus_dmamap_t* dma_v = (bus_dmamap_t*)malloc(sizeof(bus_dmamap_t) * TW_OSLI_MAX_NUM_IOS, M_DEVBUF, M_WAITOK | M_ZERO); + if(dma_v == NULL) { + return(ENOMEM); + } + + if(bus_dmamap_create_v(sc->dma_tag, 0, dma_v, TW_OSLI_MAX_NUM_IOS)) { + tw_osli_printf(sc, "request # = %d, error = %d", + TW_CL_SEVERITY_ERROR_STRING, + TW_CL_MESSAGE_SOURCE_FREEBSD_DRIVER, + 0x2013, + "Can't create dma map", + i, ENOMEM); + + return(ENOMEM); + } + + // XXX should be i < ... for (i = 0; i < TW_OSLI_MAX_NUM_IOS; i++) { req = &(sc->req_ctxt_buf[i]); req->ctlr = sc; - if (bus_dmamap_create(sc->dma_tag, 0, &req->dma_map)) { + req->dma_map = dma_v[i]; + /* if (bus_dmamap_create(sc->dma_tag, 0, &req->dma_map)) { tw_osli_printf(sc, "request # = %d, error = %d", TW_CL_SEVERITY_ERROR_STRING, TW_CL_MESSAGE_SOURCE_FREEBSD_DRIVER, 0x2013, "Can't create dma map", i, ENOMEM); + return(ENOMEM); - } + }*/ #ifdef TW_OSL_DMA_MEM_ALLOC_PER_REQUEST @@ -734,11 +761,12 @@ (i * per_req_dma_mem_size); req->req_pkt.dma_mem_phys = sc->dma_mem_phys + (i * per_req_dma_mem_size); - + #endif /* TW_OSL_DMA_MEM_ALLOC_PER_REQUEST */ - + /* Insert request into the free queue. */ tw_osli_req_q_insert_tail(req, TW_OSLI_FREE_Q); + } #ifdef TW_OSL_DMA_MEM_ALLOC_PER_REQUEST @@ -962,10 +990,12 @@ lock = (struct mtx *)lock_arg; switch (op) { case BUS_DMA_LOCK: + printf("twa: Locking!\n"); mtx_lock_spin(lock); break; case BUS_DMA_UNLOCK: + printf("twa: Unlocking!\n"); mtx_unlock_spin(lock); break; ------=_Part_1852_19298826.1146337019298--