dpdk/drivers/common/dpaax/caamflib/rta/seq_in_out_ptr_cmd.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0)
   2 *
   3 * Copyright 2008-2016 Freescale Semiconductor Inc.
   4 * Copyright 2016,2019 NXP
   5 */
   6
   7#ifndef __RTA_SEQ_IN_OUT_PTR_CMD_H__
   8#define __RTA_SEQ_IN_OUT_PTR_CMD_H__
   9
  10extern enum rta_sec_era rta_sec_era;
  11
  12/* Allowed SEQ IN PTR flags for each SEC Era. */
  13static const uint32_t seq_in_ptr_flags[] = {
  14        RBS | INL | SGF | PRE | EXT | RTO,
  15        RBS | INL | SGF | PRE | EXT | RTO | RJD,
  16        RBS | INL | SGF | PRE | EXT | RTO | RJD,
  17        RBS | INL | SGF | PRE | EXT | RTO | RJD,
  18        RBS | INL | SGF | PRE | EXT | RTO | RJD | SOP,
  19        RBS | INL | SGF | PRE | EXT | RTO | RJD | SOP,
  20        RBS | INL | SGF | PRE | EXT | RTO | RJD | SOP,
  21        RBS | INL | SGF | PRE | EXT | RTO | RJD | SOP,
  22        RBS | INL | SGF | PRE | EXT | RTO | RJD | SOP,
  23        RBS | INL | SGF | PRE | EXT | RTO | RJD | SOP
  24};
  25
  26/* Allowed SEQ OUT PTR flags for each SEC Era. */
  27static const uint32_t seq_out_ptr_flags[] = {
  28        SGF | PRE | EXT,
  29        SGF | PRE | EXT | RTO,
  30        SGF | PRE | EXT | RTO,
  31        SGF | PRE | EXT | RTO,
  32        SGF | PRE | EXT | RTO | RST | EWS,
  33        SGF | PRE | EXT | RTO | RST | EWS,
  34        SGF | PRE | EXT | RTO | RST | EWS,
  35        SGF | PRE | EXT | RTO | RST | EWS,
  36        SGF | PRE | EXT | RTO | RST | EWS,
  37        SGF | PRE | EXT | RTO | RST | EWS
  38};
  39
  40static inline int
  41rta_seq_in_ptr(struct program *program, uint64_t src,
  42               uint32_t length, uint32_t flags)
  43{
  44        uint32_t opcode = CMD_SEQ_IN_PTR;
  45        unsigned int start_pc = program->current_pc;
  46        int ret = -EINVAL;
  47
  48        /* Parameters checking */
  49        if ((flags & RTO) && (flags & PRE)) {
  50                pr_err("SEQ IN PTR: Invalid usage of RTO and PRE flags\n");
  51                goto err;
  52        }
  53        if (flags & ~seq_in_ptr_flags[rta_sec_era]) {
  54                pr_err("SEQ IN PTR: Flag(s) not supported by SEC Era %d\n",
  55                       USER_SEC_ERA(rta_sec_era));
  56                goto err;
  57        }
  58        if ((flags & INL) && (flags & RJD)) {
  59                pr_err("SEQ IN PTR: Invalid usage of INL and RJD flags\n");
  60                goto err;
  61        }
  62        if ((src) && (flags & (SOP | RTO | PRE))) {
  63                pr_err("SEQ IN PTR: Invalid usage of RTO or PRE flag\n");
  64                goto err;
  65        }
  66        if ((flags & SOP) && (flags & (RBS | PRE | RTO | EXT))) {
  67                pr_err("SEQ IN PTR: Invalid usage of SOP and (RBS or PRE or RTO or EXT) flags\n");
  68                goto err;
  69        }
  70
  71        /* write flag fields */
  72        if (flags & RBS)
  73                opcode |= SQIN_RBS;
  74        if (flags & INL)
  75                opcode |= SQIN_INL;
  76        if (flags & SGF)
  77                opcode |= SQIN_SGF;
  78        if (flags & PRE)
  79                opcode |= SQIN_PRE;
  80        if (flags & RTO)
  81                opcode |= SQIN_RTO;
  82        if (flags & RJD)
  83                opcode |= SQIN_RJD;
  84        if (flags & SOP)
  85                opcode |= SQIN_SOP;
  86        if ((length >> 16) || (flags & EXT)) {
  87                if (flags & SOP) {
  88                        pr_err("SEQ IN PTR: Invalid usage of SOP and EXT flags\n");
  89                        goto err;
  90                }
  91
  92                opcode |= SQIN_EXT;
  93        } else {
  94                opcode |= length & SQIN_LEN_MASK;
  95        }
  96
  97        __rta_out32(program, opcode);
  98        program->current_instruction++;
  99
 100        /* write pointer or immediate data field */
 101        if (!(opcode & (SQIN_PRE | SQIN_RTO | SQIN_SOP)))
 102                __rta_out64(program, program->ps, src);
 103
 104        /* write extended length field */
 105        if (opcode & SQIN_EXT)
 106                __rta_out32(program, length);
 107
 108        return (int)start_pc;
 109
 110 err:
 111        program->first_error_pc = start_pc;
 112        program->current_instruction++;
 113        return ret;
 114}
 115
 116static inline int
 117rta_seq_out_ptr(struct program *program, uint64_t dst,
 118                uint32_t length, uint32_t flags)
 119{
 120        uint32_t opcode = CMD_SEQ_OUT_PTR;
 121        unsigned int start_pc = program->current_pc;
 122        int ret = -EINVAL;
 123
 124        /* Parameters checking */
 125        if (flags & ~seq_out_ptr_flags[rta_sec_era]) {
 126                pr_err("SEQ OUT PTR: Flag(s) not supported by SEC Era %d\n",
 127                       USER_SEC_ERA(rta_sec_era));
 128                goto err;
 129        }
 130        if ((flags & RTO) && (flags & PRE)) {
 131                pr_err("SEQ OUT PTR: Invalid usage of RTO and PRE flags\n");
 132                goto err;
 133        }
 134        if ((dst) && (flags & (RTO | PRE))) {
 135                pr_err("SEQ OUT PTR: Invalid usage of RTO or PRE flag\n");
 136                goto err;
 137        }
 138        if ((flags & RST) && !(flags & RTO)) {
 139                pr_err("SEQ OUT PTR: RST flag must be used with RTO flag\n");
 140                goto err;
 141        }
 142
 143        /* write flag fields */
 144        if (flags & SGF)
 145                opcode |= SQOUT_SGF;
 146        if (flags & PRE)
 147                opcode |= SQOUT_PRE;
 148        if (flags & RTO)
 149                opcode |= SQOUT_RTO;
 150        if (flags & RST)
 151                opcode |= SQOUT_RST;
 152        if (flags & EWS)
 153                opcode |= SQOUT_EWS;
 154        if ((length >> 16) || (flags & EXT))
 155                opcode |= SQOUT_EXT;
 156        else
 157                opcode |= length & SQOUT_LEN_MASK;
 158
 159        __rta_out32(program, opcode);
 160        program->current_instruction++;
 161
 162        /* write pointer or immediate data field */
 163        if (!(opcode & (SQOUT_PRE | SQOUT_RTO)))
 164                __rta_out64(program, program->ps, dst);
 165
 166        /* write extended length field */
 167        if (opcode & SQOUT_EXT)
 168                __rta_out32(program, length);
 169
 170        return (int)start_pc;
 171
 172 err:
 173        program->first_error_pc = start_pc;
 174        program->current_instruction++;
 175        return ret;
 176}
 177
 178#endif /* __RTA_SEQ_IN_OUT_PTR_CMD_H__ */
 179