1b9eebfadSRuchika Gupta /* 2b9eebfadSRuchika Gupta * Copyright 2008-2014 Freescale Semiconductor, Inc. 3b9eebfadSRuchika Gupta * 4b9eebfadSRuchika Gupta * SPDX-License-Identifier: GPL-2.0+ 5b9eebfadSRuchika Gupta * 6b9eebfadSRuchika Gupta */ 7b9eebfadSRuchika Gupta 8b9eebfadSRuchika Gupta #ifndef __JR_H 9b9eebfadSRuchika Gupta #define __JR_H 10b9eebfadSRuchika Gupta 11b9eebfadSRuchika Gupta #include <linux/compiler.h> 12b9eebfadSRuchika Gupta 13b9eebfadSRuchika Gupta #define JR_SIZE 4 14b9eebfadSRuchika Gupta /* Timeout currently defined as 90 sec */ 15b9eebfadSRuchika Gupta #define CONFIG_SEC_DEQ_TIMEOUT 90000000U 16b9eebfadSRuchika Gupta 17b9eebfadSRuchika Gupta #define DEFAULT_JR_ID 0 18b9eebfadSRuchika Gupta #define DEFAULT_JR_LIODN 0 19b9eebfadSRuchika Gupta #define DEFAULT_IRQ 0 /* Interrupts not to be configured */ 20b9eebfadSRuchika Gupta 21b9eebfadSRuchika Gupta #define MCFGR_SWRST ((uint32_t)(1)<<31) /* Software Reset */ 22b9eebfadSRuchika Gupta #define MCFGR_DMA_RST ((uint32_t)(1)<<28) /* DMA Reset */ 23b9eebfadSRuchika Gupta #define MCFGR_PS_SHIFT 16 243ef2412dShoria.geanta@freescale.com #define MCFGR_AWCACHE_SHIFT 8 253ef2412dShoria.geanta@freescale.com #define MCFGR_AWCACHE_MASK (0xf << MCFGR_AWCACHE_SHIFT) 268a6f83dcSSaksham Jain #define MCFGR_ARCACHE_SHIFT 12 278a6f83dcSSaksham Jain #define MCFGR_ARCACHE_MASK (0xf << MCFGR_ARCACHE_SHIFT) 288a6f83dcSSaksham Jain 29b9eebfadSRuchika Gupta #define JR_INTMASK 0x00000001 30b9eebfadSRuchika Gupta #define JRCR_RESET 0x01 31b9eebfadSRuchika Gupta #define JRINT_ERR_HALT_INPROGRESS 0x4 32b9eebfadSRuchika Gupta #define JRINT_ERR_HALT_MASK 0xc 33b9eebfadSRuchika Gupta #define JRNSLIODN_SHIFT 16 34b9eebfadSRuchika Gupta #define JRNSLIODN_MASK 0x0fff0000 35b9eebfadSRuchika Gupta #define JRSLIODN_SHIFT 0 36b9eebfadSRuchika Gupta #define JRSLIODN_MASK 0x00000fff 37b9eebfadSRuchika Gupta 38b9eebfadSRuchika Gupta #define JQ_DEQ_ERR -1 39b9eebfadSRuchika Gupta #define JQ_DEQ_TO_ERR -2 40b9eebfadSRuchika Gupta #define JQ_ENQ_ERR -3 41b9eebfadSRuchika Gupta 42b9eebfadSRuchika Gupta struct op_ring { 43f59e69cbSAneesh Bansal phys_addr_t desc; 44b9eebfadSRuchika Gupta uint32_t status; 45b9eebfadSRuchika Gupta } __packed; 46b9eebfadSRuchika Gupta 47b9eebfadSRuchika Gupta struct jr_info { 48f59e69cbSAneesh Bansal void (*callback)(uint32_t status, void *arg); 49f59e69cbSAneesh Bansal phys_addr_t desc_phys_addr; 50b9eebfadSRuchika Gupta uint32_t desc_len; 51b9eebfadSRuchika Gupta uint32_t op_done; 52b9eebfadSRuchika Gupta void *arg; 53b9eebfadSRuchika Gupta }; 54b9eebfadSRuchika Gupta 55b9eebfadSRuchika Gupta struct jobring { 56b9eebfadSRuchika Gupta int jq_id; 57b9eebfadSRuchika Gupta int irq; 58b9eebfadSRuchika Gupta int liodn; 59b9eebfadSRuchika Gupta /* Head is the index where software would enq the descriptor in 60b9eebfadSRuchika Gupta * the i/p ring 61b9eebfadSRuchika Gupta */ 62b9eebfadSRuchika Gupta int head; 63b9eebfadSRuchika Gupta /* Tail index would be used by s/w ehile enqueuing to determine if 64b9eebfadSRuchika Gupta * there is any space left in the s/w maintained i/p rings 65b9eebfadSRuchika Gupta */ 66b9eebfadSRuchika Gupta /* Also in case of deq tail will be incremented only in case of 67b9eebfadSRuchika Gupta * in-order job completion 68b9eebfadSRuchika Gupta */ 69b9eebfadSRuchika Gupta int tail; 70b9eebfadSRuchika Gupta /* Read index of the output ring. It may not match with tail in case 71b9eebfadSRuchika Gupta * of out of order completetion 72b9eebfadSRuchika Gupta */ 73b9eebfadSRuchika Gupta int read_idx; 74b9eebfadSRuchika Gupta /* Write index to input ring. Would be always equal to head */ 75b9eebfadSRuchika Gupta int write_idx; 76b9eebfadSRuchika Gupta /* Size of the rings. */ 77b9eebfadSRuchika Gupta int size; 787f4736bdSRuchika Gupta /* Op ring size aligned to cache line size */ 797f4736bdSRuchika Gupta int op_size; 80b9eebfadSRuchika Gupta /* The ip and output rings have to be accessed by SEC. So the 81b9eebfadSRuchika Gupta * pointers will ahve to point to the housekeeping region provided 82b9eebfadSRuchika Gupta * by SEC 83b9eebfadSRuchika Gupta */ 84b9eebfadSRuchika Gupta /*Circular Ring of i/p descriptors */ 85b9eebfadSRuchika Gupta dma_addr_t *input_ring; 86b9eebfadSRuchika Gupta /* Circular Ring of o/p descriptors */ 87b9eebfadSRuchika Gupta /* Circula Ring containing info regarding descriptors in i/p 88b9eebfadSRuchika Gupta * and o/p ring 89b9eebfadSRuchika Gupta */ 90b9eebfadSRuchika Gupta /* This ring can be on the stack */ 91b9eebfadSRuchika Gupta struct jr_info info[JR_SIZE]; 92b9eebfadSRuchika Gupta struct op_ring *output_ring; 93*76394c9cSAlex Porosanu /* Offset in CCSR to the SEC engine to which this JR belongs */ 94*76394c9cSAlex Porosanu uint32_t sec_offset; 95*76394c9cSAlex Porosanu 96b9eebfadSRuchika Gupta }; 97b9eebfadSRuchika Gupta 98b9eebfadSRuchika Gupta struct result { 99b9eebfadSRuchika Gupta int done; 100b9eebfadSRuchika Gupta uint32_t status; 101b9eebfadSRuchika Gupta }; 102b9eebfadSRuchika Gupta 103b9eebfadSRuchika Gupta void caam_jr_strstatus(u32 status); 104b9eebfadSRuchika Gupta int run_descriptor_jr(uint32_t *desc); 105b9eebfadSRuchika Gupta 106b9eebfadSRuchika Gupta #endif 107