xref: /linux/Documentation/ABI/testing/sysfs-firmware-memmap (revision 69ac9cd629ca96e59f34eb4ccd12d00b2c8276a7)
1*69ac9cd6SBernhard WalleWhat:		/sys/firmware/memmap/
2*69ac9cd6SBernhard WalleDate:		June 2008
3*69ac9cd6SBernhard WalleContact:	Bernhard Walle <bwalle@suse.de>
4*69ac9cd6SBernhard WalleDescription:
5*69ac9cd6SBernhard Walle		On all platforms, the firmware provides a memory map which the
6*69ac9cd6SBernhard Walle		kernel reads. The resources from that memory map are registered
7*69ac9cd6SBernhard Walle		in the kernel resource tree and exposed to userspace via
8*69ac9cd6SBernhard Walle		/proc/iomem (together with other resources).
9*69ac9cd6SBernhard Walle
10*69ac9cd6SBernhard Walle		However, on most architectures that firmware-provided memory
11*69ac9cd6SBernhard Walle		map is modified afterwards by the kernel itself, either because
12*69ac9cd6SBernhard Walle		the kernel merges that memory map with other information or
13*69ac9cd6SBernhard Walle		just because the user overwrites that memory map via command
14*69ac9cd6SBernhard Walle		line.
15*69ac9cd6SBernhard Walle
16*69ac9cd6SBernhard Walle		kexec needs the raw firmware-provided memory map to setup the
17*69ac9cd6SBernhard Walle		parameter segment of the kernel that should be booted with
18*69ac9cd6SBernhard Walle		kexec. Also, the raw memory map is useful for debugging. For
19*69ac9cd6SBernhard Walle		that reason, /sys/firmware/memmap is an interface that provides
20*69ac9cd6SBernhard Walle		the raw memory map to userspace.
21*69ac9cd6SBernhard Walle
22*69ac9cd6SBernhard Walle		The structure is as follows: Under /sys/firmware/memmap there
23*69ac9cd6SBernhard Walle		are subdirectories with the number of the entry as their name:
24*69ac9cd6SBernhard Walle
25*69ac9cd6SBernhard Walle			/sys/firmware/memmap/0
26*69ac9cd6SBernhard Walle			/sys/firmware/memmap/1
27*69ac9cd6SBernhard Walle			/sys/firmware/memmap/2
28*69ac9cd6SBernhard Walle			/sys/firmware/memmap/3
29*69ac9cd6SBernhard Walle			...
30*69ac9cd6SBernhard Walle
31*69ac9cd6SBernhard Walle		The maximum depends on the number of memory map entries provided
32*69ac9cd6SBernhard Walle		by the firmware. The order is just the order that the firmware
33*69ac9cd6SBernhard Walle		provides.
34*69ac9cd6SBernhard Walle
35*69ac9cd6SBernhard Walle		Each directory contains three files:
36*69ac9cd6SBernhard Walle
37*69ac9cd6SBernhard Walle		start	: The start address (as hexadecimal number with the
38*69ac9cd6SBernhard Walle			  '0x' prefix).
39*69ac9cd6SBernhard Walle		end	: The end address, inclusive (regardless whether the
40*69ac9cd6SBernhard Walle			  firmware provides inclusive or exclusive ranges).
41*69ac9cd6SBernhard Walle		type	: Type of the entry as string. See below for a list of
42*69ac9cd6SBernhard Walle			  valid types.
43*69ac9cd6SBernhard Walle
44*69ac9cd6SBernhard Walle		So, for example:
45*69ac9cd6SBernhard Walle
46*69ac9cd6SBernhard Walle			/sys/firmware/memmap/0/start
47*69ac9cd6SBernhard Walle			/sys/firmware/memmap/0/end
48*69ac9cd6SBernhard Walle			/sys/firmware/memmap/0/type
49*69ac9cd6SBernhard Walle			/sys/firmware/memmap/1/start
50*69ac9cd6SBernhard Walle			...
51*69ac9cd6SBernhard Walle
52*69ac9cd6SBernhard Walle		Currently following types exist:
53*69ac9cd6SBernhard Walle
54*69ac9cd6SBernhard Walle		  - System RAM
55*69ac9cd6SBernhard Walle		  - ACPI Tables
56*69ac9cd6SBernhard Walle		  - ACPI Non-volatile Storage
57*69ac9cd6SBernhard Walle		  - reserved
58*69ac9cd6SBernhard Walle
59*69ac9cd6SBernhard Walle		Following shell snippet can be used to display that memory
60*69ac9cd6SBernhard Walle		map in a human-readable format:
61*69ac9cd6SBernhard Walle
62*69ac9cd6SBernhard Walle		-------------------- 8< ----------------------------------------
63*69ac9cd6SBernhard Walle		  #!/bin/bash
64*69ac9cd6SBernhard Walle		  cd /sys/firmware/memmap
65*69ac9cd6SBernhard Walle		  for dir in * ; do
66*69ac9cd6SBernhard Walle		      start=$(cat $dir/start)
67*69ac9cd6SBernhard Walle		      end=$(cat $dir/end)
68*69ac9cd6SBernhard Walle		      type=$(cat $dir/type)
69*69ac9cd6SBernhard Walle		      printf "%016x-%016x (%s)\n" $start $[ $end +1] "$type"
70*69ac9cd6SBernhard Walle		  done
71*69ac9cd6SBernhard Walle		-------------------- >8 ----------------------------------------
72