[PATCH v2] Device tree bindings for Xilinx devices

Grant Likely grant.likely at secretlab.ca
Wed Oct 17 12:35:46 EST 2007


On 10/16/07, Stephen Neuendorffer <stephen.neuendorffer at xilinx.com> wrote:
>
>
> > -----Original Message-----
> > From: glikely at secretlab.ca [mailto:glikely at secretlab.ca] On
> > Behalf Of Grant Likely
> > Sent: Tuesday, October 16, 2007 12:36 PM
> > To: Stephen Neuendorffer
> > Cc: linuxppc-dev at ozlabs.org; Wolfgang Reissnegger; Leonid;
> > microblaze-uclinux at itee.uq.edu.au
> > Subject: Re: [PATCH v2] Device tree bindings for Xilinx devices
> >
> > On 10/16/07, Stephen Neuendorffer
> > <stephen.neuendorffer at xilinx.com> wrote:
> > >
> > > > +   n) Xilinx EMAC and Xilinx TEMAC
> > > > +
> > > > +   Xilinx Ethernet devices.  Uses common properties from
> > > > other Ethernet
> > > > +   devices with the following constraints:
> > > > +
> > > > +   Required properties:
> > > > +    - compatible : Must include one of: "xilinx,plb-temac",
> > > > +                   "xilinx,plb-emac", "xilinx-opb-emac"
> > > > +    - dma-mode : Must be one of "none", "simple", "sg" (sg
> > > > == scatter gather)
> > >
> > > I think it's going to be a significant headache to remap
> > things like the
> > > dma-mode from the xilinx configurations to something else, and then
> > > interpret them correctly in the drivers.
> > >
> > > Although it lacks a bit in style, perhaps, I'd greatly prefer having
> > > something like:
> > >
> > >         Ethernet_MAC {
> > >                 xilinx,C_DMA_PRESENT = <1>;
> > >             ...
> > >       }
> > >
> > > (which happens to correspond to "none" above)
> >
> > Ugh.  Can't say I'm thrilled about this....
> >
> > But in this case is might be a necessity.  The IP core is already
> > parameterized and the best way to describe the device is to use the
> > existing parameter names.
>
> I don't really like it either, expecially after thinking about it more.
> The problem is that a single IP core might correspond to multiple
> logical devices.  The parameters actually need to be from the point of
> view of the drivers. That is, they need to be names like in the
> xparameters:
>
>         xilinx,DMA_PRESENT = <1>;

Hmm, not bad.  It does still get a little harry when one IP core
implements multiple logical devices, but maybe the IP core should
create a node and the logical devices can be sub nodes with the
appropriate properties needed to describe which logical device it is.

>
> In this case, the translation looks simple, but it is currently
> implemented by a bunch of gnarly .tcl code.  (Don't ask... :)  In the
> future, this *could* be simple code, but in the short term, it won't be
> any simpler than having pretty names.  Furthermore, the best driver code
> that I can come up with for using this essentially looks like:
>
> static int __devinit xenet_of_probe(struct of_device *ofdev, const
> struct of_device_id *match)
> {
>         struct xemac_platform_data pdata_struct;
>         struct resource r_irq_struct;
>         struct resource r_mem_struct;
>
>         struct resource *r_irq = &r_irq_struct; /* Interrupt resources
> */
>         struct resource *r_mem = &r_mem_struct; /* IO mem resources */
>         struct xemac_platform_data *pdata = &pdata_struct;
>         int rc = 0;
>
>         printk(KERN_ERR "Device Tree Probing \'%s\'\n",
>                         ofdev->node->name);
>
>         /* Get iospace for the device */
>         rc = of_address_to_resource(ofdev->node, 0, r_mem);
>         if(rc) {
>                 dev_warn(&ofdev->dev, "invalid address\n");
>                 return rc;
>         }
>
>         /* Get IRQ for the device */
>         rc = of_irq_to_resource(ofdev->node, 0, r_irq);
>         if(rc == NO_IRQ) {
>                 dev_warn(&ofdev->dev, "no IRQ found.\n");
>                 return rc;
>         }
>
>         pdata_struct.dma_mode           = get_u32(ofdev,
> "C_DMA_PRESENT");
>         pdata_struct.has_mii            = get_u32(ofdev, "C_MII_EXIST");
>         pdata_struct.has_cam            = get_u32(ofdev, "C_CAM_EXIST");
>         pdata_struct.has_err_cnt        = get_u32(ofdev,
> "C_ERR_COUNT_EXIST");
>         pdata_struct.has_jumbo          = get_u32(ofdev,
> "C_JUMBO_EXIST");
>         pdata_struct.tx_dre             = get_u32(ofdev,
> "C_TX_DRE_TYPE");
>         pdata_struct.rx_dre             = get_u32(ofdev,
> "C_RX_DRE_TYPE");
>         pdata_struct.tx_hw_csum         = get_u32(ofdev,
> "C_TX_INCLUDE_CSUM");
>         pdata_struct.rx_hw_csum         = get_u32(ofdev,
> "C_RX_INCLUDE_CSUM");
>         memcpy(pdata_struct.mac_addr, of_get_mac_address(ofdev->node),
> 6);
>
>         return probe_initialization(&ofdev->dev, r_mem, r_irq, pdata);
> }
>
> Where probe_initialization contains shares code with the platform_device
> version of probe.  This means that the string is still translated into
> another name anyway.  Anybody have any better ideas for doing this?

That's pretty close to what I've done on the sysace, uartlite and
xilinxfb drivers.

> > I want to be careful though.  Parameters can change from one version
> > of an IP core to another.  The driver needs to be able to determine
> > what version of the IP core is used so that the parameters make sense.
> >  I'm also nervous about adding every possible C_ value to the device
> > node for each xilinx IP-core; that could make the device tree quite
> > large.  (on the other hand; maybe that doesn't matter... It is
> > probably a bigger deal for microblaze than powerpc too.).
>
> Using the xparameters set of values could solve this problem, since only
> things that make sense to the driver are actually set.

I've thought about this more since I wrote the above paragraph.  The
compatible property was designed to solve that exact problem.  We'll
just embed the version in the compatible list.

g.

-- 
Grant Likely, B.Sc., P.Eng.
Secret Lab Technologies Ltd.
grant.likely at secretlab.ca
(403) 399-0195



More information about the Linuxppc-dev mailing list