Back to home page

LXR

 
 

    


File indexing completed on 2025-05-11 08:23:56

0001 /*
0002  * dpram.c
0003  *
0004  * MPC8260 dual-port RAM allocation routines
0005  *
0006  * Based on code in mpc8xx which is
0007  * Based on code (alloc860.c in eth_comm port) by
0008  * Jay Monkman (jmonkman@frasca.com),
0009  * which, in turn, is based on code by
0010  * Eric Norum <eric.norum.ca>
0011  *
0012  *
0013  * Modifications :
0014  * Copyright (c) 1999, National Research Council of Canada
0015  *
0016  * MPC8260 modifications Andy Dachs, <a.dachs@sstl.co.uk>
0017  * Surrey Satellite Technology Limited, 2001
0018  */
0019 
0020 #include <rtems.h>
0021 #include <rtems/error.h>
0022 
0023 #include <mpc8260.h>
0024 #include <mpc8260/cpm.h>
0025 
0026 /*
0027  * Allocation order:
0028  *      - Dual-Port RAM section 0
0029  *      - Dual-Port RAM section 1
0030  *      - Dual-Port RAM section 2
0031  *      - Dual-Port RAM section 3
0032  */
0033 static struct {
0034   uint8_t   *base;
0035   size_t         size;
0036   unsigned int   used;
0037 } dpram_regions[] = {
0038 /*  { (uint8_t *)&m8260.dpram0[0],    sizeof m8260.dpram0,     0 },*/
0039   { (uint8_t *)&m8260.dpram1[0],    sizeof m8260.dpram1,     0 },
0040 /*  { (uint8_t *)&m8260.dpram2[0],    sizeof m8260.dpram2,     0 },*/
0041   { (uint8_t *)&m8260.dpram3[0],    sizeof m8260.dpram3,     0 }
0042 };
0043 
0044 #define NUM_DPRAM_REGIONS   (sizeof(dpram_regions) / sizeof(dpram_regions[0]))
0045 
0046 void *
0047 m8xx_dpram_allocate( unsigned int byte_count )
0048 {
0049   unsigned int i;
0050   ISR_Level level;
0051   void *blockp = NULL;
0052 
0053   byte_count = (byte_count + 3) & ~0x3;
0054 
0055   /*
0056    * Running with interrupts disabled is usually considered bad
0057    * form, but this routine is probably being run as part of an
0058    * initialization sequence so the effect shouldn't be too severe.
0059    */
0060   _ISR_Local_disable (level);
0061 
0062   for ( i = 0; i < NUM_DPRAM_REGIONS; i++ ) {
0063     /*
0064      * Verify that the region is available for use.
0065      * This test is necessary because if extra microcode modules
0066      * are installed, some regions are locked and unavailable.
0067      * See MPC860 User's Manual Pages 19-9 to 19-11.
0068      */
0069     if (dpram_regions[i].used == 0) {
0070       volatile unsigned char *cp = dpram_regions[i].base;
0071       *cp = 0xAA;
0072       if (*cp != 0xAA)
0073         dpram_regions[i].used = dpram_regions[i].size;
0074       else {
0075         *cp = 0x55;
0076         if (*cp != 0x55)
0077           dpram_regions[i].used = dpram_regions[i].size;
0078       }
0079       *cp = 0x0;
0080     }
0081     if (dpram_regions[i].size - dpram_regions[i].used >= byte_count) {
0082       blockp = dpram_regions[i].base + dpram_regions[i].used;
0083       dpram_regions[i].used += byte_count;
0084       break;
0085     }
0086   }
0087 
0088   _ISR_Local_enable(level);
0089 
0090   if (blockp == NULL)
0091     rtems_panic("Can't allocate %d bytes of dual-port RAM.\n", byte_count);
0092   return blockp;
0093 }