/* * Common function for mapping DMA-safe memory. May be called by * bus-specific DMA memory map functions. */ int _dmamem_map(bus_dma_tag_t t, bus_dma_segment_t *segs, int nsegs, size_t size, caddr_t *kvap, int flags) { vaddr_t va, sva; size_t ssize; paddr_t pa; bus_addr_t addr; int curseg, error; if (nsegs == 1) { pa = (*t->_device_to_pa)(segs[0].ds_addr); if (flags & BUS_DMA_COHERENT) *kvap = (caddr_t)PHYS_TO_UNCACHED(pa); else *kvap = (caddr_t)PHYS_TO_XKPHYS(pa, CCA_CACHED); return (0); } size = round_page(size); va = uvm_km_valloc(kernel_map, size); if (va == 0) return (ENOMEM); *kvap = (caddr_t)va; sva = va; ssize = size; for (curseg = 0; curseg < nsegs; curseg++) { for (addr = segs[curseg].ds_addr; addr < (segs[curseg].ds_addr + segs[curseg].ds_len); addr += NBPG, va += NBPG, size -= NBPG) { if (size == 0) panic("_dmamem_map: size botch"); pa = (*t->_device_to_pa)(addr); error = pmap_enter(pmap_kernel(), va, pa, VM_PROT_READ | VM_PROT_WRITE, VM_PROT_READ | VM_PROT_WRITE | PMAP_WIRED | PMAP_CANFAIL); if (error) { pmap_update(pmap_kernel()); uvm_km_free(kernel_map, sva, ssize); return (error); } if (flags & BUS_DMA_COHERENT) pmap_page_cache(PHYS_TO_VM_PAGE(pa), PV_UNCACHED); } pmap_update(pmap_kernel()); } return (0); }
int spu_finish_processing (uint8_t *addr) #endif { unsigned char *ptr = NULL; unsigned char *ptr1 = NULL; unsigned char *ptr2 = NULL; struct spu_trans_req *spu_req; unsigned int status; int numbds; ptr = addr; ptr1 = (char *) PHYS_TO_UNCACHED ((uint32) ptr); ptr2 = (unsigned char *)*(uint32 *) (ptr1 + 4); if(!ptr2) { printk(KERN_ERR "Invalid pointer at output DMA\n"); return BCM_STATUS_OUTPUT_ERROR; } /* test code */ #ifdef CONFIG_BCM_SPU_TEST if((test_mode) || (!((uint32)ptr2 & 0x0000FFFF))) { return 0; } #endif /* CONFIG_BCM_SPU_TEST */ spu_req = (struct spu_trans_req *) ptr2; spu_req->err = 0; if ( spu_req->dStatus ) { memcpy(&status, spu_req->dStatus, RX_STS_SIZE); /* bit 17 indicates there was an error with the transaction */ if (status & 0x20000) { SPU_TRACE(("SPU error occured in the decryption process - SPU status 0x%08x\n", status)); spu_req->err = -EBADMSG; } } numbds = spu_req->numtxbds; /* spu_req is unavailable after this call */ spu_req->callback (spu_req); return numbds; }/* spu_finish_processing */
int gpio_action(int msg) { if(msg==MBEGIN) gpiodata=*(volatile unsigned int *)PHYS_TO_UNCACHED(PCI_IO_SPACE+GPO_REG); return 0; }