|
Lines 431-436
found:
Link Here
|
| 431 |
* This is needed when we sync the memory. Then we sync the buffer if |
431 |
* This is needed when we sync the memory. Then we sync the buffer if |
| 432 |
* needed. |
432 |
* needed. |
| 433 |
*/ |
433 |
*/ |
|
|
434 |
WARN_ON(!phys);//temp |
| 434 |
for (i = 0; i < nslots; i++) |
435 |
for (i = 0; i < nslots; i++) |
| 435 |
io_tlb_orig_addr[index+i] = phys + (i << IO_TLB_SHIFT); |
436 |
io_tlb_orig_addr[index+i] = phys + (i << IO_TLB_SHIFT); |
| 436 |
if (dir == DMA_TO_DEVICE || dir == DMA_BIDIRECTIONAL) |
437 |
if (dir == DMA_TO_DEVICE || dir == DMA_BIDIRECTIONAL) |
|
Lines 450-455
do_unmap_single(struct device *hwdev, ch
Link Here
|
| 450 |
int index = (dma_addr - io_tlb_start) >> IO_TLB_SHIFT; |
451 |
int index = (dma_addr - io_tlb_start) >> IO_TLB_SHIFT; |
| 451 |
phys_addr_t phys = io_tlb_orig_addr[index]; |
452 |
phys_addr_t phys = io_tlb_orig_addr[index]; |
| 452 |
|
453 |
|
|
|
454 |
for(i = 1, count = 0; i < nslots; ++i) {//temp |
| 455 |
if((phys + (i << IO_TLB_SHIFT)) != io_tlb_orig_addr[index + i]) { |
| 456 |
printk("dus[%d]: %Lx %Lx\n", index, (unsigned long long)io_tlb_orig_addr[index + i], (unsigned long long)phys + (i << IO_TLB_SHIFT)); |
| 457 |
++count; |
| 458 |
} |
| 459 |
WARN_ON(count); |
| 460 |
} |
| 453 |
/* |
461 |
/* |
| 454 |
* First, sync the memory before unmapping the entry |
462 |
* First, sync the memory before unmapping the entry |
| 455 |
*/ |
463 |
*/ |
|
Lines 543-549
dma_addr_t swiotlb_map_page(struct devic
Link Here
|
| 543 |
*/ |
551 |
*/ |
| 544 |
if (!address_needs_mapping(dev, dev_addr, size) && |
552 |
if (!address_needs_mapping(dev, dev_addr, size) && |
| 545 |
!range_needs_mapping(phys, size)) |
553 |
!range_needs_mapping(phys, size)) |
|
|
554 |
{//temp |
| 555 |
int f = 0; |
| 556 |
for(size += offset; size > PAGE_SIZE; size -= PAGE_SIZE) { |
| 557 |
++page; |
| 558 |
if(PageForeign(page)) { |
| 559 |
printk("smp: %lx(%lx)\n", page_to_pfn(page), page->flags);//temp |
| 560 |
++f; |
| 561 |
} |
| 562 |
} |
| 563 |
WARN_ON(f); |
| 546 |
return dev_addr; |
564 |
return dev_addr; |
|
|
565 |
} |
| 547 |
|
566 |
|
| 548 |
/* |
567 |
/* |
| 549 |
* Oh well, have to allocate and map a bounce buffer. |
568 |
* Oh well, have to allocate and map a bounce buffer. |
|
Lines 676-681
swiotlb_map_sg_attrs(struct device *hwde
Link Here
|
| 676 |
phys_addr_t paddr = page_to_pseudophys(sg_page(sg)) |
695 |
phys_addr_t paddr = page_to_pseudophys(sg_page(sg)) |
| 677 |
+ sg->offset; |
696 |
+ sg->offset; |
| 678 |
|
697 |
|
|
|
698 |
if(dir != DMA_TO_DEVICE && sg->offset + sg->length > PAGE_SIZE) {//temp |
| 699 |
u8*p = page_address(sg_page(sg)); |
| 700 |
long offs = sg->offset + sg->length - 1; |
| 701 |
WARN((sg->offset | sg->length) & 0x1ff, |
| 702 |
"sg%d@%p[%d/%d] v=%p+%x:%x\n", dir, sgl, i, nelems, p, sg->offset, sg->length); |
| 703 |
#ifndef CONFIG_HIGHMEM |
| 704 |
do { |
| 705 |
__asm__ __volatile__("lock orb $0, %0" : : "m" (p[offs])); |
| 706 |
offs -= PAGE_SIZE; |
| 707 |
} while(offs >= (long)sg->offset); |
| 708 |
#endif |
| 709 |
} |
| 679 |
if (range_needs_mapping(paddr, sg->length) |
710 |
if (range_needs_mapping(paddr, sg->length) |
| 680 |
|| address_needs_mapping(hwdev, dev_addr, sg->length)) { |
711 |
|| address_needs_mapping(hwdev, dev_addr, sg->length)) { |
| 681 |
void *map; |
712 |
void *map; |
|
Lines 694-700
swiotlb_map_sg_attrs(struct device *hwde
Link Here
|
| 694 |
} |
725 |
} |
| 695 |
sg->dma_address = swiotlb_virt_to_bus(hwdev, map); |
726 |
sg->dma_address = swiotlb_virt_to_bus(hwdev, map); |
| 696 |
} else |
727 |
} else |
|
|
728 |
{//temp |
| 729 |
int f = 0; |
| 730 |
size_t size = sg->offset + sg->length; |
| 731 |
struct page *page = sg_page(sg); |
| 732 |
for(; size > PAGE_SIZE; size -= PAGE_SIZE) { |
| 733 |
++page; |
| 734 |
if(PageForeign(page)) { |
| 735 |
printk("smsa: %lx(%lx)\n", page_to_pfn(page), page->flags);//temp |
| 736 |
++f; |
| 737 |
} |
| 738 |
} |
| 739 |
WARN_ON(f); |
| 697 |
sg->dma_address = dev_addr; |
740 |
sg->dma_address = dev_addr; |
|
|
741 |
} |
| 698 |
sg->dma_length = sg->length; |
742 |
sg->dma_length = sg->length; |
| 699 |
} |
743 |
} |
| 700 |
return nelems; |
744 |
return nelems; |