staticlong isst_if_mmio_rd_wr(u8 *cmd_ptr, int *write_only, int resume)
{ struct isst_if_device *punit_dev; struct isst_if_io_reg *io_reg; struct pci_dev *pdev;
io_reg = (struct isst_if_io_reg *)cmd_ptr;
if (io_reg->reg % 4) return -EINVAL;
if (io_reg->read_write && !capable(CAP_SYS_ADMIN)) return -EPERM;
pdev = isst_if_get_pci_dev(io_reg->logical_cpu, 0, 0, 1); if (!pdev) return -EINVAL;
punit_dev = pci_get_drvdata(pdev); if (!punit_dev) return -EINVAL;
if (io_reg->reg < punit_dev->mmio_range[0].beg ||
io_reg->reg > punit_dev->mmio_range[1].end) return -EINVAL;
/* * Ensure that operation is complete on a PCI device to avoid read * write race by using per PCI device mutex.
*/
mutex_lock(&punit_dev->mutex); if (io_reg->read_write) {
writel(io_reg->value, punit_dev->punit_mmio+io_reg->reg);
*write_only = 1;
} else {
io_reg->value = readl(punit_dev->punit_mmio+io_reg->reg);
*write_only = 0;
}
mutex_unlock(&punit_dev->mutex);
for (i = 0; i < ARRAY_SIZE(punit_dev->range_0); ++i)
punit_dev->range_0[i] = readl(punit_dev->punit_mmio +
punit_dev->mmio_range[0].beg + 4 * i); for (i = 0; i < ARRAY_SIZE(punit_dev->range_1); ++i) {
u32 addr;
for (i = 0; i < ARRAY_SIZE(punit_dev->range_0); ++i)
writel(punit_dev->range_0[i], punit_dev->punit_mmio +
punit_dev->mmio_range[0].beg + 4 * i); for (i = 0; i < ARRAY_SIZE(punit_dev->range_1); ++i) {
u32 addr;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.