The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/ppc/mcc.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

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

Cache object: d1d1e607765df9dcc6abfd27dd7282ab


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.