Commit f6cc35ee authored by Vinod Koul's avatar Vinod Koul

Merge branch 'topic/ioat' into for-linus

parents 07e24b85 268e2519
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) ...@@ -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); mod_timer(&ioat_chan->timer, jiffies + IDLE_TIMEOUT);
} }
/* 5 microsecond delay per pending descriptor */ /* microsecond delay by sysfs variable per pending descriptor */
writew(min((5 * (active - i)), IOAT_INTRDELAY_MASK), if (ioat_chan->intr_coalesce != ioat_chan->prev_intr_coalesce) {
ioat_chan->ioat_dma->reg_base + IOAT_INTRDELAY_OFFSET); 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) static void ioat_cleanup(struct ioatdma_chan *ioat_chan)
......
...@@ -142,11 +142,14 @@ struct ioatdma_chan { ...@@ -142,11 +142,14 @@ struct ioatdma_chan {
spinlock_t prep_lock; spinlock_t prep_lock;
struct ioat_descs descs[2]; struct ioat_descs descs[2];
int desc_chunks; int desc_chunks;
int intr_coalesce;
int prev_intr_coalesce;
}; };
struct ioat_sysfs_entry { struct ioat_sysfs_entry {
struct attribute attr; struct attribute attr;
ssize_t (*show)(struct dma_chan *, char *); 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); ...@@ -39,7 +39,7 @@ MODULE_VERSION(IOAT_DMA_VERSION);
MODULE_LICENSE("Dual BSD/GPL"); MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("Intel Corporation"); 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 */ /* I/OAT v3 platforms */
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_IOAT_TBG0) }, { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_IOAT_TBG0) },
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_IOAT_TBG1) }, { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_IOAT_TBG1) },
......
...@@ -64,8 +64,24 @@ ioat_attr_show(struct kobject *kobj, struct attribute *attr, char *page) ...@@ -64,8 +64,24 @@ ioat_attr_show(struct kobject *kobj, struct attribute *attr, char *page)
return entry->show(&ioat_chan->dma_chan, 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 = { const struct sysfs_ops ioat_sysfs_ops = {
.show = ioat_attr_show, .show = ioat_attr_show,
.store = ioat_attr_store,
}; };
void ioat_kobject_add(struct ioatdma_device *ioat_dma, struct kobj_type *type) 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) ...@@ -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 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[] = { static struct attribute *ioat_attrs[] = {
&ring_size_attr.attr, &ring_size_attr.attr,
&ring_active_attr.attr, &ring_active_attr.attr,
&ioat_cap_attr.attr, &ioat_cap_attr.attr,
&ioat_version_attr.attr, &ioat_version_attr.attr,
&intr_coalesce_attr.attr,
NULL, NULL,
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment