@@ -1717,6 +1717,62 @@ static void pnv_pci_ioda_dma_dev_setup(struct pnv_phb *phb, struct pci_dev *pdev
1717
1717
*/
1718
1718
}
1719
1719
1720
+ static void pnv_pci_ioda_dma_sketchy_bypass (struct pnv_ioda_pe * pe )
1721
+ {
1722
+ /* Enable a transparent bypass into TVE #1 through DMA window 0 */
1723
+ s64 rc ;
1724
+ u64 addr ;
1725
+ u64 tce_count ;
1726
+ u64 table_size ;
1727
+ u64 tce_order = 28 ; /* 256MB TCEs */
1728
+ u64 window_size = memory_hotplug_max () + (1ULL << 32 );
1729
+ struct page * table_pages ;
1730
+ __be64 * tces ;
1731
+
1732
+ window_size = roundup_pow_of_two (memory_hotplug_max () + (1ULL << 32 ));
1733
+ tce_count = window_size >> tce_order ;
1734
+ table_size = tce_count << 3 ;
1735
+
1736
+ pr_debug ("ruscur: table_size %016llx PAGE_SIZE %016lx\n" ,
1737
+ table_size , PAGE_SIZE );
1738
+ if (table_size < PAGE_SIZE ) {
1739
+ pr_debug ("ruscur: set table_size to PAGE_SIZE\n" );
1740
+ table_size = PAGE_SIZE ;
1741
+ }
1742
+
1743
+ pr_debug ("ruscur: tce_count %016llx table_size %016llx\n" ,
1744
+ tce_count , table_size );
1745
+
1746
+ table_pages = alloc_pages_node (pe -> phb -> hose -> node , GFP_KERNEL ,
1747
+ get_order (table_size ));
1748
+
1749
+ pr_debug ("ruscur: got table_pages %p\n" , table_pages );
1750
+ /* TODO null checking */
1751
+ tces = page_address (table_pages );
1752
+ pr_debug ("ruscur: got tces %p\n" , tces );
1753
+ memset (tces , 0 , table_size );
1754
+
1755
+ for (addr = 0 ; addr < memory_hotplug_max (); addr += (1 << tce_order )) {
1756
+ pr_debug ("ruscur: addr %016llx index %016llx\n" , addr ,
1757
+ (addr + (1ULL << 32 )) >> tce_order );
1758
+ tces [(addr + (1ULL << 32 )) >> tce_order ] =
1759
+ cpu_to_be64 (addr | TCE_PCI_READ | TCE_PCI_WRITE );
1760
+ }
1761
+
1762
+ rc = opal_pci_map_pe_dma_window (pe -> phb -> opal_id ,
1763
+ pe -> pe_number ,
1764
+ /* reconfigure window 0 */
1765
+ (pe -> pe_number << 1 ) + 0 ,
1766
+ 1 , /* level (unsure what this means) */
1767
+ __pa (tces ),
1768
+ table_size ,
1769
+ 1 << tce_order );
1770
+ if (rc )
1771
+ pe_err (pe , "OPAL error %llx in sketchy bypass\n" , rc );
1772
+ else
1773
+ pe_info (pe , "ruscur's sketchy bypass worked, apparently\n" );
1774
+ }
1775
+
1720
1776
static int pnv_pci_ioda_dma_set_mask (struct pci_dev * pdev , u64 dma_mask )
1721
1777
{
1722
1778
struct pci_controller * hose = pci_bus_to_host (pdev -> bus );
@@ -1739,8 +1795,29 @@ static int pnv_pci_ioda_dma_set_mask(struct pci_dev *pdev, u64 dma_mask)
1739
1795
dev_info (& pdev -> dev , "Using 64-bit DMA iommu bypass\n" );
1740
1796
set_dma_ops (& pdev -> dev , & dma_direct_ops );
1741
1797
} else {
1742
- dev_info (& pdev -> dev , "Using 32-bit DMA via iommu\n" );
1743
- set_dma_ops (& pdev -> dev , & dma_iommu_ops );
1798
+ /* Find out if we want to address more than 2G */
1799
+ dev_info (& pdev -> dev , "My dma_mask is %016llx\n" , dma_mask );
1800
+ if (dma_mask >> 32 /*&& pe->device_count == 1*/ ) {
1801
+ /*
1802
+ * TODO
1803
+ * This mode shouldn't be used if the PE has any other
1804
+ * device on it. Things will go wrong.
1805
+ * We can't just check for device_count of 1 though,
1806
+ * because of things like GPUs with audio devices and
1807
+ * stuff like that. So we should walk the PE and check
1808
+ * if everything else on it has the same vendor ID...?
1809
+ */
1810
+ dev_info (& pdev -> dev , "%d devices on my PE\n" ,
1811
+ pe -> device_count );
1812
+ /* Set up the bypass mode */
1813
+ pnv_pci_ioda_dma_sketchy_bypass (pe );
1814
+ /* 4GB offset places us into TVE#1 */
1815
+ set_dma_offset (& pdev -> dev , (1ULL << 32 ));
1816
+ set_dma_ops (& pdev -> dev , & dma_direct_ops );
1817
+ } else {
1818
+ dev_info (& pdev -> dev , "Using 32-bit DMA via iommu\n" );
1819
+ set_dma_ops (& pdev -> dev , & dma_iommu_ops );
1820
+ }
1744
1821
}
1745
1822
* pdev -> dev .dma_mask = dma_mask ;
1746
1823
0 commit comments