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