Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f6cc35ee authored by Vinod Koul's avatar Vinod Koul
Browse files

Merge branch 'topic/ioat' into for-linus

parents 07e24b85 268e2519
Loading
Loading
Loading
Loading
+30 −0
Original line number Diff line number Diff line
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.
+7 −3
Original line number Diff line number Diff line
@@ -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),
	/* 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)
+3 −0
Original line number Diff line number Diff line
@@ -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);
};

/**
+1 −1
Original line number Diff line number Diff line
@@ -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) },
+42 −0
Original line number Diff line number Diff line
@@ -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,
};