1ef4b04f8SRavi Kumar /* SPDX-License-Identifier: BSD-3-Clause 2ef4b04f8SRavi Kumar * Copyright(c) 2018 Advanced Micro Devices, Inc. All rights reserved. 3ef4b04f8SRavi Kumar */ 4ef4b04f8SRavi Kumar 5ef4b04f8SRavi Kumar #ifndef _CCP_DEV_H_ 6ef4b04f8SRavi Kumar #define _CCP_DEV_H_ 7ef4b04f8SRavi Kumar 8ef4b04f8SRavi Kumar #include <limits.h> 9ef4b04f8SRavi Kumar #include <stdbool.h> 10ef4b04f8SRavi Kumar #include <stdint.h> 11ef4b04f8SRavi Kumar #include <string.h> 12ef4b04f8SRavi Kumar 13ef4b04f8SRavi Kumar #include <rte_bus_pci.h> 14ef4b04f8SRavi Kumar #include <rte_atomic.h> 15ef4b04f8SRavi Kumar #include <rte_byteorder.h> 16ef4b04f8SRavi Kumar #include <rte_io.h> 17ef4b04f8SRavi Kumar #include <rte_pci.h> 18ef4b04f8SRavi Kumar #include <rte_spinlock.h> 19ef4b04f8SRavi Kumar #include <rte_crypto_sym.h> 20ef4b04f8SRavi Kumar #include <rte_cryptodev.h> 21ef4b04f8SRavi Kumar 22ef4b04f8SRavi Kumar /**< CCP sspecific */ 23ef4b04f8SRavi Kumar #define MAX_HW_QUEUES 5 24ef4b04f8SRavi Kumar 25ef4b04f8SRavi Kumar /**< CCP Register Mappings */ 26ef4b04f8SRavi Kumar #define Q_MASK_REG 0x000 27ef4b04f8SRavi Kumar #define TRNG_OUT_REG 0x00c 28ef4b04f8SRavi Kumar 29ef4b04f8SRavi Kumar /* CCP Version 5 Specifics */ 30ef4b04f8SRavi Kumar #define CMD_QUEUE_MASK_OFFSET 0x00 31ef4b04f8SRavi Kumar #define CMD_QUEUE_PRIO_OFFSET 0x04 32ef4b04f8SRavi Kumar #define CMD_REQID_CONFIG_OFFSET 0x08 33ef4b04f8SRavi Kumar #define CMD_CMD_TIMEOUT_OFFSET 0x10 34ef4b04f8SRavi Kumar #define LSB_PUBLIC_MASK_LO_OFFSET 0x18 35ef4b04f8SRavi Kumar #define LSB_PUBLIC_MASK_HI_OFFSET 0x1C 36ef4b04f8SRavi Kumar #define LSB_PRIVATE_MASK_LO_OFFSET 0x20 37ef4b04f8SRavi Kumar #define LSB_PRIVATE_MASK_HI_OFFSET 0x24 38ef4b04f8SRavi Kumar 39ef4b04f8SRavi Kumar #define CMD_Q_CONTROL_BASE 0x0000 40ef4b04f8SRavi Kumar #define CMD_Q_TAIL_LO_BASE 0x0004 41ef4b04f8SRavi Kumar #define CMD_Q_HEAD_LO_BASE 0x0008 42ef4b04f8SRavi Kumar #define CMD_Q_INT_ENABLE_BASE 0x000C 43ef4b04f8SRavi Kumar #define CMD_Q_INTERRUPT_STATUS_BASE 0x0010 44ef4b04f8SRavi Kumar 45ef4b04f8SRavi Kumar #define CMD_Q_STATUS_BASE 0x0100 46ef4b04f8SRavi Kumar #define CMD_Q_INT_STATUS_BASE 0x0104 47ef4b04f8SRavi Kumar 48ef4b04f8SRavi Kumar #define CMD_CONFIG_0_OFFSET 0x6000 49ef4b04f8SRavi Kumar #define CMD_TRNG_CTL_OFFSET 0x6008 50ef4b04f8SRavi Kumar #define CMD_AES_MASK_OFFSET 0x6010 51ef4b04f8SRavi Kumar #define CMD_CLK_GATE_CTL_OFFSET 0x603C 52ef4b04f8SRavi Kumar 53ef4b04f8SRavi Kumar /* Address offset between two virtual queue registers */ 54ef4b04f8SRavi Kumar #define CMD_Q_STATUS_INCR 0x1000 55ef4b04f8SRavi Kumar 56ef4b04f8SRavi Kumar /* Bit masks */ 57ef4b04f8SRavi Kumar #define CMD_Q_RUN 0x1 58ef4b04f8SRavi Kumar #define CMD_Q_SIZE 0x1F 59ef4b04f8SRavi Kumar #define CMD_Q_SHIFT 3 60ef4b04f8SRavi Kumar #define COMMANDS_PER_QUEUE 2048 61ef4b04f8SRavi Kumar 62ef4b04f8SRavi Kumar #define QUEUE_SIZE_VAL ((ffs(COMMANDS_PER_QUEUE) - 2) & \ 63ef4b04f8SRavi Kumar CMD_Q_SIZE) 64ef4b04f8SRavi Kumar #define Q_DESC_SIZE sizeof(struct ccp_desc) 65ef4b04f8SRavi Kumar #define Q_SIZE(n) (COMMANDS_PER_QUEUE*(n)) 66ef4b04f8SRavi Kumar 67ef4b04f8SRavi Kumar #define INT_COMPLETION 0x1 68ef4b04f8SRavi Kumar #define INT_ERROR 0x2 69ef4b04f8SRavi Kumar #define INT_QUEUE_STOPPED 0x4 70ef4b04f8SRavi Kumar #define ALL_INTERRUPTS (INT_COMPLETION| \ 71ef4b04f8SRavi Kumar INT_ERROR| \ 72ef4b04f8SRavi Kumar INT_QUEUE_STOPPED) 73ef4b04f8SRavi Kumar 74ef4b04f8SRavi Kumar #define LSB_REGION_WIDTH 5 75ef4b04f8SRavi Kumar #define MAX_LSB_CNT 8 76ef4b04f8SRavi Kumar 77ef4b04f8SRavi Kumar #define LSB_SIZE 16 78ef4b04f8SRavi Kumar #define LSB_ITEM_SIZE 32 79ef4b04f8SRavi Kumar #define SLSB_MAP_SIZE (MAX_LSB_CNT * LSB_SIZE) 80ef4b04f8SRavi Kumar 81*3c20cf98SRavi Kumar /* General CCP Defines */ 82*3c20cf98SRavi Kumar 83*3c20cf98SRavi Kumar #define CCP_SB_BYTES 32 84*3c20cf98SRavi Kumar 85ef4b04f8SRavi Kumar /* bitmap */ 86ef4b04f8SRavi Kumar enum { 87ef4b04f8SRavi Kumar BITS_PER_WORD = sizeof(unsigned long) * CHAR_BIT 88ef4b04f8SRavi Kumar }; 89ef4b04f8SRavi Kumar 90ef4b04f8SRavi Kumar #define WORD_OFFSET(b) ((b) / BITS_PER_WORD) 91ef4b04f8SRavi Kumar #define BIT_OFFSET(b) ((b) % BITS_PER_WORD) 92ef4b04f8SRavi Kumar 93ef4b04f8SRavi Kumar #define CCP_DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d)) 94ef4b04f8SRavi Kumar #define CCP_BITMAP_SIZE(nr) \ 95ef4b04f8SRavi Kumar CCP_DIV_ROUND_UP(nr, CHAR_BIT * sizeof(unsigned long)) 96ef4b04f8SRavi Kumar 97ef4b04f8SRavi Kumar #define CCP_BITMAP_FIRST_WORD_MASK(start) \ 98ef4b04f8SRavi Kumar (~0UL << ((start) & (BITS_PER_WORD - 1))) 99ef4b04f8SRavi Kumar #define CCP_BITMAP_LAST_WORD_MASK(nbits) \ 100ef4b04f8SRavi Kumar (~0UL >> (-(nbits) & (BITS_PER_WORD - 1))) 101ef4b04f8SRavi Kumar 102ef4b04f8SRavi Kumar #define __ccp_round_mask(x, y) ((typeof(x))((y)-1)) 103ef4b04f8SRavi Kumar #define ccp_round_down(x, y) ((x) & ~__ccp_round_mask(x, y)) 104ef4b04f8SRavi Kumar 105ef4b04f8SRavi Kumar /** CCP registers Write/Read */ 106ef4b04f8SRavi Kumar 107ef4b04f8SRavi Kumar static inline void ccp_pci_reg_write(void *base, int offset, 108ef4b04f8SRavi Kumar uint32_t value) 109ef4b04f8SRavi Kumar { 110ef4b04f8SRavi Kumar volatile void *reg_addr = ((uint8_t *)base + offset); 111ef4b04f8SRavi Kumar 112ef4b04f8SRavi Kumar rte_write32((rte_cpu_to_le_32(value)), reg_addr); 113ef4b04f8SRavi Kumar } 114ef4b04f8SRavi Kumar 115ef4b04f8SRavi Kumar static inline uint32_t ccp_pci_reg_read(void *base, int offset) 116ef4b04f8SRavi Kumar { 117ef4b04f8SRavi Kumar volatile void *reg_addr = ((uint8_t *)base + offset); 118ef4b04f8SRavi Kumar 119ef4b04f8SRavi Kumar return rte_le_to_cpu_32(rte_read32(reg_addr)); 120ef4b04f8SRavi Kumar } 121ef4b04f8SRavi Kumar 122ef4b04f8SRavi Kumar #define CCP_READ_REG(hw_addr, reg_offset) \ 123ef4b04f8SRavi Kumar ccp_pci_reg_read(hw_addr, reg_offset) 124ef4b04f8SRavi Kumar 125ef4b04f8SRavi Kumar #define CCP_WRITE_REG(hw_addr, reg_offset, value) \ 126ef4b04f8SRavi Kumar ccp_pci_reg_write(hw_addr, reg_offset, value) 127ef4b04f8SRavi Kumar 128ef4b04f8SRavi Kumar TAILQ_HEAD(ccp_list, ccp_device); 129ef4b04f8SRavi Kumar 130ef4b04f8SRavi Kumar extern struct ccp_list ccp_list; 131ef4b04f8SRavi Kumar 132ef4b04f8SRavi Kumar /** 133ef4b04f8SRavi Kumar * CCP device version 134ef4b04f8SRavi Kumar */ 135ef4b04f8SRavi Kumar enum ccp_device_version { 136ef4b04f8SRavi Kumar CCP_VERSION_5A = 0, 137ef4b04f8SRavi Kumar CCP_VERSION_5B, 138ef4b04f8SRavi Kumar }; 139ef4b04f8SRavi Kumar 140ef4b04f8SRavi Kumar /** 141ef4b04f8SRavi Kumar * A structure describing a CCP command queue. 142ef4b04f8SRavi Kumar */ 143ef4b04f8SRavi Kumar struct ccp_queue { 144ef4b04f8SRavi Kumar struct ccp_device *dev; 145ef4b04f8SRavi Kumar char memz_name[RTE_MEMZONE_NAMESIZE]; 146ef4b04f8SRavi Kumar 147ef4b04f8SRavi Kumar rte_atomic64_t free_slots; 148ef4b04f8SRavi Kumar /**< available free slots updated from enq/deq calls */ 149ef4b04f8SRavi Kumar 150ef4b04f8SRavi Kumar /* Queue identifier */ 151ef4b04f8SRavi Kumar uint64_t id; /**< queue id */ 152ef4b04f8SRavi Kumar uint64_t qidx; /**< queue index */ 153ef4b04f8SRavi Kumar uint64_t qsize; /**< queue size */ 154ef4b04f8SRavi Kumar 155ef4b04f8SRavi Kumar /* Queue address */ 156ef4b04f8SRavi Kumar struct ccp_desc *qbase_desc; 157ef4b04f8SRavi Kumar void *qbase_addr; 158ef4b04f8SRavi Kumar phys_addr_t qbase_phys_addr; 159ef4b04f8SRavi Kumar /**< queue-page registers addr */ 160ef4b04f8SRavi Kumar void *reg_base; 161ef4b04f8SRavi Kumar 162ef4b04f8SRavi Kumar uint32_t qcontrol; 163ef4b04f8SRavi Kumar /**< queue ctrl reg */ 164ef4b04f8SRavi Kumar 165ef4b04f8SRavi Kumar int lsb; 166ef4b04f8SRavi Kumar /**< lsb region assigned to queue */ 167ef4b04f8SRavi Kumar unsigned long lsbmask; 168ef4b04f8SRavi Kumar /**< lsb regions queue can access */ 169ef4b04f8SRavi Kumar unsigned long lsbmap[CCP_BITMAP_SIZE(LSB_SIZE)]; 170ef4b04f8SRavi Kumar /**< all lsb resources which queue is using */ 171ef4b04f8SRavi Kumar uint32_t sb_key; 172ef4b04f8SRavi Kumar /**< lsb assigned for queue */ 173ef4b04f8SRavi Kumar uint32_t sb_iv; 174ef4b04f8SRavi Kumar /**< lsb assigned for iv */ 175ef4b04f8SRavi Kumar uint32_t sb_sha; 176ef4b04f8SRavi Kumar /**< lsb assigned for sha ctx */ 177ef4b04f8SRavi Kumar uint32_t sb_hmac; 178ef4b04f8SRavi Kumar /**< lsb assigned for hmac ctx */ 179ef4b04f8SRavi Kumar } ____cacheline_aligned; 180ef4b04f8SRavi Kumar 181ef4b04f8SRavi Kumar /** 182ef4b04f8SRavi Kumar * A structure describing a CCP device. 183ef4b04f8SRavi Kumar */ 184ef4b04f8SRavi Kumar struct ccp_device { 185ef4b04f8SRavi Kumar TAILQ_ENTRY(ccp_device) next; 186ef4b04f8SRavi Kumar int id; 187ef4b04f8SRavi Kumar /**< ccp dev id on platform */ 188ef4b04f8SRavi Kumar struct ccp_queue cmd_q[MAX_HW_QUEUES]; 189ef4b04f8SRavi Kumar /**< ccp queue */ 190ef4b04f8SRavi Kumar int cmd_q_count; 191ef4b04f8SRavi Kumar /**< no. of ccp Queues */ 192ef4b04f8SRavi Kumar struct rte_pci_device pci; 193ef4b04f8SRavi Kumar /**< ccp pci identifier */ 194ef4b04f8SRavi Kumar unsigned long lsbmap[CCP_BITMAP_SIZE(SLSB_MAP_SIZE)]; 195ef4b04f8SRavi Kumar /**< shared lsb mask of ccp */ 196ef4b04f8SRavi Kumar rte_spinlock_t lsb_lock; 197ef4b04f8SRavi Kumar /**< protection for shared lsb region allocation */ 198ef4b04f8SRavi Kumar int qidx; 199ef4b04f8SRavi Kumar /**< current queue index */ 200ef4b04f8SRavi Kumar } __rte_cache_aligned; 201ef4b04f8SRavi Kumar 202ef4b04f8SRavi Kumar /** 203ef4b04f8SRavi Kumar * descriptor for version 5 CPP commands 204ef4b04f8SRavi Kumar * 8 32-bit words: 205ef4b04f8SRavi Kumar * word 0: function; engine; control bits 206ef4b04f8SRavi Kumar * word 1: length of source data 207ef4b04f8SRavi Kumar * word 2: low 32 bits of source pointer 208ef4b04f8SRavi Kumar * word 3: upper 16 bits of source pointer; source memory type 209ef4b04f8SRavi Kumar * word 4: low 32 bits of destination pointer 210ef4b04f8SRavi Kumar * word 5: upper 16 bits of destination pointer; destination memory 211ef4b04f8SRavi Kumar * type 212ef4b04f8SRavi Kumar * word 6: low 32 bits of key pointer 213ef4b04f8SRavi Kumar * word 7: upper 16 bits of key pointer; key memory type 214ef4b04f8SRavi Kumar */ 215ef4b04f8SRavi Kumar struct dword0 { 216ef4b04f8SRavi Kumar uint32_t soc:1; 217ef4b04f8SRavi Kumar uint32_t ioc:1; 218ef4b04f8SRavi Kumar uint32_t rsvd1:1; 219ef4b04f8SRavi Kumar uint32_t init:1; 220ef4b04f8SRavi Kumar uint32_t eom:1; 221ef4b04f8SRavi Kumar uint32_t function:15; 222ef4b04f8SRavi Kumar uint32_t engine:4; 223ef4b04f8SRavi Kumar uint32_t prot:1; 224ef4b04f8SRavi Kumar uint32_t rsvd2:7; 225ef4b04f8SRavi Kumar }; 226ef4b04f8SRavi Kumar 227ef4b04f8SRavi Kumar struct dword3 { 228ef4b04f8SRavi Kumar uint32_t src_hi:16; 229ef4b04f8SRavi Kumar uint32_t src_mem:2; 230ef4b04f8SRavi Kumar uint32_t lsb_cxt_id:8; 231ef4b04f8SRavi Kumar uint32_t rsvd1:5; 232ef4b04f8SRavi Kumar uint32_t fixed:1; 233ef4b04f8SRavi Kumar }; 234ef4b04f8SRavi Kumar 235ef4b04f8SRavi Kumar union dword4 { 236ef4b04f8SRavi Kumar uint32_t dst_lo; /* NON-SHA */ 237ef4b04f8SRavi Kumar uint32_t sha_len_lo; /* SHA */ 238ef4b04f8SRavi Kumar }; 239ef4b04f8SRavi Kumar 240ef4b04f8SRavi Kumar union dword5 { 241ef4b04f8SRavi Kumar struct { 242ef4b04f8SRavi Kumar uint32_t dst_hi:16; 243ef4b04f8SRavi Kumar uint32_t dst_mem:2; 244ef4b04f8SRavi Kumar uint32_t rsvd1:13; 245ef4b04f8SRavi Kumar uint32_t fixed:1; 246ef4b04f8SRavi Kumar } 247ef4b04f8SRavi Kumar fields; 248ef4b04f8SRavi Kumar uint32_t sha_len_hi; 249ef4b04f8SRavi Kumar }; 250ef4b04f8SRavi Kumar 251ef4b04f8SRavi Kumar struct dword7 { 252ef4b04f8SRavi Kumar uint32_t key_hi:16; 253ef4b04f8SRavi Kumar uint32_t key_mem:2; 254ef4b04f8SRavi Kumar uint32_t rsvd1:14; 255ef4b04f8SRavi Kumar }; 256ef4b04f8SRavi Kumar 257ef4b04f8SRavi Kumar struct ccp_desc { 258ef4b04f8SRavi Kumar struct dword0 dw0; 259ef4b04f8SRavi Kumar uint32_t length; 260ef4b04f8SRavi Kumar uint32_t src_lo; 261ef4b04f8SRavi Kumar struct dword3 dw3; 262ef4b04f8SRavi Kumar union dword4 dw4; 263ef4b04f8SRavi Kumar union dword5 dw5; 264ef4b04f8SRavi Kumar uint32_t key_lo; 265ef4b04f8SRavi Kumar struct dword7 dw7; 266ef4b04f8SRavi Kumar }; 267ef4b04f8SRavi Kumar 268ef4b04f8SRavi Kumar static inline uint32_t 269ef4b04f8SRavi Kumar low32_value(unsigned long addr) 270ef4b04f8SRavi Kumar { 271ef4b04f8SRavi Kumar return ((uint64_t)addr) & 0x0ffffffff; 272ef4b04f8SRavi Kumar } 273ef4b04f8SRavi Kumar 274ef4b04f8SRavi Kumar static inline uint32_t 275ef4b04f8SRavi Kumar high32_value(unsigned long addr) 276ef4b04f8SRavi Kumar { 277ef4b04f8SRavi Kumar return ((uint64_t)addr >> 32) & 0x00000ffff; 278ef4b04f8SRavi Kumar } 279ef4b04f8SRavi Kumar 280*3c20cf98SRavi Kumar /* 281*3c20cf98SRavi Kumar * Start CCP device 282*3c20cf98SRavi Kumar */ 283*3c20cf98SRavi Kumar int ccp_dev_start(struct rte_cryptodev *dev); 284*3c20cf98SRavi Kumar 285ef4b04f8SRavi Kumar /** 286ef4b04f8SRavi Kumar * Detect ccp platform and initialize all ccp devices 287ef4b04f8SRavi Kumar * 288ef4b04f8SRavi Kumar * @param ccp_id rte_pci_id list for supported CCP devices 289ef4b04f8SRavi Kumar * @return no. of successfully initialized CCP devices 290ef4b04f8SRavi Kumar */ 291ef4b04f8SRavi Kumar int ccp_probe_devices(const struct rte_pci_id *ccp_id); 292ef4b04f8SRavi Kumar 293ef4b04f8SRavi Kumar #endif /* _CCP_DEV_H_ */ 294