linux/drivers/crypto/caam/sg_sw_qm.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) */
   2/*
   3 * Copyright 2013-2016 Freescale Semiconductor, Inc.
   4 * Copyright 2016-2017 NXP
   5 */
   6
   7#ifndef __SG_SW_QM_H
   8#define __SG_SW_QM_H
   9
  10#include <soc/fsl/qman.h>
  11#include "regs.h"
  12
  13static inline void __dma_to_qm_sg(struct qm_sg_entry *qm_sg_ptr, dma_addr_t dma,
  14                                  u16 offset)
  15{
  16        qm_sg_entry_set64(qm_sg_ptr, dma);
  17        qm_sg_ptr->__reserved2 = 0;
  18        qm_sg_ptr->bpid = 0;
  19        qm_sg_ptr->offset = cpu_to_be16(offset & QM_SG_OFF_MASK);
  20}
  21
  22static inline void dma_to_qm_sg_one(struct qm_sg_entry *qm_sg_ptr,
  23                                    dma_addr_t dma, u32 len, u16 offset)
  24{
  25        __dma_to_qm_sg(qm_sg_ptr, dma, offset);
  26        qm_sg_entry_set_len(qm_sg_ptr, len);
  27}
  28
  29static inline void dma_to_qm_sg_one_last(struct qm_sg_entry *qm_sg_ptr,
  30                                         dma_addr_t dma, u32 len, u16 offset)
  31{
  32        __dma_to_qm_sg(qm_sg_ptr, dma, offset);
  33        qm_sg_entry_set_f(qm_sg_ptr, len);
  34}
  35
  36static inline void dma_to_qm_sg_one_ext(struct qm_sg_entry *qm_sg_ptr,
  37                                        dma_addr_t dma, u32 len, u16 offset)
  38{
  39        __dma_to_qm_sg(qm_sg_ptr, dma, offset);
  40        qm_sg_ptr->cfg = cpu_to_be32(QM_SG_EXT | (len & QM_SG_LEN_MASK));
  41}
  42
  43static inline void dma_to_qm_sg_one_last_ext(struct qm_sg_entry *qm_sg_ptr,
  44                                             dma_addr_t dma, u32 len,
  45                                             u16 offset)
  46{
  47        __dma_to_qm_sg(qm_sg_ptr, dma, offset);
  48        qm_sg_ptr->cfg = cpu_to_be32(QM_SG_EXT | QM_SG_FIN |
  49                                     (len & QM_SG_LEN_MASK));
  50}
  51
  52/*
  53 * convert scatterlist to h/w link table format
  54 * but does not have final bit; instead, returns last entry
  55 */
  56static inline struct qm_sg_entry *
  57sg_to_qm_sg(struct scatterlist *sg, int len,
  58            struct qm_sg_entry *qm_sg_ptr, u16 offset)
  59{
  60        int ent_len;
  61
  62        while (len) {
  63                ent_len = min_t(int, sg_dma_len(sg), len);
  64
  65                dma_to_qm_sg_one(qm_sg_ptr, sg_dma_address(sg), ent_len,
  66                                 offset);
  67                qm_sg_ptr++;
  68                sg = sg_next(sg);
  69                len -= ent_len;
  70        }
  71        return qm_sg_ptr - 1;
  72}
  73
  74/*
  75 * convert scatterlist to h/w link table format
  76 * scatterlist must have been previously dma mapped
  77 */
  78static inline void sg_to_qm_sg_last(struct scatterlist *sg, int len,
  79                                    struct qm_sg_entry *qm_sg_ptr, u16 offset)
  80{
  81        qm_sg_ptr = sg_to_qm_sg(sg, len, qm_sg_ptr, offset);
  82        qm_sg_entry_set_f(qm_sg_ptr, qm_sg_entry_get_len(qm_sg_ptr));
  83}
  84
  85#endif /* __SG_SW_QM_H */
  86