Ejemplo n.º 1
0
/*
 * 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 */
Ejemplo n.º 3
0
int gpio_action(int msg)
{
	if(msg==MBEGIN) gpiodata=*(volatile unsigned int *)PHYS_TO_UNCACHED(PCI_IO_SPACE+GPO_REG);
	return 0;
}