Okay, you lost me about halfway through that... could you perhaps
describe the problem from the beginning, exactly what you're trying to do?
A kernel compiled with VMI enabled may run on a non-VMI platform. If
that is the case, the fixmap should not be relocated. If however, a VMI
ROM is found, we need to hijack up to 64-MB of linear address space from
the top of memory down. This means moving the fixmap down by the same
amount.
Right now the code is structured in such a way that it wants to know how
much physical memory there is, so it can register a mapping table for
mapping linear addresses in the lowmem area to physical addresses. This
causes the code to depend on max_low_pfn being initialized, which
accounts for the current placement.
But it also must be called before anything that creates the fixmap,
because the same code which registers the linear address mapping also
reserves high memory above the fixmap.
My point is 1) these could be two separate calls, or 2) the lowmem
mapping table need not depend on max_low_pfn at all, it is safe to
create an extra large mapping which covers all possible lowmem instead
of the physical ram that is actually available.