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

Commit d69e3bcf authored by Matan Barak's avatar Matan Barak Committed by Doug Ledford
Browse files

IB/mlx5: Mmap the HCA's core clock register to user-space



In order to read the HCA's current cycles register, we need
to map it to user-space. Add support to map this register
via mmap command.

Signed-off-by: default avatarMatan Barak <matanb@mellanox.com>
Reviewed-by: default avatarMoshe Lazer <moshel@mellanox.com>
Signed-off-by: default avatarDoug Ledford <dledford@redhat.com>
parent b368d7cb
Loading
Loading
Loading
Loading
+28 −0
Original line number Diff line number Diff line
@@ -1023,6 +1023,34 @@ static int mlx5_ib_mmap(struct ib_ucontext *ibcontext, struct vm_area_struct *vm
	case MLX5_IB_MMAP_GET_CONTIGUOUS_PAGES:
		return -ENOSYS;

	case MLX5_IB_MMAP_CORE_CLOCK:
	{
		phys_addr_t pfn;

		if (vma->vm_end - vma->vm_start != PAGE_SIZE)
			return -EINVAL;

		if (vma->vm_flags & (VM_WRITE | VM_EXEC))
			return -EPERM;

		/* Don't expose to user-space information it shouldn't have */
		if (PAGE_SIZE > 4096)
			return -EOPNOTSUPP;

		vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
		pfn = (dev->mdev->iseg_base +
		       offsetof(struct mlx5_init_seg, internal_timer_h)) >>
			PAGE_SHIFT;
		if (io_remap_pfn_range(vma, vma->vm_start, pfn,
				       PAGE_SIZE, vma->vm_page_prot))
			return -EAGAIN;

		mlx5_ib_dbg(dev, "mapped internal timer at 0x%lx, PA 0x%llx\n",
			    vma->vm_start,
			    (unsigned long long)pfn << PAGE_SHIFT);
		break;
	}

	default:
		return -EINVAL;
	}
+3 −1
Original line number Diff line number Diff line
@@ -65,7 +65,9 @@ enum {

enum mlx5_ib_mmap_cmd {
	MLX5_IB_MMAP_REGULAR_PAGE		= 0,
	MLX5_IB_MMAP_GET_CONTIGUOUS_PAGES	= 1, /* always last */
	MLX5_IB_MMAP_GET_CONTIGUOUS_PAGES	= 1,
	/* 5 is chosen in order to be compatible with old versions of libmlx5 */
	MLX5_IB_MMAP_CORE_CLOCK			= 5,
};

enum {