Yes, the having two devices at the same physical address might be a
problem, but one I _might_ be able to work around. Not only do I have
a large bank of SDRAM, but I also have a small bank of on-chip SRAM.
So I'm thinking that the map will go (starting from 0) like this:
on-chip SRAM, control registers, main memory
And this is where I think the add_memory_region() magic might need to
happen. Do I need to add the on-chip SRAM and control registers using
add_memory_region()? Is it going to be okay to have a large and
mis-aligned bank of SDRAM?
Questions abound. Needless to say, I'm going to have some choice
words with the chip designers over this...
Matthew D. Dharm Senior Software Designer
Momentum Computer Inc. 1815 Aston Ave. Suite 107
(760) 431-8663 X-115 Carlsbad, CA 92008-7310
Momentum Works For You www.momenco.com
> -----Original Message-----
> From: Jun Sun [mailto:email@example.com]
> Sent: Friday, September 06, 2002 1:53 PM
> To: Matthew Dharm
> Cc: Linux-MIPS; firstname.lastname@example.org
> Subject: Re: LOADADDR and low physical addresses?
> On Fri, Sep 06, 2002 at 01:04:28PM -0700, Matthew Dharm wrote:
> > So, I've got an interesting problem... which has forced
> me to look at
> > the use of the LOADADDR variable in the Makefile, and try
> (quickly) to
> > brush up on my linker scripting...
> > Basically I've got a processor with on-chip registers
> that need to be
> > located in the first 512MByte of _physical_ address. To
> make things
> > difficult, they cannot be re-located once placed (configuration is
> > done by a hardware config stream at reset). It's only 16KBytes of
> > address, but since I recall that linux on mips can't
> (well, probably
> > can't) handle discontiguous memory maps (we discussed this about a
> > year ago, I think), I was looking for a good place to put them.
> > Now, I think my problems are solved if the LOADADDR
> variable works the
> > way I think it does -- that the kernel loads at that
> address, and only
> > uses memory from that point upwards. So, if my LOADADDR is
> > 0x80100000, then the first 0x100000 won't get used. Of
> course, the
> > exception vectors are there, but that doesn't take up
> that much space.
> > So there should be a chunk of address space I can use for other
> > things, like this register bank.
> > Yes? No? Is my understanding even close?
> That is right.
> The only catch is that if you make LOADADDR very high (as
> in the case
> system ram starts at a high address), the kernel page
> table will be very high too. It starts from phys address 0.
> Also if you map your control registers at near-zero phy
> address, don't you
> also have system RAM there too? Normally it is not ok to have two
> devices decoded at the same phys address.
> > P.S. Of course, if this is right, then I need to figure out the
> > proper/best way to use the add_memory_region() function....
> Unless I misunderstand something here, I don't think you need
> to mess with add_memory_region().