brcm2708: switch to linux 4.9
[lede.git] / target / linux / brcm2708 / patches-4.4 / 0089-scripts-Multi-platform-support-for-mkknlimg-and-knli.patch
1 From 0fda3a1eb42445783633e477f261575222c3470b Mon Sep 17 00:00:00 2001
2 From: Phil Elwell <phil@raspberrypi.org>
3 Date: Wed, 11 Nov 2015 11:38:59 +0000
4 Subject: [PATCH] scripts: Multi-platform support for mkknlimg and knlinfo
5
6 The firmware uses tags in the kernel trailer to choose which dtb file
7 to load. Current firmware loads bcm2835-*.dtb if the '283x' tag is true,
8 otherwise it loads bcm270*.dtb. This scheme breaks if an image supports
9 multiple platforms.
10
11 This patch adds '270X' and '283X' tags to indicate support for RPi and
12 upstream platforms, respectively. '283x' (note lower case 'x') is left
13 for old firmware, and is only set if the image only supports upstream
14 builds.
15 ---
16  scripts/knlinfo  |   2 +
17  scripts/mkknlimg | 136 +++++++++++++++++++++++++++++++------------------------
18  2 files changed, 80 insertions(+), 58 deletions(-)
19
20 --- a/scripts/knlinfo
21 +++ b/scripts/knlinfo
22 @@ -18,6 +18,8 @@ my %atom_formats =
23  (
24      'DTOK' => \&format_bool,
25      'KVer' => \&format_string,
26 +    '270X' => \&format_bool,
27 +    '283X' => \&format_bool,
28      '283x' => \&format_bool,
29  );
30  
31 --- a/scripts/mkknlimg
32 +++ b/scripts/mkknlimg
33 @@ -13,12 +13,20 @@ use strict;
34  use warnings;
35  use integer;
36  
37 +use constant FLAG_PI   => 0x01;
38 +use constant FLAG_DTOK => 0x02;
39 +use constant FLAG_DDTK => 0x04;
40 +use constant FLAG_270X => 0x08;
41 +use constant FLAG_283X => 0x10;
42 +
43  my $trailer_magic = 'RPTL';
44  
45  my $tmpfile1 = "/tmp/mkknlimg_$$.1";
46  my $tmpfile2 = "/tmp/mkknlimg_$$.2";
47  
48  my $dtok = 0;
49 +my $ddtk = 0;
50 +my $is_270x = 0;
51  my $is_283x = 0;
52  
53  while (@ARGV && ($ARGV[0] =~ /^-/))
54 @@ -28,6 +36,14 @@ while (@ARGV && ($ARGV[0] =~ /^-/))
55      {
56         $dtok = 1;
57      }
58 +    elsif ($arg eq '--ddtk')
59 +    {
60 +       $ddtk = 1;
61 +    }
62 +    elsif ($arg eq '--270x')
63 +    {
64 +       $is_270x = 1;
65 +    }
66      elsif ($arg eq '--283x')
67      {
68         $is_283x = 1;
69 @@ -50,30 +66,33 @@ if (! -r $kernel_file)
70      usage();
71  }
72  
73 -my @wanted_strings =
74 -(
75 -       'bcm2708_fb',
76 -       'brcm,bcm2835-mmc',
77 -       'brcm,bcm2835-sdhost',
78 -       'brcm,bcm2708-pinctrl',
79 -       'brcm,bcm2835-gpio',
80 -       'brcm,bcm2835',
81 -       'brcm,bcm2836'
82 -);
83 +my $wanted_strings =
84 +{
85 +       'bcm2708_fb' => FLAG_PI,
86 +       'brcm,bcm2835-mmc' => FLAG_PI,
87 +       'brcm,bcm2835-sdhost' => FLAG_PI,
88 +       'brcm,bcm2708-pinctrl' => FLAG_PI | FLAG_DTOK,
89 +       'brcm,bcm2835-gpio' => FLAG_PI | FLAG_DTOK,
90 +       'brcm,bcm2708' => FLAG_PI | FLAG_DTOK | FLAG_270X,
91 +       'brcm,bcm2709' => FLAG_PI | FLAG_DTOK | FLAG_270X,
92 +       'brcm,bcm2835' => FLAG_PI | FLAG_DTOK | FLAG_283X,
93 +       'brcm,bcm2836' => FLAG_PI | FLAG_DTOK | FLAG_283X,
94 +       'of_overlay_apply' => FLAG_DTOK | FLAG_DDTK,
95 +};
96  
97  my $res = try_extract($kernel_file, $tmpfile1);
98 -$res = try_decompress('\037\213\010', 'xy',    'gunzip', 0,
99 -                     $kernel_file, $tmpfile1, $tmpfile2) if (!$res);
100 -$res = try_decompress('\3757zXZ\000', 'abcde', 'unxz --single-stream', -1,
101 -                     $kernel_file, $tmpfile1, $tmpfile2) if (!$res);
102 -$res = try_decompress('BZh',          'xy',    'bunzip2', 0,
103 -                     $kernel_file, $tmpfile1, $tmpfile2) if (!$res);
104 -$res = try_decompress('\135\0\0\0',   'xxx',   'unlzma', 0,
105 -                     $kernel_file, $tmpfile1, $tmpfile2) if (!$res);
106 -$res = try_decompress('\211\114\132', 'xy',    'lzop -d', 0,
107 -                     $kernel_file, $tmpfile1, $tmpfile2) if (!$res);
108 -$res = try_decompress('\002\041\114\030', 'xy',    'lz4 -d', 1,
109 -                     $kernel_file, $tmpfile1, $tmpfile2) if (!$res);
110 +$res ||= try_decompress('\037\213\010', 'xy',    'gunzip', 0,
111 +                       $kernel_file, $tmpfile1, $tmpfile2);
112 +$res ||= try_decompress('\3757zXZ\000', 'abcde', 'unxz --single-stream', -1,
113 +                       $kernel_file, $tmpfile1, $tmpfile2);
114 +$res ||= try_decompress('BZh',          'xy',    'bunzip2', 0,
115 +                       $kernel_file, $tmpfile1, $tmpfile2);
116 +$res ||= try_decompress('\135\0\0\0',   'xxx',   'unlzma', 0,
117 +                       $kernel_file, $tmpfile1, $tmpfile2);
118 +$res ||= try_decompress('\211\114\132', 'xy',    'lzop -d', 0,
119 +                       $kernel_file, $tmpfile1, $tmpfile2);
120 +$res ||= try_decompress('\002\041\114\030', 'xy',    'lz4 -d', 1,
121 +                       $kernel_file, $tmpfile1, $tmpfile2);
122  
123  my $append_trailer;
124  my $trailer;
125 @@ -83,27 +102,21 @@ $append_trailer = $dtok;
126  
127  if ($res)
128  {
129 -    $kver = $res->{''} || '?';
130 +    $kver = $res->{'kver'} || '?';
131 +    my $flags = $res->{'flags'};
132      print("Version: $kver\n");
133  
134 -    $append_trailer = $dtok;
135 -    if (!$dtok)
136 +    if ($flags & FLAG_PI)
137      {
138 -       if (config_bool($res, 'bcm2708_fb') ||
139 -           config_bool($res, 'brcm,bcm2835-mmc') ||
140 -           config_bool($res, 'brcm,bcm2835-sdhost'))
141 -       {
142 -           $dtok ||= config_bool($res, 'brcm,bcm2708-pinctrl');
143 -           $dtok ||= config_bool($res, 'brcm,bcm2835-gpio');
144 -           $is_283x ||= config_bool($res, 'brcm,bcm2835');
145 -           $is_283x ||= config_bool($res, 'brcm,bcm2836');
146 -           $dtok ||= $is_283x;
147 -           $append_trailer = 1;
148 -       }
149 -       else
150 -       {
151 -           print ("* This doesn't look like a Raspberry Pi kernel. In pass-through mode.\n");
152 -       }
153 +       $append_trailer = 1;
154 +       $dtok ||= ($flags & FLAG_DTOK) != 0;
155 +       $is_270x ||= ($flags & FLAG_270X) != 0;
156 +       $is_283x ||= ($flags & FLAG_283X) != 0;
157 +       $ddtk ||= ($flags & FLAG_DDTK) != 0;
158 +    }
159 +    else
160 +    {
161 +       print ("* This doesn't look like a Raspberry Pi kernel. In pass-through mode.\n");
162      }
163  }
164  elsif (!$dtok)
165 @@ -114,6 +127,8 @@ elsif (!$dtok)
166  if ($append_trailer)
167  {
168      printf("DT: %s\n", $dtok ? "y" : "n");
169 +    printf("DDT: %s\n", $ddtk ? "y" : "n") if ($ddtk);
170 +    printf("270x: %s\n", $is_270x ? "y" : "n");
171      printf("283x: %s\n", $is_283x ? "y" : "n");
172  
173      my @atoms;
174 @@ -121,7 +136,10 @@ if ($append_trailer)
175      push @atoms, [ $trailer_magic, pack('V', 0) ];
176      push @atoms, [ 'KVer', $kver ];
177      push @atoms, [ 'DTOK', pack('V', $dtok) ];
178 -    push @atoms, [ '283x', pack('V', $is_283x) ];
179 +    push @atoms, [ 'DDTK', pack('V', $ddtk) ] if ($ddtk);
180 +    push @atoms, [ '270X', pack('V', $is_270x) ];
181 +    push @atoms, [ '283X', pack('V', $is_283x) ];
182 +    push @atoms, [ '283x', pack('V', $is_283x && !$is_270x) ];
183  
184      $trailer = pack_trailer(\@atoms);
185      $atoms[0]->[1] = pack('V', length($trailer));
186 @@ -175,7 +193,7 @@ END {
187  
188  sub usage
189  {
190 -       print ("Usage: mkknlimg [--dtok] [--283x] <vmlinux|zImage|bzImage> <outfile>\n");
191 +       print ("Usage: mkknlimg [--dtok] [--270x] [--283x] <vmlinux|zImage|bzImage> <outfile>\n");
192         exit(1);
193  }
194  
195 @@ -189,15 +207,8 @@ sub try_extract
196  
197         chomp($ver);
198  
199 -       my $res = { ''=>$ver };
200 -       my $string_pattern = '^('.join('|', @wanted_strings).')$';
201 -
202 -       my @matches = `strings \"$knl\" | grep -E \"$string_pattern\"`;
203 -       foreach my $match (@matches)
204 -       {
205 -           chomp($match);
206 -           $res->{$match} = 1;
207 -       }
208 +       my $res = { 'kver'=>$ver };
209 +       $res->{'flags'} = strings_to_flags($knl, $wanted_strings);
210  
211         return $res;
212  }
213 @@ -224,6 +235,22 @@ sub try_decompress
214         return undef;
215  }
216  
217 +sub strings_to_flags
218 +{
219 +       my ($knl, $strings) = @_;
220 +       my $string_pattern = '^('.join('|', keys(%$strings)).')$';
221 +       my $flags = 0;
222 +
223 +       my @matches = `strings \"$knl\" | grep -E \"$string_pattern\"`;
224 +       foreach my $match (@matches)
225 +       {
226 +           chomp($match);
227 +           $flags |= $strings->{$match};
228 +       }
229 +
230 +       return $flags;
231 +}
232 +
233  sub pack_trailer
234  {
235         my ($atoms) = @_;
236 @@ -235,10 +262,3 @@ sub pack_trailer
237         }
238         return $trailer;
239  }
240 -
241 -sub config_bool
242 -{
243 -       my ($configs, $wanted) = @_;
244 -       my $val = $configs->{$wanted} || 'n';
245 -       return (($val eq 'y') || ($val eq '1'));
246 -}