MTRR(4) - Device Drivers Manual (amd64)

MTRR(4) - Device Drivers Manual (amd64) #

MTRR(4) - Device Drivers Manual (amd64)

NAME #

mtrr - driver for CPU memory range attributes

SYNOPSIS #

pseudo-device mtrr 1

DESCRIPTION #

The mtrr device provides access to the memory range attributes supported by the MTRRs on AMD64 compatible CPUs.

IOCTL INTERFACE #

Several architectures allow attributes to be associated with ranges of physical memory. These attributes can be manipulated via ioctl() calls performed on /dev/mem or /dev/xf86. Declarations and data types are to be found in <sys/memrange.h>.

The specific attributes, and number of programmable ranges may vary between architectures. The full set of supported attributes is:

MDF_UNCACHEABLE

The region is not cached.

MDF_WRITECOMBINE

Writes to the region may be combined or performed out of order.

MDF_WRITETHROUGH

Writes to the region are committed synchronously.

MDF_WRITEBACK

Writes to the region are committed asynchronously.

MDF_WRITEPROTECT

The region cannot be written to.

Memory ranges are described by

struct mem_range_desc {
	u_int64_t	mr_base;	/* physical base address */
	u_int64_t	mr_len;		/* physical length of region */
	int		mr_flags;	/* attributes of region */
	char		mr_owner[8];
};

In addition to the region attributes listed above, the following flags may also be set in the mr_flags field:

MDF_FIXBASE

The region’s base address cannot be changed.

MDF_FIXLEN

The region’s length cannot be changed.

MDF_FIRMWARE

The region is believed to have been established by the system firmware.

MDF_ACTIVE

The region is currently active.

MDF_BOGUS

We believe the region to be invalid or otherwise erroneous.

MDF_FIXACTIVE

The region cannot be disabled.

Operations are performed using

struct mem_range_op {
	struct mem_range_desc	*mo_desc;
	int			mo_arg[2];
};

The MEMRANGE_GET ioctl is used to retrieve current memory range attributes. If mo_arg[0] is set to 0, it will be updated with the total number of memory range descriptors. If greater than 0, the array at mo_desc will be filled with a corresponding number of descriptor structures, or the maximum, whichever is less.

The MEMRANGE_SET ioctl is used to add, alter and remove memory range attributes. A range with the MDF_FIXACTIVE flag may not be removed.

mo_arg[0] should be set to MEMRANGE_SET_UPDATE to update an existing or establish a new range, or to MEMRANGE_SET_REMOVE to remove a range.

ERRORS #

On ioctl(2) failure, errno(2) will be set as follows:

[EOPNOTSUPP]

Memory range operations are not supported on this architecture.

[ENXIO]

No memory range descriptors are available (e.g., firmware has not enabled any).

[EINVAL]

The memory range supplied as an argument is invalid or overlaps another range in a fashion not supported by this architecture.

[EBUSY]

An attempt to remove or update a range failed because the range is busy.

[ENOSPC]

An attempt to create a new range failed due to a shortage of hardware resources (e.g., descriptor slots).

[ENOENT]

An attempt to remove a range failed because no range matches the descriptor base/length supplied.

[EPERM]

An attempt to remove a range failed because the range is permanently enabled.

SEE ALSO #

ioctl(2), mem(4), pctr(4), xf86(4), memconfig(8)

HISTORY #

mtrr support was originally included in FreeBSD 3.3.

OpenBSD 7.5 - February 15, 2014