From owner-svn-soc-all@FreeBSD.ORG Sat Jun 13 05:54:32 2015 Return-Path: Delivered-To: svn-soc-all@hub.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id 13BA35F7 for ; Sat, 13 Jun 2015 05:54:32 +0000 (UTC) (envelope-from pratiksinghal@FreeBSD.org) Received: from socsvn.freebsd.org (socsvn.freebsd.org [IPv6:2001:1900:2254:206a::50:2]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id E9421F03 for ; Sat, 13 Jun 2015 05:54:31 +0000 (UTC) (envelope-from pratiksinghal@FreeBSD.org) Received: from socsvn.freebsd.org ([127.0.1.124]) by socsvn.freebsd.org (8.14.9/8.14.9) with ESMTP id t5D5sVsu031689 for ; Sat, 13 Jun 2015 05:54:31 GMT (envelope-from pratiksinghal@FreeBSD.org) Received: (from www@localhost) by socsvn.freebsd.org (8.14.9/8.14.9/Submit) id t5D5sVJY031683 for svn-soc-all@FreeBSD.org; Sat, 13 Jun 2015 05:54:31 GMT (envelope-from pratiksinghal@FreeBSD.org) Date: Sat, 13 Jun 2015 05:54:31 GMT Message-Id: <201506130554.t5D5sVJY031683@socsvn.freebsd.org> X-Authentication-Warning: socsvn.freebsd.org: www set sender to pratiksinghal@FreeBSD.org using -f From: pratiksinghal@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r287030 - soc2015/pratiksinghal/cubie-head/sys/arm/allwinner MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-soc-all@freebsd.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: SVN commit messages for the entire Summer of Code repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 13 Jun 2015 05:54:32 -0000 Author: pratiksinghal Date: Sat Jun 13 05:54:30 2015 New Revision: 287030 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=287030 Log: 1) DMA partially working 2) Interrupt storm error still to be removed. (Interrupt handling is not correct now) Modified: soc2015/pratiksinghal/cubie-head/sys/arm/allwinner/a10_mmc.c Modified: soc2015/pratiksinghal/cubie-head/sys/arm/allwinner/a10_mmc.c ============================================================================== --- soc2015/pratiksinghal/cubie-head/sys/arm/allwinner/a10_mmc.c Sat Jun 13 01:28:19 2015 (r287029) +++ soc2015/pratiksinghal/cubie-head/sys/arm/allwinner/a10_mmc.c Sat Jun 13 05:54:30 2015 (r287030) @@ -92,6 +92,8 @@ int a10_dma_ndesc; void* a10_dma_desc ; /* Contains the kva of the descriptor which we will pass to DLBA */ int a10_dma_ops ; /* Which type of operation DMA is performing ? 0:read, 1:write, 2:other */ + bus_dma_tag_t a10_dma_buff_tag ; + bus_dmamap_t a10_dma_buff_map ; }; @@ -272,11 +274,11 @@ 0,BUS_SPACE_MAXADDR_32BIT,BUS_SPACE_MAXADDR, NULL,NULL,A10_DMA_BUFF_SIZE, A10_DMA_NSEGS,A10_DMA_BUFF_SIZE,0, - NULL,NULL,&sc->a10_dma_buf_tag) ; + NULL,NULL,&sc->a10_dma_buff_tag) ; if(error) return (error) ; - error = bus_dma_map_create(sc->a10_dma_buf_tag,0,&sc->a10_dma_buf_map) ; + error = bus_dmamap_create(sc->a10_dma_buff_tag,0,&sc->a10_dma_buff_map) ; if(error) return (error) ; @@ -299,12 +301,12 @@ uint32_t val; desc = 0 ; - device_printf(sc->a10_dev,"Before loop\n") ; + /* Pick a segment and program all the descriptors in the segment. */ bus_addr_t paddr = (sc->a10_dma_cb_arg).segs[0].ds_addr; bus_size_t len = (sc->a10_dma_cb_arg).segs[0].ds_len ; rem = min(len,cmd->data->len) ; - device_printf(sc->a10_dev, "Before rem\n") ; + while(rem > 0) { if(desc == sc->a10_dma_ndesc) @@ -333,22 +335,19 @@ desc++ ; } - device_printf(sc->a10_dev, "After the completion of loop\n") ; if(desc == sc->a10_dma_ndesc) { device_printf(sc->a10_dev, "Couldn't find enough descriptors for DMA transfer! desc = %d,sc->a10_dma_ndesc = %d\n",desc, sc->a10_dma_ndesc) ; return EIO ; } - device_printf(sc->a10_dev, "Before syncing\n") ; bus_dmamap_sync(sc->a10_dma_tag, sc->a10_dma_map, BUS_DMASYNC_PREWRITE) ; - device_printf(sc->a10_dev, "After syncing\n") ; /* Enable DMA and interrupts*/ val = A10_MMC_READ_4(sc, A10_MMC_GCTRL) ; val |= A10_MMC_DMA_ENABLE ; val |= A10_MMC_INT_ENABLE ; A10_MMC_WRITE_4(sc, A10_MMC_GCTRL,val) ; - + /* Reset DMA */ val |= A10_MMC_DMA_RESET ; A10_MMC_WRITE_4(sc, A10_MMC_GCTRL,val) ; @@ -376,9 +375,9 @@ /* Configure the watermark level. */ A10_MMC_WRITE_4(sc, A10_MMC_FTRGL,A10_MMC_DMA_FTRGLEVEL_A10) ; - /* Disable debounce*/ - A10_MMC_WRITE_4(sc, A10_MMC_READ_4(sc, A10_MMC_GCTRL) & (~A10_MMC_DEBOUNCE_ENABLE), A10_MMC_GCTRL); + A10_MMC_WRITE_4(sc, A10_MMC_GCTRL, A10_MMC_READ_4(sc, A10_MMC_GCTRL) & (~A10_MMC_DEBOUNCE_ENABLE)); + device_printf(sc->a10_dev, "Completed the prepare function\n") ; return (0) ; } @@ -566,6 +565,7 @@ "Spurious interrupt - no active request, rint: 0x%08X\n", rint); A10_MMC_WRITE_4(sc, A10_MMC_RINTR, rint); + A10_MMC_WRITE_4(sc, A10_MMC_IDST, idst) ; A10_MMC_UNLOCK(sc); return; } @@ -579,6 +579,7 @@ else sc->a10_req->cmd->error = MMC_ERR_FAILED; A10_MMC_WRITE_4(sc, A10_MMC_RINTR, rint); + A10_MMC_WRITE_4(sc, A10_MMC_IDST, idst) ; a10_mmc_req_done(sc); A10_MMC_UNLOCK(sc); return; @@ -588,6 +589,7 @@ device_printf(sc->a10_dev, "error rint: 0x%08x\n", idst) ; sc->a10_req->cmd->error = MMC_ERR_FAILED ; A10_MMC_WRITE_4(sc, A10_MMC_IDST, idst) ; + A10_MMC_WRITE_4(sc, A10_MMC_RINTR, rint) ; a10_mmc_req_done(sc) ; A10_MMC_UNLOCK(sc) ; return ; @@ -601,6 +603,8 @@ bus_dmamap_sync(sc->a10_dma_tag, sc->a10_dma_map, BUS_DMASYNC_POSTWRITE) ; else device_printf(sc->a10_dev, "Invalid operations request!\n") ; + A10_MMC_WRITE_4(sc, A10_MMC_IDST, idst) ; + A10_MMC_WRITE_4(sc, A10_MMC_RINTR, rint) ; a10_mmc_req_ok(sc) ; A10_MMC_UNLOCK(sc) ; return ; @@ -664,13 +668,16 @@ if (cmd->data != NULL) { sc->a10_intr_wait |= A10_MMC_DATA_OVER; + sc->a10_dma_ops = 0 ; cmdreg |= A10_MMC_DATA_EXP | A10_MMC_WAIT_PREOVER; if (cmd->data->flags & MMC_DATA_MULTI) { cmdreg |= A10_MMC_SEND_AUTOSTOP; sc->a10_intr_wait |= A10_MMC_AUTOCMD_DONE; } - if (cmd->data->flags & MMC_DATA_WRITE) + if (cmd->data->flags & MMC_DATA_WRITE) { cmdreg |= A10_MMC_WRITE; + sc->a10_dma_ops = 1 ; + } blksz = min(cmd->data->len, MMC_SECTOR_SIZE); A10_MMC_WRITE_4(sc, A10_MMC_BLKSZ, blksz);