162306a36Sopenharmony_ci/* SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright 2015-2016 Freescale Semiconductor, Inc. 462306a36Sopenharmony_ci * Copyright 2017 NXP 562306a36Sopenharmony_ci */ 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#ifndef _SG_SW_QM2_H_ 862306a36Sopenharmony_ci#define _SG_SW_QM2_H_ 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#include <soc/fsl/dpaa2-fd.h> 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_cistatic inline void dma_to_qm_sg_one(struct dpaa2_sg_entry *qm_sg_ptr, 1362306a36Sopenharmony_ci dma_addr_t dma, u32 len, u16 offset) 1462306a36Sopenharmony_ci{ 1562306a36Sopenharmony_ci dpaa2_sg_set_addr(qm_sg_ptr, dma); 1662306a36Sopenharmony_ci dpaa2_sg_set_format(qm_sg_ptr, dpaa2_sg_single); 1762306a36Sopenharmony_ci dpaa2_sg_set_final(qm_sg_ptr, false); 1862306a36Sopenharmony_ci dpaa2_sg_set_len(qm_sg_ptr, len); 1962306a36Sopenharmony_ci dpaa2_sg_set_bpid(qm_sg_ptr, 0); 2062306a36Sopenharmony_ci dpaa2_sg_set_offset(qm_sg_ptr, offset); 2162306a36Sopenharmony_ci} 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci/* 2462306a36Sopenharmony_ci * convert scatterlist to h/w link table format 2562306a36Sopenharmony_ci * but does not have final bit; instead, returns last entry 2662306a36Sopenharmony_ci */ 2762306a36Sopenharmony_cistatic inline struct dpaa2_sg_entry * 2862306a36Sopenharmony_cisg_to_qm_sg(struct scatterlist *sg, int len, 2962306a36Sopenharmony_ci struct dpaa2_sg_entry *qm_sg_ptr, u16 offset) 3062306a36Sopenharmony_ci{ 3162306a36Sopenharmony_ci int ent_len; 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ci while (len) { 3462306a36Sopenharmony_ci ent_len = min_t(int, sg_dma_len(sg), len); 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci dma_to_qm_sg_one(qm_sg_ptr, sg_dma_address(sg), ent_len, 3762306a36Sopenharmony_ci offset); 3862306a36Sopenharmony_ci qm_sg_ptr++; 3962306a36Sopenharmony_ci sg = sg_next(sg); 4062306a36Sopenharmony_ci len -= ent_len; 4162306a36Sopenharmony_ci } 4262306a36Sopenharmony_ci return qm_sg_ptr - 1; 4362306a36Sopenharmony_ci} 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci/* 4662306a36Sopenharmony_ci * convert scatterlist to h/w link table format 4762306a36Sopenharmony_ci * scatterlist must have been previously dma mapped 4862306a36Sopenharmony_ci */ 4962306a36Sopenharmony_cistatic inline void sg_to_qm_sg_last(struct scatterlist *sg, int len, 5062306a36Sopenharmony_ci struct dpaa2_sg_entry *qm_sg_ptr, 5162306a36Sopenharmony_ci u16 offset) 5262306a36Sopenharmony_ci{ 5362306a36Sopenharmony_ci qm_sg_ptr = sg_to_qm_sg(sg, len, qm_sg_ptr, offset); 5462306a36Sopenharmony_ci dpaa2_sg_set_final(qm_sg_ptr, true); 5562306a36Sopenharmony_ci} 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ci#endif /* _SG_SW_QM2_H_ */ 58