^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) Device-tree bindings for persistent memory regions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) -----------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) Persistent memory refers to a class of memory devices that are:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) a) Usable as main system memory (i.e. cacheable), and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) b) Retain their contents across power failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) Given b) it is best to think of persistent memory as a kind of memory mapped
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) storage device. To ensure data integrity the operating system needs to manage
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) persistent regions separately to the normal memory pool. To aid with that this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) binding provides a standardised interface for discovering where persistent
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) memory regions exist inside the physical address space.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) Bindings for the region nodes:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) -----------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) Required properties:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) - compatible = "pmem-region"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) - reg = <base, size>;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) The reg property should specificy an address range that is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) translatable to a system physical address range. This address
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) range should be mappable as normal system memory would be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) (i.e cacheable).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) If the reg property contains multiple address ranges
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) each address range will be treated as though it was specified
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) in a separate device node. Having multiple address ranges in a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) node implies no special relationship between the two ranges.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) Optional properties:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) - Any relevant NUMA assocativity properties for the target platform.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) - volatile; This property indicates that this region is actually
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) backed by non-persistent memory. This lets the OS know that it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) may skip the cache flushes required to ensure data is made
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) persistent after a write.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) If this property is absent then the OS must assume that the region
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) is backed by non-volatile memory.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) Examples:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) --------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) * This node specifies one 4KB region spanning from
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) * 0x5000 to 0x5fff that is backed by non-volatile memory.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) pmem@5000 {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) compatible = "pmem-region";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) reg = <0x00005000 0x00001000>;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) * This node specifies two 4KB regions that are backed by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) * volatile (normal) memory.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) pmem@6000 {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) compatible = "pmem-region";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) reg = < 0x00006000 0x00001000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) 0x00008000 0x00001000 >;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) volatile;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65)