Here be a patch to commproc.h. It has structures and other definitions
that are needed in order to implement IDMA transfers. I have not been
able to make use of this myself yet, so use with caution. It does compile
into the kernel ok.

Greg.

--

Index: arch/ppc/8xx_io/commproc.h
===================================================================
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- arch/ppc/8xx_io/commproc.h  2000/04/04 08:43:42     1.3
+++ arch/ppc/8xx_io/commproc.h  2000/04/06 01:02:33     1.4
@@ -14,6 +14,17 @@
  * bytes of the DP RAM and relocates the I2C parameter area to the
  * IDMA1 space.  The remaining DP RAM is available for buffer descriptors
  * or other use.
+ *
+ * 2000-03-30  - Added some commands to the 'Some commands' section for
+ * support of IDMA. Replicated some channel numbers for use as IDMA
+ * channel numbers. Added bit masks for the RISC Controller Configuration
+ * Register. Added structure definitions for IDMA parameter RAM and
+ * IDMA buffer descriptors. Added bit field descriptions for IDMA
+ * buffer descriptor status and control register and function code
+ * registers.
+ *
+ * -- Greg (gjohnson at research.canon.com.au)
+ *
  */
 #ifndef __CPM_8XX__
 #define __CPM_8XX__
@@ -33,16 +44,20 @@
 #define CPM_CR_INIT_RX         ((ushort)0x0001)
 #define CPM_CR_INIT_TX         ((ushort)0x0002)
 #define CPM_CR_HUNT_MODE       ((ushort)0x0003)
+#define CPM_CR_IDMA_INIT       ((ushort)0x0005)
 #define CPM_CR_STOP_TX         ((ushort)0x0004)
 #define CPM_CR_RESTART_TX      ((ushort)0x0006)
 #define CPM_CR_SET_GADDR       ((ushort)0x0008)
+#define CPM_CR_IDMA_STOP       ((ushort)0x000b)

 /* Channel numbers.
 */
 #define CPM_CR_CH_SCC1 ((ushort)0x0000)
 #define CPM_CR_CH_I2C  ((ushort)0x0001)        /* I2C and IDMA1 */
+#define CPM_CR_CH_IDMA1        ((ushort)0x0001)        /* I2C and IDMA1 */
 #define CPM_CR_CH_SCC2 ((ushort)0x0004)
 #define CPM_CR_CH_SPI  ((ushort)0x0005)        /* SPI / IDMA2 / Timers */
+#define CPM_CR_CH_IDMA2        ((ushort)0x0005)        /* SPI / IDMA2 / Timers 
*/
 #define CPM_CR_CH_SCC3 ((ushort)0x0008)
 #define CPM_CR_CH_SMC1 ((ushort)0x0009)        /* SMC1 / DSP1 */
 #define CPM_CR_CH_SCC4 ((ushort)0x000c)
@@ -50,6 +65,17 @@

 #define mk_cr_cmd(CH, CMD)     ((CMD << 8) | (CH << 4))

+/* CPM RISC Controller Configuration Register */
+#define CPM_RCCR_TIME  ((ushort)0x8000)        /* Timer enable */
+#define CPM_RCCR_RES   ((ushort)0x4000)        /* Reserved */
+#define CPM_RCCR_TIMEP ((ushort)0x3f00)        /* Timer period */
+#define CPM_RCCR_DR1M  ((ushort)0x0080)        /* IDMA request 1 mode */
+#define CPM_RCCR_DR0M  ((ushort)0x0040)        /* IDMA request 0 mode */
+#define CPM_RCCR_DRQP  ((ushort)0x0030)        /* IDMA emulation req. pri. */
+#define CPM_RCCR_EIE   ((ushort)0x0008)        /* External interrupt enable */
+#define CPM_RCCR_SCD   ((ushort)0x0004)        /* Scheduler config. */
+#define CPM_RCCR_ERAM  ((ushort)0x0003)        /* Enable RAM microcode */
+
 /* The dual ported RAM is multi-functional.  Some areas can be (and are
  * being) used for microcode.  There is an area that can only be used
  * as data ram for buffer descriptors, which is all we use right now.
@@ -94,8 +120,10 @@
 */
 #define PROFF_SCC1     ((uint)0x0000)
 #define PROFF_IIC      ((uint)0x0080)
+#define PROFF_IDMA1    ((uint)0x00c0)
 #define PROFF_SCC2     ((uint)0x0100)
 #define PROFF_SPI      ((uint)0x0180)
+#define PROFF_IDMA2    ((uint)0x01c0)
 #define PROFF_SCC3     ((uint)0x0200)
 #define PROFF_SMC1     ((uint)0x0280)
 #define PROFF_SCC4     ((uint)0x0300)
@@ -665,6 +693,63 @@
 #define SPMODE_EN      ((ushort)0x0100)        /* Enable */
 #define SPMODE_LENMSK  ((ushort)0x00f0)        /* character length */
 #define SPMODE_PMMSK   ((ushort)0x000f)        /* prescale modulus */
+
+/* IDMA Parameter RAM */
+typedef struct idma_pr
+{
+    uint16_t   ipr_ibase;      /* Buff. Desc. base address. */
+    uint16_t   ipr_dcmr;       /* DMA Channel Mode Register. */
+    uint32_t   ipr_sapr;       /* Internal Use */
+    uint32_t   ipr_dapr;       /* Internal Use */
+    uint16_t   ipr_ibptr;      /* Internal Use */
+    uint16_t   ipr_write_sp;   /* Internal Use */
+    uint32_t   ipr_s_byte_c;   /* Internal Use */
+    uint32_t   ipr_d_byte_c;   /* Internal Use */
+    uint32_t   ipr_s_state;    /* Internal Use */
+    uint32_t   ipr_itemp[4];   /* Internal Use */
+    uint32_t   ipr_sr_mem;     /* Internal Use */
+    uint16_t   ipr_read_sp;    /* Internal Use */
+    uint16_t   ipr_undef_0;    /* Internal Use */
+    uint16_t   ipr_undef_1;    /* Internal Use */
+    uint16_t   ipr_undef_2;    /* Internal Use */
+    uint32_t   ipr_d_state;    /* Internal Use */
+} idma_pr_t;
+
+/* IDMA Parameter RAM DCMR Register */
+#define IPR_DCMR_RESERVED      ((ushort)0xffe0)
+#define IPR_DCMR_SIZE          ((ushort)0x0018) /* Peripheral port size */
+#define IPR_DCMR_SD            ((ushort)0x0006) /* Src/Dest Mem/Peripheral */
+#define IPR_DCMR_SINGLE                ((ushort)0x0001) /* Single/dual cycle */
+
+/* IDMA Buffer Descriptor. */
+typedef struct idma_bd
+{
+    uint16_t   ibd_stat_ctrl;  /* Status Control */
+    uint8_t    ibd_dfcr;       /* Dest. Function Code Reg. */
+    uint8_t    ibd_sfcr;       /* Src. Function Code Reg. */
+    uint32_t   ibd_length;     /* Number of bytes to transfer. */
+    uint32_t   ibd_source;     /* Source Buffer address. */
+    uint32_t   ibd_dest;       /* Destination Buffer address. */
+} idma_bd_t;
+
+/* IDMA Buff. Desc. Status and Control Register. */
+#define IBD_STCT_VALID ((ushort)0x8000)        /* Ready for processing. */
+#define IBD_STCT_RES1  ((ushort)0x4000)        /* Reserved */
+#define IBD_STCT_WRAP  ((ushort)0x2000)        /* Last entry in table. */
+#define IBD_STCT_INTR  ((ushort)0x1000)        /* Interrupt enable. */
+#define IBD_STCT_LAST  ((ushort)0x0800)        /* Last. End of buffer chain. */
+#define IBD_STCT_RES2  ((ushort)0x0400)        /* Reserved */
+#define IBD_STCT_CONT  ((ushort)0x0200)        /* Continuous mode */
+#define IBD_STCT_RES3  ((ushort)0x01ff)        /* Reserved */
+
+/* IDMA Buff. Desc. Function Code Register. */
+#define IBD_FCR_RES    ((unsigned char)0xe0)   /* Reserved */
+#define IBD_FCR_BO     ((unsigned char)0x18)   /* Byte order */
+#define IBD_FCR_AT     ((unsigned char)0x07)   /* Addr. Type bits [1-3] */
+
+/* IDMA BD FCR Byte Order */
+#define IBD_FCR_PPCLE  ((unsigned char)0x08)   /* PowerPC Little endian */
+#define IBD_FCR_BETLE  ((unsigned char)0x10)   /* Big/True_Little endian */

 /* CPM interrupts.  There are nearly 32 interrupts generated by CPM
  * channels or devices.  All of these are presented to the PPC core
--
+----------------------------------------------------+
| Do you want to know more?                          |
| www.geocities --== Greg Johnson ==-- .com/worfsom/ |
| HW/SW Engineer      gjohnson at research.canon.com.au |
| Canon   Information  Systems   Research  Australia |
| 1 Thomas Holt Dr, North Ryde, NSW, 2113, Australia |
|     "I FLEXed my BISON and it went YACC!" - me.    |
+----------------------------------------------------+

** Sent via the linuxppc-embedded mail list. See http://lists.linuxppc.org/



Reply via email to