mcc.c 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351
  1. #include "u.h"
  2. #include "../port/lib.h"
  3. #include "mem.h"
  4. #include "dat.h"
  5. #include "fns.h"
  6. #include "io.h"
  7. #include "../port/error.h"
  8. /*
  9. *
  10. * mcc.c
  11. *
  12. * This is the driver for the Multi-Channel Communications Controller
  13. * of the MPC8260. This version is constructed for the EST SBC8260 to
  14. * handle data from an interface to an offboard T1 framer. The driver
  15. * supports MCC2 + TDM A:2 (channel 128) which is connected to the
  16. * external interface.
  17. *
  18. * Neville Chandler
  19. * Lucent Technologies - Bell Labs
  20. * March 2001
  21. *
  22. */
  23. #define PKT_LEN 40
  24. #define MPC82XX_INIT_DELAY 0x10000
  25. #define HPIC 0xFC000000
  26. #define HPIA 0xFC000010
  27. #define HPID_A 0xFC000020
  28. #define HPID 0xFC000030
  29. #include "mcc2.h"
  30. static ssize_t mcc2_read( struct file *, char *, size_t, loff_t * );
  31. static ssize_t mcc2_write( struct file *, const char *, size_t, loff_t *);
  32. static loff_t mcc2_lseek( struct file *, loff_t, int );
  33. static int mcc2_release( struct inode *, struct file * );
  34. static ssize_t mcc2_ioctl( struct inode *, struct file *, unsigned int, unsigned long );
  35. //static ssize_t mcc2_ioctl( struct inode *, struct file *, unsigned int, char * );
  36. void MPC82xxCpmInit( void );
  37. void PortInit( void );
  38. void PortSelectPin( unsigned short );
  39. void InitMemAlloc( void );
  40. void HeapCreate( U32, U32, U32, U32, char *);
  41. void HeapCreate( U32, U32, U32, U32, char *);
  42. void *HeapSearchMem( U32, U32);
  43. void *HeapAllocMem( U32, U32);
  44. void HeapFreeMem( U32, void *);
  45. void InitLinkedList( void );
  46. boolean DwCreateList( ListDB * );
  47. void *DwMalloc( U32 );
  48. void DwFree( U32, void * );
  49. void ppc_irq_dispatch_handler(struct pt_regs *regs, int irq);
  50. #define NR_MASK_WORDS ((NR_IRQS + 31) / 32)
  51. extern int ppc_spurious_interrupts;
  52. extern int ppc_second_irq;
  53. extern struct irqaction *ppc_irq_action[NR_IRQS];
  54. extern unsigned int ppc_local_bh_count[NR_CPUS];
  55. extern unsigned int ppc_local_irq_count[NR_CPUS];
  56. extern unsigned int ppc_cached_irq_mask[NR_MASK_WORDS];
  57. extern unsigned int ppc_lost_interrupts[NR_MASK_WORDS];
  58. extern atomic_t ppc_n_lost_interrupts;
  59. //static void disp_led( unsigned char );
  60. void Mcc2Init( void );
  61. void MccDisable( unsigned char );
  62. void MccEnable( unsigned char, unsigned char, unsigned char );
  63. void MccRiscCmd( unsigned char, dwv_RISC_OPCODE, unsigned char );
  64. boolean MccTest( void );
  65. int MccTxBuffer( unsigned char, unsigned char, char *, unsigned short, unsigned short );
  66. extern U32 PpcDisable( void );
  67. extern void PpcMsrRestore( U32 );
  68. static int mcc2_major = MCC_MAJOR;
  69. static BOOLEAN insertBD_T( BD_PFIFO *, BD_P );
  70. static BOOLEAN removBD_T( BD_PFIFO *, BD_P * );
  71. BOOLEAN empty(volatile register FIFO *);
  72. int insert( FIFO *, char * );
  73. int remove( FIFO *, char ** );
  74. void AppInit( void );
  75. #define physaddr(ADDR) (0x60020000 | ((ADDR) << 23) | (2 << 18))
  76. mcc_iorw_t mcc_iorw;
  77. #if 0
  78. typedef struct mcc_io {
  79. unsigned int cmd;
  80. unsigned int address;
  81. unsigned int *buf;
  82. int ind;
  83. int nbytes;
  84. siramctl_t SiRam;
  85. cpmux_t CpMux;
  86. mcc_t Mcc_T;
  87. iop8260_t Io_Ports;
  88. } mcc_iorw_t;
  89. #endif
  90. static void
  91. ioctl_parm( unsigned int loop_mode )
  92. {
  93. /* Setup the SIMODE Register */
  94. Si2Regs->SiAmr = SIxMR_SAD_BANK0_FIRST_HALF | /* SADx */
  95. loop_mode | /* SDMx */
  96. SIxMR_NO_BIT_RX_SYNC_DELAY | /* RFSDx */
  97. SIxMR_DSC_CH_DATA_CLK_EQU | /* DSCx */
  98. SIxMR_CRT_SPEPARATE_PINS | /* CRTx */
  99. SIxMR_SLx_NORMAL_OPERATION | /* SLx */
  100. SIxMR_CE_TX_RISING_RX_FALLING | /* CEx */
  101. SIxMR_FE_FALLING_EDGE | /* FEx */
  102. SIxMR_GM_GCI_SCIT_MODE | /* GMx */
  103. SIxMR_NO_BIT_TX_SYNC_DELAY; /* TFSDx */
  104. }
  105. #if 0
  106. static void
  107. disp_led( unsigned char byte )
  108. {
  109. //int i;
  110. *leds = byte;
  111. //for(i=0; i<1000; i++);
  112. }
  113. #endif
  114. static ssize_t
  115. mcc2_ioctl( struct inode *inode, struct file *file,
  116. unsigned int ioctl_cmd, // IOCTL number
  117. unsigned long param )
  118. // char *param ) // IOCTL parameter
  119. {
  120. static unsigned char mode;
  121. char cp, *cptr;
  122. void *vptr;
  123. unsigned long *lptr;
  124. int i, j;
  125. unsigned int ld;
  126. unsigned long lng;
  127. volatile immap_t *Mmap;
  128. cptr = (char *)param;
  129. mode = (unsigned char)*cptr;
  130. Mmap = ((volatile immap_t *)IMAP_ADDR);
  131. switch(ioctl_cmd)
  132. {
  133. case IOCTL_SET_MODE:
  134. //mode = (unsigned char)*param;
  135. mode = ((mcc_iorw_t *)param)->cmd;
  136. switch( mode )
  137. {
  138. case NORMAL_OPERATION:
  139. /* Setup the SIMODE Register */
  140. D( printk("mcc2_ioctl: ioctl set NORMAL_OPERATION mode\n"); )
  141. ioctl_parm( (unsigned int)SIxMR_SDM_NORMAL_OPERATION ); /* SDMx */
  142. break;
  143. case AUTOMATIC_ECHO:
  144. /* Setup the SIMODE Register */
  145. D( printk("mcc2_ioctl: ioctl set AUTOMATIC_ECHO mode\n"); )
  146. ioctl_parm( (unsigned int)SIxMR_SDM_AUTOMATIC_ECHO ); /* SDMx */
  147. break;
  148. case INTERNAL_LOOPBACK:
  149. /* Setup the SIMODE Register */
  150. D( printk("mcc2_ioctl: ioctl set INTERNAL_LOOPBACK mode\n"); )
  151. ioctl_parm( (unsigned int)SIxMR_SDM_INTERNAL_LOOPBACK ); /* SDMx */
  152. break;
  153. case LOOPBACK_CONTROL:
  154. /* Setup the SIMODE Register */
  155. D( printk("mcc2_ioctl: ioctl set LOOPBACK_CONTROL mode\n"); )
  156. ioctl_parm( (unsigned int)SIxMR_SDM_LOOPBACK_CONTROL ); /* SDMx */
  157. break;
  158. default:
  159. printk("mcc2_ioctl: Error, unrecognized ioctl parameter, device operation unchanged.\n");
  160. break;
  161. }
  162. break;
  163. case IOCTL_RWX_MODE:
  164. mode = ((mcc_iorw_t *)param)->cmd;
  165. switch(mode)
  166. {
  167. case HPI_RD:
  168. lng = (long)(((mcc_iorw_t *)param)->address);
  169. lptr = ((unsigned long *)lng);
  170. vptr = (void *)lptr;
  171. if (copy_to_user( (((mcc_iorw_t *)param)->buf), (void *)vptr, (((mcc_iorw_t *)param)->nbytes))) {
  172. printk("mcc2_ioctl: Failed during read from hpi.\n");
  173. return -EFAULT;
  174. }
  175. break;
  176. case HPI_WR:
  177. lng = (long)(((mcc_iorw_t *)param)->address);
  178. lptr = ((unsigned long *)lng);
  179. vptr = (void *)lptr;
  180. if (copy_from_user( (void *)vptr, (((mcc_iorw_t *)param)->buf), (((mcc_iorw_t *)param)->nbytes))) {
  181. printk("mcc2_ioctl: Failed during write to hpi\n");
  182. return -EFAULT;
  183. }
  184. break;
  185. case FPGA_RD:
  186. lng = (long)(((mcc_iorw_t *)param)->address);
  187. lptr = ((unsigned long *)lng);
  188. vptr = (void *)lptr;
  189. if (copy_to_user( (((mcc_iorw_t *)param)->buf), (void *)vptr, (((mcc_iorw_t *)param)->nbytes))) {
  190. printk("mcc2_ioctl: Failed during read from FPGA.\n");
  191. return -EFAULT;
  192. }
  193. break;
  194. case FPGA_WR:
  195. lng = (long)(((mcc_iorw_t *)param)->address);
  196. lptr = ((unsigned long *)lng);
  197. vptr = (void *)lptr;
  198. if (copy_from_user( (void *)vptr, (((mcc_iorw_t *)param)->buf), (((mcc_iorw_t *)param)->nbytes))) {
  199. printk("mcc2_ioctl: Failed during write to FPGA\n");
  200. return -EFAULT;
  201. }
  202. break;
  203. case MEM_MODR:
  204. cptr = (char *)Mmap;
  205. cptr += ((mcc_iorw_t *)param)->address;
  206. if (copy_to_user( (((mcc_iorw_t *)param)->buf), (void *)cptr, (((mcc_iorw_t *)param)->nbytes))) {
  207. printk("mcc2_ioctl: Failed during read of read-modify memory\n");
  208. return -EFAULT;
  209. }
  210. break;
  211. case MEM_MODW:
  212. cptr = (char *)Mmap;
  213. cptr += ((mcc_iorw_t *)param)->address;
  214. if (copy_from_user( (void *)cptr, (((mcc_iorw_t *)param)->buf), (((mcc_iorw_t *)param)->nbytes))) {
  215. printk("mcc2_ioctl: Failed during modify of read-modify memory\n");
  216. return -EFAULT;
  217. }
  218. break;
  219. case IO_PORTS:
  220. break;
  221. case SI_RAM_CTL1:
  222. break;
  223. case SI_RAM_CTL2:
  224. if (copy_to_user( (void *)param, (siramctl_t *)&(Mmap->im_siramctl2), sizeof(siramctl_t))) {
  225. printk("mcc2_ioctl: Failed to copy SI_RAM_CTL2 struct\n");
  226. return -EFAULT;
  227. }
  228. break;
  229. default:
  230. break;
  231. }
  232. break;
  233. default:
  234. //if (copy_to_user((void *)param, &mode, sizeof(mode)))
  235. printk("We are at the end ...\n");
  236. return -EFAULT;
  237. break;
  238. }
  239. break;
  240. default:
  241. break;
  242. }
  243. return 0;
  244. }
  245. ////////////////////////////////////////////////////////////////////////////////
  246. //
  247. ////////////////////////////////////////////////////////////////////////////////
  248. static ssize_t
  249. mcc2_open( struct inode *inode, struct file *file )
  250. {
  251. MOD_INC_USE_COUNT;
  252. return 0;
  253. }
  254. ////////////////////////////////////////////////////////////////////////////////
  255. //
  256. ////////////////////////////////////////////////////////////////////////////////
  257. static int
  258. mcc2_release( struct inode *inode, struct file *file )
  259. {
  260. MOD_DEC_USE_COUNT;
  261. return 0;
  262. }
  263. #ifndef MODULE
  264. ////////////////////////////////////////////////////////////////////////////////
  265. //
  266. ////////////////////////////////////////////////////////////////////////////////
  267. long
  268. mcc2_init( long mem_start, long mem_end )
  269. {
  270. if ((mcc2_major = register_chrdev(MCC_MAJOR, MCC_NAME, &mcc2_fops)))
  271. printk("mcc2_init: Unable to get major for mcc2 device %d\n", MCC_MAJOR);
  272. else {
  273. //MPC82xxSiuInit();
  274. MPC82xxCpmInit();
  275. }
  276. return mem_start;
  277. }
  278. #else