|
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 ^ io_tlb_orig_addr[index + i]) & ((1 << IO_TLB_SHIFT) - 1)); |
| 455 |
} |
| 453 |
/* |
456 |
/* |
| 454 |
* First, sync the memory before unmapping the entry |
457 |
* First, sync the memory before unmapping the entry |
| 455 |
*/ |
458 |
*/ |
|
Lines 676-681
swiotlb_map_sg_attrs(struct device *hwde
Link Here
|
| 676 |
phys_addr_t paddr = page_to_pseudophys(sg_page(sg)) |
679 |
phys_addr_t paddr = page_to_pseudophys(sg_page(sg)) |
| 677 |
+ sg->offset; |
680 |
+ sg->offset; |
| 678 |
|
681 |
|
|
|
682 |
if(dir != DMA_TO_DEVICE && sg->offset + sg->length > PAGE_SIZE) {//temp |
| 683 |
u8*p = sg_virt(sg); |
| 684 |
long offs = sg->offset + sg->length - 1; |
| 685 |
do { |
| 686 |
__asm__ __volatile__("lock orb $0, %0" : : "m" (p[offs])); |
| 687 |
offs -= PAGE_SIZE; |
| 688 |
} while(offs >= (long)sg->offset); |
| 689 |
WARN(sg->offset, "sg%d@%p[%d/%d] v=%p+%x:%x\n", dir, sgl, i, nelems, p, sg->offset, sg->length); |
| 690 |
} |
| 679 |
if (range_needs_mapping(paddr, sg->length) |
691 |
if (range_needs_mapping(paddr, sg->length) |
| 680 |
|| address_needs_mapping(hwdev, dev_addr, sg->length)) { |
692 |
|| address_needs_mapping(hwdev, dev_addr, sg->length)) { |
| 681 |
void *map; |
693 |
void *map; |