2006-05-24 04:35:34 +04:00
/*
2007-11-15 03:59:51 +03:00
* Copyright ( c ) 2004 - 2007 Intel Corporation . All rights reserved .
2006-05-24 04:35:34 +04:00
*
* This program is free software ; you can redistribute it and / or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation ; either version 2 of the License , or ( at your option )
* any later version .
*
* This program is distributed in the hope that it will be useful , but WITHOUT
* ANY WARRANTY ; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE . See the GNU General Public License for
* more details .
*
* You should have received a copy of the GNU General Public License along with
* this program ; if not , write to the Free Software Foundation , Inc . , 59
* Temple Place - Suite 330 , Boston , MA 02111 - 1307 , USA .
*
* The full GNU General Public License is included in this distribution in the
* file called COPYING .
*/
# ifndef IOATDMA_H
# define IOATDMA_H
# include <linux/dmaengine.h>
# include "ioatdma_hw.h"
# include <linux/init.h>
# include <linux/dmapool.h>
# include <linux/cache.h>
2006-05-24 04:39:49 +04:00
# include <linux/pci_ids.h>
2008-07-23 04:30:57 +04:00
# include <net/tcp.h>
2006-05-24 04:35:34 +04:00
2008-07-23 04:30:57 +04:00
# define IOAT_DMA_VERSION "3.30"
2007-10-18 14:07:13 +04:00
2007-10-16 12:27:40 +04:00
enum ioat_interrupt {
none = 0 ,
msix_multi_vector = 1 ,
msix_single_vector = 2 ,
msi = 3 ,
intx = 4 ,
} ;
2006-05-24 04:35:34 +04:00
# define IOAT_LOW_COMPLETION_MASK 0xffffffc0
2007-11-15 03:59:51 +03:00
# define IOAT_DMA_DCA_ANY_CPU ~0
2008-07-22 21:07:33 +04:00
# define IOAT_WATCHDOG_PERIOD (2 * HZ)
2007-11-15 03:59:51 +03:00
2006-05-24 04:35:34 +04:00
/**
2007-10-16 12:27:39 +04:00
* struct ioatdma_device - internal representation of a IOAT device
2006-05-24 04:35:34 +04:00
* @ pdev : PCI - Express device
* @ reg_base : MMIO register space base address
* @ dma_pool : for allocating DMA descriptors
* @ common : embedded struct dma_device
2007-10-16 12:27:39 +04:00
* @ version : version of ioatdma device
2007-11-15 03:59:51 +03:00
* @ irq_mode : which style irq to use
* @ msix_entries : irq handlers
* @ idx : per channel data
2006-05-24 04:35:34 +04:00
*/
2007-10-16 12:27:39 +04:00
struct ioatdma_device {
2006-05-24 04:35:34 +04:00
struct pci_dev * pdev ;
2006-10-11 01:45:47 +04:00
void __iomem * reg_base ;
2006-05-24 04:35:34 +04:00
struct pci_pool * dma_pool ;
struct pci_pool * completion_pool ;
struct dma_device common ;
2007-10-16 12:27:39 +04:00
u8 version ;
2007-10-16 12:27:40 +04:00
enum ioat_interrupt irq_mode ;
2008-07-22 21:07:33 +04:00
struct delayed_work work ;
2007-10-16 12:27:40 +04:00
struct msix_entry msix_entries [ 4 ] ;
struct ioat_dma_chan * idx [ 4 ] ;
2006-05-24 04:35:34 +04:00
} ;
/**
* struct ioat_dma_chan - internal representation of a DMA channel
*/
struct ioat_dma_chan {
2006-10-11 01:45:47 +04:00
void __iomem * reg_base ;
2006-05-24 04:35:34 +04:00
dma_cookie_t completed_cookie ;
unsigned long last_completion ;
2008-07-22 21:07:33 +04:00
unsigned long last_completion_time ;
2006-05-24 04:35:34 +04:00
2007-12-18 03:20:08 +03:00
size_t xfercap ; /* XFERCAP register value expanded out */
2006-05-24 04:35:34 +04:00
spinlock_t cleanup_lock ;
spinlock_t desc_lock ;
struct list_head free_desc ;
struct list_head used_desc ;
2008-07-22 21:07:33 +04:00
unsigned long watchdog_completion ;
int watchdog_tcp_cookie ;
u32 watchdog_last_tcp_cookie ;
struct delayed_work work ;
2006-05-24 04:35:34 +04:00
int pending ;
2007-11-15 03:59:51 +03:00
int dmacount ;
int desccount ;
2006-05-24 04:35:34 +04:00
2007-10-16 12:27:39 +04:00
struct ioatdma_device * device ;
2006-05-24 04:35:34 +04:00
struct dma_chan common ;
dma_addr_t completion_addr ;
union {
u64 full ; /* HW completion writeback */
struct {
u32 low ;
u32 high ;
} ;
} * completion_virt ;
2008-07-22 21:07:33 +04:00
unsigned long last_compl_desc_addr_hw ;
2007-10-16 12:27:40 +04:00
struct tasklet_struct cleanup_task ;
2006-05-24 04:35:34 +04:00
} ;
/* wrapper around hardware descriptor format + additional software fields */
/**
* struct ioat_desc_sw - wrapper around hardware descriptor
* @ hw : hardware DMA descriptor
dmaengine: refactor dmaengine around dma_async_tx_descriptor
The current dmaengine interface defines mutliple routines per operation,
i.e. dma_async_memcpy_buf_to_buf, dma_async_memcpy_buf_to_page etc. Adding
more operation types (xor, crc, etc) to this model would result in an
unmanageable number of method permutations.
Are we really going to add a set of hooks for each DMA engine
whizbang feature?
- Jeff Garzik
The descriptor creation process is refactored using the new common
dma_async_tx_descriptor structure. Instead of per driver
do_<operation>_<dest>_to_<src> methods, drivers integrate
dma_async_tx_descriptor into their private software descriptor and then
define a 'prep' routine per operation. The prep routine allocates a
descriptor and ensures that the tx_set_src, tx_set_dest, tx_submit routines
are valid. Descriptor creation and submission becomes:
struct dma_device *dev;
struct dma_chan *chan;
struct dma_async_tx_descriptor *tx;
tx = dev->device_prep_dma_<operation>(chan, len, int_flag)
tx->tx_set_src(dma_addr_t, tx, index /* for multi-source ops */)
tx->tx_set_dest(dma_addr_t, tx, index)
tx->tx_submit(tx)
In addition to the refactoring, dma_async_tx_descriptor also lays the
groundwork for definining cross-channel-operation dependencies, and a
callback facility for asynchronous notification of operation completion.
Changelog:
* drop dma mapping methods, suggested by Chris Leech
* fix ioat_dma_dependency_added, also caught by Andrew Morton
* fix dma_sync_wait, change from Andrew Morton
* uninline large functions, change from Andrew Morton
* add tx->callback = NULL to dmaengine calls to interoperate with async_tx
calls
* hookup ioat_tx_submit
* convert channel capabilities to a 'cpumask_t like' bitmap
* removed DMA_TX_ARRAY_INIT, no longer needed
* checkpatch.pl fixes
* make set_src, set_dest, and tx_submit descriptor specific methods
* fixup git-ioat merge
* move group_list and phys to dma_async_tx_descriptor
Cc: Jeff Garzik <jeff@garzik.org>
Cc: Chris Leech <christopher.leech@intel.com>
Signed-off-by: Shannon Nelson <shannon.nelson@intel.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Acked-by: David S. Miller <davem@davemloft.net>
2007-01-02 21:10:43 +03:00
* @ node : this descriptor will either be on the free list ,
* or attached to a transaction list ( async_tx . tx_list )
* @ tx_cnt : number of descriptors required to complete the transaction
* @ async_tx : the generic software descriptor for all engines
2006-05-24 04:35:34 +04:00
*/
struct ioat_desc_sw {
struct ioat_dma_descriptor * hw ;
struct list_head node ;
dmaengine: refactor dmaengine around dma_async_tx_descriptor
The current dmaengine interface defines mutliple routines per operation,
i.e. dma_async_memcpy_buf_to_buf, dma_async_memcpy_buf_to_page etc. Adding
more operation types (xor, crc, etc) to this model would result in an
unmanageable number of method permutations.
Are we really going to add a set of hooks for each DMA engine
whizbang feature?
- Jeff Garzik
The descriptor creation process is refactored using the new common
dma_async_tx_descriptor structure. Instead of per driver
do_<operation>_<dest>_to_<src> methods, drivers integrate
dma_async_tx_descriptor into their private software descriptor and then
define a 'prep' routine per operation. The prep routine allocates a
descriptor and ensures that the tx_set_src, tx_set_dest, tx_submit routines
are valid. Descriptor creation and submission becomes:
struct dma_device *dev;
struct dma_chan *chan;
struct dma_async_tx_descriptor *tx;
tx = dev->device_prep_dma_<operation>(chan, len, int_flag)
tx->tx_set_src(dma_addr_t, tx, index /* for multi-source ops */)
tx->tx_set_dest(dma_addr_t, tx, index)
tx->tx_submit(tx)
In addition to the refactoring, dma_async_tx_descriptor also lays the
groundwork for definining cross-channel-operation dependencies, and a
callback facility for asynchronous notification of operation completion.
Changelog:
* drop dma mapping methods, suggested by Chris Leech
* fix ioat_dma_dependency_added, also caught by Andrew Morton
* fix dma_sync_wait, change from Andrew Morton
* uninline large functions, change from Andrew Morton
* add tx->callback = NULL to dmaengine calls to interoperate with async_tx
calls
* hookup ioat_tx_submit
* convert channel capabilities to a 'cpumask_t like' bitmap
* removed DMA_TX_ARRAY_INIT, no longer needed
* checkpatch.pl fixes
* make set_src, set_dest, and tx_submit descriptor specific methods
* fixup git-ioat merge
* move group_list and phys to dma_async_tx_descriptor
Cc: Jeff Garzik <jeff@garzik.org>
Cc: Chris Leech <christopher.leech@intel.com>
Signed-off-by: Shannon Nelson <shannon.nelson@intel.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Acked-by: David S. Miller <davem@davemloft.net>
2007-01-02 21:10:43 +03:00
int tx_cnt ;
2007-10-18 14:07:14 +04:00
size_t len ;
dma_addr_t src ;
dma_addr_t dst ;
dmaengine: refactor dmaengine around dma_async_tx_descriptor
The current dmaengine interface defines mutliple routines per operation,
i.e. dma_async_memcpy_buf_to_buf, dma_async_memcpy_buf_to_page etc. Adding
more operation types (xor, crc, etc) to this model would result in an
unmanageable number of method permutations.
Are we really going to add a set of hooks for each DMA engine
whizbang feature?
- Jeff Garzik
The descriptor creation process is refactored using the new common
dma_async_tx_descriptor structure. Instead of per driver
do_<operation>_<dest>_to_<src> methods, drivers integrate
dma_async_tx_descriptor into their private software descriptor and then
define a 'prep' routine per operation. The prep routine allocates a
descriptor and ensures that the tx_set_src, tx_set_dest, tx_submit routines
are valid. Descriptor creation and submission becomes:
struct dma_device *dev;
struct dma_chan *chan;
struct dma_async_tx_descriptor *tx;
tx = dev->device_prep_dma_<operation>(chan, len, int_flag)
tx->tx_set_src(dma_addr_t, tx, index /* for multi-source ops */)
tx->tx_set_dest(dma_addr_t, tx, index)
tx->tx_submit(tx)
In addition to the refactoring, dma_async_tx_descriptor also lays the
groundwork for definining cross-channel-operation dependencies, and a
callback facility for asynchronous notification of operation completion.
Changelog:
* drop dma mapping methods, suggested by Chris Leech
* fix ioat_dma_dependency_added, also caught by Andrew Morton
* fix dma_sync_wait, change from Andrew Morton
* uninline large functions, change from Andrew Morton
* add tx->callback = NULL to dmaengine calls to interoperate with async_tx
calls
* hookup ioat_tx_submit
* convert channel capabilities to a 'cpumask_t like' bitmap
* removed DMA_TX_ARRAY_INIT, no longer needed
* checkpatch.pl fixes
* make set_src, set_dest, and tx_submit descriptor specific methods
* fixup git-ioat merge
* move group_list and phys to dma_async_tx_descriptor
Cc: Jeff Garzik <jeff@garzik.org>
Cc: Chris Leech <christopher.leech@intel.com>
Signed-off-by: Shannon Nelson <shannon.nelson@intel.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Acked-by: David S. Miller <davem@davemloft.net>
2007-01-02 21:10:43 +03:00
struct dma_async_tx_descriptor async_tx ;
2006-05-24 04:35:34 +04:00
} ;
2008-07-23 04:30:57 +04:00
static inline void ioat_set_tcp_copy_break ( struct ioatdma_device * dev )
{
# ifdef CONFIG_NET_DMA
switch ( dev - > version ) {
case IOAT_VER_1_2 :
sysctl_tcp_dma_copybreak = 4096 ;
break ;
case IOAT_VER_2_0 :
sysctl_tcp_dma_copybreak = 2048 ;
break ;
2009-02-26 13:05:17 +03:00
case IOAT_VER_3_0 :
sysctl_tcp_dma_copybreak = 262144 ;
break ;
2008-07-23 04:30:57 +04:00
}
# endif
}
2007-10-16 12:27:39 +04:00
# if defined(CONFIG_INTEL_IOATDMA) || defined(CONFIG_INTEL_IOATDMA_MODULE)
struct ioatdma_device * ioat_dma_probe ( struct pci_dev * pdev ,
void __iomem * iobase ) ;
void ioat_dma_remove ( struct ioatdma_device * device ) ;
2007-11-15 03:59:51 +03:00
struct dca_provider * ioat_dca_init ( struct pci_dev * pdev , void __iomem * iobase ) ;
struct dca_provider * ioat2_dca_init ( struct pci_dev * pdev , void __iomem * iobase ) ;
2008-07-23 04:30:57 +04:00
struct dca_provider * ioat3_dca_init ( struct pci_dev * pdev , void __iomem * iobase ) ;
2007-10-16 12:27:39 +04:00
# else
# define ioat_dma_probe(pdev, iobase) NULL
# define ioat_dma_remove(device) do { } while (0)
2007-10-16 12:27:42 +04:00
# define ioat_dca_init(pdev, iobase) NULL
2007-11-15 03:59:51 +03:00
# define ioat2_dca_init(pdev, iobase) NULL
2008-07-23 04:30:57 +04:00
# define ioat3_dca_init(pdev, iobase) NULL
2007-10-16 12:27:39 +04:00
# endif
2006-05-24 04:35:34 +04:00
# endif /* IOATDMA_H */