On Wed, Jun 07, 2006 at 07:19:48PM +0900, KAMEZAWA Hiroyuki wrote: > On Tue, 6 Jun 2006 18:25:27 -0700 > Bryce Harrington <bryce at osdl.org> wrote: > > > Could you point us at docs for using acpi for doing the hotplug mem add? > > > > I'll post my emulation patches and README in reply to this mail. Thanks for this writeup! I think this helped get Jacob going. > I know my illustration skill is not good enough to write long description. > please ask if something is unclear. > > [0/3] illustration, how to use > [1/3] acpi_sci_emulation patch > [2/3] acpi_memoryhotplug_emulation patch > [3/3] hide system ram patch > > Thanks, > -Kame > > README > == > > 1. How to make the kernel for ACPI emulation > > For acpi emulation, you have to write acpi's AML by yourself. > see also http://acpi.sourceforge.net/ , there are misc useful information. > > 1-1 download tools > you need acpi compiler tools > > download ACPI CA - Unix Build Environment (.TAR.GZ 819KB) > from http://www.intel.com/technology/iapc/acpi/downloads.htm > > [kamezawa at casares src]$ tar xpzf acpica-unix-20060512.tar.gz > [kamezawa at casares src]$ cd acpica-unix-20060512 > [kamezawa at casares acpica-unix-20060512]$ cd compiler/ > [kamezawa at casares compiler]$ make > > you get 'iasl' You should define what iasl is at this point - I take it that it's a decompiler? > 1-2 get your machine's original acpi DSDT information Could you explain at this point in the README what 'DSDT' means? > [kamezawa at casares compiler]$ su > Password: > [root at casares compiler]# cat /proc/acpi/dsdt > dsdt.org > > 1-3 Because dsdt.org is binary, you have to decompile it. > > [kamezawa at casares compiler]$ iasl -d dsdt.org > > you get dsdt.dsl. this is human readble. > > 1-4 modify dsdt as you want > modify dsdt.dsl by hand (how to modify will be described later.) > > 1-5 compile your dsdt > > [kamezawa at casares compiler]$ iasl -tc dsdt.dsl > 'dsdt.hex' is generated. > You have to include this dsdt.hex to linux kernel at compile. > > 1-6 apply patches to before compiling your kernel > You can't do acpi-sci-emulation without patch. > apply attached patches to your kernel. > > [1] acpi_sci_emulation.patch -- emulate notify > [2] acpi_memhotplug_emu.patch -- emulate power switch of memory > [3] hide-system-ram-resource.patch -- hide system ram information > for avoiding conflicts > > 1-7 configure your custom kernel > > At first, say N (remove check) here: > > Device Drivers ---> > Generic Driver Options ---> > [ ] Select only drivers that don't need compile-time external firmware > > Then, you can include your custom firmware. > > Check this: > Power management and ACPI ---> > ACPI (Advanced Configuration and Power Interface) Support ---> > [ ] Include Custom DSDT (NEW) maybe show the check explicitly? [X] Include Custom DSDT (NEW) > Then, > > () Custom DSDT Table file to include (NEW) > > will appear. give the name of your custom 'dsdt.hex' file created in 1-5. > > And check this: > [] ACPI SCI Event Emulation Support [X] ACPI SCI Event Emulation Support > > 1-8 make your kernel > > > > 2. How to edit DSDT for acpi memory hotplug. > > For details, please read acpi spec. > This is test case for my environment. > > I know my hardware(tiger4)'s memory is organized as > 0-2G > 4-8G > 10-12G. > > But, be careful to efi's real memory map. > you can get it from /proc/iomem (of unmodified kernel) > > == > [kamezawa at casares linux-2.6.17-rc5-mm2]$ cat /proc/iomem | grep System > 00000000-00000fff : System RAM > 00001000-00006fff : System RAM > 00007000-00008fff : System RAM > 00009000-00081fff : System RAM > 00084000-00084fff : System RAM > 00085000-0009ffff : System RAM > 00100000-03ffffff : System RAM > 04000000-04a83fff : System RAM > 04a84000-0ff7ffff : System RAM > 0ff80000-0fffffff : System RAM > 10000000-7d8fffff : System RAM > 7d900000-7f97ffff : System RAM > 7f980000-7f9fffff : System RAM > 7fe96000-7ff39fff : System RAM > 7ff3a000-7ff41fff : System RAM > 100000000-1ffffdfff : System RAM > 280000000-2fedf3fff : System RAM > 2fedf4000-2fedf9fff : System RAM > 2fedfa000-2fedfafff : System RAM > 2fedfb000-2fef59fff : System RAM > 2fef5a000-2fefb1fff : System RAM > 2fefb2000-2fefb9fff : System RAM > 2fefba000-2feffffff : System RAM > 2ff000000-2ff453fff : System RAM > 2ff454000-2ff800fff : System RAM > 2ff801000-2ff8c5fff : System RAM > 2ff8c6000-2ff8c7fff : System RAM > 2ff8c8000-2ff8c9fff : System RAM > 2ff8ca000-2ff9fbfff : System RAM > 2ff9fc000-2ff9fcfff : System RAM > 2ff9fd000-2ff9fffff : System RAM > 2ffa00000-2ffd85fff : System RAM > 2ffd86000-2ffdfffff : System RAM > 2ffe00000-2ffe13fff : System RAM > 2ffe80000-2fffb9fff : System RAM > == > > How many small regions there are! ;) > > it looks 4G-7G memory is contiguous. I'd like to add 3 of 1G memory > modules at 4G-7G to original DSDT. How did you tell that 4G-7G is contiguous? > > 1. avoid confliction > If your original DSDT has memory object, remove it. it will confilcts. I don't understand this step - could you explain in more detail? > 2. Write Memory object. > > Memory object is a device of Name(_HID,EISAID("PNP0C80") > This is example of hot-pluggable DSDT memory object. > put this under _SB object. > please see acpi spec for detail. > > == > Scope (\_SB) > { > <snip> > Device(MEM1) { > Name(_HID,EISAID("PNP0C80")) > Name(_UID, 0) > Name (L1st,0) > Method(_PXM) { > return (0x0) > } > Method(_STA,0,NotSerialized) { > If ( LEqual(L1st,1) ) { > Return (0x0f) > } else { > Return (0x00) > } > } > Method(_PS0, 0, NotSerialized) { > Store(1,L1st) > } > Method(_CRS) { > Name(RT0,ResourceTemplate() { > QWordMemory(ResourceProducer, > PosDecode, > MinNotFixed, > MaxNotFixed, > Cacheable, > ReadWrite, > 0, > 0x100000000, > 0x13fffffff, > 0, > 0x40000000, > , > , > HP30) > }) > Return (RT0) > } > } > > == > Above one is an object for memory 4G-5G, MEM1. > > > 3. hot-add-test > > we want to add 4G- memory fot test. Then, we need to hide 4G- memory from > the kernel. boot kernel with max_addr=2G > > Then, > [kamezawa at casares ~]$ cat /proc/meminfo > MemTotal: 1925040 kB > MemFree: 1529264 kB > Buffers: 31712 kB > Cached: 181488 kB > SwapCached: 0 kB > Active: 162400 kB > Inactive: 170032 kB > > Add MEM1 I added to my custom DSDT. > == > [root at casares kamezawa]# echo MEM1 1 > /proc/acpi/sci/notify > [root at casares kamezawa]# ls /sys/devices/system/memory/ > block_size_bytes memory0 memory1 memory4 > > memory4 is added. > > [root at casares kamezawa]# echo online > /sys/devices/system/memory/memory4/state > [root at casares kamezawa]# cat /proc/meminfo > MemTotal: 2973616 kB > MemFree: 2561712 kB > Buffers: 31632 kB > Cached: 181568 kB > SwapCached: 0 kB > .... > [root at casares kamezawa]# > == > Memory increased :) > > Thanks! Bryce