freebsd-src/sys/dev/dpaa/qman.h
Warner Losh 95ee2897e9 sys: Remove $FreeBSD$: two-line .h pattern
Remove /^\s*\*\n \*\s+\$FreeBSD\$$\n/
2023-08-16 11:54:11 -06:00

245 lines
7.2 KiB
C

/*-
* Copyright (c) 2011-2012 Semihalf.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#ifndef _QMAN_H
#define _QMAN_H
#include <machine/vmparam.h>
#include <contrib/ncsw/inc/Peripherals/qm_ext.h>
/**
* @group QMan private defines/declarations
* @{
*/
/**
* Maximum number of frame queues in all QMans.
*/
#define QMAN_MAX_FQIDS 16
/**
* Pool channel common to all software portals.
* @note Value of 0 reflects the e_QM_FQ_CHANNEL_POOL1 from e_QmFQChannel
* type used in qman_fqr_create().
*/
#define QMAN_COMMON_POOL_CHANNEL 0
#define QMAN_FQID_BASE 1
#define QMAN_CCSR_SIZE 0x1000
/*
* Portal defines
*/
#define QMAN_CE_PA(base) (base)
#define QMAN_CI_PA(base) ((base) + 0x100000)
#define QMAN_PORTAL_CE_PA(base, n) \
(QMAN_CE_PA(base) + ((n) * QMAN_PORTAL_CE_SIZE))
#define QMAN_PORTAL_CI_PA(base, n) \
(QMAN_CI_PA(base) + ((n) * QMAN_PORTAL_CI_SIZE))
struct qman_softc {
device_t sc_dev; /* device handle */
int sc_rrid; /* register rid */
struct resource *sc_rres; /* register resource */
int sc_irid; /* interrupt rid */
struct resource *sc_ires; /* interrupt resource */
bool sc_regs_mapped[MAXCPU];
t_Handle sc_qh; /* QMAN handle */
t_Handle sc_qph[MAXCPU]; /* QMAN portal handles */
vm_paddr_t sc_qp_pa; /* QMAN portal PA */
int sc_fqr_cpu[QMAN_MAX_FQIDS];
};
/** @> */
/**
* @group QMan bus interface
* @{
*/
int qman_attach(device_t dev);
int qman_detach(device_t dev);
int qman_suspend(device_t dev);
int qman_resume(device_t dev);
int qman_shutdown(device_t dev);
/** @> */
/**
* @group QMan API
* @{
*/
/**
* Create Frame Queue Range.
*
* @param fqids_num Number of frame queues in the range.
*
* @param channel Dedicated channel serviced by this
* Frame Queue Range.
*
* @param wq Work Queue Number within the channel.
*
* @param force_fqid If TRUE, fore allocation of specific
* FQID. Notice that there can not be two
* frame queues with the same ID in the
* system.
*
* @param fqid_or_align FQID if @force_fqid == TRUE, alignment
* of FQIDs entries otherwise.
*
* @param init_parked If TRUE, FQ state is initialized to
* "parked" state on creation. Otherwise,
* to "scheduled" state.
*
* @param hold_active If TRUE, the FQ may be held in the
* portal in "held active" state in
* anticipation of more frames being
* dequeued from it after the head frame
* is removed from the FQ and the dequeue
* response is returned. If FALSE the
* "held_active" state of the FQ is not
* allowed. This affects only on queues
* destined to software portals. Refer to
* the 6.3.4.6 of DPAA Reference Manual.
*
* @param prefer_in_cache If TRUE, prefer this FQR to be in QMan
* internal cache memory for all states.
*
* @param congst_avoid_ena If TRUE, enable congestion avoidance
* mechanism.
*
* @param congst_group A handle to the congestion group. Only
* relevant when @congst_avoid_ena == TRUE.
*
* @param overhead_accounting_len For each frame add this number for CG
* calculation (may be negative), if 0 -
* disable feature.
*
* @param tail_drop_threshold If not 0 - enable tail drop on this
* FQR.
*
* @return A handle to newly created FQR object.
*/
t_Handle qman_fqr_create(uint32_t fqids_num, e_QmFQChannel channel, uint8_t wq,
bool force_fqid, uint32_t fqid_or_align, bool init_parked,
bool hold_active, bool prefer_in_cache, bool congst_avoid_ena,
t_Handle congst_group, int8_t overhead_accounting_len,
uint32_t tail_drop_threshold);
/**
* Free Frame Queue Range.
*
* @param fqr A handle to FQR to be freed.
* @return E_OK on success; error code otherwise.
*/
t_Error qman_fqr_free(t_Handle fqr);
/**
* Register the callback function.
* The callback function will be called when a frame comes from this FQR.
*
* @param fqr A handle to FQR.
* @param callback A pointer to the callback function.
* @param app A pointer to the user's data.
* @return E_OK on success; error code otherwise.
*/
t_Error qman_fqr_register_cb(t_Handle fqr, t_QmReceivedFrameCallback *callback,
t_Handle app);
/**
* Enqueue a frame on a given FQR.
*
* @param fqr A handle to FQR.
* @param fqid_off FQID offset wihin the FQR.
* @param frame A frame to be enqueued to the transmission.
* @return E_OK on success; error code otherwise.
*/
t_Error qman_fqr_enqueue(t_Handle fqr, uint32_t fqid_off, t_DpaaFD *frame);
/**
* Get one of the FQR counter's value.
*
* @param fqr A handle to FQR.
* @param fqid_off FQID offset within the FQR.
* @param counter The requested counter.
* @return Counter's current value.
*/
uint32_t qman_fqr_get_counter(t_Handle fqr, uint32_t fqid_off,
e_QmFqrCounters counter);
/**
* Pull frame from FQR.
*
* @param fqr A handle to FQR.
* @param fqid_off FQID offset within the FQR.
* @param frame The received frame.
* @return E_OK on success; error code otherwise.
*/
t_Error qman_fqr_pull_frame(t_Handle fqr, uint32_t fqid_off, t_DpaaFD *frame);
/**
* Get base FQID of the FQR.
* @param fqr A handle to FQR.
* @return Base FQID of the FQR.
*/
uint32_t qman_fqr_get_base_fqid(t_Handle fqr);
/**
* Poll frames from QMan.
* This polls frames from the current software portal.
*
* @param source Type of frames to be polled.
* @return E_OK on success; error otherwise.
*/
t_Error qman_poll(e_QmPortalPollSource source);
/**
* General received frame callback.
* This is called, when user did not register his own callback for a given
* frame queue range (fqr).
*/
e_RxStoreResponse qman_received_frame_callback(t_Handle app, t_Handle qm_fqr,
t_Handle qm_portal, uint32_t fqid_offset, t_DpaaFD *frame);
/**
* General rejected frame callback.
* This is called, when user did not register his own callback for a given
* frame queue range (fqr).
*/
e_RxStoreResponse qman_rejected_frame_callback(t_Handle app, t_Handle qm_fqr,
t_Handle qm_portal, uint32_t fqid_offset, t_DpaaFD *frame,
t_QmRejectedFrameInfo *qm_rejected_frame_info);
/** @} */
#endif /* QMAN_H */