/** * struct mv_xor_chan - internal representation of a XOR channel * @pending: allows batching of hardware operations * @lock: serializes enqueue/dequeue operations to the descriptors pool * @mmr_base: memory mapped register base * @idx: the index of the xor channel * @chain: device chain view of the descriptors * @free_slots: free slots usable by the channel * @allocated_slots: slots allocated by the driver * @completed_slots: slots completed by HW but still need to be acked * @device: parent device * @common: common dmaengine channel object members * @slots_allocated: records the actual size of the descriptor slot pool * @irq_tasklet: bottom half where mv_xor_slot_cleanup runs * @op_in_desc: new mode of driver, each op is written to descriptor.
*/ struct mv_xor_chan { int pending;
spinlock_t lock; /* protects the descriptor slot pool */ void __iomem *mmr_base; void __iomem *mmr_high_base; unsignedint idx; int irq; struct list_head chain; struct list_head free_slots; struct list_head allocated_slots; struct list_head completed_slots;
dma_addr_t dma_desc_pool; void *dma_desc_pool_virt;
size_t pool_size; struct dma_device dmadev; struct dma_chan dmachan; int slots_allocated; struct tasklet_struct irq_tasklet; int op_in_desc; char dummy_src[MV_XOR_MIN_BYTE_COUNT]; char dummy_dst[MV_XOR_MIN_BYTE_COUNT];
dma_addr_t dummy_src_addr, dummy_dst_addr;
u32 saved_config_reg, saved_int_mask_reg;
struct mv_xor_device *xordev;
};
/** * struct mv_xor_desc_slot - software descriptor * @node: node on the mv_xor_chan lists * @hw_desc: virtual address of the hardware descriptor chain * @phys: hardware address of the hardware descriptor chain * @slot_used: slot in use or not * @idx: pool index * @tx_list: list of slots that make up a multi-descriptor transaction * @async_tx: support for the async_tx api
*/ struct mv_xor_desc_slot { struct list_head node; struct list_head sg_tx_list; enum dma_transaction_type type; void *hw_desc;
u16 idx; struct dma_async_tx_descriptor async_tx;
};
/* * This structure describes XOR descriptor size 64bytes. The * mv_phy_src_idx() macro must be used when indexing the values of the * phy_src_addr[] array. This is due to the fact that the 'descriptor * swap' feature, used on big endian systems, swaps descriptors data * within blocks of 8 bytes. So two consecutive values of the * phy_src_addr[] array are actually swapped in big-endian, which * explains the different mv_phy_src_idx() implementation.
*/ #ifdefined(__LITTLE_ENDIAN) struct mv_xor_desc {
u32 status; /* descriptor execution status */
u32 crc32_result; /* result of CRC-32 calculation */
u32 desc_command; /* type of operation to be carried out */
u32 phy_next_desc; /* next descriptor address pointer */
u32 byte_count; /* size of src/dst blocks in bytes */
u32 phy_dest_addr; /* destination block address */
u32 phy_src_addr[8]; /* source block addresses */
u32 reserved0;
u32 reserved1;
}; #define mv_phy_src_idx(src_idx) (src_idx) #else struct mv_xor_desc {
u32 crc32_result; /* result of CRC-32 calculation */
u32 status; /* descriptor execution status */
u32 phy_next_desc; /* next descriptor address pointer */
u32 desc_command; /* type of operation to be carried out */
u32 phy_dest_addr; /* destination block address */
u32 byte_count; /* size of src/dst blocks in bytes */
u32 phy_src_addr[8]; /* source block addresses */
u32 reserved1;
u32 reserved0;
}; #define mv_phy_src_idx(src_idx) (src_idx ^ 1) #endif
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.