Hello.

David Gibson wrote:

>>Also mine.  I've been home sick the last couple of days, but by way of
>>a sharper prod, see my draft work below.  It patches both
>>booting-without-of.txt with a revised binding, and implements it in
>>the physmap_of driver (which needs renaming, but that's another
>>story).  It also revises the ebony device tree as an example.

>>This is certainly not complete - it defines none of the extra
>>properties that JEDEC chips need (although the mtd drivers'
>>defaults/probing seem to cope for ebony).  And there are various other
>>ommisions.  Still, it's a starting point - something precise for you
>>to flame Segher :-p.

    Let me flame you a bit for starters ;-)

> Duh, forgot to attach the actual patch.  Here it is:

> Index: working-2.6/Documentation/powerpc/booting-without-of.txt
> ===================================================================
> --- working-2.6.orig/Documentation/powerpc/booting-without-of.txt     
> 2007-07-30 17:07:14.000000000 +1000
> +++ working-2.6/Documentation/powerpc/booting-without-of.txt  2007-07-30 
> 17:07:14.000000000 +1000
> @@ -1757,45 +1757,23 @@ platforms are moved over to use the flat
>               };
>       };
>  
> -    j) Flash chip nodes
> +   j) CFI or JEDEC memory-mapped NOR flash
>  
>      Flash chips (Memory Technology Devices) are often used for solid state
>      file systems on embedded devices.
>  
> -    Required properties:
> +     - compatible : should contain the specific model of flash chip(s) used
> +       followed by either "cfi-flash" or "jedec-flash"

    This "compatible" prop (and the node in whole) doesn't say a thing about 
how the flash is mapped into the CPU address space.  I strongly disagree that 
this node provides enough info to select a driver. :-/

> +     - reg : Address range of the flash chip
> +     - bank-width : Width (in bytes) of the flash bank.  Equal to the device 
> width
> +       times the number of interleaved chips.
> +     - device-width : (optional) Width of a single flash chip.  If omitted,
> +       assumed to be equal to 'bank-width'.

    Why then not just introduce the "interleave" prop and obsolete the
"bank-width"?

> -   Example:
> -
> -     [EMAIL PROTECTED] {
> -             device_type = "rom";
> -             compatible = "direct-mapped";
> -             probe-type = "CFI";
> -             reg = <ff000000 01000000>;
> -             bank-width = <4>;
> -             partitions = <00000000 00f80000
> -                           00f80000 00080001>;
> -             partition-names = "fs\0firmware";
> -     };

    Why delete the example? :-/

> +    Flash partitions
> +     - reg :
> +     - read-only : (optional)

    All that would look nice but partition is even less of a device than the
original "rom" node was... well, who cares now? :-)

> Index: working-2.6/drivers/mtd/maps/physmap_of.c
> ===================================================================
> --- working-2.6.orig/drivers/mtd/maps/physmap_of.c    2007-07-30 
> 17:07:11.000000000 +1000
> +++ working-2.6/drivers/mtd/maps/physmap_of.c 2007-07-30 17:07:14.000000000 
> +1000
[...]
> @@ -30,17 +33,72 @@ struct physmap_flash_info {
>       struct map_info         map;
>       struct resource         *res;
>  #ifdef CONFIG_MTD_PARTITIONS
> -     int                     nr_parts;
>       struct mtd_partition    *parts;
>  #endif
>  };
>  
> -static const char *rom_probe_types[] = { "cfi_probe", "jedec_probe", 
> "map_rom", NULL };
>  #ifdef CONFIG_MTD_PARTITIONS
> -static const char *part_probe_types[] = { "cmdlinepart", "RedBoot", NULL };
> -#endif
> +static int __devinit handle_of_flash_partitions(struct physmap_flash_info 
> *info,
> +                                              struct of_device *dev)
> +{
> +     static const char *part_probe_types[]
> +             = { "cmdlinepart", "RedBoot", NULL };
> +     struct device_node *dp = dev->node, *pp;
> +     int nr_parts, i, err;
> +
> +     /* First look for RedBoot table or partitions on the command
> +      * line, these take precedence over device tree information */
> +     nr_parts = parse_mtd_partitions(info->mtd, part_probe_types,
> +                                     &info->parts, 0);
> +     if (nr_parts > 0) {
> +             add_mtd_partitions(info->mtd, info->parts, err);
> +             return 0;
> +     }
> +
> +     /* First count the subnodes */
> +     nr_parts = 0;
> +     for (pp = dp->child; pp; pp = pp->sibling)
> +             nr_parts++;
> +
> +     info->parts = kzalloc(nr_parts * sizeof(struct mtd_partition), 
> GFP_KERNEL);
> +     if (!info->parts) {
> +             printk(KERN_ERR "Can't allocate the flash partition data!\n");
> +             return -ENOMEM;
> +     }
> +
> +     for (pp = dp->child, i = 0 ; pp; pp = pp->sibling, i++) {
> +             const u32 *reg;
> +             const char *name;
> +             const void *ro;

    We hardly need the above 2 variables.

> +             int len;
> +
> +             reg = of_get_property(pp, "reg", &len);
> +             if (! reg || (len != 2*sizeof(u32))) {

    Kill the space after !, please.

> +                     dev_err(&dev->dev, "Invalid 'reg' on %s\n",
> +                             dp->full_name);
> +                     err = -EINVAL;
> +                     goto fail;
> +             }
> +             info->parts[i].offset = reg[0];
> +             info->parts[i].size = reg[1];
> +
> +             name = of_get_property(pp, "name", &len);
> +             info->parts[i].name = name;
> +
> +             ro = of_get_property(pp, "read-only", &len);
> +             if (ro)
> +                     info->parts[i].mask_flags = MTD_WRITEABLE;
> +     }
> +
> +     add_mtd_partitions(info->mtd, info->parts, nr_parts);
> +     return 0;
> +
> + fail:
> +     kfree(info->parts);
> +     info->parts = NULL;
> +     return err;
> +}

    Oh, I see that the new partition representation have really simplified
parsing -- this function is hardly shorter than the old one... :-P

> -#ifdef CONFIG_MTD_PARTITIONS
>  static int parse_flash_partitions(struct device_node *node,
>               struct mtd_partition **parts)
>  {
> @@ -79,7 +137,14 @@ static int parse_flash_partitions(struct
>  err:
>       return retval;

    Could get rid of that useless label and goto's in this function, while at
it...

>  }
> -#endif
> +#else /* MTD_PARTITIONS */
> +static int __devinit handle_of_flash_partitions(struct physmap_flash_info 
> *info,
> +                                              struct device_node *dev)
> +{
> +     add_mtd_device(info->mtd);
> +     return 0;
> +}
> +#endif /* MTD_PARTITIONS */
>  
>  static int of_physmap_remove(struct of_device *dev)
>  {
> @@ -115,13 +180,45 @@ static int of_physmap_remove(struct of_d
>       return 0;
>  }
>  
> +/* Helper function to handle probing of the obsolete "direct-mapped"
> + * compatible binding, which has an extra "probe-type" property
> + * describing the type of flash probe necessary. */

    Too early to obsolete it, I'm afraid... :-)

> +static struct mtd_info * __devinit obsolete_probe(struct of_device *dev,
> +                                               struct map_info *map)
> +{
> +     struct device_node *dp = dev->node;
> +     const char *of_probe;
> +     struct mtd_info *mtd;
> +     static const char *rom_probe_types[]
> +             = { "cfi_probe", "jedec_probe", "map_rom"};
> +     int i;
> +
> +     of_probe = of_get_property(dp, "probe-type", NULL);
> +     if (!of_probe) {
> +             for (i = 0; i < ARRAY_SIZE(rom_probe_types); i++) {
> +                     mtd = do_map_probe(rom_probe_types[i], map);
> +                     if (mtd)
> +                             return mtd;
> +             }
> +             return NULL;
> +     } else if (strcmp(of_probe, "CFI") == 0) {
> +             return do_map_probe("cfi_probe", map);
> +     } else if (strcmp(of_probe, "JEDEC") == 0) {
> +             return do_map_probe("jedec_probe", map);
> +     } else {
> +             if (strcmp(of_probe, "ROM") != 0)
> +                     dev_dbg(&dev->dev, "obsolete_probe: don't know probe 
> type "
> +                             "'%s', mapping as rom\n", of_probe);
> +             return do_map_probe("mtd_rom", map);
> +     }
> +}
> +
>  static int __devinit of_physmap_probe(struct of_device *dev, const struct 
> of_device_id *match)
>  {
>       struct device_node *dp = dev->node;
>       struct resource res;
>       struct physmap_flash_info *info;
> -     const char **probe_type;
> -     const char *of_probe;
> +     const char *probe_type = (const char *)match->data;
>       const u32 *width;
>       int err;
[...]
> @@ -221,6 +297,14 @@ err_out:
>  
>  static struct of_device_id of_physmap_match[] = {
>       {
> +             .compatible     = "cfi-flash",
> +             .data           = (void *)"cfi_probe",
> +     },
> +     {
> +             .compatible     = "jedec-flash",
> +             .data           = (void *)"jedec_probe",
> +     },
> +     {

    This would also trigger on non-linearly mapped CFI or JEDEC flashes which 
is not a good idea -- however, as we're using the MTD probing code anyway, it 
will just fail, so it's not luckily is not a fatal design flaw.

>               .type           = "rom",
>               .compatible     = "direct-mapped"
>       },
> Index: working-2.6/arch/powerpc/boot/dts/ebony.dts
> ===================================================================
> --- working-2.6.orig/arch/powerpc/boot/dts/ebony.dts  2007-07-30 
> 17:07:14.000000000 +1000
> +++ working-2.6/arch/powerpc/boot/dts/ebony.dts       2007-07-30 
> 17:07:14.000000000 +1000
[...]
> @@ -158,14 +161,20 @@
>                               };
>  
>                               [EMAIL PROTECTED],0 {

    Hmm... what does @2,0 mean? :-O

> -                                     device_type = "rom";
> -                                     compatible = "direct-mapped";
> -                                     probe-type = "JEDEC";
> +                                     compatible = "jedec-flash";
>                                       bank-width = <1>;
> -                                     partitions = <0 380000
> -                                                   380000 80000>;
> -                                     partition-names = "fs", "firmware";
> +//                                   partitions = <0 380000
> +//                                                 380000 80000>;
> +//                                   partition-names = "fs", "firmware";
>                                       reg = <2 0 400000>;
> +                                     #address-cells = <1>;
> +                                     #size-cells = <1>;

    Heh...

> +                                     [EMAIL PROTECTED] {
> +                                             reg = <0 380000>;
> +                                     };
> +                                     [EMAIL PROTECTED] {
> +                                             reg = <380000 80000>;

   I guess the "firmware" should have a "read-only" prop...

> +                                     };
>                               };

    So, I don't see what we're really winning with your changes...

WBR, Sergei
_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@ozlabs.org
https://ozlabs.org/mailman/listinfo/linuxppc-dev

Reply via email to