2018-10-10 14:26:48 +03:00
/* SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) */
2017-07-18 18:30:47 +03:00
/*
* Copyright 2015 - 2016 Freescale Semiconductor , Inc .
* Copyright 2017 NXP
*/
# ifndef _SG_SW_QM2_H_
# define _SG_SW_QM2_H_
2018-07-24 09:21:29 -05:00
# include <soc/fsl/dpaa2-fd.h>
2017-07-18 18:30:47 +03:00
static inline void dma_to_qm_sg_one ( struct dpaa2_sg_entry * qm_sg_ptr ,
dma_addr_t dma , u32 len , u16 offset )
{
dpaa2_sg_set_addr ( qm_sg_ptr , dma ) ;
dpaa2_sg_set_format ( qm_sg_ptr , dpaa2_sg_single ) ;
dpaa2_sg_set_final ( qm_sg_ptr , false ) ;
dpaa2_sg_set_len ( qm_sg_ptr , len ) ;
dpaa2_sg_set_bpid ( qm_sg_ptr , 0 ) ;
dpaa2_sg_set_offset ( qm_sg_ptr , offset ) ;
}
/*
* convert scatterlist to h / w link table format
* but does not have final bit ; instead , returns last entry
*/
static inline struct dpaa2_sg_entry *
2019-06-10 16:30:58 +03:00
sg_to_qm_sg ( struct scatterlist * sg , int len ,
2017-07-18 18:30:47 +03:00
struct dpaa2_sg_entry * qm_sg_ptr , u16 offset )
{
2019-06-10 16:30:58 +03:00
int ent_len ;
while ( len ) {
ent_len = min_t ( int , sg_dma_len ( sg ) , len ) ;
dma_to_qm_sg_one ( qm_sg_ptr , sg_dma_address ( sg ) , ent_len ,
offset ) ;
2017-07-18 18:30:47 +03:00
qm_sg_ptr + + ;
sg = sg_next ( sg ) ;
2019-06-10 16:30:58 +03:00
len - = ent_len ;
2017-07-18 18:30:47 +03:00
}
return qm_sg_ptr - 1 ;
}
/*
* convert scatterlist to h / w link table format
* scatterlist must have been previously dma mapped
*/
2019-06-10 16:30:58 +03:00
static inline void sg_to_qm_sg_last ( struct scatterlist * sg , int len ,
2017-07-18 18:30:47 +03:00
struct dpaa2_sg_entry * qm_sg_ptr ,
u16 offset )
{
2019-06-10 16:30:58 +03:00
qm_sg_ptr = sg_to_qm_sg ( sg , len , qm_sg_ptr , offset ) ;
2017-07-18 18:30:47 +03:00
dpaa2_sg_set_final ( qm_sg_ptr , true ) ;
}
# endif /* _SG_SW_QM2_H_ */