root/drivers/dma/ppc4xx/xor.h
/* SPDX-License-Identifier: GPL-2.0-only */
/*
 * 440SPe's XOR engines support header file
 *
 * 2006-2009 (C) DENX Software Engineering.
 *
 * Author: Yuri Tikhonov <yur@emcraft.com>
 */

#ifndef _PPC440SPE_XOR_H
#define _PPC440SPE_XOR_H

#include <linux/types.h>

/* Number of XOR engines available on the contoller */
#define XOR_ENGINES_NUM         1

/* Number of operands supported in the h/w */
#define XOR_MAX_OPS             16

/*
 * XOR Command Block Control Register bits
 */
#define XOR_CBCR_LNK_BIT        (1<<31) /* link present */
#define XOR_CBCR_TGT_BIT        (1<<30) /* target present */
#define XOR_CBCR_CBCE_BIT       (1<<29) /* command block compete enable */
#define XOR_CBCR_RNZE_BIT       (1<<28) /* result not zero enable */
#define XOR_CBCR_XNOR_BIT       (1<<15) /* XOR/XNOR */
#define XOR_CDCR_OAC_MSK        (0x7F)  /* operand address count */

/*
 * XORCore Status Register bits
 */
#define XOR_SR_XCP_BIT          (1<<31) /* core processing */
#define XOR_SR_ICB_BIT          (1<<17) /* invalid CB */
#define XOR_SR_IC_BIT           (1<<16) /* invalid command */
#define XOR_SR_IPE_BIT          (1<<15) /* internal parity error */
#define XOR_SR_RNZ_BIT          (1<<2)  /* result not Zero */
#define XOR_SR_CBC_BIT          (1<<1)  /* CB complete */
#define XOR_SR_CBLC_BIT         (1<<0)  /* CB list complete */

/*
 * XORCore Control Set and Reset Register bits
 */
#define XOR_CRSR_XASR_BIT       (1<<31) /* soft reset */
#define XOR_CRSR_XAE_BIT        (1<<30) /* enable */
#define XOR_CRSR_RCBE_BIT       (1<<29) /* refetch CB enable */
#define XOR_CRSR_PAUS_BIT       (1<<28) /* pause */
#define XOR_CRSR_64BA_BIT       (1<<27) /* 64/32 CB format */
#define XOR_CRSR_CLP_BIT        (1<<25) /* continue list processing */

/*
 * XORCore Interrupt Enable Register
 */
#define XOR_IE_ICBIE_BIT        (1<<17) /* Invalid Command Block IRQ Enable */
#define XOR_IE_ICIE_BIT         (1<<16) /* Invalid Command IRQ Enable */
#define XOR_IE_RPTIE_BIT        (1<<14) /* Read PLB Timeout Error IRQ Enable */
#define XOR_IE_CBCIE_BIT        (1<<1)  /* CB complete interrupt enable */
#define XOR_IE_CBLCI_BIT        (1<<0)  /* CB list complete interrupt enable */

/*
 * XOR Accelerator engine Command Block Type
 */
struct xor_cb {
        /*
         * Basic 64-bit format XOR CB (Table 19-1, p.463, 440spe_um_1_22.pdf)
         */
        u32     cbc;            /* control */
        u32     cbbc;           /* byte count */
        u32     cbs;            /* status */
        u8      pad0[4];        /* reserved */
        u32     cbtah;          /* target address high */
        u32     cbtal;          /* target address low */
        u32     cblah;          /* link address high */
        u32     cblal;          /* link address low */
        struct {
                u32 h;
                u32 l;
        } __attribute__ ((packed)) ops[16];
} __attribute__ ((packed));

/*
 * XOR hardware registers Table 19-3, UM 1.22
 */
struct xor_regs {
        u32     op_ar[16][2];   /* operand address[0]-high,[1]-low registers */
        u8      pad0[352];      /* reserved */
        u32     cbcr;           /* CB control register */
        u32     cbbcr;          /* CB byte count register */
        u32     cbsr;           /* CB status register */
        u8      pad1[4];        /* reserved */
        u32     cbtahr;         /* operand target address high register */
        u32     cbtalr;         /* operand target address low register */
        u32     cblahr;         /* CB link address high register */
        u32     cblalr;         /* CB link address low register */
        u32     crsr;           /* control set register */
        u32     crrr;           /* control reset register */
        u32     ccbahr;         /* current CB address high register */
        u32     ccbalr;         /* current CB address low register */
        u32     plbr;           /* PLB configuration register */
        u32     ier;            /* interrupt enable register */
        u32     pecr;           /* parity error count register */
        u32     sr;             /* status register */
        u32     revidr;         /* revision ID register */
};

#endif /* _PPC440SPE_XOR_H */