On Mon, Dec 7, 2009 at 9:10 PM, Ralf Baechle <ralf@xxxxxxxxxxxxxx> wrote:
I probably knew 15 years ago when I wrote this code :)On Mon, Dec 07, 2009 at 03:39:15PM +0800, Dennis.Yxun wrote:
> HI ALL:
> I have a problem, that our MIPS hardware put registers location from
> 0x7000,0000 -0x7040,0000.
> So, I need to init TLB to access those registers.
> My question is: can I map those range to Kseg2 (mapped,uncached)? I found
> "add_wired_entry" sit in
> kernel code, seems I should use this function.
>
> I found code in arch/mips/jazz/irq.c, and the comment tells me
> /* Map 0xe4000000 -> 0x0:600005C0, 0xe4100000 -> 400005C0 */
> add_wired_entry(0x01800017, 0x01000017, 0xe4000000, PM_4M);
>
> does that mean after add_wired_entry, virtual address 0xe400,0000 map to
> physical address 0x600005C0?
> why the address is 0x6000,05C0, not 0x6000,0000
add_wired_entry() is a very awkard API and its use in the Jazz code is
broken so I suggest you use ioremap() instead.
Ralf
As you suggested, I plan to use ioremap()
it generally works if I use in my driver code after kernel initialization finished
but I still have a problem:
How can I access hardware register very early?
say that, use early_printk() to access UART registers,
And I try to put ioremap() at prom_init() to try to remap UART register
but, found that kernel will hang..
the UART register is start from physical address 0x700007c0 (> 512M)
but address below 512M can be remaped successfully
I spend a few minutes digging into the ioremap() function
it simply remap <512M space to KSEG1,
while other physical space use different scheme (map to KSEG2), quite complicated....