Changeset 21675


Ignore:
Timestamp:
2010-06-04T21:09:52+02:00 (8 years ago)
Author:
juhosg
Message:

generic: merge mips multi machine update to generic patches for 2.6.34

Location:
trunk/target/linux
Files:
2 added
2 deleted
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/target/linux/generic-2.6/patches-2.6.34/020-mips_multi_machine_support.patch

    r21542 r21675  
    11--- /dev/null 
    22+++ b/arch/mips/include/asm/mips_machine.h 
    3 @@ -0,0 +1,47 @@ 
     3@@ -0,0 +1,54 @@ 
    44+/* 
    5 + *  Copyright (C) 2008-2009 Gabor Juhos <juhosg@openwrt.org> 
     5+ *  Copyright (C) 2008-2010 Gabor Juhos <juhosg@openwrt.org> 
    66+ * 
    77+ *  This program is free software; you can redistribute it and/or modify it 
     
    1717+#include <linux/list.h> 
    1818+ 
     19+#include <asm/bootinfo.h> 
     20+ 
    1921+struct mips_machine { 
    2022+       unsigned long           mach_type; 
     23+       const char              *mach_id; 
     24+       const char              *mach_name; 
    2125+       void                    (*mach_setup)(void); 
    22 +       char                    *mach_name; 
    23 +       struct list_head        list; 
    2426+}; 
    2527+ 
    26 +void mips_machine_register(struct mips_machine *) __init; 
    27 +void mips_machine_setup(unsigned long machtype) __init; 
    28 +void mips_machine_set_name(char *name) __init; 
    29 + 
    30 +extern char *mips_machine_name; 
    31 + 
    32 +#define MIPS_MACHINE(_type, _name, _setup)                     \ 
    33 +static char machine_name_##_type[] __initdata = _name;         \ 
    34 +static struct mips_machine machine_##_type __initdata =                \ 
     28+#define MIPS_MACHINE(_type, _id, _name, _setup)                \ 
     29+static const char machine_name_##_type[] __initconst           \ 
     30+                       __aligned(1) = _name;                   \ 
     31+static const char machine_id_##_type[] __initconst             \ 
     32+                       __aligned(1) = _id;                     \ 
     33+static struct mips_machine machine_##_type                     \ 
     34+               __used __section(.mips.machines.init) =         \ 
    3535+{                                                              \ 
    3636+       .mach_type      = _type,                                \ 
     37+       .mach_id        = machine_id_##_type,                   \ 
    3738+       .mach_name      = machine_name_##_type,                 \ 
    3839+       .mach_setup     = _setup,                               \ 
    39 +};                                                             \ 
    40 +                                                               \ 
    41 +static int __init register_machine_##_type(void)               \ 
    42 +{                                                              \ 
    43 +       mips_machine_register(&machine_##_type);                \ 
    44 +       return 0;                                               \ 
    45 +}                                                              \ 
    46 +                                                               \ 
    47 +pure_initcall(register_machine_##_type) 
     40+}; 
     41+ 
     42+extern long __mips_machines_start; 
     43+extern long __mips_machines_end; 
     44+ 
     45+#ifdef CONFIG_MIPS_MACHINE 
     46+int  mips_machtype_setup(char *id) __init; 
     47+void mips_machine_setup(void) __init; 
     48+void mips_set_machine_name(const char *name) __init; 
     49+char *mips_get_machine_name(void); 
     50+#else 
     51+static inline int mips_machtype_setup(char *id) { return 1; } 
     52+static inline void mips_machine_setup(void) { } 
     53+static inline void mips_set_machine_name(const char *name) { } 
     54+static inline char *mips_get_machine_name(void) { return NULL; } 
     55+#endif /* CONFIG_MIPS_MACHINE */ 
    4856+ 
    4957+#endif /* __ASM_MIPS_MACHINE_H */ 
    50 + 
    5158--- /dev/null 
    5259+++ b/arch/mips/kernel/mips_machine.c 
    53 @@ -0,0 +1,74 @@ 
     60@@ -0,0 +1,83 @@ 
    5461+/* 
    55 + *  Copyright (C) 2008-2009 Gabor Juhos <juhosg@openwrt.org> 
     62+ *  Copyright (C) 2008-2010 Gabor Juhos <juhosg@openwrt.org> 
    5663+ * 
    5764+ *  This program is free software; you can redistribute it and/or modify it 
     
    6168+ */ 
    6269+#include <linux/mm.h> 
     70+#include <linux/string.h> 
     71+#include <linux/slab.h> 
    6372+ 
    6473+#include <asm/mips_machine.h> 
    65 +#include <asm/bootinfo.h> 
    66 + 
    67 +static struct list_head mips_machines __initdata = 
    68 +               LIST_HEAD_INIT(mips_machines); 
    69 + 
    70 +char *mips_machine_name = "Unknown"; 
    71 + 
    72 +static struct mips_machine * __init mips_machine_find(unsigned long machtype) 
    73 +{ 
    74 +       struct list_head *this; 
    75 + 
    76 +       list_for_each(this, &mips_machines) { 
    77 +               struct mips_machine *mach; 
    78 + 
    79 +               mach = list_entry(this, struct mips_machine, list); 
    80 +               if (mach->mach_type == machtype) 
    81 +                       return mach; 
    82 +       } 
    83 + 
    84 +       return NULL; 
    85 +} 
    86 + 
    87 +void __init mips_machine_register(struct mips_machine *mach) 
    88 +{ 
    89 +       list_add_tail(&mach->list, &mips_machines); 
    90 +} 
    91 + 
    92 +void __init mips_machine_set_name(char *name) 
    93 +{ 
    94 +       unsigned int len; 
     74+ 
     75+static struct mips_machine *mips_machine __initdata; 
     76+static char *mips_machine_name = "Unknown"; 
     77+ 
     78+#define for_each_machine(mach) \ 
     79+       for ((mach) = (struct mips_machine *)&__mips_machines_start; \ 
     80+            (mach) && \ 
     81+            (unsigned long)(mach) < (unsigned long)&__mips_machines_end; \ 
     82+            (mach)++) 
     83+ 
     84+__init void mips_set_machine_name(const char *name) 
     85+{ 
    9586+       char *p; 
    9687+ 
     
    9889+               return; 
    9990+ 
    100 +       len = strlen(name); 
    101 +       p = kmalloc(len + 1, GFP_KERNEL); 
    102 +       if (p) { 
    103 +               strncpy(p, name, len); 
    104 +               p[len] = '\0'; 
    105 +               mips_machine_name = p; 
    106 +       } else { 
    107 +               printk(KERN_WARNING "MIPS: no memory for machine_name\n"); 
    108 +       } 
    109 +} 
    110 + 
    111 +void __init mips_machine_setup(unsigned long machtype) 
     91+       p = kstrdup(name, GFP_KERNEL); 
     92+       if (!p) 
     93+               pr_err("MIPS: no memory for machine_name\n"); 
     94+ 
     95+       mips_machine_name = p; 
     96+} 
     97+ 
     98+char *mips_get_machine_name(void) 
     99+{ 
     100+       return mips_machine_name; 
     101+} 
     102+ 
     103+__init int mips_machtype_setup(char *id) 
    112104+{ 
    113105+       struct mips_machine *mach; 
    114106+ 
    115 +       mach = mips_machine_find(machtype); 
    116 +       if (!mach) { 
    117 +               printk(KERN_ALERT "MIPS: no machine registered for " 
    118 +                       "machtype %lu\n", machtype); 
     107+       for_each_machine(mach) { 
     108+               if (mach->mach_id == NULL) 
     109+                       continue; 
     110+ 
     111+               if (strcmp(mach->mach_id, id) == 0) { 
     112+                       mips_machine = mach; 
     113+                       break; 
     114+               } 
     115+       } 
     116+ 
     117+       if (!mips_machine) { 
     118+               pr_err("MIPS: no machine found for id '%s', supported machines:\n", 
     119+                      id); 
     120+               pr_err("%32s %s\n", "id", "name"); 
     121+               for_each_machine(mach) 
     122+                       pr_err("%32s %s\n", mach->mach_id, mach->mach_name); 
     123+               return 1; 
     124+       } 
     125+ 
     126+       mips_machtype = mips_machine->mach_type; 
     127+ 
     128+       return 0; 
     129+} 
     130+ 
     131+__setup("machtype=", mips_machtype_setup); 
     132+ 
     133+__init void mips_machine_setup(void) 
     134+{ 
     135+       if (!mips_machine) 
    119136+               return; 
    120 +       } 
    121 + 
    122 +       mips_machine_set_name(mach->mach_name); 
    123 +       printk(KERN_INFO "MIPS: machine is %s\n", mips_machine_name); 
    124 + 
    125 +       if (mach->mach_setup) 
    126 +               mach->mach_setup(); 
     137+ 
     138+       mips_set_machine_name(mips_machine->mach_name); 
     139+       pr_info("MIPS: machine is %s\n", mips_machine_name); 
     140+ 
     141+       if (mips_machine->mach_setup) 
     142+               mips_machine->mach_setup(); 
    127143+} 
    128144--- a/arch/mips/kernel/Makefile 
     
    165181+       if (n == 0) { 
    166182                seq_printf(m, "system type\t\t: %s\n", get_system_type()); 
    167 +#ifdef CONFIG_MIPS_MACHINE 
    168 +               seq_printf(m, "machine\t\t\t: %s\n", mips_machine_name); 
    169 +#endif 
     183+               if (mips_get_machine_name()) 
     184+                       seq_printf(m, "machine\t\t\t: %s\n", 
     185+                                  mips_get_machine_name()); 
    170186+       } 
    171187  
    172188        seq_printf(m, "processor\t\t: %ld\n", n); 
    173189        sprintf(fmt, "cpu model\t\t: %%s V%%d.%%d%s\n", 
     190--- a/arch/mips/kernel/vmlinux.lds.S 
     191+++ b/arch/mips/kernel/vmlinux.lds.S 
     192@@ -98,6 +98,13 @@ SECTIONS 
     193        INIT_TEXT_SECTION(PAGE_SIZE) 
     194        INIT_DATA_SECTION(16) 
     195  
     196+       . = ALIGN(4); 
     197+       .mips.machines.init : AT(ADDR(.mips.machines.init) - LOAD_OFFSET) { 
     198+               __mips_machines_start = .; 
     199+               *(.mips.machines.init) 
     200+               __mips_machines_end = .; 
     201+       } 
     202+ 
     203        /* .exit.text is discarded at runtime, not link time, to deal with 
     204         * references from .rodata 
     205         */ 
Note: See TracChangeset for help on using the changeset viewer.