/*-
* Copyright (C) 2000 Shuichiro URATA. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/*
* Jazz derived system dma driver. Handles resource allocation and
* logical (virtual) address remaping.
*/
/*
* Map up a virtual address space in dma space given by
* the dma control structure.
*/
void
jazz_dmatlb_map_va(struct vmspace *vm, vaddr_t va, vsize_t size,
jazz_dma_pte_t *dma_pte)
{
paddr_t pa;
size = jazz_dma_page_round(size + jazz_dma_page_offs(va));
va &= JAZZ_DMA_PAGE_NUM;
while (size > 0) {
if (!VMSPACE_IS_KERNEL_P(vm))
(void)pmap_extract(vm_map_pmap(&vm->vm_map), va, &pa);
else
pa = kvtophys(va);
pa &= JAZZ_DMA_PAGE_NUM;
dma_pte->lo_addr = pa;
dma_pte->hi_addr = 0;
dma_pte++;
va += JAZZ_DMA_PAGE_SIZE;
size -= JAZZ_DMA_PAGE_SIZE;
}
}
/*
* Map up a physical address space in dma space given by
* the dma control structure.
*/
void
jazz_dmatlb_map_pa(paddr_t pa, psize_t size, jazz_dma_pte_t *dma_pte)
{
size = jazz_dma_page_round(size + jazz_dma_page_offs(pa));
pa &= JAZZ_DMA_PAGE_NUM;
while (size > 0) {
dma_pte->lo_addr = pa;
dma_pte->hi_addr = 0;
dma_pte++;
pa += JAZZ_DMA_PAGE_SIZE;
size -= JAZZ_DMA_PAGE_SIZE;
}
}
/*
* Prepare for new dma by flushing
*/
void
jazz_dmatlb_flush(void)
{