@@ -1717,6 +1717,62 @@ static void pnv_pci_ioda_dma_dev_setup(struct pnv_phb *phb, struct pci_dev *pdev
17171717 */
17181718}
17191719
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+
17201776static int pnv_pci_ioda_dma_set_mask (struct pci_dev * pdev , u64 dma_mask )
17211777{
17221778 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)
17391795 dev_info (& pdev -> dev , "Using 64-bit DMA iommu bypass\n" );
17401796 set_dma_ops (& pdev -> dev , & dma_direct_ops );
17411797 } 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+ }
17441821 }
17451822 * pdev -> dev .dma_mask = dma_mask ;
17461823
0 commit comments