Skip to contentSkip to conversation

PowerPC iotable_init equivalent?

DISCUSSION Eddie Dawydiuk 4 participants 4 messages Apr 17, 2009 – Apr 18, 2009

lore
Share & tools
lore
#0 lore raw

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
#1 lore raw

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

#2 lore raw
In reply to Eddie Dawydiuk
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

#3 lore raw
In reply to Eddie Dawydiuk
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.