pci_dma.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:47k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * pci_dma.c
  3.  * Copyright (C) 2001 Mike Corrigan & Dave Engebretsen, IBM Corporation
  4.  *
  5.  * Dynamic DMA mapping support.
  6.  * 
  7.  * Manages the TCE space assigned to this partition.
  8.  * 
  9.  * This program is free software; you can redistribute it and/or modify
  10.  * it under the terms of the GNU General Public License as published by
  11.  * the Free Software Foundation; either version 2 of the License, or
  12.  * (at your option) any later version.
  13.  * 
  14.  * This program is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  * 
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this program; if not, write to the Free Software
  21.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  22.  */
  23. #include <linux/init.h>
  24. #include <linux/types.h>
  25. #include <linux/slab.h>
  26. #include <linux/mm.h>
  27. #include <linux/spinlock.h>
  28. #include <linux/string.h>
  29. #include <linux/pci.h>
  30. #include <asm/io.h>
  31. #include <asm/prom.h>
  32. #include <asm/rtas.h>
  33. #include <asm/ppcdebug.h>
  34. #include <asm/iSeries/HvCallXm.h>
  35. #include <asm/iSeries/LparData.h>
  36. #include <asm/pci_dma.h>
  37. #include <asm/pci-bridge.h>
  38. #include <asm/iSeries/iSeries_pci.h>
  39. #include <asm/machdep.h>
  40. #include "pci.h"
  41. /* #define DEBUG_TCE 1   */
  42. /* #define MONITOR_TCE 1 */ /* Turn on to sanity check TCE generation. */
  43. /* Initialize so this guy does not end up in the BSS section.
  44.  * Only used to pass OF initialization data set in prom.c into the main 
  45.  * kernel code -- data ultimately copied into tceTables[].
  46.  */
  47. extern struct _of_tce_table of_tce_table[];
  48. extern struct pci_controller* hose_head;
  49. extern struct pci_controller** hose_tail;
  50. extern struct list_head iSeries_Global_Device_List;
  51. struct TceTable   virtBusVethTceTable; /* Tce table for virtual ethernet */
  52. struct TceTable   virtBusVioTceTable; /* Tce table for virtual I/O */
  53. struct iSeries_Device_Node iSeries_veth_dev_node = { LogicalSlot: 0xFF, DevTceTable: &virtBusVethTceTable };
  54. struct iSeries_Device_Node iSeries_vio_dev_node  = { LogicalSlot: 0xFF, DevTceTable: &virtBusVioTceTable };
  55. struct pci_dev    iSeries_veth_dev_st = { sysdata: &iSeries_veth_dev_node };
  56. struct pci_dev    iSeries_vio_dev_st  = { sysdata: &iSeries_vio_dev_node  };
  57. struct pci_dev  * iSeries_veth_dev = &iSeries_veth_dev_st;
  58. struct pci_dev  * iSeries_vio_dev  = &iSeries_vio_dev_st;
  59. /* Device TceTable is stored in Device Node */
  60. /* struct TceTable * tceTables[256]; */ /* Tce tables for 256 busses
  61.  * Bus 255 is the virtual bus
  62.  * zero indicates no bus defined
  63.  */
  64. /* allocates a contiguous range of tces (power-of-2 size) */
  65. static inline long alloc_tce_range(struct TceTable *, 
  66.    unsigned order );
  67. /* allocates a contiguous range of tces (power-of-2 size)
  68.  * assumes lock already held
  69.  */
  70. static long alloc_tce_range_nolock(struct TceTable *, 
  71.    unsigned order );
  72. /* frees a contiguous range of tces (power-of-2 size) */
  73. static inline void free_tce_range(struct TceTable *, 
  74.   long tcenum, 
  75.   unsigned order );
  76. /* frees a contiguous rnage of tces (power-of-2 size)
  77.  * assumes lock already held
  78.  */
  79. void free_tce_range_nolock(struct TceTable *, 
  80.    long tcenum, 
  81.    unsigned order );
  82. /* allocates a range of tces and sets them to the pages  */
  83. static inline dma_addr_t get_tces( struct TceTable *, 
  84.    unsigned order, 
  85.    void *page, 
  86.    unsigned numPages,
  87.    int direction );
  88. static long test_tce_range( struct TceTable *, 
  89.     long tcenum, 
  90.     unsigned order );
  91. static unsigned fill_scatterlist_sg(struct scatterlist *sg, int nents, 
  92.     dma_addr_t dma_addr, 
  93.     unsigned long numTces );
  94. static unsigned long num_tces_sg( struct scatterlist *sg, 
  95.   int nents );
  96. static dma_addr_t create_tces_sg( struct TceTable *tbl, 
  97.   struct scatterlist *sg, 
  98.     int nents, 
  99.   unsigned numTces,
  100.   int direction );
  101. static void getTceTableParmsiSeries(struct iSeries_Device_Node* DevNode,
  102.       struct TceTable *tce_table_parms );
  103. static void getTceTableParmsPSeries( struct pci_controller *phb, 
  104.      struct device_node *dn,
  105.      struct TceTable *tce_table_parms );
  106. static void getTceTableParmsPSeriesLP(struct pci_controller *phb,
  107.     struct device_node *dn,
  108.     struct TceTable *newTceTable );
  109. static struct TceTable* findHwTceTable(struct TceTable * newTceTable );
  110. void create_pci_bus_tce_table( unsigned long token );
  111. u8 iSeries_Get_Bus( struct pci_dev * dv )
  112. {
  113. return 0;
  114. }
  115. static inline struct TceTable *get_tce_table(struct pci_dev *dev)
  116. {
  117. if (!dev)
  118. dev = ppc64_isabridge_dev;
  119. if (!dev)
  120. return NULL;
  121. if (naca->platform == PLATFORM_ISERIES_LPAR) {
  122.   return ISERIES_DEVNODE(dev)->DevTceTable;
  123. } else {
  124. return PCI_GET_DN(dev)->tce_table;
  125. }
  126. }
  127. static unsigned long __inline__ count_leading_zeros64( unsigned long x )
  128. {
  129. unsigned long lz;
  130. asm("cntlzd %0,%1" : "=r"(lz) : "r"(x));
  131. return lz;
  132. }
  133. static void tce_build_iSeries(struct TceTable *tbl, long tcenum, 
  134.        unsigned long uaddr, int direction )
  135. {
  136. u64 setTceRc;
  137. union Tce tce;
  138. PPCDBG(PPCDBG_TCE, "build_tce: uaddr = 0x%lxn", uaddr);
  139. PPCDBG(PPCDBG_TCE, "ttcenum = 0x%lx, tbl = 0x%lx, index=%lxn", 
  140.        tcenum, tbl, tbl->index);
  141. tce.wholeTce = 0;
  142. tce.tceBits.rpn = (virt_to_absolute(uaddr)) >> PAGE_SHIFT;
  143. /* If for virtual bus */
  144. if ( tbl->tceType == TCE_VB ) {
  145. tce.tceBits.valid = 1;
  146. tce.tceBits.allIo = 1;
  147. if ( direction != PCI_DMA_TODEVICE )
  148. tce.tceBits.readWrite = 1;
  149. } else {
  150. /* If for PCI bus */
  151. tce.tceBits.readWrite = 1; // Read allowed 
  152. if ( direction != PCI_DMA_TODEVICE )
  153. tce.tceBits.pciWrite = 1;
  154. }
  155. setTceRc = HvCallXm_setTce((u64)tbl->index, 
  156.    (u64)tcenum, 
  157.    tce.wholeTce );
  158. if(setTceRc) {
  159. panic("PCI_DMA: HvCallXm_setTce failed, Rc: 0x%lxn", setTceRc);
  160. }
  161. }
  162. static void tce_build_pSeries(struct TceTable *tbl, long tcenum, 
  163.        unsigned long uaddr, int direction )
  164. {
  165. union Tce tce;
  166. union Tce *tce_addr;
  167. PPCDBG(PPCDBG_TCE, "build_tce: uaddr = 0x%lxn", uaddr);
  168. PPCDBG(PPCDBG_TCE, "ttcenum = 0x%lx, tbl = 0x%lx, index=%lxn", 
  169.        tcenum, tbl, tbl->index);
  170. tce.wholeTce = 0;
  171. tce.tceBits.rpn = (virt_to_absolute(uaddr)) >> PAGE_SHIFT;
  172. tce.tceBits.readWrite = 1; // Read allowed 
  173. if ( direction != PCI_DMA_TODEVICE ) tce.tceBits.pciWrite = 1;
  174. tce_addr = ((union Tce *)tbl->base) + tcenum;
  175. *tce_addr = (union Tce)tce.wholeTce;
  176. }
  177. /* 
  178.  * Build a TceTable structure.  This contains a multi-level bit map which
  179.  * is used to manage allocation of the tce space.
  180.  */
  181. static struct TceTable *build_tce_table( struct TceTable * tbl )
  182. {
  183. unsigned long bits, bytes, totalBytes;
  184. unsigned long numBits[NUM_TCE_LEVELS], numBytes[NUM_TCE_LEVELS];
  185. unsigned i, k, m;
  186. unsigned char * pos, * p, b;
  187. PPCDBG(PPCDBG_TCEINIT, "build_tce_table: tbl = 0x%lxn", tbl);
  188. spin_lock_init( &(tbl->lock) );
  189. tbl->mlbm.maxLevel = 0;
  190. /* Compute number of bits and bytes for each level of the
  191.  * multi-level bit map
  192.  */ 
  193. totalBytes = 0;
  194. bits = tbl->size * (PAGE_SIZE / sizeof( union Tce ));
  195. for ( i=0; i<NUM_TCE_LEVELS; ++i ) {
  196. bytes = ((bits+63)/64) * 8;
  197. PPCDBG(PPCDBG_TCEINIT, "build_tce_table: level %d bits=%ld, bytes=%ldn", i, bits, bytes );
  198. numBits[i] = bits;
  199. numBytes[i] = bytes;
  200. bits /= 2;
  201. totalBytes += bytes;
  202. }
  203. PPCDBG(PPCDBG_TCEINIT, "build_tce_table: totalBytes=%ldn", totalBytes );
  204. pos = (char *)__get_free_pages( GFP_ATOMIC, get_order( totalBytes ));
  205.  
  206. if ( pos == NULL ) {
  207. panic("PCI_DMA: Allocation failed in build_tce_table!n");
  208. }
  209. /* For each level, fill in the pointer to the bit map,
  210.  * and turn on the last bit in the bit map (if the
  211.  * number of bits in the map is odd).  The highest
  212.  * level will get all of its bits turned on.
  213.  */
  214. memset( pos, 0, totalBytes );
  215. for (i=0; i<NUM_TCE_LEVELS; ++i) {
  216. if ( numBytes[i] ) {
  217. tbl->mlbm.level[i].map = pos;
  218. tbl->mlbm.maxLevel = i;
  219. if ( numBits[i] & 1 ) {
  220. p = pos + numBytes[i] - 1;
  221. m = (( numBits[i] % 8) - 1) & 7;
  222. *p = 0x80 >> m;
  223. PPCDBG(PPCDBG_TCEINIT, "build_tce_table: level %d last bit %xn", i, 0x80>>m );
  224. }
  225. }
  226. else
  227. tbl->mlbm.level[i].map = 0;
  228. pos += numBytes[i];
  229. tbl->mlbm.level[i].numBits = numBits[i];
  230. tbl->mlbm.level[i].numBytes = numBytes[i];
  231. }
  232. /* For the highest level, turn on all the bits */
  233. i = tbl->mlbm.maxLevel;
  234. p = tbl->mlbm.level[i].map;
  235. m = numBits[i];
  236. PPCDBG(PPCDBG_TCEINIT, "build_tce_table: highest level (%d) has all bits setn", i);
  237. for (k=0; k<numBytes[i]; ++k) {
  238. if ( m >= 8 ) {
  239. /* handle full bytes */
  240. *p++ = 0xff;
  241. m -= 8;
  242. }
  243. else if(m>0) {
  244. /* handle the last partial byte */
  245. b = 0x80;
  246. *p = 0;
  247. while (m) {
  248. *p |= b;
  249. b >>= 1;
  250. --m;
  251. }
  252. } else {
  253. break;
  254. }
  255. }
  256. return tbl;
  257. }
  258. static inline long alloc_tce_range( struct TceTable *tbl, unsigned order )
  259. {
  260. long retval;
  261. unsigned long flags;
  262. /* Lock the tce allocation bitmap */
  263. spin_lock_irqsave( &(tbl->lock), flags );
  264. /* Do the actual work */
  265. retval = alloc_tce_range_nolock( tbl, order );
  266. /* Unlock the tce allocation bitmap */
  267. spin_unlock_irqrestore( &(tbl->lock), flags );
  268. return retval;
  269. }
  270. static long alloc_tce_range_nolock( struct TceTable *tbl, unsigned order )
  271. {
  272. unsigned long numBits, numBytes;
  273. unsigned long i, bit, block, mask;
  274. long tcenum;
  275. u64 * map;
  276. /* If the order (power of 2 size) requested is larger than our
  277.  * biggest, indicate failure
  278.  */
  279. if(order >= NUM_TCE_LEVELS) {
  280. /* This can happen if block of TCE's are not found. This code      */
  281. /*  maybe in a recursive loop looking up the bit map for the range.*/
  282. panic("PCI_DMA: alloc_tce_range_nolock: invalid order: %dn",order);
  283. }
  284. numBits =  tbl->mlbm.level[order].numBits;
  285. numBytes = tbl->mlbm.level[order].numBytes;
  286. map =      (u64 *)tbl->mlbm.level[order].map;
  287. /* Initialize return value to -1 (failure) */
  288. tcenum = -1;
  289. /* Loop through the bytes of the bitmap */
  290. for (i=0; i<numBytes/8; ++i) {
  291. if ( *map ) {
  292. /* A free block is found, compute the block
  293.  * number (of this size)
  294.  */
  295. bit = count_leading_zeros64( *map );
  296. block = (i * 64) + bit;    /* Bit count to free entry */
  297. /* turn off the bit in the map to indicate
  298.  * that the block is now in use
  299.  */
  300. mask = 0x1UL << (63 - bit);
  301. *map &= ~mask;
  302. /* compute the index into our tce table for
  303.  * the first tce in the block
  304.  */
  305. PPCDBG(PPCDBG_TCE, "alloc_tce_range_nolock: allocating block %ld, (byte=%ld, bit=%ld) order %dn", block, i, bit, order );
  306. tcenum = block << order;
  307. return tcenum;
  308. }
  309. ++map;
  310. }
  311. #ifdef DEBUG_TCE
  312. if ( tcenum == -1 ) {
  313. PPCDBG(PPCDBG_TCE, "alloc_tce_range_nolock: no available blocks of order = %dn", order );
  314. if ( order < tbl->mlbm.maxLevel ) {
  315. PPCDBG(PPCDBG_TCE, "alloc_tce_range_nolock: trying next bigger sizen" );
  316. }
  317. else {
  318. panic("PCI_DMA: alloc_tce_range_nolock: maximum size reached...failingn");
  319. }
  320. }
  321. #endif
  322. /* If no block of the requested size was found, try the next
  323.  * size bigger.  If one of those is found, return the second
  324.  * half of the block to freespace and keep the first half
  325.  */
  326. if((tcenum == -1) && (order < (NUM_TCE_LEVELS - 1))) {
  327. tcenum = alloc_tce_range_nolock( tbl, order+1 );
  328. if ( tcenum != -1 ) {
  329. free_tce_range_nolock( tbl, tcenum+(1<<order), order );
  330. }
  331. }
  332. /* Return the index of the first tce in the block
  333.  * (or -1 if we failed)
  334.  */
  335. return tcenum;
  336. }
  337. static inline void free_tce_range(struct TceTable *tbl, 
  338.   long tcenum, unsigned order )
  339. {
  340. unsigned long flags;
  341. /* Lock the tce allocation bitmap */
  342. spin_lock_irqsave( &(tbl->lock), flags );
  343. /* Do the actual work */
  344. free_tce_range_nolock( tbl, tcenum, order );
  345. /* Unlock the tce allocation bitmap */
  346. spin_unlock_irqrestore( &(tbl->lock), flags );
  347. }
  348. void free_tce_range_nolock(struct TceTable *tbl, 
  349.    long tcenum, unsigned order )
  350. {
  351. unsigned long block;
  352. unsigned byte, bit, mask, b;
  353. unsigned char  * map, * bytep;
  354. if (order >= NUM_TCE_LEVELS) {
  355. panic("PCI_DMA: free_tce_range: invalid order: 0x%xn",order);
  356. return;
  357. }
  358. block = tcenum >> order;
  359. #ifdef MONITOR_TCE
  360. if ( tcenum != (block << order ) ) {
  361. printk("PCI_DMA: Free_tce_range: tcenum %lx misaligned for order %xn",tcenum, order);
  362. return;
  363. }
  364. if ( block >= tbl->mlbm.level[order].numBits ) {
  365. printk("PCI_DMA: Free_tce_range: tcenum %lx is outside the range of this map (order %x, numBits %lxn", 
  366.        tcenum, order, tbl->mlbm.level[order].numBits );
  367. return;
  368. }
  369. if ( test_tce_range( tbl, tcenum, order ) ) {
  370. printk("PCI_DMA: Freeing range not allocated: tTceTable %p, tcenum %lx, order %xn",tbl, tcenum, order );
  371. return;
  372. }
  373. #endif
  374. map = tbl->mlbm.level[order].map;
  375. byte  = block / 8;
  376. bit   = block % 8;
  377. mask  = 0x80 >> bit;
  378. bytep = map + byte;
  379. #ifdef DEBUG_TCE
  380. PPCDBG(PPCDBG_TCE,"free_tce_range_nolock: freeing block %ld (byte=%d, bit=%d) of order %dn",
  381.        block, byte, bit, order);
  382. #endif
  383. #ifdef MONITOR_TCE
  384. if ( *bytep & mask ) {
  385. panic("PCI_DMA: Tce already free: TceTable %p, tcenum %lx, order %xn",tbl,tcenum,order);
  386. }
  387. #endif
  388. *bytep |= mask;
  389. /* If there is a higher level in the bit map than this we may be
  390.  * able to buddy up this block with its partner.
  391.  *   If this is the highest level we can't buddy up
  392.  *   If this level has an odd number of bits and
  393.  *      we are freeing the last block we can't buddy up
  394.  * Don't buddy up if it's in the first 1/4 of the level
  395.  */
  396. if (( order < tbl->mlbm.maxLevel ) &&
  397.     ( block > (tbl->mlbm.level[order].numBits/4) ) &&
  398.     (( block < tbl->mlbm.level[order].numBits-1 ) ||
  399.       ( 0 == ( tbl->mlbm.level[order].numBits & 1)))) {
  400. /* See if we can buddy up the block we just freed */
  401. bit  &= 6; /* get to the first of the buddy bits */
  402. mask  = 0xc0 >> bit; /* build two bit mask */
  403. b     = *bytep & mask; /* Get the two bits */
  404. if ( 0 == (b ^ mask) ) { /* If both bits are on */
  405. /* both of the buddy blocks are free we can combine them */
  406. *bytep ^= mask; /* turn off the two bits */
  407. block = ( byte * 8 ) + bit; /* block of first of buddies */
  408. tcenum = block << order;
  409. /* free the buddied block */
  410. PPCDBG(PPCDBG_TCE, 
  411.        "free_tce_range: buddying blocks %ld & %ldn",
  412.        block, block+1);
  413. free_tce_range_nolock( tbl, tcenum, order+1 ); 
  414. }
  415. }
  416. }
  417. static long test_tce_range( struct TceTable *tbl, long tcenum, unsigned order )
  418. {
  419. unsigned long block;
  420. unsigned byte, bit, mask, b;
  421. long retval, retLeft, retRight;
  422. unsigned char  * map;
  423. map = tbl->mlbm.level[order].map;
  424. block = tcenum >> order;
  425. byte = block / 8; /* Byte within bitmap */
  426. bit  = block % 8; /* Bit within byte */
  427. mask = 0x80 >> bit;
  428. b    = (*(map+byte) & mask ); /* 0 if block is allocated, else free */
  429. if ( b ) 
  430. retval = 1; /* 1 == block is free */
  431. else
  432. retval = 0; /* 0 == block is allocated */
  433. /* Test bits at all levels below this to ensure that all agree */
  434. if (order) {
  435. retLeft  = test_tce_range( tbl, tcenum, order-1 );
  436. retRight = test_tce_range( tbl, tcenum+(1<<(order-1)), order-1 );
  437. if ( retLeft || retRight ) {
  438. retval = 2;
  439. }
  440. }
  441. /* Test bits at all levels above this to ensure that all agree */
  442. return retval;
  443. }
  444. static inline dma_addr_t get_tces( struct TceTable *tbl, unsigned order, void *page, unsigned numPages, int direction )
  445. {
  446. long tcenum;
  447. unsigned long uaddr;
  448. unsigned i;
  449. dma_addr_t retTce = NO_TCE;
  450. uaddr = (unsigned long)page & PAGE_MASK;
  451. /* Allocate a range of tces */
  452. tcenum = alloc_tce_range( tbl, order );
  453. if ( tcenum != -1 ) {
  454. /* We got the tces we wanted */
  455. tcenum += tbl->startOffset; /* Offset into real TCE table */
  456. retTce = tcenum << PAGE_SHIFT; /* Set the return dma address */
  457. /* Setup a tce for each page */
  458. for (i=0; i<numPages; ++i) {
  459. ppc_md.tce_build(tbl, tcenum, uaddr, direction); 
  460. ++tcenum;
  461. uaddr += PAGE_SIZE;
  462. }
  463. /* Make sure the update is visible to hardware. 
  464.    sync required to synchronize the update to 
  465.    the TCE table with the MMIO that will send
  466.    the bus address to the IOA */
  467. __asm__ __volatile__ ("sync" : : : "memory");
  468. }
  469. else {
  470. panic("PCI_DMA: Tce Allocation failure in get_tces. 0x%pn",tbl);
  471. }
  472. return retTce; 
  473. }
  474. static void tce_free_one_iSeries( struct TceTable *tbl, long tcenum )
  475. {
  476. u64 set_tce_rc;
  477. union Tce tce;
  478. tce.wholeTce = 0;
  479. set_tce_rc = HvCallXm_setTce((u64)tbl->index,
  480.    (u64)tcenum,
  481.    tce.wholeTce);
  482. if ( set_tce_rc ) 
  483. panic("PCI_DMA: HvCallXm_setTce failed, Rc: 0x%lxn", set_tce_rc);
  484. }
  485. static void tce_free_one_pSeries( struct TceTable *tbl, long tcenum )
  486. {
  487. union Tce tce;
  488. union Tce *tce_addr;
  489. tce.wholeTce = 0;
  490. tce_addr  = ((union Tce *)tbl->base) + tcenum;
  491. *tce_addr = (union Tce)tce.wholeTce;
  492. }
  493. static void tce_free(struct TceTable *tbl, dma_addr_t dma_addr, 
  494.      unsigned order, unsigned num_pages)
  495. {
  496. long tcenum, total_tces, free_tce;
  497. unsigned i;
  498. total_tces = (tbl->size * (PAGE_SIZE / sizeof(union Tce)));
  499. tcenum = dma_addr >> PAGE_SHIFT;
  500. free_tce = tcenum - tbl->startOffset;
  501. if ( ( (free_tce + num_pages) > total_tces ) ||
  502.      ( tcenum < tbl->startOffset ) ) {
  503. printk("tce_free: invalid tcenumn");
  504. printk("ttcenum    = 0x%lxn", tcenum); 
  505. printk("tTCE Table = 0x%lxn", (u64)tbl);
  506. printk("tbus#      = 0x%lxn", (u64)tbl->busNumber );
  507. printk("tsize      = 0x%lxn", (u64)tbl->size);
  508. printk("tstartOff  = 0x%lxn", (u64)tbl->startOffset );
  509. printk("tindex     = 0x%lxn", (u64)tbl->index);
  510. return;
  511. }
  512. for (i=0; i<num_pages; ++i) {
  513. ppc_md.tce_free_one(tbl, tcenum);
  514. ++tcenum;
  515. }
  516. /* No sync (to make TCE change visible) is required here.
  517.    The lwsync when acquiring the lock in free_tce_range
  518.    is sufficient to synchronize with the bitmap.
  519. */
  520. free_tce_range( tbl, free_tce, order );
  521. }
  522. void __init create_virtual_bus_tce_table(void)
  523. {
  524. struct TceTable *t;
  525. struct TceTableManagerCB virtBusTceTableParms;
  526. u64 absParmsPtr;
  527. virtBusTceTableParms.busNumber = 255; /* Bus 255 is the virtual bus */
  528. virtBusTceTableParms.virtualBusFlag = 0xff; /* Ask for virtual bus */
  529. absParmsPtr = virt_to_absolute( (u64)&virtBusTceTableParms );
  530. HvCallXm_getTceTableParms( absParmsPtr );
  531. virtBusVethTceTable.size = virtBusTceTableParms.size / 2;
  532. virtBusVethTceTable.busNumber = virtBusTceTableParms.busNumber;
  533. virtBusVethTceTable.startOffset = virtBusTceTableParms.startOffset;
  534. virtBusVethTceTable.index = virtBusTceTableParms.index;
  535. virtBusVethTceTable.tceType = TCE_VB;
  536. virtBusVioTceTable.size = virtBusTceTableParms.size - virtBusVethTceTable.size;
  537. virtBusVioTceTable.busNumber = virtBusTceTableParms.busNumber;
  538. virtBusVioTceTable.startOffset = virtBusTceTableParms.startOffset +
  539. virtBusVethTceTable.size * (PAGE_SIZE/sizeof(union Tce));
  540. virtBusVioTceTable.index = virtBusTceTableParms.index;
  541. virtBusVioTceTable.tceType = TCE_VB; 
  542. t = build_tce_table( &virtBusVethTceTable );
  543. if ( t ) {
  544. /* tceTables[255] = t; */
  545. //VirtBusVethTceTable = t;
  546. printk( "Virtual Bus VETH TCE table built successfully.n");
  547. printk( "  TCE table size = %ld entriesn", 
  548. (unsigned long)t->size*(PAGE_SIZE/sizeof(union Tce)) );
  549. printk( "  TCE table token = %dn",
  550. (unsigned)t->index );
  551. printk( "  TCE table start entry = 0x%lxn",
  552. (unsigned long)t->startOffset );
  553. }
  554. else printk( "Virtual Bus VETH TCE table failed.n");
  555. t = build_tce_table( &virtBusVioTceTable );
  556. if ( t ) {
  557. //VirtBusVioTceTable = t;
  558. printk( "Virtual Bus VIO TCE table built successfully.n");
  559. printk( "  TCE table size = %ld entriesn", 
  560. (unsigned long)t->size*(PAGE_SIZE/sizeof(union Tce)) );
  561. printk( "  TCE table token = %dn",
  562. (unsigned)t->index );
  563. printk( "  TCE table start entry = 0x%lxn",
  564. (unsigned long)t->startOffset );
  565. }
  566. else printk( "Virtual Bus VIO TCE table failed.n");
  567. }
  568. void create_tce_tables_for_buses(struct list_head *bus_list)
  569. {
  570. struct pci_controller* phb;
  571. struct device_node *dn, *first_dn;
  572. int num_slots, num_slots_ilog2;
  573. int first_phb = 1;
  574. for (phb=hose_head;phb;phb=phb->next) {
  575. first_dn = ((struct device_node *)phb->arch_data)->child;
  576. /* Carve 2GB into the largest dma_window_size possible */
  577. for (dn = first_dn, num_slots = 0; dn != NULL; dn = dn->sibling)
  578. num_slots++;
  579. num_slots_ilog2 = __ilog2(num_slots);
  580. if ((1<<num_slots_ilog2) != num_slots)
  581. num_slots_ilog2++;
  582. phb->dma_window_size = 1 << (22 - num_slots_ilog2);
  583. /* Reserve 16MB of DMA space on the first PHB.
  584.  * We should probably be more careful and use firmware props.
  585.  * In reality this space is remapped, not lost.  But we don't
  586.  * want to get that smart to handle it -- too much work.
  587.  */
  588. phb->dma_window_base_cur = first_phb ? (1 << 12) : 0;
  589. first_phb = 0;
  590. for (dn = first_dn, num_slots = 0; dn != NULL; dn = dn->sibling) {
  591. create_pci_bus_tce_table((unsigned long)dn);
  592. }
  593. }
  594. }
  595. void create_tce_tables_for_busesLP(struct list_head *bus_list)
  596. {
  597. struct list_head *ln;
  598. struct pci_bus *bus;
  599. struct device_node *busdn;
  600. u32 *dma_window;
  601. for (ln=bus_list->next; ln != bus_list; ln=ln->next) {
  602. bus = pci_bus_b(ln);
  603. busdn = PCI_GET_DN(bus);
  604. /* NOTE: there should never be a window declared on a bus when
  605.  * child devices also have a window.  If this should ever be
  606.  * architected, we probably want children to have priority.
  607.  * In reality, the PHB containing ISA has the property, but otherwise
  608.  * it is the pci-bridges that have the property.
  609.  */
  610. dma_window = (u32 *)get_property(busdn, "ibm,dma-window", 0);
  611. if (dma_window) {
  612. /* Busno hasn't been copied yet.
  613.  * Do it now because getTceTableParmsPSeriesLP needs it.
  614.  */
  615. busdn->busno = bus->number;
  616. create_pci_bus_tce_table((unsigned long)busdn);
  617. } else
  618. create_tce_tables_for_busesLP(&bus->children);
  619. }
  620. }
  621. void create_tce_tables(void) {
  622. struct pci_dev *dev;
  623. struct device_node *dn, *mydn;
  624. if (naca->platform == PLATFORM_PSERIES_LPAR) {
  625. create_tce_tables_for_busesLP(&pci_root_buses);
  626. }
  627. else {
  628. create_tce_tables_for_buses(&pci_root_buses);
  629. }
  630. /* Now copy the tce_table ptr from the bus devices down to every
  631.  * pci device_node.  This means get_tce_table() won't need to search
  632.  * up the device tree to find it.
  633.  */
  634. pci_for_each_dev(dev) {
  635. mydn = dn = PCI_GET_DN(dev);
  636. while (dn && dn->tce_table == NULL)
  637. dn = dn->parent;
  638. if (dn) {
  639. mydn->tce_table = dn->tce_table;
  640. }
  641. }
  642. }
  643. /*
  644.  * iSeries token = iSeries_device_Node*
  645.  * pSeries token = pci_controller*
  646.  *
  647.  */
  648. void create_pci_bus_tce_table( unsigned long token ) {
  649. struct TceTable * newTceTable;
  650. PPCDBG(PPCDBG_TCE, "Entering create_pci_bus_tce_table.n");
  651. PPCDBG(PPCDBG_TCE, "ttoken = 0x%lxn", token);
  652. newTceTable = (struct TceTable *)kmalloc( sizeof(struct TceTable), GFP_KERNEL );
  653. /*****************************************************************/
  654.   /* For the iSeries machines, the HvTce Table can be one of three */
  655.   /* flavors,                                                      */
  656.   /* - Single bus TCE table,                                       */
  657.   /* - Tce Table Share between buses,                              */
  658.   /* - Tce Table per logical slot.                                 */
  659. /*****************************************************************/
  660. if(naca->platform == PLATFORM_ISERIES_LPAR) {
  661. struct iSeries_Device_Node* DevNode = (struct iSeries_Device_Node*)token;
  662. getTceTableParmsiSeries(DevNode,newTceTable);
  663. /* Look for existing TCE table for this device.          */
  664. DevNode->DevTceTable = findHwTceTable(newTceTable );
  665. if( DevNode->DevTceTable == NULL) {
  666. DevNode->DevTceTable = build_tce_table( newTceTable );
  667. }
  668. else {
  669.     /* We're using a shared table, free this new one.    */
  670.     kfree(newTceTable);
  671. }
  672. printk("Pci Device 0x%p TceTable: %pn",DevNode,DevNode->DevTceTable);
  673.   return;
  674. }
  675. /* pSeries Leg */
  676. else {
  677. struct device_node *dn;
  678. struct pci_controller *phb;
  679. dn = (struct device_node *)token;
  680. phb = dn->phb;
  681. if (naca->platform == PLATFORM_PSERIES)
  682. getTceTableParmsPSeries(phb, dn, newTceTable);
  683. else
  684. getTceTableParmsPSeriesLP(phb, dn, newTceTable);
  685. dn->tce_table  = build_tce_table( newTceTable );
  686. }
  687. }
  688. /***********************************************************************/
  689. /* This function compares the known Tce tables to find a TceTable that */
  690. /* has already been built for hardware TCEs.                           */
  691. /* Search the complete(all devices) for a TCE table assigned.  If the  */
  692. /* startOffset, index, and size match, then the TCE for this device has*/
  693. /* already been built and it should be shared with this device         */
  694. /***********************************************************************/
  695. static struct TceTable* findHwTceTable(struct TceTable * newTceTable )
  696. {
  697. struct list_head* Device_Node_Ptr    = iSeries_Global_Device_List.next;
  698. /* Cache the compare values. */
  699. u64  startOffset = newTceTable->startOffset;
  700. u64  index       = newTceTable->index;
  701. u64  size        = newTceTable->size;
  702. while(Device_Node_Ptr != &iSeries_Global_Device_List) {
  703. struct iSeries_Device_Node* CmprNode = (struct iSeries_Device_Node*)Device_Node_Ptr;
  704. if( CmprNode->DevTceTable != NULL &&
  705.     CmprNode->DevTceTable->tceType == TCE_PCI) {
  706. if( CmprNode->DevTceTable->startOffset == startOffset &&
  707.     CmprNode->DevTceTable->index       == index       &&
  708.     CmprNode->DevTceTable->size        == size        ) {
  709. printk("PCI TCE table matches 0x%p n",CmprNode->DevTceTable);
  710. return CmprNode->DevTceTable;
  711. }
  712. }
  713. /* Get next Device Node in List             */
  714. Device_Node_Ptr = Device_Node_Ptr->next;
  715. }
  716. return NULL;
  717. }
  718. /***********************************************************************/
  719. /* Call Hv with the architected data structure to get TCE table info.  */
  720. /* info. Put the returned data into the Linux representation of the    */
  721. /* TCE table data.                                                     */
  722. /* The Hardware Tce table comes in three flavors.                      */ 
  723. /* 1. TCE table shared between Buses.                                  */
  724. /* 2. TCE table per Bus.                                               */
  725. /* 3. TCE Table per IOA.                                               */
  726. /***********************************************************************/
  727. static void getTceTableParmsiSeries(struct iSeries_Device_Node* DevNode,
  728.     struct TceTable* newTceTable )
  729. {
  730. struct TceTableManagerCB* pciBusTceTableParms = (struct TceTableManagerCB*)kmalloc( sizeof(struct TceTableManagerCB), GFP_KERNEL );
  731. if(pciBusTceTableParms == NULL) panic("PCI_DMA: TCE Table Allocation failed.");
  732. memset( (void*)pciBusTceTableParms,0,sizeof(struct TceTableManagerCB) );
  733. pciBusTceTableParms->busNumber      = ISERIES_BUS(DevNode);
  734. pciBusTceTableParms->logicalSlot    = DevNode->LogicalSlot;
  735. pciBusTceTableParms->virtualBusFlag = 0;
  736. HvCallXm_getTceTableParms( REALADDR(pciBusTceTableParms) );
  737.         /* PciTceTableParms Bus:0x18 Slot:0x04 Start:0x000000 Offset:0x04c000 Size:0x0020 */
  738. printk("PciTceTableParms Bus:0x%02lx Slot:0x%02x Start:0x%06lx Offset:0x%06lx Size:0x%04lxn",
  739.        pciBusTceTableParms->busNumber,
  740.        pciBusTceTableParms->logicalSlot,
  741.        pciBusTceTableParms->start,
  742.        pciBusTceTableParms->startOffset,
  743.        pciBusTceTableParms->size);
  744. if(pciBusTceTableParms->size == 0) {
  745. printk("PCI_DMA: Possible Structure mismatch, 0x%pn",pciBusTceTableParms);
  746. panic( "PCI_DMA: pciBusTceTableParms->size is zero, halt here!");
  747. }
  748. newTceTable->size        = pciBusTceTableParms->size;
  749. newTceTable->busNumber   = pciBusTceTableParms->busNumber;
  750. newTceTable->startOffset = pciBusTceTableParms->startOffset;
  751. newTceTable->index       = pciBusTceTableParms->index;
  752. newTceTable->tceType     = TCE_PCI;
  753. kfree(pciBusTceTableParms);
  754. }
  755. static void getTceTableParmsPSeries(struct pci_controller *phb,
  756.     struct device_node *dn,
  757.     struct TceTable *newTceTable ) {
  758. phandle node;
  759. unsigned long i;
  760. node = ((struct device_node *)(phb->arch_data))->node;
  761. PPCDBG(PPCDBG_TCEINIT, "getTceTableParms: startn"); 
  762. PPCDBG(PPCDBG_TCEINIT, "tof_tce_table = 0x%lxn", of_tce_table); 
  763. PPCDBG(PPCDBG_TCEINIT, "tphb          = 0x%lxn", phb); 
  764. PPCDBG(PPCDBG_TCEINIT, "tdn           = 0x%lxn", dn); 
  765. PPCDBG(PPCDBG_TCEINIT, "tdn->name     = %sn", dn->name); 
  766. PPCDBG(PPCDBG_TCEINIT, "tdn->full_name= %sn", dn->full_name); 
  767. PPCDBG(PPCDBG_TCEINIT, "tnewTceTable  = 0x%lxn", newTceTable); 
  768. PPCDBG(PPCDBG_TCEINIT, "tdma_window_size = 0x%lxn", phb->dma_window_size); 
  769. i = 0;
  770. while(of_tce_table[i].node) {
  771. PPCDBG(PPCDBG_TCEINIT, "tof_tce_table[%d].node = 0x%lxn", 
  772.        i, of_tce_table[i].node);
  773. PPCDBG(PPCDBG_TCEINIT, "tof_tce_table[%d].base = 0x%lxn", 
  774.        i, of_tce_table[i].base);
  775. PPCDBG(PPCDBG_TCEINIT, "tof_tce_table[%d].size = 0x%lxn", 
  776.        i, of_tce_table[i].size >> PAGE_SHIFT);
  777. PPCDBG(PPCDBG_TCEINIT, "tphb->arch_data->node = 0x%lxn", 
  778.        node);
  779. if(of_tce_table[i].node == node) {
  780. memset((void *)of_tce_table[i].base, 
  781.        0, of_tce_table[i].size);
  782. newTceTable->busNumber = phb->bus->number;
  783. /* Units of tce entries.                        */
  784. newTceTable->startOffset = phb->dma_window_base_cur;
  785. /* Adjust the current table offset to the next  */
  786. /* region.  Measured in TCE entries. Force an   */
  787. /* alignment to the size alloted per IOA. This  */
  788. /* makes it easier to remove the 1st 16MB.      */
  789. phb->dma_window_base_cur += (phb->dma_window_size>>3);
  790. phb->dma_window_base_cur &= 
  791. ~((phb->dma_window_size>>3)-1);
  792. /* Set the tce table size - measured in units   */
  793. /* of pages of tce table.                       */
  794. newTceTable->size = ((phb->dma_window_base_cur -
  795.       newTceTable->startOffset) << 3)
  796.       >> PAGE_SHIFT;
  797. /* Test if we are going over 2GB of DMA space.  */
  798. if(phb->dma_window_base_cur > (1 << 19)) { 
  799. panic("PCI_DMA: Unexpected number of IOAs under this PHB.n"); 
  800. }
  801. newTceTable->base = of_tce_table[i].base;
  802. newTceTable->index = 0;
  803. PPCDBG(PPCDBG_TCEINIT, 
  804.        "tnewTceTable->base        = 0x%lxn",
  805.        newTceTable->base);
  806. PPCDBG(PPCDBG_TCEINIT, 
  807.        "tnewTceTable->startOffset = 0x%lx"
  808.        "(# tce entries)n", 
  809.        newTceTable->startOffset);
  810. PPCDBG(PPCDBG_TCEINIT, 
  811.        "tnewTceTable->size        = 0x%lx"
  812.        "(# pages of tce table)n", 
  813.        newTceTable->size);
  814. }
  815. i++;
  816. }
  817. }
  818. /*
  819.  * getTceTableParmsPSeriesLP
  820.  *
  821.  * Function: On pSeries LPAR systems, return TCE table info, given a pci bus.
  822.  *
  823.  * ToDo: properly interpret the ibm,dma-window property.  The definition is:
  824.  * logical-bus-number (1 word)
  825.  * phys-address (#address-cells words)
  826.  * size (#cell-size words)
  827.  *
  828.  * Currently we hard code these sizes (more or less).
  829.  */
  830. static void getTceTableParmsPSeriesLP(struct pci_controller *phb,
  831.     struct device_node *dn,
  832.     struct TceTable *newTceTable ) {
  833. u32 *dma_window = (u32 *)get_property(dn, "ibm,dma-window", 0);
  834. if (!dma_window) {
  835. panic("PCI_DMA: getTceTableParmsPSeriesLP: device %s has no ibm,dma-window property!n", dn->full_name);
  836. }
  837. newTceTable->busNumber = dn->busno;
  838. newTceTable->size = (((((unsigned long)dma_window[4] << 32) | (unsigned long)dma_window[5]) >> PAGE_SHIFT) << 3) >> PAGE_SHIFT;
  839. newTceTable->startOffset = ((((unsigned long)dma_window[2] << 32) | (unsigned long)dma_window[3]) >> 12);
  840. newTceTable->base = 0;
  841. newTceTable->index = dma_window[0];
  842. PPCDBG(PPCDBG_TCEINIT, "getTceTableParmsPSeriesLP for bus 0x%lx:n", dn->busno);
  843. PPCDBG(PPCDBG_TCEINIT, "tDevice = %sn", dn->full_name);
  844. PPCDBG(PPCDBG_TCEINIT, "tnewTceTable->index       = 0x%lxn", newTceTable->index);
  845. PPCDBG(PPCDBG_TCEINIT, "tnewTceTable->startOffset = 0x%lxn", newTceTable->startOffset);
  846. PPCDBG(PPCDBG_TCEINIT, "tnewTceTable->size        = 0x%lxn", newTceTable->size);
  847. }
  848. /* Allocates a contiguous real buffer and creates TCEs over it.
  849.  * Returns the virtual address of the buffer and sets dma_handle
  850.  * to the dma address (tce) of the first page.
  851.  */
  852. void *pci_alloc_consistent(struct pci_dev *hwdev, size_t size,
  853.    dma_addr_t *dma_handle)
  854. {
  855. struct TceTable * tbl;
  856. void *ret = NULL;
  857. unsigned order, nPages;
  858. dma_addr_t tce;
  859. PPCDBG(PPCDBG_TCE, "pci_alloc_consistent:n");
  860. PPCDBG(PPCDBG_TCE, "thwdev      = 0x%16.16lxn", hwdev);
  861. PPCDBG(PPCDBG_TCE, "tsize       = 0x%16.16lxn", size);
  862. PPCDBG(PPCDBG_TCE, "tdma_handle = 0x%16.16lxn", dma_handle);
  863. size = PAGE_ALIGN(size);
  864. order = get_order(size);
  865. nPages = 1 << order;
  866.   /* Client asked for way to much space.  This is checked later anyway */
  867. /* It is easier to debug here for the drivers than in the tce tables.*/
  868.   if(order >= NUM_TCE_LEVELS) {
  869.   printk("PCI_DMA: pci_alloc_consistent size to large: 0x%lx n",size);
  870.   return (void *)NO_TCE;
  871.   }
  872. tbl = get_tce_table(hwdev); 
  873. if ( tbl ) {
  874. /* Alloc enough pages (and possibly more) */
  875. ret = (void *)__get_free_pages( GFP_ATOMIC, order );
  876. if ( ret ) {
  877. /* Page allocation succeeded */
  878. memset(ret, 0, nPages << PAGE_SHIFT);
  879. /* Set up tces to cover the allocated range */
  880. tce = get_tces( tbl, order, ret, nPages, PCI_DMA_BIDIRECTIONAL );
  881. if ( tce == NO_TCE ) {
  882. PPCDBG(PPCDBG_TCE, "pci_alloc_consistent: get_tces failedn" );
  883. free_pages( (unsigned long)ret, order );
  884. ret = NULL;
  885. }
  886. else
  887. {
  888. *dma_handle = tce;
  889. }
  890. }
  891. else PPCDBG(PPCDBG_TCE, "pci_alloc_consistent: __get_free_pages failed for order = %dn", order);
  892. }
  893. else PPCDBG(PPCDBG_TCE, "pci_alloc_consistent: get_tce_table failed for 0x%016lxn", hwdev);
  894. PPCDBG(PPCDBG_TCE, "tpci_alloc_consistent: dma_handle = 0x%16.16lxn", *dma_handle);
  895. PPCDBG(PPCDBG_TCE, "tpci_alloc_consistent: return     = 0x%16.16lxn", ret);
  896. return ret;
  897. }
  898. void pci_free_consistent(struct pci_dev *hwdev, size_t size,
  899.  void *vaddr, dma_addr_t dma_handle)
  900. {
  901. struct TceTable * tbl;
  902. unsigned order, nPages;
  903. PPCDBG(PPCDBG_TCE, "pci_free_consistent:n");
  904. PPCDBG(PPCDBG_TCE, "thwdev = 0x%16.16lx, size = 0x%16.16lx, dma_handle = 0x%16.16lx, vaddr = 0x%16.16lxn", hwdev, size, dma_handle, vaddr);
  905. size = PAGE_ALIGN(size);
  906. order = get_order(size);
  907. nPages = 1 << order;
  908.   /* Client asked for way to much space.  This is checked later anyway */
  909. /* It is easier to debug here for the drivers than in the tce tables.*/
  910.   if(order >= NUM_TCE_LEVELS) {
  911.   printk("PCI_DMA: pci_free_consistent size to large: 0x%lx n",size);
  912.   return;
  913.   }
  914. tbl = get_tce_table(hwdev); 
  915. if ( tbl ) {
  916. tce_free(tbl, dma_handle, order, nPages);
  917. free_pages( (unsigned long)vaddr, order );
  918. }
  919. }
  920. /* Creates TCEs for a user provided buffer.  The user buffer must be 
  921.  * contiguous real kernel storage (not vmalloc).  The address of the buffer
  922.  * passed here is the kernel (virtual) address of the buffer.  The buffer
  923.  * need not be page aligned, the dma_addr_t returned will point to the same
  924.  * byte within the page as vaddr.
  925.  */
  926. dma_addr_t pci_map_single(struct pci_dev *hwdev, void *vaddr, 
  927.   size_t size, int direction )
  928. {
  929. struct TceTable * tbl;
  930. dma_addr_t dma_handle = NO_TCE;
  931. unsigned long uaddr;
  932. unsigned order, nPages;
  933. PPCDBG(PPCDBG_TCE, "pci_map_single:n");
  934. PPCDBG(PPCDBG_TCE, "thwdev = 0x%16.16lx, size = 0x%16.16lx, direction = 0x%16.16lx, vaddr = 0x%16.16lxn", hwdev, size, direction, vaddr);
  935. if ( direction == PCI_DMA_NONE )
  936. BUG();
  937. uaddr = (unsigned long)vaddr;
  938. nPages = PAGE_ALIGN( uaddr + size ) - ( uaddr & PAGE_MASK );
  939. order = get_order( nPages & PAGE_MASK );
  940. nPages >>= PAGE_SHIFT;
  941.   /* Client asked for way to much space.  This is checked later anyway */
  942. /* It is easier to debug here for the drivers than in the tce tables.*/
  943.   if(order >= NUM_TCE_LEVELS) {
  944.   printk("PCI_DMA: pci_map_single size to large: 0x%lx n",size);
  945.   return NO_TCE;
  946.   }
  947. tbl = get_tce_table(hwdev); 
  948. if ( tbl ) {
  949. dma_handle = get_tces( tbl, order, vaddr, nPages, direction );
  950. dma_handle |= ( uaddr & ~PAGE_MASK );
  951. }
  952. return dma_handle;
  953. }
  954. void pci_unmap_single( struct pci_dev *hwdev, dma_addr_t dma_handle, size_t size, int direction )
  955. {
  956. struct TceTable * tbl;
  957. unsigned order, nPages;
  958. PPCDBG(PPCDBG_TCE, "pci_unmap_single:n");
  959. PPCDBG(PPCDBG_TCE, "thwdev = 0x%16.16lx, size = 0x%16.16lx, direction = 0x%16.16lx, dma_handle = 0x%16.16lxn", hwdev, size, direction, dma_handle);
  960. if ( direction == PCI_DMA_NONE )
  961. BUG();
  962. nPages = PAGE_ALIGN( dma_handle + size ) - ( dma_handle & PAGE_MASK );
  963. order = get_order( nPages & PAGE_MASK );
  964. nPages >>= PAGE_SHIFT;
  965.   /* Client asked for way to much space.  This is checked later anyway */
  966. /* It is easier to debug here for the drivers than in the tce tables.*/
  967.   if(order >= NUM_TCE_LEVELS) {
  968.   printk("PCI_DMA: pci_unmap_single size to large: 0x%lx n",size);
  969.   return;
  970.   }
  971. tbl = get_tce_table(hwdev); 
  972. if ( tbl ) 
  973. tce_free(tbl, dma_handle, order, nPages);
  974. }
  975. /* Figure out how many TCEs are actually going to be required
  976.  * to map this scatterlist.  This code is not optimal.  It 
  977.  * takes into account the case where entry n ends in the same
  978.  * page in which entry n+1 starts.  It does not handle the 
  979.  * general case of entry n ending in the same page in which 
  980.  * entry m starts.   
  981.  */
  982. static unsigned long num_tces_sg( struct scatterlist *sg, int nents )
  983. {
  984. unsigned long nTces, numPages, startPage, endPage, prevEndPage;
  985. unsigned i;
  986. prevEndPage = 0;
  987. nTces = 0;
  988. for (i=0; i<nents; ++i) {
  989. /* Compute the starting page number and
  990.  * the ending page number for this entry
  991.  */
  992. startPage = (unsigned long)sg->address >> PAGE_SHIFT;
  993. endPage = ((unsigned long)sg->address + sg->length - 1) >> PAGE_SHIFT;
  994. numPages = endPage - startPage + 1;
  995. /* Simple optimization: if the previous entry ended
  996.  * in the same page in which this entry starts
  997.  * then we can reduce the required pages by one.
  998.  * This matches assumptions in fill_scatterlist_sg and
  999.  * create_tces_sg
  1000.  */
  1001. if ( startPage == prevEndPage )
  1002. --numPages;
  1003. nTces += numPages;
  1004. prevEndPage = endPage;
  1005. sg++;
  1006. }
  1007. return nTces;
  1008. }
  1009. /* Fill in the dma data in the scatterlist
  1010.  * return the number of dma sg entries created
  1011.  */
  1012. static unsigned fill_scatterlist_sg( struct scatterlist *sg, int nents, 
  1013.  dma_addr_t dma_addr , unsigned long numTces)
  1014. {
  1015. struct scatterlist *dma_sg;
  1016. u32 cur_start_dma;
  1017. unsigned long cur_len_dma, cur_end_virt, uaddr;
  1018. unsigned num_dma_ents;
  1019. dma_sg = sg;
  1020. num_dma_ents = 1;
  1021. /* Process the first sg entry */
  1022. cur_start_dma = dma_addr + ((unsigned long)sg->address & (~PAGE_MASK));
  1023. cur_len_dma = sg->length;
  1024. /* cur_end_virt holds the address of the byte immediately after the
  1025.  * end of the current buffer.
  1026.  */
  1027. cur_end_virt = (unsigned long)sg->address + cur_len_dma;
  1028. /* Later code assumes that unused sg->dma_address and sg->dma_length
  1029.  * fields will be zero.  Other archs seem to assume that the user
  1030.  * (device driver) guarantees that...I don't want to depend on that
  1031.  */
  1032. sg->dma_address = sg->dma_length = 0;
  1033. /* Process the rest of the sg entries */
  1034. while (--nents) {
  1035. ++sg;
  1036. /* Clear possibly unused fields. Note: sg >= dma_sg so
  1037.  * this can't be clearing a field we've already set
  1038.  */
  1039. sg->dma_address = sg->dma_length = 0;
  1040. /* Check if it is possible to make this next entry
  1041.  * contiguous (in dma space) with the previous entry.
  1042.  */
  1043. /* The entries can be contiguous in dma space if
  1044.  * the previous entry ends immediately before the
  1045.  * start of the current entry (in virtual space)
  1046.  * or if the previous entry ends at a page boundary
  1047.  * and the current entry starts at a page boundary.
  1048.  */
  1049. uaddr = (unsigned long)sg->address;
  1050. if ( ( uaddr != cur_end_virt ) &&
  1051.      ( ( ( uaddr | cur_end_virt ) & (~PAGE_MASK) ) ||
  1052.        ( ( uaddr & PAGE_MASK ) == ( ( cur_end_virt-1 ) & PAGE_MASK ) ) ) ) {
  1053. /* This entry can not be contiguous in dma space.
  1054.  * save the previous dma entry and start a new one
  1055.  */
  1056. dma_sg->dma_address = cur_start_dma;
  1057. dma_sg->dma_length  = cur_len_dma;
  1058. ++dma_sg;
  1059. ++num_dma_ents;
  1060. cur_start_dma += cur_len_dma-1;
  1061. /* If the previous entry ends and this entry starts
  1062.  * in the same page then they share a tce.  In that
  1063.  * case don't bump cur_start_dma to the next page 
  1064.  * in dma space.  This matches assumptions made in
  1065.  * num_tces_sg and create_tces_sg.
  1066.  */
  1067. if ((uaddr & PAGE_MASK) == ((cur_end_virt-1) & PAGE_MASK))
  1068. cur_start_dma &= PAGE_MASK;
  1069. else
  1070. cur_start_dma = PAGE_ALIGN(cur_start_dma+1);
  1071. cur_start_dma += ( uaddr & (~PAGE_MASK) );
  1072. cur_len_dma = 0;
  1073. }
  1074. /* Accumulate the length of this entry for the next 
  1075.  * dma entry
  1076.  */
  1077. cur_len_dma += sg->length;
  1078. cur_end_virt = uaddr + sg->length;
  1079. }
  1080. /* Fill in the last dma entry */
  1081. dma_sg->dma_address = cur_start_dma;
  1082. dma_sg->dma_length  = cur_len_dma;
  1083. if ((((cur_start_dma +cur_len_dma - 1)>> PAGE_SHIFT) - (dma_addr >> PAGE_SHIFT) + 1) != numTces)
  1084.   {
  1085.     PPCDBG(PPCDBG_TCE, "fill_scatterlist_sg: numTces %ld, used tces %dn",
  1086.    numTces,
  1087.    (unsigned)(((cur_start_dma + cur_len_dma - 1) >> PAGE_SHIFT) - (dma_addr >> PAGE_SHIFT) + 1));
  1088.   }
  1089. return num_dma_ents;
  1090. }
  1091. /* Call the hypervisor to create the TCE entries.
  1092.  * return the number of TCEs created
  1093.  */
  1094. static dma_addr_t create_tces_sg( struct TceTable *tbl, struct scatterlist *sg, 
  1095.    int nents, unsigned numTces, int direction )
  1096. {
  1097. unsigned order, i, j;
  1098. unsigned long startPage, endPage, prevEndPage, numPages, uaddr;
  1099. long tcenum, starttcenum;
  1100. dma_addr_t dmaAddr;
  1101. dmaAddr = NO_TCE;
  1102. order = get_order( numTces << PAGE_SHIFT );
  1103.   /* Client asked for way to much space.  This is checked later anyway */
  1104. /* It is easier to debug here for the drivers than in the tce tables.*/
  1105.   if(order >= NUM_TCE_LEVELS) {
  1106. printk("PCI_DMA: create_tces_sg size to large: 0x%x n",(numTces << PAGE_SHIFT));
  1107.   return NO_TCE;
  1108.   }
  1109. /* allocate a block of tces */
  1110. tcenum = alloc_tce_range( tbl, order );
  1111. if ( tcenum != -1 ) {
  1112. tcenum += tbl->startOffset;
  1113. starttcenum = tcenum;
  1114. dmaAddr = tcenum << PAGE_SHIFT;
  1115. prevEndPage = 0;
  1116. for (j=0; j<nents; ++j) {
  1117. startPage = (unsigned long)sg->address >> PAGE_SHIFT;
  1118. endPage = ((unsigned long)sg->address + sg->length - 1) >> PAGE_SHIFT;
  1119. numPages = endPage - startPage + 1;
  1120. uaddr = (unsigned long)sg->address;
  1121. /* If the previous entry ended in the same page that
  1122.  * the current page starts then they share that
  1123.  * tce and we reduce the number of tces we need
  1124.  * by one.  This matches assumptions made in
  1125.  * num_tces_sg and fill_scatterlist_sg
  1126.  */
  1127. if ( startPage == prevEndPage ) {
  1128. --numPages;
  1129. uaddr += PAGE_SIZE;
  1130. }
  1131. for (i=0; i<numPages; ++i) {
  1132.   ppc_md.tce_build(tbl, tcenum, uaddr, direction); 
  1133.   ++tcenum;
  1134.   uaddr += PAGE_SIZE;
  1135. }
  1136. prevEndPage = endPage;
  1137. sg++;
  1138. }
  1139. /* Make sure the update is visible to hardware. 
  1140.    sync required to synchronize the update to 
  1141.    the TCE table with the MMIO that will send
  1142.    the bus address to the IOA */
  1143. __asm__ __volatile__ ("sync" : : : "memory");
  1144. if ((tcenum - starttcenum) != numTces)
  1145.      PPCDBG(PPCDBG_TCE, "create_tces_sg: numTces %d, tces used %dn",
  1146.     numTces, (unsigned)(tcenum - starttcenum));
  1147. }
  1148. return dmaAddr;
  1149. }
  1150. int pci_map_sg( struct pci_dev *hwdev, struct scatterlist *sg, int nents, int direction )
  1151. {
  1152. struct TceTable * tbl;
  1153. unsigned numTces;
  1154. int num_dma;
  1155. dma_addr_t dma_handle;
  1156. PPCDBG(PPCDBG_TCE, "pci_map_sg:n");
  1157. PPCDBG(PPCDBG_TCE, "thwdev = 0x%16.16lx, sg = 0x%16.16lx, direction = 0x%16.16lx, nents = 0x%16.16lxn", hwdev, sg, direction, nents);
  1158. /* Fast path for a single entry scatterlist */
  1159. if ( nents == 1 ) {
  1160. sg->dma_address = pci_map_single( hwdev, sg->address, 
  1161. sg->length, direction );
  1162. sg->dma_length = sg->length;
  1163. return 1;
  1164. }
  1165. if ( direction == PCI_DMA_NONE )
  1166. BUG();
  1167. tbl = get_tce_table(hwdev); 
  1168. if ( tbl ) {
  1169. /* Compute the number of tces required */
  1170. numTces = num_tces_sg( sg, nents );
  1171. /* Create the tces and get the dma address */ 
  1172. dma_handle = create_tces_sg( tbl, sg, nents, numTces, direction );
  1173. /* Fill in the dma scatterlist */
  1174. num_dma = fill_scatterlist_sg( sg, nents, dma_handle, numTces );
  1175. }
  1176. return num_dma;
  1177. }
  1178. void pci_unmap_sg( struct pci_dev *hwdev, struct scatterlist *sg, int nelms, int direction )
  1179. {
  1180. struct TceTable * tbl;
  1181. unsigned order, numTces, i;
  1182. dma_addr_t dma_end_page, dma_start_page;
  1183. PPCDBG(PPCDBG_TCE, "pci_unmap_sg:n");
  1184. PPCDBG(PPCDBG_TCE, "thwdev = 0x%16.16lx, sg = 0x%16.16lx, direction = 0x%16.16lx, nelms = 0x%16.16lxn", hwdev, sg, direction, nelms);
  1185. if ( direction == PCI_DMA_NONE || nelms == 0 )
  1186. BUG();
  1187. dma_start_page = sg->dma_address & PAGE_MASK;
  1188.   dma_end_page   = 0;
  1189. for ( i=nelms; i>0; --i ) {
  1190. unsigned k = i - 1;
  1191. if ( sg[k].dma_length ) {
  1192. dma_end_page = ( sg[k].dma_address +
  1193.  sg[k].dma_length - 1 ) & PAGE_MASK;
  1194. break;
  1195. }
  1196. }
  1197. numTces = ((dma_end_page - dma_start_page ) >> PAGE_SHIFT) + 1;
  1198. order = get_order( numTces << PAGE_SHIFT );
  1199.   /* Client asked for way to much space.  This is checked later anyway */
  1200. /* It is easier to debug here for the drivers than in the tce tables.*/
  1201.   if(order >= NUM_TCE_LEVELS) {
  1202. printk("PCI_DMA: dma_start_page:0x%lx  dma_end_page:0x%lxn",dma_start_page,dma_end_page);
  1203. printk("PCI_DMA: pci_unmap_sg size to large: 0x%x n",(numTces << PAGE_SHIFT));
  1204.   return;
  1205.   }
  1206. tbl = get_tce_table(hwdev); 
  1207. if ( tbl ) 
  1208. tce_free( tbl, dma_start_page, order, numTces );
  1209. }
  1210. /*
  1211.  * phb_tce_table_init
  1212.  * 
  1213.  * Function: Display TCE config registers.  Could be easily changed
  1214.  *           to initialize the hardware to use TCEs.
  1215.  */
  1216. unsigned long phb_tce_table_init(struct pci_controller *phb) {
  1217. unsigned int r, cfg_rw, i;
  1218. unsigned long r64;
  1219. phandle node;
  1220. PPCDBG(PPCDBG_TCE, "phb_tce_table_init: start.n"); 
  1221. node = ((struct device_node *)(phb->arch_data))->node;
  1222. PPCDBG(PPCDBG_TCEINIT, "tphb            = 0x%lxn", phb); 
  1223. PPCDBG(PPCDBG_TCEINIT, "tphb->type      = 0x%lxn", phb->type); 
  1224. PPCDBG(PPCDBG_TCEINIT, "tphb->phb_regs  = 0x%lxn", phb->phb_regs); 
  1225. PPCDBG(PPCDBG_TCEINIT, "tphb->chip_regs = 0x%lxn", phb->chip_regs); 
  1226. PPCDBG(PPCDBG_TCEINIT, "tphb: node      = 0x%lxn", node);
  1227. PPCDBG(PPCDBG_TCEINIT, "tphb->arch_data = 0x%lxn", phb->arch_data); 
  1228. i = 0;
  1229. while(of_tce_table[i].node) {
  1230. if(of_tce_table[i].node == node) {
  1231. if(phb->type == phb_type_python) {
  1232. r = *(((unsigned int *)phb->phb_regs) + (0xf10>>2)); 
  1233. PPCDBG(PPCDBG_TCEINIT, "tTAR(low)    = 0x%xn", r);
  1234. r = *(((unsigned int *)phb->phb_regs) + (0xf00>>2)); 
  1235. PPCDBG(PPCDBG_TCEINIT, "tTAR(high)   = 0x%xn", r);
  1236. r = *(((unsigned int *)phb->phb_regs) + (0xfd0>>2)); 
  1237. PPCDBG(PPCDBG_TCEINIT, "tPHB cfg(rw) = 0x%xn", r);
  1238. break;
  1239. } else if(phb->type == phb_type_speedwagon) {
  1240. r64 = *(((unsigned long *)phb->chip_regs) + 
  1241. (0x800>>3)); 
  1242. PPCDBG(PPCDBG_TCEINIT, "tNCFG    = 0x%lxn", r64);
  1243. r64 = *(((unsigned long *)phb->chip_regs) + 
  1244. (0x580>>3)); 
  1245. PPCDBG(PPCDBG_TCEINIT, "tTAR0    = 0x%lxn", r64);
  1246. r64 = *(((unsigned long *)phb->chip_regs) + 
  1247. (0x588>>3)); 
  1248. PPCDBG(PPCDBG_TCEINIT, "tTAR1    = 0x%lxn", r64);
  1249. r64 = *(((unsigned long *)phb->chip_regs) + 
  1250. (0x590>>3)); 
  1251. PPCDBG(PPCDBG_TCEINIT, "tTAR2    = 0x%lxn", r64);
  1252. r64 = *(((unsigned long *)phb->chip_regs) + 
  1253. (0x598>>3)); 
  1254. PPCDBG(PPCDBG_TCEINIT, "tTAR3    = 0x%lxn", r64);
  1255. cfg_rw = *(((unsigned int *)phb->chip_regs) + 
  1256.    ((0x160 +
  1257.      (((phb->local_number)+8)<<12))>>2)); 
  1258. PPCDBG(PPCDBG_TCEINIT, "tcfg_rw = 0x%xn", cfg_rw);
  1259. }
  1260. }
  1261. i++;
  1262. }
  1263. PPCDBG(PPCDBG_TCEINIT, "phb_tce_table_init: donen"); 
  1264. return(0); 
  1265. }
  1266. /* These are called very early. */
  1267. void tce_init_pSeries(void)
  1268. {
  1269. ppc_md.tce_build = tce_build_pSeries;
  1270. ppc_md.tce_free_one = tce_free_one_pSeries;
  1271. }
  1272. void tce_init_iSeries(void)
  1273. {
  1274. ppc_md.tce_build = tce_build_iSeries;
  1275. ppc_md.tce_free_one = tce_free_one_iSeries;
  1276. }