socsvn commit: r286434 - in soc2015/pratiksinghal/cubie-head/sys/arm: allwinner conf
pratiksinghal at FreeBSD.org
pratiksinghal at FreeBSD.org
Sun May 31 02:27:42 UTC 2015
Author: pratiksinghal
Date: Sun May 31 02:27:40 2015
New Revision: 286434
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=286434
Log:
Removed the size > 0 panic message. Mapping still needs to be corrected though
Modified:
soc2015/pratiksinghal/cubie-head/sys/arm/allwinner/a10_mmc.c
soc2015/pratiksinghal/cubie-head/sys/arm/conf/CUBIEBOARD
Modified: soc2015/pratiksinghal/cubie-head/sys/arm/allwinner/a10_mmc.c
==============================================================================
--- soc2015/pratiksinghal/cubie-head/sys/arm/allwinner/a10_mmc.c Sun May 31 01:02:05 2015 (r286433)
+++ soc2015/pratiksinghal/cubie-head/sys/arm/allwinner/a10_mmc.c Sun May 31 02:27:40 2015 (r286434)
@@ -55,6 +55,7 @@
#define A10_MMC_IRQRES 1
#define A10_MMC_RESSZ 2
+
struct a10_mmc_softc {
bus_space_handle_t a10_bsh;
bus_space_tag_t a10_bst;
@@ -71,6 +72,14 @@
uint32_t a10_intr;
uint32_t a10_intr_wait;
void * a10_intrhand;
+ bus_dma_tag_t a10_mmc_dmat ;
+ bus_dma_segment_t a10_mmc_dma_segments ;
+ bus_dmamap_t a10_mmc_dmamap ;
+ bus_size_t buf_size ;
+ bus_dma_segment_t a10_mmc_dmasegs[1] ;
+ void * a10_mmc_buff ; /* Pointer to the buffer */
+ uint32_t a10_mmc_nseg ; /* No of segments */
+ bus_addr_t a10_mmc_seg ; /* Address of the first descriptor */
};
static struct resource_spec a10_mmc_res_spec[] = {
@@ -85,6 +94,8 @@
static int a10_mmc_reset(struct a10_mmc_softc *);
static void a10_mmc_intr(void *);
static int a10_mmc_update_clock(struct a10_mmc_softc *);
+static int a10_mmc_init_dma(struct a10_mmc_softc *, struct mmc_command *) ; /* Not defined yet */
+static void a10_mmc_dma_callback(void *, bus_dma_segment_t *,int , int) ;
static int a10_mmc_update_ios(device_t, device_t);
static int a10_mmc_request(device_t, device_t, struct mmc_request *);
@@ -135,8 +146,8 @@
sc->a10_bst = rman_get_bustag(sc->a10_res[A10_MMC_MEMRES]);
sc->a10_bsh = rman_get_bushandle(sc->a10_res[A10_MMC_MEMRES]);
if (bus_setup_intr(dev, sc->a10_res[A10_MMC_IRQRES],
- INTR_TYPE_MISC | INTR_MPSAFE, NULL, a10_mmc_intr, sc,
- &sc->a10_intrhand)) {
+ INTR_TYPE_MISC | INTR_MPSAFE, NULL, a10_mmc_intr, sc,
+ &sc->a10_intrhand)) {
bus_release_resources(dev, a10_mmc_res_spec, sc->a10_res);
device_printf(dev, "cannot setup interrupt handler\n");
return (ENXIO);
@@ -145,7 +156,7 @@
/* Activate the module clock. */
if (a10_clk_mmc_activate(sc->a10_id) != 0) {
bus_teardown_intr(dev, sc->a10_res[A10_MMC_IRQRES],
- sc->a10_intrhand);
+ sc->a10_intrhand);
bus_release_resources(dev, a10_mmc_res_spec, sc->a10_res);
device_printf(dev, "cannot activate mmc clock\n");
return (ENXIO);
@@ -155,9 +166,9 @@
ctx = device_get_sysctl_ctx(dev);
tree = SYSCTL_CHILDREN(device_get_sysctl_tree(dev));
SYSCTL_ADD_INT(ctx, tree, OID_AUTO, "req_timeout", CTLFLAG_RW,
- &sc->a10_timeout, 0, "Request timeout in seconds");
+ &sc->a10_timeout, 0, "Request timeout in seconds");
mtx_init(&sc->a10_mtx, device_get_nameunit(sc->a10_dev), "a10_mmc",
- MTX_DEF);
+ MTX_DEF);
callout_init_mtx(&sc->a10_timeoutc, &sc->a10_mtx, 0);
/* Reset controller. */
@@ -183,6 +194,30 @@
goto fail;
}
+ /* Create the tag. */
+ uint32_t err = bus_dma_tag_create(bus_get_dma_tag(dev), 4096,
+ 0,BUS_SPACE_MAXADDR,BUS_SPACE_MAXADDR,
+ NULL,NULL,sizeof(struct a10_mmc_dma_desc)*2,
+ 1,PAGE_SIZE,0,
+ NULL,NULL,&sc->a10_mmc_dmat) ;
+
+ if(err) {
+ device_printf(dev, "Could not create dma tag.\n");
+ goto fail ;
+ }
+ /* Allocate buffer */
+ bus_dmamem_alloc(sc->a10_mmc_dmat, &sc->a10_mmc_buff,BUS_DMA_WAITOK|BUS_DMA_ZERO|BUS_DMA_COHERENT, &sc->a10_mmc_dmamap) ;
+
+ err = bus_dmamap_load(sc->a10_mmc_dmat, sc->a10_mmc_dmamap, sc->a10_mmc_buff, sizeof(struct a10_mmc_dma_desc)*2, a10_mmc_dma_callback,
+ &sc->a10_mmc_seg, BUS_DMA_NOWAIT) ;
+
+ if(err)
+ {
+ device_printf(sc->a10_dev, "Error while loading dma map! code = %d\n", err) ;
+ goto fail ;
+ }
+
+ device_printf(sc->a10_dev, "dma_map loaded succesfully!\n") ;
return (0);
fail:
@@ -207,7 +242,7 @@
int timeout;
A10_MMC_WRITE_4(sc, A10_MMC_GCTRL,
- A10_MMC_READ_4(sc, A10_MMC_GCTRL) | A10_MMC_RESET);
+ A10_MMC_READ_4(sc, A10_MMC_GCTRL) | A10_MMC_RESET);
timeout = 1000;
while (--timeout > 0) {
if ((A10_MMC_READ_4(sc, A10_MMC_GCTRL) & A10_MMC_RESET) == 0)
@@ -224,13 +259,13 @@
A10_MMC_WRITE_4(sc, A10_MMC_RINTR, 0xffffffff);
/* Unmask interrupts. */
A10_MMC_WRITE_4(sc, A10_MMC_IMASK,
- A10_MMC_CMD_DONE | A10_MMC_INT_ERR_BIT |
- A10_MMC_DATA_OVER | A10_MMC_AUTOCMD_DONE |
- A10_MMC_RX_DATA_REQ | A10_MMC_TX_DATA_REQ);
+ A10_MMC_CMD_DONE | A10_MMC_INT_ERR_BIT |
+ A10_MMC_DATA_OVER | A10_MMC_AUTOCMD_DONE |
+ A10_MMC_RX_DATA_REQ | A10_MMC_TX_DATA_REQ);
/* Enable interrupts and AHB access. */
A10_MMC_WRITE_4(sc, A10_MMC_GCTRL,
- A10_MMC_READ_4(sc, A10_MMC_GCTRL) |
- A10_MMC_INT_ENABLE | A10_MMC_ACCESS_BY_AHB);
+ A10_MMC_READ_4(sc, A10_MMC_GCTRL) |
+ A10_MMC_INT_ENABLE | A10_MMC_ACCESS_BY_AHB);
return (0);
}
@@ -249,7 +284,7 @@
}
/* Reset the FIFO. */
A10_MMC_WRITE_4(sc, A10_MMC_GCTRL,
- A10_MMC_READ_4(sc, A10_MMC_GCTRL) | A10_MMC_FIFO_RESET);
+ A10_MMC_READ_4(sc, A10_MMC_GCTRL) | A10_MMC_FIFO_RESET);
req = sc->a10_req;
callout_stop(&sc->a10_timeoutc);
@@ -307,7 +342,7 @@
a10_mmc_req_done(sc);
} else
device_printf(sc->a10_dev,
- "Spurious timeout - no active request\n");
+ "Spurious timeout - no active request\n");
}
static int
@@ -352,8 +387,8 @@
#endif
if (sc->a10_req == NULL) {
device_printf(sc->a10_dev,
- "Spurious interrupt - no active request, rint: 0x%08X\n",
- rint);
+ "Spurious interrupt - no active request, rint: 0x%08X\n",
+ rint);
A10_MMC_WRITE_4(sc, A10_MMC_RINTR, rint);
A10_MMC_UNLOCK(sc);
return;
@@ -373,7 +408,7 @@
sc->a10_intr |= rint;
data = sc->a10_req->cmd->data;
if (data != NULL && (rint & (A10_MMC_DATA_OVER |
- A10_MMC_RX_DATA_REQ | A10_MMC_TX_DATA_REQ)) != 0)
+ A10_MMC_RX_DATA_REQ | A10_MMC_TX_DATA_REQ)) != 0)
a10_mmc_pio_transfer(sc, data);
if ((sc->a10_intr & sc->a10_intr_wait) == sc->a10_intr_wait)
a10_mmc_req_ok(sc);
@@ -429,7 +464,7 @@
A10_MMC_WRITE_4(sc, A10_MMC_CARG, cmd->arg);
A10_MMC_WRITE_4(sc, A10_MMC_CMDR, cmdreg | cmd->opcode);
callout_reset(&sc->a10_timeoutc, sc->a10_timeout * hz,
- a10_mmc_timeout, sc);
+ a10_mmc_timeout, sc);
A10_MMC_UNLOCK(sc);
return (0);
@@ -437,7 +472,7 @@
static int
a10_mmc_read_ivar(device_t bus, device_t child, int which,
- uintptr_t *result)
+ uintptr_t *result)
{
struct a10_mmc_softc *sc;
@@ -491,7 +526,7 @@
static int
a10_mmc_write_ivar(device_t bus, device_t child, int which,
- uintptr_t value)
+ uintptr_t value)
{
struct a10_mmc_softc *sc;
@@ -542,7 +577,7 @@
int retry;
cmdreg = A10_MMC_START | A10_MMC_UPCLK_ONLY |
- A10_MMC_WAIT_PREOVER;
+ A10_MMC_WAIT_PREOVER;
A10_MMC_WRITE_4(sc, A10_MMC_CMDR, cmdreg);
retry = 0xfffff;
while (--retry > 0) {
@@ -558,6 +593,24 @@
return (ETIMEDOUT);
}
+/* This function will map the buffer into a device visible address space and will be called before the actual transfer of data takes place.
+*/
+
+static int
+a10_mmc_init_dma(struct a10_mmc_softc* sc, struct mmc_command* cmd)
+{
+ return (0) ;
+}
+
+static void
+a10_mmc_dma_callback(void* arg, bus_dma_segment_t* segs, int nsegs, int error)
+{
+ if(error) {
+ printf("a10_mmc : Error in the callback function code = %d\n", error) ;
+ return ;
+ }
+ *(bus_addr_t*)arg = segs[0].ds_addr ;
+}
static int
a10_mmc_update_ios(device_t bus, device_t child)
{
Modified: soc2015/pratiksinghal/cubie-head/sys/arm/conf/CUBIEBOARD
==============================================================================
--- soc2015/pratiksinghal/cubie-head/sys/arm/conf/CUBIEBOARD Sun May 31 01:02:05 2015 (r286433)
+++ soc2015/pratiksinghal/cubie-head/sys/arm/conf/CUBIEBOARD Sun May 31 02:27:40 2015 (r286434)
@@ -50,7 +50,7 @@
#options BOOTP_WIRED_TO=cpsw0
# Boot device is 2nd slice on MMC/SD card
-options ROOTDEVNAME=\"ufs:/dev/da0s2\"
+options ROOTDEVNAME=\"ufs:/dev/da0\"
# MMC/SD/SDIO Card slot support
device mmc # mmc/sd bus
@@ -101,7 +101,7 @@
device emac
#DMA controller
-device dma
+#device dma
# USB ethernet support, requires miibus
device miibus
@@ -111,3 +111,5 @@
options FDT_DTB_STATIC
makeoptions FDT_DTS_FILE=cubieboard.dts
makeoptions MODULES_EXTRA=dtb/allwinner
+
+options ARM_NEW_PMAP
More information about the svn-soc-all
mailing list