PowerPC iotable_init equivalent?
Hello,
In the past I've worked with ARM architectures where I could setup virtual / physical address mappings so I don't have to ioremap then pass around pointers. Does PowerPC have an equivalent abstraction? If not whats the recommended approach?
That is, is there a better approach to the following...
volatile static unsigned char *my_reg = NULL;
static inline void read_func() {
if (!my_reg)
my_reg = (unsigned char *)
ioremap(REG_PHYS_BASE, REG_SIZE);//do something with the reg
}
static inline void write_func() {
if (!my_reg)
my_reg = (unsigned char *)
ioremap(REG_PHYS_BASE, REG_SIZE);//do something with the reg
}
Signature · 5 lines
Best Regards, ________________________________________________________________ Eddie Dawydiuk, Technologic Systems | voice: (480) 837-5200 16525 East Laser Drive | fax: (480) 837-5300 Fountain Hills, AZ 85268 | web: www.embeddedARM.com
On Fri, Apr 17, 2009 at 11:21 PM, Eddie Dawydiuk <[email protected]> wr= ote:
Quoted 3 lines
Hello,
In the past I've worked with ARM architectures where I could setup virtua=
l /
Quoted 6 lines
physical address mappings so I don't have to ioremap then pass around pointers. Does PowerPC have an equivalent abstraction? If not whats the recommended approach?
That is, is there a better approach to the following...
Quoted 7 lines
volatile static unsigned char
*my_reg=3D NULL;static inline void
read_func(){=A0 =A0 =A0 =A0if (!my_reg)
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0my_reg =3D (unsigned char *) =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0ioremap(REG_PHYS_BASE, REG=
_SIZE);
Quoted 9 lines
//do something with the reg
}static inline void
write_func(){=A0 =A0 =A0 =A0if (!my_reg)
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0my_reg =3D (unsigned char *) =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0ioremap(REG_PHYS_BASE, REG=
_SIZE);
Quoted 8 lines
//do something with the reg
}--
Best Regards,
________________________________________________________________
=A0Eddie Dawydiuk, Technologic Systems | voice: =A0(480) 837-5200 =A016525 East Laser Drive =A0 =A0 =A0 =A0 =A0 =A0 =A0| fax: =A0 =A0(480) =
837-5300
Quoted 1 line
=A0Fountain Hills, AZ 85268 =A0 =A0 =A0 =A0 =A0 =A0| web: www.embeddedARM=
.com
Quoted 5 lines
_______________________________________________
Linuxppc-dev mailing list
[email protected]
https://ozlabs.org/mailman/listinfo/linuxppc-dev
In general you set devices up a dts file. You can reach its contents using openfirmware functions (of_*). In general you use an of_* function to look up your periperhal in the device tree. Once you have its node you would able to do e.g. of_iomap (which uses ioremap with the right offsets behind its back) to map the device. So you don't hard code physical addresses anymore in the code.
Regards,
Roderick Colenbrander
Quoted 17 lines · Eddie Dawydiuk
Hello,
In the past I've worked with ARM architectures where I could setup virtual / physical address mappings so I don't have to ioremap then pass around pointers. Does PowerPC have an equivalent abstraction? If not whats the recommended approach?
That is, is there a better approach to the following...
volatile static unsigned char
*my_reg= NULL;static inline void
read_func(){if (!my_reg) my_reg = (unsigned char *) ioremap(REG_PHYS_BASE, REG_SIZE);//do something with the reg
}
Quoted 7 lines
static inline void
write_func(){if (!my_reg) my_reg = (unsigned char *) ioremap(REG_PHYS_BASE, REG_SIZE);//do something with the reg
}
Yes have a struct that keeps track of the virt addr and do the mapping once at init time. This is what most drivers do.
- k
Quoted 6 lines · Eddie Dawydiuk
Hello,
In the past I've worked with ARM architectures where I could setup virtual / physical address mappings so I don't have to ioremap then pass around pointers. Does PowerPC have an equivalent abstraction? If not whats the recommended approach?
No. Predefining virt->phys mappings is fragile since it makes assumptions about how the kernel is going to carve up the virtual address space. Better to let the kernel allocate virtual ranges as it needs them.
As Kumar says, do your ioremap() (or, even better: of_iomap()) in your driver's probe function and store it in the driver's private data structure.
g.
Signature · 2 lines
Grant Likely, B.Sc., P.Eng. Secret Lab Technologies Ltd.