RE: [PATCH 3/6] OMAP3: Add runtime check for OMAP35x

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



> -----Original Message-----
> From: linux-omap-owner@xxxxxxxxxxxxxxx
> [mailto:linux-omap-owner@xxxxxxxxxxxxxxx] On Behalf Of Premi, Sanjeev
> Sent: Tuesday, August 11, 2009 5:22 PM
> To: Tony Lindgren
> Cc: Kevin Hilman; linux-omap@xxxxxxxxxxxxxxx
> Subject: RE: [PATCH 3/6] OMAP3: Add runtime check for OMAP35x
>
> > -----Original Message-----
> > From: Tony Lindgren [mailto:tony@xxxxxxxxxxx]
> > Sent: Tuesday, August 11, 2009 1:33 PM
> > To: Premi, Sanjeev
> > Cc: Kevin Hilman; linux-omap@xxxxxxxxxxxxxxx
> > Subject: Re: [PATCH 3/6] OMAP3: Add runtime check for OMAP35x
> >
> > Hi,
> >
> > * Premi, Sanjeev <premi@xxxxxx> [090810 20:15]:
> > >
> > >
> > > > -----Original Message-----
> > > > From: Tony Lindgren [mailto:tony@xxxxxxxxxxx]
> > > > Sent: Friday, August 07, 2009 1:53 PM
> > > > To: Kevin Hilman
> > > > Cc: Premi, Sanjeev; linux-omap@xxxxxxxxxxxxxxx
> > > > Subject: Re: [PATCH 3/6] OMAP3: Add runtime check for OMAP35x
> > > >
> > >
> > > <snip>--<snip>
> > >
> > > > >
> > > > > Adding conditionals like
> > > > >
> > > > >   if (omap3_has_iva2())
> > > > >      ...
> > > > >
> > > > > and
> > > > >
> > > > >   if (omap3_has_sgx())
> > > > >      ...
> > > > >
> > > > > rather than having a long list of cpu_is checks that have
> > > > to be changed
> > > > > each time a new SoC comes out.
> > > >
> > > > Agreed.
> > > >
> > > > Tony
> > > >
> > > >
> > >
> > > Tony, Kevin,
> > >
> > > Here is a work in progress patch implementing the conditionals.
> > >
> > > I am looking for your suggestions on these:
> > > 1) The detection of ES2.0 is different between OMAP3530 and
> > OMAP3430.
> > >    For 3430 ES2.0, (idcode >> 28) == 0x0
> > >    For 3530 ES2.0, (idcode >> 28) == 0x1
> > >
> > >    What can be easy way to make this distinction?
> >
> > Hmm, looks like in switch (rev) case 1 is not used, so I guess you
> > can use that? Hmm, might be worth checking if the 3530
> ES2.0 is really
> > based on the 3430 ES2.1 core though..
> >
> [sp] Yes, it is.
>
> >
> > > 2) How do we handle the power domain differences between OMAP34x
> > >    and the new OMAP3517 and OMAP05 devices. The hawkeye is
> > different,
> > >    but, would it make sense to omap_revision to be like:
> > >    0x34050034, 0x34170034 - when we reuse the 34xx class.
> >
> > Can't you use the bits documented in cpu.h:
>
> [sp] I was trying to use these bit only; but was trying to avoid
>      multiple declarations for each silicon rev like this:
> #define OMAP3430_REV_ES1_0    0x34300034
> #define OMAP3430_REV_ES2_0    0x34301034
> #define OMAP3430_REV_ES2_1    0x34302034
> #define OMAP3430_REV_ES3_0    0x34303034
> #define OMAP3430_REV_ES3_1    0x34304034
>
>      In my earlier patches, I had tried using masks for the
> ES revision;
>      but the current code uses these values in direct assignment.
>
>       omap_revision = OMAP3430_REV_ES3_1;
>
>      If we could use a mask for omap_revision bits, I believe
>      we won't need to multiple definitions for each si revision
>      for all the variants - 3505, 3517, and so on.
> >
> > /*
> >  * omap_rev bits:
> >  * CPU id bits      (0730, 1510, 1710, 2422...)     [31:16]
> >  * CPU revision     (See _REV_ defined in cpu.h)    [15:08]
> >  * CPU class bits (15xx, 16xx, 24xx, 34xx...)       [07:00]
> >  */
> > unsigned int omap_rev(void);
> >
> > Basically 0x3505??34, 0x3517??34 and so on? The
> cpu_is_omap34xx() is
> > omap_rev() & 0xff.
> >
> >
> > > 3) Currently, the macros like OMAP3430_REV_ES1_0 are defined to
> > >    be whole numbers. I am trying to change them to something like:
> > >
> > > #define OMAP34XX_REV(type,rev)  (OMAP34XX_CLASS & (type <<
> > 16) & (rev << 12))
> > >
> > > And use as (if needed):
> > >
> > > #define OMAP3430_REV_ES3_1      OMAP34XX_REV(0x30, 0x4)
> > >
> > > #define OMAP3403_REV_ES3_1      OMAP34XX_REV(0x03, 0x4)
> > >
> > >    What is your view?
> > >
> > >    In fact, wouldn't it be better if we tested for si rev
> > independent
> > >    from si type?
> >
> > Well cpu_is_omap34xx() should be enough in most places, but I
> > guess here you'd
> > want to test for the exact revision, and just define:
> > #define OMAP3505_REV_ES?_?  0x3505??34
>
> [sp] This is the multiplicity on definitions I am trying to avoid
>      as same revision will be valid across OMAP3505 and OMAP3517
>      in this case. Holds good even for 3503, 3515, 3525 and 3530.
>
> >
> >
> > > 4) These macros are, possibly, duplicating the data in
> > omap_revision:
> > >
> > > #define CHIP_IS_OMAP3430ES3_0             (1 << 5)
> > > #define CHIP_IS_OMAP3430ES3_1             (1 << 6)
> > >
> > >    But, might be used for faster checking. Is this
> > duplication necessary?
> >
> > These are currently needed for the clock framework,
> > eventually we should
> > unify them..
> >
> >
> > > 5) Assuming that we are able to maintain current, macros,
> would this
> > >    help in reducing the duplication?
> > >
> > > struct omap_id {
> > >   u16     id;             /* e.g. 0x3430, 0x3517, ... */
> > >   u8      class;  /* 34x */
> > >   u8      subclass;   /* 0x30, 0x03, 0x05, 0x15, 0x17 ... */
> > >   u8      rev;        /* 0x10 (for ES 1.0), 0x21 (for
> > ES2.1) etc. */
> > >                           /* use nibble as decimal separator */
> > > }
> >
> > Yeah we could do something like that as a separate patch eventually.
> >
> > Few more comments inlined below.
> >
> > >
> > > I have tried many approaches, before sending this mail,
> > > so there might be few duplications in the code below.
> > > The cpu_is_35xx() macros are also incomplete for now.
> > >
> > > Best regards,
> > > Sanjeev
> > >
> > > diff --git a/arch/arm/mach-omap2/id.c b/arch/arm/mach-omap2/id.c
> > > index a98201c..f17d4db 100644
> > > --- a/arch/arm/mach-omap2/id.c
> > > +++ b/arch/arm/mach-omap2/id.c
> > > @@ -25,9 +25,47 @@
> > >  #include <mach/control.h>
> > >  #include <mach/cpu.h>
> > >
> > > +#define OMAP3_CONTROL_OMAP_STATUS        0x044c
> > > +
> > > +#define OMAP3_SGX_SHIFT                  13
> > > +#define OMAP3_SGX_MASK                   (3 << OMAP3_SGX_SHIFT)
> > > +#define          FEAT_SGX_FULL           0
> > > +#define          FEAT_SGX_HALF           1
> > > +#define          FEAT_SGX_NONE           2
> > > +
> > > +#define OMAP3_IVA_SHIFT                  12
> > > +#define OMAP3_IVA_MASK                   (1 << OMAP3_SGX_SHIFT)
> > > +#define          FEAT_IVA                0
> > > +#define          FEAT_IVA_NONE           1
> > > +
> > > +#define OMAP3_L2CACHE_SHIFT              10
> > > +#define OMAP3_L2CACHE_MASK               (3 <<
> OMAP3_L2CACHE_SHIFT)
> > > +#define          FEAT_L2CACHE_0KB        0
> > > +#define          FEAT_L2CACHE_64KB       1
> > > +#define          FEAT_L2CACHE_128KB      2
> > > +#define          FEAT_L2CACHE_256KB      3
> > > +
> > > +#define OMAP3_ISP_SHIFT                  5
> > > +#define OMAP3_ISP_MASK                   (1<< OMAP3_ISP_SHIFT)
> > > +#define          FEAT_ISP                0
> > > +#define          FEAT_ISP_NONE           1
> > > +
> > > +#define OMAP3_NEON_SHIFT         4
> > > +#define OMAP3_NEON_MASK                  (1<< OMAP3_NEON_SHIFT)
> > > +#define          FEAT_NEON               0
> > > +#define          FEAT_NEON_NONE          1
> > > +
> > >  static struct omap_chip_id omap_chip;
> > >  static unsigned int omap_revision;
> > >
> > > +struct omap_feature {
> > > + u8 avail;
> > > + u32 attrib;
> > > +};
> > > +
> > > +static struct omap_feature feat_sgx;
> > > +static struct omap_feature feat_iva;
> > > +static struct omap_feature feat_l2cache;
> >
> > We should probably just have static u32 omap_feat that is a bitmask
> > for the various features.
> >
> > Then that could be moved to live in struct omap_id eventually.
> >
> >
> > >  unsigned int omap_rev(void)
> > >  {
> > > @@ -35,6 +73,24 @@ unsigned int omap_rev(void)
> > >  }
> > >  EXPORT_SYMBOL(omap_rev);
> > >
> > > +unsigned int omap3_has_sgx(void)
> > > +{
> > > + return feat_sgx.avail;
> > > +}
> > > +EXPORT_SYMBOL(omap3_has_sgx);
> > > +
> > > +unsigned int omap3_has_iva(void)
> > > +{
> > > + return feat_iva.avail;
> > > +}
> > > +EXPORT_SYMBOL(omap3_has_iva);
> > > +
> > > +unsigned int omap3_has_l2cache(void)
> > > +{
> > > + return feat_l2cache.avail;
> > > +}
> > > +EXPORT_SYMBOL(omap3_has_l2cache);
> >
> > And then these become something like return omap_feat &
> OMAP_HAS_IVA2.
> >
>
> [sp] I will try to get an patch just for feature testing for review by
>      today evening. Based on the comments, I will make formal
> submission
>      tomorrow.
>
> Best regards,
> Sanjeev
>
> > You should make the feature checking a separate patch, then
> the second
> > patch becomes simple for adding support for detecting 34xx properly.
> >
> > Regards,
> >
> > Tony
> >
> >

Tony,

Here are relevant sections from the feature patch for quick look:
(it is not a clean patch but just to highlight changes)

Best regard,
Sanjeev

diff --git a/arch/arm/mach-omap2/id.c b/arch/arm/mach-omap2/id.c
index a98201c..907770d 100644
--- a/arch/arm/mach-omap2/id.c
+++ b/arch/arm/mach-omap2/id.c
@@ -25,9 +25,49 @@
 #include <mach/control.h>
 #include <mach/cpu.h>
 +/*
+ * OMAP3 features
+ */
+#define OMAP3_CONTROL_OMAP_STATUS      0x044c
+
+#define OMAP3_SGX_SHIFT                        13
+#define OMAP3_SGX_MASK                 (3 << OMAP3_SGX_SHIFT)
+#define                FEAT_SGX_FULL           0
+#define                FEAT_SGX_HALF           1
+#define                FEAT_SGX_NONE           2
+
+#define OMAP3_IVA_SHIFT                        12
+#define OMAP3_IVA_MASK                 (1 << OMAP3_SGX_SHIFT)
+#define                FEAT_IVA                0
+#define                FEAT_IVA_NONE           1
+
+#define OMAP3_L2CACHE_SHIFT            10
+#define OMAP3_L2CACHE_MASK             (3 << OMAP3_L2CACHE_SHIFT)
+#define                FEAT_L2CACHE_0KB        0
+#define                FEAT_L2CACHE_64KB       1
+#define                FEAT_L2CACHE_128KB      2
+#define                FEAT_L2CACHE_256KB      3
+
+#define OMAP3_ISP_SHIFT                        5
+#define OMAP3_ISP_MASK                 (1<< OMAP3_ISP_SHIFT)
+#define                FEAT_ISP                0
+#define                FEAT_ISP_NONE           1
+
+#define OMAP3_NEON_SHIFT               4
+#define OMAP3_NEON_MASK                        (1<< OMAP3_NEON_SHIFT)
+#define                FEAT_NEON               0
+#define                FEAT_NEON_NONE          1
+
+
+#define OMAP_HAS_L2CACHE               1
+#define OMAP_HAS_IVA                   (1 << 1)
+#define OMAP_HAS_SGX                   (1 << 2)
+#define OMAP_HAS_NEON                  (1 << 3)
+#define OMAP_HAS_ISP                   (1 << 4)
+
 static struct omap_chip_id omap_chip;
 static unsigned int omap_revision;
-
+static u32 omap_features ;

 unsigned int omap_rev(void)
 {
@@ -35,6 +75,37 @@ unsigned int omap_rev(void)
 }
 EXPORT_SYMBOL(omap_rev);

+unsigned int omap3_has_l2cache(void)
+{
+       return (omap_features & OMAP_HAS_L2CACHE);
+}
+EXPORT_SYMBOL(omap3_has_l2cache);
+
+unsigned int omap3_has_sgx(void)
+{
+       return (omap_features & OMAP_HAS_SGX);
+}
+EXPORT_SYMBOL(omap3_has_sgx);
+
+unsigned int omap3_has_iva(void)
+{
+       return (omap_features & OMAP_HAS_IVA);
+}
+EXPORT_SYMBOL(omap3_has_iva);
+
+unsigned int omap3_has_neon(void)
+{
+       return (omap_features & OMAP_HAS_NEON);
+}
+EXPORT_SYMBOL(omap3_has_neon);
+
+unsigned int omap3_has_isp(void)
+{
+       return (omap_features & OMAP_HAS_ISP);
+}
+EXPORT_SYMBOL(omap3_has_isp);
+
+
 /**
  * omap_chip_is - test whether currently running OMAP matches a chip type
  * @oc: omap_chip_t to test against


..... And later on....

+void __init omap3_check_features(void)
+{
+       u32 status, temp;
+
+       omap_features = 0;
+
+       status = omap_ctrl_readl(OMAP3_CONTROL_OMAP_STATUS);
+
+     /* TBD: Make these checks as macro as SHOW_FEATURE below */
+
+       /* Check for L2 Cache */
+       temp = ((status & OMAP3_L2CACHE_MASK) >> OMAP3_L2CACHE_SHIFT) ;
+       if (temp != FEAT_L2CACHE_0KB)
+               omap_features |= OMAP_HAS_L2CACHE;
+
+       temp = ((status & OMAP3_IVA_MASK) >> OMAP3_IVA_SHIFT) ;
+       if (temp != FEAT_IVA_NONE)
+               omap_features |= OMAP_HAS_IVA;
+
+       temp = ((status & OMAP3_SGX_MASK) >> OMAP3_SGX_SHIFT) ;
+       if (temp != FEAT_SGX_NONE) {
+               omap_features |= OMAP_HAS_SGX;
+
+       temp = ((status & OMAP3_NEON_MASK) >> OMAP3_NEON_SHIFT) ;
+       if (temp != FEAT_NEON_NONE) {
+               omap_features |= OMAP_HAS_NEON;
+
+       temp = ((status & OMAP3_ISP_MASK) >> OMAP3_ISP_SHIFT) ;
+       if (temp != FEAT_ISP_NONE)
+               omap_features |= OMAP_HAS_NEON;
+}
+
+/* In few cases, the identification of the silicon depends upon the
+ * features available. So, omap3_check_features() will need to be
+ * called before omap3_check_revision().
+ *
+ * If the information on the silicon, its revision and features are
+ * printed in the current flow, the features will be printed before
+ * the Si id. Ideally, it should be other way around.
+ *
+ * This function has been created only to get the prints in right order.
+ * Additional info eg. Size of l2cache etc can be added later as well.
+ *
+ * THIS COMMENT IS ONLY FOR EXPLANATION. WILL NOT BE ADDED IN ACTUAL PATCH
+ *
+ */
+#define SHOW_FEATURE(feat)     \
+       if (omap3_has_ ##feat()) {              \
+               pr_info (" - "#feat" : Y");             \
+       } else {                                        \
+               pr_info (" - "#feat" : N");             \
+       }
+
+void __init omap3_cpuinfo(void)
+{
+       pr_info("OMAP%x", (omap_revision >> 16));
+
+       SHOW_FEATURE(l2cache);
+       SHOW_FEATURE(iva);
+       SHOW_FEATURE(sgx);
+       SHOW_FEATURE(neon);
+       SHOW_FEATURE(isp);
 }

..... Further down....

@@ -223,8 +408,12 @@ void __init omap2_check_revision(void)
         */
        if (cpu_is_omap24xx())
                omap24xx_check_revision();
-       else if (cpu_is_omap34xx())
-               omap34xx_check_revision();
+       else if (cpu_is_omap34xx()) {
+               omap3_check_features();
+               omap3_check_revision();
+               omap3_cpuinfo();
+       }


> > > +
> > >  /**
> > >   * omap_chip_is - test whether currently running OMAP
> > matches a chip type
> > >   * @oc: omap_chip_t to test against
> > > @@ -155,12 +211,32 @@ void __init omap24xx_check_revision(void)
> > >   pr_info("\n");
> > >  }
> > >
> > > -void __init omap34xx_check_revision(void)
> > > +void __init omap3_check_features(void)
> > > +{
> > > + u32 status;
> > > +
> > > + status = omap_ctrl_readl(OMAP3_CONTROL_OMAP_STATUS);
> > > +
> > > + /* Check for SGX */
> > > + feat_sgx.attrib = ((status & OMAP3_SGX_MASK) >>
> > OMAP3_SGX_SHIFT) ;
> > > + feat_sgx.avail  = (feat_sgx.attrib == FEAT_SGX_NONE) ? 0 : 1 ;
> > > +
> > > + /* Check for IVA */
> > > + feat_iva.attrib = ((status & OMAP3_IVA_MASK) >>
> > OMAP3_IVA_SHIFT) ;
> > > + feat_iva.avail = (feat_iva.attrib == FEAT_IVA_NONE) ? 0 : 1 ;
> > > +
> > > + /* Check for L2 Cache */
> > > + feat_l2cache.attrib = ((status & OMAP3_L2CACHE_MASK) >> \
> > > +                                 OMAP3_L2CACHE_SHIFT) ;
> > > + feat_l2cache.avail = (feat_l2cache.attrib ==
> > FEAT_L2CACHE_0KB) ? 0 : 1 ;
> > > +}
> > > +
> > > +void __init omap3_check_revision(void)
> > >  {
> > >   u32 cpuid, idcode;
> > >   u16 hawkeye;
> > >   u8 rev;
> > > - char *rev_name = "ES1.0";
> > > + char cpu_name[16]= "", rev_name[16] = "", feat_name[32] = "";
> > >
> > >   /*
> > >    * We cannot access revision registers on ES1.0.
> > > @@ -187,29 +263,50 @@ void __init omap34xx_check_revision(void)
> > >           switch (rev) {
> > >           case 0:
> > >                   omap_revision = OMAP3430_REV_ES2_0;
> > > -                 rev_name = "ES2.0";
> > > +                 strcat (rev_name, "ES2.0");
> > >                   break;
> > >           case 2:
> > >                   omap_revision = OMAP3430_REV_ES2_1;
> > > -                 rev_name = "ES2.1";
> > > +                 strcat (rev_name, "ES2.1");
> > >                   break;
> > >           case 3:
> > >                   omap_revision = OMAP3430_REV_ES3_0;
> > > -                 rev_name = "ES3.0";
> > > +                 strcat (rev_name, "ES3.0");
> > >                   break;
> > >           case 4:
> > >                   omap_revision = OMAP3430_REV_ES3_1;
> > > -                 rev_name = "ES3.1";
> > > +                 strcat (rev_name, "ES3.1");
> > >                   break;
> > >           default:
> > >                   /* Use the latest known revision as default */
> > >                   omap_revision = OMAP3430_REV_ES3_1;
> > > -                 rev_name = "Unknown revision\n";
> > > +                 strcat (rev_name, "Unknown revision");
> > > +         }
> > > + }
> > > + else if (hawkeye == 0xb868) {
> > > +         if (omap3_has_sgx()) {
> > > +                 omap_revision = OMAP35XX_REV(0x17, 0x0);
> > > +         }
> > > +         else {
> > > +                 omap_revision = OMAP35XX_REV(0x05, 0x0);
> > >           }
> > >   }
> > >
> > >  out:
> > > - pr_info("OMAP%04x %s\n", omap_rev() >> 16, rev_name);
> > > + if (omap3_has_iva() && omap3_has_sgx()) {
> > > +         strcat(cpu_name, "3430/3530");
> > > + }
> > > + else if (omap3_has_sgx()) {
> > > +         strcat(cpu_name, "3525");
> > > + }
> > > + else if (omap3_has_iva()) {
> > > +         strcat(cpu_name, "3515");
> > > + }
> > > + else {
> > > +         strcat(cpu_name, "3505");
> > > + }
> > > +
> > > + pr_info("OMAP%s %s\n", cpu_name, rev_name);
> > >  }
> > >
> > >  /*
> > > @@ -223,8 +320,10 @@ void __init omap2_check_revision(void)
> > >    */
> > >   if (cpu_is_omap24xx())
> > >           omap24xx_check_revision();
> > > - else if (cpu_is_omap34xx())
> > > -         omap34xx_check_revision();
> > > + else if (cpu_is_omap34xx()) {
> > > +         omap3_check_features();
> > > +         omap3_check_revision();
> > > + }
> > >   else if (cpu_is_omap44xx()) {
> > >           printk(KERN_INFO "FIXME: CPU revision = OMAP4430\n");
> > >           return;
> > > diff --git a/arch/arm/plat-omap/include/mach/cpu.h
> > b/arch/arm/plat-omap/include/mach/cpu.h
> > > index 285eaa3..e9d6bc2 100644
> > > --- a/arch/arm/plat-omap/include/mach/cpu.h
> > > +++ b/arch/arm/plat-omap/include/mach/cpu.h
> > > @@ -363,6 +363,23 @@ IS_OMAP_TYPE(3430, 0x3430)
> > >  #if defined(CONFIG_ARCH_OMAP34XX)
> > >  # undef cpu_is_omap3430
> > >  # define cpu_is_omap3430()               is_omap3430()
> > > +
> > > +# undef cpu_is_omap3503
> > > +# undef cpu_is_omap3515
> > > +# undef cpu_is_omap3525
> > > +# undef cpu_is_omap3530
> > > +
> > > +# undef cpu_is_omap3505
> > > +# undef cpu_is_omap3517
> > > +
> > > +# define cpu_is_omap3503()               (!omap3_has_iva() &&
> > !omap3_has_sgx())
> > > +# define cpu_is_omap3515()               (!omap3_has_iva() &&
> > !omap3_has_sgx())
> > > +# define cpu_is_omap3525()               (!omap3_has_iva() &&
> > !omap3_has_sgx())
> > > +# define cpu_is_omap3530()               (omap3_has_iva() &&
> > omap3_has_sgx())
> > > +/* How to make these different from the ones above */
> > > +# define cpu_is_omap3505()               (!omap3_has_iva() &&
> > !omap3_has_sgx())
> > > +# define cpu_is_omap3517()               (!omap3_has_iva() &&
> > omap3_has_sgx())
> > > +
> > >  #endif
> > >
> > >  # if defined(CONFIG_ARCH_OMAP4)
> > > @@ -396,6 +413,12 @@ IS_OMAP_TYPE(3430, 0x3430)
> > >  #define OMAP3430_REV_ES3_0       0x34303034
> > >  #define OMAP3430_REV_ES3_1       0x34304034
> > >
> > > +
> > > +#define OMAP35XX_CLASS           0x35000035
> > > +
> > > +
> > > +#define OMAP35XX_REV(type,rev)   (OMAP35XX_CLASS & (type
> > << 16) & (rev << 12))
> > > +
> > >  #define OMAP443X_CLASS           0x44300034
> > >
> > >  /*
> >
> > --
> To unsubscribe from this list: send the line "unsubscribe
> linux-omap" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>
>
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Arm (vger)]     [ARM Kernel]     [ARM MSM]     [Linux Tegra]     [Linux WPAN Networking]     [Linux Wireless Networking]     [Maemo Users]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux