diff options
Diffstat (limited to 'arch/powerpc/platforms/ps3/system-bus.c')
| -rw-r--r-- | arch/powerpc/platforms/ps3/system-bus.c | 36 |
1 files changed, 19 insertions, 17 deletions
diff --git a/arch/powerpc/platforms/ps3/system-bus.c b/arch/powerpc/platforms/ps3/system-bus.c index a789bf58ca8..661e9f77ebf 100644 --- a/arch/powerpc/platforms/ps3/system-bus.c +++ b/arch/powerpc/platforms/ps3/system-bus.c | |||
| @@ -555,18 +555,19 @@ static void ps3_free_coherent(struct device *_dev, size_t size, void *vaddr, | |||
| 555 | } | 555 | } |
| 556 | 556 | ||
| 557 | /* Creates TCEs for a user provided buffer. The user buffer must be | 557 | /* Creates TCEs for a user provided buffer. The user buffer must be |
| 558 | * contiguous real kernel storage (not vmalloc). The address of the buffer | 558 | * contiguous real kernel storage (not vmalloc). The address passed here |
| 559 | * passed here is the kernel (virtual) address of the buffer. The buffer | 559 | * comprises a page address and offset into that page. The dma_addr_t |
| 560 | * need not be page aligned, the dma_addr_t returned will point to the same | 560 | * returned will point to the same byte within the page as was passed in. |
| 561 | * byte within the page as vaddr. | ||
| 562 | */ | 561 | */ |
| 563 | 562 | ||
| 564 | static dma_addr_t ps3_sb_map_single(struct device *_dev, void *ptr, size_t size, | 563 | static dma_addr_t ps3_sb_map_page(struct device *_dev, struct page *page, |
| 565 | enum dma_data_direction direction, struct dma_attrs *attrs) | 564 | unsigned long offset, size_t size, enum dma_data_direction direction, |
| 565 | struct dma_attrs *attrs) | ||
| 566 | { | 566 | { |
| 567 | struct ps3_system_bus_device *dev = ps3_dev_to_system_bus_dev(_dev); | 567 | struct ps3_system_bus_device *dev = ps3_dev_to_system_bus_dev(_dev); |
| 568 | int result; | 568 | int result; |
| 569 | unsigned long bus_addr; | 569 | unsigned long bus_addr; |
| 570 | void *ptr = page_address(page) + offset; | ||
| 570 | 571 | ||
| 571 | result = ps3_dma_map(dev->d_region, (unsigned long)ptr, size, | 572 | result = ps3_dma_map(dev->d_region, (unsigned long)ptr, size, |
| 572 | &bus_addr, | 573 | &bus_addr, |
| @@ -580,15 +581,16 @@ static dma_addr_t ps3_sb_map_single(struct device *_dev, void *ptr, size_t size, | |||
| 580 | return bus_addr; | 581 | return bus_addr; |
| 581 | } | 582 | } |
| 582 | 583 | ||
| 583 | static dma_addr_t ps3_ioc0_map_single(struct device *_dev, void *ptr, | 584 | static dma_addr_t ps3_ioc0_map_page(struct device *_dev, struct page *page, |
| 584 | size_t size, | 585 | unsigned long offset, size_t size, |
| 585 | enum dma_data_direction direction, | 586 | enum dma_data_direction direction, |
| 586 | struct dma_attrs *attrs) | 587 | struct dma_attrs *attrs) |
| 587 | { | 588 | { |
| 588 | struct ps3_system_bus_device *dev = ps3_dev_to_system_bus_dev(_dev); | 589 | struct ps3_system_bus_device *dev = ps3_dev_to_system_bus_dev(_dev); |
| 589 | int result; | 590 | int result; |
| 590 | unsigned long bus_addr; | 591 | unsigned long bus_addr; |
| 591 | u64 iopte_flag; | 592 | u64 iopte_flag; |
| 593 | void *ptr = page_address(page) + offset; | ||
| 592 | 594 | ||
| 593 | iopte_flag = IOPTE_M; | 595 | iopte_flag = IOPTE_M; |
| 594 | switch (direction) { | 596 | switch (direction) { |
| @@ -615,7 +617,7 @@ static dma_addr_t ps3_ioc0_map_single(struct device *_dev, void *ptr, | |||
| 615 | return bus_addr; | 617 | return bus_addr; |
| 616 | } | 618 | } |
| 617 | 619 | ||
| 618 | static void ps3_unmap_single(struct device *_dev, dma_addr_t dma_addr, | 620 | static void ps3_unmap_page(struct device *_dev, dma_addr_t dma_addr, |
| 619 | size_t size, enum dma_data_direction direction, struct dma_attrs *attrs) | 621 | size_t size, enum dma_data_direction direction, struct dma_attrs *attrs) |
| 620 | { | 622 | { |
| 621 | struct ps3_system_bus_device *dev = ps3_dev_to_system_bus_dev(_dev); | 623 | struct ps3_system_bus_device *dev = ps3_dev_to_system_bus_dev(_dev); |
| @@ -689,21 +691,21 @@ static int ps3_dma_supported(struct device *_dev, u64 mask) | |||
| 689 | static struct dma_mapping_ops ps3_sb_dma_ops = { | 691 | static struct dma_mapping_ops ps3_sb_dma_ops = { |
| 690 | .alloc_coherent = ps3_alloc_coherent, | 692 | .alloc_coherent = ps3_alloc_coherent, |
| 691 | .free_coherent = ps3_free_coherent, | 693 | .free_coherent = ps3_free_coherent, |
| 692 | .map_single = ps3_sb_map_single, | ||
| 693 | .unmap_single = ps3_unmap_single, | ||
| 694 | .map_sg = ps3_sb_map_sg, | 694 | .map_sg = ps3_sb_map_sg, |
| 695 | .unmap_sg = ps3_sb_unmap_sg, | 695 | .unmap_sg = ps3_sb_unmap_sg, |
| 696 | .dma_supported = ps3_dma_supported | 696 | .dma_supported = ps3_dma_supported, |
| 697 | .map_page = ps3_sb_map_page, | ||
| 698 | .unmap_page = ps3_unmap_page, | ||
| 697 | }; | 699 | }; |
| 698 | 700 | ||
| 699 | static struct dma_mapping_ops ps3_ioc0_dma_ops = { | 701 | static struct dma_mapping_ops ps3_ioc0_dma_ops = { |
| 700 | .alloc_coherent = ps3_alloc_coherent, | 702 | .alloc_coherent = ps3_alloc_coherent, |
| 701 | .free_coherent = ps3_free_coherent, | 703 | .free_coherent = ps3_free_coherent, |
| 702 | .map_single = ps3_ioc0_map_single, | ||
| 703 | .unmap_single = ps3_unmap_single, | ||
| 704 | .map_sg = ps3_ioc0_map_sg, | 704 | .map_sg = ps3_ioc0_map_sg, |
| 705 | .unmap_sg = ps3_ioc0_unmap_sg, | 705 | .unmap_sg = ps3_ioc0_unmap_sg, |
| 706 | .dma_supported = ps3_dma_supported | 706 | .dma_supported = ps3_dma_supported, |
| 707 | .map_page = ps3_ioc0_map_page, | ||
| 708 | .unmap_page = ps3_unmap_page, | ||
| 707 | }; | 709 | }; |
| 708 | 710 | ||
| 709 | /** | 711 | /** |
