Merge branch 'topic/ioat' into for-linus
This commit is contained in:
Коммит
f6cc35eefe
|
@ -0,0 +1,30 @@
|
|||
What: sys/devices/pciXXXX:XX/0000:XX:XX.X/dma/dma<n>chan<n>/quickdata/cap
|
||||
Date: December 3, 2009
|
||||
KernelVersion: 2.6.32
|
||||
Contact: dmaengine@vger.kernel.org
|
||||
Description: Capabilities the DMA supports.Currently there are DMA_PQ, DMA_PQ_VAL,
|
||||
DMA_XOR,DMA_XOR_VAL,DMA_INTERRUPT.
|
||||
|
||||
What: sys/devices/pciXXXX:XX/0000:XX:XX.X/dma/dma<n>chan<n>/quickdata/ring_active
|
||||
Date: December 3, 2009
|
||||
KernelVersion: 2.6.32
|
||||
Contact: dmaengine@vger.kernel.org
|
||||
Description: The number of descriptors active in the ring.
|
||||
|
||||
What: sys/devices/pciXXXX:XX/0000:XX:XX.X/dma/dma<n>chan<n>/quickdata/ring_size
|
||||
Date: December 3, 2009
|
||||
KernelVersion: 2.6.32
|
||||
Contact: dmaengine@vger.kernel.org
|
||||
Description: Descriptor ring size, total number of descriptors available.
|
||||
|
||||
What: sys/devices/pciXXXX:XX/0000:XX:XX.X/dma/dma<n>chan<n>/quickdata/version
|
||||
Date: December 3, 2009
|
||||
KernelVersion: 2.6.32
|
||||
Contact: dmaengine@vger.kernel.org
|
||||
Description: Version of ioatdma device.
|
||||
|
||||
What: sys/devices/pciXXXX:XX/0000:XX:XX.X/dma/dma<n>chan<n>/quickdata/intr_coalesce
|
||||
Date: August 8, 2017
|
||||
KernelVersion: 4.14
|
||||
Contact: dmaengine@vger.kernel.org
|
||||
Description: Tune-able interrupt delay value per channel basis.
|
|
@ -644,9 +644,13 @@ static void __cleanup(struct ioatdma_chan *ioat_chan, dma_addr_t phys_complete)
|
|||
mod_timer(&ioat_chan->timer, jiffies + IDLE_TIMEOUT);
|
||||
}
|
||||
|
||||
/* 5 microsecond delay per pending descriptor */
|
||||
writew(min((5 * (active - i)), IOAT_INTRDELAY_MASK),
|
||||
ioat_chan->ioat_dma->reg_base + IOAT_INTRDELAY_OFFSET);
|
||||
/* microsecond delay by sysfs variable per pending descriptor */
|
||||
if (ioat_chan->intr_coalesce != ioat_chan->prev_intr_coalesce) {
|
||||
writew(min((ioat_chan->intr_coalesce * (active - i)),
|
||||
IOAT_INTRDELAY_MASK),
|
||||
ioat_chan->ioat_dma->reg_base + IOAT_INTRDELAY_OFFSET);
|
||||
ioat_chan->prev_intr_coalesce = ioat_chan->intr_coalesce;
|
||||
}
|
||||
}
|
||||
|
||||
static void ioat_cleanup(struct ioatdma_chan *ioat_chan)
|
||||
|
|
|
@ -142,11 +142,14 @@ struct ioatdma_chan {
|
|||
spinlock_t prep_lock;
|
||||
struct ioat_descs descs[2];
|
||||
int desc_chunks;
|
||||
int intr_coalesce;
|
||||
int prev_intr_coalesce;
|
||||
};
|
||||
|
||||
struct ioat_sysfs_entry {
|
||||
struct attribute attr;
|
||||
ssize_t (*show)(struct dma_chan *, char *);
|
||||
ssize_t (*store)(struct dma_chan *, const char *, size_t);
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
@ -39,7 +39,7 @@ MODULE_VERSION(IOAT_DMA_VERSION);
|
|||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_AUTHOR("Intel Corporation");
|
||||
|
||||
static struct pci_device_id ioat_pci_tbl[] = {
|
||||
static const struct pci_device_id ioat_pci_tbl[] = {
|
||||
/* I/OAT v3 platforms */
|
||||
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_IOAT_TBG0) },
|
||||
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_IOAT_TBG1) },
|
||||
|
|
|
@ -64,8 +64,24 @@ ioat_attr_show(struct kobject *kobj, struct attribute *attr, char *page)
|
|||
return entry->show(&ioat_chan->dma_chan, page);
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
ioat_attr_store(struct kobject *kobj, struct attribute *attr,
|
||||
const char *page, size_t count)
|
||||
{
|
||||
struct ioat_sysfs_entry *entry;
|
||||
struct ioatdma_chan *ioat_chan;
|
||||
|
||||
entry = container_of(attr, struct ioat_sysfs_entry, attr);
|
||||
ioat_chan = container_of(kobj, struct ioatdma_chan, kobj);
|
||||
|
||||
if (!entry->store)
|
||||
return -EIO;
|
||||
return entry->store(&ioat_chan->dma_chan, page, count);
|
||||
}
|
||||
|
||||
const struct sysfs_ops ioat_sysfs_ops = {
|
||||
.show = ioat_attr_show,
|
||||
.store = ioat_attr_store,
|
||||
};
|
||||
|
||||
void ioat_kobject_add(struct ioatdma_device *ioat_dma, struct kobj_type *type)
|
||||
|
@ -121,11 +137,37 @@ static ssize_t ring_active_show(struct dma_chan *c, char *page)
|
|||
}
|
||||
static struct ioat_sysfs_entry ring_active_attr = __ATTR_RO(ring_active);
|
||||
|
||||
static ssize_t intr_coalesce_show(struct dma_chan *c, char *page)
|
||||
{
|
||||
struct ioatdma_chan *ioat_chan = to_ioat_chan(c);
|
||||
|
||||
return sprintf(page, "%d\n", ioat_chan->intr_coalesce);
|
||||
}
|
||||
|
||||
static ssize_t intr_coalesce_store(struct dma_chan *c, const char *page,
|
||||
size_t count)
|
||||
{
|
||||
int intr_coalesce = 0;
|
||||
struct ioatdma_chan *ioat_chan = to_ioat_chan(c);
|
||||
|
||||
if (sscanf(page, "%du", &intr_coalesce) != -1) {
|
||||
if ((intr_coalesce < 0) ||
|
||||
(intr_coalesce > IOAT_INTRDELAY_MASK))
|
||||
return -EINVAL;
|
||||
ioat_chan->intr_coalesce = intr_coalesce;
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static struct ioat_sysfs_entry intr_coalesce_attr = __ATTR_RW(intr_coalesce);
|
||||
|
||||
static struct attribute *ioat_attrs[] = {
|
||||
&ring_size_attr.attr,
|
||||
&ring_active_attr.attr,
|
||||
&ioat_cap_attr.attr,
|
||||
&ioat_version_attr.attr,
|
||||
&intr_coalesce_attr.attr,
|
||||
NULL,
|
||||
};
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче