commproc.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:4k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * BK Id: SCCS/s.commproc.c 1.10 10/16/01 16:21:52 trini
  3.  */
  4. /*
  5.  * General Purpose functions for the global management of the
  6.  * 8260 Communication Processor Module.
  7.  * Copyright (c) 1999 Dan Malek (dmalek@jlc.net)
  8.  * Copyright (c) 2000 MontaVista Software, Inc (source@mvista.com)
  9.  * 2.3.99 Updates
  10.  *
  11.  * In addition to the individual control of the communication
  12.  * channels, there are a few functions that globally affect the
  13.  * communication processor.
  14.  *
  15.  * Buffer descriptors must be allocated from the dual ported memory
  16.  * space.  The allocator for that is here.  When the communication
  17.  * process is reset, we reclaim the memory available.  There is
  18.  * currently no deallocator for this memory.
  19.  */
  20. #include <linux/errno.h>
  21. #include <linux/sched.h>
  22. #include <linux/kernel.h>
  23. #include <linux/param.h>
  24. #include <linux/string.h>
  25. #include <linux/mm.h>
  26. #include <linux/interrupt.h>
  27. #include <linux/bootmem.h>
  28. #include <asm/irq.h>
  29. #include <asm/mpc8260.h>
  30. #include <asm/page.h>
  31. #include <asm/pgtable.h>
  32. #include <asm/immap_8260.h>
  33. #include <asm/cpm_8260.h>
  34. static uint dp_alloc_base; /* Starting offset in DP ram */
  35. static uint dp_alloc_top; /* Max offset + 1 */
  36. static uint host_buffer; /* One page of host buffer */
  37. static uint host_end; /* end + 1 */
  38. cpm8260_t *cpmp; /* Pointer to comm processor space */
  39. /* We allocate this here because it is used almost exclusively for
  40.  * the communication processor devices.
  41.  */
  42. immap_t *immr;
  43. void
  44. m8260_cpm_reset(void)
  45. {
  46. volatile immap_t  *imp;
  47. volatile cpm8260_t *commproc;
  48. uint vpgaddr;
  49. immr = imp = (volatile immap_t *)IMAP_ADDR;
  50. commproc = &imp->im_cpm;
  51. /* Reclaim the DP memory for our use.
  52. */
  53. dp_alloc_base = CPM_DATAONLY_BASE;
  54. dp_alloc_top = dp_alloc_base + CPM_DATAONLY_SIZE;
  55. /* Set the host page for allocation.
  56. */
  57. host_buffer =
  58. (uint) alloc_bootmem_pages(PAGE_SIZE * NUM_CPM_HOST_PAGES);
  59. host_end = host_buffer + (PAGE_SIZE * NUM_CPM_HOST_PAGES);
  60. vpgaddr = host_buffer;
  61. /* Tell everyone where the comm processor resides.
  62. */
  63. cpmp = (cpm8260_t *)commproc;
  64. }
  65. /* Allocate some memory from the dual ported ram.
  66.  * To help protocols with object alignment restrictions, we do that
  67.  * if they ask.
  68.  */
  69. uint
  70. m8260_cpm_dpalloc(uint size, uint align)
  71. {
  72. uint retloc;
  73. uint align_mask, off;
  74. uint savebase;
  75. align_mask = align - 1;
  76. savebase = dp_alloc_base;
  77. if ((off = (dp_alloc_base & align_mask)) != 0)
  78. dp_alloc_base += (align - off);
  79. if ((dp_alloc_base + size) >= dp_alloc_top) {
  80. dp_alloc_base = savebase;
  81. return(CPM_DP_NOSPACE);
  82. }
  83. retloc = dp_alloc_base;
  84. dp_alloc_base += size;
  85. return(retloc);
  86. }
  87. /* We also own one page of host buffer space for the allocation of
  88.  * UART "fifos" and the like.
  89.  */
  90. uint
  91. m8260_cpm_hostalloc(uint size, uint align)
  92. {
  93. uint retloc;
  94. uint align_mask, off;
  95. uint savebase;
  96. align_mask = align - 1;
  97. savebase = host_buffer;
  98. if ((off = (host_buffer & align_mask)) != 0)
  99. host_buffer += (align - off);
  100. if ((host_buffer + size) >= host_end) {
  101. host_buffer = savebase;
  102. return(0);
  103. }
  104. retloc = host_buffer;
  105. host_buffer += size;
  106. return(retloc);
  107. }
  108. /* Set a baud rate generator.  This needs lots of work.  There are
  109.  * eight BRGs, which can be connected to the CPM channels or output
  110.  * as clocks.  The BRGs are in two different block of internal
  111.  * memory mapped space.
  112.  * The baud rate clock is the system clock divided by something.
  113.  * It was set up long ago during the initial boot phase and is
  114.  * is given to us.
  115.  * Baud rate clocks are zero-based in the driver code (as that maps
  116.  * to port numbers).  Documentation uses 1-based numbering.
  117.  */
  118. #define BRG_INT_CLK (((bd_t *)__res)->bi_brgfreq)
  119. #define BRG_UART_CLK (BRG_INT_CLK/16)
  120. /* This function is used by UARTS, or anything else that uses a 16x
  121.  * oversampled clock.
  122.  */
  123. void
  124. m8260_cpm_setbrg(uint brg, uint rate)
  125. {
  126. volatile uint *bp;
  127. /* This is good enough to get SMCs running.....
  128. */
  129. if (brg < 4) {
  130. bp = (uint *)&immr->im_brgc1;
  131. }
  132. else {
  133. bp = (uint *)&immr->im_brgc5;
  134. brg -= 4;
  135. }
  136. bp += brg;
  137. *bp = ((BRG_UART_CLK / rate) << 1) | CPM_BRG_EN;
  138. }
  139. /* This function is used to set high speed synchronous baud rate
  140.  * clocks.
  141.  */
  142. void
  143. m8260_cpm_fastbrg(uint brg, uint rate, int div16)
  144. {
  145. volatile uint *bp;
  146. if (brg < 4) {
  147. bp = (uint *)&immr->im_brgc1;
  148. }
  149. else {
  150. bp = (uint *)&immr->im_brgc5;
  151. brg -= 4;
  152. }
  153. bp += brg;
  154. *bp = ((BRG_INT_CLK / rate) << 1) | CPM_BRG_EN;
  155. if (div16)
  156. *bp |= CPM_BRG_DIV16;
  157. }