linux/drivers/crypto/ux500/hash/hash_alg.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-only */
   2/*
   3 * Copyright (C) ST-Ericsson SA 2010
   4 * Author: Shujuan Chen (shujuan.chen@stericsson.com)
   5 * Author: Joakim Bech (joakim.xx.bech@stericsson.com)
   6 * Author: Berne Hebark (berne.hebark@stericsson.com))
   7 */
   8#ifndef _HASH_ALG_H
   9#define _HASH_ALG_H
  10
  11#include <linux/bitops.h>
  12
  13#define HASH_BLOCK_SIZE                 64
  14#define HASH_DMA_FIFO                   4
  15#define HASH_DMA_ALIGN_SIZE             4
  16#define HASH_DMA_PERFORMANCE_MIN_SIZE   1024
  17#define HASH_BYTES_PER_WORD             4
  18
  19/* Maximum value of the length's high word */
  20#define HASH_HIGH_WORD_MAX_VAL          0xFFFFFFFFUL
  21
  22/* Power on Reset values HASH registers */
  23#define HASH_RESET_CR_VALUE             0x0
  24#define HASH_RESET_STR_VALUE            0x0
  25
  26/* Number of context swap registers */
  27#define HASH_CSR_COUNT                  52
  28
  29#define HASH_RESET_CSRX_REG_VALUE       0x0
  30#define HASH_RESET_CSFULL_REG_VALUE     0x0
  31#define HASH_RESET_CSDATAIN_REG_VALUE   0x0
  32
  33#define HASH_RESET_INDEX_VAL            0x0
  34#define HASH_RESET_BIT_INDEX_VAL        0x0
  35#define HASH_RESET_BUFFER_VAL           0x0
  36#define HASH_RESET_LEN_HIGH_VAL         0x0
  37#define HASH_RESET_LEN_LOW_VAL          0x0
  38
  39/* Control register bitfields */
  40#define HASH_CR_RESUME_MASK     0x11FCF
  41
  42#define HASH_CR_SWITCHON_POS    31
  43#define HASH_CR_SWITCHON_MASK   BIT(31)
  44
  45#define HASH_CR_EMPTYMSG_POS    20
  46#define HASH_CR_EMPTYMSG_MASK   BIT(20)
  47
  48#define HASH_CR_DINF_POS        12
  49#define HASH_CR_DINF_MASK       BIT(12)
  50
  51#define HASH_CR_NBW_POS         8
  52#define HASH_CR_NBW_MASK        0x00000F00UL
  53
  54#define HASH_CR_LKEY_POS        16
  55#define HASH_CR_LKEY_MASK       BIT(16)
  56
  57#define HASH_CR_ALGO_POS        7
  58#define HASH_CR_ALGO_MASK       BIT(7)
  59
  60#define HASH_CR_MODE_POS        6
  61#define HASH_CR_MODE_MASK       BIT(6)
  62
  63#define HASH_CR_DATAFORM_POS    4
  64#define HASH_CR_DATAFORM_MASK   (BIT(4) | BIT(5))
  65
  66#define HASH_CR_DMAE_POS        3
  67#define HASH_CR_DMAE_MASK       BIT(3)
  68
  69#define HASH_CR_INIT_POS        2
  70#define HASH_CR_INIT_MASK       BIT(2)
  71
  72#define HASH_CR_PRIVN_POS       1
  73#define HASH_CR_PRIVN_MASK      BIT(1)
  74
  75#define HASH_CR_SECN_POS        0
  76#define HASH_CR_SECN_MASK       BIT(0)
  77
  78/* Start register bitfields */
  79#define HASH_STR_DCAL_POS       8
  80#define HASH_STR_DCAL_MASK      BIT(8)
  81#define HASH_STR_DEFAULT        0x0
  82
  83#define HASH_STR_NBLW_POS       0
  84#define HASH_STR_NBLW_MASK      0x0000001FUL
  85
  86#define HASH_NBLW_MAX_VAL       0x1F
  87
  88/* PrimeCell IDs */
  89#define HASH_P_ID0              0xE0
  90#define HASH_P_ID1              0x05
  91#define HASH_P_ID2              0x38
  92#define HASH_P_ID3              0x00
  93#define HASH_CELL_ID0           0x0D
  94#define HASH_CELL_ID1           0xF0
  95#define HASH_CELL_ID2           0x05
  96#define HASH_CELL_ID3           0xB1
  97
  98#define HASH_SET_BITS(reg_name, mask)   \
  99        writel_relaxed((readl_relaxed(reg_name) | mask), reg_name)
 100
 101#define HASH_CLEAR_BITS(reg_name, mask) \
 102        writel_relaxed((readl_relaxed(reg_name) & ~mask), reg_name)
 103
 104#define HASH_PUT_BITS(reg, val, shift, mask)    \
 105        writel_relaxed(((readl(reg) & ~(mask)) |        \
 106                (((u32)val << shift) & (mask))), reg)
 107
 108#define HASH_SET_DIN(val, len)  writesl(&device_data->base->din, (val), (len))
 109
 110#define HASH_INITIALIZE                 \
 111        HASH_PUT_BITS(                  \
 112                &device_data->base->cr, \
 113                0x01, HASH_CR_INIT_POS, \
 114                HASH_CR_INIT_MASK)
 115
 116#define HASH_SET_DATA_FORMAT(data_format)                               \
 117                HASH_PUT_BITS(                                          \
 118                        &device_data->base->cr,                         \
 119                        (u32) (data_format), HASH_CR_DATAFORM_POS,      \
 120                        HASH_CR_DATAFORM_MASK)
 121#define HASH_SET_NBLW(val)                                      \
 122                HASH_PUT_BITS(                                  \
 123                        &device_data->base->str,                \
 124                        (u32) (val), HASH_STR_NBLW_POS,         \
 125                        HASH_STR_NBLW_MASK)
 126#define HASH_SET_DCAL                                   \
 127                HASH_PUT_BITS(                          \
 128                        &device_data->base->str,        \
 129                        0x01, HASH_STR_DCAL_POS,        \
 130                        HASH_STR_DCAL_MASK)
 131
 132/* Hardware access method */
 133enum hash_mode {
 134        HASH_MODE_CPU,
 135        HASH_MODE_DMA
 136};
 137
 138/**
 139 * struct uint64 - Structure to handle 64 bits integers.
 140 * @high_word:  Most significant bits.
 141 * @low_word:   Least significant bits.
 142 *
 143 * Used to handle 64 bits integers.
 144 */
 145struct uint64 {
 146        u32 high_word;
 147        u32 low_word;
 148};
 149
 150/**
 151 * struct hash_register - Contains all registers in ux500 hash hardware.
 152 * @cr:         HASH control register (0x000).
 153 * @din:        HASH data input register (0x004).
 154 * @str:        HASH start register (0x008).
 155 * @hx:         HASH digest register 0..7 (0x00c-0x01C).
 156 * @padding0:   Reserved (0x02C).
 157 * @itcr:       Integration test control register (0x080).
 158 * @itip:       Integration test input register (0x084).
 159 * @itop:       Integration test output register (0x088).
 160 * @padding1:   Reserved (0x08C).
 161 * @csfull:     HASH context full register (0x0F8).
 162 * @csdatain:   HASH context swap data input register (0x0FC).
 163 * @csrx:       HASH context swap register 0..51 (0x100-0x1CC).
 164 * @padding2:   Reserved (0x1D0).
 165 * @periphid0:  HASH peripheral identification register 0 (0xFE0).
 166 * @periphid1:  HASH peripheral identification register 1 (0xFE4).
 167 * @periphid2:  HASH peripheral identification register 2 (0xFE8).
 168 * @periphid3:  HASH peripheral identification register 3 (0xFEC).
 169 * @cellid0:    HASH PCell identification register 0 (0xFF0).
 170 * @cellid1:    HASH PCell identification register 1 (0xFF4).
 171 * @cellid2:    HASH PCell identification register 2 (0xFF8).
 172 * @cellid3:    HASH PCell identification register 3 (0xFFC).
 173 *
 174 * The device communicates to the HASH via 32-bit-wide control registers
 175 * accessible via the 32-bit width AMBA rev. 2.0 AHB Bus. Below is a structure
 176 * with the registers used.
 177 */
 178struct hash_register {
 179        u32 cr;
 180        u32 din;
 181        u32 str;
 182        u32 hx[8];
 183
 184        u32 padding0[(0x080 - 0x02C) / sizeof(u32)];
 185
 186        u32 itcr;
 187        u32 itip;
 188        u32 itop;
 189
 190        u32 padding1[(0x0F8 - 0x08C) / sizeof(u32)];
 191
 192        u32 csfull;
 193        u32 csdatain;
 194        u32 csrx[HASH_CSR_COUNT];
 195
 196        u32 padding2[(0xFE0 - 0x1D0) / sizeof(u32)];
 197
 198        u32 periphid0;
 199        u32 periphid1;
 200        u32 periphid2;
 201        u32 periphid3;
 202
 203        u32 cellid0;
 204        u32 cellid1;
 205        u32 cellid2;
 206        u32 cellid3;
 207};
 208
 209/**
 210 * struct hash_state - Hash context state.
 211 * @temp_cr:    Temporary HASH Control Register.
 212 * @str_reg:    HASH Start Register.
 213 * @din_reg:    HASH Data Input Register.
 214 * @csr[52]:    HASH Context Swap Registers 0-39.
 215 * @csfull:     HASH Context Swap Registers 40 ie Status flags.
 216 * @csdatain:   HASH Context Swap Registers 41 ie Input data.
 217 * @buffer:     Working buffer for messages going to the hardware.
 218 * @length:     Length of the part of message hashed so far (floor(N/64) * 64).
 219 * @index:      Valid number of bytes in buffer (N % 64).
 220 * @bit_index:  Valid number of bits in buffer (N % 8).
 221 *
 222 * This structure is used between context switches, i.e. when ongoing jobs are
 223 * interupted with new jobs. When this happens we need to store intermediate
 224 * results in software.
 225 *
 226 * WARNING: "index" is the  member of the structure, to be sure  that "buffer"
 227 * is aligned on a 4-bytes boundary. This is highly implementation dependent
 228 * and MUST be checked whenever this code is ported on new platforms.
 229 */
 230struct hash_state {
 231        u32             temp_cr;
 232        u32             str_reg;
 233        u32             din_reg;
 234        u32             csr[52];
 235        u32             csfull;
 236        u32             csdatain;
 237        u32             buffer[HASH_BLOCK_SIZE / sizeof(u32)];
 238        struct uint64   length;
 239        u8              index;
 240        u8              bit_index;
 241};
 242
 243/**
 244 * enum hash_device_id - HASH device ID.
 245 * @HASH_DEVICE_ID_0: Hash hardware with ID 0
 246 * @HASH_DEVICE_ID_1: Hash hardware with ID 1
 247 */
 248enum hash_device_id {
 249        HASH_DEVICE_ID_0 = 0,
 250        HASH_DEVICE_ID_1 = 1
 251};
 252
 253/**
 254 * enum hash_data_format - HASH data format.
 255 * @HASH_DATA_32_BITS:  32 bits data format
 256 * @HASH_DATA_16_BITS:  16 bits data format
 257 * @HASH_DATA_8_BITS:   8 bits data format.
 258 * @HASH_DATA_1_BITS:   1 bit data format.
 259 */
 260enum hash_data_format {
 261        HASH_DATA_32_BITS       = 0x0,
 262        HASH_DATA_16_BITS       = 0x1,
 263        HASH_DATA_8_BITS        = 0x2,
 264        HASH_DATA_1_BIT         = 0x3
 265};
 266
 267/**
 268 * enum hash_algo - Enumeration for selecting between SHA1 or SHA2 algorithm.
 269 * @HASH_ALGO_SHA1: Indicates that SHA1 is used.
 270 * @HASH_ALGO_SHA2: Indicates that SHA2 (SHA256) is used.
 271 */
 272enum hash_algo {
 273        HASH_ALGO_SHA1          = 0x0,
 274        HASH_ALGO_SHA256        = 0x1
 275};
 276
 277/**
 278 * enum hash_op - Enumeration for selecting between HASH or HMAC mode.
 279 * @HASH_OPER_MODE_HASH: Indicates usage of normal HASH mode.
 280 * @HASH_OPER_MODE_HMAC: Indicates usage of HMAC.
 281 */
 282enum hash_op {
 283        HASH_OPER_MODE_HASH = 0x0,
 284        HASH_OPER_MODE_HMAC = 0x1
 285};
 286
 287/**
 288 * struct hash_config - Configuration data for the hardware.
 289 * @data_format:        Format of data entered into the hash data in register.
 290 * @algorithm:          Algorithm selection bit.
 291 * @oper_mode:          Operating mode selection bit.
 292 */
 293struct hash_config {
 294        int data_format;
 295        int algorithm;
 296        int oper_mode;
 297};
 298
 299/**
 300 * struct hash_dma - Structure used for dma.
 301 * @mask:               DMA capabilities bitmap mask.
 302 * @complete:           Used to maintain state for a "completion".
 303 * @chan_mem2hash:      DMA channel.
 304 * @cfg_mem2hash:       DMA channel configuration.
 305 * @sg_len:             Scatterlist length.
 306 * @sg:                 Scatterlist.
 307 * @nents:              Number of sg entries.
 308 */
 309struct hash_dma {
 310        dma_cap_mask_t          mask;
 311        struct completion       complete;
 312        struct dma_chan         *chan_mem2hash;
 313        void                    *cfg_mem2hash;
 314        int                     sg_len;
 315        struct scatterlist      *sg;
 316        int                     nents;
 317};
 318
 319/**
 320 * struct hash_ctx - The context used for hash calculations.
 321 * @key:        The key used in the operation.
 322 * @keylen:     The length of the key.
 323 * @state:      The state of the current calculations.
 324 * @config:     The current configuration.
 325 * @digestsize: The size of current digest.
 326 * @device:     Pointer to the device structure.
 327 */
 328struct hash_ctx {
 329        u8                      *key;
 330        u32                     keylen;
 331        struct hash_config      config;
 332        int                     digestsize;
 333        struct hash_device_data *device;
 334};
 335
 336/**
 337 * struct hash_ctx - The request context used for hash calculations.
 338 * @state:      The state of the current calculations.
 339 * @dma_mode:   Used in special cases (workaround), e.g. need to change to
 340 *              cpu mode, if not supported/working in dma mode.
 341 * @updated:    Indicates if hardware is initialized for new operations.
 342 */
 343struct hash_req_ctx {
 344        struct hash_state       state;
 345        bool                    dma_mode;
 346        u8                      updated;
 347};
 348
 349/**
 350 * struct hash_device_data - structure for a hash device.
 351 * @base:               Pointer to virtual base address of the hash device.
 352 * @phybase:            Pointer to physical memory location of the hash device.
 353 * @list_node:          For inclusion in klist.
 354 * @dev:                Pointer to the device dev structure.
 355 * @ctx_lock:           Spinlock for current_ctx.
 356 * @current_ctx:        Pointer to the currently allocated context.
 357 * @power_state:        TRUE = power state on, FALSE = power state off.
 358 * @power_state_lock:   Spinlock for power_state.
 359 * @regulator:          Pointer to the device's power control.
 360 * @clk:                Pointer to the device's clock control.
 361 * @restore_dev_state:  TRUE = saved state, FALSE = no saved state.
 362 * @dma:                Structure used for dma.
 363 */
 364struct hash_device_data {
 365        struct hash_register __iomem    *base;
 366        phys_addr_t             phybase;
 367        struct klist_node       list_node;
 368        struct device           *dev;
 369        spinlock_t              ctx_lock;
 370        struct hash_ctx         *current_ctx;
 371        bool                    power_state;
 372        spinlock_t              power_state_lock;
 373        struct regulator        *regulator;
 374        struct clk              *clk;
 375        bool                    restore_dev_state;
 376        struct hash_state       state; /* Used for saving and resuming state */
 377        struct hash_dma         dma;
 378};
 379
 380int hash_check_hw(struct hash_device_data *device_data);
 381
 382int hash_setconfiguration(struct hash_device_data *device_data,
 383                struct hash_config *config);
 384
 385void hash_begin(struct hash_device_data *device_data, struct hash_ctx *ctx);
 386
 387void hash_get_digest(struct hash_device_data *device_data,
 388                u8 *digest, int algorithm);
 389
 390int hash_hw_update(struct ahash_request *req);
 391
 392int hash_save_state(struct hash_device_data *device_data,
 393                struct hash_state *state);
 394
 395int hash_resume_state(struct hash_device_data *device_data,
 396                const struct hash_state *state);
 397
 398#endif
 399