Help needed to describe a custom bus in the device tree
Laurent Pinchart
laurentp at cse-semaphore.com
Wed Mar 12 01:27:26 EST 2008
Hi everybody,
the migration process from ARCH=ppc to ARCH=powerpc is easier than I thought
in some parts, but a few devices are still giving me headaches. This should
hopefully be one of my last major requests for help (I'm sure most of you
will be happy to see traffic on this list going down when I'll be done :-))
I'm having trouble describing a custom bus named MS bus (completely unrelated
to a well-known software company) in the device tree. The hardware is
MPC8248-based and has the following hardware topology.
MPC8248 <-- localbus --> FPGA <-- ms bus --> Custom peripherals
The bus interrupt controller, serial access (SPI) controller and status
registers are accessed through memory-mapped registers in the FPGA. Parallel
access to the MS bus is handled transparently by the FPGA which handles
address mapping.
The FPGA is mapped on the locabus at address 0xf4000000. Bus control registers
are at 0xf4002000 - 0xf4003000. The parallel bus memory window on the
localbus is located at 0xf5000000.
My current dts draft describes that topology as follows (unrelated devices on
the local bus such as flash memory are removed for clarity).
localbus at f0010100 {
compatible = "fsl,pq2-localbus";
#address-cells = <2>;
#size-cells = <1>;
reg = <f0010100 40>;
ranges = <0 0 40000000 01000000
2 0 f2000000 00100000
3 0 f3000000 00100000
4 0 f4000000 00100000
5 0 f5000000 00100000>;
fpga at 4,0 {
#address-cells = <1>;
#size-cells = <1>;
ranges = <4 0 0 00010000>;
msbus-arbitrer at 2000 {
compatible = "tbox,cp11-msbus-arbitrer";
reg = <2000 4>;
};
msbus_pic: interrupt-controller at 2100 {
compatible = "tbox,cp11-msbus-pic";
reg = <2100 8>;
interrupts = <17 2>;
interrupt-parent = <&cpm_pic>;
#interrupt-cells = <1>;
interrupt-controller;
};
msbus-spi at 2200 {
compatible = "tbox,cp11-msbus-spi";
reg = <2200 100>;
interrupts = <18 8>;
interrupt-parent = <&cpm_pic>;
};
sdhc at 5000 {
compatible = "tbox,sdhci";
reg = <5000 1000>;
interrupts = <16 8>;
interrupt-parent = <&cpm_pic>;
};
};
msbus at 5,0 {
compatible = "tbox,cp11-msbus";
#address-cells = <1>;
#size-cells = <1>;
#interrupt-cells = <1>;
reg = <5 0 0 00000400>;
interrupt-parent = <&msbus_pic>;
};
};
The device tree reflects the physical topology but makes driver access to the
bus quite complex. An OF platform device driver matching on compatible
= "tbox,cp11-msbus" will not have the bus FPGA registers described in its
device node.
Having a look at the various device trees included in the kernel sources, it
seems platforms with a PCI bus experience a similar problem. To solve it the
PCI bus node address and registers describe the configuration registers, and
the memory window to access PCI devices is described by the ranges property.
Applying that to my custom bus would lead to the following tree.
localbus at f0010100 {
compatible = "fsl,pq2-localbus";
#address-cells = <2>;
#size-cells = <1>;
reg = <f0010100 40>;
ranges = <0 0 40000000 01000000
2 0 f2000000 00100000
3 0 f3000000 00100000
4 0 f4000000 00100000
4 1 f4002000 00000100
5 0 f5000000 00100000>;
fpga at 4,0 {
#address-cells = <1>;
#size-cells = <1>;
ranges = <4 0 0 00010000>;
msbus_pic: interrupt-controller at 2100 {
compatible = "tbox,cp11-msbus-pic";
reg = <2100 8>;
interrupts = <17 2>;
interrupt-parent = <&cpm_pic>;
#interrupt-cells = <1>;
interrupt-controller;
};
msbus-spi at 2200 {
compatible = "tbox,cp11-msbus-spi";
reg = <2200 100>;
interrupts = <18 8>;
interrupt-parent = <&cpm_pic>;
};
sdhc at 5000 {
compatible = "tbox,sdhci";
reg = <5000 1000>;
interrupts = <16 8>;
interrupt-parent = <&cpm_pic>;
};
};
msbus at 4,1 {
compatible = "tbox,cp11-msbus";
#address-cells = <1>;
#size-cells = <1>;
#interrupt-cells = <1>;
reg = <4 1 4>;
interrupt-parent = <&msbus_pic>;
ranges = <5 0 0 00000400>;
};
};
Is this correct ? Is that the best way to describe my custom bus in the device
tree ? How would the relationships between the bus and its PIC and SPI
controller be handled in the drivers ? I also don't understand how interrupt
mappings are supposed to be handled. PCI busses have two CPM interrupt lines,
one for the PCI PIC and one for the PCI bus, with the PCI bus having the CPM
PIC as its interrupt controller. My bus PIC uses a single interrupt line. Is
there some documentation explaining how PICs and interrupt mappings should be
described ?
Thanks in advance for any help you can provide.
Best regards,
--
Laurent Pinchart
CSE Semaphore Belgium
Chaussée de Bruxelles, 732A
B-1410 Waterloo
Belgium
T +32 (2) 387 42 59
F +32 (2) 387 42 75
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
URL: <http://lists.ozlabs.org/pipermail/linuxppc-dev/attachments/20080311/f8f2567e/attachment.pgp>
More information about the Linuxppc-dev
mailing list