d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/*******************************************************************************
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * CDDL HEADER START
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * The contents of this file are subject to the terms of the
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Common Development and Distribution License (the "License").
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * You may not use this file except in compliance with the License.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * or http://www.opensolaris.org/os/licensing.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * See the License for the specific language governing permissions
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * and limitations under the License.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * When distributing Covered Code, include this CDDL HEADER in each
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * If applicable, add the following below this CDDL HEADER, with the
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * fields enclosed by brackets "[]" replaced with your own identifying
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * information: Portions Copyright [yyyy] [name of copyright owner]
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * CDDL HEADER END
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Copyright 2014 QLogic Corporation
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * The contents of this file are subject to the terms of the
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * QLogic End User License (the "License").
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * You may not use this file except in compliance with the License.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * You can obtain a copy of the License at
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * http://www.qlogic.com/Resources/Documents/DriverDownloadHelp/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * QLogic_End_User_Software_License.txt
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * See the License for the specific language governing permissions
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * and limitations under the License.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Module Description:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * History:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * 02/05/07 Alon Elhanani Inception.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ******************************************************************************/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**@file hw_dmae.h
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * A module encapsulating the DMAE HW block.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Use cases for this module include:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * - 'Single-block' DMA operations
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Single-block DMA operations are composed of a single HW
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * command that contains a GRC/PCI source, a GRC/PCI
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * destination and length. Single-block DMA operations are
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * locked from before writing the command to the HW registers,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * until after the DMAE writes the completion word to the
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * appropriate location in host memory. Single-block DMA
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * operations use a single DMAE channel.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * - SGL DMA operations
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * SGL DMA operations use two DMAE channels - one called a
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * 'loader' and one called an 'executer'. The operation is
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * composed of a single HW command called a 'loader' that
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * uses the loader channel, and multiple HW commands called
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * 'executers' that use the executer channel. The loader
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * command is configured so that whenever it is executed,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * it loads and executes the next pending executer command.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Executer commands are configured so that whenever they
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * complete they execute the loader command, except the last
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * executer command that simply writes the completion word
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * to the appropriate location in host memory.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * SGL DMA operations lock both channels from the time the
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * loader first executes, until the last executer completes.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * - SGL DMA operations in asynchronous mode (a.k.a post/poll)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * SGL DMA operations in asynchronous mode only lock the
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * context for the time required to load the loader command
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * to the HW registers (called the 'post' stage). Afterwords
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * they return immediately and unlock both channels. Then a
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * DMAE user may query the context's state to check if the
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * last executer command has already finished (the 'poll' stage).
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * The context is locked only for the duration of a single
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * query at a time. Note that a DMAE user may not use the
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * context until the query returns with a code that indicates
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * the context is available.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#ifndef _LM_DMAE_H
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define _LM_DMAE_H
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#include "mm.h"
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi// defines
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define DMAE_SGL_MAX_COMMANDS 5 // max number of commands in a DMAE SGL (just as a limit - can be defined other number)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define DMAE_GO_VALUE 0x1 // DMAE spec
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define DMAE_SGL_COMPLETION_VAL 0xD0AE // local completion word value (for SGL)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define DMAE_COMPLETION_VAL 0xD1AE // local completion word value with edianity mode 2 (for regular command)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define DMAE_COMPLETION_VAL_SWAPPED 0xAED10000 // local completion word value with edianity mode 3
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define DMAE_CMD_SIZE 14 // size of DMAE command structure
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define DMAE_MAX_RW_SIZE_E1 0x0400 // maximun size (in DW) of read/write commands (HW limit) - for (chip id<=5710)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi// up to 0xffff actually limit is 64KB-1 so 0x2000 dwords is 32KB
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define DMAE_MAX_RW_SIZE_NEW 0x2000 // maximun size of read/write commands (HW limit) - for E1.5 and above (chip id>5710)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define DMAE_MAX_READ_SIZE 0x80 // due to a HW issue in E1, E1.5 A0, pci to pci and grc to pci operations are limited to 128 DWORDS
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi// max value for static allocations
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define DMAE_MAX_RW_SIZE_STATIC max(DMAE_MAX_RW_SIZE_E1,DMAE_MAX_RW_SIZE_NEW)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define DMAE_MAX_RW_SIZE(pdev) (CHIP_IS_E1(pdev) ? DMAE_MAX_RW_SIZE_E1 : DMAE_MAX_RW_SIZE_NEW)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define DMAE_STATS_GET_PORT_CMD_IDX(port_num,cmd_idx) DMAE_STATS_PORT_##port_num##_CMD_IDX_##cmd_idx
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define DMAE_STATS_PORT_0_CMD_IDX_0 DMAE_CMD_DRV_0
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define DMAE_STATS_PORT_0_CMD_IDX_1 DMAE_CMD_DRV_1
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define DMAE_STATS_PORT_1_CMD_IDX_0 DMAE_CMD_DRV_2
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define DMAE_STATS_PORT_1_CMD_IDX_1 DMAE_CMD_DRV_3
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define DMAE_WB_ACCESS_FUNCTION_CMD(_idx) DMAE_CMD_DRV_4+(_idx)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define DMAE_COPY_PCI_PCI_PORT_0_CMD DMAE_CMD_DRV_12
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define DMAE_COPY_PCI_PCI_PORT_1_CMD DMAE_CMD_DRV_13
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define LM_DMAE_INTERMEDIATE_BUFFER_SIZE DMAE_MAX_RW_SIZE_NEW
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define LM_DMAE_NO_HWLOCK 0
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchitypedef enum _lm_dmae_protected_resource_t
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_PROTECTED_RESOURCE_DMAE_STATS = 0,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_PROTECTED_RESOURCE_DMAE_TOE,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_PROTECTED_RESOURCE_DMAE_DEFAULT,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_MAX_PROTECTED_RESOURCE
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}lm_dmae_protected_resource_t;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchitypedef enum _lm_dmae_type_t
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_DMAE_STATS,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_DMAE_TOE,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_DMAE_DEFAULT,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_DMAE_MAX_TYPE
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}lm_dmae_type_t;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchitypedef enum _lm_dmae_address_type_t
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_DMAE_ADDRESS_HOST_VIRT,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_DMAE_ADDRESS_HOST_PHYS,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_DMAE_ADDRESS_GRC
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}lm_dmae_address_type_t;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchitypedef enum _lm_dmae_mode_t
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_DMAE_MODE_SGL,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_DMAE_MODE_SINGLE_BLOCK
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}lm_dmae_mode_t;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchitypedef enum _lm_dmae_locking_policy_type_t
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_DMAE_LOCKING_POLICY_TYPE_NONE,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_DMAE_LOCKING_POLICY_TYPE_PER_PF,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_DMAE_LOCKING_POLICY_TYPE_INTER_PF
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}lm_dmae_locking_policy_type_t;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * An encapsulation of the synchronization method for resource.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * The type of locking policy depends on the synchronization
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * requirements for the protected resource (in this design's
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * case - the DMAE context)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * - No synchronization
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Use this type of policy when there is no contention on the
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * protected resource. No locking will take place.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * - per-PF synchronization
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * synchronizes access to the protected resource among users in
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * the same PF, but not between multiple PFs. Use this type of
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * policy when the protected resource is per-PF.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * - inter-PF synchronization
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * synchronizes access to the protected resource among multiple
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * users that may be running in the contexts of multiple PFs.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Use this type of policy when the protected resource is
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * shared among multiple PFs.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @ingroup LockingPolicy
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchitypedef struct _lm_dmae_locking_policy_t
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_spin_lock_t spinlock; /**< an opaque context for the spinlock that's used by this locking policy*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t hwlock; /**< the HW lock used by this locking policy*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}lm_dmae_locking_policy_t;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * A source/target address for a DMA operation.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @ingroup DMAE_Address
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchitypedef struct _lm_dmae_address_t
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /**The offset of this address (either a virtual address, a
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi physical address or a GRC offset) */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi union {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t grc_offset;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi void* host_virt_address;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_address_t host_phys_address;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } u;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /**The type of this address*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_dmae_address_type_t type;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}lm_dmae_address_t;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @ingroup DMAE_Operation
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchitypedef struct _lm_dmae_block_t
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_dmae_address_t source;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_dmae_address_t dest;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u16_t length;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}lm_dmae_block_t;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * An aggregation of one or more DMAE channels that are used by
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * the driver for the same function with the same configuration.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * A context may be a non-SGL context (in which case it is
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * associated with a single DMAE channel) or an SGL context (in
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * which case it is associated with two DMAE channels). Every
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * context may have one current operation.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @ingroup DMAE_Context
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchitypedef struct _lm_dmae_context_t
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /**The type of the context (SGL or single-block) */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_dmae_mode_t mode;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /** - single-block context: the index of the DMAE channel for
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * this context
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * - SGL context: the index of the loader DMAE channel for this
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * context*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t main_channel;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /**SGL context: the index of the executer DMAE channel for this
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * context.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * This field has no meaning for single-block contexts */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t executer_channel;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t change_endianity;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t next_command_id;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_dmae_locking_policy_t* locking_policy;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /**This physical address of the field completion_word */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_address_t completion_word_paddr;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /**The memory location where the DMAE writes the completion
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * value when an operation is finished on this context.*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi volatile u32_t completion_word;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /**The value that the DMAE writes to completion_word when an
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * operation is finished on this context. Endianess note: The
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * completion value that's written as part of the command is
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * always the same, but the value that's later written to
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * memory depends on the endianness mode of the command, so
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * this value represents the value that's written by the DMAE
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * and not the value that's used by the VBD. */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t completion_value;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /**This physical address of the beginnning of
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * intermediate_buffer*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_address_t intermediate_buffer_paddr;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /**An intermediate buffer for DMAE operations that use virtual
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * addresses - data is DMA'd to/from this buffer and then
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * memcpy'd to/from the virtual address*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t intermediate_buffer[LM_DMAE_INTERMEDIATE_BUFFER_SIZE];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}lm_dmae_context_t;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * A single logical DMAE transfer, which may be either a
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * single-block transfer (in which case it has a single source
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * and a single target) or an SGL transfer (in which case it is
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * composed of multiple SGEs, each having a single source and a
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * single target). An SGL operation may be synchronous or
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * asynchronous - executing a synchronous DMAE operation results
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * in a wait until the operation completes, while an
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * asynchronous operation may be posted to the hardware without
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * waiting for its completion.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @ingroup DMAE_Operation
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchitypedef struct _lm_dmae_operation_t
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /**The type of this operation (SGL or single-block)*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_dmae_mode_t mode;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /**The context of this operation.*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_dmae_context_t* context;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**TRUE if the source is a block of length DMAE_MAX_RW_SIZE_E1 /
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * DMAE_MAX_RW_SIZE_NEW and the destination is larger. In this
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * case the source block will be duplicated as many times as
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * required to fill the destination block.*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t b_replicate_source;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t le32_swap;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /**SGL: TRUE if this operation is synchronous. This field has
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * no meaning for single-block operations. */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t b_sync;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t command_id;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /**SGL: The loader command for this operation
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *SINGLE_BLOCK: The command for this operation*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct dmae_cmd main_cmd;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /**The next available entry in blocks[] and executer_cmdp[] */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t next_free_block;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /**The block/blocks of this operation*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_dmae_block_t blocks[DMAE_SGL_MAX_COMMANDS];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /**SGL: The physical address of the beginning of executer_cmd.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * This field has no meaning for single-block operations. */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_address_t executer_paddr;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /**SGL: The executer HSI commands for this operation. This
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * field has no meaning for single-block operations. */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct dmae_cmd executer_cmd[DMAE_SGL_MAX_COMMANDS]; //these must be consecutive, so they can't be a part of the blocks[] array.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}lm_dmae_operation_t;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchitypedef struct _lm_dmae_context_info_t
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_dmae_context_t* context;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_dmae_locking_policy_t locking_policy;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}lm_dmae_context_info_t ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchitypedef struct _lm_dmae_info_t
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_dmae_context_info_t ctx_arr[LM_DMAE_MAX_TYPE];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}lm_dmae_info_t;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi//------------------ Locking Policy ------------------//
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**lm_dmae_locking_policy_create
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Create a locking policy
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param resource The ID of the protected resource. This ID is
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * used to determine which synchronization
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * objects will be used by the policy.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param type the type of this locking policy
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param policy the policy to initialize.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @return lm_status_t LM_STATUS_SUCCESS on success, some other
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * failure value on failure.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_dmae_locking_policy_create( struct _lm_device_t* pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN const u32_t resource,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN const lm_dmae_locking_policy_type_t type,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi OUT lm_dmae_locking_policy_t* policy);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**lm_dmae_locking_policy_lock
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Use a locking policy to lock a resource, acquiring whatever
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * spinlock or hardware lock required.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param locking_policy the policy to use
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @return lm_status_t LM_STATUS_SUCCESS on success, some other
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * failure code on failure.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#ifdef _VBD_
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi__drv_maxIRQL(DISPATCH_LEVEL)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi__drv_at(locking_policy->spinlock.irql, __drv_savesIRQL)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi__drv_setsIRQL(DISPATCH_LEVEL)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_dmae_locking_policy_lock(struct _lm_device_t* pdev, lm_dmae_locking_policy_t* locking_policy);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**lm_dmae_locking_policy_unlock
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Use a locking policy to unlock a resource, releasing
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * whatever spinlock or hardware lock required.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param locking_policy the policy to use
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @return lm_status_t LM_STATUS_SUCCESS on success, some other
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * failure code on failure
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#ifdef _VBD_
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#if defined(NTDDI_WIN8)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi_IRQL_requires_(DISPATCH_LEVEL)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi__drv_at(locking_policy->spinlock.irql, __drv_restoresIRQL )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_dmae_locking_policy_unlock(struct _lm_device_t* pdev, lm_dmae_locking_policy_t* locking_policy);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi//------------------ DMAE Context ------------------//
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**lm_dmae_context_create
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Create a non-SGL DMA context, using the given policy for
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * synchronization.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param channel_idx the DMAE channel index that is used by
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * this context
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param locking_policy the synchronization policy used by this
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * context
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param change_endianity
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @return lm_dmae_context_t* a single-block DMAE context
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * configured according to the supplied
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * parameters.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_dmae_context_t* lm_dmae_context_create( struct _lm_device_t* pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN const u8_t channel_idx,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_dmae_locking_policy_t* locking_policy,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN const u8_t change_endianity);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**lm_dmae_context_create_sgl
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Create an SGL DMA context, using the given policy for
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * synchronization.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param loader_channel_idx the 'loader' DMAE channel index
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * that is used by this context
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param executer_channel_idx the 'executer' DMAE channel index
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * that is used by this context
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param locking_policy the synchronization policy used by this
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * context
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param change_endianity
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @return lm_status_t an SGL DMAE context configured according
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * to the supplied parameters.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_dmae_context_t* lm_dmae_context_create_sgl( struct _lm_device_t* pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN const u8_t loader_channel_idx,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN const u8_t executer_channel_idx,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_dmae_locking_policy_t* locking_policy,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN const u8_t change_endianity);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**lm_dmae_context_reset
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Bring a DMAE context to a known-good state. This function
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * must be used on an acquired context. It should be used if for
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * some reason the context is left in an invalid state (e.g an
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * error occured during a DMAE transaction using this context).
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param context the context to reset.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @return lm_status LM_STATUS_SUCCESS on success, some other
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * failure code on failure.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_dmae_context_reset(lm_dmae_context_t *context);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**lm_dmae_context_acquire
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Acquire the context, so that multiple DMAE operations may be
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * executed on it without locking the context once for every
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * operation. Only after calling this function can
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * lm_dmae_context_execute_unsafe be used.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param context the context to acquire
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @return lm_status_t LM_STATUS_SUCCESS on success, some other
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * failure value on failure
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#ifdef _VBD_
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi__drv_maxIRQL(DISPATCH_LEVEL)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi__drv_at(context->locking_policy->spinlock.irql, __drv_savesIRQL)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi__drv_setsIRQL(DISPATCH_LEVEL)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_dmae_context_acquire(struct _lm_device_t* pdev, lm_dmae_context_t *context);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**lm_dmae_context_release
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Release a context that was acquired with
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * lm_dmae_context_release. After calling this function,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * lm_dmae_context_execute_unsafe may not be used on the
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * context.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param context the context to release
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @return lm_status_t LM_STATUS_SUCCESS on success, some other
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * failure value on failure
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#ifdef _VBD_
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#if defined(NTDDI_WIN8)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi_IRQL_requires_(DISPATCH_LEVEL)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi__drv_at(context->locking_policy->spinlock.irql, __drv_restoresIRQL )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_dmae_context_release(struct _lm_device_t* pdev, lm_dmae_context_t *context);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**lm_dmae_context_execute
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Execute a command in a context, using the context's locking
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * policy
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param context the context to use
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param operation the operation to execute
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @return lm_status_t LM_STATUS_SUCCESS on success,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * LM_STATUS_PENDING if executing an asynchronous
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * operation, LM_STATUS_BUSY if another asyncronous
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * operation is in progress or some other failure code
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * on failure.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_dmae_context_execute(struct _lm_device_t* pdev, lm_dmae_context_t *context, lm_dmae_operation_t *operation);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**lm_dmae_context_execute_unsafe
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Execute a command in a context, without locking. This
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * function must be called between calls to
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * lm_dmae_context_acquire and lm_dmae_context_release.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param context the context to use
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param operation the operation to execute
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @return lm_status_t LM_STATUS_SUCCESS on success,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * LM_STATUS_PENDING if executing an asynchronous
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * operation, LM_STATUS_BUSY if another asyncronous
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * operation is in progress or some other failure code
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * on failure.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_dmae_context_execute_unsafe(struct _lm_device_t* pdev, lm_dmae_context_t *context, lm_dmae_operation_t *operation);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi//------------------ DMAE Operation ------------------//
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**lm_dmae_operation_create
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Create a single-block DMAE operation and the DMAE command
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * that it uses.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param source the source for this DMAE operation
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param dest the destination for this DMAE operation
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param length the length of the block to transfer
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param replicate_source TRUE if the source is a block of
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * length DMAE_MAX_RW_SIZE_E1/DMAE_MAX_RW_SIZE_NEW
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * and the destination is larger. In
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * this case the source block will be
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * duplicated as many times as
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * required to fill the destination
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * block.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param le32_swap should byte-swapping occur before executing
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * the operation.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param context the DMAE context for this operation
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param operation the operation to initialize. If this function
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * returns LM_STATUS_SUCCESS, the operation
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * pointed to by this parameter is initialized
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * to a single-block DMAE operation configured
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * according to the supplied parameters.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @return lm_status_t LM_STATUS_SUCCESS on success, some other
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * failure value on failure.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_dmae_operation_create( struct _lm_device_t* pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN const lm_dmae_address_t source,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN const lm_dmae_address_t dest,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN const u16_t length,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN const u8_t replicate_source,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN const u8_t le32_swap,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN lm_dmae_context_t* context,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi OUT lm_dmae_operation_t* operation);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**lm_dmae_operation_create_sgl
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Create an SGL DMAE operation and the DMAE commands that it
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * uses.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param b_sync TRUE if this operation is synchronous, FALSE
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * otherwise.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param context the DMAE context for this operation
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @return lm_dmae_operation_t* An empty SGL DMAE operation
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * based on the supplied parameters. Use
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * lm_dmae_operation_add_sge to add SGEs to this
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * operation. On failure the function returns NULL.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_dmae_operation_t* lm_dmae_operation_create_sgl( struct _lm_device_t* pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN const u8_t b_sync,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN lm_dmae_context_t* context);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**lm_dmae_operation_add_sge
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Add an SGE to an SGL operation.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param operation the operation to add an SGE to.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param source the source for this SGE
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param dest the destination for this SGE
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param length the length of the block to transfer
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @return lm_status_t LM_STATUS_SUCCESS on success,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * LM_STATUS_INVALID_PARAMETER if the supplied operation
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * is not an SGL operation, some other failure code on
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * failure.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_dmae_operation_add_sge( struct _lm_device_t* pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_dmae_operation_t* operation,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN const lm_dmae_address_t source,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN const lm_dmae_address_t dest,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN const u16_t length);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**lm_dmae_operation_clear_all_sges
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Remove all SGEs from an SGL DMAE command.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param operation the operation to clear
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid lm_dmae_operation_clear_all_sges(lm_dmae_operation_t* operation);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**lm_dmae_operation_is_complete
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * check if an operation has finished
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param operation the operation to check
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @return u8_t TRUE if the given operation is complete
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiu8_t lm_dmae_operation_is_complete(IN lm_dmae_operation_t* operation);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi//------------------ DMAE Address ------------------//
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**lm_dmae_address_native_offset
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Get a u64_t representation of the address's value which can
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * be used as a source/destination address by DMAE hardware (i.e
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * byte offset for host memory address, DWORD offset for GRC
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * offsets)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param address the address to use
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @return u64_t see description
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiu64_t lm_dmae_address_native_offset(IN const lm_dmae_address_t* address);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**lm_dmae_address
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * create a DMAE address
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param offset the offset of the address (either
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * physical/virtual address or GRC offset)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param type the type of the address
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @return lm_dmae_address_t a DMAE address initialized
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * according to the supplied parameters
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_dmae_address_t lm_dmae_address(IN const u64_t offset, IN const lm_dmae_address_type_t type);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi//------------------ DMAE users ------------------//
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**lm_dmae_get
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Return the context info for a given DMAE user.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param pdev the device to use
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param type the dmae user
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @return lm_dmae_context_info_t* the context info for the given user, or NULL on error.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_dmae_context_info_t* lm_dmae_get(struct _lm_device_t* pdev, IN const lm_dmae_type_t type);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**lm_dmae_reg_wr
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Write a block of data from host memory (given as a virtual
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * address) to GRC.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param pdev the device to use
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param context the DMAE context to use
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param source_vaddr the beginning of the source memory block
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param dest_offset the GRC offset of the destination block
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param length the length (in DWORDS) of the block
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param b_replicate_source TRUE if the source is a block of
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * length
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * DMAE_MAX_RW_SIZE_E1/DMAE_MAX_RW_SIZE_NEW
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * and the destination is larger. In
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * this case the source block will be
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * duplicated as many times as
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * required to fill the destination
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * block.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param le32_swap if TRUE, change all DWORDS in the source
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * block to little-endian representation before
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * executing the operation.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @return lm_status_t LM_STATUS_SUCCESS on success,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * LM_STATUS_TIMEOUT if the operation did not finish in
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * reasonable time, some other failure value on failure.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_dmae_reg_wr(struct _lm_device_t* pdev, lm_dmae_context_t* context, void* source_vaddr, u32_t dest_offset, u16_t length, u8_t b_replicate_source, u8_t le32_swap);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**lm_dmae_reg_wr_phys
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Write a block of data from host memory (given as a physical
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * address) to GRC.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param pdev the device to use
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param context the DMAE context to use
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param source_paddr the beginning of the source memory block
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param dest_offset the GRC offset of the destination block
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param length the length (in DWORDS) of the block
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @return lm_status_t LM_STATUS_SUCCESS on success,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * LM_STATUS_TIMEOUT if the operation did not finish in
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * reasonable time, some other failure value on failure.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_dmae_reg_wr_phys(struct _lm_device_t* pdev, lm_dmae_context_t* context, lm_address_t source_paddr, u32_t dest_offset, u16_t length);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**lm_dmae_reg_rd
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Read a block from GRC to host memory(given as a virtual
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * address).
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param pdev the device to use
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param context the DMAE context to use
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param source_offset the GRC offset of the source block
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param dest_vaddr the beginning of the destination memory
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * block
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param length the length (in DWORDS) of the block
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param le32_swap if TRUE, change all DWORDS in data to
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * little-endian after it's read from GRC.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @return lm_status_t LM_STATUS_SUCCESS on success,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * LM_STATUS_TIMEOUT if the operation did not finish in
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * reasonable time, some other failure value on failure.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_dmae_reg_rd(struct _lm_device_t* pdev, lm_dmae_context_t* context, u32_t source_offset, void* dest_vaddr, u16_t length, u8_t le32_swap);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**lm_dmae_copy_phys_buffer_unsafe
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Copy a block from host memory to host memory, both addresses
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * given as physical addresses.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param pdev the device to use
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param context the DMAE context to use
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param source_paddr the beginning of the source memory block
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param dest_paddr the beginning of the destination memory
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * block
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param length the length (in DWORDS) of the block
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @return lm_status_t LM_STATUS_SUCCESS on success,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * LM_STATUS_TIMEOUT if the operation did not finish in
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * reasonable time, some other failure value on failure.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_dmae_copy_phys_buffer_unsafe(struct _lm_device_t* pdev, lm_dmae_context_t* context, lm_address_t source_paddr, lm_address_t dest_paddr, u16_t length);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif// _LM_DMAE_H