142 lines · c
1/* SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) */2/*3 * Copyright 2014-2016 Freescale Semiconductor Inc.4 * Copyright 2017-2019 NXP5 *6 */7#ifndef __FSL_DPAA2_IO_H8#define __FSL_DPAA2_IO_H9 10#include <linux/types.h>11#include <linux/cpumask.h>12#include <linux/irqreturn.h>13 14#include "dpaa2-fd.h"15#include "dpaa2-global.h"16 17struct dpaa2_io;18struct dpaa2_io_store;19struct device;20 21/**22 * DOC: DPIO Service23 *24 * The DPIO service provides APIs for users to interact with the datapath25 * by enqueueing and dequeing frame descriptors.26 *27 * The following set of APIs can be used to enqueue and dequeue frames28 * as well as producing notification callbacks when data is available29 * for dequeue.30 */31 32#define DPAA2_IO_ANY_CPU -133 34/**35 * struct dpaa2_io_desc - The DPIO descriptor36 * @receives_notifications: Use notificaton mode. Non-zero if the DPIO37 * has a channel.38 * @has_8prio: Set to non-zero for channel with 8 priority WQs. Ignored39 * unless receives_notification is TRUE.40 * @cpu: The cpu index that at least interrupt handlers will41 * execute on.42 * @stash_affinity: The stash affinity for this portal favour 'cpu'43 * @regs_cena: The cache enabled regs.44 * @regs_cinh: The cache inhibited regs45 * @dpio_id: The dpio index46 * @qman_version: The qman version47 * @qman_clk: The qman clock frequency in Hz48 *49 * Describes the attributes and features of the DPIO object.50 */51struct dpaa2_io_desc {52 int receives_notifications;53 int has_8prio;54 int cpu;55 void *regs_cena;56 void __iomem *regs_cinh;57 int dpio_id;58 u32 qman_version;59 u32 qman_clk;60};61 62struct dpaa2_io *dpaa2_io_create(const struct dpaa2_io_desc *desc,63 struct device *dev);64 65void dpaa2_io_down(struct dpaa2_io *d);66 67irqreturn_t dpaa2_io_irq(struct dpaa2_io *obj);68 69struct dpaa2_io *dpaa2_io_service_select(int cpu);70 71/**72 * struct dpaa2_io_notification_ctx - The DPIO notification context structure73 * @cb: The callback to be invoked when the notification arrives74 * @is_cdan: Zero for FQDAN, non-zero for CDAN75 * @id: FQID or channel ID, needed for rearm76 * @desired_cpu: The cpu on which the notifications will show up. Use77 * DPAA2_IO_ANY_CPU if don't care78 * @dpio_id: The dpio index79 * @qman64: The 64-bit context value shows up in the FQDAN/CDAN.80 * @node: The list node81 * @dpio_private: The dpio object internal to dpio_service82 *83 * Used when a FQDAN/CDAN registration is made by drivers.84 */85struct dpaa2_io_notification_ctx {86 void (*cb)(struct dpaa2_io_notification_ctx *ctx);87 int is_cdan;88 u32 id;89 int desired_cpu;90 int dpio_id;91 u64 qman64;92 struct list_head node;93 void *dpio_private;94};95 96int dpaa2_io_get_cpu(struct dpaa2_io *d);97 98int dpaa2_io_service_register(struct dpaa2_io *service,99 struct dpaa2_io_notification_ctx *ctx,100 struct device *dev);101void dpaa2_io_service_deregister(struct dpaa2_io *service,102 struct dpaa2_io_notification_ctx *ctx,103 struct device *dev);104int dpaa2_io_service_rearm(struct dpaa2_io *service,105 struct dpaa2_io_notification_ctx *ctx);106 107int dpaa2_io_service_pull_fq(struct dpaa2_io *d, u32 fqid,108 struct dpaa2_io_store *s);109int dpaa2_io_service_pull_channel(struct dpaa2_io *d, u32 channelid,110 struct dpaa2_io_store *s);111 112int dpaa2_io_service_enqueue_fq(struct dpaa2_io *d, u32 fqid,113 const struct dpaa2_fd *fd);114int dpaa2_io_service_enqueue_multiple_fq(struct dpaa2_io *d, u32 fqid,115 const struct dpaa2_fd *fd, int number_of_frame);116int dpaa2_io_service_enqueue_multiple_desc_fq(struct dpaa2_io *d, u32 *fqid,117 const struct dpaa2_fd *fd, int number_of_frame);118int dpaa2_io_service_enqueue_qd(struct dpaa2_io *d, u32 qdid, u8 prio,119 u16 qdbin, const struct dpaa2_fd *fd);120int dpaa2_io_service_release(struct dpaa2_io *d, u16 bpid,121 const u64 *buffers, unsigned int num_buffers);122int dpaa2_io_service_acquire(struct dpaa2_io *d, u16 bpid,123 u64 *buffers, unsigned int num_buffers);124 125struct dpaa2_io_store *dpaa2_io_store_create(unsigned int max_frames,126 struct device *dev);127void dpaa2_io_store_destroy(struct dpaa2_io_store *s);128struct dpaa2_dq *dpaa2_io_store_next(struct dpaa2_io_store *s, int *is_last);129 130int dpaa2_io_query_fq_count(struct dpaa2_io *d, u32 fqid,131 u32 *fcnt, u32 *bcnt);132int dpaa2_io_query_bp_count(struct dpaa2_io *d, u16 bpid,133 u32 *num);134 135int dpaa2_io_set_irq_coalescing(struct dpaa2_io *d, u32 irq_holdoff);136void dpaa2_io_get_irq_coalescing(struct dpaa2_io *d, u32 *irq_holdoff);137void dpaa2_io_set_adaptive_coalescing(struct dpaa2_io *d,138 int use_adaptive_rx_coalesce);139int dpaa2_io_get_adaptive_coalescing(struct dpaa2_io *d);140void dpaa2_io_update_net_dim(struct dpaa2_io *d, __u64 frames, __u64 bytes);141#endif /* __FSL_DPAA2_IO_H */142