|
Lines 450-455
do_unmap_single(struct device *hwdev, ch
Link Here
|
| 450 |
int index = (dma_addr - io_tlb_start) >> IO_TLB_SHIFT; |
450 |
int index = (dma_addr - io_tlb_start) >> IO_TLB_SHIFT; |
| 451 |
phys_addr_t phys = io_tlb_orig_addr[index]; |
451 |
phys_addr_t phys = io_tlb_orig_addr[index]; |
| 452 |
|
452 |
|
|
|
453 |
for(i = 1; i < nslots; ++i) {//temp |
| 454 |
BUG_ON((phys + (i << IO_TLB_SHIFT)) != io_tlb_orig_addr[index + i]); |
| 455 |
} |
| 453 |
/* |
456 |
/* |
| 454 |
* First, sync the memory before unmapping the entry |
457 |
* First, sync the memory before unmapping the entry |
| 455 |
*/ |
458 |
*/ |
|
Lines 543-549
dma_addr_t swiotlb_map_page(struct devic
Link Here
|
| 543 |
*/ |
546 |
*/ |
| 544 |
if (!address_needs_mapping(dev, dev_addr, size) && |
547 |
if (!address_needs_mapping(dev, dev_addr, size) && |
| 545 |
!range_needs_mapping(phys, size)) |
548 |
!range_needs_mapping(phys, size)) |
|
|
549 |
{//temp |
| 550 |
int f = 0; |
| 551 |
for(size += offset; size > PAGE_SIZE; size -= PAGE_SIZE) { |
| 552 |
++page; |
| 553 |
if(PageForeign(page)) { |
| 554 |
printk("smp: %lx(%lx)\n", page_to_pfn(page), page->flags);//temp |
| 555 |
++f; |
| 556 |
} |
| 557 |
} |
| 558 |
WARN_ON(f); |
| 546 |
return dev_addr; |
559 |
return dev_addr; |
|
|
560 |
} |
| 547 |
|
561 |
|
| 548 |
/* |
562 |
/* |
| 549 |
* Oh well, have to allocate and map a bounce buffer. |
563 |
* 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)) |
690 |
phys_addr_t paddr = page_to_pseudophys(sg_page(sg)) |
| 677 |
+ sg->offset; |
691 |
+ sg->offset; |
| 678 |
|
692 |
|
|
|
693 |
if(dir != DMA_TO_DEVICE && sg->offset + sg->length > PAGE_SIZE) {//temp |
| 694 |
u8*p = page_address(sg_page(sg)); |
| 695 |
long offs = sg->offset + sg->length - 1; |
| 696 |
WARN((sg->offset | sg->length) & 0x1ff, |
| 697 |
"sg%d@%p[%d/%d] v=%p+%x:%x\n", dir, sgl, i, nelems, p, sg->offset, sg->length); |
| 698 |
#ifndef CONFIG_HIGHMEM |
| 699 |
do { |
| 700 |
__asm__ __volatile__("lock orb $0, %0" : : "m" (p[offs])); |
| 701 |
offs -= PAGE_SIZE; |
| 702 |
} while(offs >= (long)sg->offset); |
| 703 |
#endif |
| 704 |
} |
| 679 |
if (range_needs_mapping(paddr, sg->length) |
705 |
if (range_needs_mapping(paddr, sg->length) |
| 680 |
|| address_needs_mapping(hwdev, dev_addr, sg->length)) { |
706 |
|| address_needs_mapping(hwdev, dev_addr, sg->length)) { |
| 681 |
void *map; |
707 |
void *map; |
|
Lines 694-700
swiotlb_map_sg_attrs(struct device *hwde
Link Here
|
| 694 |
} |
720 |
} |
| 695 |
sg->dma_address = swiotlb_virt_to_bus(hwdev, map); |
721 |
sg->dma_address = swiotlb_virt_to_bus(hwdev, map); |
| 696 |
} else |
722 |
} else |
|
|
723 |
{//temp |
| 724 |
int f = 0; |
| 725 |
size_t size = sg->offset + sg->length; |
| 726 |
struct page *page = sg_page(sg); |
| 727 |
for(; size > PAGE_SIZE; size -= PAGE_SIZE) { |
| 728 |
++page; |
| 729 |
if(PageForeign(page)) { |
| 730 |
printk("smp: %lx(%lx)\n", page_to_pfn(page), page->flags);//temp |
| 731 |
++f; |
| 732 |
} |
| 733 |
} |
| 734 |
WARN_ON(f); |
| 697 |
sg->dma_address = dev_addr; |
735 |
sg->dma_address = dev_addr; |
|
|
736 |
} |
| 698 |
sg->dma_length = sg->length; |
737 |
sg->dma_length = sg->length; |
| 699 |
} |
738 |
} |
| 700 |
return nelems; |
739 |
return nelems; |