Conflicts: block/cfq-iosched.c
Unified · Split
| @@ -23,6 +23,7 @@ Andy Adamson <andros@citi.umich.edu> · 22 unmodified lines | ||
| 23 | 23 | Arnaud Patard <arnaud.patard@rtp-net.org> |
| 24 | 24 | Arnd Bergmann <arnd@arndb.de> |
| 25 | 25 | Axel Dyks <xl@xlsigned.net> |
| 26 | +Axel Lin <axel.lin@gmail.com> | |
| 26 | 27 | Ben Gardner <bgardner@wabtec.com> |
| 27 | 28 | Ben M Cahill <ben.m.cahill@intel.com> |
| 28 | 29 | Björn Steinbrink <B.Steinbrink@gmx.de> |
| @@ -105,3 +106,4 @@ Uwe Kleine-König <ukleinek@informatik.uni-freiburg.de> · 76 unmodified lines | ||
| 105 | 106 | Uwe Kleine-König <ukl@pengutronix.de> |
| 106 | 107 | Uwe Kleine-König <Uwe.Kleine-Koenig@digi.com> |
| 107 | 108 | Valdis Kletnieks <Valdis.Kletnieks@vt.edu> |
| 109 | +Takashi YOSHII <takashi.yoshii.zj@renesas.com> | |
| @@ -2365,8 +2365,6 @@ E: acme@redhat.com · 2364 unmodified lines | ||
| 2365 | 2365 | W: http://oops.ghostprotocols.net:81/blog/ |
| 2366 | 2366 | P: 1024D/9224DF01 D5DF E3BB E3C8 BCBB F8AD 841A B6AB 4681 9224 DF01 |
| 2367 | 2367 | D: IPX, LLC, DCCP, cyc2x, wl3501_cs, net/ hacks |
| 2368 | −S: R. Brasílio Itiberê, 4270/1010 - Água Verde | |
| 2369 | −S: 80240-060 - Curitiba - Paraná | |
| 2370 | 2368 | S: Brazil |
| 2371 | 2369 | |
| 2372 | 2370 | N: Karsten Merker |
| @@ -2813,8 +2811,8 @@ D: CDROM driver "sonycd535" (Sony CDU-535/531) · 440 unmodified lines | ||
| 2813 | 2811 | N: Stelian Pop |
| 2814 | 2812 | E: stelian@popies.net |
| 2815 | 2813 | P: 1024D/EDBB6147 7B36 0E07 04BC 11DC A7A0 D3F7 7185 9E7A EDBB 6147 |
| 2816 | −D: sonypi, meye drivers, mct_u232 usb serial hacks | |
| 2817 | −S: Paris, France | |
| 2814 | +D: random kernel hacks | |
| 2815 | +S: Paimpont, France | |
| 2818 | 2816 | |
| 2819 | 2817 | N: Pete Popov |
| 2820 | 2818 | E: pete_popov@yahoo.com |
| @@ -0,0 +1,4 @@ | ||
| 1 | +What: A notification mechanism for thermal related events | |
| 2 | +Description: | |
| 3 | + This interface enables notification for thermal related events. | |
| 4 | + The notification is in the form of a netlink event. | |
| @@ -26,3 +26,12 @@ Description: · 25 unmodified lines | ||
| 26 | 26 | scheduler is chosen. Trigger specific parameters can appear in |
| 27 | 27 | /sys/class/leds/<led> once a given trigger is selected. |
| 28 | 28 | |
| 29 | +What: /sys/class/leds/<led>/inverted | |
| 30 | +Date: January 2011 | |
| 31 | +KernelVersion: 2.6.38 | |
| 32 | +Contact: Richard Purdie <rpurdie@rpsys.net> | |
| 33 | +Description: | |
| 34 | + Invert the LED on/off state. This parameter is specific to | |
| 35 | + gpio and backlight triggers. In case of the backlight trigger, | |
| 36 | + it is usefull when driving a LED which is intended to indicate | |
| 37 | + a device in a standby like state. | |
File renamed without changes.
| @@ -22,6 +22,27 @@ Description: · 21 unmodified lines | ||
| 22 | 22 | mesh will be fragmented or silently discarded if the |
| 23 | 23 | packet size exceeds the outgoing interface MTU. |
| 24 | 24 | |
| 25 | +What: /sys/class/net/<mesh_iface>/mesh/gw_bandwidth | |
| 26 | +Date: October 2010 | |
| 27 | +Contact: Marek Lindner <lindner_marek@yahoo.de> | |
| 28 | +Description: | |
| 29 | + Defines the bandwidth which is propagated by this | |
| 30 | + node if gw_mode was set to 'server'. | |
| 31 | + | |
| 32 | +What: /sys/class/net/<mesh_iface>/mesh/gw_mode | |
| 33 | +Date: October 2010 | |
| 34 | +Contact: Marek Lindner <lindner_marek@yahoo.de> | |
| 35 | +Description: | |
| 36 | + Defines the state of the gateway features. Can be | |
| 37 | + either 'off', 'client' or 'server'. | |
| 38 | + | |
| 39 | +What: /sys/class/net/<mesh_iface>/mesh/gw_sel_class | |
| 40 | +Date: October 2010 | |
| 41 | +Contact: Marek Lindner <lindner_marek@yahoo.de> | |
| 42 | +Description: | |
| 43 | + Defines the selection criteria this node will use | |
| 44 | + to choose a gateway if gw_mode was set to 'client'. | |
| 45 | + | |
| 25 | 46 | What: /sys/class/net/<mesh_iface>/mesh/orig_interval |
| 26 | 47 | Date: May 2010 |
| 27 | 48 | Contact: Marek Lindner <lindner_marek@yahoo.de> |
| @@ -29,6 +50,13 @@ Description: · 1 unmodified line | ||
| 29 | 50 | Defines the interval in milliseconds in which batman |
| 30 | 51 | sends its protocol messages. |
| 31 | 52 | |
| 53 | +What: /sys/class/net/<mesh_iface>/mesh/hop_penalty | |
| 54 | +Date: Oct 2010 | |
| 55 | +Contact: Linus Lüssing <linus.luessing@web.de> | |
| 56 | +Description: | |
| 57 | + Defines the penalty which will be applied to an | |
| 58 | + originator message's tq-field on every hop. | |
| 59 | + | |
| 32 | 60 | What: /sys/class/net/<mesh_iface>/mesh/vis_mode |
| 33 | 61 | Date: May 2010 |
| 34 | 62 | Contact: Marek Lindner <lindner_marek@yahoo.de> |
| @@ -1,4 +1,4 @@ | ||
| 1 | −What: /sys/bus/usb/devices/<busnum>-<devnum>:<config num>.<interface num>/actual_dpi | |
| 1 | +What: /sys/bus/usb/devices/<busnum>-<devnum>:<config num>.<interface num>/<hid-bus>:<vendor-id>:<product-id>.<num>/kone/roccatkone<minor>/actual_dpi | |
| 2 | 2 | Date: March 2010 |
| 3 | 3 | Contact: Stefan Achatz <erazor_de@users.sourceforge.net> |
| 4 | 4 | Description: It is possible to switch the dpi setting of the mouse with the |
| @@ -17,13 +17,13 @@ Description: It is possible to switch the dpi setting of the mouse with the · 12 unmodified lines | ||
| 17 | 17 | |
| 18 | 18 | This file is readonly. |
| 19 | 19 | |
| 20 | −What: /sys/bus/usb/devices/<busnum>-<devnum>:<config num>.<interface num>/actual_profile | |
| 20 | +What: /sys/bus/usb/devices/<busnum>-<devnum>:<config num>.<interface num>/<hid-bus>:<vendor-id>:<product-id>.<num>/kone/roccatkone<minor>/actual_profile | |
| 21 | 21 | Date: March 2010 |
| 22 | 22 | Contact: Stefan Achatz <erazor_de@users.sourceforge.net> |
| 23 | 23 | Description: When read, this file returns the number of the actual profile. |
| 24 | 24 | This file is readonly. |
| 25 | 25 | |
| 26 | −What: /sys/bus/usb/devices/<busnum>-<devnum>:<config num>.<interface num>/firmware_version | |
| 26 | +What: /sys/bus/usb/devices/<busnum>-<devnum>:<config num>.<interface num>/<hid-bus>:<vendor-id>:<product-id>.<num>/kone/roccatkone<minor>/firmware_version | |
| 27 | 27 | Date: March 2010 |
| 28 | 28 | Contact: Stefan Achatz <erazor_de@users.sourceforge.net> |
| 29 | 29 | Description: When read, this file returns the raw integer version number of the |
| @@ -33,7 +33,7 @@ Description: When read, this file returns the raw integer version number of the · 3 unmodified lines | ||
| 33 | 33 | left. E.g. a returned value of 138 means 1.38 |
| 34 | 34 | This file is readonly. |
| 35 | 35 | |
| 36 | −What: /sys/bus/usb/devices/<busnum>-<devnum>:<config num>.<interface num>/profile[1-5] | |
| 36 | +What: /sys/bus/usb/devices/<busnum>-<devnum>:<config num>.<interface num>/<hid-bus>:<vendor-id>:<product-id>.<num>/kone/roccatkone<minor>/profile[1-5] | |
| 37 | 37 | Date: March 2010 |
| 38 | 38 | Contact: Stefan Achatz <erazor_de@users.sourceforge.net> |
| 39 | 39 | Description: The mouse can store 5 profiles which can be switched by the |
| @@ -48,7 +48,7 @@ Description: The mouse can store 5 profiles which can be switched by the · 8 unmodified lines | ||
| 48 | 48 | stored in the profile doesn't need to fit the number of the |
| 49 | 49 | store. |
| 50 | 50 | |
| 51 | −What: /sys/bus/usb/devices/<busnum>-<devnum>:<config num>.<interface num>/settings | |
| 51 | +What: /sys/bus/usb/devices/<busnum>-<devnum>:<config num>.<interface num>/<hid-bus>:<vendor-id>:<product-id>.<num>/kone/roccatkone<minor>/settings | |
| 52 | 52 | Date: March 2010 |
| 53 | 53 | Contact: Stefan Achatz <erazor_de@users.sourceforge.net> |
| 54 | 54 | Description: When read, this file returns the settings stored in the mouse. |
| @@ -58,7 +58,7 @@ Description: When read, this file returns the settings stored in the mouse. · 3 unmodified lines | ||
| 58 | 58 | The data has to be 36 bytes long. The mouse will reject invalid |
| 59 | 59 | data. |
| 60 | 60 | |
| 61 | −What: /sys/bus/usb/devices/<busnum>-<devnum>:<config num>.<interface num>/startup_profile | |
| 61 | +What: /sys/bus/usb/devices/<busnum>-<devnum>:<config num>.<interface num>/<hid-bus>:<vendor-id>:<product-id>.<num>/kone/roccatkone<minor>/startup_profile | |
| 62 | 62 | Date: March 2010 |
| 63 | 63 | Contact: Stefan Achatz <erazor_de@users.sourceforge.net> |
| 64 | 64 | Description: The integer value of this attribute ranges from 1 to 5. |
| @@ -67,7 +67,7 @@ Description: The integer value of this attribute ranges from 1 to 5. · 2 unmodified lines | ||
| 67 | 67 | When written, this file sets the number of the startup profile |
| 68 | 68 | and the mouse activates this profile immediately. |
| 69 | 69 | |
| 70 | −What: /sys/bus/usb/devices/<busnum>-<devnum>:<config num>.<interface num>/tcu | |
| 70 | +What: /sys/bus/usb/devices/<busnum>-<devnum>:<config num>.<interface num>/<hid-bus>:<vendor-id>:<product-id>.<num>/kone/roccatkone<minor>/tcu | |
| 71 | 71 | Date: March 2010 |
| 72 | 72 | Contact: Stefan Achatz <erazor_de@users.sourceforge.net> |
| 73 | 73 | Description: The mouse has a "Tracking Control Unit" which lets the user |
| @@ -78,7 +78,7 @@ Description: The mouse has a "Tracking Control Unit" which lets the user · 4 unmodified lines | ||
| 78 | 78 | Writing 1 in this file will start the calibration which takes |
| 79 | 79 | around 6 seconds to complete and activates the TCU. |
| 80 | 80 | |
| 81 | −What: /sys/bus/usb/devices/<busnum>-<devnum>:<config num>.<interface num>/weight | |
| 81 | +What: /sys/bus/usb/devices/<busnum>-<devnum>:<config num>.<interface num>/<hid-bus>:<vendor-id>:<product-id>.<num>/kone/roccatkone<minor>/weight | |
| 82 | 82 | Date: March 2010 |
| 83 | 83 | Contact: Stefan Achatz <erazor_de@users.sourceforge.net> |
| 84 | 84 | Description: The mouse can be equipped with one of four supplied weights |
| @@ -0,0 +1,108 @@ | ||
| 1 | +What: /sys/bus/usb/devices/<busnum>-<devnum>:<config num>.<interface num>/<hid-bus>:<vendor-id>:<product-id>.<num>/koneplus/roccatkoneplus<minor>/actual_profile | |
| 2 | +Date: October 2010 | |
| 3 | +Contact: Stefan Achatz <erazor_de@users.sourceforge.net> | |
| 4 | +Description: When read, this file returns the number of the actual profile in | |
| 5 | + range 0-4. | |
| 6 | + This file is readonly. | |
| 7 | + | |
| 8 | +What: /sys/bus/usb/devices/<busnum>-<devnum>:<config num>.<interface num>/<hid-bus>:<vendor-id>:<product-id>.<num>/koneplus/roccatkoneplus<minor>/firmware_version | |
| 9 | +Date: October 2010 | |
| 10 | +Contact: Stefan Achatz <erazor_de@users.sourceforge.net> | |
| 11 | +Description: When read, this file returns the raw integer version number of the | |
| 12 | + firmware reported by the mouse. Using the integer value eases | |
| 13 | + further usage in other programs. To receive the real version | |
| 14 | + number the decimal point has to be shifted 2 positions to the | |
| 15 | + left. E.g. a returned value of 121 means 1.21 | |
| 16 | + This file is readonly. | |
| 17 | + | |
| 18 | +What: /sys/bus/usb/devices/<busnum>-<devnum>:<config num>.<interface num>/<hid-bus>:<vendor-id>:<product-id>.<num>/koneplus/roccatkoneplus<minor>/macro | |
| 19 | +Date: October 2010 | |
| 20 | +Contact: Stefan Achatz <erazor_de@users.sourceforge.net> | |
| 21 | +Description: The mouse can store a macro with max 500 key/button strokes | |
| 22 | + internally. | |
| 23 | + When written, this file lets one set the sequence for a specific | |
| 24 | + button for a specific profile. Button and profile numbers are | |
| 25 | + included in written data. The data has to be 2082 bytes long. | |
| 26 | + This file is writeonly. | |
| 27 | + | |
| 28 | +What: /sys/bus/usb/devices/<busnum>-<devnum>:<config num>.<interface num>/<hid-bus>:<vendor-id>:<product-id>.<num>/koneplus/roccatkoneplus<minor>/profile_buttons | |
| 29 | +Date: August 2010 | |
| 30 | +Contact: Stefan Achatz <erazor_de@users.sourceforge.net> | |
| 31 | +Description: The mouse can store 5 profiles which can be switched by the | |
| 32 | + press of a button. A profile is split in settings and buttons. | |
| 33 | + profile_buttons holds informations about button layout. | |
| 34 | + When written, this file lets one write the respective profile | |
| 35 | + buttons back to the mouse. The data has to be 77 bytes long. | |
| 36 | + The mouse will reject invalid data. | |
| 37 | + Which profile to write is determined by the profile number | |
| 38 | + contained in the data. | |
| 39 | + This file is writeonly. | |
| 40 | + | |
| 41 | +What: /sys/bus/usb/devices/<busnum>-<devnum>:<config num>.<interface num>/<hid-bus>:<vendor-id>:<product-id>.<num>/koneplus/roccatkoneplus<minor>/profile[1-5]_buttons | |
| 42 | +Date: August 2010 | |
| 43 | +Contact: Stefan Achatz <erazor_de@users.sourceforge.net> | |
| 44 | +Description: The mouse can store 5 profiles which can be switched by the | |
| 45 | + press of a button. A profile is split in settings and buttons. | |
| 46 | + profile_buttons holds informations about button layout. | |
| 47 | + When read, these files return the respective profile buttons. | |
| 48 | + The returned data is 77 bytes in size. | |
| 49 | + This file is readonly. | |
| 50 | + | |
| 51 | +What: /sys/bus/usb/devices/<busnum>-<devnum>:<config num>.<interface num>/<hid-bus>:<vendor-id>:<product-id>.<num>/koneplus/roccatkoneplus<minor>/profile_settings | |
| 52 | +Date: October 2010 | |
| 53 | +Contact: Stefan Achatz <erazor_de@users.sourceforge.net> | |
| 54 | +Description: The mouse can store 5 profiles which can be switched by the | |
| 55 | + press of a button. A profile is split in settings and buttons. | |
| 56 | + profile_settings holds informations like resolution, sensitivity | |
| 57 | + and light effects. | |
| 58 | + When written, this file lets one write the respective profile | |
| 59 | + settings back to the mouse. The data has to be 43 bytes long. | |
| 60 | + The mouse will reject invalid data. | |
| 61 | + Which profile to write is determined by the profile number | |
| 62 | + contained in the data. | |
| 63 | + This file is writeonly. | |
| 64 | + | |
| 65 | +What: /sys/bus/usb/devices/<busnum>-<devnum>:<config num>.<interface num>/<hid-bus>:<vendor-id>:<product-id>.<num>/koneplus/roccatkoneplus<minor>/profile[1-5]_settings | |
| 66 | +Date: August 2010 | |
| 67 | +Contact: Stefan Achatz <erazor_de@users.sourceforge.net> | |
| 68 | +Description: The mouse can store 5 profiles which can be switched by the | |
| 69 | + press of a button. A profile is split in settings and buttons. | |
| 70 | + profile_settings holds informations like resolution, sensitivity | |
| 71 | + and light effects. | |
| 72 | + When read, these files return the respective profile settings. | |
| 73 | + The returned data is 43 bytes in size. | |
| 74 | + This file is readonly. | |
| 75 | + | |
| 76 | +What: /sys/bus/usb/devices/<busnum>-<devnum>:<config num>.<interface num>/<hid-bus>:<vendor-id>:<product-id>.<num>/koneplus/roccatkoneplus<minor>/sensor | |
| 77 | +Date: October 2010 | |
| 78 | +Contact: Stefan Achatz <erazor_de@users.sourceforge.net> | |
| 79 | +Description: The mouse has a tracking- and a distance-control-unit. These | |
| 80 | + can be activated/deactivated and the lift-off distance can be | |
| 81 | + set. The data has to be 6 bytes long. | |
| 82 | + This file is writeonly. | |
| 83 | + | |
| 84 | +What: /sys/bus/usb/devices/<busnum>-<devnum>:<config num>.<interface num>/<hid-bus>:<vendor-id>:<product-id>.<num>/koneplus/roccatkoneplus<minor>/startup_profile | |
| 85 | +Date: October 2010 | |
| 86 | +Contact: Stefan Achatz <erazor_de@users.sourceforge.net> | |
| 87 | +Description: The integer value of this attribute ranges from 0-4. | |
| 88 | + When read, this attribute returns the number of the profile | |
| 89 | + that's active when the mouse is powered on. | |
| 90 | + When written, this file sets the number of the startup profile | |
| 91 | + and the mouse activates this profile immediately. | |
| 92 | + | |
| 93 | +What: /sys/bus/usb/devices/<busnum>-<devnum>:<config num>.<interface num>/<hid-bus>:<vendor-id>:<product-id>.<num>/koneplus/roccatkoneplus<minor>/tcu | |
| 94 | +Date: October 2010 | |
| 95 | +Contact: Stefan Achatz <erazor_de@users.sourceforge.net> | |
| 96 | +Description: When written a calibration process for the tracking control unit | |
| 97 | + can be initiated/cancelled. | |
| 98 | + The data has to be 3 bytes long. | |
| 99 | + This file is writeonly. | |
| 100 | + | |
| 101 | +What: /sys/bus/usb/devices/<busnum>-<devnum>:<config num>.<interface num>/<hid-bus>:<vendor-id>:<product-id>.<num>/koneplus/roccatkoneplus<minor>/tcu_image | |
| 102 | +Date: October 2010 | |
| 103 | +Contact: Stefan Achatz <erazor_de@users.sourceforge.net> | |
| 104 | +Description: When read the mouse returns a 30x30 pixel image of the | |
| 105 | + sampled underground. This works only in the course of a | |
| 106 | + calibration process initiated with tcu. | |
| 107 | + The returned data is 1028 bytes in size. | |
| 108 | + This file is readonly. | |
| @@ -1,4 +1,4 @@ | ||
| 1 | −What: /sys/bus/usb/devices/<busnum>-<devnum>:<config num>.<interface num>/actual_cpi | |
| 1 | +What: /sys/bus/usb/devices/<busnum>-<devnum>:<config num>.<interface num>/<hid-bus>:<vendor-id>:<product-id>.<num>/pyra/roccatpyra<minor>/actual_cpi | |
| 2 | 2 | Date: August 2010 |
| 3 | 3 | Contact: Stefan Achatz <erazor_de@users.sourceforge.net> |
| 4 | 4 | Description: It is possible to switch the cpi setting of the mouse with the |
| @@ -14,14 +14,14 @@ Description: It is possible to switch the cpi setting of the mouse with the · 9 unmodified lines | ||
| 14 | 14 | |
| 15 | 15 | This file is readonly. |
| 16 | 16 | |
| 17 | −What: /sys/bus/usb/devices/<busnum>-<devnum>:<config num>.<interface num>/actual_profile | |
| 17 | +What: /sys/bus/usb/devices/<busnum>-<devnum>:<config num>.<interface num>/<hid-bus>:<vendor-id>:<product-id>.<num>/pyra/roccatpyra<minor>/actual_profile | |
| 18 | 18 | Date: August 2010 |
| 19 | 19 | Contact: Stefan Achatz <erazor_de@users.sourceforge.net> |
| 20 | 20 | Description: When read, this file returns the number of the actual profile in |
| 21 | 21 | range 0-4. |
| 22 | 22 | This file is readonly. |
| 23 | 23 | |
| 24 | −What: /sys/bus/usb/devices/<busnum>-<devnum>:<config num>.<interface num>/firmware_version | |
| 24 | +What: /sys/bus/usb/devices/<busnum>-<devnum>:<config num>.<interface num>/<hid-bus>:<vendor-id>:<product-id>.<num>/pyra/roccatpyra<minor>/firmware_version | |
| 25 | 25 | Date: August 2010 |
| 26 | 26 | Contact: Stefan Achatz <erazor_de@users.sourceforge.net> |
| 27 | 27 | Description: When read, this file returns the raw integer version number of the |
| @@ -31,7 +31,7 @@ Description: When read, this file returns the raw integer version number of the · 3 unmodified lines | ||
| 31 | 31 | left. E.g. a returned value of 138 means 1.38 |
| 32 | 32 | This file is readonly. |
| 33 | 33 | |
| 34 | −What: /sys/bus/usb/devices/<busnum>-<devnum>:<config num>.<interface num>/profile_settings | |
| 34 | +What: /sys/bus/usb/devices/<busnum>-<devnum>:<config num>.<interface num>/<hid-bus>:<vendor-id>:<product-id>.<num>/pyra/roccatpyra<minor>/profile_settings | |
| 35 | 35 | Date: August 2010 |
| 36 | 36 | Contact: Stefan Achatz <erazor_de@users.sourceforge.net> |
| 37 | 37 | Description: The mouse can store 5 profiles which can be switched by the |
| @@ -45,7 +45,7 @@ Description: The mouse can store 5 profiles which can be switched by the · 7 unmodified lines | ||
| 45 | 45 | contained in the data. |
| 46 | 46 | This file is writeonly. |
| 47 | 47 | |
| 48 | −What: /sys/bus/usb/devices/<busnum>-<devnum>:<config num>.<interface num>/profile[1-5]_settings | |
| 48 | +What: /sys/bus/usb/devices/<busnum>-<devnum>:<config num>.<interface num>/<hid-bus>:<vendor-id>:<product-id>.<num>/pyra/roccatpyra<minor>/profile[1-5]_settings | |
| 49 | 49 | Date: August 2010 |
| 50 | 50 | Contact: Stefan Achatz <erazor_de@users.sourceforge.net> |
| 51 | 51 | Description: The mouse can store 5 profiles which can be switched by the |
| @@ -56,7 +56,7 @@ Description: The mouse can store 5 profiles which can be switched by the · 4 unmodified lines | ||
| 56 | 56 | The returned data is 13 bytes in size. |
| 57 | 57 | This file is readonly. |
| 58 | 58 | |
| 59 | −What: /sys/bus/usb/devices/<busnum>-<devnum>:<config num>.<interface num>/profile_buttons | |
| 59 | +What: /sys/bus/usb/devices/<busnum>-<devnum>:<config num>.<interface num>/<hid-bus>:<vendor-id>:<product-id>.<num>/pyra/roccatpyra<minor>/profile_buttons | |
| 60 | 60 | Date: August 2010 |
| 61 | 61 | Contact: Stefan Achatz <erazor_de@users.sourceforge.net> |
| 62 | 62 | Description: The mouse can store 5 profiles which can be switched by the |
| @@ -69,7 +69,7 @@ Description: The mouse can store 5 profiles which can be switched by the · 6 unmodified lines | ||
| 69 | 69 | contained in the data. |
| 70 | 70 | This file is writeonly. |
| 71 | 71 | |
| 72 | −What: /sys/bus/usb/devices/<busnum>-<devnum>:<config num>.<interface num>/profile[1-5]_buttons | |
| 72 | +What: /sys/bus/usb/devices/<busnum>-<devnum>:<config num>.<interface num>/<hid-bus>:<vendor-id>:<product-id>.<num>/pyra/roccatpyra<minor>/profile[1-5]_buttons | |
| 73 | 73 | Date: August 2010 |
| 74 | 74 | Contact: Stefan Achatz <erazor_de@users.sourceforge.net> |
| 75 | 75 | Description: The mouse can store 5 profiles which can be switched by the |
| @@ -79,7 +79,7 @@ Description: The mouse can store 5 profiles which can be switched by the · 3 unmodified lines | ||
| 79 | 79 | The returned data is 19 bytes in size. |
| 80 | 80 | This file is readonly. |
| 81 | 81 | |
| 82 | −What: /sys/bus/usb/devices/<busnum>-<devnum>:<config num>.<interface num>/startup_profile | |
| 82 | +What: /sys/bus/usb/devices/<busnum>-<devnum>:<config num>.<interface num>/<hid-bus>:<vendor-id>:<product-id>.<num>/pyra/roccatpyra<minor>/startup_profile | |
| 83 | 83 | Date: August 2010 |
| 84 | 84 | Contact: Stefan Achatz <erazor_de@users.sourceforge.net> |
| 85 | 85 | Description: The integer value of this attribute ranges from 0-4. |
| @@ -87,7 +87,7 @@ Description: The integer value of this attribute ranges from 0-4. · 1 unmodified line | ||
| 87 | 87 | that's active when the mouse is powered on. |
| 88 | 88 | This file is readonly. |
| 89 | 89 | |
| 90 | −What: /sys/bus/usb/devices/<busnum>-<devnum>:<config num>.<interface num>/settings | |
| 90 | +What: /sys/bus/usb/devices/<busnum>-<devnum>:<config num>.<interface num>/<hid-bus>:<vendor-id>:<product-id>.<num>/pyra/roccatpyra<minor>/settings | |
| 91 | 91 | Date: August 2010 |
| 92 | 92 | Contact: Stefan Achatz <erazor_de@users.sourceforge.net> |
| 93 | 93 | Description: When read, this file returns the settings stored in the mouse. |
| @@ -0,0 +1,25 @@ | ||
| 1 | +What: /sys/devices/platform/at91_can/net/<iface>/mb0_id | |
| 2 | +Date: January 2011 | |
| 3 | +KernelVersion: 2.6.38 | |
| 4 | +Contact: Marc Kleine-Budde <kernel@pengutronix.de> | |
| 5 | +Description: | |
| 6 | + Value representing the can_id of mailbox 0. | |
| 7 | + | |
| 8 | + Default: 0x7ff (standard frame) | |
| 9 | + | |
| 10 | + Due to a chip bug (errata 50.2.6.3 & 50.3.5.3 in | |
| 11 | + "AT91SAM9263 Preliminary 6249H-ATARM-27-Jul-09") the | |
| 12 | + contents of mailbox 0 may be send under certain | |
| 13 | + conditions (even if disabled or in rx mode). | |
| 14 | + | |
| 15 | + The workaround in the errata suggests not to use the | |
| 16 | + mailbox and load it with an unused identifier. | |
| 17 | + | |
| 18 | + In order to use an extended can_id add the | |
| 19 | + CAN_EFF_FLAG (0x80000000U) to the can_id. Example: | |
| 20 | + | |
| 21 | + - standard id 0x7ff: | |
| 22 | + echo 0x7ff > /sys/class/net/can0/mb0_id | |
| 23 | + | |
| 24 | + - extended id 0x1fffffff: | |
| 25 | + echo 0x9fffffff > /sys/class/net/can0/mb0_id | |
| @@ -0,0 +1,6 @@ | ||
| 1 | +What: /sys/devices/platform/ideapad/camera_power | |
| 2 | +Date: Dec 2010 | |
| 3 | +KernelVersion: 2.6.37 | |
| 4 | +Contact: "Ike Panhc <ike.pan@canonical.com>" | |
| 5 | +Description: | |
| 6 | + Control the power of camera module. 1 means on, 0 means off. | |
| @@ -0,0 +1,19 @@ | ||
| 1 | +What: /sys/class/tty/console/active | |
| 2 | +Date: Nov 2010 | |
| 3 | +Contact: Kay Sievers <kay.sievers@vrfy.org> | |
| 4 | +Description: | |
| 5 | + Shows the list of currently configured | |
| 6 | + console devices, like 'tty1 ttyS0'. | |
| 7 | + The last entry in the file is the active | |
| 8 | + device connected to /dev/console. | |
| 9 | + The file supports poll() to detect virtual | |
| 10 | + console switches. | |
| 11 | + | |
| 12 | +What: /sys/class/tty/tty0/active | |
| 13 | +Date: Nov 2010 | |
| 14 | +Contact: Kay Sievers <kay.sievers@vrfy.org> | |
| 15 | +Description: | |
| 16 | + Shows the currently active virtual console | |
| 17 | + device, like 'tty1'. | |
| 18 | + The file supports poll() to detect virtual | |
| 19 | + console switches. | |
| @@ -146,6 +146,7 @@ · 145 unmodified lines | ||
| 146 | 146 | !Finclude/net/cfg80211.h cfg80211_rx_mgmt |
| 147 | 147 | !Finclude/net/cfg80211.h cfg80211_mgmt_tx_status |
| 148 | 148 | !Finclude/net/cfg80211.h cfg80211_cqm_rssi_notify |
| 149 | +!Finclude/net/cfg80211.h cfg80211_cqm_pktloss_notify | |
| 149 | 150 | !Finclude/net/cfg80211.h cfg80211_michael_mic_failure |
| 150 | 151 | </chapter> |
| 151 | 152 | <chapter> |
| @@ -267,10 +268,6 @@ · 115 unmodified lines | ||
| 267 | 268 | !Finclude/net/mac80211.h ieee80211_ops |
| 268 | 269 | !Finclude/net/mac80211.h ieee80211_alloc_hw |
| 269 | 270 | !Finclude/net/mac80211.h ieee80211_register_hw |
| 270 | −!Finclude/net/mac80211.h ieee80211_get_tx_led_name | |
| 271 | −!Finclude/net/mac80211.h ieee80211_get_rx_led_name | |
| 272 | −!Finclude/net/mac80211.h ieee80211_get_assoc_led_name | |
| 273 | −!Finclude/net/mac80211.h ieee80211_get_radio_led_name | |
| 274 | 271 | !Finclude/net/mac80211.h ieee80211_unregister_hw |
| 275 | 272 | !Finclude/net/mac80211.h ieee80211_free_hw |
| 276 | 273 | </chapter> |
| @@ -332,10 +329,16 @@ · 55 unmodified lines | ||
| 332 | 329 | <title>functions/definitions</title> |
| 333 | 330 | !Finclude/net/mac80211.h ieee80211_rx_status |
| 334 | 331 | !Finclude/net/mac80211.h mac80211_rx_flags |
| 332 | +!Finclude/net/mac80211.h mac80211_tx_control_flags | |
| 333 | +!Finclude/net/mac80211.h mac80211_rate_control_flags | |
| 334 | +!Finclude/net/mac80211.h ieee80211_tx_rate | |
| 335 | 335 | !Finclude/net/mac80211.h ieee80211_tx_info |
| 336 | +!Finclude/net/mac80211.h ieee80211_tx_info_clear_status | |
| 336 | 337 | !Finclude/net/mac80211.h ieee80211_rx |
| 338 | +!Finclude/net/mac80211.h ieee80211_rx_ni | |
| 337 | 339 | !Finclude/net/mac80211.h ieee80211_rx_irqsafe |
| 338 | 340 | !Finclude/net/mac80211.h ieee80211_tx_status |
| 341 | +!Finclude/net/mac80211.h ieee80211_tx_status_ni | |
| 339 | 342 | !Finclude/net/mac80211.h ieee80211_tx_status_irqsafe |
| 340 | 343 | !Finclude/net/mac80211.h ieee80211_rts_get |
| 341 | 344 | !Finclude/net/mac80211.h ieee80211_rts_duration |
| @@ -346,6 +349,7 @@ · 4 unmodified lines | ||
| 346 | 349 | !Finclude/net/mac80211.h ieee80211_stop_queue |
| 347 | 350 | !Finclude/net/mac80211.h ieee80211_wake_queues |
| 348 | 351 | !Finclude/net/mac80211.h ieee80211_stop_queues |
| 352 | +!Finclude/net/mac80211.h ieee80211_queue_stopped | |
| 349 | 353 | </sect1> |
| 350 | 354 | </chapter> |
| 351 | 355 | |
| @@ -354,6 +358,13 @@ · 2 unmodified lines | ||
| 354 | 358 | !Pinclude/net/mac80211.h Frame filtering |
| 355 | 359 | !Finclude/net/mac80211.h ieee80211_filter_flags |
| 356 | 360 | </chapter> |
| 361 | + | |
| 362 | + <chapter id="workqueue"> | |
| 363 | + <title>The mac80211 workqueue</title> | |
| 364 | +!Pinclude/net/mac80211.h mac80211 workqueue | |
| 365 | +!Finclude/net/mac80211.h ieee80211_queue_work | |
| 366 | +!Finclude/net/mac80211.h ieee80211_queue_delayed_work | |
| 367 | + </chapter> | |
| 357 | 368 | </part> |
| 358 | 369 | |
| 359 | 370 | <part id="advanced"> |
| @@ -367,6 +378,23 @@ · 7 unmodified lines | ||
| 367 | 378 | </para> |
| 368 | 379 | </partintro> |
| 369 | 380 | |
| 381 | + <chapter id="led-support"> | |
| 382 | + <title>LED support</title> | |
| 383 | + <para> | |
| 384 | + Mac80211 supports various ways of blinking LEDs. Wherever possible, | |
| 385 | + device LEDs should be exposed as LED class devices and hooked up to | |
| 386 | + the appropriate trigger, which will then be triggered appropriately | |
| 387 | + by mac80211. | |
| 388 | + </para> | |
| 389 | +!Finclude/net/mac80211.h ieee80211_get_tx_led_name | |
| 390 | +!Finclude/net/mac80211.h ieee80211_get_rx_led_name | |
| 391 | +!Finclude/net/mac80211.h ieee80211_get_assoc_led_name | |
| 392 | +!Finclude/net/mac80211.h ieee80211_get_radio_led_name | |
| 393 | +!Finclude/net/mac80211.h ieee80211_tpt_blink | |
| 394 | +!Finclude/net/mac80211.h ieee80211_tpt_led_trigger_flags | |
| 395 | +!Finclude/net/mac80211.h ieee80211_create_tpt_led_trigger | |
| 396 | + </chapter> | |
| 397 | + | |
| 370 | 398 | <chapter id="hardware-crypto-offload"> |
| 371 | 399 | <title>Hardware crypto acceleration</title> |
| 372 | 400 | !Pinclude/net/mac80211.h Hardware crypto acceleration |
| @@ -374,6 +402,9 @@ · 1 unmodified line | ||
| 374 | 402 | !Finclude/net/mac80211.h set_key_cmd |
| 375 | 403 | !Finclude/net/mac80211.h ieee80211_key_conf |
| 376 | 404 | !Finclude/net/mac80211.h ieee80211_key_flags |
| 405 | +!Finclude/net/mac80211.h ieee80211_tkip_key_type | |
| 406 | +!Finclude/net/mac80211.h ieee80211_get_tkip_key | |
| 407 | +!Finclude/net/mac80211.h ieee80211_key_removed | |
| 377 | 408 | </chapter> |
| 378 | 409 | |
| 379 | 410 | <chapter id="powersave"> |
| @@ -417,6 +448,18 @@ · 37 unmodified lines | ||
| 417 | 448 | supported by mac80211, add notes about supporting hw crypto |
| 418 | 449 | with it. |
| 419 | 450 | </para> |
| 451 | +!Finclude/net/mac80211.h ieee80211_iterate_active_interfaces | |
| 452 | +!Finclude/net/mac80211.h ieee80211_iterate_active_interfaces_atomic | |
| 453 | + </chapter> | |
| 454 | + | |
| 455 | + <chapter id="station-handling"> | |
| 456 | + <title>Station handling</title> | |
| 457 | + <para>TODO</para> | |
| 458 | +!Finclude/net/mac80211.h ieee80211_sta | |
| 459 | +!Finclude/net/mac80211.h sta_notify_cmd | |
| 460 | +!Finclude/net/mac80211.h ieee80211_find_sta | |
| 461 | +!Finclude/net/mac80211.h ieee80211_find_sta_by_ifaddr | |
| 462 | +!Finclude/net/mac80211.h ieee80211_sta_block_awake | |
| 420 | 463 | </chapter> |
| 421 | 464 | |
| 422 | 465 | <chapter id="hardware-scan-offload"> |
| @@ -424,6 +467,28 @@ · 1 unmodified line | ||
| 424 | 467 | <para>TBD</para> |
| 425 | 468 | !Finclude/net/mac80211.h ieee80211_scan_completed |
| 426 | 469 | </chapter> |
| 470 | + | |
| 471 | + <chapter id="aggregation"> | |
| 472 | + <title>Aggregation</title> | |
| 473 | + <sect1> | |
| 474 | + <title>TX A-MPDU aggregation</title> | |
| 475 | +!Pnet/mac80211/agg-tx.c TX A-MPDU aggregation | |
| 476 | +!Cnet/mac80211/agg-tx.c | |
| 477 | + </sect1> | |
| 478 | + <sect1> | |
| 479 | + <title>RX A-MPDU aggregation</title> | |
| 480 | +!Pnet/mac80211/agg-rx.c RX A-MPDU aggregation | |
| 481 | +!Cnet/mac80211/agg-rx.c | |
| 482 | + </sect1> | |
| 483 | +!Finclude/net/mac80211.h ieee80211_ampdu_mlme_action | |
| 484 | + </chapter> | |
| 485 | + | |
| 486 | + <chapter id="smps"> | |
| 487 | + <title>Spatial Multiplexing Powersave (SMPS)</title> | |
| 488 | +!Pinclude/net/mac80211.h Spatial multiplexing power save | |
| 489 | +!Finclude/net/mac80211.h ieee80211_request_smps | |
| 490 | +!Finclude/net/mac80211.h ieee80211_smps_mode | |
| 491 | + </chapter> | |
| 427 | 492 | </part> |
| 428 | 493 | |
| 429 | 494 | <part id="rate-control"> |
| @@ -435,9 +500,16 @@ · 5 unmodified lines | ||
| 435 | 500 | interface and how it relates to mac80211 and drivers. |
| 436 | 501 | </para> |
| 437 | 502 | </partintro> |
| 438 | − <chapter id="dummy"> | |
| 439 | − <title>dummy chapter</title> | |
| 503 | + <chapter id="ratecontrol-api"> | |
| 504 | + <title>Rate Control API</title> | |
| 440 | 505 | <para>TBD</para> |
| 506 | +!Finclude/net/mac80211.h ieee80211_start_tx_ba_session | |
| 507 | +!Finclude/net/mac80211.h ieee80211_start_tx_ba_cb_irqsafe | |
| 508 | +!Finclude/net/mac80211.h ieee80211_stop_tx_ba_session | |
| 509 | +!Finclude/net/mac80211.h ieee80211_stop_tx_ba_cb_irqsafe | |
| 510 | +!Finclude/net/mac80211.h rate_control_changed | |
| 511 | +!Finclude/net/mac80211.h ieee80211_tx_rate_control | |
| 512 | +!Finclude/net/mac80211.h rate_control_send_low | |
| 441 | 513 | </chapter> |
| 442 | 514 | </part> |
| 443 | 515 | |
| @@ -485,6 +557,13 @@ · 41 unmodified lines | ||
| 485 | 557 | </sect1> |
| 486 | 558 | </chapter> |
| 487 | 559 | |
| 560 | + <chapter id="aggregation-internals"> | |
| 561 | + <title>Aggregation</title> | |
| 562 | +!Fnet/mac80211/sta_info.h sta_ampdu_mlme | |
| 563 | +!Fnet/mac80211/sta_info.h tid_ampdu_tx | |
| 564 | +!Fnet/mac80211/sta_info.h tid_ampdu_rx | |
| 565 | + </chapter> | |
| 566 | + | |
| 488 | 567 | <chapter id="synchronisation"> |
| 489 | 568 | <title>Synchronisation</title> |
| 490 | 569 | <para>TBD</para> |
| @@ -217,8 +217,8 @@ X!Isound/sound_firmware.c · 216 unmodified lines | ||
| 217 | 217 | <chapter id="uart16x50"> |
| 218 | 218 | <title>16x50 UART Driver</title> |
| 219 | 219 | !Iinclude/linux/serial_core.h |
| 220 | −!Edrivers/serial/serial_core.c | |
| 221 | −!Edrivers/serial/8250.c | |
| 220 | +!Edrivers/tty/serial/serial_core.c | |
| 221 | +!Edrivers/tty/serial/8250.c | |
| 222 | 222 | </chapter> |
| 223 | 223 | |
| 224 | 224 | <chapter id="fbdev"> |
| @@ -303,6 +303,10 @@ X!Idrivers/video/console/fonts.c · 78 unmodified lines | ||
| 303 | 303 | !Edrivers/input/input.c |
| 304 | 304 | !Edrivers/input/ff-core.c |
| 305 | 305 | !Edrivers/input/ff-memless.c |
| 306 | + </sect1> | |
| 307 | + <sect1><title>Multitouch Library</title> | |
| 308 | +!Iinclude/linux/input/mt.h | |
| 309 | +!Edrivers/input/input-mt.c | |
| 306 | 310 | </sect1> |
| 307 | 311 | <sect1><title>Polled input devices</title> |
| 308 | 312 | !Iinclude/linux/input-polldev.h |
| @@ -73,8 +73,8 @@ · 72 unmodified lines | ||
| 73 | 73 | services. |
| 74 | 74 | </para> |
| 75 | 75 | <para> |
| 76 | − The core of every DRM driver is struct drm_device. Drivers | |
| 77 | − will typically statically initialize a drm_device structure, | |
| 76 | + The core of every DRM driver is struct drm_driver. Drivers | |
| 77 | + will typically statically initialize a drm_driver structure, | |
| 78 | 78 | then pass it to drm_init() at load time. |
| 79 | 79 | </para> |
| 80 | 80 | |
| @@ -84,7 +84,7 @@ · 3 unmodified lines | ||
| 84 | 84 | <title>Driver initialization</title> |
| 85 | 85 | <para> |
| 86 | 86 | Before calling the DRM initialization routines, the driver must |
| 87 | − first create and fill out a struct drm_device structure. | |
| 87 | + first create and fill out a struct drm_driver structure. | |
| 88 | 88 | </para> |
| 89 | 89 | <programlisting> |
| 90 | 90 | static struct drm_driver driver = { |
| @@ -28,7 +28,7 @@ · 27 unmodified lines | ||
| 28 | 28 | <holder>Convergence GmbH</holder> |
| 29 | 29 | </copyright> |
| 30 | 30 | <copyright> |
| 31 | − <year>2009-2010</year> | |
| 31 | + <year>2009-2011</year> | |
| 32 | 32 | <holder>Mauro Carvalho Chehab</holder> |
| 33 | 33 | </copyright> |
| 34 | 34 | |
| @@ -82,6 +82,11 @@ · 81 unmodified lines | ||
| 82 | 82 | </sect1> |
| 83 | 83 | </chapter> |
| 84 | 84 | |
| 85 | + <chapter id="fs_events"> | |
| 86 | + <title>Events based on file descriptors</title> | |
| 87 | +!Efs/eventfd.c | |
| 88 | + </chapter> | |
| 89 | + | |
| 85 | 90 | <chapter id="sysfs"> |
| 86 | 91 | <title>The Filesystem for Exporting Kernel Objects</title> |
| 87 | 92 | !Efs/sysfs/file.c |
| @@ -28,7 +28,7 @@ · 27 unmodified lines | ||
| 28 | 28 | <title>LINUX MEDIA INFRASTRUCTURE API</title> |
| 29 | 29 | |
| 30 | 30 | <copyright> |
| 31 | − <year>2009-2010</year> | |
| 31 | + <year>2009-2011</year> | |
| 32 | 32 | <holder>LinuxTV Developers</holder> |
| 33 | 33 | </copyright> |
| 34 | 34 | |
| @@ -86,7 +86,7 @@ Foundation. A copy of the license is included in the chapter entitled · 51 unmodified lines | ||
| 86 | 86 | </author> |
| 87 | 87 | </authorgroup> |
| 88 | 88 | <copyright> |
| 89 | − <year>2009-2010</year> | |
| 89 | + <year>2009-2011</year> | |
| 90 | 90 | <holder>Mauro Carvalho Chehab</holder> |
| 91 | 91 | </copyright> |
| 92 | 92 | |
| @@ -250,7 +250,7 @@ static void board_hwcontrol(struct mtd_info *mtd, int cmd) · 249 unmodified lines | ||
| 250 | 250 | <title>Device ready function</title> |
| 251 | 251 | <para> |
| 252 | 252 | If the hardware interface has the ready busy pin of the NAND chip connected to a |
| 253 | − GPIO or other accesible I/O pin, this function is used to read back the state of the | |
| 253 | + GPIO or other accessible I/O pin, this function is used to read back the state of the | |
| 254 | 254 | pin. The function has no arguments and should return 0, if the device is busy (R/B pin |
| 255 | 255 | is low) and 1, if the device is ready (R/B pin is high). |
| 256 | 256 | If the hardware interface does not give access to the ready busy pin, then |
| @@ -75,6 +75,7 @@ as follows:</para> · 74 unmodified lines | ||
| 75 | 75 | </section> |
| 76 | 76 | |
| 77 | 77 | <section> |
| 78 | + <title>RDS datastructures</title> | |
| 78 | 79 | <table frame="none" pgwide="1" id="v4l2-rds-data"> |
| 79 | 80 | <title>struct |
| 80 | 81 | <structname>v4l2_rds_data</structname></title> |
| @@ -129,10 +130,11 @@ as follows:</para> · 48 unmodified lines | ||
| 129 | 130 | |
| 130 | 131 | <table frame="none" pgwide="1" id="v4l2-rds-block-codes"> |
| 131 | 132 | <title>Block defines</title> |
| 132 | − <tgroup cols="3"> | |
| 133 | + <tgroup cols="4"> | |
| 133 | 134 | <colspec colname="c1" colwidth="1*" /> |
| 134 | 135 | <colspec colname="c2" colwidth="1*" /> |
| 135 | − <colspec colname="c3" colwidth="5*" /> | |
| 136 | + <colspec colname="c3" colwidth="1*" /> | |
| 137 | + <colspec colname="c4" colwidth="5*" /> | |
| 136 | 138 | <tbody valign="top"> |
| 137 | 139 | <row> |
| 138 | 140 | <entry>V4L2_RDS_BLOCK_MSK</entry> |
| @@ -34,8 +34,7 @@ · 33 unmodified lines | ||
| 34 | 34 | <varlistentry> |
| 35 | 35 | <term><parameter>request</parameter></term> |
| 36 | 36 | <listitem> |
| 37 | − <para>V4L2 ioctl request code as defined in the <link | |
| 38 | −linkend="videodev">videodev.h</link> header file, for example | |
| 37 | + <para>V4L2 ioctl request code as defined in the <filename>videodev2.h</filename> header file, for example | |
| 39 | 38 | VIDIOC_QUERYCAP.</para> |
| 40 | 39 | </listitem> |
| 41 | 40 | </varlistentry> |
| @@ -57,7 +56,7 @@ file descriptor. An ioctl <parameter>request</parameter> has encoded · 15 unmodified lines | ||
| 57 | 56 | in it whether the argument is an input, output or read/write |
| 58 | 57 | parameter, and the size of the argument <parameter>argp</parameter> in |
| 59 | 58 | bytes. Macros and defines specifying V4L2 ioctl requests are located |
| 60 | −in the <link linkend="videodev">videodev.h</link> header file. | |
| 59 | +in the <filename>videodev2.h</filename> header file. | |
| 61 | 60 | Applications should use their own copy, not include the version in the |
| 62 | 61 | kernel sources on the system they compile on. All V4L2 ioctl requests, |
| 63 | 62 | their respective function and parameters are specified in <xref |
| @@ -142,8 +142,8 @@ leftmost pixel of the second row from the top, and so on. The last row · 141 unmodified lines | ||
| 142 | 142 | has just as many pad bytes after it as the other rows.</para> |
| 143 | 143 | |
| 144 | 144 | <para>In V4L2 each format has an identifier which looks like |
| 145 | −<constant>PIX_FMT_XXX</constant>, defined in the <link | |
| 146 | −linkend="videodev">videodev.h</link> header file. These identifiers | |
| 145 | +<constant>PIX_FMT_XXX</constant>, defined in the <filename>videodev2.h</filename> | |
| 146 | +header file. These identifiers | |
| 147 | 147 | represent <link linkend="v4l2-fourcc">four character codes</link> |
| 148 | 148 | which are also listed below, however they are not the same as those |
| 149 | 149 | used in the Windows world.</para> |
| @@ -100,6 +100,7 @@ Remote Controller chapter.</contrib> · 99 unmodified lines | ||
| 100 | 100 | <year>2008</year> |
| 101 | 101 | <year>2009</year> |
| 102 | 102 | <year>2010</year> |
| 103 | + <year>2011</year> | |
| 103 | 104 | <holder>Bill Dirks, Michael H. Schimek, Hans Verkuil, Martin |
| 104 | 105 | Rubli, Andy Walls, Muralidharan Karicheri, Mauro Carvalho Chehab</holder> |
| 105 | 106 | </copyright> |
| @@ -381,7 +382,7 @@ and discussions on the V4L mailing list.</revremark> · 275 unmodified lines | ||
| 381 | 382 | </partinfo> |
| 382 | 383 | |
| 383 | 384 | <title>Video for Linux Two API Specification</title> |
| 384 | − <subtitle>Revision 2.6.33</subtitle> | |
| 385 | + <subtitle>Revision 2.6.38</subtitle> | |
| 385 | 386 | |
| 386 | 387 | <chapter id="common"> |
| 387 | 388 | &sub-common; |
| @@ -533,6 +533,33 @@ completion during sending a panic event. · 532 unmodified lines | ||
| 533 | 533 | Other Pieces |
| 534 | 534 | ------------ |
| 535 | 535 | |
| 536 | +Get the detailed info related with the IPMI device | |
| 537 | +-------------------------------------------------- | |
| 538 | + | |
| 539 | +Some users need more detailed information about a device, like where | |
| 540 | +the address came from or the raw base device for the IPMI interface. | |
| 541 | +You can use the IPMI smi_watcher to catch the IPMI interfaces as they | |
| 542 | +come or go, and to grab the information, you can use the function | |
| 543 | +ipmi_get_smi_info(), which returns the following structure: | |
| 544 | + | |
| 545 | +struct ipmi_smi_info { | |
| 546 | + enum ipmi_addr_src addr_src; | |
| 547 | + struct device *dev; | |
| 548 | + union { | |
| 549 | + struct { | |
| 550 | + void *acpi_handle; | |
| 551 | + } acpi_info; | |
| 552 | + } addr_info; | |
| 553 | +}; | |
| 554 | + | |
| 555 | +Currently special info for only for SI_ACPI address sources is | |
| 556 | +returned. Others may be added as necessary. | |
| 557 | + | |
| 558 | +Note that the dev pointer is included in the above structure, and | |
| 559 | +assuming ipmi_smi_get_info returns success, you must call put_device | |
| 560 | +on the dev pointer. | |
| 561 | + | |
| 562 | + | |
| 536 | 563 | Watchdog |
| 537 | 564 | -------- |
| 538 | 565 | |
| @@ -1,3 +1,3 @@ | ||
| 1 | 1 | obj-m := DocBook/ accounting/ auxdisplay/ connector/ \ |
| 2 | 2 | filesystems/ filesystems/configfs/ ia64/ laptops/ networking/ \ |
| 3 | − pcmcia/ spi/ timers/ video4linux/ vm/ watchdog/src/ | |
| 3 | + pcmcia/ spi/ timers/ vm/ watchdog/src/ | |
| @@ -1,18 +1,22 @@ | ||
| 1 | 1 | CONFIG_RCU_TRACE debugfs Files and Formats |
| 2 | 2 | |
| 3 | 3 | |
| 4 | −The rcutree implementation of RCU provides debugfs trace output that | |
| 5 | −summarizes counters and state. This information is useful for debugging | |
| 6 | −RCU itself, and can sometimes also help to debug abuses of RCU. | |
| 7 | −The following sections describe the debugfs files and formats. | |
| 4 | +The rcutree and rcutiny implementations of RCU provide debugfs trace | |
| 5 | +output that summarizes counters and state. This information is useful for | |
| 6 | +debugging RCU itself, and can sometimes also help to debug abuses of RCU. | |
| 7 | +The following sections describe the debugfs files and formats, first | |
| 8 | +for rcutree and next for rcutiny. | |
| 8 | 9 | |
| 9 | 10 | |
| 10 | −Hierarchical RCU debugfs Files and Formats | |
| 11 | +CONFIG_TREE_RCU and CONFIG_TREE_PREEMPT_RCU debugfs Files and Formats | |
| 11 | 12 | |
| 12 | −This implementation of RCU provides three debugfs files under the | |
| 13 | +These implementations of RCU provides five debugfs files under the | |
| 13 | 14 | top-level directory RCU: rcu/rcudata (which displays fields in struct |
| 14 | −rcu_data), rcu/rcugp (which displays grace-period counters), and | |
| 15 | −rcu/rcuhier (which displays the struct rcu_node hierarchy). | |
| 15 | +rcu_data), rcu/rcudata.csv (which is a .csv spreadsheet version of | |
| 16 | +rcu/rcudata), rcu/rcugp (which displays grace-period counters), | |
| 17 | +rcu/rcuhier (which displays the struct rcu_node hierarchy), and | |
| 18 | +rcu/rcu_pending (which displays counts of the reasons that the | |
| 19 | +rcu_pending() function decided that there was core RCU work to do). | |
| 16 | 20 | |
| 17 | 21 | The output of "cat rcu/rcudata" looks as follows: |
| 18 | 22 | |
| @@ -130,7 +134,8 @@ o "ci" is the number of RCU callbacks that have been invoked for · 111 unmodified lines | ||
| 130 | 134 | been registered in absence of CPU-hotplug activity. |
| 131 | 135 | |
| 132 | 136 | o "co" is the number of RCU callbacks that have been orphaned due to |
| 133 | − this CPU going offline. | |
| 137 | + this CPU going offline. These orphaned callbacks have been moved | |
| 138 | + to an arbitrarily chosen online CPU. | |
| 134 | 139 | |
| 135 | 140 | o "ca" is the number of RCU callbacks that have been adopted due to |
| 136 | 141 | other CPUs going offline. Note that ci+co-ca+ql is the number of |
| @@ -168,12 +173,12 @@ o "gpnum" is the number of grace periods that have started. It is · 31 unmodified lines | ||
| 168 | 173 | |
| 169 | 174 | The output of "cat rcu/rcuhier" looks as follows, with very long lines: |
| 170 | 175 | |
| 171 | −c=6902 g=6903 s=2 jfq=3 j=72c7 nfqs=13142/nfqsng=0(13142) fqlh=6 oqlen=0 | |
| 176 | +c=6902 g=6903 s=2 jfq=3 j=72c7 nfqs=13142/nfqsng=0(13142) fqlh=6 | |
| 172 | 177 | 1/1 .>. 0:127 ^0 |
| 173 | 178 | 3/3 .>. 0:35 ^0 0/0 .>. 36:71 ^1 0/0 .>. 72:107 ^2 0/0 .>. 108:127 ^3 |
| 174 | 179 | 3/3f .>. 0:5 ^0 2/3 .>. 6:11 ^1 0/0 .>. 12:17 ^2 0/0 .>. 18:23 ^3 0/0 .>. 24:29 ^4 0/0 .>. 30:35 ^5 0/0 .>. 36:41 ^0 0/0 .>. 42:47 ^1 0/0 .>. 48:53 ^2 0/0 .>. 54:59 ^3 0/0 .>. 60:65 ^4 0/0 .>. 66:71 ^5 0/0 .>. 72:77 ^0 0/0 .>. 78:83 ^1 0/0 .>. 84:89 ^2 0/0 .>. 90:95 ^3 0/0 .>. 96:101 ^4 0/0 .>. 102:107 ^5 0/0 .>. 108:113 ^0 0/0 .>. 114:119 ^1 0/0 .>. 120:125 ^2 0/0 .>. 126:127 ^3 |
| 175 | 180 | rcu_bh: |
| 176 | −c=-226 g=-226 s=1 jfq=-5701 j=72c7 nfqs=88/nfqsng=0(88) fqlh=0 oqlen=0 | |
| 181 | +c=-226 g=-226 s=1 jfq=-5701 j=72c7 nfqs=88/nfqsng=0(88) fqlh=0 | |
| 177 | 182 | 0/1 .>. 0:127 ^0 |
| 178 | 183 | 0/3 .>. 0:35 ^0 0/0 .>. 36:71 ^1 0/0 .>. 72:107 ^2 0/0 .>. 108:127 ^3 |
| 179 | 184 | 0/3f .>. 0:5 ^0 0/3 .>. 6:11 ^1 0/0 .>. 12:17 ^2 0/0 .>. 18:23 ^3 0/0 .>. 24:29 ^4 0/0 .>. 30:35 ^5 0/0 .>. 36:41 ^0 0/0 .>. 42:47 ^1 0/0 .>. 48:53 ^2 0/0 .>. 54:59 ^3 0/0 .>. 60:65 ^4 0/0 .>. 66:71 ^5 0/0 .>. 72:77 ^0 0/0 .>. 78:83 ^1 0/0 .>. 84:89 ^2 0/0 .>. 90:95 ^3 0/0 .>. 96:101 ^4 0/0 .>. 102:107 ^5 0/0 .>. 108:113 ^0 0/0 .>. 114:119 ^1 0/0 .>. 120:125 ^2 0/0 .>. 126:127 ^3 |
| @@ -212,11 +217,6 @@ o "fqlh" is the number of calls to force_quiescent_state() that · 32 unmodified lines | ||
| 212 | 217 | exited immediately (without even being counted in nfqs above) |
| 213 | 218 | due to contention on ->fqslock. |
| 214 | 219 | |
| 215 | −o "oqlen" is the number of callbacks on the "orphan" callback | |
| 216 | − list. RCU callbacks are placed on this list by CPUs going | |
| 217 | − offline, and are "adopted" either by the CPU helping the outgoing | |
| 218 | − CPU or by the next rcu_barrier*() call, whichever comes first. | |
| 219 | − | |
| 220 | 220 | o Each element of the form "1/1 0:127 ^0" represents one struct |
| 221 | 221 | rcu_node. Each line represents one level of the hierarchy, from |
| 222 | 222 | root to leaves. It is best to think of the rcu_data structures |
| @@ -326,3 +326,115 @@ o "nn" is the number of times that this CPU needed nothing. Alert · 103 unmodified lines | ||
| 326 | 326 | readers will note that the rcu "nn" number for a given CPU very |
| 327 | 327 | closely matches the rcu_bh "np" number for that same CPU. This |
| 328 | 328 | is due to short-circuit evaluation in rcu_pending(). |
| 329 | + | |
| 330 | + | |
| 331 | +CONFIG_TINY_RCU and CONFIG_TINY_PREEMPT_RCU debugfs Files and Formats | |
| 332 | + | |
| 333 | +These implementations of RCU provides a single debugfs file under the | |
| 334 | +top-level directory RCU, namely rcu/rcudata, which displays fields in | |
| 335 | +rcu_bh_ctrlblk, rcu_sched_ctrlblk and, for CONFIG_TINY_PREEMPT_RCU, | |
| 336 | +rcu_preempt_ctrlblk. | |
| 337 | + | |
| 338 | +The output of "cat rcu/rcudata" is as follows: | |
| 339 | + | |
| 340 | +rcu_preempt: qlen=24 gp=1097669 g197/p197/c197 tasks=... | |
| 341 | + ttb=. btg=no ntb=184 neb=0 nnb=183 j=01f7 bt=0274 | |
| 342 | + normal balk: nt=1097669 gt=0 bt=371 b=0 ny=25073378 nos=0 | |
| 343 | + exp balk: bt=0 nos=0 | |
| 344 | +rcu_sched: qlen: 0 | |
| 345 | +rcu_bh: qlen: 0 | |
| 346 | + | |
| 347 | +This is split into rcu_preempt, rcu_sched, and rcu_bh sections, with the | |
| 348 | +rcu_preempt section appearing only in CONFIG_TINY_PREEMPT_RCU builds. | |
| 349 | +The last three lines of the rcu_preempt section appear only in | |
| 350 | +CONFIG_RCU_BOOST kernel builds. The fields are as follows: | |
| 351 | + | |
| 352 | +o "qlen" is the number of RCU callbacks currently waiting either | |
| 353 | + for an RCU grace period or waiting to be invoked. This is the | |
| 354 | + only field present for rcu_sched and rcu_bh, due to the | |
| 355 | + short-circuiting of grace period in those two cases. | |
| 356 | + | |
| 357 | +o "gp" is the number of grace periods that have completed. | |
| 358 | + | |
| 359 | +o "g197/p197/c197" displays the grace-period state, with the | |
| 360 | + "g" number being the number of grace periods that have started | |
| 361 | + (mod 256), the "p" number being the number of grace periods | |
| 362 | + that the CPU has responded to (also mod 256), and the "c" | |
| 363 | + number being the number of grace periods that have completed | |
| 364 | + (once again mode 256). | |
| 365 | + | |
| 366 | + Why have both "gp" and "g"? Because the data flowing into | |
| 367 | + "gp" is only present in a CONFIG_RCU_TRACE kernel. | |
| 368 | + | |
| 369 | +o "tasks" is a set of bits. The first bit is "T" if there are | |
| 370 | + currently tasks that have recently blocked within an RCU | |
| 371 | + read-side critical section, the second bit is "N" if any of the | |
| 372 | + aforementioned tasks are blocking the current RCU grace period, | |
| 373 | + and the third bit is "E" if any of the aforementioned tasks are | |
| 374 | + blocking the current expedited grace period. Each bit is "." | |
| 375 | + if the corresponding condition does not hold. | |
| 376 | + | |
| 377 | +o "ttb" is a single bit. It is "B" if any of the blocked tasks | |
| 378 | + need to be priority boosted and "." otherwise. | |
| 379 | + | |
| 380 | +o "btg" indicates whether boosting has been carried out during | |
| 381 | + the current grace period, with "exp" indicating that boosting | |
| 382 | + is in progress for an expedited grace period, "no" indicating | |
| 383 | + that boosting has not yet started for a normal grace period, | |
| 384 | + "begun" indicating that boosting has bebug for a normal grace | |
| 385 | + period, and "done" indicating that boosting has completed for | |
| 386 | + a normal grace period. | |
| 387 | + | |
| 388 | +o "ntb" is the total number of tasks subjected to RCU priority boosting | |
| 389 | + periods since boot. | |
| 390 | + | |
| 391 | +o "neb" is the number of expedited grace periods that have had | |
| 392 | + to resort to RCU priority boosting since boot. | |
| 393 | + | |
| 394 | +o "nnb" is the number of normal grace periods that have had | |
| 395 | + to resort to RCU priority boosting since boot. | |
| 396 | + | |
| 397 | +o "j" is the low-order 12 bits of the jiffies counter in hexadecimal. | |
| 398 | + | |
| 399 | +o "bt" is the low-order 12 bits of the value that the jiffies counter | |
| 400 | + will have at the next time that boosting is scheduled to begin. | |
| 401 | + | |
| 402 | +o In the line beginning with "normal balk", the fields are as follows: | |
| 403 | + | |
| 404 | + o "nt" is the number of times that the system balked from | |
| 405 | + boosting because there were no blocked tasks to boost. | |
| 406 | + Note that the system will balk from boosting even if the | |
| 407 | + grace period is overdue when the currently running task | |
| 408 | + is looping within an RCU read-side critical section. | |
| 409 | + There is no point in boosting in this case, because | |
| 410 | + boosting a running task won't make it run any faster. | |
| 411 | + | |
| 412 | + o "gt" is the number of times that the system balked | |
| 413 | + from boosting because, although there were blocked tasks, | |
| 414 | + none of them were preventing the current grace period | |
| 415 | + from completing. | |
| 416 | + | |
| 417 | + o "bt" is the number of times that the system balked | |
| 418 | + from boosting because boosting was already in progress. | |
| 419 | + | |
| 420 | + o "b" is the number of times that the system balked from | |
| 421 | + boosting because boosting had already completed for | |
| 422 | + the grace period in question. | |
| 423 | + | |
| 424 | + o "ny" is the number of times that the system balked from | |
| 425 | + boosting because it was not yet time to start boosting | |
| 426 | + the grace period in question. | |
| 427 | + | |
| 428 | + o "nos" is the number of times that the system balked from | |
| 429 | + boosting for inexplicable ("not otherwise specified") | |
| 430 | + reasons. This can actually happen due to races involving | |
| 431 | + increments of the jiffies counter. | |
| 432 | + | |
| 433 | +o In the line beginning with "exp balk", the fields are as follows: | |
| 434 | + | |
| 435 | + o "bt" is the number of times that the system balked from | |
| 436 | + boosting because there were no blocked tasks to boost. | |
| 437 | + | |
| 438 | + o "nos" is the number of times that the system balked from | |
| 439 | + boosting for inexplicable ("not otherwise specified") | |
| 440 | + reasons. | |
| @@ -0,0 +1,122 @@ | ||
| 1 | + APEI output format | |
| 2 | + ~~~~~~~~~~~~~~~~~~ | |
| 3 | + | |
| 4 | +APEI uses printk as hardware error reporting interface, the output | |
| 5 | +format is as follow. | |
| 6 | + | |
| 7 | +<error record> := | |
| 8 | +APEI generic hardware error status | |
| 9 | +severity: <integer>, <severity string> | |
| 10 | +section: <integer>, severity: <integer>, <severity string> | |
| 11 | +flags: <integer> | |
| 12 | +<section flags strings> | |
| 13 | +fru_id: <uuid string> | |
| 14 | +fru_text: <string> | |
| 15 | +section_type: <section type string> | |
| 16 | +<section data> | |
| 17 | + | |
| 18 | +<severity string>* := recoverable | fatal | corrected | info | |
| 19 | + | |
| 20 | +<section flags strings># := | |
| 21 | +[primary][, containment warning][, reset][, threshold exceeded]\ | |
| 22 | +[, resource not accessible][, latent error] | |
| 23 | + | |
| 24 | +<section type string> := generic processor error | memory error | \ | |
| 25 | +PCIe error | unknown, <uuid string> | |
| 26 | + | |
| 27 | +<section data> := | |
| 28 | +<generic processor section data> | <memory section data> | \ | |
| 29 | +<pcie section data> | <null> | |
| 30 | + | |
| 31 | +<generic processor section data> := | |
| 32 | +[processor_type: <integer>, <proc type string>] | |
| 33 | +[processor_isa: <integer>, <proc isa string>] | |
| 34 | +[error_type: <integer> | |
| 35 | +<proc error type strings>] | |
| 36 | +[operation: <integer>, <proc operation string>] | |
| 37 | +[flags: <integer> | |
| 38 | +<proc flags strings>] | |
| 39 | +[level: <integer>] | |
| 40 | +[version_info: <integer>] | |
| 41 | +[processor_id: <integer>] | |
| 42 | +[target_address: <integer>] | |
| 43 | +[requestor_id: <integer>] | |
| 44 | +[responder_id: <integer>] | |
| 45 | +[IP: <integer>] | |
| 46 | + | |
| 47 | +<proc type string>* := IA32/X64 | IA64 | |
| 48 | + | |
| 49 | +<proc isa string>* := IA32 | IA64 | X64 | |
| 50 | + | |
| 51 | +<processor error type strings># := | |
| 52 | +[cache error][, TLB error][, bus error][, micro-architectural error] | |
| 53 | + | |
| 54 | +<proc operation string>* := unknown or generic | data read | data write | \ | |
| 55 | +instruction execution | |
| 56 | + | |
| 57 | +<proc flags strings># := | |
| 58 | +[restartable][, precise IP][, overflow][, corrected] | |
| 59 | + | |
| 60 | +<memory section data> := | |
| 61 | +[error_status: <integer>] | |
| 62 | +[physical_address: <integer>] | |
| 63 | +[physical_address_mask: <integer>] | |
| 64 | +[node: <integer>] | |
| 65 | +[card: <integer>] | |
| 66 | +[module: <integer>] | |
| 67 | +[bank: <integer>] | |
| 68 | +[device: <integer>] | |
| 69 | +[row: <integer>] | |
| 70 | +[column: <integer>] | |
| 71 | +[bit_position: <integer>] | |
| 72 | +[requestor_id: <integer>] | |
| 73 | +[responder_id: <integer>] | |
| 74 | +[target_id: <integer>] | |
| 75 | +[error_type: <integer>, <mem error type string>] | |
| 76 | + | |
| 77 | +<mem error type string>* := | |
| 78 | +unknown | no error | single-bit ECC | multi-bit ECC | \ | |
| 79 | +single-symbol chipkill ECC | multi-symbol chipkill ECC | master abort | \ | |
| 80 | +target abort | parity error | watchdog timeout | invalid address | \ | |
| 81 | +mirror Broken | memory sparing | scrub corrected error | \ | |
| 82 | +scrub uncorrected error | |
| 83 | + | |
| 84 | +<pcie section data> := | |
| 85 | +[port_type: <integer>, <pcie port type string>] | |
| 86 | +[version: <integer>.<integer>] | |
| 87 | +[command: <integer>, status: <integer>] | |
| 88 | +[device_id: <integer>:<integer>:<integer>.<integer> | |
| 89 | +slot: <integer> | |
| 90 | +secondary_bus: <integer> | |
| 91 | +vendor_id: <integer>, device_id: <integer> | |
| 92 | +class_code: <integer>] | |
| 93 | +[serial number: <integer>, <integer>] | |
| 94 | +[bridge: secondary_status: <integer>, control: <integer>] | |
| 95 | + | |
| 96 | +<pcie port type string>* := PCIe end point | legacy PCI end point | \ | |
| 97 | +unknown | unknown | root port | upstream switch port | \ | |
| 98 | +downstream switch port | PCIe to PCI/PCI-X bridge | \ | |
| 99 | +PCI/PCI-X to PCIe bridge | root complex integrated endpoint device | \ | |
| 100 | +root complex event collector | |
| 101 | + | |
| 102 | +Where, [] designate corresponding content is optional | |
| 103 | + | |
| 104 | +All <field string> description with * has the following format: | |
| 105 | + | |
| 106 | +field: <integer>, <field string> | |
| 107 | + | |
| 108 | +Where value of <integer> should be the position of "string" in <field | |
| 109 | +string> description. Otherwise, <field string> will be "unknown". | |
| 110 | + | |
| 111 | +All <field strings> description with # has the following format: | |
| 112 | + | |
| 113 | +field: <integer> | |
| 114 | +<field strings> | |
| 115 | + | |
| 116 | +Where each string in <fields strings> corresponding to one set bit of | |
| 117 | +<integer>. The bit position is the position of "string" in <field | |
| 118 | +strings> description. | |
| 119 | + | |
| 120 | +For more detailed explanation of every field, please refer to UEFI | |
| 121 | +specification version 2.3 or later, section Appendix N: Common | |
| 122 | +Platform Error Record. | |
| @@ -34,3 +34,5 @@ memory.txt · 33 unmodified lines | ||
| 34 | 34 | - description of the virtual memory layout |
| 35 | 35 | nwfpe/ |
| 36 | 36 | - NWFPE floating point emulator documentation |
| 37 | +swp_emulation | |
| 38 | + - SWP/SWPB emulation handler/logging description | |
| @@ -127,3 +127,28 @@ implementation needs: · 126 unmodified lines | ||
| 127 | 127 | 10. (*pdata->cpu_set_freq)(unsigned long f) |
| 128 | 128 | |
| 129 | 129 | 11. (*pdata->cpu_get_freq)(void) |
| 130 | + | |
| 131 | +Customizing OPP for platform | |
| 132 | +============================ | |
| 133 | +Defining CONFIG_PM should enable OPP layer for the silicon | |
| 134 | +and the registration of OPP table should take place automatically. | |
| 135 | +However, in special cases, the default OPP table may need to be | |
| 136 | +tweaked, for e.g.: | |
| 137 | + * enable default OPPs which are disabled by default, but which | |
| 138 | + could be enabled on a platform | |
| 139 | + * Disable an unsupported OPP on the platform | |
| 140 | + * Define and add a custom opp table entry | |
| 141 | +in these cases, the board file needs to do additional steps as follows: | |
| 142 | +arch/arm/mach-omapx/board-xyz.c | |
| 143 | + #include "pm.h" | |
| 144 | + .... | |
| 145 | + static void __init omap_xyz_init_irq(void) | |
| 146 | + { | |
| 147 | + .... | |
| 148 | + /* Initialize the default table */ | |
| 149 | + omapx_opp_init(); | |
| 150 | + /* Do customization to the defaults */ | |
| 151 | + .... | |
| 152 | + } | |
| 153 | +NOTE: omapx_opp_init will be omap3_opp_init or as required | |
| 154 | +based on the omap family. | |
| @@ -0,0 +1,27 @@ | ||
| 1 | +Software emulation of deprecated SWP instruction (CONFIG_SWP_EMULATE) | |
| 2 | +--------------------------------------------------------------------- | |
| 3 | + | |
| 4 | +ARMv6 architecture deprecates use of the SWP/SWPB instructions, and recommeds | |
| 5 | +moving to the load-locked/store-conditional instructions LDREX and STREX. | |
| 6 | + | |
| 7 | +ARMv7 multiprocessing extensions introduce the ability to disable these | |
| 8 | +instructions, triggering an undefined instruction exception when executed. | |
| 9 | +Trapped instructions are emulated using an LDREX/STREX or LDREXB/STREXB | |
| 10 | +sequence. If a memory access fault (an abort) occurs, a segmentation fault is | |
| 11 | +signalled to the triggering process. | |
| 12 | + | |
| 13 | +/proc/cpu/swp_emulation holds some statistics/information, including the PID of | |
| 14 | +the last process to trigger the emulation to be invocated. For example: | |
| 15 | +--- | |
| 16 | +Emulated SWP: 12 | |
| 17 | +Emulated SWPB: 0 | |
| 18 | +Aborted SWP{B}: 1 | |
| 19 | +Last process: 314 | |
| 20 | +--- | |
| 21 | + | |
| 22 | +NOTE: when accessing uncached shared regions, LDREX/STREX rely on an external | |
| 23 | +transaction monitoring block called a global monitor to maintain update | |
| 24 | +atomicity. If your system does not implement a global monitor, this option can | |
| 25 | +cause programs that perform SWP operations to uncached memory to deadlock, as | |
| 26 | +the STREX operation will always fail. | |
| 27 | + | |
| @@ -89,6 +89,33 @@ Throttling/Upper Limit policy · 88 unmodified lines | ||
| 89 | 89 | |
| 90 | 90 | Limits for writes can be put using blkio.write_bps_device file. |
| 91 | 91 | |
| 92 | +Hierarchical Cgroups | |
| 93 | +==================== | |
| 94 | +- Currently none of the IO control policy supports hierarhical groups. But | |
| 95 | + cgroup interface does allow creation of hierarhical cgroups and internally | |
| 96 | + IO policies treat them as flat hierarchy. | |
| 97 | + | |
| 98 | + So this patch will allow creation of cgroup hierarhcy but at the backend | |
| 99 | + everything will be treated as flat. So if somebody created a hierarchy like | |
| 100 | + as follows. | |
| 101 | + | |
| 102 | + root | |
| 103 | + / \ | |
| 104 | + test1 test2 | |
| 105 | + | | |
| 106 | + test3 | |
| 107 | + | |
| 108 | + CFQ and throttling will practically treat all groups at same level. | |
| 109 | + | |
| 110 | + pivot | |
| 111 | + / | \ \ | |
| 112 | + root test1 test2 test3 | |
| 113 | + | |
| 114 | + Down the line we can implement hierarchical accounting/control support | |
| 115 | + and also introduce a new cgroup file "use_hierarchy" which will control | |
| 116 | + whether cgroup hierarchy is viewed as flat or hierarchical by the policy.. | |
| 117 | + This is how memory controller also has implemented the things. | |
| 118 | + | |
| 92 | 119 | Various user visible config options |
| 93 | 120 | =================================== |
| 94 | 121 | CONFIG_BLK_CGROUP |
| @@ -91,7 +91,7 @@ int main(int argc, char **argv) · 90 unmodified lines | ||
| 91 | 91 | |
| 92 | 92 | if (ret == -1) { |
| 93 | 93 | perror("cgroup.event_control " |
| 94 | − "is not accessable any more"); | |
| 94 | + "is not accessible any more"); | |
| 95 | 95 | break; |
| 96 | 96 | } |
| 97 | 97 | |
| @@ -355,13 +355,13 @@ subsystems, type: · 354 unmodified lines | ||
| 355 | 355 | |
| 356 | 356 | To change the set of subsystems bound to a mounted hierarchy, just |
| 357 | 357 | remount with different options: |
| 358 | −# mount -o remount,cpuset,ns hier1 /dev/cgroup | |
| 358 | +# mount -o remount,cpuset,blkio hier1 /dev/cgroup | |
| 359 | 359 | |
| 360 | −Now memory is removed from the hierarchy and ns is added. | |
| 360 | +Now memory is removed from the hierarchy and blkio is added. | |
| 361 | 361 | |
| 362 | −Note this will add ns to the hierarchy but won't remove memory or | |
| 362 | +Note this will add blkio to the hierarchy but won't remove memory or | |
| 363 | 363 | cpuset, because the new options are appended to the old ones: |
| 364 | −# mount -o remount,ns /dev/cgroup | |
| 364 | +# mount -o remount,blkio /dev/cgroup | |
| 365 | 365 | |
| 366 | 366 | To Specify a hierarchy's release_agent: |
| 367 | 367 | # mount -t cgroup -o cpuset,release_agent="/sbin/cpuset_release_agent" \ |
| @@ -398,7 +398,7 @@ Under below explanation, we assume CONFIG_MEM_RES_CTRL_SWAP=y. · 397 unmodified lines | ||
| 398 | 398 | written to move_charge_at_immigrate. |
| 399 | 399 | |
| 400 | 400 | 9.10 Memory thresholds |
| 401 | − Memory controler implements memory thresholds using cgroups notification | |
| 401 | + Memory controller implements memory thresholds using cgroups notification | |
| 402 | 402 | API. You can use Documentation/cgroups/cgroup_event_listener.c to test |
| 403 | 403 | it. |
| 404 | 404 | |
| @@ -36,6 +36,10 @@ as a regular user, and install it with · 35 unmodified lines | ||
| 36 | 36 | |
| 37 | 37 | sudo make install |
| 38 | 38 | |
| 39 | +The semantic patches in the kernel will work best with Coccinelle version | |
| 40 | +0.2.4 or later. Using earlier versions may incur some parse errors in the | |
| 41 | +semantic patch code, but any results that are obtained should still be | |
| 42 | +correct. | |
| 39 | 43 | |
| 40 | 44 | Using Coccinelle on the Linux kernel |
| 41 | 45 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| @@ -8,7 +8,7 @@ Parameters: <cipher> <key> <iv_offset> <device path> <offset> · 7 unmodified lines | ||
| 8 | 8 | |
| 9 | 9 | <cipher> |
| 10 | 10 | Encryption cipher and an optional IV generation mode. |
| 11 | − (In format cipher-chainmode-ivopts:ivmode). | |
| 11 | + (In format cipher[:keycount]-chainmode-ivopts:ivmode). | |
| 12 | 12 | Examples: |
| 13 | 13 | des |
| 14 | 14 | aes-cbc-essiv:sha256 |
| @@ -20,6 +20,11 @@ Parameters: <cipher> <key> <iv_offset> <device path> <offset> · 5 unmodified lines | ||
| 20 | 20 | Key used for encryption. It is encoded as a hexadecimal number. |
| 21 | 21 | You can only use key sizes that are valid for the selected cipher. |
| 22 | 22 | |
| 23 | +<keycount> | |
| 24 | + Multi-key compatibility mode. You can define <keycount> keys and | |
| 25 | + then sectors are encrypted according to their offsets (sector 0 uses key0; | |
| 26 | + sector 1 uses key1 etc.). <keycount> must be a power of two. | |
| 27 | + | |
| 23 | 28 | <iv_offset> |
| 24 | 29 | The IV offset is a sector count that is added to the sector number |
| 25 | 30 | before creating the IV. |
| @@ -0,0 +1,70 @@ | ||
| 1 | +Device-mapper RAID (dm-raid) is a bridge from DM to MD. It | |
| 2 | +provides a way to use device-mapper interfaces to access the MD RAID | |
| 3 | +drivers. | |
| 4 | + | |
| 5 | +As with all device-mapper targets, the nominal public interfaces are the | |
| 6 | +constructor (CTR) tables and the status outputs (both STATUSTYPE_INFO | |
| 7 | +and STATUSTYPE_TABLE). The CTR table looks like the following: | |
| 8 | + | |
| 9 | +1: <s> <l> raid \ | |
| 10 | +2: <raid_type> <#raid_params> <raid_params> \ | |
| 11 | +3: <#raid_devs> <meta_dev1> <dev1> .. <meta_devN> <devN> | |
| 12 | + | |
| 13 | +Line 1 contains the standard first three arguments to any device-mapper | |
| 14 | +target - the start, length, and target type fields. The target type in | |
| 15 | +this case is "raid". | |
| 16 | + | |
| 17 | +Line 2 contains the arguments that define the particular raid | |
| 18 | +type/personality/level, the required arguments for that raid type, and | |
| 19 | +any optional arguments. Possible raid types include: raid4, raid5_la, | |
| 20 | +raid5_ls, raid5_rs, raid6_zr, raid6_nr, and raid6_nc. (raid1 is | |
| 21 | +planned for the future.) The list of required and optional parameters | |
| 22 | +is the same for all the current raid types. The required parameters are | |
| 23 | +positional, while the optional parameters are given as key/value pairs. | |
| 24 | +The possible parameters are as follows: | |
| 25 | + <chunk_size> Chunk size in sectors. | |
| 26 | + [[no]sync] Force/Prevent RAID initialization | |
| 27 | + [rebuild <idx>] Rebuild the drive indicated by the index | |
| 28 | + [daemon_sleep <ms>] Time between bitmap daemon work to clear bits | |
| 29 | + [min_recovery_rate <kB/sec/disk>] Throttle RAID initialization | |
| 30 | + [max_recovery_rate <kB/sec/disk>] Throttle RAID initialization | |
| 31 | + [max_write_behind <sectors>] See '-write-behind=' (man mdadm) | |
| 32 | + [stripe_cache <sectors>] Stripe cache size for higher RAIDs | |
| 33 | + | |
| 34 | +Line 3 contains the list of devices that compose the array in | |
| 35 | +metadata/data device pairs. If the metadata is stored separately, a '-' | |
| 36 | +is given for the metadata device position. If a drive has failed or is | |
| 37 | +missing at creation time, a '-' can be given for both the metadata and | |
| 38 | +data drives for a given position. | |
| 39 | + | |
| 40 | +NB. Currently all metadata devices must be specified as '-'. | |
| 41 | + | |
| 42 | +Examples: | |
| 43 | +# RAID4 - 4 data drives, 1 parity | |
| 44 | +# No metadata devices specified to hold superblock/bitmap info | |
| 45 | +# Chunk size of 1MiB | |
| 46 | +# (Lines separated for easy reading) | |
| 47 | +0 1960893648 raid \ | |
| 48 | + raid4 1 2048 \ | |
| 49 | + 5 - 8:17 - 8:33 - 8:49 - 8:65 - 8:81 | |
| 50 | + | |
| 51 | +# RAID4 - 4 data drives, 1 parity (no metadata devices) | |
| 52 | +# Chunk size of 1MiB, force RAID initialization, | |
| 53 | +# min recovery rate at 20 kiB/sec/disk | |
| 54 | +0 1960893648 raid \ | |
| 55 | + raid4 4 2048 min_recovery_rate 20 sync\ | |
| 56 | + 5 - 8:17 - 8:33 - 8:49 - 8:65 - 8:81 | |
| 57 | + | |
| 58 | +Performing a 'dmsetup table' should display the CTR table used to | |
| 59 | +construct the mapping (with possible reordering of optional | |
| 60 | +parameters). | |
| 61 | + | |
| 62 | +Performing a 'dmsetup status' will yield information on the state and | |
| 63 | +health of the array. The output is as follows: | |
| 64 | +1: <s> <l> raid \ | |
| 65 | +2: <raid_type> <#devices> <1 health char for each dev> <resync_ratio> | |
| 66 | + | |
| 67 | +Line 1 is standard DM output. Line 2 is best shown by example: | |
| 68 | + 0 1960893648 raid raid4 5 AAAAA 2/490221568 | |
| 69 | +Here we can see the RAID type is raid4, there are 5 devices - all of | |
| 70 | +which are 'A'live, and the array is 2/490221568 complete with recovery. | |
File renamed without changes.
| @@ -0,0 +1,28 @@ | ||
| 1 | +EEPROMs (I2C) | |
| 2 | + | |
| 3 | +Required properties: | |
| 4 | + | |
| 5 | + - compatible : should be "<manufacturer>,<type>" | |
| 6 | + If there is no specific driver for <manufacturer>, a generic | |
| 7 | + driver based on <type> is selected. Possible types are: | |
| 8 | + 24c00, 24c01, 24c02, 24c04, 24c08, 24c16, 24c32, 24c64, | |
| 9 | + 24c128, 24c256, 24c512, 24c1024, spd | |
| 10 | + | |
| 11 | + - reg : the I2C address of the EEPROM | |
| 12 | + | |
| 13 | +Optional properties: | |
| 14 | + | |
| 15 | + - pagesize : the length of the pagesize for writing. Please consult the | |
| 16 | + manual of your device, that value varies a lot. A wrong value | |
| 17 | + may result in data loss! If not specified, a safety value of | |
| 18 | + '1' is used which will be very slow. | |
| 19 | + | |
| 20 | + - read-only: this parameterless property disables writes to the eeprom | |
| 21 | + | |
| 22 | +Example: | |
| 23 | + | |
| 24 | +eeprom@52 { | |
| 25 | + compatible = "atmel,24c32"; | |
| 26 | + reg = <0x52>; | |
| 27 | + pagesize = <32>; | |
| 28 | +}; | |
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
| @@ -0,0 +1,52 @@ | ||
| 1 | +PPC4xx Clock Power Management (CPM) node | |
| 2 | + | |
| 3 | +Required properties: | |
| 4 | + - compatible : compatible list, currently only "ibm,cpm" | |
| 5 | + - dcr-access-method : "native" | |
| 6 | + - dcr-reg : < DCR register range > | |
| 7 | + | |
| 8 | +Optional properties: | |
| 9 | + - er-offset : All 4xx SoCs with a CPM controller have | |
| 10 | + one of two different order for the CPM | |
| 11 | + registers. Some have the CPM registers | |
| 12 | + in the following order (ER,FR,SR). The | |
| 13 | + others have them in the following order | |
| 14 | + (SR,ER,FR). For the second case set | |
| 15 | + er-offset = <1>. | |
| 16 | + - unused-units : specifier consist of one cell. For each | |
| 17 | + bit in the cell, the corresponding bit | |
| 18 | + in CPM will be set to turn off unused | |
| 19 | + devices. | |
| 20 | + - idle-doze : specifier consist of one cell. For each | |
| 21 | + bit in the cell, the corresponding bit | |
| 22 | + in CPM will be set to turn off unused | |
| 23 | + devices. This is usually just CPM[CPU]. | |
| 24 | + - standby : specifier consist of one cell. For each | |
| 25 | + bit in the cell, the corresponding bit | |
| 26 | + in CPM will be set on standby and | |
| 27 | + restored on resume. | |
| 28 | + - suspend : specifier consist of one cell. For each | |
| 29 | + bit in the cell, the corresponding bit | |
| 30 | + in CPM will be set on suspend (mem) and | |
| 31 | + restored on resume. Note, for standby | |
| 32 | + and suspend the corresponding bits can | |
| 33 | + be different or the same. Usually for | |
| 34 | + standby only class 2 and 3 units are set. | |
| 35 | + However, the interface does not care. | |
| 36 | + If they are the same, the additional | |
| 37 | + power saving will be seeing if support | |
| 38 | + is available to put the DDR in self | |
| 39 | + refresh mode and any additional power | |
| 40 | + saving techniques for the specific SoC. | |
| 41 | + | |
| 42 | +Example: | |
| 43 | + CPM0: cpm { | |
| 44 | + compatible = "ibm,cpm"; | |
| 45 | + dcr-access-method = "native"; | |
| 46 | + dcr-reg = <0x160 0x003>; | |
| 47 | + er-offset = <0>; | |
| 48 | + unused-units = <0x00000100>; | |
| 49 | + idle-doze = <0x02000000>; | |
| 50 | + standby = <0xfeff0000>; | |
| 51 | + suspend = <0xfeff791d>; | |
| 52 | +}; | |
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
| @@ -13,7 +13,6 @@ Table of Contents · 12 unmodified lines | ||
| 13 | 13 | |
| 14 | 14 | I - Introduction |
| 15 | 15 | 1) Entry point for arch/powerpc |
| 16 | − 2) Board support | |
| 17 | 16 | |
| 18 | 17 | II - The DT block format |
| 19 | 18 | 1) Header |
| @@ -41,13 +40,6 @@ Table of Contents · 21 unmodified lines | ||
| 41 | 40 | VI - System-on-a-chip devices and nodes |
| 42 | 41 | 1) Defining child nodes of an SOC |
| 43 | 42 | 2) Representing devices without a current OF specification |
| 44 | − a) PHY nodes | |
| 45 | − b) Interrupt controllers | |
| 46 | − c) 4xx/Axon EMAC ethernet nodes | |
| 47 | − d) Xilinx IP cores | |
| 48 | − e) USB EHCI controllers | |
| 49 | − f) MDIO on GPIOs | |
| 50 | − g) SPI busses | |
| 51 | 43 | |
| 52 | 44 | VII - Specifying interrupt information for devices |
| 53 | 45 | 1) interrupts property |
| @@ -123,7 +115,7 @@ Revision Information · 69 unmodified lines | ||
| 123 | 115 | I - Introduction |
| 124 | 116 | ================ |
| 125 | 117 | |
| 126 | −During the recent development of the Linux/ppc64 kernel, and more | |
| 118 | +During the development of the Linux/ppc64 kernel, and more | |
| 127 | 119 | specifically, the addition of new platform types outside of the old |
| 128 | 120 | IBM pSeries/iSeries pair, it was decided to enforce some strict rules |
| 129 | 121 | regarding the kernel entry and bootloader <-> kernel interfaces, in |
| @@ -131,7 +123,7 @@ order to avoid the degeneration that had become the ppc32 kernel entry · 1 unmodified line | ||
| 131 | 123 | point and the way a new platform should be added to the kernel. The |
| 132 | 124 | legacy iSeries platform breaks those rules as it predates this scheme, |
| 133 | 125 | but no new board support will be accepted in the main tree that |
| 134 | −doesn't follows them properly. In addition, since the advent of the | |
| 126 | +doesn't follow them properly. In addition, since the advent of the | |
| 135 | 127 | arch/powerpc merged architecture for ppc32 and ppc64, new 32-bit |
| 136 | 128 | platforms and 32-bit platforms which move into arch/powerpc will be |
| 137 | 129 | required to use these rules as well. |
| @@ -146,7 +138,7 @@ section III, but, for example, the kernel does not require you to · 8 unmodified lines | ||
| 146 | 138 | create a node for every PCI device in the system. It is a requirement |
| 147 | 139 | to have a node for PCI host bridges in order to provide interrupt |
| 148 | 140 | routing informations and memory/IO ranges, among others. It is also |
| 149 | −recommended to define nodes for on chip devices and other busses that | |
| 141 | +recommended to define nodes for on chip devices and other buses that | |
| 150 | 142 | don't specifically fit in an existing OF specification. This creates a |
| 151 | 143 | great flexibility in the way the kernel can then probe those and match |
| 152 | 144 | drivers to device, without having to hard code all sorts of tables. It |
| @@ -158,7 +150,7 @@ it with special cases. · 5 unmodified lines | ||
| 158 | 150 | 1) Entry point for arch/powerpc |
| 159 | 151 | ------------------------------- |
| 160 | 152 | |
| 161 | − There is one and one single entry point to the kernel, at the start | |
| 153 | + There is one single entry point to the kernel, at the start | |
| 162 | 154 | of the kernel image. That entry point supports two calling |
| 163 | 155 | conventions: |
| 164 | 156 | |
| @@ -210,12 +202,6 @@ it with special cases. · 45 unmodified lines | ||
| 210 | 202 | with all CPUs. The way to do that with method b) will be |
| 211 | 203 | described in a later revision of this document. |
| 212 | 204 | |
| 213 | − | |
| 214 | −2) Board support | |
| 215 | −---------------- | |
| 216 | − | |
| 217 | −64-bit kernels: | |
| 218 | − | |
| 219 | 205 | Board supports (platforms) are not exclusive config options. An |
| 220 | 206 | arbitrary set of board supports can be built in a single kernel |
| 221 | 207 | image. The kernel will "know" what set of functions to use for a |
| @@ -234,48 +220,11 @@ it with special cases. · 12 unmodified lines | ||
| 234 | 220 | containing the various callbacks that the generic code will |
| 235 | 221 | use to get to your platform specific code |
| 236 | 222 | |
| 237 | − c) Add a reference to your "ppc_md" structure in the | |
| 238 | − "machines" table in arch/powerpc/kernel/setup_64.c if you are | |
| 239 | − a 64-bit platform. | |
| 240 | − | |
| 241 | − d) request and get assigned a platform number (see PLATFORM_* | |
| 242 | − constants in arch/powerpc/include/asm/processor.h | |
| 243 | − | |
| 244 | −32-bit embedded kernels: | |
| 245 | − | |
| 246 | − Currently, board support is essentially an exclusive config option. | |
| 247 | − The kernel is configured for a single platform. Part of the reason | |
| 248 | − for this is to keep kernels on embedded systems small and efficient; | |
| 249 | − part of this is due to the fact the code is already that way. In the | |
| 250 | − future, a kernel may support multiple platforms, but only if the | |
| 223 | + A kernel image may support multiple platforms, but only if the | |
| 251 | 224 | platforms feature the same core architecture. A single kernel build |
| 252 | 225 | cannot support both configurations with Book E and configurations |
| 253 | 226 | with classic Powerpc architectures. |
| 254 | 227 | |
| 255 | − 32-bit embedded platforms that are moved into arch/powerpc using a | |
| 256 | − flattened device tree should adopt the merged tree practice of | |
| 257 | − setting ppc_md up dynamically, even though the kernel is currently | |
| 258 | − built with support for only a single platform at a time. This allows | |
| 259 | − unification of the setup code, and will make it easier to go to a | |
| 260 | − multiple-platform-support model in the future. | |
| 261 | − | |
| 262 | −NOTE: I believe the above will be true once Ben's done with the merge | |
| 263 | −of the boot sequences.... someone speak up if this is wrong! | |
| 264 | − | |
| 265 | − To add a 32-bit embedded platform support, follow the instructions | |
| 266 | − for 64-bit platforms above, with the exception that the Kconfig | |
| 267 | − option should be set up such that the kernel builds exclusively for | |
| 268 | − the platform selected. The processor type for the platform should | |
| 269 | − enable another config option to select the specific board | |
| 270 | − supported. | |
| 271 | − | |
| 272 | −NOTE: If Ben doesn't merge the setup files, may need to change this to | |
| 273 | −point to setup_32.c | |
| 274 | − | |
| 275 | − | |
| 276 | − I will describe later the boot process and various callbacks that | |
| 277 | − your platform should implement. | |
| 278 | − | |
| 279 | 228 | |
| 280 | 229 | II - The DT block format |
| 281 | 230 | ======================== |
| @@ -300,8 +249,8 @@ the block to RAM before passing it to the kernel. · 18 unmodified lines | ||
| 300 | 249 | 1) Header |
| 301 | 250 | --------- |
| 302 | 251 | |
| 303 | − The kernel is entered with r3 pointing to an area of memory that is | |
| 304 | − roughly described in arch/powerpc/include/asm/prom.h by the structure | |
| 252 | + The kernel is passed the physical address pointing to an area of memory | |
| 253 | + that is roughly described in include/linux/of_fdt.h by the structure | |
| 305 | 254 | boot_param_header: |
| 306 | 255 | |
| 307 | 256 | struct boot_param_header { |
| @@ -339,7 +288,7 @@ struct boot_param_header { · 31 unmodified lines | ||
| 339 | 288 | All values in this header are in big endian format, the various |
| 340 | 289 | fields in this header are defined more precisely below. All |
| 341 | 290 | "offset" values are in bytes from the start of the header; that is |
| 342 | − from the value of r3. | |
| 291 | + from the physical base address of the device tree block. | |
| 343 | 292 | |
| 344 | 293 | - magic |
| 345 | 294 | |
| @@ -437,7 +386,7 @@ struct boot_param_header { · 91 unmodified lines | ||
| 437 | 386 | |
| 438 | 387 | |
| 439 | 388 | ------------------------------ |
| 440 | − r3 -> | struct boot_param_header | | |
| 389 | + base -> | struct boot_param_header | | |
| 441 | 390 | ------------------------------ |
| 442 | 391 | | (alignment gap) (*) | |
| 443 | 392 | ------------------------------ |
| @@ -457,7 +406,7 @@ struct boot_param_header { · 13 unmodified lines | ||
| 457 | 406 | -----> ------------------------------ |
| 458 | 407 | | |
| 459 | 408 | | |
| 460 | − --- (r3 + totalsize) | |
| 409 | + --- (base + totalsize) | |
| 461 | 410 | |
| 462 | 411 | (*) The alignment gaps are not necessarily present; their presence |
| 463 | 412 | and size are dependent on the various alignment requirements of |
| @@ -500,7 +449,7 @@ the device-tree structure. It is typically used to represent "path" in · 36 unmodified lines | ||
| 500 | 449 | the device-tree. More details about the actual format of these will be |
| 501 | 450 | below. |
| 502 | 451 | |
| 503 | −The kernel powerpc generic code does not make any formal use of the | |
| 452 | +The kernel generic code does not make any formal use of the | |
| 504 | 453 | unit address (though some board support code may do) so the only real |
| 505 | 454 | requirement here for the unit address is to ensure uniqueness of |
| 506 | 455 | the node unit name at a given level of the tree. Nodes with no notion |
| @@ -518,20 +467,21 @@ path to the root node is "/". · 11 unmodified lines | ||
| 518 | 467 | |
| 519 | 468 | Every node which actually represents an actual device (that is, a node |
| 520 | 469 | which isn't only a virtual "container" for more nodes, like "/cpus" |
| 521 | −is) is also required to have a "device_type" property indicating the | |
| 522 | −type of node . | |
| 470 | +is) is also required to have a "compatible" property indicating the | |
| 471 | +specific hardware and an optional list of devices it is fully | |
| 472 | +backwards compatible with. | |
| 523 | 473 | |
| 524 | 474 | Finally, every node that can be referenced from a property in another |
| 525 | −node is required to have a "linux,phandle" property. Real open | |
| 526 | −firmware implementations provide a unique "phandle" value for every | |
| 527 | −node that the "prom_init()" trampoline code turns into | |
| 528 | −"linux,phandle" properties. However, this is made optional if the | |
| 529 | −flattened device tree is used directly. An example of a node | |
| 475 | +node is required to have either a "phandle" or a "linux,phandle" | |
| 476 | +property. Real Open Firmware implementations provide a unique | |
| 477 | +"phandle" value for every node that the "prom_init()" trampoline code | |
| 478 | +turns into "linux,phandle" properties. However, this is made optional | |
| 479 | +if the flattened device tree is used directly. An example of a node | |
| 530 | 480 | referencing another node via "phandle" is when laying out the |
| 531 | 481 | interrupt tree which will be described in a further version of this |
| 532 | 482 | document. |
| 533 | 483 | |
| 534 | −This "linux, phandle" property is a 32-bit value that uniquely | |
| 484 | +The "phandle" property is a 32-bit value that uniquely | |
| 535 | 485 | identifies a node. You are free to use whatever values or system of |
| 536 | 486 | values, internal pointers, or whatever to generate these, the only |
| 537 | 487 | requirement is that every node for which you provide that property has |
| @@ -694,7 +644,7 @@ made of 3 cells, the bottom two containing the actual address itself · 156 unmodified lines | ||
| 694 | 644 | while the top cell contains address space indication, flags, and pci |
| 695 | 645 | bus & device numbers. |
| 696 | 646 | |
| 697 | −For busses that support dynamic allocation, it's the accepted practice | |
| 647 | +For buses that support dynamic allocation, it's the accepted practice | |
| 698 | 648 | to then not provide the address in "reg" (keep it 0) though while |
| 699 | 649 | providing a flag indicating the address is dynamically allocated, and |
| 700 | 650 | then, to provide a separate "assigned-addresses" property that |
| @@ -711,7 +661,7 @@ prom_parse.c file of the recent kernels for your bus type. · 10 unmodified lines | ||
| 711 | 661 | The "reg" property only defines addresses and sizes (if #size-cells is |
| 712 | 662 | non-0) within a given bus. In order to translate addresses upward |
| 713 | 663 | (that is into parent bus addresses, and possibly into CPU physical |
| 714 | −addresses), all busses must contain a "ranges" property. If the | |
| 664 | +addresses), all buses must contain a "ranges" property. If the | |
| 715 | 665 | "ranges" property is missing at a given level, it's assumed that |
| 716 | 666 | translation isn't possible, i.e., the registers are not visible on the |
| 717 | 667 | parent bus. The format of the "ranges" property for a bus is a list |
| @@ -727,9 +677,9 @@ example, for a PCI host controller, that would be a CPU address. For a · 9 unmodified lines | ||
| 727 | 677 | PCI<->ISA bridge, that would be a PCI address. It defines the base |
| 728 | 678 | address in the parent bus where the beginning of that range is mapped. |
| 729 | 679 | |
| 730 | −For a new 64-bit powerpc board, I recommend either the 2/2 format or | |
| 680 | +For new 64-bit board support, I recommend either the 2/2 format or | |
| 731 | 681 | Apple's 2/1 format which is slightly more compact since sizes usually |
| 732 | −fit in a single 32-bit word. New 32-bit powerpc boards should use a | |
| 682 | +fit in a single 32-bit word. New 32-bit board support should use a | |
| 733 | 683 | 1/1 format, unless the processor supports physical addresses greater |
| 734 | 684 | than 32-bits, in which case a 2/1 format is recommended. |
| 735 | 685 | |
| @@ -754,7 +704,7 @@ of their actual names. · 18 unmodified lines | ||
| 754 | 704 | While earlier users of Open Firmware like OldWorld macintoshes tended |
| 755 | 705 | to use the actual device name for the "name" property, it's nowadays |
| 756 | 706 | considered a good practice to use a name that is closer to the device |
| 757 | −class (often equal to device_type). For example, nowadays, ethernet | |
| 707 | +class (often equal to device_type). For example, nowadays, Ethernet | |
| 758 | 708 | controllers are named "ethernet", an additional "model" property |
| 759 | 709 | defining precisely the chip type/model, and "compatible" property |
| 760 | 710 | defining the family in case a single driver can driver more than one |
| @@ -772,7 +722,7 @@ is present). · 11 unmodified lines | ||
| 772 | 722 | 4) Note about node and property names and character set |
| 773 | 723 | ------------------------------------------------------- |
| 774 | 724 | |
| 775 | −While open firmware provides more flexible usage of 8859-1, this | |
| 725 | +While Open Firmware provides more flexible usage of 8859-1, this | |
| 776 | 726 | specification enforces more strict rules. Nodes and properties should |
| 777 | 727 | be comprised only of ASCII characters 'a' to 'z', '0' to |
| 778 | 728 | '9', ',', '.', '_', '+', '#', '?', and '-'. Node names additionally |
| @@ -792,7 +742,7 @@ address which can extend beyond that limit. · 13 unmodified lines | ||
| 792 | 742 | -------------------------------- |
| 793 | 743 | These are all that are currently required. However, it is strongly |
| 794 | 744 | recommended that you expose PCI host bridges as documented in the |
| 795 | − PCI binding to open firmware, and your interrupt tree as documented | |
| 745 | + PCI binding to Open Firmware, and your interrupt tree as documented | |
| 796 | 746 | in OF interrupt tree specification. |
| 797 | 747 | |
| 798 | 748 | a) The root node |
| @@ -802,20 +752,12 @@ address which can extend beyond that limit. · 3 unmodified lines | ||
| 802 | 752 | - model : this is your board name/model |
| 803 | 753 | - #address-cells : address representation for "root" devices |
| 804 | 754 | - #size-cells: the size representation for "root" devices |
| 805 | − - device_type : This property shouldn't be necessary. However, if | |
| 806 | − you decide to create a device_type for your root node, make sure it | |
| 807 | − is _not_ "chrp" unless your platform is a pSeries or PAPR compliant | |
| 808 | − one for 64-bit, or a CHRP-type machine for 32-bit as this will | |
| 809 | − matched by the kernel this way. | |
| 810 | − | |
| 811 | − Additionally, some recommended properties are: | |
| 812 | − | |
| 813 | 755 | - compatible : the board "family" generally finds its way here, |
| 814 | 756 | for example, if you have 2 board models with a similar layout, |
| 815 | 757 | that typically get driven by the same platform code in the |
| 816 | − kernel, you would use a different "model" property but put a | |
| 817 | − value in "compatible". The kernel doesn't directly use that | |
| 818 | − value but it is generally useful. | |
| 758 | + kernel, you would specify the exact board model in the | |
| 759 | + compatible property followed by an entry that represents the SoC | |
| 760 | + model. | |
| 819 | 761 | |
| 820 | 762 | The root node is also generally where you add additional properties |
| 821 | 763 | specific to your board like the serial number if any, that sort of |
| @@ -841,8 +783,11 @@ address which can extend beyond that limit. · 19 unmodified lines | ||
| 841 | 783 | |
| 842 | 784 | So under /cpus, you are supposed to create a node for every CPU on |
| 843 | 785 | the machine. There is no specific restriction on the name of the |
| 844 | − CPU, though It's common practice to call it PowerPC,<name>. For | |
| 786 | + CPU, though it's common to call it <architecture>,<core>. For | |
| 845 | 787 | example, Apple uses PowerPC,G5 while IBM uses PowerPC,970FX. |
| 788 | + However, the Generic Names convention suggests that it would be | |
| 789 | + better to simply use 'cpu' for each cpu node and use the compatible | |
| 790 | + property to identify the specific cpu core. | |
| 846 | 791 | |
| 847 | 792 | Required properties: |
| 848 | 793 | |
| @@ -923,7 +868,7 @@ compatibility. · 74 unmodified lines | ||
| 923 | 868 | |
| 924 | 869 | e) The /chosen node |
| 925 | 870 | |
| 926 | − This node is a bit "special". Normally, that's where open firmware | |
| 871 | + This node is a bit "special". Normally, that's where Open Firmware | |
| 927 | 872 | puts some variable environment information, like the arguments, or |
| 928 | 873 | the default input/output devices. |
| 929 | 874 | |
| @@ -940,11 +885,7 @@ compatibility. · 10 unmodified lines | ||
| 940 | 885 | console device if any. Typically, if you have serial devices on |
| 941 | 886 | your board, you may want to put the full path to the one set as |
| 942 | 887 | the default console in the firmware here, for the kernel to pick |
| 943 | − it up as its own default console. If you look at the function | |
| 944 | − set_preferred_console() in arch/ppc64/kernel/setup.c, you'll see | |
| 945 | − that the kernel tries to find out the default console and has | |
| 946 | − knowledge of various types like 8250 serial ports. You may want | |
| 947 | − to extend this function to add your own. | |
| 888 | + it up as its own default console. | |
| 948 | 889 | |
| 949 | 890 | Note that u-boot creates and fills in the chosen node for platforms |
| 950 | 891 | that use it. |
| @@ -955,23 +896,23 @@ compatibility. · 4 unmodified lines | ||
| 955 | 896 | |
| 956 | 897 | f) the /soc<SOCname> node |
| 957 | 898 | |
| 958 | − This node is used to represent a system-on-a-chip (SOC) and must be | |
| 959 | − present if the processor is a SOC. The top-level soc node contains | |
| 960 | − information that is global to all devices on the SOC. The node name | |
| 961 | − should contain a unit address for the SOC, which is the base address | |
| 962 | − of the memory-mapped register set for the SOC. The name of an soc | |
| 899 | + This node is used to represent a system-on-a-chip (SoC) and must be | |
| 900 | + present if the processor is a SoC. The top-level soc node contains | |
| 901 | + information that is global to all devices on the SoC. The node name | |
| 902 | + should contain a unit address for the SoC, which is the base address | |
| 903 | + of the memory-mapped register set for the SoC. The name of an SoC | |
| 963 | 904 | node should start with "soc", and the remainder of the name should |
| 964 | 905 | represent the part number for the soc. For example, the MPC8540's |
| 965 | 906 | soc node would be called "soc8540". |
| 966 | 907 | |
| 967 | 908 | Required properties: |
| 968 | 909 | |
| 969 | − - device_type : Should be "soc" | |
| 970 | 910 | - ranges : Should be defined as specified in 1) to describe the |
| 971 | − translation of SOC addresses for memory mapped SOC registers. | |
| 972 | − - bus-frequency: Contains the bus frequency for the SOC node. | |
| 911 | + translation of SoC addresses for memory mapped SoC registers. | |
| 912 | + - bus-frequency: Contains the bus frequency for the SoC node. | |
| 973 | 913 | Typically, the value of this field is filled in by the boot |
| 974 | 914 | loader. |
| 915 | + - compatible : Exact model of the SoC | |
| 975 | 916 | |
| 976 | 917 | |
| 977 | 918 | Recommended properties: |
| @@ -1025,7 +966,7 @@ dtc source code can be found at · 47 unmodified lines | ||
| 1025 | 966 | |
| 1026 | 967 | WARNING: This version is still in early development stage; the |
| 1027 | 968 | resulting device-tree "blobs" have not yet been validated with the |
| 1028 | −kernel. The current generated bloc lacks a useful reserve map (it will | |
| 969 | +kernel. The current generated block lacks a useful reserve map (it will | |
| 1029 | 970 | be fixed to generate an empty one, it's up to the bootloader to fill |
| 1030 | 971 | it up) among others. The error handling needs work, bugs are lurking, |
| 1031 | 972 | etc... |
| @@ -1098,7 +1039,7 @@ supported currently at the toplevel. · 66 unmodified lines | ||
| 1098 | 1039 | * an arbitrary array of bytes |
| 1099 | 1040 | */ |
| 1100 | 1041 | |
| 1101 | − childnode@addresss { /* define a child node named "childnode" | |
| 1042 | + childnode@address { /* define a child node named "childnode" | |
| 1102 | 1043 | * whose unit name is "childnode at |
| 1103 | 1044 | * address" |
| 1104 | 1045 | */ |
| @@ -1155,12 +1096,13 @@ while all this has been defined and implemented. · 50 unmodified lines | ||
| 1155 | 1096 | |
| 1156 | 1097 | - An example of code for iterating nodes & retrieving properties |
| 1157 | 1098 | directly from the flattened tree format can be found in the kernel |
| 1158 | − file arch/ppc64/kernel/prom.c, look at scan_flat_dt() function, | |
| 1099 | + file drivers/of/fdt.c. Look at the of_scan_flat_dt() function, | |
| 1159 | 1100 | its usage in early_init_devtree(), and the corresponding various |
| 1160 | 1101 | early_init_dt_scan_*() callbacks. That code can be re-used in a |
| 1161 | 1102 | GPL bootloader, and as the author of that code, I would be happy |
| 1162 | 1103 | to discuss possible free licensing to any vendor who wishes to |
| 1163 | 1104 | integrate all or part of this code into a non-GPL bootloader. |
| 1105 | + (reference needed; who is 'I' here? ---gcl Jan 31, 2011) | |
| 1164 | 1106 | |
| 1165 | 1107 | |
| 1166 | 1108 | |
| @@ -1203,18 +1145,19 @@ MPC8540. · 36 unmodified lines | ||
| 1203 | 1145 | 2) Representing devices without a current OF specification |
| 1204 | 1146 | ---------------------------------------------------------- |
| 1205 | 1147 | |
| 1206 | −Currently, there are many devices on SOCs that do not have a standard | |
| 1207 | −representation pre-defined as part of the open firmware | |
| 1208 | −specifications, mainly because the boards that contain these SOCs are | |
| 1209 | −not currently booted using open firmware. This section contains | |
| 1210 | −descriptions for the SOC devices for which new nodes have been | |
| 1211 | −defined; this list will expand as more and more SOC-containing | |
| 1212 | −platforms are moved over to use the flattened-device-tree model. | |
| 1148 | +Currently, there are many devices on SoCs that do not have a standard | |
| 1149 | +representation defined as part of the Open Firmware specifications, | |
| 1150 | +mainly because the boards that contain these SoCs are not currently | |
| 1151 | +booted using Open Firmware. Binding documentation for new devices | |
| 1152 | +should be added to the Documentation/devicetree/bindings directory. | |
| 1153 | +That directory will expand as device tree support is added to more and | |
| 1154 | +more SoCs. | |
| 1155 | + | |
| 1213 | 1156 | |
| 1214 | 1157 | VII - Specifying interrupt information for devices |
| 1215 | 1158 | =================================================== |
| 1216 | 1159 | |
| 1217 | −The device tree represents the busses and devices of a hardware | |
| 1160 | +The device tree represents the buses and devices of a hardware | |
| 1218 | 1161 | system in a form similar to the physical bus topology of the |
| 1219 | 1162 | hardware. |
| 1220 | 1163 | |
| @@ -62,6 +62,10 @@ aic7*reg_print.c* · 61 unmodified lines | ||
| 62 | 62 | aic7*seq.h* |
| 63 | 63 | aicasm |
| 64 | 64 | aicdb.h* |
| 65 | +altivec1.c | |
| 66 | +altivec2.c | |
| 67 | +altivec4.c | |
| 68 | +altivec8.c | |
| 65 | 69 | asm-offsets.h |
| 66 | 70 | asm_offsets.h |
| 67 | 71 | autoconf.h* |
| @@ -76,6 +80,7 @@ btfixupprep · 8 unmodified lines | ||
| 76 | 80 | build |
| 77 | 81 | bvmlinux |
| 78 | 82 | bzImage* |
| 83 | +capflags.c | |
| 79 | 84 | classlist.h* |
| 80 | 85 | comp*.log |
| 81 | 86 | compile.h* |
| @@ -94,6 +99,7 @@ devlist.h* · 12 unmodified lines | ||
| 94 | 99 | docproc |
| 95 | 100 | elf2ecoff |
| 96 | 101 | elfconfig.h* |
| 102 | +evergreen_reg_safe.h | |
| 97 | 103 | fixdep |
| 98 | 104 | flask.h |
| 99 | 105 | fore200e_mkfirm |
| @@ -108,9 +114,16 @@ genksyms · 8 unmodified lines | ||
| 108 | 114 | *_gray256.c |
| 109 | 115 | ihex2fw |
| 110 | 116 | ikconfig.h* |
| 117 | +inat-tables.c | |
| 111 | 118 | initramfs_data.cpio |
| 112 | 119 | initramfs_data.cpio.gz |
| 113 | 120 | initramfs_list |
| 121 | +int16.c | |
| 122 | +int1.c | |
| 123 | +int2.c | |
| 124 | +int32.c | |
| 125 | +int4.c | |
| 126 | +int8.c | |
| 114 | 127 | kallsyms |
| 115 | 128 | kconfig |
| 116 | 129 | keywords.c |
| @@ -140,6 +153,7 @@ mkprep · 23 unmodified lines | ||
| 140 | 153 | mktables |
| 141 | 154 | mktree |
| 142 | 155 | modpost |
| 156 | +modules.builtin | |
| 143 | 157 | modules.order |
| 144 | 158 | modversions.h* |
| 145 | 159 | ncscope.* |
| @@ -153,14 +167,23 @@ pca200e.bin · 7 unmodified lines | ||
| 153 | 167 | pca200e_ecd.bin2 |
| 154 | 168 | piggy.gz |
| 155 | 169 | piggyback |
| 170 | +piggy.S | |
| 156 | 171 | pnmtologo |
| 157 | 172 | ppc_defs.h* |
| 158 | 173 | pss_boot.h |
| 159 | 174 | qconf |
| 175 | +r100_reg_safe.h | |
| 176 | +r200_reg_safe.h | |
| 177 | +r300_reg_safe.h | |
| 178 | +r420_reg_safe.h | |
| 179 | +r600_reg_safe.h | |
| 160 | 180 | raid6altivec*.c |
| 161 | 181 | raid6int*.c |
| 162 | 182 | raid6tables.c |
| 163 | 183 | relocs |
| 184 | +rn50_reg_safe.h | |
| 185 | +rs600_reg_safe.h | |
| 186 | +rv515_reg_safe.h | |
| 164 | 187 | series |
| 165 | 188 | setup |
| 166 | 189 | setup.bin |
| @@ -169,6 +192,7 @@ sImage · 2 unmodified lines | ||
| 169 | 192 | sm_tbl* |
| 170 | 193 | split-include |
| 171 | 194 | syscalltab.h |
| 195 | +tables.c | |
| 172 | 196 | tags |
| 173 | 197 | tftpboot.img |
| 174 | 198 | timeconst.h |
| @@ -190,6 +214,7 @@ vmlinux · 15 unmodified lines | ||
| 190 | 214 | vmlinux-* |
| 191 | 215 | vmlinux.aout |
| 192 | 216 | vmlinux.lds |
| 217 | +voffset.h | |
| 193 | 218 | vsyscall.lds |
| 194 | 219 | vsyscall_32.lds |
| 195 | 220 | wanxlfw.inc |
| @@ -200,3 +225,4 @@ wakeup.elf · 4 unmodified lines | ||
| 200 | 225 | wakeup.lds |
| 201 | 226 | zImage* |
| 202 | 227 | zconf.hash.c |
| 228 | +zoffset.h | |
| @@ -46,7 +46,7 @@ and run · 45 unmodified lines | ||
| 46 | 46 | Other LG firmware can be extracted manually from US280D.sys |
| 47 | 47 | only found in windows/system32/driver. |
| 48 | 48 | |
| 49 | −dd if=US280D.sys ibs=1 skip=42616 count=3668 of=dvb-usb-lme2510-lg.fw | |
| 49 | +dd if=US280D.sys ibs=1 skip=42360 count=3924 of=dvb-usb-lme2510-lg.fw | |
| 50 | 50 | |
| 51 | 51 | for DM04 LME2510C (LG Tuner) |
| 52 | 52 | --------------------------- |
| @@ -104,6 +104,13 @@ Then from the "Message" menu item, select insert file and choose your patch. · 103 unmodified lines | ||
| 104 | 104 | As an added bonus you can customise the message creation toolbar menu |
| 105 | 105 | and put the "insert file" icon there. |
| 106 | 106 | |
| 107 | +Make the the composer window wide enough so that no lines wrap. As of | |
| 108 | +KMail 1.13.5 (KDE 4.5.4), KMail will apply word wrapping when sending | |
| 109 | +the email if the lines wrap in the composer window. Having word wrapping | |
| 110 | +disabled in the Options menu isn't enough. Thus, if your patch has very | |
| 111 | +long lines, you must make the composer window very wide before sending | |
| 112 | +the email. See: https://bugs.kde.org/show_bug.cgi?id=174034 | |
| 113 | + | |
| 107 | 114 | You can safely GPG sign attachments, but inlined text is preferred for |
| 108 | 115 | patches so do not GPG sign them. Signing patches that have been inserted |
| 109 | 116 | as inlined text will make them tricky to extract from their 7-bit encoding. |
| @@ -179,26 +186,8 @@ Sylpheed (GUI) · 69 unmodified lines | ||
| 179 | 186 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| 180 | 187 | Thunderbird (GUI) |
| 181 | 188 | |
| 182 | −By default, thunderbird likes to mangle text, but there are ways to | |
| 183 | −coerce it into being nice. | |
| 184 | − | |
| 185 | −- Under account settings, composition and addressing, uncheck "Compose | |
| 186 | − messages in HTML format". | |
| 187 | − | |
| 188 | −- Edit your Thunderbird config settings to tell it not to wrap lines: | |
| 189 | − user_pref("mailnews.wraplength", 0); | |
| 190 | − | |
| 191 | −- Edit your Thunderbird config settings so that it won't use format=flowed: | |
| 192 | − user_pref("mailnews.send_plaintext_flowed", false); | |
| 193 | − | |
| 194 | −- You need to get Thunderbird into preformat mode: | |
| 195 | −. If you compose HTML messages by default, it's not too hard. Just select | |
| 196 | − "Preformat" from the drop-down box just under the subject line. | |
| 197 | −. If you compose in text by default, you have to tell it to compose a new | |
| 198 | − message in HTML (just as a one-off), and then force it from there back to | |
| 199 | − text, else it will wrap lines. To do this, use shift-click on the Write | |
| 200 | − icon to compose to get HTML compose mode, then select "Preformat" from | |
| 201 | − the drop-down box just under the subject line. | |
| 189 | +Thunderbird is an Outlook clone that likes to mangle text, but there are ways | |
| 190 | +to coerce it into behaving. | |
| 202 | 191 | |
| 203 | 192 | - Allows use of an external editor: |
| 204 | 193 | The easiest thing to do with Thunderbird and patches is to use an |
| @@ -208,6 +197,27 @@ coerce it into being nice. · 3 unmodified lines | ||
| 208 | 197 | View->Toolbars->Customize... and finally just click on it when in the |
| 209 | 198 | Compose dialog. |
| 210 | 199 | |
| 200 | +To beat some sense out of the internal editor, do this: | |
| 201 | + | |
| 202 | +- Under account settings, composition and addressing, uncheck "Compose | |
| 203 | + messages in HTML format". | |
| 204 | + | |
| 205 | +- Edit your Thunderbird config settings so that it won't use format=flowed. | |
| 206 | + Go to "edit->preferences->advanced->config editor" to bring up the | |
| 207 | + thunderbird's registry editor, and set "mailnews.send_plaintext_flowed" to | |
| 208 | + "false". | |
| 209 | + | |
| 210 | +- Enable "preformat" mode: Shft-click on the Write icon to bring up the HTML | |
| 211 | + composer, select "Preformat" from the drop-down box just under the subject | |
| 212 | + line, then close the message without saving. (This setting also applies to | |
| 213 | + the text composer, but the only control for it is in the HTML composer.) | |
| 214 | + | |
| 215 | +- Install the "toggle wordwrap" extension. Download the file from: | |
| 216 | + https://addons.mozilla.org/thunderbird/addon/2351/ | |
| 217 | + Then go to "tools->add ons", select "install" at the bottom of the screen, | |
| 218 | + and browse to where you saved the .xul file. This adds an "Enable | |
| 219 | + Wordwrap" entry under the Options menu of the message composer. | |
| 220 | + | |
| 211 | 221 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| 212 | 222 | TkRat (GUI) |
| 213 | 223 | |
File renamed without changes.
| @@ -97,36 +97,38 @@ Who: Pavel Machek <pavel@ucw.cz> · 96 unmodified lines | ||
| 97 | 97 | |
| 98 | 98 | --------------------------- |
| 99 | 99 | |
| 100 | −What: Video4Linux API 1 ioctls and from Video devices. | |
| 101 | −When: kernel 2.6.38 | |
| 102 | −Files: include/linux/videodev.h | |
| 103 | −Check: include/linux/videodev.h | |
| 104 | −Why: V4L1 AP1 was replaced by V4L2 API during migration from 2.4 to 2.6 | |
| 105 | − series. The old API have lots of drawbacks and don't provide enough | |
| 106 | − means to work with all video and audio standards. The newer API is | |
| 107 | − already available on the main drivers and should be used instead. | |
| 108 | − Newer drivers should use v4l_compat_translate_ioctl function to handle | |
| 109 | − old calls, replacing to newer ones. | |
| 110 | − Decoder iocts are using internally to allow video drivers to | |
| 111 | − communicate with video decoders. This should also be improved to allow | |
| 112 | − V4L2 calls being translated into compatible internal ioctls. | |
| 113 | − Compatibility ioctls will be provided, for a while, via | |
| 114 | − v4l1-compat module. | |
| 115 | −Who: Mauro Carvalho Chehab <mchehab@infradead.org> | |
| 116 | − | |
| 117 | −--------------------------- | |
| 118 | − | |
| 119 | 100 | What: Video4Linux obsolete drivers using V4L1 API |
| 120 | −When: kernel 2.6.38 | |
| 121 | −Files: drivers/staging/cpia/* drivers/staging/stradis/* | |
| 122 | −Check: drivers/staging/cpia/cpia.c drivers/staging/stradis/stradis.c | |
| 101 | +When: kernel 2.6.39 | |
| 102 | +Files: drivers/staging/se401/* drivers/staging/usbvideo/* | |
| 103 | +Check: drivers/staging/se401/se401.c drivers/staging/usbvideo/usbvideo.c | |
| 123 | 104 | Why: There are some drivers still using V4L1 API, despite all efforts we've done |
| 124 | 105 | to migrate. Those drivers are for obsolete hardware that the old maintainer |
| 125 | 106 | didn't care (or not have the hardware anymore), and that no other developer |
| 126 | 107 | could find any hardware to buy. They probably have no practical usage today, |
| 127 | 108 | and people with such old hardware could probably keep using an older version |
| 128 | − of the kernel. Those drivers will be moved to staging on 2.6.37 and, if nobody | |
| 129 | − care enough to port and test them with V4L2 API, they'll be removed on 2.6.38. | |
| 109 | + of the kernel. Those drivers will be moved to staging on 2.6.38 and, if nobody | |
| 110 | + cares enough to port and test them with V4L2 API, they'll be removed on 2.6.39. | |
| 111 | +Who: Mauro Carvalho Chehab <mchehab@infradead.org> | |
| 112 | + | |
| 113 | +--------------------------- | |
| 114 | + | |
| 115 | +What: Video4Linux: Remove obsolete ioctl's | |
| 116 | +When: kernel 2.6.39 | |
| 117 | +Files: include/media/videodev2.h | |
| 118 | +Why: Some ioctl's were defined wrong on 2.6.2 and 2.6.6, using the wrong | |
| 119 | + type of R/W arguments. They were fixed, but the old ioctl names are | |
| 120 | + still there, maintained to avoid breaking binary compatibility: | |
| 121 | + #define VIDIOC_OVERLAY_OLD _IOWR('V', 14, int) | |
| 122 | + #define VIDIOC_S_PARM_OLD _IOW('V', 22, struct v4l2_streamparm) | |
| 123 | + #define VIDIOC_S_CTRL_OLD _IOW('V', 28, struct v4l2_control) | |
| 124 | + #define VIDIOC_G_AUDIO_OLD _IOWR('V', 33, struct v4l2_audio) | |
| 125 | + #define VIDIOC_G_AUDOUT_OLD _IOWR('V', 49, struct v4l2_audioout) | |
| 126 | + #define VIDIOC_CROPCAP_OLD _IOR('V', 58, struct v4l2_cropcap) | |
| 127 | + There's no sense on preserving those forever, as it is very doubtful | |
| 128 | + that someone would try to use a such old binary with a modern kernel. | |
| 129 | + Removing them will allow us to remove some magic done at the V4L ioctl | |
| 130 | + handler. | |
| 131 | + | |
| 130 | 132 | Who: Mauro Carvalho Chehab <mchehab@infradead.org> |
| 131 | 133 | |
| 132 | 134 | --------------------------- |
| @@ -191,6 +193,20 @@ Why: /proc/<pid>/oom_adj allows userspace to influence the oom killer's · 58 unmodified lines | ||
| 191 | 193 | |
| 192 | 194 | --------------------------- |
| 193 | 195 | |
| 196 | +What: CS5535/CS5536 obsolete GPIO driver | |
| 197 | +When: June 2011 | |
| 198 | +Files: drivers/staging/cs5535_gpio/* | |
| 199 | +Check: drivers/staging/cs5535_gpio/cs5535_gpio.c | |
| 200 | +Why: A newer driver replaces this; it is drivers/gpio/cs5535-gpio.c, and | |
| 201 | + integrates with the Linux GPIO subsystem. The old driver has been | |
| 202 | + moved to staging, and will be removed altogether around 2.6.40. | |
| 203 | + Please test the new driver, and ensure that the functionality you | |
| 204 | + need and any bugfixes from the old driver are available in the new | |
| 205 | + one. | |
| 206 | +Who: Andres Salomon <dilinger@queued.net> | |
| 207 | + | |
| 208 | +-------------------------- | |
| 209 | + | |
| 194 | 210 | What: remove EXPORT_SYMBOL(kernel_thread) |
| 195 | 211 | When: August 2006 |
| 196 | 212 | Files: arch/*/kernel/*_ksyms.c |
| @@ -232,6 +248,17 @@ Who: Zhang Rui <rui.zhang@intel.com> · 35 unmodified lines | ||
| 232 | 248 | |
| 233 | 249 | --------------------------- |
| 234 | 250 | |
| 251 | +What: CONFIG_ACPI_PROCFS_POWER | |
| 252 | +When: 2.6.39 | |
| 253 | +Why: sysfs I/F for ACPI power devices, including AC and Battery, | |
| 254 | + has been working in upstream kenrel since 2.6.24, Sep 2007. | |
| 255 | + In 2.6.37, we make the sysfs I/F always built in and this option | |
| 256 | + disabled by default. | |
| 257 | + Remove this option and the ACPI power procfs interface in 2.6.39. | |
| 258 | +Who: Zhang Rui <rui.zhang@intel.com> | |
| 259 | + | |
| 260 | +--------------------------- | |
| 261 | + | |
| 235 | 262 | What: /proc/acpi/button |
| 236 | 263 | When: August 2007 |
| 237 | 264 | Why: /proc/acpi/button has been replaced by events to the input layer |
| @@ -330,14 +357,6 @@ Who: Dave Jones <davej@redhat.com>, Matthew Garrett <mjg@redhat.com> · 92 unmodified lines | ||
| 330 | 357 | |
| 331 | 358 | ----------------------------- |
| 332 | 359 | |
| 333 | −What: __do_IRQ all in one fits nothing interrupt handler | |
| 334 | −When: 2.6.32 | |
| 335 | −Why: __do_IRQ was kept for easy migration to the type flow handlers. | |
| 336 | − More than two years of migration time is enough. | |
| 337 | −Who: Thomas Gleixner <tglx@linutronix.de> | |
| 338 | − | |
| 339 | −----------------------------- | |
| 340 | − | |
| 341 | 360 | What: fakephp and associated sysfs files in /sys/bus/pci/slots/ |
| 342 | 361 | When: 2011 |
| 343 | 362 | Why: In 2.6.27, the semantics of /sys/bus/pci/slots was redefined to |
| @@ -564,3 +583,39 @@ Why: This field is deprecated. I2C device drivers shouldn't change their · 220 unmodified lines | ||
| 564 | 583 | Who: Jean Delvare <khali@linux-fr.org> |
| 565 | 584 | |
| 566 | 585 | ---------------------------- |
| 586 | + | |
| 587 | +What: cancel_rearming_delayed_work[queue]() | |
| 588 | +When: 2.6.39 | |
| 589 | + | |
| 590 | +Why: The functions have been superceded by cancel_delayed_work_sync() | |
| 591 | + quite some time ago. The conversion is trivial and there is no | |
| 592 | + in-kernel user left. | |
| 593 | +Who: Tejun Heo <tj@kernel.org> | |
| 594 | + | |
| 595 | +---------------------------- | |
| 596 | + | |
| 597 | +What: Legacy, non-standard chassis intrusion detection interface. | |
| 598 | +When: June 2011 | |
| 599 | +Why: The adm9240, w83792d and w83793 hardware monitoring drivers have | |
| 600 | + legacy interfaces for chassis intrusion detection. A standard | |
| 601 | + interface has been added to each driver, so the legacy interface | |
| 602 | + can be removed. | |
| 603 | +Who: Jean Delvare <khali@linux-fr.org> | |
| 604 | + | |
| 605 | +---------------------------- | |
| 606 | + | |
| 607 | +What: noswapaccount kernel command line parameter | |
| 608 | +When: 2.6.40 | |
| 609 | +Why: The original implementation of memsw feature enabled by | |
| 610 | + CONFIG_CGROUP_MEM_RES_CTLR_SWAP could be disabled by the noswapaccount | |
| 611 | + kernel parameter (introduced in 2.6.29-rc1). Later on, this decision | |
| 612 | + turned out to be not ideal because we cannot have the feature compiled | |
| 613 | + in and disabled by default and let only interested to enable it | |
| 614 | + (e.g. general distribution kernels might need it). Therefore we have | |
| 615 | + added swapaccount[=0|1] parameter (introduced in 2.6.37) which provides | |
| 616 | + the both possibilities. If we remove noswapaccount we will have | |
| 617 | + less command line parameters with the same functionality and we | |
| 618 | + can also cleanup the parameter handling a bit (). | |
| 619 | +Who: Michal Hocko <mhocko@suse.cz> | |
| 620 | + | |
| 621 | +---------------------------- | |
| @@ -9,23 +9,30 @@ be able to use diff(1). · 8 unmodified lines | ||
| 9 | 9 | |
| 10 | 10 | --------------------------- dentry_operations -------------------------- |
| 11 | 11 | prototypes: |
| 12 | − int (*d_revalidate)(struct dentry *, int); | |
| 13 | − int (*d_hash) (struct dentry *, struct qstr *); | |
| 14 | − int (*d_compare) (struct dentry *, struct qstr *, struct qstr *); | |
| 12 | + int (*d_revalidate)(struct dentry *, struct nameidata *); | |
| 13 | + int (*d_hash)(const struct dentry *, const struct inode *, | |
| 14 | + struct qstr *); | |
| 15 | + int (*d_compare)(const struct dentry *, const struct inode *, | |
| 16 | + const struct dentry *, const struct inode *, | |
| 17 | + unsigned int, const char *, const struct qstr *); | |
| 15 | 18 | int (*d_delete)(struct dentry *); |
| 16 | 19 | void (*d_release)(struct dentry *); |
| 17 | 20 | void (*d_iput)(struct dentry *, struct inode *); |
| 18 | 21 | char *(*d_dname)((struct dentry *dentry, char *buffer, int buflen); |
| 22 | + struct vfsmount *(*d_automount)(struct path *path); | |
| 23 | + int (*d_manage)(struct dentry *, bool); | |
| 19 | 24 | |
| 20 | 25 | locking rules: |
| 21 | − dcache_lock rename_lock ->d_lock may block | |
| 22 | −d_revalidate: no no no yes | |
| 23 | −d_hash no no no yes | |
| 24 | −d_compare: no yes no no | |
| 25 | −d_delete: yes no yes no | |
| 26 | −d_release: no no no yes | |
| 27 | −d_iput: no no no yes | |
| 26 | + rename_lock ->d_lock may block rcu-walk | |
| 27 | +d_revalidate: no no yes (ref-walk) maybe | |
| 28 | +d_hash no no no maybe | |
| 29 | +d_compare: yes no no maybe | |
| 30 | +d_delete: no yes no no | |
| 31 | +d_release: no no yes no | |
| 32 | +d_iput: no no yes no | |
| 28 | 33 | d_dname: no no no no |
| 34 | +d_automount: no no yes no | |
| 35 | +d_manage: no no yes (ref-walk) maybe | |
| 29 | 36 | |
| 30 | 37 | --------------------------- inode_operations --------------------------- |
| 31 | 38 | prototypes: |
| @@ -44,8 +51,8 @@ ata *); · 12 unmodified lines | ||
| 44 | 51 | void * (*follow_link) (struct dentry *, struct nameidata *); |
| 45 | 52 | void (*put_link) (struct dentry *, struct nameidata *, void *); |
| 46 | 53 | void (*truncate) (struct inode *); |
| 47 | − int (*permission) (struct inode *, int, struct nameidata *); | |
| 48 | − int (*check_acl)(struct inode *, int); | |
| 54 | + int (*permission) (struct inode *, int, unsigned int); | |
| 55 | + int (*check_acl)(struct inode *, int, unsigned int); | |
| 49 | 56 | int (*setattr) (struct dentry *, struct iattr *); |
| 50 | 57 | int (*getattr) (struct vfsmount *, struct dentry *, struct kstat *); |
| 51 | 58 | int (*setxattr) (struct dentry *, const char *,const void *,size_t,int); |
| @@ -53,7 +60,6 @@ ata *); · 1 unmodified line | ||
| 53 | 60 | ssize_t (*listxattr) (struct dentry *, char *, size_t); |
| 54 | 61 | int (*removexattr) (struct dentry *, const char *); |
| 55 | 62 | void (*truncate_range)(struct inode *, loff_t, loff_t); |
| 56 | − long (*fallocate)(struct inode *inode, int mode, loff_t offset, loff_t len); | |
| 57 | 63 | int (*fiemap)(struct inode *, struct fiemap_extent_info *, u64 start, u64 len); |
| 58 | 64 | |
| 59 | 65 | locking rules: |
| @@ -73,7 +79,7 @@ follow_link: no · 13 unmodified lines | ||
| 73 | 79 | put_link: no |
| 74 | 80 | truncate: yes (see below) |
| 75 | 81 | setattr: yes |
| 76 | −permission: no | |
| 82 | +permission: no (may not block if called in rcu-walk mode) | |
| 77 | 83 | check_acl: no |
| 78 | 84 | getattr: no |
| 79 | 85 | setxattr: yes |
| @@ -81,7 +87,6 @@ getxattr: no · 1 unmodified line | ||
| 81 | 87 | listxattr: no |
| 82 | 88 | removexattr: yes |
| 83 | 89 | truncate_range: yes |
| 84 | −fallocate: no | |
| 85 | 90 | fiemap: no |
| 86 | 91 | Additionally, ->rmdir(), ->unlink() and ->rename() have ->i_mutex on |
| 87 | 92 | victim. |
| @@ -340,7 +345,6 @@ prototypes: · 252 unmodified lines | ||
| 340 | 345 | int (*fl_grant)(struct file_lock *, struct file_lock *, int); |
| 341 | 346 | void (*fl_release_private)(struct file_lock *); |
| 342 | 347 | void (*fl_break)(struct file_lock *); /* break_lease callback */ |
| 343 | − int (*fl_mylease)(struct file_lock *, struct file_lock *); | |
| 344 | 348 | int (*fl_change)(struct file_lock **, int); |
| 345 | 349 | |
| 346 | 350 | locking rules: |
| @@ -350,7 +354,6 @@ fl_notify: yes no · 3 unmodified lines | ||
| 350 | 354 | fl_grant: no no |
| 351 | 355 | fl_release_private: maybe no |
| 352 | 356 | fl_break: yes no |
| 353 | −fl_mylease: yes no | |
| 354 | 357 | fl_change yes no |
| 355 | 358 | |
| 356 | 359 | --------------------------- buffer_head ----------------------------------- |
| @@ -432,6 +435,7 @@ prototypes: · 75 unmodified lines | ||
| 432 | 435 | ssize_t (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, |
| 433 | 436 | size_t, unsigned int); |
| 434 | 437 | int (*setlease)(struct file *, long, struct file_lock **); |
| 438 | + long (*fallocate)(struct file *, int, loff_t, loff_t); | |
| 435 | 439 | }; |
| 436 | 440 | |
| 437 | 441 | locking rules: |
| @@ -1,174 +0,0 @@ | ||
| 1 | −RCU-based dcache locking model | |
| 2 | −============================== | |
| 3 | − | |
| 4 | −On many workloads, the most common operation on dcache is to look up a | |
| 5 | −dentry, given a parent dentry and the name of the child. Typically, | |
| 6 | −for every open(), stat() etc., the dentry corresponding to the | |
| 7 | −pathname will be looked up by walking the tree starting with the first | |
| 8 | −component of the pathname and using that dentry along with the next | |
| 9 | −component to look up the next level and so on. Since it is a frequent | |
| 10 | −operation for workloads like multiuser environments and web servers, | |
| 11 | −it is important to optimize this path. | |
| 12 | − | |
| 13 | −Prior to 2.5.10, dcache_lock was acquired in d_lookup and thus in | |
| 14 | −every component during path look-up. Since 2.5.10 onwards, fast-walk | |
| 15 | −algorithm changed this by holding the dcache_lock at the beginning and | |
| 16 | −walking as many cached path component dentries as possible. This | |
| 17 | −significantly decreases the number of acquisition of | |
| 18 | −dcache_lock. However it also increases the lock hold time | |
| 19 | −significantly and affects performance in large SMP machines. Since | |
| 20 | −2.5.62 kernel, dcache has been using a new locking model that uses RCU | |
| 21 | −to make dcache look-up lock-free. | |
| 22 | − | |
| 23 | −The current dcache locking model is not very different from the | |
| 24 | −existing dcache locking model. Prior to 2.5.62 kernel, dcache_lock | |
| 25 | −protected the hash chain, d_child, d_alias, d_lru lists as well as | |
| 26 | −d_inode and several other things like mount look-up. RCU-based changes | |
| 27 | −affect only the way the hash chain is protected. For everything else | |
| 28 | −the dcache_lock must be taken for both traversing as well as | |
| 29 | −updating. The hash chain updates too take the dcache_lock. The | |
| 30 | −significant change is the way d_lookup traverses the hash chain, it | |
| 31 | −doesn't acquire the dcache_lock for this and rely on RCU to ensure | |
| 32 | −that the dentry has not been *freed*. | |
| 33 | − | |
| 34 | − | |
| 35 | −Dcache locking details | |
| 36 | −====================== | |
| 37 | − | |
| 38 | −For many multi-user workloads, open() and stat() on files are very | |
| 39 | −frequently occurring operations. Both involve walking of path names to | |
| 40 | −find the dentry corresponding to the concerned file. In 2.4 kernel, | |
| 41 | −dcache_lock was held during look-up of each path component. Contention | |
| 42 | −and cache-line bouncing of this global lock caused significant | |
| 43 | −scalability problems. With the introduction of RCU in Linux kernel, | |
| 44 | −this was worked around by making the look-up of path components during | |
| 45 | −path walking lock-free. | |
| 46 | − | |
| 47 | − | |
| 48 | −Safe lock-free look-up of dcache hash table | |
| 49 | −=========================================== | |
| 50 | − | |
| 51 | −Dcache is a complex data structure with the hash table entries also | |
| 52 | −linked together in other lists. In 2.4 kernel, dcache_lock protected | |
| 53 | −all the lists. We applied RCU only on hash chain walking. The rest of | |
| 54 | −the lists are still protected by dcache_lock. Some of the important | |
| 55 | −changes are : | |
| 56 | − | |
| 57 | −1. The deletion from hash chain is done using hlist_del_rcu() macro | |
| 58 | − which doesn't initialize next pointer of the deleted dentry and | |
| 59 | − this allows us to walk safely lock-free while a deletion is | |
| 60 | − happening. | |
| 61 | − | |
| 62 | −2. Insertion of a dentry into the hash table is done using | |
| 63 | − hlist_add_head_rcu() which take care of ordering the writes - the | |
| 64 | − writes to the dentry must be visible before the dentry is | |
| 65 | − inserted. This works in conjunction with hlist_for_each_rcu(), | |
| 66 | − which has since been replaced by hlist_for_each_entry_rcu(), while | |
| 67 | − walking the hash chain. The only requirement is that all | |
| 68 | − initialization to the dentry must be done before | |
| 69 | − hlist_add_head_rcu() since we don't have dcache_lock protection | |
| 70 | − while traversing the hash chain. This isn't different from the | |
| 71 | − existing code. | |
| 72 | − | |
| 73 | −3. The dentry looked up without holding dcache_lock by cannot be | |
| 74 | − returned for walking if it is unhashed. It then may have a NULL | |
| 75 | − d_inode or other bogosity since RCU doesn't protect the other | |
| 76 | − fields in the dentry. We therefore use a flag DCACHE_UNHASHED to | |
| 77 | − indicate unhashed dentries and use this in conjunction with a | |
| 78 | − per-dentry lock (d_lock). Once looked up without the dcache_lock, | |
| 79 | − we acquire the per-dentry lock (d_lock) and check if the dentry is | |
| 80 | − unhashed. If so, the look-up is failed. If not, the reference count | |
| 81 | − of the dentry is increased and the dentry is returned. | |
| 82 | − | |
| 83 | −4. Once a dentry is looked up, it must be ensured during the path walk | |
| 84 | − for that component it doesn't go away. In pre-2.5.10 code, this was | |
| 85 | − done holding a reference to the dentry. dcache_rcu does the same. | |
| 86 | − In some sense, dcache_rcu path walking looks like the pre-2.5.10 | |
| 87 | − version. | |
| 88 | − | |
| 89 | −5. All dentry hash chain updates must take the dcache_lock as well as | |
| 90 | − the per-dentry lock in that order. dput() does this to ensure that | |
| 91 | − a dentry that has just been looked up in another CPU doesn't get | |
| 92 | − deleted before dget() can be done on it. | |
| 93 | − | |
| 94 | −6. There are several ways to do reference counting of RCU protected | |
| 95 | − objects. One such example is in ipv4 route cache where deferred | |
| 96 | − freeing (using call_rcu()) is done as soon as the reference count | |
| 97 | − goes to zero. This cannot be done in the case of dentries because | |
| 98 | − tearing down of dentries require blocking (dentry_iput()) which | |
| 99 | − isn't supported from RCU callbacks. Instead, tearing down of | |
| 100 | − dentries happen synchronously in dput(), but actual freeing happens | |
| 101 | − later when RCU grace period is over. This allows safe lock-free | |
| 102 | − walking of the hash chains, but a matched dentry may have been | |
| 103 | − partially torn down. The checking of DCACHE_UNHASHED flag with | |
| 104 | − d_lock held detects such dentries and prevents them from being | |
| 105 | − returned from look-up. | |
| 106 | − | |
| 107 | − | |
| 108 | −Maintaining POSIX rename semantics | |
| 109 | −================================== | |
| 110 | − | |
| 111 | −Since look-up of dentries is lock-free, it can race against a | |
| 112 | −concurrent rename operation. For example, during rename of file A to | |
| 113 | −B, look-up of either A or B must succeed. So, if look-up of B happens | |
| 114 | −after A has been removed from the hash chain but not added to the new | |
| 115 | −hash chain, it may fail. Also, a comparison while the name is being | |
| 116 | −written concurrently by a rename may result in false positive matches | |
| 117 | −violating rename semantics. Issues related to race with rename are | |
| 118 | −handled as described below : | |
| 119 | − | |
| 120 | −1. Look-up can be done in two ways - d_lookup() which is safe from | |
| 121 | − simultaneous renames and __d_lookup() which is not. If | |
| 122 | − __d_lookup() fails, it must be followed up by a d_lookup() to | |
| 123 | − correctly determine whether a dentry is in the hash table or | |
| 124 | − not. d_lookup() protects look-ups using a sequence lock | |
| 125 | − (rename_lock). | |
| 126 | − | |
| 127 | −2. The name associated with a dentry (d_name) may be changed if a | |
| 128 | − rename is allowed to happen simultaneously. To avoid memcmp() in | |
| 129 | − __d_lookup() go out of bounds due to a rename and false positive | |
| 130 | − comparison, the name comparison is done while holding the | |
| 131 | − per-dentry lock. This prevents concurrent renames during this | |
| 132 | − operation. | |
| 133 | − | |
| 134 | −3. Hash table walking during look-up may move to a different bucket as | |
| 135 | − the current dentry is moved to a different bucket due to rename. | |
| 136 | − But we use hlists in dcache hash table and they are | |
| 137 | − null-terminated. So, even if a dentry moves to a different bucket, | |
| 138 | − hash chain walk will terminate. [with a list_head list, it may not | |
| 139 | − since termination is when the list_head in the original bucket is | |
| 140 | − reached]. Since we redo the d_parent check and compare name while | |
| 141 | − holding d_lock, lock-free look-up will not race against d_move(). | |
| 142 | − | |
| 143 | −4. There can be a theoretical race when a dentry keeps coming back to | |
| 144 | − original bucket due to double moves. Due to this look-up may | |
| 145 | − consider that it has never moved and can end up in a infinite loop. | |
| 146 | − But this is not any worse that theoretical livelocks we already | |
| 147 | − have in the kernel. | |
| 148 | − | |
| 149 | − | |
| 150 | −Important guidelines for filesystem developers related to dcache_rcu | |
| 151 | −==================================================================== | |
| 152 | − | |
| 153 | −1. Existing dcache interfaces (pre-2.5.62) exported to filesystem | |
| 154 | − don't change. Only dcache internal implementation changes. However | |
| 155 | − filesystems *must not* delete from the dentry hash chains directly | |
| 156 | − using the list macros like allowed earlier. They must use dcache | |
| 157 | − APIs like d_drop() or __d_drop() depending on the situation. | |
| 158 | − | |
| 159 | −2. d_flags is now protected by a per-dentry lock (d_lock). All access | |
| 160 | − to d_flags must be protected by it. | |
| 161 | − | |
| 162 | −3. For a hashed dentry, checking of d_count needs to be protected by | |
| 163 | − d_lock. | |
| 164 | − | |
| 165 | − | |
| 166 | −Papers and other documentation on dcache locking | |
| 167 | −================================================ | |
| 168 | − | |
| 169 | −1. Scaling dcache with RCU (http://linuxjournal.com/article.php?sid=7124). | |
| 170 | − | |
| 171 | −2. http://lse.sourceforge.net/locking/dcache/dcache.html | |
| 172 | − | |
| 173 | − | |
| 174 | − | |
| @@ -457,6 +457,11 @@ ChangeLog · 456 unmodified lines | ||
| 457 | 457 | |
| 458 | 458 | Note, a technical ChangeLog aimed at kernel hackers is in fs/ntfs/ChangeLog. |
| 459 | 459 | |
| 460 | +2.1.30: | |
| 461 | + - Fix writev() (it kept writing the first segment over and over again | |
| 462 | + instead of moving onto subsequent segments). | |
| 463 | + - Fix crash in ntfs_mft_record_alloc() when mapping the new extent mft | |
| 464 | + record failed. | |
| 460 | 465 | 2.1.29: |
| 461 | 466 | - Fix a deadlock when mounting read-write. |
| 462 | 467 | 2.1.28: |
| @@ -0,0 +1,382 @@ | ||
| 1 | +Path walking and name lookup locking | |
| 2 | +==================================== | |
| 3 | + | |
| 4 | +Path resolution is the finding a dentry corresponding to a path name string, by | |
| 5 | +performing a path walk. Typically, for every open(), stat() etc., the path name | |
| 6 | +will be resolved. Paths are resolved by walking the namespace tree, starting | |
| 7 | +with the first component of the pathname (eg. root or cwd) with a known dentry, | |
| 8 | +then finding the child of that dentry, which is named the next component in the | |
| 9 | +path string. Then repeating the lookup from the child dentry and finding its | |
| 10 | +child with the next element, and so on. | |
| 11 | + | |
| 12 | +Since it is a frequent operation for workloads like multiuser environments and | |
| 13 | +web servers, it is important to optimize this code. | |
| 14 | + | |
| 15 | +Path walking synchronisation history: | |
| 16 | +Prior to 2.5.10, dcache_lock was acquired in d_lookup (dcache hash lookup) and | |
| 17 | +thus in every component during path look-up. Since 2.5.10 onwards, fast-walk | |
| 18 | +algorithm changed this by holding the dcache_lock at the beginning and walking | |
| 19 | +as many cached path component dentries as possible. This significantly | |
| 20 | +decreases the number of acquisition of dcache_lock. However it also increases | |
| 21 | +the lock hold time significantly and affects performance in large SMP machines. | |
| 22 | +Since 2.5.62 kernel, dcache has been using a new locking model that uses RCU to | |
| 23 | +make dcache look-up lock-free. | |
| 24 | + | |
| 25 | +All the above algorithms required taking a lock and reference count on the | |
| 26 | +dentry that was looked up, so that may be used as the basis for walking the | |
| 27 | +next path element. This is inefficient and unscalable. It is inefficient | |
| 28 | +because of the locks and atomic operations required for every dentry element | |
| 29 | +slows things down. It is not scalable because many parallel applications that | |
| 30 | +are path-walk intensive tend to do path lookups starting from a common dentry | |
| 31 | +(usually, the root "/" or current working directory). So contention on these | |
| 32 | +common path elements causes lock and cacheline queueing. | |
| 33 | + | |
| 34 | +Since 2.6.38, RCU is used to make a significant part of the entire path walk | |
| 35 | +(including dcache look-up) completely "store-free" (so, no locks, atomics, or | |
| 36 | +even stores into cachelines of common dentries). This is known as "rcu-walk" | |
| 37 | +path walking. | |
| 38 | + | |
| 39 | +Path walking overview | |
| 40 | +===================== | |
| 41 | + | |
| 42 | +A name string specifies a start (root directory, cwd, fd-relative) and a | |
| 43 | +sequence of elements (directory entry names), which together refer to a path in | |
| 44 | +the namespace. A path is represented as a (dentry, vfsmount) tuple. The name | |
| 45 | +elements are sub-strings, seperated by '/'. | |
| 46 | + | |
| 47 | +Name lookups will want to find a particular path that a name string refers to | |
| 48 | +(usually the final element, or parent of final element). This is done by taking | |
| 49 | +the path given by the name's starting point (which we know in advance -- eg. | |
| 50 | +current->fs->cwd or current->fs->root) as the first parent of the lookup. Then | |
| 51 | +iteratively for each subsequent name element, look up the child of the current | |
| 52 | +parent with the given name and if it is not the desired entry, make it the | |
| 53 | +parent for the next lookup. | |
| 54 | + | |
| 55 | +A parent, of course, must be a directory, and we must have appropriate | |
| 56 | +permissions on the parent inode to be able to walk into it. | |
| 57 | + | |
| 58 | +Turning the child into a parent for the next lookup requires more checks and | |
| 59 | +procedures. Symlinks essentially substitute the symlink name for the target | |
| 60 | +name in the name string, and require some recursive path walking. Mount points | |
| 61 | +must be followed into (thus changing the vfsmount that subsequent path elements | |
| 62 | +refer to), switching from the mount point path to the root of the particular | |
| 63 | +mounted vfsmount. These behaviours are variously modified depending on the | |
| 64 | +exact path walking flags. | |
| 65 | + | |
| 66 | +Path walking then must, broadly, do several particular things: | |
| 67 | +- find the start point of the walk; | |
| 68 | +- perform permissions and validity checks on inodes; | |
| 69 | +- perform dcache hash name lookups on (parent, name element) tuples; | |
| 70 | +- traverse mount points; | |
| 71 | +- traverse symlinks; | |
| 72 | +- lookup and create missing parts of the path on demand. | |
| 73 | + | |
| 74 | +Safe store-free look-up of dcache hash table | |
| 75 | +============================================ | |
| 76 | + | |
| 77 | +Dcache name lookup | |
| 78 | +------------------ | |
| 79 | +In order to lookup a dcache (parent, name) tuple, we take a hash on the tuple | |
| 80 | +and use that to select a bucket in the dcache-hash table. The list of entries | |
| 81 | +in that bucket is then walked, and we do a full comparison of each entry | |
| 82 | +against our (parent, name) tuple. | |
| 83 | + | |
| 84 | +The hash lists are RCU protected, so list walking is not serialised with | |
| 85 | +concurrent updates (insertion, deletion from the hash). This is a standard RCU | |
| 86 | +list application with the exception of renames, which will be covered below. | |
| 87 | + | |
| 88 | +Parent and name members of a dentry, as well as its membership in the dcache | |
| 89 | +hash, and its inode are protected by the per-dentry d_lock spinlock. A | |
| 90 | +reference is taken on the dentry (while the fields are verified under d_lock), | |
| 91 | +and this stabilises its d_inode pointer and actual inode. This gives a stable | |
| 92 | +point to perform the next step of our path walk against. | |
| 93 | + | |
| 94 | +These members are also protected by d_seq seqlock, although this offers | |
| 95 | +read-only protection and no durability of results, so care must be taken when | |
| 96 | +using d_seq for synchronisation (see seqcount based lookups, below). | |
| 97 | + | |
| 98 | +Renames | |
| 99 | +------- | |
| 100 | +Back to the rename case. In usual RCU protected lists, the only operations that | |
| 101 | +will happen to an object is insertion, and then eventually removal from the | |
| 102 | +list. The object will not be reused until an RCU grace period is complete. | |
| 103 | +This ensures the RCU list traversal primitives can run over the object without | |
| 104 | +problems (see RCU documentation for how this works). | |
| 105 | + | |
| 106 | +However when a dentry is renamed, its hash value can change, requiring it to be | |
| 107 | +moved to a new hash list. Allocating and inserting a new alias would be | |
| 108 | +expensive and also problematic for directory dentries. Latency would be far to | |
| 109 | +high to wait for a grace period after removing the dentry and before inserting | |
| 110 | +it in the new hash bucket. So what is done is to insert the dentry into the | |
| 111 | +new list immediately. | |
| 112 | + | |
| 113 | +However, when the dentry's list pointers are updated to point to objects in the | |
| 114 | +new list before waiting for a grace period, this can result in a concurrent RCU | |
| 115 | +lookup of the old list veering off into the new (incorrect) list and missing | |
| 116 | +the remaining dentries on the list. | |
| 117 | + | |
| 118 | +There is no fundamental problem with walking down the wrong list, because the | |
| 119 | +dentry comparisons will never match. However it is fatal to miss a matching | |
| 120 | +dentry. So a seqlock is used to detect when a rename has occurred, and so the | |
| 121 | +lookup can be retried. | |
| 122 | + | |
| 123 | + 1 2 3 | |
| 124 | + +---+ +---+ +---+ | |
| 125 | +hlist-->| N-+->| N-+->| N-+-> | |
| 126 | +head <--+-P |<-+-P |<-+-P | | |
| 127 | + +---+ +---+ +---+ | |
| 128 | + | |
| 129 | +Rename of dentry 2 may require it deleted from the above list, and inserted | |
| 130 | +into a new list. Deleting 2 gives the following list. | |
| 131 | + | |
| 132 | + 1 3 | |
| 133 | + +---+ +---+ (don't worry, the longer pointers do not | |
| 134 | +hlist-->| N-+-------->| N-+-> impose a measurable performance overhead | |
| 135 | +head <--+-P |<--------+-P | on modern CPUs) | |
| 136 | + +---+ +---+ | |
| 137 | + ^ 2 ^ | |
| 138 | + | +---+ | | |
| 139 | + | | N-+----+ | |
| 140 | + +----+-P | | |
| 141 | + +---+ | |
| 142 | + | |
| 143 | +This is a standard RCU-list deletion, which leaves the deleted object's | |
| 144 | +pointers intact, so a concurrent list walker that is currently looking at | |
| 145 | +object 2 will correctly continue to object 3 when it is time to traverse the | |
| 146 | +next object. | |
| 147 | + | |
| 148 | +However, when inserting object 2 onto a new list, we end up with this: | |
| 149 | + | |
| 150 | + 1 3 | |
| 151 | + +---+ +---+ | |
| 152 | +hlist-->| N-+-------->| N-+-> | |
| 153 | +head <--+-P |<--------+-P | | |
| 154 | + +---+ +---+ | |
| 155 | + 2 | |
| 156 | + +---+ | |
| 157 | + | N-+----> | |
| 158 | + <----+-P | | |
| 159 | + +---+ | |
| 160 | + | |
| 161 | +Because we didn't wait for a grace period, there may be a concurrent lookup | |
| 162 | +still at 2. Now when it follows 2's 'next' pointer, it will walk off into | |
| 163 | +another list without ever having checked object 3. | |
| 164 | + | |
| 165 | +A related, but distinctly different, issue is that of rename atomicity versus | |
| 166 | +lookup operations. If a file is renamed from 'A' to 'B', a lookup must only | |
| 167 | +find either 'A' or 'B'. So if a lookup of 'A' returns NULL, a subsequent lookup | |
| 168 | +of 'B' must succeed (note the reverse is not true). | |
| 169 | + | |
| 170 | +Between deleting the dentry from the old hash list, and inserting it on the new | |
| 171 | +hash list, a lookup may find neither 'A' nor 'B' matching the dentry. The same | |
| 172 | +rename seqlock is also used to cover this race in much the same way, by | |
| 173 | +retrying a negative lookup result if a rename was in progress. | |
| 174 | + | |
| 175 | +Seqcount based lookups | |
| 176 | +---------------------- | |
| 177 | +In refcount based dcache lookups, d_lock is used to serialise access to | |
| 178 | +the dentry, stabilising it while comparing its name and parent and then | |
| 179 | +taking a reference count (the reference count then gives a stable place to | |
| 180 | +start the next part of the path walk from). | |
| 181 | + | |
| 182 | +As explained above, we would like to do path walking without taking locks or | |
| 183 | +reference counts on intermediate dentries along the path. To do this, a per | |
| 184 | +dentry seqlock (d_seq) is used to take a "coherent snapshot" of what the dentry | |
| 185 | +looks like (its name, parent, and inode). That snapshot is then used to start | |
| 186 | +the next part of the path walk. When loading the coherent snapshot under d_seq, | |
| 187 | +care must be taken to load the members up-front, and use those pointers rather | |
| 188 | +than reloading from the dentry later on (otherwise we'd have interesting things | |
| 189 | +like d_inode going NULL underneath us, if the name was unlinked). | |
| 190 | + | |
| 191 | +Also important is to avoid performing any destructive operations (pretty much: | |
| 192 | +no non-atomic stores to shared data), and to recheck the seqcount when we are | |
| 193 | +"done" with the operation. Retry or abort if the seqcount does not match. | |
| 194 | +Avoiding destructive or changing operations means we can easily unwind from | |
| 195 | +failure. | |
| 196 | + | |
| 197 | +What this means is that a caller, provided they are holding RCU lock to | |
| 198 | +protect the dentry object from disappearing, can perform a seqcount based | |
| 199 | +lookup which does not increment the refcount on the dentry or write to | |
| 200 | +it in any way. This returned dentry can be used for subsequent operations, | |
| 201 | +provided that d_seq is rechecked after that operation is complete. | |
| 202 | + | |
| 203 | +Inodes are also rcu freed, so the seqcount lookup dentry's inode may also be | |
| 204 | +queried for permissions. | |
| 205 | + | |
| 206 | +With this two parts of the puzzle, we can do path lookups without taking | |
| 207 | +locks or refcounts on dentry elements. | |
| 208 | + | |
| 209 | +RCU-walk path walking design | |
| 210 | +============================ | |
| 211 | + | |
| 212 | +Path walking code now has two distinct modes, ref-walk and rcu-walk. ref-walk | |
| 213 | +is the traditional[*] way of performing dcache lookups using d_lock to | |
| 214 | +serialise concurrent modifications to the dentry and take a reference count on | |
| 215 | +it. ref-walk is simple and obvious, and may sleep, take locks, etc while path | |
| 216 | +walking is operating on each dentry. rcu-walk uses seqcount based dentry | |
| 217 | +lookups, and can perform lookup of intermediate elements without any stores to | |
| 218 | +shared data in the dentry or inode. rcu-walk can not be applied to all cases, | |
| 219 | +eg. if the filesystem must sleep or perform non trivial operations, rcu-walk | |
| 220 | +must be switched to ref-walk mode. | |
| 221 | + | |
| 222 | +[*] RCU is still used for the dentry hash lookup in ref-walk, but not the full | |
| 223 | + path walk. | |
| 224 | + | |
| 225 | +Where ref-walk uses a stable, refcounted ``parent'' to walk the remaining | |
| 226 | +path string, rcu-walk uses a d_seq protected snapshot. When looking up a | |
| 227 | +child of this parent snapshot, we open d_seq critical section on the child | |
| 228 | +before closing d_seq critical section on the parent. This gives an interlocking | |
| 229 | +ladder of snapshots to walk down. | |
| 230 | + | |
| 231 | + | |
| 232 | + proc 101 | |
| 233 | + /----------------\ | |
| 234 | + / comm: "vi" \ | |
| 235 | + / fs.root: dentry0 \ | |
| 236 | + \ fs.cwd: dentry2 / | |
| 237 | + \ / | |
| 238 | + \----------------/ | |
| 239 | + | |
| 240 | +So when vi wants to open("/home/npiggin/test.c", O_RDWR), then it will | |
| 241 | +start from current->fs->root, which is a pinned dentry. Alternatively, | |
| 242 | +"./test.c" would start from cwd; both names refer to the same path in | |
| 243 | +the context of proc101. | |
| 244 | + | |
| 245 | + dentry 0 | |
| 246 | + +---------------------+ rcu-walk begins here, we note d_seq, check the | |
| 247 | + | name: "/" | inode's permission, and then look up the next | |
| 248 | + | inode: 10 | path element which is "home"... | |
| 249 | + | children:"home", ...| | |
| 250 | + +---------------------+ | |
| 251 | + | | |
| 252 | + dentry 1 V | |
| 253 | + +---------------------+ ... which brings us here. We find dentry1 via | |
| 254 | + | name: "home" | hash lookup, then note d_seq and compare name | |
| 255 | + | inode: 678 | string and parent pointer. When we have a match, | |
| 256 | + | children:"npiggin" | we now recheck the d_seq of dentry0. Then we | |
| 257 | + +---------------------+ check inode and look up the next element. | |
| 258 | + | | |
| 259 | + dentry2 V | |
| 260 | + +---------------------+ Note: if dentry0 is now modified, lookup is | |
| 261 | + | name: "npiggin" | not necessarily invalid, so we need only keep a | |
| 262 | + | inode: 543 | parent for d_seq verification, and grandparents | |
| 263 | + | children:"a.c", ... | can be forgotten. | |
| 264 | + +---------------------+ | |
| 265 | + | | |
| 266 | + dentry3 V | |
| 267 | + +---------------------+ At this point we have our destination dentry. | |
| 268 | + | name: "a.c" | We now take its d_lock, verify d_seq of this | |
| 269 | + | inode: 14221 | dentry. If that checks out, we can increment | |
| 270 | + | children:NULL | its refcount because we're holding d_lock. | |
| 271 | + +---------------------+ | |
| 272 | + | |
| 273 | +Taking a refcount on a dentry from rcu-walk mode, by taking its d_lock, | |
| 274 | +re-checking its d_seq, and then incrementing its refcount is called | |
| 275 | +"dropping rcu" or dropping from rcu-walk into ref-walk mode. | |
| 276 | + | |
| 277 | +It is, in some sense, a bit of a house of cards. If the seqcount check of the | |
| 278 | +parent snapshot fails, the house comes down, because we had closed the d_seq | |
| 279 | +section on the grandparent, so we have nothing left to stand on. In that case, | |
| 280 | +the path walk must be fully restarted (which we do in ref-walk mode, to avoid | |
| 281 | +live locks). It is costly to have a full restart, but fortunately they are | |
| 282 | +quite rare. | |
| 283 | + | |
| 284 | +When we reach a point where sleeping is required, or a filesystem callout | |
| 285 | +requires ref-walk, then instead of restarting the walk, we attempt to drop rcu | |
| 286 | +at the last known good dentry we have. Avoiding a full restart in ref-walk in | |
| 287 | +these cases is fundamental for performance and scalability because blocking | |
| 288 | +operations such as creates and unlinks are not uncommon. | |
| 289 | + | |
| 290 | +The detailed design for rcu-walk is like this: | |
| 291 | +* LOOKUP_RCU is set in nd->flags, which distinguishes rcu-walk from ref-walk. | |
| 292 | +* Take the RCU lock for the entire path walk, starting with the acquiring | |
| 293 | + of the starting path (eg. root/cwd/fd-path). So now dentry refcounts are | |
| 294 | + not required for dentry persistence. | |
| 295 | +* synchronize_rcu is called when unregistering a filesystem, so we can | |
| 296 | + access d_ops and i_ops during rcu-walk. | |
| 297 | +* Similarly take the vfsmount lock for the entire path walk. So now mnt | |
| 298 | + refcounts are not required for persistence. Also we are free to perform mount | |
| 299 | + lookups, and to assume dentry mount points and mount roots are stable up and | |
| 300 | + down the path. | |
| 301 | +* Have a per-dentry seqlock to protect the dentry name, parent, and inode, | |
| 302 | + so we can load this tuple atomically, and also check whether any of its | |
| 303 | + members have changed. | |
| 304 | +* Dentry lookups (based on parent, candidate string tuple) recheck the parent | |
| 305 | + sequence after the child is found in case anything changed in the parent | |
| 306 | + during the path walk. | |
| 307 | +* inode is also RCU protected so we can load d_inode and use the inode for | |
| 308 | + limited things. | |
| 309 | +* i_mode, i_uid, i_gid can be tested for exec permissions during path walk. | |
| 310 | +* i_op can be loaded. | |
| 311 | +* When the destination dentry is reached, drop rcu there (ie. take d_lock, | |
| 312 | + verify d_seq, increment refcount). | |
| 313 | +* If seqlock verification fails anywhere along the path, do a full restart | |
| 314 | + of the path lookup in ref-walk mode. -ECHILD tends to be used (for want of | |
| 315 | + a better errno) to signal an rcu-walk failure. | |
| 316 | + | |
| 317 | +The cases where rcu-walk cannot continue are: | |
| 318 | +* NULL dentry (ie. any uncached path element) | |
| 319 | +* Following links | |
| 320 | + | |
| 321 | +It may be possible eventually to make following links rcu-walk aware. | |
| 322 | + | |
| 323 | +Uncached path elements will always require dropping to ref-walk mode, at the | |
| 324 | +very least because i_mutex needs to be grabbed, and objects allocated. | |
| 325 | + | |
| 326 | +Final note: | |
| 327 | +"store-free" path walking is not strictly store free. We take vfsmount lock | |
| 328 | +and refcounts (both of which can be made per-cpu), and we also store to the | |
| 329 | +stack (which is essentially CPU-local), and we also have to take locks and | |
| 330 | +refcount on final dentry. | |
| 331 | + | |
| 332 | +The point is that shared data, where practically possible, is not locked | |
| 333 | +or stored into. The result is massive improvements in performance and | |
| 334 | +scalability of path resolution. | |
| 335 | + | |
| 336 | + | |
| 337 | +Interesting statistics | |
| 338 | +====================== | |
| 339 | + | |
| 340 | +The following table gives rcu lookup statistics for a few simple workloads | |
| 341 | +(2s12c24t Westmere, debian non-graphical system). Ungraceful are attempts to | |
| 342 | +drop rcu that fail due to d_seq failure and requiring the entire path lookup | |
| 343 | +again. Other cases are successful rcu-drops that are required before the final | |
| 344 | +element, nodentry for missing dentry, revalidate for filesystem revalidate | |
| 345 | +routine requiring rcu drop, permission for permission check requiring drop, | |
| 346 | +and link for symlink traversal requiring drop. | |
| 347 | + | |
| 348 | + rcu-lookups restart nodentry link revalidate permission | |
| 349 | +bootup 47121 0 4624 1010 10283 7852 | |
| 350 | +dbench 25386793 0 6778659(26.7%) 55 549 1156 | |
| 351 | +kbuild 2696672 10 64442(2.3%) 108764(4.0%) 1 1590 | |
| 352 | +git diff 39605 0 28 2 0 106 | |
| 353 | +vfstest 24185492 4945 708725(2.9%) 1076136(4.4%) 0 2651 | |
| 354 | + | |
| 355 | +What this shows is that failed rcu-walk lookups, ie. ones that are restarted | |
| 356 | +entirely with ref-walk, are quite rare. Even the "vfstest" case which | |
| 357 | +specifically has concurrent renames/mkdir/rmdir/ creat/unlink/etc to excercise | |
| 358 | +such races is not showing a huge amount of restarts. | |
| 359 | + | |
| 360 | +Dropping from rcu-walk to ref-walk mean that we have encountered a dentry where | |
| 361 | +the reference count needs to be taken for some reason. This is either because | |
| 362 | +we have reached the target of the path walk, or because we have encountered a | |
| 363 | +condition that can't be resolved in rcu-walk mode. Ideally, we drop rcu-walk | |
| 364 | +only when we have reached the target dentry, so the other statistics show where | |
| 365 | +this does not happen. | |
| 366 | + | |
| 367 | +Note that a graceful drop from rcu-walk mode due to something such as the | |
| 368 | +dentry not existing (which can be common) is not necessarily a failure of | |
| 369 | +rcu-walk scheme, because some elements of the path may have been walked in | |
| 370 | +rcu-walk mode. The further we get from common path elements (such as cwd or | |
| 371 | +root), the less contended the dentry is likely to be. The closer we are to | |
| 372 | +common path elements, the more likely they will exist in dentry cache. | |
| 373 | + | |
| 374 | + | |
| 375 | +Papers and other documentation on dcache locking | |
| 376 | +================================================ | |
| 377 | + | |
| 378 | +1. Scaling dcache with RCU (http://linuxjournal.com/article.php?sid=7124). | |
| 379 | + | |
| 380 | +2. http://lse.sourceforge.net/locking/dcache/dcache.html | |
| 381 | + | |
| 382 | + | |
| @@ -216,7 +216,6 @@ had ->revalidate()) add calls in ->follow_link()/->readlink(). · 215 unmodified lines | ||
| 216 | 216 | ->d_parent changes are not protected by BKL anymore. Read access is safe |
| 217 | 217 | if at least one of the following is true: |
| 218 | 218 | * filesystem has no cross-directory rename() |
| 219 | − * dcache_lock is held | |
| 220 | 219 | * we know that parent had been locked (e.g. we are looking at |
| 221 | 220 | ->d_parent of ->lookup() argument). |
| 222 | 221 | * we are called from ->rename(). |
| @@ -318,3 +317,80 @@ if it's zero is not *and* *never* *had* *been* enough. Final unlink() and iput( · 95 unmodified lines | ||
| 318 | 317 | may happen while the inode is in the middle of ->write_inode(); e.g. if you blindly |
| 319 | 318 | free the on-disk inode, you may end up doing that while ->write_inode() is writing |
| 320 | 319 | to it. |
| 320 | + | |
| 321 | +--- | |
| 322 | +[mandatory] | |
| 323 | + | |
| 324 | + .d_delete() now only advises the dcache as to whether or not to cache | |
| 325 | +unreferenced dentries, and is now only called when the dentry refcount goes to | |
| 326 | +0. Even on 0 refcount transition, it must be able to tolerate being called 0, | |
| 327 | +1, or more times (eg. constant, idempotent). | |
| 328 | + | |
| 329 | +--- | |
| 330 | +[mandatory] | |
| 331 | + | |
| 332 | + .d_compare() calling convention and locking rules are significantly | |
| 333 | +changed. Read updated documentation in Documentation/filesystems/vfs.txt (and | |
| 334 | +look at examples of other filesystems) for guidance. | |
| 335 | + | |
| 336 | +--- | |
| 337 | +[mandatory] | |
| 338 | + | |
| 339 | + .d_hash() calling convention and locking rules are significantly | |
| 340 | +changed. Read updated documentation in Documentation/filesystems/vfs.txt (and | |
| 341 | +look at examples of other filesystems) for guidance. | |
| 342 | + | |
| 343 | +--- | |
| 344 | +[mandatory] | |
| 345 | + dcache_lock is gone, replaced by fine grained locks. See fs/dcache.c | |
| 346 | +for details of what locks to replace dcache_lock with in order to protect | |
| 347 | +particular things. Most of the time, a filesystem only needs ->d_lock, which | |
| 348 | +protects *all* the dcache state of a given dentry. | |
| 349 | + | |
| 350 | +-- | |
| 351 | +[mandatory] | |
| 352 | + | |
| 353 | + Filesystems must RCU-free their inodes, if they can have been accessed | |
| 354 | +via rcu-walk path walk (basically, if the file can have had a path name in the | |
| 355 | +vfs namespace). | |
| 356 | + | |
| 357 | + i_dentry and i_rcu share storage in a union, and the vfs expects | |
| 358 | +i_dentry to be reinitialized before it is freed, so an: | |
| 359 | + | |
| 360 | + INIT_LIST_HEAD(&inode->i_dentry); | |
| 361 | + | |
| 362 | +must be done in the RCU callback. | |
| 363 | + | |
| 364 | +-- | |
| 365 | +[recommended] | |
| 366 | + vfs now tries to do path walking in "rcu-walk mode", which avoids | |
| 367 | +atomic operations and scalability hazards on dentries and inodes (see | |
| 368 | +Documentation/filesystems/path-lookup.txt). d_hash and d_compare changes | |
| 369 | +(above) are examples of the changes required to support this. For more complex | |
| 370 | +filesystem callbacks, the vfs drops out of rcu-walk mode before the fs call, so | |
| 371 | +no changes are required to the filesystem. However, this is costly and loses | |
| 372 | +the benefits of rcu-walk mode. We will begin to add filesystem callbacks that | |
| 373 | +are rcu-walk aware, shown below. Filesystems should take advantage of this | |
| 374 | +where possible. | |
| 375 | + | |
| 376 | +-- | |
| 377 | +[mandatory] | |
| 378 | + d_revalidate is a callback that is made on every path element (if | |
| 379 | +the filesystem provides it), which requires dropping out of rcu-walk mode. This | |
| 380 | +may now be called in rcu-walk mode (nd->flags & LOOKUP_RCU). -ECHILD should be | |
| 381 | +returned if the filesystem cannot handle rcu-walk. See | |
| 382 | +Documentation/filesystems/vfs.txt for more details. | |
| 383 | + | |
| 384 | + permission and check_acl are inode permission checks that are called | |
| 385 | +on many or all directory inodes on the way down a path walk (to check for | |
| 386 | +exec permission). These must now be rcu-walk aware (flags & IPERM_FLAG_RCU). | |
| 387 | +See Documentation/filesystems/vfs.txt for more details. | |
| 388 | + | |
| 389 | +-- | |
| 390 | +[mandatory] | |
| 391 | + In ->fallocate() you must check the mode option passed in. If your | |
| 392 | +filesystem does not support hole punching (deallocating space in the middle of a | |
| 393 | +file) you must return -EOPNOTSUPP if FALLOC_FL_PUNCH_HOLE is set in mode. | |
| 394 | +Currently you can only have FALLOC_FL_PUNCH_HOLE with FALLOC_FL_KEEP_SIZE set, | |
| 395 | +so the i_size should not change when hole punching, even when puching the end of | |
| 396 | +a file off. | |
| @@ -375,6 +375,7 @@ Anonymous: 0 kB · 374 unmodified lines | ||
| 375 | 375 | Swap: 0 kB |
| 376 | 376 | KernelPageSize: 4 kB |
| 377 | 377 | MMUPageSize: 4 kB |
| 378 | +Locked: 374 kB | |
| 378 | 379 | |
| 379 | 380 | The first of these lines shows the same information as is displayed for the |
| 380 | 381 | mapping in /proc/PID/maps. The remaining lines show the size of the mapping |
| @@ -670,6 +671,8 @@ varies by architecture and compile options. The following is from a · 289 unmodified lines | ||
| 670 | 671 | |
| 671 | 672 | > cat /proc/meminfo |
| 672 | 673 | |
| 674 | +The "Locked" indicates whether the mapping is locked in memory or not. | |
| 675 | + | |
| 673 | 676 | |
| 674 | 677 | MemTotal: 16344972 kB |
| 675 | 678 | MemFree: 13634064 kB |
| @@ -1181,6 +1184,30 @@ Table 1-12: Files in /proc/fs/ext4/<devname> · 505 unmodified lines | ||
| 1181 | 1184 | mb_groups details of multiblock allocator buddy cache of free blocks |
| 1182 | 1185 | .............................................................................. |
| 1183 | 1186 | |
| 1187 | +2.0 /proc/consoles | |
| 1188 | +------------------ | |
| 1189 | +Shows registered system console lines. | |
| 1190 | + | |
| 1191 | +To see which character device lines are currently used for the system console | |
| 1192 | +/dev/console, you may simply look into the file /proc/consoles: | |
| 1193 | + | |
| 1194 | + > cat /proc/consoles | |
| 1195 | + tty0 -WU (ECp) 4:7 | |
| 1196 | + ttyS0 -W- (Ep) 4:64 | |
| 1197 | + | |
| 1198 | +The columns are: | |
| 1199 | + | |
| 1200 | + device name of the device | |
| 1201 | + operations R = can do read operations | |
| 1202 | + W = can do write operations | |
| 1203 | + U = can do unblank | |
| 1204 | + flags E = it is enabled | |
| 1205 | + C = it is prefered console | |
| 1206 | + B = it is primary boot console | |
| 1207 | + p = it is used for printk buffer | |
| 1208 | + b = it is not a TTY but a Braille device | |
| 1209 | + a = it is safe to use when cpu is offline | |
| 1210 | + major:minor major and minor number of the device separated by a colon | |
| 1184 | 1211 | |
| 1185 | 1212 | ------------------------------------------------------------------------------ |
| 1186 | 1213 | Summary |
| @@ -1296,6 +1323,10 @@ scaled linearly with /proc/<pid>/oom_score_adj. · 109 unmodified lines | ||
| 1296 | 1323 | Writing to /proc/<pid>/oom_score_adj or /proc/<pid>/oom_adj will change the |
| 1297 | 1324 | other with its scaled value. |
| 1298 | 1325 | |
| 1326 | +The value of /proc/<pid>/oom_score_adj may be reduced no lower than the last | |
| 1327 | +value set by a CAP_SYS_RESOURCE process. To reduce the value any lower | |
| 1328 | +requires CAP_SYS_RESOURCE. | |
| 1329 | + | |
| 1299 | 1330 | NOTICE: /proc/<pid>/oom_adj is deprecated and will be removed, please see |
| 1300 | 1331 | Documentation/feature-removal-schedule.txt. |
| 1301 | 1332 | |
| @@ -325,7 +325,8 @@ struct inode_operations { · 324 unmodified lines | ||
| 325 | 325 | void * (*follow_link) (struct dentry *, struct nameidata *); |
| 326 | 326 | void (*put_link) (struct dentry *, struct nameidata *, void *); |
| 327 | 327 | void (*truncate) (struct inode *); |
| 328 | − int (*permission) (struct inode *, int, struct nameidata *); | |
| 328 | + int (*permission) (struct inode *, int, unsigned int); | |
| 329 | + int (*check_acl)(struct inode *, int, unsigned int); | |
| 329 | 330 | int (*setattr) (struct dentry *, struct iattr *); |
| 330 | 331 | int (*getattr) (struct vfsmount *mnt, struct dentry *, struct kstat *); |
| 331 | 332 | int (*setxattr) (struct dentry *, const char *,const void *,size_t,int); |
| @@ -414,6 +415,13 @@ otherwise noted. · 82 unmodified lines | ||
| 414 | 415 | permission: called by the VFS to check for access rights on a POSIX-like |
| 415 | 416 | filesystem. |
| 416 | 417 | |
| 418 | + May be called in rcu-walk mode (flags & IPERM_FLAG_RCU). If in rcu-walk | |
| 419 | + mode, the filesystem must check the permission without blocking or | |
| 420 | + storing to the inode. | |
| 421 | + | |
| 422 | + If a situation is encountered that rcu-walk cannot handle, return | |
| 423 | + -ECHILD and it will be called again in ref-walk mode. | |
| 424 | + | |
| 417 | 425 | setattr: called by the VFS to set attributes for a file. This method |
| 418 | 426 | is called by chmod(2) and related system calls. |
| 419 | 427 | |
| @@ -847,12 +855,17 @@ defined: · 427 unmodified lines | ||
| 847 | 855 | |
| 848 | 856 | struct dentry_operations { |
| 849 | 857 | int (*d_revalidate)(struct dentry *, struct nameidata *); |
| 850 | − int (*d_hash) (struct dentry *, struct qstr *); | |
| 851 | − int (*d_compare) (struct dentry *, struct qstr *, struct qstr *); | |
| 852 | − int (*d_delete)(struct dentry *); | |
| 858 | + int (*d_hash)(const struct dentry *, const struct inode *, | |
| 859 | + struct qstr *); | |
| 860 | + int (*d_compare)(const struct dentry *, const struct inode *, | |
| 861 | + const struct dentry *, const struct inode *, | |
| 862 | + unsigned int, const char *, const struct qstr *); | |
| 863 | + int (*d_delete)(const struct dentry *); | |
| 853 | 864 | void (*d_release)(struct dentry *); |
| 854 | 865 | void (*d_iput)(struct dentry *, struct inode *); |
| 855 | 866 | char *(*d_dname)(struct dentry *, char *, int); |
| 867 | + struct vfsmount *(*d_automount)(struct path *); | |
| 868 | + int (*d_manage)(struct dentry *, bool, bool); | |
| 856 | 869 | }; |
| 857 | 870 | |
| 858 | 871 | d_revalidate: called when the VFS needs to revalidate a dentry. This |
| @@ -860,13 +873,45 @@ struct dentry_operations { · 1 unmodified line | ||
| 860 | 873 | dcache. Most filesystems leave this as NULL, because all their |
| 861 | 874 | dentries in the dcache are valid |
| 862 | 875 | |
| 863 | − d_hash: called when the VFS adds a dentry to the hash table | |
| 876 | + d_revalidate may be called in rcu-walk mode (nd->flags & LOOKUP_RCU). | |
| 877 | + If in rcu-walk mode, the filesystem must revalidate the dentry without | |
| 878 | + blocking or storing to the dentry, d_parent and d_inode should not be | |
| 879 | + used without care (because they can go NULL), instead nd->inode should | |
| 880 | + be used. | |
| 881 | + | |
| 882 | + If a situation is encountered that rcu-walk cannot handle, return | |
| 883 | + -ECHILD and it will be called again in ref-walk mode. | |
| 884 | + | |
| 885 | + d_hash: called when the VFS adds a dentry to the hash table. The first | |
| 886 | + dentry passed to d_hash is the parent directory that the name is | |
| 887 | + to be hashed into. The inode is the dentry's inode. | |
| 888 | + | |
| 889 | + Same locking and synchronisation rules as d_compare regarding | |
| 890 | + what is safe to dereference etc. | |
| 864 | 891 | |
| 865 | − d_compare: called when a dentry should be compared with another | |
| 892 | + d_compare: called to compare a dentry name with a given name. The first | |
| 893 | + dentry is the parent of the dentry to be compared, the second is | |
| 894 | + the parent's inode, then the dentry and inode (may be NULL) of the | |
| 895 | + child dentry. len and name string are properties of the dentry to be | |
| 896 | + compared. qstr is the name to compare it with. | |
| 866 | 897 | |
| 867 | − d_delete: called when the last reference to a dentry is | |
| 868 | − deleted. This means no-one is using the dentry, however it is | |
| 869 | − still valid and in the dcache | |
| 898 | + Must be constant and idempotent, and should not take locks if | |
| 899 | + possible, and should not or store into the dentry or inodes. | |
| 900 | + Should not dereference pointers outside the dentry or inodes without | |
| 901 | + lots of care (eg. d_parent, d_inode, d_name should not be used). | |
| 902 | + | |
| 903 | + However, our vfsmount is pinned, and RCU held, so the dentries and | |
| 904 | + inodes won't disappear, neither will our sb or filesystem module. | |
| 905 | + ->i_sb and ->d_sb may be used. | |
| 906 | + | |
| 907 | + It is a tricky calling convention because it needs to be called under | |
| 908 | + "rcu-walk", ie. without any locks or references on things. | |
| 909 | + | |
| 910 | + d_delete: called when the last reference to a dentry is dropped and the | |
| 911 | + dcache is deciding whether or not to cache it. Return 1 to delete | |
| 912 | + immediately, or 0 to cache the dentry. Default is NULL which means to | |
| 913 | + always cache a reachable dentry. d_delete must be constant and | |
| 914 | + idempotent. | |
| 870 | 915 | |
| 871 | 916 | d_release: called when a dentry is really deallocated |
| 872 | 917 | |
| @@ -887,6 +932,47 @@ struct dentry_operations { · 14 unmodified lines | ||
| 887 | 932 | at the end of the buffer, and returns a pointer to the first char. |
| 888 | 933 | dynamic_dname() helper function is provided to take care of this. |
| 889 | 934 | |
| 935 | + d_automount: called when an automount dentry is to be traversed (optional). | |
| 936 | + This should create a new VFS mount record and return the record to the | |
| 937 | + caller. The caller is supplied with a path parameter giving the | |
| 938 | + automount directory to describe the automount target and the parent | |
| 939 | + VFS mount record to provide inheritable mount parameters. NULL should | |
| 940 | + be returned if someone else managed to make the automount first. If | |
| 941 | + the vfsmount creation failed, then an error code should be returned. | |
| 942 | + If -EISDIR is returned, then the directory will be treated as an | |
| 943 | + ordinary directory and returned to pathwalk to continue walking. | |
| 944 | + | |
| 945 | + If a vfsmount is returned, the caller will attempt to mount it on the | |
| 946 | + mountpoint and will remove the vfsmount from its expiration list in | |
| 947 | + the case of failure. The vfsmount should be returned with 2 refs on | |
| 948 | + it to prevent automatic expiration - the caller will clean up the | |
| 949 | + additional ref. | |
| 950 | + | |
| 951 | + This function is only used if DCACHE_NEED_AUTOMOUNT is set on the | |
| 952 | + dentry. This is set by __d_instantiate() if S_AUTOMOUNT is set on the | |
| 953 | + inode being added. | |
| 954 | + | |
| 955 | + d_manage: called to allow the filesystem to manage the transition from a | |
| 956 | + dentry (optional). This allows autofs, for example, to hold up clients | |
| 957 | + waiting to explore behind a 'mountpoint' whilst letting the daemon go | |
| 958 | + past and construct the subtree there. 0 should be returned to let the | |
| 959 | + calling process continue. -EISDIR can be returned to tell pathwalk to | |
| 960 | + use this directory as an ordinary directory and to ignore anything | |
| 961 | + mounted on it and not to check the automount flag. Any other error | |
| 962 | + code will abort pathwalk completely. | |
| 963 | + | |
| 964 | + If the 'mounting_here' parameter is true, then namespace_sem is being | |
| 965 | + held by the caller and the function should not initiate any mounts or | |
| 966 | + unmounts that it will then wait for. | |
| 967 | + | |
| 968 | + If the 'rcu_walk' parameter is true, then the caller is doing a | |
| 969 | + pathwalk in RCU-walk mode. Sleeping is not permitted in this mode, | |
| 970 | + and the caller can be asked to leave it and call again by returing | |
| 971 | + -ECHILD. | |
| 972 | + | |
| 973 | + This function is only used if DCACHE_MANAGE_TRANSIT is set on the | |
| 974 | + dentry being transited from. | |
| 975 | + | |
| 890 | 976 | Example : |
| 891 | 977 | |
| 892 | 978 | static char *pipefs_dname(struct dentry *dent, char *buffer, int buflen) |
| @@ -910,14 +996,11 @@ manipulate dentries: · 17 unmodified lines | ||
| 910 | 996 | the usage count) |
| 911 | 997 | |
| 912 | 998 | dput: close a handle for a dentry (decrements the usage count). If |
| 913 | − the usage count drops to 0, the "d_delete" method is called | |
| 914 | − and the dentry is placed on the unused list if the dentry is | |
| 915 | − still in its parents hash list. Putting the dentry on the | |
| 916 | − unused list just means that if the system needs some RAM, it | |
| 917 | − goes through the unused list of dentries and deallocates them. | |
| 918 | − If the dentry has already been unhashed and the usage count | |
| 919 | − drops to 0, in this case the dentry is deallocated after the | |
| 920 | − "d_delete" method is called | |
| 999 | + the usage count drops to 0, and the dentry is still in its | |
| 1000 | + parent's hash, the "d_delete" method is called to check whether | |
| 1001 | + it should be cached. If it should not be cached, or if the dentry | |
| 1002 | + is not hashed, it is deleted. Otherwise cached dentries are put | |
| 1003 | + into an LRU list to be reclaimed on memory shortage. | |
| 921 | 1004 | |
| 922 | 1005 | d_drop: this unhashes a dentry from its parents hash list. A |
| 923 | 1006 | subsequent call to dput() will deallocate the dentry if its |
| @@ -155,7 +155,7 @@ connected to a normally open switch. · 154 unmodified lines | ||
| 155 | 155 | The ADM9240 provides an internal open drain on this line, and may output |
| 156 | 156 | a 20 ms active low pulse to reset an external Chassis Intrusion latch. |
| 157 | 157 | |
| 158 | −Clear the CI latch by writing value 1 to the sysfs chassis_clear file. | |
| 158 | +Clear the CI latch by writing value 0 to the sysfs intrusion0_alarm file. | |
| 159 | 159 | |
| 160 | 160 | Alarm flags reported as 16-bit word |
| 161 | 161 | |
| @@ -9,7 +9,7 @@ Supported chips: · 8 unmodified lines | ||
| 9 | 9 | http://focus.ti.com/lit/ds/symlink/ads7828.pdf |
| 10 | 10 | |
| 11 | 11 | Authors: |
| 12 | − Steve Hardy <steve@linuxrealtime.co.uk> | |
| 12 | + Steve Hardy <shardy@redhat.com> | |
| 13 | 13 | |
| 14 | 14 | Module Parameters |
| 15 | 15 | ----------------- |
| @@ -42,7 +42,7 @@ Description · 41 unmodified lines | ||
| 42 | 42 | This driver implements support for the hardware monitoring capabilities of the |
| 43 | 43 | SMSC DME1737 and Asus A8000 (which are the same), SMSC SCH5027, SCH311x, |
| 44 | 44 | and SCH5127 Super-I/O chips. These chips feature monitoring of 3 temp sensors |
| 45 | −temp[1-3] (2 remote diodes and 1 internal), 7 voltages in[0-6] (6 external and | |
| 45 | +temp[1-3] (2 remote diodes and 1 internal), 8 voltages in[0-7] (7 external and | |
| 46 | 46 | 1 internal) and up to 6 fan speeds fan[1-6]. Additionally, the chips implement |
| 47 | 47 | up to 5 PWM outputs pwm[1-3,5-6] for controlling fan speeds both manually and |
| 48 | 48 | automatically. |
| @@ -105,6 +105,7 @@ SCH5127: · 56 unmodified lines | ||
| 105 | 105 | in4: V1_IN 0V - 1.5V |
| 106 | 106 | in5: VTR (+3.3V standby) 0V - 4.38V |
| 107 | 107 | in6: Vbat (+3.0V) 0V - 4.38V |
| 108 | + in7: Vtrip (+1.5V) 0V - 1.99V | |
| 108 | 109 | |
| 109 | 110 | Each voltage input has associated min and max limits which trigger an alarm |
| 110 | 111 | when crossed. |
| @@ -217,10 +218,10 @@ cpu0_vid RO CPU core reference voltage in · 106 unmodified lines | ||
| 217 | 218 | vrm RW Voltage regulator module version |
| 218 | 219 | number. |
| 219 | 220 | |
| 220 | −in[0-6]_input RO Measured voltage in millivolts. | |
| 221 | −in[0-6]_min RW Low limit for voltage input. | |
| 222 | −in[0-6]_max RW High limit for voltage input. | |
| 223 | −in[0-6]_alarm RO Voltage input alarm. Returns 1 if | |
| 221 | +in[0-7]_input RO Measured voltage in millivolts. | |
| 222 | +in[0-7]_min RW Low limit for voltage input. | |
| 223 | +in[0-7]_max RW High limit for voltage input. | |
| 224 | +in[0-7]_alarm RO Voltage input alarm. Returns 1 if | |
| 224 | 225 | voltage input is or went outside the |
| 225 | 226 | associated min-max range, 0 otherwise. |
| 226 | 227 | |
| @@ -324,3 +325,4 @@ fan5 opt opt · 97 unmodified lines | ||
| 324 | 325 | pwm5 opt opt |
| 325 | 326 | fan6 opt opt |
| 326 | 327 | pwm6 opt opt |
| 328 | +in7 yes | |
| @@ -0,0 +1,34 @@ | ||
| 1 | +Kernel driver ds620 | |
| 2 | +=================== | |
| 3 | + | |
| 4 | +Supported chips: | |
| 5 | + * Dallas Semiconductor DS620 | |
| 6 | + Prefix: 'ds620' | |
| 7 | + Datasheet: Publicly available at the Dallas Semiconductor website | |
| 8 | + http://www.dalsemi.com/ | |
| 9 | + | |
| 10 | +Authors: | |
| 11 | + Roland Stigge <stigge@antcom.de> | |
| 12 | + based on ds1621.c by | |
| 13 | + Christian W. Zuckschwerdt <zany@triq.net> | |
| 14 | + | |
| 15 | +Description | |
| 16 | +----------- | |
| 17 | + | |
| 18 | +The DS620 is a (one instance) digital thermometer and thermostat. It has both | |
| 19 | +high and low temperature limits which can be user defined (i.e. programmed | |
| 20 | +into non-volatile on-chip registers). Temperature range is -55 degree Celsius | |
| 21 | +to +125. Between 0 and 70 degree Celsius, accuracy is 0.5 Kelvin. The value | |
| 22 | +returned via sysfs displays post decimal positions. | |
| 23 | + | |
| 24 | +The thermostat function works as follows: When configured via platform_data | |
| 25 | +(struct ds620_platform_data) .pomode == 0 (default), the thermostat output pin | |
| 26 | +PO is always low. If .pomode == 1, the thermostat is in PO_LOW mode. I.e., the | |
| 27 | +output pin PO becomes active when the temperature falls below temp1_min and | |
| 28 | +stays active until the temperature goes above temp1_max. | |
| 29 | + | |
| 30 | +Likewise, with .pomode == 2, the thermostat is in PO_HIGH mode. I.e., the PO | |
| 31 | +output pin becomes active when the temperature goes above temp1_max and stays | |
| 32 | +active until the temperature falls below temp1_min. | |
| 33 | + | |
| 34 | +The PO output pin of the DS620 operates active-low. | |
| @@ -51,7 +51,8 @@ Supported chips: · 50 unmodified lines | ||
| 51 | 51 | * JEDEC JC 42.4 compliant temperature sensor chips |
| 52 | 52 | Prefix: 'jc42' |
| 53 | 53 | Addresses scanned: I2C 0x18 - 0x1f |
| 54 | − Datasheet: - | |
| 54 | + Datasheet: | |
| 55 | + http://www.jedec.org/sites/default/files/docs/4_01_04R19.pdf | |
| 55 | 56 | |
| 56 | 57 | Author: |
| 57 | 58 | Guenter Roeck <guenter.roeck@ericsson.com> |
| @@ -60,7 +61,11 @@ Author: · 2 unmodified lines | ||
| 60 | 61 | Description |
| 61 | 62 | ----------- |
| 62 | 63 | |
| 63 | −This driver implements support for JEDEC JC 42.4 compliant temperature sensors. | |
| 64 | +This driver implements support for JEDEC JC 42.4 compliant temperature sensors, | |
| 65 | +which are used on many DDR3 memory modules for mobile devices and servers. Some | |
| 66 | +systems use the sensor to prevent memory overheating by automatically throttling | |
| 67 | +the memory controller. | |
| 68 | + | |
| 64 | 69 | The driver auto-detects the chips listed above, but can be manually instantiated |
| 65 | 70 | to support other JC 42.4 compliant chips. |
| 66 | 71 | |
| @@ -81,15 +86,19 @@ limits. The chip supports only a single register to configure the hysteresis, · 14 unmodified lines | ||
| 81 | 86 | which applies to all limits. This register can be written by writing into |
| 82 | 87 | temp1_crit_hyst. Other hysteresis attributes are read-only. |
| 83 | 88 | |
| 89 | +If the BIOS has configured the sensor for automatic temperature management, it | |
| 90 | +is likely that it has locked the registers, i.e., that the temperature limits | |
| 91 | +cannot be changed. | |
| 92 | + | |
| 84 | 93 | Sysfs entries |
| 85 | 94 | ------------- |
| 86 | 95 | |
| 87 | 96 | temp1_input Temperature (RO) |
| 88 | −temp1_min Minimum temperature (RW) | |
| 89 | −temp1_max Maximum temperature (RW) | |
| 90 | −temp1_crit Critical high temperature (RW) | |
| 97 | +temp1_min Minimum temperature (RO or RW) | |
| 98 | +temp1_max Maximum temperature (RO or RW) | |
| 99 | +temp1_crit Critical high temperature (RO or RW) | |
| 91 | 100 | |
| 92 | −temp1_crit_hyst Critical hysteresis temperature (RW) | |
| 101 | +temp1_crit_hyst Critical hysteresis temperature (RO or RW) | |
| 93 | 102 | temp1_max_hyst Maximum hysteresis temperature (RO) |
| 94 | 103 | |
| 95 | 104 | temp1_min_alarm Temperature low alarm |
| @@ -9,6 +9,8 @@ Supported chips: · 8 unmodified lines | ||
| 9 | 9 | Socket S1G3: Athlon II, Sempron, Turion II |
| 10 | 10 | * AMD Family 11h processors: |
| 11 | 11 | Socket S1G2: Athlon (X2), Sempron (X2), Turion X2 (Ultra) |
| 12 | +* AMD Family 12h processors: "Llano" | |
| 13 | +* AMD Family 14h processors: "Brazos" (C/E/G-Series) | |
| 12 | 14 | |
| 13 | 15 | Prefix: 'k10temp' |
| 14 | 16 | Addresses scanned: PCI space |
| @@ -17,10 +19,14 @@ Supported chips: · 2 unmodified lines | ||
| 17 | 19 | http://support.amd.com/us/Processor_TechDocs/31116.pdf |
| 18 | 20 | BIOS and Kernel Developer's Guide (BKDG) for AMD Family 11h Processors: |
| 19 | 21 | http://support.amd.com/us/Processor_TechDocs/41256.pdf |
| 22 | + BIOS and Kernel Developer's Guide (BKDG) for AMD Family 14h Models 00h-0Fh Processors: | |
| 23 | + http://support.amd.com/us/Processor_TechDocs/43170.pdf | |
| 20 | 24 | Revision Guide for AMD Family 10h Processors: |
| 21 | 25 | http://support.amd.com/us/Processor_TechDocs/41322.pdf |
| 22 | 26 | Revision Guide for AMD Family 11h Processors: |
| 23 | 27 | http://support.amd.com/us/Processor_TechDocs/41788.pdf |
| 28 | + Revision Guide for AMD Family 14h Models 00h-0Fh Processors: | |
| 29 | + http://support.amd.com/us/Processor_TechDocs/47534.pdf | |
| 24 | 30 | AMD Family 11h Processor Power and Thermal Data Sheet for Notebooks: |
| 25 | 31 | http://support.amd.com/us/Processor_TechDocs/43373.pdf |
| 26 | 32 | AMD Family 10h Server and Workstation Processor Power and Thermal Data Sheet: |
| @@ -34,7 +40,7 @@ Description · 7 unmodified lines | ||
| 34 | 40 | ----------- |
| 35 | 41 | |
| 36 | 42 | This driver permits reading of the internal temperature sensor of AMD |
| 37 | −Family 10h and 11h processors. | |
| 43 | +Family 10h/11h/12h/14h processors. | |
| 38 | 44 | |
| 39 | 45 | All these processors have a sensor, but on those for Socket F or AM2+, |
| 40 | 46 | the sensor may return inconsistent values (erratum 319). The driver |
| @@ -6,6 +6,10 @@ Supported chips: · 5 unmodified lines | ||
| 6 | 6 | Prefix 'lm93' |
| 7 | 7 | Addresses scanned: I2C 0x2c-0x2e |
| 8 | 8 | Datasheet: http://www.national.com/ds.cgi/LM/LM93.pdf |
| 9 | + * National Semiconductor LM94 | |
| 10 | + Prefix 'lm94' | |
| 11 | + Addresses scanned: I2C 0x2c-0x2e | |
| 12 | + Datasheet: http://www.national.com/ds.cgi/LM/LM94.pdf | |
| 9 | 13 | |
| 10 | 14 | Authors: |
| 11 | 15 | Mark M. Hoffman <mhoffman@lightlink.com> |
| @@ -56,6 +60,9 @@ previous motherboard management ASICs and uses some of the LM85's features · 44 unmodified lines | ||
| 56 | 60 | for dynamic Vccp monitoring and PROCHOT. It is designed to monitor a dual |
| 57 | 61 | processor Xeon class motherboard with a minimum of external components. |
| 58 | 62 | |
| 63 | +LM94 is also supported in LM93 compatible mode. Extra sensors and features of | |
| 64 | +LM94 are not supported. | |
| 65 | + | |
| 59 | 66 | |
| 60 | 67 | User Interface |
| 61 | 68 | -------------- |
| @@ -0,0 +1,49 @@ | ||
| 1 | +Kernel driver sht21 | |
| 2 | +=================== | |
| 3 | + | |
| 4 | +Supported chips: | |
| 5 | + * Sensirion SHT21 | |
| 6 | + Prefix: 'sht21' | |
| 7 | + Addresses scanned: none | |
| 8 | + Datasheet: Publicly available at the Sensirion website | |
| 9 | + http://www.sensirion.com/en/pdf/product_information/Datasheet-humidity-sensor-SHT21.pdf | |
| 10 | + | |
| 11 | + * Sensirion SHT25 | |
| 12 | + Prefix: 'sht21' | |
| 13 | + Addresses scanned: none | |
| 14 | + Datasheet: Publicly available at the Sensirion website | |
| 15 | + http://www.sensirion.com/en/pdf/product_information/Datasheet-humidity-sensor-SHT25.pdf | |
| 16 | + | |
| 17 | +Author: | |
| 18 | + Urs Fleisch <urs.fleisch@sensirion.com> | |
| 19 | + | |
| 20 | +Description | |
| 21 | +----------- | |
| 22 | + | |
| 23 | +The SHT21 and SHT25 are humidity and temperature sensors in a DFN package of | |
| 24 | +only 3 x 3 mm footprint and 1.1 mm height. The difference between the two | |
| 25 | +devices is the higher level of precision of the SHT25 (1.8% relative humidity, | |
| 26 | +0.2 degree Celsius) compared with the SHT21 (2.0% relative humidity, | |
| 27 | +0.3 degree Celsius). | |
| 28 | + | |
| 29 | +The devices communicate with the I2C protocol. All sensors are set to the same | |
| 30 | +I2C address 0x40, so an entry with I2C_BOARD_INFO("sht21", 0x40) can be used | |
| 31 | +in the board setup code. | |
| 32 | + | |
| 33 | +sysfs-Interface | |
| 34 | +--------------- | |
| 35 | + | |
| 36 | +temp1_input - temperature input | |
| 37 | +humidity1_input - humidity input | |
| 38 | + | |
| 39 | +Notes | |
| 40 | +----- | |
| 41 | + | |
| 42 | +The driver uses the default resolution settings of 12 bit for humidity and 14 | |
| 43 | +bit for temperature, which results in typical measurement times of 22 ms for | |
| 44 | +humidity and 66 ms for temperature. To keep self heating below 0.1 degree | |
| 45 | +Celsius, the device should not be active for more than 10% of the time, | |
| 46 | +e.g. maximum two measurements per second at the given resolution. | |
| 47 | + | |
| 48 | +Different resolutions, the on-chip heater, using the CRC checksum and reading | |
| 49 | +the serial number are not supported yet. | |
| @@ -384,10 +384,20 @@ curr[1-*]_min Current min value. · 383 unmodified lines | ||
| 384 | 384 | Unit: milliampere |
| 385 | 385 | RW |
| 386 | 386 | |
| 387 | +curr[1-*]_lcrit Current critical low value | |
| 388 | + Unit: milliampere | |
| 389 | + RW | |
| 390 | + | |
| 391 | +curr[1-*]_crit Current critical high value. | |
| 392 | + Unit: milliampere | |
| 393 | + RW | |
| 394 | + | |
| 387 | 395 | curr[1-*]_input Current input value |
| 388 | 396 | Unit: milliampere |
| 389 | 397 | RO |
| 390 | 398 | |
| 399 | +Also see the Alarms section for status flags associated with currents. | |
| 400 | + | |
| 391 | 401 | ********* |
| 392 | 402 | * Power * |
| 393 | 403 | ********* |
| @@ -450,13 +460,6 @@ power[1-*]_accuracy Accuracy of the power meter. · 56 unmodified lines | ||
| 450 | 460 | Unit: Percent |
| 451 | 461 | RO |
| 452 | 462 | |
| 453 | −power[1-*]_alarm 1 if the system is drawing more power than the | |
| 454 | − cap allows; 0 otherwise. A poll notification is | |
| 455 | − sent to this file when the power use exceeds the | |
| 456 | − cap. This file only appears if the cap is known | |
| 457 | − to be enforced by hardware. | |
| 458 | − RO | |
| 459 | − | |
| 460 | 463 | power[1-*]_cap If power use rises above this limit, the |
| 461 | 464 | system should take action to reduce power use. |
| 462 | 465 | A poll notification is sent to this file if the |
| @@ -479,6 +482,20 @@ power[1-*]_cap_min Minimum cap that can be set. · 16 unmodified lines | ||
| 479 | 482 | Unit: microWatt |
| 480 | 483 | RO |
| 481 | 484 | |
| 485 | +power[1-*]_max Maximum power. | |
| 486 | + Unit: microWatt | |
| 487 | + RW | |
| 488 | + | |
| 489 | +power[1-*]_crit Critical maximum power. | |
| 490 | + If power rises to or above this limit, the | |
| 491 | + system is expected take drastic action to reduce | |
| 492 | + power consumption, such as a system shutdown or | |
| 493 | + a forced powerdown of some devices. | |
| 494 | + Unit: microWatt | |
| 495 | + RW | |
| 496 | + | |
| 497 | +Also see the Alarms section for status flags associated with power readings. | |
| 498 | + | |
| 482 | 499 | ********** |
| 483 | 500 | * Energy * |
| 484 | 501 | ********** |
| @@ -488,6 +505,15 @@ energy[1-*]_input Cumulative energy use · 3 unmodified lines | ||
| 488 | 505 | RO |
| 489 | 506 | |
| 490 | 507 | |
| 508 | +************ | |
| 509 | +* Humidity * | |
| 510 | +************ | |
| 511 | + | |
| 512 | +humidity[1-*]_input Humidity | |
| 513 | + Unit: milli-percent (per cent mille, pcm) | |
| 514 | + RO | |
| 515 | + | |
| 516 | + | |
| 491 | 517 | ********** |
| 492 | 518 | * Alarms * |
| 493 | 519 | ********** |
| @@ -501,6 +527,7 @@ implementation. · 7 unmodified lines | ||
| 501 | 527 | |
| 502 | 528 | in[0-*]_alarm |
| 503 | 529 | curr[1-*]_alarm |
| 530 | +power[1-*]_alarm | |
| 504 | 531 | fan[1-*]_alarm |
| 505 | 532 | temp[1-*]_alarm |
| 506 | 533 | Channel alarm |
| @@ -512,12 +539,20 @@ OR · 5 unmodified lines | ||
| 512 | 539 | |
| 513 | 540 | in[0-*]_min_alarm |
| 514 | 541 | in[0-*]_max_alarm |
| 542 | +in[0-*]_lcrit_alarm | |
| 543 | +in[0-*]_crit_alarm | |
| 515 | 544 | curr[1-*]_min_alarm |
| 516 | 545 | curr[1-*]_max_alarm |
| 546 | +curr[1-*]_lcrit_alarm | |
| 547 | +curr[1-*]_crit_alarm | |
| 548 | +power[1-*]_cap_alarm | |
| 549 | +power[1-*]_max_alarm | |
| 550 | +power[1-*]_crit_alarm | |
| 517 | 551 | fan[1-*]_min_alarm |
| 518 | 552 | fan[1-*]_max_alarm |
| 519 | 553 | temp[1-*]_min_alarm |
| 520 | 554 | temp[1-*]_max_alarm |
| 555 | +temp[1-*]_lcrit_alarm | |
| 521 | 556 | temp[1-*]_crit_alarm |
| 522 | 557 | temp[1-*]_emergency_alarm |
| 523 | 558 | Limit alarm |
| @@ -91,3 +91,25 @@ isaset -y -f 0x2e 0xaa · 90 unmodified lines | ||
| 91 | 91 | |
| 92 | 92 | The above sequence assumes a Super-I/O config space at 0x2e/0x2f, but |
| 93 | 93 | 0x4e/0x4f is also possible. |
| 94 | + | |
| 95 | +Voltage pin mapping | |
| 96 | +------------------- | |
| 97 | + | |
| 98 | +Here is a summary of the voltage pin mapping for the W83627THF. This | |
| 99 | +can be useful to convert data provided by board manufacturers into | |
| 100 | +working libsensors configuration statements. | |
| 101 | + | |
| 102 | + W83627THF | | |
| 103 | + Pin | Name | Register | Sysfs attribute | |
| 104 | +----------------------------------------------------- | |
| 105 | + 100 | CPUVCORE | 20h | in0 | |
| 106 | + 99 | VIN0 | 21h | in1 | |
| 107 | + 98 | VIN1 | 22h | in2 | |
| 108 | + 97 | VIN2 | 24h | in4 | |
| 109 | + 114 | AVCC | 23h | in3 | |
| 110 | + 61 | 5VSB | 50h (bank 5) | in7 | |
| 111 | + 74 | VBAT | 51h (bank 5) | in8 | |
| 112 | + | |
| 113 | +For other supported devices, you'll have to take the hard path and | |
| 114 | +look up the information in the datasheet yourself (and then add it | |
| 115 | +to this document please.) | |
| @@ -92,7 +92,7 @@ This driver implements support for Winbond W83793G/W83793R chips. · 91 unmodified lines | ||
| 92 | 92 | |
| 93 | 93 | * Chassis |
| 94 | 94 | If the case open alarm triggers, it will stay in this state unless cleared |
| 95 | − by any write to the sysfs file "chassis". | |
| 95 | + by writing 0 to the sysfs file "intrusion0_alarm". | |
| 96 | 96 | |
| 97 | 97 | * VID and VRM |
| 98 | 98 | The VRM version is detected automatically, don't modify the it unless you |
| @@ -0,0 +1,65 @@ | ||
| 1 | +Kernel driver gpio-i2cmux | |
| 2 | + | |
| 3 | +Author: Peter Korsgaard <peter.korsgaard@barco.com> | |
| 4 | + | |
| 5 | +Description | |
| 6 | +----------- | |
| 7 | + | |
| 8 | +gpio-i2cmux is an i2c mux driver providing access to I2C bus segments | |
| 9 | +from a master I2C bus and a hardware MUX controlled through GPIO pins. | |
| 10 | + | |
| 11 | +E.G.: | |
| 12 | + | |
| 13 | + ---------- ---------- Bus segment 1 - - - - - | |
| 14 | + | | SCL/SDA | |-------------- | | | |
| 15 | + | |------------| | | |
| 16 | + | | | | Bus segment 2 | | | |
| 17 | + | Linux | GPIO 1..N | MUX |--------------- Devices | |
| 18 | + | |------------| | | | | |
| 19 | + | | | | Bus segment M | |
| 20 | + | | | |---------------| | | |
| 21 | + ---------- ---------- - - - - - | |
| 22 | + | |
| 23 | +SCL/SDA of the master I2C bus is multiplexed to bus segment 1..M | |
| 24 | +according to the settings of the GPIO pins 1..N. | |
| 25 | + | |
| 26 | +Usage | |
| 27 | +----- | |
| 28 | + | |
| 29 | +gpio-i2cmux uses the platform bus, so you need to provide a struct | |
| 30 | +platform_device with the platform_data pointing to a struct | |
| 31 | +gpio_i2cmux_platform_data with the I2C adapter number of the master | |
| 32 | +bus, the number of bus segments to create and the GPIO pins used | |
| 33 | +to control it. See include/linux/gpio-i2cmux.h for details. | |
| 34 | + | |
| 35 | +E.G. something like this for a MUX providing 4 bus segments | |
| 36 | +controlled through 3 GPIO pins: | |
| 37 | + | |
| 38 | +#include <linux/gpio-i2cmux.h> | |
| 39 | +#include <linux/platform_device.h> | |
| 40 | + | |
| 41 | +static const unsigned myboard_gpiomux_gpios[] = { | |
| 42 | + AT91_PIN_PC26, AT91_PIN_PC25, AT91_PIN_PC24 | |
| 43 | +}; | |
| 44 | + | |
| 45 | +static const unsigned myboard_gpiomux_values[] = { | |
| 46 | + 0, 1, 2, 3 | |
| 47 | +}; | |
| 48 | + | |
| 49 | +static struct gpio_i2cmux_platform_data myboard_i2cmux_data = { | |
| 50 | + .parent = 1, | |
| 51 | + .base_nr = 2, /* optional */ | |
| 52 | + .values = myboard_gpiomux_values, | |
| 53 | + .n_values = ARRAY_SIZE(myboard_gpiomux_values), | |
| 54 | + .gpios = myboard_gpiomux_gpios, | |
| 55 | + .n_gpios = ARRAY_SIZE(myboard_gpiomux_gpios), | |
| 56 | + .idle = 4, /* optional */ | |
| 57 | +}; | |
| 58 | + | |
| 59 | +static struct platform_device myboard_i2cmux = { | |
| 60 | + .name = "gpio-i2cmux", | |
| 61 | + .id = 0, | |
| 62 | + .dev = { | |
| 63 | + .platform_data = &myboard_i2cmux_data, | |
| 64 | + }, | |
| 65 | +}; | |
| @@ -0,0 +1,115 @@ | ||
| 1 | +Kernel driver for CMA3000-D0x | |
| 2 | +============================ | |
| 3 | + | |
| 4 | +Supported chips: | |
| 5 | +* VTI CMA3000-D0x | |
| 6 | +Datasheet: | |
| 7 | + CMA3000-D0X Product Family Specification 8281000A.02.pdf | |
| 8 | + <http://www.vti.fi/en/> | |
| 9 | + | |
| 10 | +Author: Hemanth V <hemanthv@ti.com> | |
| 11 | + | |
| 12 | + | |
| 13 | +Description | |
| 14 | +----------- | |
| 15 | +CMA3000 Tri-axis accelerometer supports Motion detect, Measurement and | |
| 16 | +Free fall modes. | |
| 17 | + | |
| 18 | +Motion Detect Mode: Its the low power mode where interrupts are generated only | |
| 19 | +when motion exceeds the defined thresholds. | |
| 20 | + | |
| 21 | +Measurement Mode: This mode is used to read the acceleration data on X,Y,Z | |
| 22 | +axis and supports 400, 100, 40 Hz sample frequency. | |
| 23 | + | |
| 24 | +Free fall Mode: This mode is intended to save system resources. | |
| 25 | + | |
| 26 | +Threshold values: Chip supports defining threshold values for above modes | |
| 27 | +which includes time and g value. Refer product specifications for more details. | |
| 28 | + | |
| 29 | +CMA3000 chip supports mutually exclusive I2C and SPI interfaces for | |
| 30 | +communication, currently the driver supports I2C based communication only. | |
| 31 | +Initial configuration for bus mode is set in non volatile memory and can later | |
| 32 | +be modified through bus interface command. | |
| 33 | + | |
| 34 | +Driver reports acceleration data through input subsystem. It generates ABS_MISC | |
| 35 | +event with value 1 when free fall is detected. | |
| 36 | + | |
| 37 | +Platform data need to be configured for initial default values. | |
| 38 | + | |
| 39 | +Platform Data | |
| 40 | +------------- | |
| 41 | +fuzz_x: Noise on X Axis | |
| 42 | + | |
| 43 | +fuzz_y: Noise on Y Axis | |
| 44 | + | |
| 45 | +fuzz_z: Noise on Z Axis | |
| 46 | + | |
| 47 | +g_range: G range in milli g i.e 2000 or 8000 | |
| 48 | + | |
| 49 | +mode: Default Operating mode | |
| 50 | + | |
| 51 | +mdthr: Motion detect g range threshold value | |
| 52 | + | |
| 53 | +mdfftmr: Motion detect and free fall time threshold value | |
| 54 | + | |
| 55 | +ffthr: Free fall g range threshold value | |
| 56 | + | |
| 57 | +Input Interface | |
| 58 | +-------------- | |
| 59 | +Input driver version is 1.0.0 | |
| 60 | +Input device ID: bus 0x18 vendor 0x0 product 0x0 version 0x0 | |
| 61 | +Input device name: "cma3000-accelerometer" | |
| 62 | +Supported events: | |
| 63 | + Event type 0 (Sync) | |
| 64 | + Event type 3 (Absolute) | |
| 65 | + Event code 0 (X) | |
| 66 | + Value 47 | |
| 67 | + Min -8000 | |
| 68 | + Max 8000 | |
| 69 | + Fuzz 200 | |
| 70 | + Event code 1 (Y) | |
| 71 | + Value -28 | |
| 72 | + Min -8000 | |
| 73 | + Max 8000 | |
| 74 | + Fuzz 200 | |
| 75 | + Event code 2 (Z) | |
| 76 | + Value 905 | |
| 77 | + Min -8000 | |
| 78 | + Max 8000 | |
| 79 | + Fuzz 200 | |
| 80 | + Event code 40 (Misc) | |
| 81 | + Value 0 | |
| 82 | + Min 0 | |
| 83 | + Max 1 | |
| 84 | + Event type 4 (Misc) | |
| 85 | + | |
| 86 | + | |
| 87 | +Register/Platform parameters Description | |
| 88 | +---------------------------------------- | |
| 89 | + | |
| 90 | +mode: | |
| 91 | + 0: power down mode | |
| 92 | + 1: 100 Hz Measurement mode | |
| 93 | + 2: 400 Hz Measurement mode | |
| 94 | + 3: 40 Hz Measurement mode | |
| 95 | + 4: Motion Detect mode (default) | |
| 96 | + 5: 100 Hz Free fall mode | |
| 97 | + 6: 40 Hz Free fall mode | |
| 98 | + 7: Power off mode | |
| 99 | + | |
| 100 | +grange: | |
| 101 | + 2000: 2000 mg or 2G Range | |
| 102 | + 8000: 8000 mg or 8G Range | |
| 103 | + | |
| 104 | +mdthr: | |
| 105 | + X: X * 71mg (8G Range) | |
| 106 | + X: X * 18mg (2G Range) | |
| 107 | + | |
| 108 | +mdfftmr: | |
| 109 | + X: (X & 0x70) * 100 ms (MDTMR) | |
| 110 | + (X & 0x0F) * 2.5 ms (FFTMR 400 Hz) | |
| 111 | + (X & 0x0F) * 10 ms (FFTMR 100 Hz) | |
| 112 | + | |
| 113 | +ffthr: | |
| 114 | + X: (X >> 2) * 18mg (2G Range) | |
| 115 | + X: (X & 0x0F) * 71 mg (8G Range) | |
| @@ -49,7 +49,9 @@ This information is subject to change. · 48 unmodified lines | ||
| 49 | 49 | #include <linux/input.h> |
| 50 | 50 | #include <sys/ioctl.h> |
| 51 | 51 | |
| 52 | −unsigned long features[1 + FF_MAX/sizeof(unsigned long)]; | |
| 52 | +#define BITS_TO_LONGS(x) \ | |
| 53 | + (((x) + 8 * sizeof (unsigned long) - 1) / (8 * sizeof (unsigned long))) | |
| 54 | +unsigned long features[BITS_TO_LONGS(FF_CNT)]; | |
| 53 | 55 | int ioctl(int file_descriptor, int request, unsigned long *features); |
| 54 | 56 | |
| 55 | 57 | "request" must be EVIOCGBIT(EV_FF, size of features array in bytes ) |
| @@ -1,6 +1,6 @@ | ||
| 1 | 1 | Multi-touch (MT) Protocol |
| 2 | 2 | ------------------------- |
| 3 | − Copyright (C) 2009 Henrik Rydberg <rydberg@euromail.se> | |
| 3 | + Copyright (C) 2009-2010 Henrik Rydberg <rydberg@euromail.se> | |
| 4 | 4 | |
| 5 | 5 | |
| 6 | 6 | Introduction |
| @@ -161,19 +161,24 @@ against the glass. The inner region will increase, and in general, the · 154 unmodified lines | ||
| 161 | 161 | ratio ABS_MT_TOUCH_MAJOR / ABS_MT_WIDTH_MAJOR, which is always smaller than |
| 162 | 162 | unity, is related to the contact pressure. For pressure-based devices, |
| 163 | 163 | ABS_MT_PRESSURE may be used to provide the pressure on the contact area |
| 164 | −instead. | |
| 164 | +instead. Devices capable of contact hovering can use ABS_MT_DISTANCE to | |
| 165 | +indicate the distance between the contact and the surface. | |
| 165 | 166 | |
| 166 | 167 | In addition to the MAJOR parameters, the oval shape of the contact can be |
| 167 | 168 | described by adding the MINOR parameters, such that MAJOR and MINOR are the |
| 168 | 169 | major and minor axis of an ellipse. Finally, the orientation of the oval |
| 169 | 170 | shape can be describe with the ORIENTATION parameter. |
| 170 | 171 | |
| 172 | +For type A devices, further specification of the touch shape is possible | |
| 173 | +via ABS_MT_BLOB_ID. | |
| 174 | + | |
| 171 | 175 | The ABS_MT_TOOL_TYPE may be used to specify whether the touching tool is a |
| 172 | −contact or a pen or something else. Devices with more granular information | |
| 173 | −may specify general shapes as blobs, i.e., as a sequence of rectangular | |
| 174 | −shapes grouped together by an ABS_MT_BLOB_ID. Finally, for the few devices | |
| 175 | −that currently support it, the ABS_MT_TRACKING_ID event may be used to | |
| 176 | −report contact tracking from hardware [5]. | |
| 176 | +finger or a pen or something else. Finally, the ABS_MT_TRACKING_ID event | |
| 177 | +may be used to track identified contacts over time [5]. | |
| 178 | + | |
| 179 | +In the type B protocol, ABS_MT_TOOL_TYPE and ABS_MT_TRACKING_ID are | |
| 180 | +implicitly handled by input core; drivers should instead call | |
| 181 | +input_mt_report_slot_state(). | |
| 177 | 182 | |
| 178 | 183 | |
| 179 | 184 | Event Semantics |
| @@ -213,6 +218,12 @@ The pressure, in arbitrary units, on the contact area. May be used instead · 33 unmodified lines | ||
| 213 | 218 | of TOUCH and WIDTH for pressure-based devices or any device with a spatial |
| 214 | 219 | signal intensity distribution. |
| 215 | 220 | |
| 221 | +ABS_MT_DISTANCE | |
| 222 | + | |
| 223 | +The distance, in surface units, between the contact and the surface. Zero | |
| 224 | +distance means the contact is touching the surface. A positive number means | |
| 225 | +the contact is hovering above the surface. | |
| 226 | + | |
| 216 | 227 | ABS_MT_ORIENTATION |
| 217 | 228 | |
| 218 | 229 | The orientation of the ellipse. The value should describe a signed quarter |
| @@ -240,21 +251,24 @@ ABS_MT_TOOL_TYPE · 21 unmodified lines | ||
| 240 | 251 | The type of approaching tool. A lot of kernel drivers cannot distinguish |
| 241 | 252 | between different tool types, such as a finger or a pen. In such cases, the |
| 242 | 253 | event should be omitted. The protocol currently supports MT_TOOL_FINGER and |
| 243 | −MT_TOOL_PEN [2]. | |
| 254 | +MT_TOOL_PEN [2]. For type B devices, this event is handled by input core; | |
| 255 | +drivers should instead use input_mt_report_slot_state(). | |
| 244 | 256 | |
| 245 | 257 | ABS_MT_BLOB_ID |
| 246 | 258 | |
| 247 | 259 | The BLOB_ID groups several packets together into one arbitrarily shaped |
| 248 | −contact. This is a low-level anonymous grouping for type A devices, and | |
| 260 | +contact. The sequence of points forms a polygon which defines the shape of | |
| 261 | +the contact. This is a low-level anonymous grouping for type A devices, and | |
| 249 | 262 | should not be confused with the high-level trackingID [5]. Most type A |
| 250 | 263 | devices do not have blob capability, so drivers can safely omit this event. |
| 251 | 264 | |
| 252 | 265 | ABS_MT_TRACKING_ID |
| 253 | 266 | |
| 254 | 267 | The TRACKING_ID identifies an initiated contact throughout its life cycle |
| 255 | −[5]. This event is mandatory for type B devices. The value range of the | |
| 256 | −TRACKING_ID should be large enough to ensure unique identification of a | |
| 257 | −contact maintained over an extended period of time. | |
| 268 | +[5]. The value range of the TRACKING_ID should be large enough to ensure | |
| 269 | +unique identification of a contact maintained over an extended period of | |
| 270 | +time. For type B devices, this event is handled by input core; drivers | |
| 271 | +should instead use input_mt_report_slot_state(). | |
| 258 | 272 | |
| 259 | 273 | |
| 260 | 274 | Event Computation |
| @@ -301,18 +315,19 @@ and with ORIENTATION, one can detect twisting of fingers. · 40 unmodified lines | ||
| 301 | 315 | Notes |
| 302 | 316 | ----- |
| 303 | 317 | |
| 304 | −In order to stay compatible with existing applications, the data | |
| 305 | −reported in a finger packet must not be recognized as single-touch | |
| 306 | −events. In addition, all finger data must bypass input filtering, | |
| 307 | −since subsequent events of the same type refer to different fingers. | |
| 318 | +In order to stay compatible with existing applications, the data reported | |
| 319 | +in a finger packet must not be recognized as single-touch events. | |
| 320 | + | |
| 321 | +For type A devices, all finger data bypasses input filtering, since | |
| 322 | +subsequent events of the same type refer to different fingers. | |
| 308 | 323 | |
| 309 | −The first kernel driver to utilize the MT protocol is the bcm5974 driver, | |
| 310 | −where examples can be found. | |
| 324 | +For example usage of the type A protocol, see the bcm5974 driver. For | |
| 325 | +example usage of the type B protocol, see the hid-egalax driver. | |
| 311 | 326 | |
| 312 | 327 | [1] With the extension ABS_MT_APPROACH_X and ABS_MT_APPROACH_Y, the |
| 313 | 328 | difference between the contact position and the approaching tool position |
| 314 | 329 | could be used to derive tilt. |
| 315 | 330 | [2] The list can of course be extended. |
| 316 | −[3] Multitouch X driver project: http://bitmath.org/code/multitouch/. | |
| 331 | +[3] The mtdev project: http://bitmath.org/code/mtdev/. | |
| 317 | 332 | [4] See the section on event computation. |
| 318 | 333 | [5] See the section on finger tracking. |
| @@ -155,7 +155,6 @@ Code Seq#(hex) Include File Comments · 154 unmodified lines | ||
| 155 | 155 | 'Q' all linux/soundcard.h |
| 156 | 156 | 'R' 00-1F linux/random.h conflict! |
| 157 | 157 | 'R' 01 linux/rfkill.h conflict! |
| 158 | −'R' 01-0F media/rds.h conflict! | |
| 159 | 158 | 'R' C0-DF net/bluetooth/rfcomm.h |
| 160 | 159 | 'S' all linux/cdrom.h conflict! |
| 161 | 160 | 'S' 80-81 scsi/scsi_ioctl.h conflict! |
| @@ -194,7 +193,6 @@ Code Seq#(hex) Include File Comments · 32 unmodified lines | ||
| 194 | 193 | <http://lrcwww.epfl.ch/> |
| 195 | 194 | 'b' 00-FF conflict! bit3 vme host bridge |
| 196 | 195 | <mailto:natalia@nikhefk.nikhef.nl> |
| 197 | −'b' 00-0F media/bt819.h conflict! | |
| 198 | 196 | 'c' all linux/cm4000_cs.h conflict! |
| 199 | 197 | 'c' 00-7F linux/comstats.h conflict! |
| 200 | 198 | 'c' 00-7F linux/coda.h conflict! |
| @@ -249,7 +247,7 @@ Code Seq#(hex) Include File Comments · 48 unmodified lines | ||
| 249 | 247 | 'p' 40-7F linux/nvram.h |
| 250 | 248 | 'p' 80-9F linux/ppdev.h user-space parport |
| 251 | 249 | <mailto:tim@cyberelk.net> |
| 252 | −'p' A1-A4 linux/pps.h LinuxPPS | |
| 250 | +'p' A1-A5 linux/pps.h LinuxPPS | |
| 253 | 251 | <mailto:giometti@linux.it> |
| 254 | 252 | 'q' 00-1F linux/serio.h |
| 255 | 253 | 'q' 80-FF linux/telephony.h Internet PhoneJACK, Internet LineJACK |
| @@ -260,14 +258,11 @@ Code Seq#(hex) Include File Comments · 4 unmodified lines | ||
| 260 | 258 | 't' 80-8F linux/isdn_ppp.h |
| 261 | 259 | 't' 90 linux/toshiba.h |
| 262 | 260 | 'u' 00-1F linux/smb_fs.h gone |
| 263 | −'v' all linux/videodev.h conflict! | |
| 264 | 261 | 'v' 00-1F linux/ext2_fs.h conflict! |
| 265 | 262 | 'v' 00-1F linux/fs.h conflict! |
| 266 | 263 | 'v' 00-0F linux/sonypi.h conflict! |
| 267 | −'v' C0-CF drivers/media/video/ov511.h conflict! | |
| 268 | 264 | 'v' C0-DF media/pwc-ioctl.h conflict! |
| 269 | 265 | 'v' C0-FF linux/meye.h conflict! |
| 270 | −'v' C0-CF drivers/media/video/zoran/zoran.h conflict! | |
| 271 | 266 | 'v' D0-DF drivers/media/video/cpia2/cpia2dev.h conflict! |
| 272 | 267 | 'w' all CERN SCI driver |
| 273 | 268 | 'y' 00-1F packet based user level communications |
| @@ -278,7 +273,6 @@ Code Seq#(hex) Include File Comments · 4 unmodified lines | ||
| 278 | 273 | <mailto:oe@port.de> |
| 279 | 274 | 'z' 10-4F drivers/s390/crypto/zcrypt_api.h conflict! |
| 280 | 275 | 0x80 00-1F linux/fb.h |
| 281 | −0x88 00-3F media/ovcamchip.h | |
| 282 | 276 | 0x89 00-06 arch/x86/include/asm/sockios.h |
| 283 | 277 | 0x89 0B-DF linux/sockios.h |
| 284 | 278 | 0x89 E0-EF linux/sockios.h SIOCPROTOPRIVATE range |
| @@ -81,7 +81,7 @@ Field 9 -- # of I/Os currently in progress · 80 unmodified lines | ||
| 81 | 81 | The only field that should go to zero. Incremented as requests are |
| 82 | 82 | given to appropriate struct request_queue and decremented as they finish. |
| 83 | 83 | Field 10 -- # of milliseconds spent doing I/Os |
| 84 | − This field is increases so long as field 9 is nonzero. | |
| 84 | + This field increases so long as field 9 is nonzero. | |
| 85 | 85 | Field 11 -- weighted # of milliseconds spent doing I/Os |
| 86 | 86 | This field is incremented at each I/O start, I/O completion, I/O |
| 87 | 87 | merge, or read of these stats by the number of I/Os in progress |
| @@ -73,6 +73,14 @@ Specify the output directory when building the kernel. · 72 unmodified lines | ||
| 73 | 73 | The output directory can also be specified using "O=...". |
| 74 | 74 | Setting "O=..." takes precedence over KBUILD_OUTPUT. |
| 75 | 75 | |
| 76 | +KBUILD_DEBARCH | |
| 77 | +-------------------------------------------------- | |
| 78 | +For the deb-pkg target, allows overriding the normal heuristics deployed by | |
| 79 | +deb-pkg. Normally deb-pkg attempts to guess the right architecture based on | |
| 80 | +the UTS_MACHINE variable, and on some architectures also the kernel config. | |
| 81 | +The value of KBUILD_DEBARCH is assumed (not checked) to be a valid Debian | |
| 82 | +architecture. | |
| 83 | + | |
| 76 | 84 | ARCH |
| 77 | 85 | -------------------------------------------------- |
| 78 | 86 | Set ARCH to the architecture to be built. |
| @@ -112,7 +112,6 @@ applicable everywhere (see syntax). · 111 unmodified lines | ||
| 112 | 112 | (no prompts anywhere) and for symbols with no dependencies. |
| 113 | 113 | That will limit the usefulness but on the other hand avoid |
| 114 | 114 | the illegal configurations all over. |
| 115 | − kconfig should one day warn about such things. | |
| 116 | 115 | |
| 117 | 116 | - numerical ranges: "range" <symbol> <symbol> ["if" <expr>] |
| 118 | 117 | This allows to limit the range of possible input values for int |
| @@ -268,7 +267,7 @@ separate list of options. · 149 unmodified lines | ||
| 268 | 267 | |
| 269 | 268 | choices: |
| 270 | 269 | |
| 271 | − "choice" | |
| 270 | + "choice" [symbol] | |
| 272 | 271 | <choice options> |
| 273 | 272 | <choice block> |
| 274 | 273 | "endchoice" |
| @@ -282,6 +281,10 @@ single driver can be compiled/loaded into the kernel, but all drivers · 7 unmodified lines | ||
| 282 | 281 | can be compiled as modules. |
| 283 | 282 | A choice accepts another option "optional", which allows to set the |
| 284 | 283 | choice to 'n' and no entry needs to be selected. |
| 284 | +If no [symbol] is associated with a choice, then you can not have multiple | |
| 285 | +definitions of that choice. If a [symbol] is associated to the choice, | |
| 286 | +then you may define the same choice (ie. with the same entries) in another | |
| 287 | +place. | |
| 285 | 288 | |
| 286 | 289 | comment: |
| 287 | 290 | |
| @@ -1136,6 +1136,21 @@ When kbuild executes, the following steps are followed (roughly): · 1135 unmodified lines | ||
| 1136 | 1136 | resulting in the target file being recompiled for no |
| 1137 | 1137 | obvious reason. |
| 1138 | 1138 | |
| 1139 | + dtc | |
| 1140 | + Create flattend device tree blob object suitable for linking | |
| 1141 | + into vmlinux. Device tree blobs linked into vmlinux are placed | |
| 1142 | + in an init section in the image. Platform code *must* copy the | |
| 1143 | + blob to non-init memory prior to calling unflatten_device_tree(). | |
| 1144 | + | |
| 1145 | + Example: | |
| 1146 | + #arch/x86/platform/ce4100/Makefile | |
| 1147 | + clean-files := *dtb.S | |
| 1148 | + | |
| 1149 | + DTC_FLAGS := -p 1024 | |
| 1150 | + obj-y += foo.dtb.o | |
| 1151 | + | |
| 1152 | + $(obj)/%.dtb: $(src)/%.dts | |
| 1153 | + $(call cmd,dtc) | |
| 1139 | 1154 | |
| 1140 | 1155 | --- 6.7 Custom kbuild commands |
| 1141 | 1156 | |
| @@ -65,18 +65,21 @@ Install kexec-tools · 64 unmodified lines | ||
| 65 | 65 | |
| 66 | 66 | 2) Download the kexec-tools user-space package from the following URL: |
| 67 | 67 | |
| 68 | −http://www.kernel.org/pub/linux/kernel/people/horms/kexec-tools/kexec-tools.tar.gz | |
| 68 | +http://kernel.org/pub/linux/utils/kernel/kexec/kexec-tools.tar.gz | |
| 69 | 69 | |
| 70 | 70 | This is a symlink to the latest version. |
| 71 | 71 | |
| 72 | 72 | The latest kexec-tools git tree is available at: |
| 73 | 73 | |
| 74 | −git://git.kernel.org/pub/scm/linux/kernel/git/horms/kexec-tools.git | |
| 75 | −or | |
| 76 | −http://www.kernel.org/git/?p=linux/kernel/git/horms/kexec-tools.git | |
| 74 | +git://git.kernel.org/pub/scm/utils/kernel/kexec/kexec-tools.git | |
| 75 | +and | |
| 76 | +http://www.kernel.org/pub/scm/utils/kernel/kexec/kexec-tools.git | |
| 77 | + | |
| 78 | +There is also a gitweb interface available at | |
| 79 | +http://www.kernel.org/git/?p=utils/kernel/kexec/kexec-tools.git | |
| 77 | 80 | |
| 78 | 81 | More information about kexec-tools can be found at |
| 79 | −http://www.kernel.org/pub/linux/kernel/people/horms/kexec-tools/README.html | |
| 82 | +http://www.kernel.org/pub/linux/utils/kernel/kexec/README.html | |
| 80 | 83 | |
| 81 | 84 | 3) Unpack the tarball with the tar command, as follows: |
| 82 | 85 | |
| @@ -439,6 +442,6 @@ To Do · 356 unmodified lines | ||
| 439 | 442 | Contact |
| 440 | 443 | ======= |
| 441 | 444 | |
| 442 | −Vivek Goyal (vgoyal@in.ibm.com) | |
| 445 | +Vivek Goyal (vgoyal@redhat.com) | |
| 443 | 446 | Maneesh Soni (maneesh@in.ibm.com) |
| 444 | 447 | |
| @@ -537,7 +537,7 @@ · 536 unmodified lines | ||
| 537 | 537 | Notes: Further information in |
| 538 | 538 | http://www.oreilly.com/catalog/linuxdrive2/ |
| 539 | 539 | |
| 540 | − * Title: "Linux Device Drivers, 3nd Edition" | |
| 540 | + * Title: "Linux Device Drivers, 3rd Edition" | |
| 541 | 541 | Authors: Jonathan Corbet, Alessandro Rubini, and Greg Kroah-Hartman |
| 542 | 542 | Publisher: O'Reilly & Associates. |
| 543 | 543 | Date: 2005. |
| @@ -592,14 +592,6 @@ · 48 unmodified lines | ||
| 592 | 592 | Pages: 600. |
| 593 | 593 | ISBN: 0-13-101908-2 |
| 594 | 594 | |
| 595 | − * Title: "The Design and Implementation of the 4.4 BSD UNIX | |
| 596 | − Operating System" | |
| 597 | − Author: Marshall Kirk McKusick, Keith Bostic, Michael J. Karels, | |
| 598 | − John S. Quarterman. | |
| 599 | − Publisher: Addison-Wesley. | |
| 600 | − Date: 1996. | |
| 601 | − ISBN: 0-201-54979-4 | |
| 602 | − | |
| 603 | 595 | * Title: "Programming for the real world - POSIX.4" |
| 604 | 596 | Author: Bill O. Gallmeister. |
| 605 | 597 | Publisher: O'Reilly & Associates, Inc.. |
| @@ -610,28 +602,13 @@ · 4 unmodified lines | ||
| 610 | 602 | POSIX. Good reference. |
| 611 | 603 | |
| 612 | 604 | * Title: "UNIX Systems for Modern Architectures: Symmetric |
| 613 | − Multiprocesssing and Caching for Kernel Programmers" | |
| 605 | + Multiprocessing and Caching for Kernel Programmers" | |
| 614 | 606 | Author: Curt Schimmel. |
| 615 | 607 | Publisher: Addison Wesley. |
| 616 | 608 | Date: June, 1994. |
| 617 | 609 | Pages: 432. |
| 618 | 610 | ISBN: 0-201-63338-8 |
| 619 | 611 | |
| 620 | − * Title: "The Design and Implementation of the 4.3 BSD UNIX | |
| 621 | − Operating System" | |
| 622 | − Author: Samuel J. Leffler, Marshall Kirk McKusick, Michael J. | |
| 623 | − Karels, John S. Quarterman. | |
| 624 | − Publisher: Addison-Wesley. | |
| 625 | − Date: 1989 (reprinted with corrections on October, 1990). | |
| 626 | − ISBN: 0-201-06196-1 | |
| 627 | − | |
| 628 | − * Title: "The Design of the UNIX Operating System" | |
| 629 | − Author: Maurice J. Bach. | |
| 630 | − Publisher: Prentice Hall. | |
| 631 | − Date: 1986. | |
| 632 | − Pages: 471. | |
| 633 | − ISBN: 0-13-201757-1 | |
| 634 | − | |
| 635 | 612 | MISCELLANEOUS: |
| 636 | 613 | |
| 637 | 614 | * Name: linux/Documentation |
| @@ -43,11 +43,11 @@ parameter is applicable: · 42 unmodified lines | ||
| 43 | 43 | AVR32 AVR32 architecture is enabled. |
| 44 | 44 | AX25 Appropriate AX.25 support is enabled. |
| 45 | 45 | BLACKFIN Blackfin architecture is enabled. |
| 46 | + DRM Direct Rendering Management support is enabled. | |
| 47 | + DYNAMIC_DEBUG Build in debug messages and enable them at runtime | |
| 46 | 48 | EDD BIOS Enhanced Disk Drive Services (EDD) is enabled |
| 47 | 49 | EFI EFI Partitioning (GPT) is enabled |
| 48 | 50 | EIDE EIDE/ATAPI support is enabled. |
| 49 | − DRM Direct Rendering Management support is enabled. | |
| 50 | − DYNAMIC_DEBUG Build in debug messages and enable them at runtime | |
| 51 | 51 | FB The frame buffer device is enabled. |
| 52 | 52 | GCOV GCOV profiling is enabled. |
| 53 | 53 | HW Appropriate hardware is enabled. |
| @@ -144,6 +144,11 @@ a fixed number of characters. This limit depends on the architecture · 90 unmodified lines | ||
| 144 | 144 | and is between 256 and 4096 characters. It is defined in the file |
| 145 | 145 | ./include/asm/setup.h as COMMAND_LINE_SIZE. |
| 146 | 146 | |
| 147 | +Finally, the [KMG] suffix is commonly described after a number of kernel | |
| 148 | +parameter values. These 'K', 'M', and 'G' letters represent the _binary_ | |
| 149 | +multipliers 'Kilo', 'Mega', and 'Giga', equalling 2^10, 2^20, and 2^30 | |
| 150 | +bytes respectively. Such letter suffixes can also be entirely omitted. | |
| 151 | + | |
| 147 | 152 | |
| 148 | 153 | acpi= [HW,ACPI,X86] |
| 149 | 154 | Advanced Configuration and Power Interface |
| @@ -199,11 +204,6 @@ and is between 256 and 4096 characters. It is defined in the file · 49 unmodified lines | ||
| 199 | 204 | unusable. The "log_buf_len" parameter may be useful |
| 200 | 205 | if you need to capture more output. |
| 201 | 206 | |
| 202 | − acpi_display_output= [HW,ACPI] | |
| 203 | − acpi_display_output=vendor | |
| 204 | − acpi_display_output=video | |
| 205 | − See above. | |
| 206 | − | |
| 207 | 207 | acpi_irq_balance [HW,ACPI] |
| 208 | 208 | ACPI will balance active IRQs |
| 209 | 209 | default in APIC mode |
| @@ -403,6 +403,10 @@ and is between 256 and 4096 characters. It is defined in the file · 193 unmodified lines | ||
| 403 | 403 | bttv.pll= See Documentation/video4linux/bttv/Insmod-options |
| 404 | 404 | bttv.tuner= and Documentation/video4linux/bttv/CARDLIST |
| 405 | 405 | |
| 406 | + bulk_remove=off [PPC] This parameter disables the use of the pSeries | |
| 407 | + firmware feature for flushing multiple hpte entries | |
| 408 | + at a time. | |
| 409 | + | |
| 406 | 410 | c101= [NET] Moxa C101 synchronous serial card |
| 407 | 411 | |
| 408 | 412 | cachesize= [BUGS=X86-32] Override level 2 CPU cache size detection. |
| @@ -546,16 +550,20 @@ and is between 256 and 4096 characters. It is defined in the file · 137 unmodified lines | ||
| 546 | 550 | Format: |
| 547 | 551 | <first_slot>,<last_slot>,<port>,<enum_bit>[,<debug>] |
| 548 | 552 | |
| 549 | − crashkernel=nn[KMG]@ss[KMG] | |
| 550 | − [KNL] Reserve a chunk of physical memory to | |
| 551 | − hold a kernel to switch to with kexec on panic. | |
| 553 | + crashkernel=size[KMG][@offset[KMG]] | |
| 554 | + [KNL] Using kexec, Linux can switch to a 'crash kernel' | |
| 555 | + upon panic. This parameter reserves the physical | |
| 556 | + memory region [offset, offset + size] for that kernel | |
| 557 | + image. If '@offset' is omitted, then a suitable offset | |
| 558 | + is selected automatically. Check | |
| 559 | + Documentation/kdump/kdump.txt for further details. | |
| 552 | 560 | |
| 553 | 561 | crashkernel=range1:size1[,range2:size2,...][@offset] |
| 554 | 562 | [KNL] Same as above, but depends on the memory |
| 555 | 563 | in the running system. The syntax of range is |
| 556 | 564 | start-[end] where start and end are both |
| 557 | 565 | a memory unit (amount[KMG]). See also |
| 558 | − Documentation/kdump/kdump.txt for a example. | |
| 566 | + Documentation/kdump/kdump.txt for an example. | |
| 559 | 567 | |
| 560 | 568 | cs89x0_dma= [HW,NET] |
| 561 | 569 | Format: <dma> |
| @@ -655,11 +663,6 @@ and is between 256 and 4096 characters. It is defined in the file · 93 unmodified lines | ||
| 655 | 663 | |
| 656 | 664 | dscc4.setup= [NET] |
| 657 | 665 | |
| 658 | − dynamic_printk Enables pr_debug()/dev_dbg() calls if | |
| 659 | − CONFIG_DYNAMIC_PRINTK_DEBUG has been enabled. | |
| 660 | − These can also be switched on/off via | |
| 661 | − <debugfs>/dynamic_printk/modules | |
| 662 | − | |
| 663 | 666 | earlycon= [KNL] Output early console device and options. |
| 664 | 667 | uart[8250],io,<addr>[,options] |
| 665 | 668 | uart[8250],mmio,<addr>[,options] |
| @@ -884,6 +887,7 @@ and is between 256 and 4096 characters. It is defined in the file · 218 unmodified lines | ||
| 884 | 887 | controller |
| 885 | 888 | i8042.nopnp [HW] Don't use ACPIPnP / PnPBIOS to discover KBD/AUX |
| 886 | 889 | controllers |
| 890 | + i8042.notimeout [HW] Ignore timeout condition signalled by conroller | |
| 887 | 891 | i8042.reset [HW] Reset the controller during init and cleanup |
| 888 | 892 | i8042.unlock [HW] Unlock (ignore) the keylock |
| 889 | 893 | |
| @@ -1267,10 +1271,9 @@ and is between 256 and 4096 characters. It is defined in the file · 377 unmodified lines | ||
| 1267 | 1271 | 6 (KERN_INFO) informational |
| 1268 | 1272 | 7 (KERN_DEBUG) debug-level messages |
| 1269 | 1273 | |
| 1270 | − log_buf_len=n Sets the size of the printk ring buffer, in bytes. | |
| 1271 | − Format: { n | nk | nM } | |
| 1272 | − n must be a power of two. The default size | |
| 1273 | − is set in the kernel config file. | |
| 1274 | + log_buf_len=n[KMG] Sets the size of the printk ring buffer, | |
| 1275 | + in bytes. n must be a power of two. The default | |
| 1276 | + size is set in the kernel config file. | |
| 1274 | 1277 | |
| 1275 | 1278 | logo.nologo [FB] Disables display of the built-in Linux logo. |
| 1276 | 1279 | This may be used to provide more screen space for |
| @@ -1490,6 +1493,10 @@ and is between 256 and 4096 characters. It is defined in the file · 213 unmodified lines | ||
| 1490 | 1493 | mtdparts= [MTD] |
| 1491 | 1494 | See drivers/mtd/cmdlinepart.c. |
| 1492 | 1495 | |
| 1496 | + multitce=off [PPC] This parameter disables the use of the pSeries | |
| 1497 | + firmware feature for updating multiple TCE entries | |
| 1498 | + at a time. | |
| 1499 | + | |
| 1493 | 1500 | onenand.bdry= [HW,MTD] Flex-OneNAND Boundary Configuration |
| 1494 | 1501 | |
| 1495 | 1502 | Format: [die0_boundary][,die0_lock][,die1_boundary][,die1_lock] |
| @@ -1579,20 +1586,12 @@ and is between 256 and 4096 characters. It is defined in the file · 83 unmodified lines | ||
| 1579 | 1586 | |
| 1580 | 1587 | nmi_watchdog= [KNL,BUGS=X86] Debugging features for SMP kernels |
| 1581 | 1588 | Format: [panic,][num] |
| 1582 | − Valid num: 0,1,2 | |
| 1589 | + Valid num: 0 | |
| 1583 | 1590 | 0 - turn nmi_watchdog off |
| 1584 | − 1 - use the IO-APIC timer for the NMI watchdog | |
| 1585 | − 2 - use the local APIC for the NMI watchdog using | |
| 1586 | − a performance counter. Note: This will use one | |
| 1587 | − performance counter and the local APIC's performance | |
| 1588 | − vector. | |
| 1589 | 1591 | When panic is specified, panic when an NMI watchdog |
| 1590 | 1592 | timeout occurs. |
| 1591 | 1593 | This is useful when you use a panic=... timeout and |
| 1592 | 1594 | need the box quickly up again. |
| 1593 | − Instead of 1 and 2 it is possible to use the following | |
| 1594 | − symbolic names: lapic and ioapic | |
| 1595 | − Example: nmi_watchdog=2 or nmi_watchdog=panic,lapic | |
| 1596 | 1595 | |
| 1597 | 1596 | netpoll.carrier_timeout= |
| 1598 | 1597 | [NET] Specifies amount of time (in seconds) that |
| @@ -1622,6 +1621,8 @@ and is between 256 and 4096 characters. It is defined in the file · 23 unmodified lines | ||
| 1622 | 1621 | noapic [SMP,APIC] Tells the kernel to not make use of any |
| 1623 | 1622 | IOAPICs that may be present in the system. |
| 1624 | 1623 | |
| 1624 | + noautogroup Disable scheduler automatic task group creation. | |
| 1625 | + | |
| 1625 | 1626 | nobats [PPC] Do not use BATs for mapping kernel lowmem |
| 1626 | 1627 | on "Classic" PPC cores. |
| 1627 | 1628 | |
| @@ -1707,6 +1708,9 @@ and is between 256 and 4096 characters. It is defined in the file · 79 unmodified lines | ||
| 1707 | 1708 | |
| 1708 | 1709 | no-kvmclock [X86,KVM] Disable paravirtualized KVM clock driver |
| 1709 | 1710 | |
| 1711 | + no-kvmapf [X86,KVM] Disable paravirtualized asynchronous page | |
| 1712 | + fault handling. | |
| 1713 | + | |
| 1710 | 1714 | nolapic [X86-32,APIC] Do not enable or use the local APIC. |
| 1711 | 1715 | |
| 1712 | 1716 | nolapic_timer [X86-32,APIC] Do not use the local APIC timer. |
| @@ -2467,12 +2471,13 @@ and is between 256 and 4096 characters. It is defined in the file · 754 unmodified lines | ||
| 2467 | 2471 | to facilitate early boot debugging. |
| 2468 | 2472 | See also Documentation/trace/events.txt |
| 2469 | 2473 | |
| 2470 | − tsc= Disable clocksource-must-verify flag for TSC. | |
| 2474 | + tsc= Disable clocksource stability checks for TSC. | |
| 2471 | 2475 | Format: <string> |
| 2472 | 2476 | [x86] reliable: mark tsc clocksource as reliable, this |
| 2473 | − disables clocksource verification at runtime. | |
| 2474 | − Used to enable high-resolution timer mode on older | |
| 2475 | − hardware, and in virtualized environment. | |
| 2477 | + disables clocksource verification at runtime, as well | |
| 2478 | + as the stability checks done at bootup. Used to enable | |
| 2479 | + high-resolution timer mode on older hardware, and in | |
| 2480 | + virtualized environment. | |
| 2476 | 2481 | [x86] noirqtime: Do not use TSC to do irq accounting. |
| 2477 | 2482 | Used to run time disable IRQ_TIME_ACCOUNTING on any |
| 2478 | 2483 | platforms where RDTSC is slow and this accounting |
| @@ -0,0 +1,145 @@ | ||
| 1 | + Trusted and Encrypted Keys | |
| 2 | + | |
| 3 | +Trusted and Encrypted Keys are two new key types added to the existing kernel | |
| 4 | +key ring service. Both of these new types are variable length symmetic keys, | |
| 5 | +and in both cases all keys are created in the kernel, and user space sees, | |
| 6 | +stores, and loads only encrypted blobs. Trusted Keys require the availability | |
| 7 | +of a Trusted Platform Module (TPM) chip for greater security, while Encrypted | |
| 8 | +Keys can be used on any system. All user level blobs, are displayed and loaded | |
| 9 | +in hex ascii for convenience, and are integrity verified. | |
| 10 | + | |
| 11 | +Trusted Keys use a TPM both to generate and to seal the keys. Keys are sealed | |
| 12 | +under a 2048 bit RSA key in the TPM, and optionally sealed to specified PCR | |
| 13 | +(integrity measurement) values, and only unsealed by the TPM, if PCRs and blob | |
| 14 | +integrity verifications match. A loaded Trusted Key can be updated with new | |
| 15 | +(future) PCR values, so keys are easily migrated to new pcr values, such as | |
| 16 | +when the kernel and initramfs are updated. The same key can have many saved | |
| 17 | +blobs under different PCR values, so multiple boots are easily supported. | |
| 18 | + | |
| 19 | +By default, trusted keys are sealed under the SRK, which has the default | |
| 20 | +authorization value (20 zeros). This can be set at takeownership time with the | |
| 21 | +trouser's utility: "tpm_takeownership -u -z". | |
| 22 | + | |
| 23 | +Usage: | |
| 24 | + keyctl add trusted name "new keylen [options]" ring | |
| 25 | + keyctl add trusted name "load hex_blob [pcrlock=pcrnum]" ring | |
| 26 | + keyctl update key "update [options]" | |
| 27 | + keyctl print keyid | |
| 28 | + | |
| 29 | + options: | |
| 30 | + keyhandle= ascii hex value of sealing key default 0x40000000 (SRK) | |
| 31 | + keyauth= ascii hex auth for sealing key default 0x00...i | |
| 32 | + (40 ascii zeros) | |
| 33 | + blobauth= ascii hex auth for sealed data default 0x00... | |
| 34 | + (40 ascii zeros) | |
| 35 | + blobauth= ascii hex auth for sealed data default 0x00... | |
| 36 | + (40 ascii zeros) | |
| 37 | + pcrinfo= ascii hex of PCR_INFO or PCR_INFO_LONG (no default) | |
| 38 | + pcrlock= pcr number to be extended to "lock" blob | |
| 39 | + migratable= 0|1 indicating permission to reseal to new PCR values, | |
| 40 | + default 1 (resealing allowed) | |
| 41 | + | |
| 42 | +"keyctl print" returns an ascii hex copy of the sealed key, which is in standard | |
| 43 | +TPM_STORED_DATA format. The key length for new keys are always in bytes. | |
| 44 | +Trusted Keys can be 32 - 128 bytes (256 - 1024 bits), the upper limit is to fit | |
| 45 | +within the 2048 bit SRK (RSA) keylength, with all necessary structure/padding. | |
| 46 | + | |
| 47 | +Encrypted keys do not depend on a TPM, and are faster, as they use AES for | |
| 48 | +encryption/decryption. New keys are created from kernel generated random | |
| 49 | +numbers, and are encrypted/decrypted using a specified 'master' key. The | |
| 50 | +'master' key can either be a trusted-key or user-key type. The main | |
| 51 | +disadvantage of encrypted keys is that if they are not rooted in a trusted key, | |
| 52 | +they are only as secure as the user key encrypting them. The master user key | |
| 53 | +should therefore be loaded in as secure a way as possible, preferably early in | |
| 54 | +boot. | |
| 55 | + | |
| 56 | +Usage: | |
| 57 | + keyctl add encrypted name "new key-type:master-key-name keylen" ring | |
| 58 | + keyctl add encrypted name "load hex_blob" ring | |
| 59 | + keyctl update keyid "update key-type:master-key-name" | |
| 60 | + | |
| 61 | +where 'key-type' is either 'trusted' or 'user'. | |
| 62 | + | |
| 63 | +Examples of trusted and encrypted key usage: | |
| 64 | + | |
| 65 | +Create and save a trusted key named "kmk" of length 32 bytes: | |
| 66 | + | |
| 67 | + $ keyctl add trusted kmk "new 32" @u | |
| 68 | + 440502848 | |
| 69 | + | |
| 70 | + $ keyctl show | |
| 71 | + Session Keyring | |
| 72 | + -3 --alswrv 500 500 keyring: _ses | |
| 73 | + 97833714 --alswrv 500 -1 \_ keyring: _uid.500 | |
| 74 | + 440502848 --alswrv 500 500 \_ trusted: kmk | |
| 75 | + | |
| 76 | + $ keyctl print 440502848 | |
| 77 | + 0101000000000000000001005d01b7e3f4a6be5709930f3b70a743cbb42e0cc95e18e915 | |
| 78 | + 3f60da455bbf1144ad12e4f92b452f966929f6105fd29ca28e4d4d5a031d068478bacb0b | |
| 79 | + 27351119f822911b0a11ba3d3498ba6a32e50dac7f32894dd890eb9ad578e4e292c83722 | |
| 80 | + a52e56a097e6a68b3f56f7a52ece0cdccba1eb62cad7d817f6dc58898b3ac15f36026fec | |
| 81 | + d568bd4a706cb60bb37be6d8f1240661199d640b66fb0fe3b079f97f450b9ef9c22c6d5d | |
| 82 | + dd379f0facd1cd020281dfa3c70ba21a3fa6fc2471dc6d13ecf8298b946f65345faa5ef0 | |
| 83 | + f1f8fff03ad0acb083725535636addb08d73dedb9832da198081e5deae84bfaf0409c22b | |
| 84 | + e4a8aea2b607ec96931e6f4d4fe563ba | |
| 85 | + | |
| 86 | + $ keyctl pipe 440502848 > kmk.blob | |
| 87 | + | |
| 88 | +Load a trusted key from the saved blob: | |
| 89 | + | |
| 90 | + $ keyctl add trusted kmk "load `cat kmk.blob`" @u | |
| 91 | + 268728824 | |
| 92 | + | |
| 93 | + $ keyctl print 268728824 | |
| 94 | + 0101000000000000000001005d01b7e3f4a6be5709930f3b70a743cbb42e0cc95e18e915 | |
| 95 | + 3f60da455bbf1144ad12e4f92b452f966929f6105fd29ca28e4d4d5a031d068478bacb0b | |
| 96 | + 27351119f822911b0a11ba3d3498ba6a32e50dac7f32894dd890eb9ad578e4e292c83722 | |
| 97 | + a52e56a097e6a68b3f56f7a52ece0cdccba1eb62cad7d817f6dc58898b3ac15f36026fec | |
| 98 | + d568bd4a706cb60bb37be6d8f1240661199d640b66fb0fe3b079f97f450b9ef9c22c6d5d | |
| 99 | + dd379f0facd1cd020281dfa3c70ba21a3fa6fc2471dc6d13ecf8298b946f65345faa5ef0 | |
| 100 | + f1f8fff03ad0acb083725535636addb08d73dedb9832da198081e5deae84bfaf0409c22b | |
| 101 | + e4a8aea2b607ec96931e6f4d4fe563ba | |
| 102 | + | |
| 103 | +Reseal a trusted key under new pcr values: | |
| 104 | + | |
| 105 | + $ keyctl update 268728824 "update pcrinfo=`cat pcr.blob`" | |
| 106 | + $ keyctl print 268728824 | |
| 107 | + 010100000000002c0002800093c35a09b70fff26e7a98ae786c641e678ec6ffb6b46d805 | |
| 108 | + 77c8a6377aed9d3219c6dfec4b23ffe3000001005d37d472ac8a44023fbb3d18583a4f73 | |
| 109 | + d3a076c0858f6f1dcaa39ea0f119911ff03f5406df4f7f27f41da8d7194f45c9f4e00f2e | |
| 110 | + df449f266253aa3f52e55c53de147773e00f0f9aca86c64d94c95382265968c354c5eab4 | |
| 111 | + 9638c5ae99c89de1e0997242edfb0b501744e11ff9762dfd951cffd93227cc513384e7e6 | |
| 112 | + e782c29435c7ec2edafaa2f4c1fe6e7a781b59549ff5296371b42133777dcc5b8b971610 | |
| 113 | + 94bc67ede19e43ddb9dc2baacad374a36feaf0314d700af0a65c164b7082401740e489c9 | |
| 114 | + 7ef6a24defe4846104209bf0c3eced7fa1a672ed5b125fc9d8cd88b476a658a4434644ef | |
| 115 | + df8ae9a178e9f83ba9f08d10fa47e4226b98b0702f06b3b8 | |
| 116 | + | |
| 117 | +Create and save an encrypted key "evm" using the above trusted key "kmk": | |
| 118 | + | |
| 119 | + $ keyctl add encrypted evm "new trusted:kmk 32" @u | |
| 120 | + 159771175 | |
| 121 | + | |
| 122 | + $ keyctl print 159771175 | |
| 123 | + trusted:kmk 32 2375725ad57798846a9bbd240de8906f006e66c03af53b1b382dbbc55 | |
| 124 | + be2a44616e4959430436dc4f2a7a9659aa60bb4652aeb2120f149ed197c564e024717c64 | |
| 125 | + 5972dcb82ab2dde83376d82b2e3c09ffc | |
| 126 | + | |
| 127 | + $ keyctl pipe 159771175 > evm.blob | |
| 128 | + | |
| 129 | +Load an encrypted key "evm" from saved blob: | |
| 130 | + | |
| 131 | + $ keyctl add encrypted evm "load `cat evm.blob`" @u | |
| 132 | + 831684262 | |
| 133 | + | |
| 134 | + $ keyctl print 831684262 | |
| 135 | + trusted:kmk 32 2375725ad57798846a9bbd240de8906f006e66c03af53b1b382dbbc55 | |
| 136 | + be2a44616e4959430436dc4f2a7a9659aa60bb4652aeb2120f149ed197c564e024717c64 | |
| 137 | + 5972dcb82ab2dde83376d82b2e3c09ffc | |
| 138 | + | |
| 139 | + | |
| 140 | +The initial consumer of trusted keys is EVM, which at boot time needs a high | |
| 141 | +quality symmetric key for HMAC protection of file metadata. The use of a | |
| 142 | +trusted key provides strong guarantees that the EVM key has not been | |
| 143 | +compromised by a user level problem, and when sealed to specific boot PCR | |
| 144 | +values, protects against boot and offline attacks. Other uses for trusted and | |
| 145 | +encrypted keys, such as for disk and file encryption are anticipated. | |
| @@ -391,8 +391,8 @@ bugme-new 메일링 리스트나(새로운 버그 리포트들만이 이곳에 · 390 unmodified lines | ||
| 391 | 391 | bugme-janitor 메일링 리스트(bugzilla에 모든 변화들이 여기서 메일로 전해진다) |
| 392 | 392 | 에 등록하면 된다. |
| 393 | 393 | |
| 394 | − http://lists.osdl.org/mailman/listinfo/bugme-new | |
| 395 | − http://lists.osdl.org/mailman/listinfo/bugme-janitors | |
| 394 | + https://lists.linux-foundation.org/mailman/listinfo/bugme-new | |
| 395 | + https://lists.linux-foundation.org/mailman/listinfo/bugme-janitors | |
| 396 | 396 | |
| 397 | 397 | |
| 398 | 398 | |
| @@ -598,7 +598,7 @@ a 5-byte jump instruction. So there are several limitations. · 597 unmodified lines | ||
| 598 | 598 | a) The instructions in DCR must be relocatable. |
| 599 | 599 | b) The instructions in DCR must not include a call instruction. |
| 600 | 600 | c) JTPR must not be targeted by any jump or call instruction. |
| 601 | −d) DCR must not straddle the border betweeen functions. | |
| 601 | +d) DCR must not straddle the border between functions. | |
| 602 | 602 | |
| 603 | 603 | Anyway, these limitations are checked by the in-kernel instruction |
| 604 | 604 | decoder, so you don't need to worry about that. |
| @@ -874,7 +874,7 @@ Possible values are: · 873 unmodified lines | ||
| 874 | 874 | - KVM_MP_STATE_HALTED: the vcpu has executed a HLT instruction and |
| 875 | 875 | is waiting for an interrupt |
| 876 | 876 | - KVM_MP_STATE_SIPI_RECEIVED: the vcpu has just received a SIPI (vector |
| 877 | − accesible via KVM_GET_VCPU_EVENTS) | |
| 877 | + accessible via KVM_GET_VCPU_EVENTS) | |
| 878 | 878 | |
| 879 | 879 | This ioctl is only useful after KVM_CREATE_IRQCHIP. Without an in-kernel |
| 880 | 880 | irqchip, the multiprocessing state must be maintained by userspace. |
| @@ -1085,6 +1085,184 @@ of 4 instructions that make up a hypercall. · 204 unmodified lines | ||
| 1085 | 1085 | If any additional field gets added to this structure later on, a bit for that |
| 1086 | 1086 | additional piece of information will be set in the flags bitmap. |
| 1087 | 1087 | |
| 1088 | +4.47 KVM_ASSIGN_PCI_DEVICE | |
| 1089 | + | |
| 1090 | +Capability: KVM_CAP_DEVICE_ASSIGNMENT | |
| 1091 | +Architectures: x86 ia64 | |
| 1092 | +Type: vm ioctl | |
| 1093 | +Parameters: struct kvm_assigned_pci_dev (in) | |
| 1094 | +Returns: 0 on success, -1 on error | |
| 1095 | + | |
| 1096 | +Assigns a host PCI device to the VM. | |
| 1097 | + | |
| 1098 | +struct kvm_assigned_pci_dev { | |
| 1099 | + __u32 assigned_dev_id; | |
| 1100 | + __u32 busnr; | |
| 1101 | + __u32 devfn; | |
| 1102 | + __u32 flags; | |
| 1103 | + __u32 segnr; | |
| 1104 | + union { | |
| 1105 | + __u32 reserved[11]; | |
| 1106 | + }; | |
| 1107 | +}; | |
| 1108 | + | |
| 1109 | +The PCI device is specified by the triple segnr, busnr, and devfn. | |
| 1110 | +Identification in succeeding service requests is done via assigned_dev_id. The | |
| 1111 | +following flags are specified: | |
| 1112 | + | |
| 1113 | +/* Depends on KVM_CAP_IOMMU */ | |
| 1114 | +#define KVM_DEV_ASSIGN_ENABLE_IOMMU (1 << 0) | |
| 1115 | + | |
| 1116 | +4.48 KVM_DEASSIGN_PCI_DEVICE | |
| 1117 | + | |
| 1118 | +Capability: KVM_CAP_DEVICE_DEASSIGNMENT | |
| 1119 | +Architectures: x86 ia64 | |
| 1120 | +Type: vm ioctl | |
| 1121 | +Parameters: struct kvm_assigned_pci_dev (in) | |
| 1122 | +Returns: 0 on success, -1 on error | |
| 1123 | + | |
| 1124 | +Ends PCI device assignment, releasing all associated resources. | |
| 1125 | + | |
| 1126 | +See KVM_CAP_DEVICE_ASSIGNMENT for the data structure. Only assigned_dev_id is | |
| 1127 | +used in kvm_assigned_pci_dev to identify the device. | |
| 1128 | + | |
| 1129 | +4.49 KVM_ASSIGN_DEV_IRQ | |
| 1130 | + | |
| 1131 | +Capability: KVM_CAP_ASSIGN_DEV_IRQ | |
| 1132 | +Architectures: x86 ia64 | |
| 1133 | +Type: vm ioctl | |
| 1134 | +Parameters: struct kvm_assigned_irq (in) | |
| 1135 | +Returns: 0 on success, -1 on error | |
| 1136 | + | |
| 1137 | +Assigns an IRQ to a passed-through device. | |
| 1138 | + | |
| 1139 | +struct kvm_assigned_irq { | |
| 1140 | + __u32 assigned_dev_id; | |
| 1141 | + __u32 host_irq; | |
| 1142 | + __u32 guest_irq; | |
| 1143 | + __u32 flags; | |
| 1144 | + union { | |
| 1145 | + struct { | |
| 1146 | + __u32 addr_lo; | |
| 1147 | + __u32 addr_hi; | |
| 1148 | + __u32 data; | |
| 1149 | + } guest_msi; | |
| 1150 | + __u32 reserved[12]; | |
| 1151 | + }; | |
| 1152 | +}; | |
| 1153 | + | |
| 1154 | +The following flags are defined: | |
| 1155 | + | |
| 1156 | +#define KVM_DEV_IRQ_HOST_INTX (1 << 0) | |
| 1157 | +#define KVM_DEV_IRQ_HOST_MSI (1 << 1) | |
| 1158 | +#define KVM_DEV_IRQ_HOST_MSIX (1 << 2) | |
| 1159 | + | |
| 1160 | +#define KVM_DEV_IRQ_GUEST_INTX (1 << 8) | |
| 1161 | +#define KVM_DEV_IRQ_GUEST_MSI (1 << 9) | |
| 1162 | +#define KVM_DEV_IRQ_GUEST_MSIX (1 << 10) | |
| 1163 | + | |
| 1164 | +It is not valid to specify multiple types per host or guest IRQ. However, the | |
| 1165 | +IRQ type of host and guest can differ or can even be null. | |
| 1166 | + | |
| 1167 | +4.50 KVM_DEASSIGN_DEV_IRQ | |
| 1168 | + | |
| 1169 | +Capability: KVM_CAP_ASSIGN_DEV_IRQ | |
| 1170 | +Architectures: x86 ia64 | |
| 1171 | +Type: vm ioctl | |
| 1172 | +Parameters: struct kvm_assigned_irq (in) | |
| 1173 | +Returns: 0 on success, -1 on error | |
| 1174 | + | |
| 1175 | +Ends an IRQ assignment to a passed-through device. | |
| 1176 | + | |
| 1177 | +See KVM_ASSIGN_DEV_IRQ for the data structure. The target device is specified | |
| 1178 | +by assigned_dev_id, flags must correspond to the IRQ type specified on | |
| 1179 | +KVM_ASSIGN_DEV_IRQ. Partial deassignment of host or guest IRQ is allowed. | |
| 1180 | + | |
| 1181 | +4.51 KVM_SET_GSI_ROUTING | |
| 1182 | + | |
| 1183 | +Capability: KVM_CAP_IRQ_ROUTING | |
| 1184 | +Architectures: x86 ia64 | |
| 1185 | +Type: vm ioctl | |
| 1186 | +Parameters: struct kvm_irq_routing (in) | |
| 1187 | +Returns: 0 on success, -1 on error | |
| 1188 | + | |
| 1189 | +Sets the GSI routing table entries, overwriting any previously set entries. | |
| 1190 | + | |
| 1191 | +struct kvm_irq_routing { | |
| 1192 | + __u32 nr; | |
| 1193 | + __u32 flags; | |
| 1194 | + struct kvm_irq_routing_entry entries[0]; | |
| 1195 | +}; | |
| 1196 | + | |
| 1197 | +No flags are specified so far, the corresponding field must be set to zero. | |
| 1198 | + | |
| 1199 | +struct kvm_irq_routing_entry { | |
| 1200 | + __u32 gsi; | |
| 1201 | + __u32 type; | |
| 1202 | + __u32 flags; | |
| 1203 | + __u32 pad; | |
| 1204 | + union { | |
| 1205 | + struct kvm_irq_routing_irqchip irqchip; | |
| 1206 | + struct kvm_irq_routing_msi msi; | |
| 1207 | + __u32 pad[8]; | |
| 1208 | + } u; | |
| 1209 | +}; | |
| 1210 | + | |
| 1211 | +/* gsi routing entry types */ | |
| 1212 | +#define KVM_IRQ_ROUTING_IRQCHIP 1 | |
| 1213 | +#define KVM_IRQ_ROUTING_MSI 2 | |
| 1214 | + | |
| 1215 | +No flags are specified so far, the corresponding field must be set to zero. | |
| 1216 | + | |
| 1217 | +struct kvm_irq_routing_irqchip { | |
| 1218 | + __u32 irqchip; | |
| 1219 | + __u32 pin; | |
| 1220 | +}; | |
| 1221 | + | |
| 1222 | +struct kvm_irq_routing_msi { | |
| 1223 | + __u32 address_lo; | |
| 1224 | + __u32 address_hi; | |
| 1225 | + __u32 data; | |
| 1226 | + __u32 pad; | |
| 1227 | +}; | |
| 1228 | + | |
| 1229 | +4.52 KVM_ASSIGN_SET_MSIX_NR | |
| 1230 | + | |
| 1231 | +Capability: KVM_CAP_DEVICE_MSIX | |
| 1232 | +Architectures: x86 ia64 | |
| 1233 | +Type: vm ioctl | |
| 1234 | +Parameters: struct kvm_assigned_msix_nr (in) | |
| 1235 | +Returns: 0 on success, -1 on error | |
| 1236 | + | |
| 1237 | +Set the number of MSI-X interrupts for an assigned device. This service can | |
| 1238 | +only be called once in the lifetime of an assigned device. | |
| 1239 | + | |
| 1240 | +struct kvm_assigned_msix_nr { | |
| 1241 | + __u32 assigned_dev_id; | |
| 1242 | + __u16 entry_nr; | |
| 1243 | + __u16 padding; | |
| 1244 | +}; | |
| 1245 | + | |
| 1246 | +#define KVM_MAX_MSIX_PER_DEV 256 | |
| 1247 | + | |
| 1248 | +4.53 KVM_ASSIGN_SET_MSIX_ENTRY | |
| 1249 | + | |
| 1250 | +Capability: KVM_CAP_DEVICE_MSIX | |
| 1251 | +Architectures: x86 ia64 | |
| 1252 | +Type: vm ioctl | |
| 1253 | +Parameters: struct kvm_assigned_msix_entry (in) | |
| 1254 | +Returns: 0 on success, -1 on error | |
| 1255 | + | |
| 1256 | +Specifies the routing of an MSI-X assigned device interrupt to a GSI. Setting | |
| 1257 | +the GSI vector to zero means disabling the interrupt. | |
| 1258 | + | |
| 1259 | +struct kvm_assigned_msix_entry { | |
| 1260 | + __u32 assigned_dev_id; | |
| 1261 | + __u32 gsi; | |
| 1262 | + __u16 entry; /* The index of entry in the MSI-X table */ | |
| 1263 | + __u16 padding[3]; | |
| 1264 | +}; | |
| 1265 | + | |
| 1088 | 1266 | 5. The kvm_run structure |
| 1089 | 1267 | |
| 1090 | 1268 | Application code obtains a pointer to the kvm_run structure by |
| @@ -36,6 +36,9 @@ KVM_FEATURE_MMU_OP || 2 || deprecated. · 35 unmodified lines | ||
| 36 | 36 | KVM_FEATURE_CLOCKSOURCE2 || 3 || kvmclock available at msrs |
| 37 | 37 | || || 0x4b564d00 and 0x4b564d01 |
| 38 | 38 | ------------------------------------------------------------------------------ |
| 39 | +KVM_FEATURE_ASYNC_PF || 4 || async pf can be enabled by | |
| 40 | + || || writing to msr 0x4b564d02 | |
| 41 | +------------------------------------------------------------------------------ | |
| 39 | 42 | KVM_FEATURE_CLOCKSOURCE_STABLE_BIT || 24 || host will warn if no guest-side |
| 40 | 43 | || || per-cpu warps are expected in |
| 41 | 44 | || || kvmclock. |
| @@ -3,7 +3,6 @@ Glauber Costa <glommer@redhat.com>, Red Hat Inc, 2010 · 2 unmodified lines | ||
| 3 | 3 | ===================================================== |
| 4 | 4 | |
| 5 | 5 | KVM makes use of some custom MSRs to service some requests. |
| 6 | −At present, this facility is only used by kvmclock. | |
| 7 | 6 | |
| 8 | 7 | Custom MSRs have a range reserved for them, that goes from |
| 9 | 8 | 0x4b564d00 to 0x4b564dff. There are MSRs outside this area, |
| @@ -151,3 +150,38 @@ MSR_KVM_SYSTEM_TIME: 0x12 · 141 unmodified lines | ||
| 151 | 150 | return PRESENT; |
| 152 | 151 | } else |
| 153 | 152 | return NON_PRESENT; |
| 153 | + | |
| 154 | +MSR_KVM_ASYNC_PF_EN: 0x4b564d02 | |
| 155 | + data: Bits 63-6 hold 64-byte aligned physical address of a | |
| 156 | + 64 byte memory area which must be in guest RAM and must be | |
| 157 | + zeroed. Bits 5-2 are reserved and should be zero. Bit 0 is 1 | |
| 158 | + when asynchronous page faults are enabled on the vcpu 0 when | |
| 159 | + disabled. Bit 2 is 1 if asynchronous page faults can be injected | |
| 160 | + when vcpu is in cpl == 0. | |
| 161 | + | |
| 162 | + First 4 byte of 64 byte memory location will be written to by | |
| 163 | + the hypervisor at the time of asynchronous page fault (APF) | |
| 164 | + injection to indicate type of asynchronous page fault. Value | |
| 165 | + of 1 means that the page referred to by the page fault is not | |
| 166 | + present. Value 2 means that the page is now available. Disabling | |
| 167 | + interrupt inhibits APFs. Guest must not enable interrupt | |
| 168 | + before the reason is read, or it may be overwritten by another | |
| 169 | + APF. Since APF uses the same exception vector as regular page | |
| 170 | + fault guest must reset the reason to 0 before it does | |
| 171 | + something that can generate normal page fault. If during page | |
| 172 | + fault APF reason is 0 it means that this is regular page | |
| 173 | + fault. | |
| 174 | + | |
| 175 | + During delivery of type 1 APF cr2 contains a token that will | |
| 176 | + be used to notify a guest when missing page becomes | |
| 177 | + available. When page becomes available type 2 APF is sent with | |
| 178 | + cr2 set to the token associated with the page. There is special | |
| 179 | + kind of token 0xffffffff which tells vcpu that it should wake | |
| 180 | + up all processes waiting for APFs and no individual type 2 APFs | |
| 181 | + will be sent. | |
| 182 | + | |
| 183 | + If APF is disabled while there are outstanding APFs, they will | |
| 184 | + not be delivered. | |
| 185 | + | |
| 186 | + Currently type 2 APF will be always delivered on the same vcpu as | |
| 187 | + type 1 was, but guest should not rely on that. | |
| @@ -39,6 +39,9 @@ · 38 unmodified lines | ||
| 39 | 39 | #include <limits.h> |
| 40 | 40 | #include <stddef.h> |
| 41 | 41 | #include <signal.h> |
| 42 | +#include <pwd.h> | |
| 43 | +#include <grp.h> | |
| 44 | + | |
| 42 | 45 | #include <linux/virtio_config.h> |
| 43 | 46 | #include <linux/virtio_net.h> |
| 44 | 47 | #include <linux/virtio_blk.h> |
| @@ -298,20 +301,27 @@ static void *map_zeroed_pages(unsigned int num) · 253 unmodified lines | ||
| 298 | 301 | |
| 299 | 302 | /* |
| 300 | 303 | * We use a private mapping (ie. if we write to the page, it will be |
| 301 | − * copied). | |
| 304 | + * copied). We allocate an extra two pages PROT_NONE to act as guard | |
| 305 | + * pages against read/write attempts that exceed allocated space. | |
| 302 | 306 | */ |
| 303 | − addr = mmap(NULL, getpagesize() * num, | |
| 304 | − PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE, fd, 0); | |
| 307 | + addr = mmap(NULL, getpagesize() * (num+2), | |
| 308 | + PROT_NONE, MAP_PRIVATE, fd, 0); | |
| 309 | + | |
| 305 | 310 | if (addr == MAP_FAILED) |
| 306 | 311 | err(1, "Mmapping %u pages of /dev/zero", num); |
| 307 | 312 | |
| 313 | + if (mprotect(addr + getpagesize(), getpagesize() * num, | |
| 314 | + PROT_READ|PROT_WRITE) == -1) | |
| 315 | + err(1, "mprotect rw %u pages failed", num); | |
| 316 | + | |
| 308 | 317 | /* |
| 309 | 318 | * One neat mmap feature is that you can close the fd, and it |
| 310 | 319 | * stays mapped. |
| 311 | 320 | */ |
| 312 | 321 | close(fd); |
| 313 | 322 | |
| 314 | − return addr; | |
| 323 | + /* Return address after PROT_NONE page */ | |
| 324 | + return addr + getpagesize(); | |
| 315 | 325 | } |
| 316 | 326 | |
| 317 | 327 | /* Get some more pages for a device. */ |
| @@ -343,7 +353,7 @@ static void map_at(int fd, void *addr, unsigned long offset, unsigned long len) · 25 unmodified lines | ||
| 343 | 353 | * done to it. This allows us to share untouched memory between |
| 344 | 354 | * Guests. |
| 345 | 355 | */ |
| 346 | − if (mmap(addr, len, PROT_READ|PROT_WRITE|PROT_EXEC, | |
| 356 | + if (mmap(addr, len, PROT_READ|PROT_WRITE, | |
| 347 | 357 | MAP_FIXED|MAP_PRIVATE, fd, offset) != MAP_FAILED) |
| 348 | 358 | return; |
| 349 | 359 | |
| @@ -573,10 +583,10 @@ static void *_check_pointer(unsigned long addr, unsigned int size, · 223 unmodified lines | ||
| 573 | 583 | unsigned int line) |
| 574 | 584 | { |
| 575 | 585 | /* |
| 576 | − * We have to separately check addr and addr+size, because size could | |
| 577 | − * be huge and addr + size might wrap around. | |
| 586 | + * Check if the requested address and size exceeds the allocated memory, | |
| 587 | + * or addr + size wraps around. | |
| 578 | 588 | */ |
| 579 | − if (addr >= guest_limit || addr + size >= guest_limit) | |
| 589 | + if ((addr + size) > guest_limit || (addr + size) < addr) | |
| 580 | 590 | errx(1, "%s:%i: Invalid address %#lx", __FILE__, line, addr); |
| 581 | 591 | /* |
| 582 | 592 | * We return a pointer for the caller's convenience, now we know it's |
| @@ -1872,6 +1882,8 @@ static struct option opts[] = { · 1289 unmodified lines | ||
| 1872 | 1882 | { "block", 1, NULL, 'b' }, |
| 1873 | 1883 | { "rng", 0, NULL, 'r' }, |
| 1874 | 1884 | { "initrd", 1, NULL, 'i' }, |
| 1885 | + { "username", 1, NULL, 'u' }, | |
| 1886 | + { "chroot", 1, NULL, 'c' }, | |
| 1875 | 1887 | { NULL }, |
| 1876 | 1888 | }; |
| 1877 | 1889 | static void usage(void) |
| @@ -1894,6 +1906,12 @@ int main(int argc, char *argv[]) · 16 unmodified lines | ||
| 1894 | 1906 | /* If they specify an initrd file to load. */ |
| 1895 | 1907 | const char *initrd_name = NULL; |
| 1896 | 1908 | |
| 1909 | + /* Password structure for initgroups/setres[gu]id */ | |
| 1910 | + struct passwd *user_details = NULL; | |
| 1911 | + | |
| 1912 | + /* Directory to chroot to */ | |
| 1913 | + char *chroot_path = NULL; | |
| 1914 | + | |
| 1897 | 1915 | /* Save the args: we "reboot" by execing ourselves again. */ |
| 1898 | 1916 | main_args = argv; |
| 1899 | 1917 | |
| @@ -1950,6 +1968,14 @@ int main(int argc, char *argv[]) · 50 unmodified lines | ||
| 1950 | 1968 | case 'i': |
| 1951 | 1969 | initrd_name = optarg; |
| 1952 | 1970 | break; |
| 1971 | + case 'u': | |
| 1972 | + user_details = getpwnam(optarg); | |
| 1973 | + if (!user_details) | |
| 1974 | + err(1, "getpwnam failed, incorrect username?"); | |
| 1975 | + break; | |
| 1976 | + case 'c': | |
| 1977 | + chroot_path = optarg; | |
| 1978 | + break; | |
| 1953 | 1979 | default: |
| 1954 | 1980 | warnx("Unknown argument %s", argv[optind]); |
| 1955 | 1981 | usage(); |
| @@ -2021,6 +2047,37 @@ int main(int argc, char *argv[]) · 65 unmodified lines | ||
| 2021 | 2047 | /* If we exit via err(), this kills all the threads, restores tty. */ |
| 2022 | 2048 | atexit(cleanup_devices); |
| 2023 | 2049 | |
| 2050 | + /* If requested, chroot to a directory */ | |
| 2051 | + if (chroot_path) { | |
| 2052 | + if (chroot(chroot_path) != 0) | |
| 2053 | + err(1, "chroot(\"%s\") failed", chroot_path); | |
| 2054 | + | |
| 2055 | + if (chdir("/") != 0) | |
| 2056 | + err(1, "chdir(\"/\") failed"); | |
| 2057 | + | |
| 2058 | + verbose("chroot done\n"); | |
| 2059 | + } | |
| 2060 | + | |
| 2061 | + /* If requested, drop privileges */ | |
| 2062 | + if (user_details) { | |
| 2063 | + uid_t u; | |
| 2064 | + gid_t g; | |
| 2065 | + | |
| 2066 | + u = user_details->pw_uid; | |
| 2067 | + g = user_details->pw_gid; | |
| 2068 | + | |
| 2069 | + if (initgroups(user_details->pw_name, g) != 0) | |
| 2070 | + err(1, "initgroups failed"); | |
| 2071 | + | |
| 2072 | + if (setresgid(g, g, g) != 0) | |
| 2073 | + err(1, "setresgid failed"); | |
| 2074 | + | |
| 2075 | + if (setresuid(u, u, u) != 0) | |
| 2076 | + err(1, "setresuid failed"); | |
| 2077 | + | |
| 2078 | + verbose("Dropping privileges completed\n"); | |
| 2079 | + } | |
| 2080 | + | |
| 2024 | 2081 | /* Finally, run the Guest. This doesn't return. */ |
| 2025 | 2082 | run_guest(); |
| 2026 | 2083 | } |
| @@ -111,8 +111,16 @@ Running Lguest: · 110 unmodified lines | ||
| 111 | 111 | |
| 112 | 112 | Then use --tunnet=bridge:lg0 when launching the guest. |
| 113 | 113 | |
| 114 | − See http://linux-net.osdl.org/index.php/Bridge for general information | |
| 115 | − on how to get bridging working. | |
| 114 | + See: | |
| 115 | + | |
| 116 | + http://www.linuxfoundation.org/collaborate/workgroups/networking/bridge | |
| 117 | + | |
| 118 | + for general information on how to get bridging to work. | |
| 119 | + | |
| 120 | +- Random number generation. Using the --rng option will provide a | |
| 121 | + /dev/hwrng in the guest that will read from the host's /dev/random. | |
| 122 | + Use this option in conjunction with rng-tools (see ../hw_random.txt) | |
| 123 | + to provide entropy to the guest kernel's /dev/random. | |
| 116 | 124 | |
| 117 | 125 | There is a helpful mailing list at http://ozlabs.org/mailman/listinfo/lguest |
| 118 | 126 | |
| @@ -150,7 +150,7 @@ NBD_REPLY_MAGIC 0x96744668 nbd_reply include/linux/nbd.h · 149 unmodified lines | ||
| 150 | 150 | STL_BOARDMAGIC 0xa2267f52 stlbrd include/linux/stallion.h |
| 151 | 151 | ENI155_MAGIC 0xa54b872d midway_eprom drivers/atm/eni.h |
| 152 | 152 | SCI_MAGIC 0xbabeface gs_port drivers/char/sh-sci.h |
| 153 | −CODA_MAGIC 0xC0DAC0DA coda_file_info include/linux/coda_fs_i.h | |
| 153 | +CODA_MAGIC 0xC0DAC0DA coda_file_info fs/coda/coda_fs_i.h | |
| 154 | 154 | DPMEM_MAGIC 0xc0ffee11 gdt_pci_sram drivers/scsi/gdth.h |
| 155 | 155 | STLI_PORTMAGIC 0xe671c7a1 stliport include/linux/istallion.h |
| 156 | 156 | YAM_MAGIC 0xF10A7654 yam_port drivers/net/hamradio/yam.c |
| @@ -39,8 +39,9 @@ INSTALL_HDR_PATH indicates where to install the headers. It defaults to · 38 unmodified lines | ||
| 39 | 39 | The command "make headers_install_all" exports headers for all architectures |
| 40 | 40 | simultaneously. (This is mostly of interest to distribution maintainers, |
| 41 | 41 | who create an architecture-independent tarball from the resulting include |
| 42 | −directory.) Remember to provide the appropriate linux/asm directory via "mv" | |
| 43 | −or "ln -s" before building a C library with headers exported this way. | |
| 42 | +directory.) You also can use HDR_ARCH_LIST to specify list of architectures. | |
| 43 | +Remember to provide the appropriate linux/asm directory via "mv" or "ln -s" | |
| 44 | +before building a C library with headers exported this way. | |
| 44 | 45 | |
| 45 | 46 | The kernel header export infrastructure is maintained by David Woodhouse |
| 46 | 47 | <dwmw2@infradead.org>. |
| @@ -0,0 +1,327 @@ | ||
| 1 | +Copyright (c) 2009-2010 QLogic Corporation | |
| 2 | +QLogic Linux qlcnic NIC Driver | |
| 3 | + | |
| 4 | +This program includes a device driver for Linux 2.6 that may be | |
| 5 | +distributed with QLogic hardware specific firmware binary file. | |
| 6 | +You may modify and redistribute the device driver code under the | |
| 7 | +GNU General Public License (a copy of which is attached hereto as | |
| 8 | +Exhibit A) published by the Free Software Foundation (version 2). | |
| 9 | + | |
| 10 | +You may redistribute the hardware specific firmware binary file | |
| 11 | +under the following terms: | |
| 12 | + | |
| 13 | + 1. Redistribution of source code (only if applicable), | |
| 14 | + must retain the above copyright notice, this list of | |
| 15 | + conditions and the following disclaimer. | |
| 16 | + | |
| 17 | + 2. Redistribution in binary form must reproduce the above | |
| 18 | + copyright notice, this list of conditions and the | |
| 19 | + following disclaimer in the documentation and/or other | |
| 20 | + materials provided with the distribution. | |
| 21 | + | |
| 22 | + 3. The name of QLogic Corporation may not be used to | |
| 23 | + endorse or promote products derived from this software | |
| 24 | + without specific prior written permission | |
| 25 | + | |
| 26 | +REGARDLESS OF WHAT LICENSING MECHANISM IS USED OR APPLICABLE, | |
| 27 | +THIS PROGRAM IS PROVIDED BY QLOGIC CORPORATION "AS IS'' AND ANY | |
| 28 | +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
| 29 | +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A | |
| 30 | +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR | |
| 31 | +BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | |
| 32 | +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED | |
| 33 | +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | |
| 34 | +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | |
| 35 | +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |
| 36 | +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | |
| 37 | +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | |
| 38 | +POSSIBILITY OF SUCH DAMAGE. | |
| 39 | + | |
| 40 | +USER ACKNOWLEDGES AND AGREES THAT USE OF THIS PROGRAM WILL NOT | |
| 41 | +CREATE OR GIVE GROUNDS FOR A LICENSE BY IMPLICATION, ESTOPPEL, OR | |
| 42 | +OTHERWISE IN ANY INTELLECTUAL PROPERTY RIGHTS (PATENT, COPYRIGHT, | |
| 43 | +TRADE SECRET, MASK WORK, OR OTHER PROPRIETARY RIGHT) EMBODIED IN | |
| 44 | +ANY OTHER QLOGIC HARDWARE OR SOFTWARE EITHER SOLELY OR IN | |
| 45 | +COMBINATION WITH THIS PROGRAM. | |
| 46 | + | |
| 47 | + | |
| 48 | +EXHIBIT A | |
| 49 | + | |
| 50 | + GNU GENERAL PUBLIC LICENSE | |
| 51 | + Version 2, June 1991 | |
| 52 | + | |
| 53 | + Copyright (C) 1989, 1991 Free Software Foundation, Inc. | |
| 54 | + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |
| 55 | + Everyone is permitted to copy and distribute verbatim copies | |
| 56 | + of this license document, but changing it is not allowed. | |
| 57 | + | |
| 58 | + Preamble | |
| 59 | + | |
| 60 | + The licenses for most software are designed to take away your | |
| 61 | +freedom to share and change it. By contrast, the GNU General Public | |
| 62 | +License is intended to guarantee your freedom to share and change free | |
| 63 | +software--to make sure the software is free for all its users. This | |
| 64 | +General Public License applies to most of the Free Software | |
| 65 | +Foundation's software and to any other program whose authors commit to | |
| 66 | +using it. (Some other Free Software Foundation software is covered by | |
| 67 | +the GNU Lesser General Public License instead.) You can apply it to | |
| 68 | +your programs, too. | |
| 69 | + | |
| 70 | + When we speak of free software, we are referring to freedom, not | |
| 71 | +price. Our General Public Licenses are designed to make sure that you | |
| 72 | +have the freedom to distribute copies of free software (and charge for | |
| 73 | +this service if you wish), that you receive source code or can get it | |
| 74 | +if you want it, that you can change the software or use pieces of it | |
| 75 | +in new free programs; and that you know you can do these things. | |
| 76 | + | |
| 77 | + To protect your rights, we need to make restrictions that forbid | |
| 78 | +anyone to deny you these rights or to ask you to surrender the rights. | |
| 79 | +These restrictions translate to certain responsibilities for you if you | |
| 80 | +distribute copies of the software, or if you modify it. | |
| 81 | + | |
| 82 | + For example, if you distribute copies of such a program, whether | |
| 83 | +gratis or for a fee, you must give the recipients all the rights that | |
| 84 | +you have. You must make sure that they, too, receive or can get the | |
| 85 | +source code. And you must show them these terms so they know their | |
| 86 | +rights. | |
| 87 | + | |
| 88 | + We protect your rights with two steps: (1) copyright the software, and | |
| 89 | +(2) offer you this license which gives you legal permission to copy, | |
| 90 | +distribute and/or modify the software. | |
| 91 | + | |
| 92 | + Also, for each author's protection and ours, we want to make certain | |
| 93 | +that everyone understands that there is no warranty for this free | |
| 94 | +software. If the software is modified by someone else and passed on, we | |
| 95 | +want its recipients to know that what they have is not the original, so | |
| 96 | +that any problems introduced by others will not reflect on the original | |
| 97 | +authors' reputations. | |
| 98 | + | |
| 99 | + Finally, any free program is threatened constantly by software | |
| 100 | +patents. We wish to avoid the danger that redistributors of a free | |
| 101 | +program will individually obtain patent licenses, in effect making the | |
| 102 | +program proprietary. To prevent this, we have made it clear that any | |
| 103 | +patent must be licensed for everyone's free use or not licensed at all. | |
| 104 | + | |
| 105 | + The precise terms and conditions for copying, distribution and | |
| 106 | +modification follow. | |
| 107 | + | |
| 108 | + GNU GENERAL PUBLIC LICENSE | |
| 109 | + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION | |
| 110 | + | |
| 111 | + 0. This License applies to any program or other work which contains | |
| 112 | +a notice placed by the copyright holder saying it may be distributed | |
| 113 | +under the terms of this General Public License. The "Program", below, | |
| 114 | +refers to any such program or work, and a "work based on the Program" | |
| 115 | +means either the Program or any derivative work under copyright law: | |
| 116 | +that is to say, a work containing the Program or a portion of it, | |
| 117 | +either verbatim or with modifications and/or translated into another | |
| 118 | +language. (Hereinafter, translation is included without limitation in | |
| 119 | +the term "modification".) Each licensee is addressed as "you". | |
| 120 | + | |
| 121 | +Activities other than copying, distribution and modification are not | |
| 122 | +covered by this License; they are outside its scope. The act of | |
| 123 | +running the Program is not restricted, and the output from the Program | |
| 124 | +is covered only if its contents constitute a work based on the | |
| 125 | +Program (independent of having been made by running the Program). | |
| 126 | +Whether that is true depends on what the Program does. | |
| 127 | + | |
| 128 | + 1. You may copy and distribute verbatim copies of the Program's | |
| 129 | +source code as you receive it, in any medium, provided that you | |
| 130 | +conspicuously and appropriately publish on each copy an appropriate | |
| 131 | +copyright notice and disclaimer of warranty; keep intact all the | |
| 132 | +notices that refer to this License and to the absence of any warranty; | |
| 133 | +and give any other recipients of the Program a copy of this License | |
| 134 | +along with the Program. | |
| 135 | + | |
| 136 | +You may charge a fee for the physical act of transferring a copy, and | |
| 137 | +you may at your option offer warranty protection in exchange for a fee. | |
| 138 | + | |
| 139 | + 2. You may modify your copy or copies of the Program or any portion | |
| 140 | +of it, thus forming a work based on the Program, and copy and | |
| 141 | +distribute such modifications or work under the terms of Section 1 | |
| 142 | +above, provided that you also meet all of these conditions: | |
| 143 | + | |
| 144 | + a) You must cause the modified files to carry prominent notices | |
| 145 | + stating that you changed the files and the date of any change. | |
| 146 | + | |
| 147 | + b) You must cause any work that you distribute or publish, that in | |
| 148 | + whole or in part contains or is derived from the Program or any | |
| 149 | + part thereof, to be licensed as a whole at no charge to all third | |
| 150 | + parties under the terms of this License. | |
| 151 | + | |
| 152 | + c) If the modified program normally reads commands interactively | |
| 153 | + when run, you must cause it, when started running for such | |
| 154 | + interactive use in the most ordinary way, to print or display an | |
| 155 | + announcement including an appropriate copyright notice and a | |
| 156 | + notice that there is no warranty (or else, saying that you provide | |
| 157 | + a warranty) and that users may redistribute the program under | |
| 158 | + these conditions, and telling the user how to view a copy of this | |
| 159 | + License. (Exception: if the Program itself is interactive but | |
| 160 | + does not normally print such an announcement, your work based on | |
| 161 | + the Program is not required to print an announcement.) | |
| 162 | + | |
| 163 | +These requirements apply to the modified work as a whole. If | |
| 164 | +identifiable sections of that work are not derived from the Program, | |
| 165 | +and can be reasonably considered independent and separate works in | |
| 166 | +themselves, then this License, and its terms, do not apply to those | |
| 167 | +sections when you distribute them as separate works. But when you | |
| 168 | +distribute the same sections as part of a whole which is a work based | |
| 169 | +on the Program, the distribution of the whole must be on the terms of | |
| 170 | +this License, whose permissions for other licensees extend to the | |
| 171 | +entire whole, and thus to each and every part regardless of who wrote it. | |
| 172 | + | |
| 173 | +Thus, it is not the intent of this section to claim rights or contest | |
| 174 | +your rights to work written entirely by you; rather, the intent is to | |
| 175 | +exercise the right to control the distribution of derivative or | |
| 176 | +collective works based on the Program. | |
| 177 | + | |
| 178 | +In addition, mere aggregation of another work not based on the Program | |
| 179 | +with the Program (or with a work based on the Program) on a volume of | |
| 180 | +a storage or distribution medium does not bring the other work under | |
| 181 | +the scope of this License. | |
| 182 | + | |
| 183 | + 3. You may copy and distribute the Program (or a work based on it, | |
| 184 | +under Section 2) in object code or executable form under the terms of | |
| 185 | +Sections 1 and 2 above provided that you also do one of the following: | |
| 186 | + | |
| 187 | + a) Accompany it with the complete corresponding machine-readable | |
| 188 | + source code, which must be distributed under the terms of Sections | |
| 189 | + 1 and 2 above on a medium customarily used for software interchange; or, | |
| 190 | + | |
| 191 | + b) Accompany it with a written offer, valid for at least three | |
| 192 | + years, to give any third party, for a charge no more than your | |
| 193 | + cost of physically performing source distribution, a complete | |
| 194 | + machine-readable copy of the corresponding source code, to be | |
| 195 | + distributed under the terms of Sections 1 and 2 above on a medium | |
| 196 | + customarily used for software interchange; or, | |
| 197 | + | |
| 198 | + c) Accompany it with the information you received as to the offer | |
| 199 | + to distribute corresponding source code. (This alternative is | |
| 200 | + allowed only for noncommercial distribution and only if you | |
| 201 | + received the program in object code or executable form with such | |
| 202 | + an offer, in accord with Subsection b above.) | |
| 203 | + | |
| 204 | +The source code for a work means the preferred form of the work for | |
| 205 | +making modifications to it. For an executable work, complete source | |
| 206 | +code means all the source code for all modules it contains, plus any | |
| 207 | +associated interface definition files, plus the scripts used to | |
| 208 | +control compilation and installation of the executable. However, as a | |
| 209 | +special exception, the source code distributed need not include | |
| 210 | +anything that is normally distributed (in either source or binary | |
| 211 | +form) with the major components (compiler, kernel, and so on) of the | |
| 212 | +operating system on which the executable runs, unless that component | |
| 213 | +itself accompanies the executable. | |
| 214 | + | |
| 215 | +If distribution of executable or object code is made by offering | |
| 216 | +access to copy from a designated place, then offering equivalent | |
| 217 | +access to copy the source code from the same place counts as | |
| 218 | +distribution of the source code, even though third parties are not | |
| 219 | +compelled to copy the source along with the object code. | |
| 220 | + | |
| 221 | + 4. You may not copy, modify, sublicense, or distribute the Program | |
| 222 | +except as expressly provided under this License. Any attempt | |
| 223 | +otherwise to copy, modify, sublicense or distribute the Program is | |
| 224 | +void, and will automatically terminate your rights under this License. | |
| 225 | +However, parties who have received copies, or rights, from you under | |
| 226 | +this License will not have their licenses terminated so long as such | |
| 227 | +parties remain in full compliance. | |
| 228 | + | |
| 229 | + 5. You are not required to accept this License, since you have not | |
| 230 | +signed it. However, nothing else grants you permission to modify or | |
| 231 | +distribute the Program or its derivative works. These actions are | |
| 232 | +prohibited by law if you do not accept this License. Therefore, by | |
| 233 | +modifying or distributing the Program (or any work based on the | |
| 234 | +Program), you indicate your acceptance of this License to do so, and | |
| 235 | +all its terms and conditions for copying, distributing or modifying | |
| 236 | +the Program or works based on it. | |
| 237 | + | |
| 238 | + 6. Each time you redistribute the Program (or any work based on the | |
| 239 | +Program), the recipient automatically receives a license from the | |
| 240 | +original licensor to copy, distribute or modify the Program subject to | |
| 241 | +these terms and conditions. You may not impose any further | |
| 242 | +restrictions on the recipients' exercise of the rights granted herein. | |
| 243 | +You are not responsible for enforcing compliance by third parties to | |
| 244 | +this License. | |
| 245 | + | |
| 246 | + 7. If, as a consequence of a court judgment or allegation of patent | |
| 247 | +infringement or for any other reason (not limited to patent issues), | |
| 248 | +conditions are imposed on you (whether by court order, agreement or | |
| 249 | +otherwise) that contradict the conditions of this License, they do not | |
| 250 | +excuse you from the conditions of this License. If you cannot | |
| 251 | +distribute so as to satisfy simultaneously your obligations under this | |
| 252 | +License and any other pertinent obligations, then as a consequence you | |
| 253 | +may not distribute the Program at all. For example, if a patent | |
| 254 | +license would not permit royalty-free redistribution of the Program by | |
| 255 | +all those who receive copies directly or indirectly through you, then | |
| 256 | +the only way you could satisfy both it and this License would be to | |
| 257 | +refrain entirely from distribution of the Program. | |
| 258 | + | |
| 259 | +If any portion of this section is held invalid or unenforceable under | |
| 260 | +any particular circumstance, the balance of the section is intended to | |
| 261 | +apply and the section as a whole is intended to apply in other | |
| 262 | +circumstances. | |
| 263 | + | |
| 264 | +It is not the purpose of this section to induce you to infringe any | |
| 265 | +patents or other property right claims or to contest validity of any | |
| 266 | +such claims; this section has the sole purpose of protecting the | |
| 267 | +integrity of the free software distribution system, which is | |
| 268 | +implemented by public license practices. Many people have made | |
| 269 | +generous contributions to the wide range of software distributed | |
| 270 | +through that system in reliance on consistent application of that | |
| 271 | +system; it is up to the author/donor to decide if he or she is willing | |
| 272 | +to distribute software through any other system and a licensee cannot | |
| 273 | +impose that choice. | |
| 274 | + | |
| 275 | +This section is intended to make thoroughly clear what is believed to | |
| 276 | +be a consequence of the rest of this License. | |
| 277 | + | |
| 278 | + 8. If the distribution and/or use of the Program is restricted in | |
| 279 | +certain countries either by patents or by copyrighted interfaces, the | |
| 280 | +original copyright holder who places the Program under this License | |
| 281 | +may add an explicit geographical distribution limitation excluding | |
| 282 | +those countries, so that distribution is permitted only in or among | |
| 283 | +countries not thus excluded. In such case, this License incorporates | |
| 284 | +the limitation as if written in the body of this License. | |
| 285 | + | |
| 286 | + 9. The Free Software Foundation may publish revised and/or new versions | |
| 287 | +of the General Public License from time to time. Such new versions will | |
| 288 | +be similar in spirit to the present version, but may differ in detail to | |
| 289 | +address new problems or concerns. | |
| 290 | + | |
| 291 | +Each version is given a distinguishing version number. If the Program | |
| 292 | +specifies a version number of this License which applies to it and "any | |
| 293 | +later version", you have the option of following the terms and conditions | |
| 294 | +either of that version or of any later version published by the Free | |
| 295 | +Software Foundation. If the Program does not specify a version number of | |
| 296 | +this License, you may choose any version ever published by the Free Software | |
| 297 | +Foundation. | |
| 298 | + | |
| 299 | + 10. If you wish to incorporate parts of the Program into other free | |
| 300 | +programs whose distribution conditions are different, write to the author | |
| 301 | +to ask for permission. For software which is copyrighted by the Free | |
| 302 | +Software Foundation, write to the Free Software Foundation; we sometimes | |
| 303 | +make exceptions for this. Our decision will be guided by the two goals | |
| 304 | +of preserving the free status of all derivatives of our free software and | |
| 305 | +of promoting the sharing and reuse of software generally. | |
| 306 | + | |
| 307 | + NO WARRANTY | |
| 308 | + | |
| 309 | + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY | |
| 310 | +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN | |
| 311 | +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES | |
| 312 | +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED | |
| 313 | +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | |
| 314 | +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS | |
| 315 | +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE | |
| 316 | +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, | |
| 317 | +REPAIR OR CORRECTION. | |
| 318 | + | |
| 319 | + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING | |
| 320 | +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR | |
| 321 | +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, | |
| 322 | +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING | |
| 323 | +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED | |
| 324 | +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY | |
| 325 | +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER | |
| 326 | +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE | |
| 327 | +POSSIBILITY OF SUCH DAMAGES. | |
| @@ -4,6 +4,8 @@ obj- := dummy.o · 3 unmodified lines | ||
| 4 | 4 | # List of programs to build |
| 5 | 5 | hostprogs-y := ifenslave |
| 6 | 6 | |
| 7 | +HOSTCFLAGS_ifenslave.o += -I$(objtree)/usr/include | |
| 8 | + | |
| 7 | 9 | # Tell kbuild to always build the programs |
| 8 | 10 | always := $(hostprogs-y) |
| 9 | 11 | |
| @@ -1,4 +1,4 @@ | ||
| 1 | −[state: 04-09-2010] | |
| 1 | +[state: 21-11-2010] | |
| 2 | 2 | |
| 3 | 3 | BATMAN-ADV |
| 4 | 4 | ---------- |
| @@ -67,7 +67,8 @@ All mesh wide settings can be found in batman's own interface · 62 unmodified lines | ||
| 67 | 67 | folder: |
| 68 | 68 | |
| 69 | 69 | # ls /sys/class/net/bat0/mesh/ |
| 70 | −# aggregated_ogms bonding orig_interval vis_mode | |
| 70 | +# aggregated_ogms bonding fragmentation orig_interval | |
| 71 | +# vis_mode | |
| 71 | 72 | |
| 72 | 73 | |
| 73 | 74 | There is a special folder for debugging informations: |
| @@ -237,4 +238,3 @@ You can also contact the Authors: · 163 unmodified lines | ||
| 237 | 238 | |
| 238 | 239 | Marek Lindner <lindner_marek@yahoo.de> |
| 239 | 240 | Simon Wunderlich <siwu@hrz.tu-chemnitz.de> |
| 240 | − | |
| @@ -49,7 +49,8 @@ Table of Contents · 48 unmodified lines | ||
| 49 | 49 | 3.3 Configuring Bonding Manually with Ifenslave |
| 50 | 50 | 3.3.1 Configuring Multiple Bonds Manually |
| 51 | 51 | 3.4 Configuring Bonding Manually via Sysfs |
| 52 | −3.5 Overriding Configuration for Special Cases | |
| 52 | +3.5 Configuration with Interfaces Support | |
| 53 | +3.6 Overriding Configuration for Special Cases | |
| 53 | 54 | |
| 54 | 55 | 4. Querying Bonding Configuration |
| 55 | 56 | 4.1 Bonding Configuration |
| @@ -161,8 +162,8 @@ onwards) do not have /usr/include/linux symbolically linked to the · 105 unmodified lines | ||
| 161 | 162 | default kernel source include directory. |
| 162 | 163 | |
| 163 | 164 | SECOND IMPORTANT NOTE: |
| 164 | − If you plan to configure bonding using sysfs, you do not need | |
| 165 | −to use ifenslave. | |
| 165 | + If you plan to configure bonding using sysfs or using the | |
| 166 | +/etc/network/interfaces file, you do not need to use ifenslave. | |
| 166 | 167 | |
| 167 | 168 | 2. Bonding Driver Options |
| 168 | 169 | ========================= |
| @@ -779,22 +780,26 @@ resend_igmp · 610 unmodified lines | ||
| 779 | 780 | |
| 780 | 781 | You can configure bonding using either your distro's network |
| 781 | 782 | initialization scripts, or manually using either ifenslave or the |
| 782 | −sysfs interface. Distros generally use one of two packages for the | |
| 783 | −network initialization scripts: initscripts or sysconfig. Recent | |
| 784 | −versions of these packages have support for bonding, while older | |
| 783 | +sysfs interface. Distros generally use one of three packages for the | |
| 784 | +network initialization scripts: initscripts, sysconfig or interfaces. | |
| 785 | +Recent versions of these packages have support for bonding, while older | |
| 785 | 786 | versions do not. |
| 786 | 787 | |
| 787 | 788 | We will first describe the options for configuring bonding for |
| 788 | −distros using versions of initscripts and sysconfig with full or | |
| 789 | −partial support for bonding, then provide information on enabling | |
| 789 | +distros using versions of initscripts, sysconfig and interfaces with full | |
| 790 | +or partial support for bonding, then provide information on enabling | |
| 790 | 791 | bonding without support from the network initialization scripts (i.e., |
| 791 | 792 | older versions of initscripts or sysconfig). |
| 792 | 793 | |
| 793 | − If you're unsure whether your distro uses sysconfig or | |
| 794 | −initscripts, or don't know if it's new enough, have no fear. | |
| 794 | + If you're unsure whether your distro uses sysconfig, | |
| 795 | +initscripts or interfaces, or don't know if it's new enough, have no fear. | |
| 795 | 796 | Determining this is fairly straightforward. |
| 796 | 797 | |
| 797 | − First, issue the command: | |
| 798 | + First, look for a file called interfaces in /etc/network directory. | |
| 799 | +If this file is present in your system, then your system use interfaces. See | |
| 800 | +Configuration with Interfaces Support. | |
| 801 | + | |
| 802 | + Else, issue the command: | |
| 798 | 803 | |
| 799 | 804 | $ rpm -qf /sbin/ifup |
| 800 | 805 | |
| @@ -1327,8 +1332,62 @@ echo 2000 > /sys/class/net/bond1/bonding/arp_interval · 526 unmodified lines | ||
| 1327 | 1332 | echo +eth2 > /sys/class/net/bond1/bonding/slaves |
| 1328 | 1333 | echo +eth3 > /sys/class/net/bond1/bonding/slaves |
| 1329 | 1334 | |
| 1330 | −3.5 Overriding Configuration for Special Cases | |
| 1335 | +3.5 Configuration with Interfaces Support | |
| 1336 | +----------------------------------------- | |
| 1337 | + | |
| 1338 | + This section applies to distros which use /etc/network/interfaces file | |
| 1339 | +to describe network interface configuration, most notably Debian and it's | |
| 1340 | +derivatives. | |
| 1341 | + | |
| 1342 | + The ifup and ifdown commands on Debian don't support bonding out of | |
| 1343 | +the box. The ifenslave-2.6 package should be installed to provide bonding | |
| 1344 | +support. Once installed, this package will provide bond-* options to be used | |
| 1345 | +into /etc/network/interfaces. | |
| 1346 | + | |
| 1347 | + Note that ifenslave-2.6 package will load the bonding module and use | |
| 1348 | +the ifenslave command when appropriate. | |
| 1349 | + | |
| 1350 | +Example Configurations | |
| 1351 | +---------------------- | |
| 1352 | + | |
| 1353 | +In /etc/network/interfaces, the following stanza will configure bond0, in | |
| 1354 | +active-backup mode, with eth0 and eth1 as slaves. | |
| 1355 | + | |
| 1356 | +auto bond0 | |
| 1357 | +iface bond0 inet dhcp | |
| 1358 | + bond-slaves eth0 eth1 | |
| 1359 | + bond-mode active-backup | |
| 1360 | + bond-miimon 100 | |
| 1361 | + bond-primary eth0 eth1 | |
| 1362 | + | |
| 1363 | +If the above configuration doesn't work, you might have a system using | |
| 1364 | +upstart for system startup. This is most notably true for recent | |
| 1365 | +Ubuntu versions. The following stanza in /etc/network/interfaces will | |
| 1366 | +produce the same result on those systems. | |
| 1367 | + | |
| 1368 | +auto bond0 | |
| 1369 | +iface bond0 inet dhcp | |
| 1370 | + bond-slaves none | |
| 1371 | + bond-mode active-backup | |
| 1372 | + bond-miimon 100 | |
| 1373 | + | |
| 1374 | +auto eth0 | |
| 1375 | +iface eth0 inet manual | |
| 1376 | + bond-master bond0 | |
| 1377 | + bond-primary eth0 eth1 | |
| 1378 | + | |
| 1379 | +auto eth1 | |
| 1380 | +iface eth1 inet manual | |
| 1381 | + bond-master bond0 | |
| 1382 | + bond-primary eth0 eth1 | |
| 1383 | + | |
| 1384 | +For a full list of bond-* supported options in /etc/network/interfaces and some | |
| 1385 | +more advanced examples tailored to you particular distros, see the files in | |
| 1386 | +/usr/share/doc/ifenslave-2.6. | |
| 1387 | + | |
| 1388 | +3.6 Overriding Configuration for Special Cases | |
| 1331 | 1389 | ---------------------------------------------- |
| 1390 | + | |
| 1332 | 1391 | When using the bonding driver, the physical port which transmits a frame is |
| 1333 | 1392 | typically selected by the bonding driver, and is not relevant to the user or |
| 1334 | 1393 | system administrator. The output port is simply selected using the policies of |
| @@ -1,8 +1,8 @@ | ||
| 1 | 1 | In order to use the Ethernet bridging functionality, you'll need the |
| 2 | 2 | userspace tools. These programs and documentation are available |
| 3 | −at http://www.linux-foundation.org/en/Net:Bridge. The download page is | |
| 3 | +at http://www.linuxfoundation.org/en/Net:Bridge. The download page is | |
| 4 | 4 | http://prdownloads.sourceforge.net/bridge. |
| 5 | 5 | |
| 6 | 6 | If you still have questions, don't hesitate to post to the mailing list |
| 7 | −(more info http://lists.osdl.org/mailman/listinfo/bridge). | |
| 7 | +(more info https://lists.linux-foundation.org/mailman/listinfo/bridge). | |
| 8 | 8 | |
| @@ -32,7 +32,7 @@ the physical hardware, both with regard to SPI and to GPIOs. · 31 unmodified lines | ||
| 32 | 32 | This function is called by the CAIF SPI interface to give |
| 33 | 33 | you a chance to set up your hardware to be ready to receive |
| 34 | 34 | a stream of data from the master. The xfer structure contains |
| 35 | − both physical and logical adresses, as well as the total length | |
| 35 | + both physical and logical addresses, as well as the total length | |
| 36 | 36 | of the transfer in both directions.The dev parameter can be used |
| 37 | 37 | to map to different CAIF SPI slave devices. |
| 38 | 38 | |
| @@ -38,15 +38,35 @@ The Linux DCCP implementation does not currently support all the features that a · 37 unmodified lines | ||
| 38 | 38 | specified in RFCs 4340...42. |
| 39 | 39 | |
| 40 | 40 | The known bugs are at: |
| 41 | − http://linux-net.osdl.org/index.php/TODO#DCCP | |
| 41 | + http://www.linuxfoundation.org/collaborate/workgroups/networking/todo#DCCP | |
| 42 | 42 | |
| 43 | 43 | For more up-to-date versions of the DCCP implementation, please consider using |
| 44 | 44 | the experimental DCCP test tree; instructions for checking this out are on: |
| 45 | −http://linux-net.osdl.org/index.php/DCCP_Testing#Experimental_DCCP_source_tree | |
| 45 | +http://www.linuxfoundation.org/collaborate/workgroups/networking/dccp_testing#Experimental_DCCP_source_tree | |
| 46 | 46 | |
| 47 | 47 | |
| 48 | 48 | Socket options |
| 49 | 49 | ============== |
| 50 | +DCCP_SOCKOPT_QPOLICY_ID sets the dequeuing policy for outgoing packets. It takes | |
| 51 | +a policy ID as argument and can only be set before the connection (i.e. changes | |
| 52 | +during an established connection are not supported). Currently, two policies are | |
| 53 | +defined: the "simple" policy (DCCPQ_POLICY_SIMPLE), which does nothing special, | |
| 54 | +and a priority-based variant (DCCPQ_POLICY_PRIO). The latter allows to pass an | |
| 55 | +u32 priority value as ancillary data to sendmsg(), where higher numbers indicate | |
| 56 | +a higher packet priority (similar to SO_PRIORITY). This ancillary data needs to | |
| 57 | +be formatted using a cmsg(3) message header filled in as follows: | |
| 58 | + cmsg->cmsg_level = SOL_DCCP; | |
| 59 | + cmsg->cmsg_type = DCCP_SCM_PRIORITY; | |
| 60 | + cmsg->cmsg_len = CMSG_LEN(sizeof(uint32_t)); /* or CMSG_LEN(4) */ | |
| 61 | + | |
| 62 | +DCCP_SOCKOPT_QPOLICY_TXQLEN sets the maximum length of the output queue. A zero | |
| 63 | +value is always interpreted as unbounded queue length. If different from zero, | |
| 64 | +the interpretation of this parameter depends on the current dequeuing policy | |
| 65 | +(see above): the "simple" policy will enforce a fixed queue size by returning | |
| 66 | +EAGAIN, whereas the "prio" policy enforces a fixed queue length by dropping the | |
| 67 | +lowest-priority packet first. The default value for this parameter is | |
| 68 | +initialised from /proc/sys/net/dccp/default/tx_qlen. | |
| 69 | + | |
| 50 | 70 | DCCP_SOCKOPT_SERVICE sets the service. The specification mandates use of |
| 51 | 71 | service codes (RFC 4340, sec. 8.1.2); if this socket option is not set, |
| 52 | 72 | the socket will fall back to 0 (which means that no meaningful service code |
| @@ -147,6 +167,7 @@ rx_ccid = 2 · 94 unmodified lines | ||
| 147 | 167 | seq_window = 100 |
| 148 | 168 | The initial sequence window (sec. 7.5.2) of the sender. This influences |
| 149 | 169 | the local ackno validity and the remote seqno validity windows (7.5.1). |
| 170 | + Values in the range Wmin = 32 (RFC 4340, 7.5.2) up to 2^32-1 can be set. | |
| 150 | 171 | |
| 151 | 172 | tx_qlen = 5 |
| 152 | 173 | The size of the transmit buffer in packets. A value of 0 corresponds |
| @@ -72,7 +72,7 @@ Tx Descriptors: Number of transmit descriptors. A transmit descriptor is a data · 71 unmodified lines | ||
| 72 | 72 | ethtool -G eth? tx n, where n is the number of desired tx descriptors. |
| 73 | 73 | |
| 74 | 74 | Speed/Duplex: The driver auto-negotiates the link speed and duplex settings by |
| 75 | − default. Ethtool can be used as follows to force speed/duplex. | |
| 75 | + default. The ethtool utility can be used as follows to force speed/duplex. | |
| 76 | 76 | |
| 77 | 77 | ethtool -s eth? autoneg off speed {10|100} duplex {full|half} |
| 78 | 78 | |
| @@ -126,30 +126,21 @@ Additional Configurations · 47 unmodified lines | ||
| 126 | 126 | ------- |
| 127 | 127 | |
| 128 | 128 | The driver utilizes the ethtool interface for driver configuration and |
| 129 | − diagnostics, as well as displaying statistical information. Ethtool | |
| 129 | + diagnostics, as well as displaying statistical information. The ethtool | |
| 130 | 130 | version 1.6 or later is required for this functionality. |
| 131 | 131 | |
| 132 | 132 | The latest release of ethtool can be found from |
| 133 | − http://sourceforge.net/projects/gkernel. | |
| 134 | − | |
| 135 | − NOTE: Ethtool 1.6 only supports a limited set of ethtool options. Support | |
| 136 | − for a more complete ethtool feature set can be enabled by upgrading | |
| 137 | − ethtool to ethtool-1.8.1. | |
| 138 | − | |
| 133 | + http://ftp.kernel.org/pub/software/network/ethtool/ | |
| 139 | 134 | |
| 140 | 135 | Enabling Wake on LAN* (WoL) |
| 141 | 136 | --------------------------- |
| 142 | − WoL is provided through the Ethtool* utility. Ethtool is included with Red | |
| 143 | − Hat* 8.0. For other Linux distributions, download and install Ethtool from | |
| 144 | − the following website: http://sourceforge.net/projects/gkernel. | |
| 145 | − | |
| 146 | − For instructions on enabling WoL with Ethtool, refer to the Ethtool man page. | |
| 137 | + WoL is provided through the ethtool* utility. For instructions on enabling | |
| 138 | + WoL with ethtool, refer to the ethtool man page. | |
| 147 | 139 | |
| 148 | 140 | WoL will be enabled on the system during the next shut down or reboot. For |
| 149 | 141 | this driver version, in order to enable WoL, the e100 driver must be |
| 150 | 142 | loaded when shutting down or rebooting the system. |
| 151 | 143 | |
| 152 | − | |
| 153 | 144 | NAPI |
| 154 | 145 | ---- |
| 155 | 146 | |
| @@ -79,7 +79,7 @@ InterruptThrottleRate · 78 unmodified lines | ||
| 79 | 79 | --------------------- |
| 80 | 80 | (not supported on Intel(R) 82542, 82543 or 82544-based adapters) |
| 81 | 81 | Valid Range: 0,1,3,4,100-100000 (0=off, 1=dynamic, 3=dynamic conservative, |
| 82 | − 4=simplified balancing) | |
| 82 | + 4=simplified balancing) | |
| 83 | 83 | Default Value: 3 |
| 84 | 84 | |
| 85 | 85 | The driver can limit the amount of interrupts per second that the adapter |
| @@ -124,8 +124,8 @@ InterruptThrottleRate is set to mode 1. In this mode, which operates · 38 unmodified lines | ||
| 124 | 124 | the same as mode 3, the InterruptThrottleRate will be increased stepwise to |
| 125 | 125 | 70000 for traffic in class "Lowest latency". |
| 126 | 126 | |
| 127 | −In simplified mode the interrupt rate is based on the ratio of Tx and | |
| 128 | −Rx traffic. If the bytes per second rate is approximately equal, the | |
| 127 | +In simplified mode the interrupt rate is based on the ratio of TX and | |
| 128 | +RX traffic. If the bytes per second rate is approximately equal, the | |
| 129 | 129 | interrupt rate will drop as low as 2000 interrupts per second. If the |
| 130 | 130 | traffic is mostly transmit or mostly receive, the interrupt rate could |
| 131 | 131 | be as high as 8000. |
| @@ -245,7 +245,7 @@ NOTE: Depending on the available system resources, the request for a · 113 unmodified lines | ||
| 245 | 245 | TxDescriptorStep |
| 246 | 246 | ---------------- |
| 247 | 247 | Valid Range: 1 (use every Tx Descriptor) |
| 248 | − 4 (use every 4th Tx Descriptor) | |
| 248 | + 4 (use every 4th Tx Descriptor) | |
| 249 | 249 | |
| 250 | 250 | Default Value: 1 (use every Tx Descriptor) |
| 251 | 251 | |
| @@ -312,7 +312,7 @@ Valid Range: 0-xxxxxxx (0=off) · 60 unmodified lines | ||
| 312 | 312 | Default Value: 256 |
| 313 | 313 | Usage: insmod e1000.ko copybreak=128 |
| 314 | 314 | |
| 315 | −Driver copies all packets below or equaling this size to a fresh Rx | |
| 315 | +Driver copies all packets below or equaling this size to a fresh RX | |
| 316 | 316 | buffer before handing it up the stack. |
| 317 | 317 | |
| 318 | 318 | This parameter is different than other parameters, in that it is a |
| @@ -431,15 +431,15 @@ Additional Configurations · 112 unmodified lines | ||
| 431 | 431 | Ethtool |
| 432 | 432 | ------- |
| 433 | 433 | The driver utilizes the ethtool interface for driver configuration and |
| 434 | − diagnostics, as well as displaying statistical information. Ethtool | |
| 434 | + diagnostics, as well as displaying statistical information. The ethtool | |
| 435 | 435 | version 1.6 or later is required for this functionality. |
| 436 | 436 | |
| 437 | 437 | The latest release of ethtool can be found from |
| 438 | − http://sourceforge.net/projects/gkernel. | |
| 438 | + http://ftp.kernel.org/pub/software/network/ethtool/ | |
| 439 | 439 | |
| 440 | 440 | Enabling Wake on LAN* (WoL) |
| 441 | 441 | --------------------------- |
| 442 | − WoL is configured through the Ethtool* utility. | |
| 442 | + WoL is configured through the ethtool* utility. | |
| 443 | 443 | |
| 444 | 444 | WoL will be enabled on the system during the next shut down or reboot. |
| 445 | 445 | For this driver version, in order to enable WoL, the e1000 driver must be |
| @@ -1,5 +1,5 @@ | ||
| 1 | 1 | Linux* Driver for Intel(R) Network Connection |
| 2 | −=============================================================== | |
| 2 | +============================================= | |
| 3 | 3 | |
| 4 | 4 | Intel Gigabit Linux driver. |
| 5 | 5 | Copyright(c) 1999 - 2010 Intel Corporation. |
| @@ -61,6 +61,12 @@ per second, even if more packets have come in. This reduces interrupt · 55 unmodified lines | ||
| 61 | 61 | load on the system and can lower CPU utilization under heavy load, |
| 62 | 62 | but will increase latency as packets are not processed as quickly. |
| 63 | 63 | |
| 64 | +The default behaviour of the driver previously assumed a static | |
| 65 | +InterruptThrottleRate value of 8000, providing a good fallback value for | |
| 66 | +all traffic types, but lacking in small packet performance and latency. | |
| 67 | +The hardware can handle many more small packets per second however, and | |
| 68 | +for this reason an adaptive interrupt moderation algorithm was implemented. | |
| 69 | + | |
| 64 | 70 | The driver has two adaptive modes (setting 1 or 3) in which |
| 65 | 71 | it dynamically adjusts the InterruptThrottleRate value based on the traffic |
| 66 | 72 | that it receives. After determining the type of incoming traffic in the last |
| @@ -86,8 +92,8 @@ InterruptThrottleRate is set to mode 1. In this mode, which operates · 19 unmodified lines | ||
| 86 | 92 | the same as mode 3, the InterruptThrottleRate will be increased stepwise to |
| 87 | 93 | 70000 for traffic in class "Lowest latency". |
| 88 | 94 | |
| 89 | −In simplified mode the interrupt rate is based on the ratio of Tx and | |
| 90 | −Rx traffic. If the bytes per second rate is approximately equal the | |
| 95 | +In simplified mode the interrupt rate is based on the ratio of TX and | |
| 96 | +RX traffic. If the bytes per second rate is approximately equal, the | |
| 91 | 97 | interrupt rate will drop as low as 2000 interrupts per second. If the |
| 92 | 98 | traffic is mostly transmit or mostly receive, the interrupt rate could |
| 93 | 99 | be as high as 8000. |
| @@ -177,7 +183,7 @@ Copybreak · 83 unmodified lines | ||
| 177 | 183 | Valid Range: 0-xxxxxxx (0=off) |
| 178 | 184 | Default Value: 256 |
| 179 | 185 | |
| 180 | −Driver copies all packets below or equaling this size to a fresh Rx | |
| 186 | +Driver copies all packets below or equaling this size to a fresh RX | |
| 181 | 187 | buffer before handing it up the stack. |
| 182 | 188 | |
| 183 | 189 | This parameter is different than other parameters, in that it is a |
| @@ -223,17 +229,17 @@ loading or enabling the driver, try disabling this feature. · 39 unmodified lines | ||
| 223 | 229 | |
| 224 | 230 | WriteProtectNVM |
| 225 | 231 | --------------- |
| 226 | −Valid Range: 0-1 | |
| 227 | −Default Value: 1 (enabled) | |
| 228 | − | |
| 229 | −Set the hardware to ignore all write/erase cycles to the GbE region in the | |
| 230 | −ICHx NVM (non-volatile memory). This feature can be disabled by the | |
| 231 | −WriteProtectNVM module parameter (enabled by default) only after a hardware | |
| 232 | −reset, but the machine must be power cycled before trying to enable writes. | |
| 233 | − | |
| 234 | −Note: the kernel boot option iomem=relaxed may need to be set if the kernel | |
| 235 | −config option CONFIG_STRICT_DEVMEM=y, if the root user wants to write the | |
| 236 | −NVM from user space via ethtool. | |
| 232 | +Valid Range: 0,1 | |
| 233 | +Default Value: 1 | |
| 234 | + | |
| 235 | +If set to 1, configure the hardware to ignore all write/erase cycles to the | |
| 236 | +GbE region in the ICHx NVM (in order to prevent accidental corruption of the | |
| 237 | +NVM). This feature can be disabled by setting the parameter to 0 during initial | |
| 238 | +driver load. | |
| 239 | +NOTE: The machine must be power cycled (full off/on) when enabling NVM writes | |
| 240 | +via setting the parameter to zero. Once the NVM has been locked (via the | |
| 241 | +parameter at 1 when the driver loads) it cannot be unlocked except via power | |
| 242 | +cycle. | |
| 237 | 243 | |
| 238 | 244 | Additional Configurations |
| 239 | 245 | ========================= |
| @@ -259,32 +265,30 @@ Additional Configurations · 19 unmodified lines | ||
| 259 | 265 | - Some adapters limit Jumbo Frames sized packets to a maximum of |
| 260 | 266 | 4096 bytes and some adapters do not support Jumbo Frames. |
| 261 | 267 | |
| 262 | − | |
| 263 | 268 | Ethtool |
| 264 | 269 | ------- |
| 265 | 270 | The driver utilizes the ethtool interface for driver configuration and |
| 266 | 271 | diagnostics, as well as displaying statistical information. We |
| 267 | − strongly recommend downloading the latest version of Ethtool at: | |
| 272 | + strongly recommend downloading the latest version of ethtool at: | |
| 268 | 273 | |
| 269 | − http://sourceforge.net/projects/gkernel. | |
| 274 | + http://ftp.kernel.org/pub/software/network/ethtool/ | |
| 270 | 275 | |
| 271 | 276 | Speed and Duplex |
| 272 | 277 | ---------------- |
| 273 | − Speed and Duplex are configured through the Ethtool* utility. For | |
| 274 | − instructions, refer to the Ethtool man page. | |
| 278 | + Speed and Duplex are configured through the ethtool* utility. For | |
| 279 | + instructions, refer to the ethtool man page. | |
| 275 | 280 | |
| 276 | 281 | Enabling Wake on LAN* (WoL) |
| 277 | 282 | --------------------------- |
| 278 | − WoL is configured through the Ethtool* utility. For instructions on | |
| 279 | − enabling WoL with Ethtool, refer to the Ethtool man page. | |
| 283 | + WoL is configured through the ethtool* utility. For instructions on | |
| 284 | + enabling WoL with ethtool, refer to the ethtool man page. | |
| 280 | 285 | |
| 281 | 286 | WoL will be enabled on the system during the next shut down or reboot. |
| 282 | 287 | For this driver version, in order to enable WoL, the e1000e driver must be |
| 283 | 288 | loaded when shutting down or rebooting the system. |
| 284 | 289 | |
| 285 | 290 | In most cases Wake On LAN is only supported on port A for multiple port |
| 286 | − adapters. To verify if a port supports Wake on LAN run ethtool eth<X>. | |
| 287 | − | |
| 291 | + adapters. To verify if a port supports Wake on Lan run ethtool eth<X>. | |
| 288 | 292 | |
| 289 | 293 | Support |
| 290 | 294 | ======= |
| @@ -1,3 +1,3 @@ | ||
| 1 | 1 | A wiki document on how to use Generic Netlink can be found here: |
| 2 | 2 | |
| 3 | − * http://linux-net.osdl.org/index.php/Generic_Netlink_HOWTO | |
| 3 | + * http://www.linuxfoundation.org/collaborate/workgroups/networking/generic_netlink_howto | |
| @@ -36,6 +36,7 @@ Default Value: 0 · 35 unmodified lines | ||
| 36 | 36 | This parameter adds support for SR-IOV. It causes the driver to spawn up to |
| 37 | 37 | max_vfs worth of virtual function. |
| 38 | 38 | |
| 39 | + | |
| 39 | 40 | Additional Configurations |
| 40 | 41 | ========================= |
| 41 | 42 | |
| @@ -60,15 +61,16 @@ Additional Configurations · 18 unmodified lines | ||
| 60 | 61 | Ethtool |
| 61 | 62 | ------- |
| 62 | 63 | The driver utilizes the ethtool interface for driver configuration and |
| 63 | − diagnostics, as well as displaying statistical information. | |
| 64 | + diagnostics, as well as displaying statistical information. The latest | |
| 65 | + version of ethtool can be found at: | |
| 64 | 66 | |
| 65 | − http://sourceforge.net/projects/gkernel. | |
| 67 | + http://ftp.kernel.org/pub/software/network/ethtool/ | |
| 66 | 68 | |
| 67 | 69 | Enabling Wake on LAN* (WoL) |
| 68 | 70 | --------------------------- |
| 69 | − WoL is configured through the Ethtool* utility. | |
| 71 | + WoL is configured through the ethtool* utility. | |
| 70 | 72 | |
| 71 | − For instructions on enabling WoL with Ethtool, refer to the Ethtool man page. | |
| 73 | + For instructions on enabling WoL with ethtool, refer to the ethtool man page. | |
| 72 | 74 | |
| 73 | 75 | WoL will be enabled on the system during the next shut down or reboot. |
| 74 | 76 | For this driver version, in order to enable WoL, the igb driver must be |
| @@ -91,31 +93,6 @@ Additional Configurations · 16 unmodified lines | ||
| 91 | 93 | REQUIREMENTS: MSI-X support is required for Multiqueue. If MSI-X is not |
| 92 | 94 | found, the system will fallback to MSI or to Legacy interrupts. |
| 93 | 95 | |
| 94 | − LRO | |
| 95 | − --- | |
| 96 | − Large Receive Offload (LRO) is a technique for increasing inbound throughput | |
| 97 | − of high-bandwidth network connections by reducing CPU overhead. It works by | |
| 98 | − aggregating multiple incoming packets from a single stream into a larger | |
| 99 | − buffer before they are passed higher up the networking stack, thus reducing | |
| 100 | − the number of packets that have to be processed. LRO combines multiple | |
| 101 | − Ethernet frames into a single receive in the stack, thereby potentially | |
| 102 | − decreasing CPU utilization for receives. | |
| 103 | − | |
| 104 | − NOTE: You need to have inet_lro enabled via either the CONFIG_INET_LRO or | |
| 105 | − CONFIG_INET_LRO_MODULE kernel config option. Additionally, if | |
| 106 | − CONFIG_INET_LRO_MODULE is used, the inet_lro module needs to be loaded | |
| 107 | − before the igb driver. | |
| 108 | − | |
| 109 | − You can verify that the driver is using LRO by looking at these counters in | |
| 110 | − Ethtool: | |
| 111 | − | |
| 112 | − lro_aggregated - count of total packets that were combined | |
| 113 | − lro_flushed - counts the number of packets flushed out of LRO | |
| 114 | − lro_no_desc - counts the number of times an LRO descriptor was not available | |
| 115 | − for the LRO packet | |
| 116 | − | |
| 117 | − NOTE: IPv6 and UDP are not supported by LRO. | |
| 118 | − | |
| 119 | 96 | Support |
| 120 | 97 | ======= |
| 121 | 98 | |
| @@ -58,9 +58,11 @@ Additional Configurations · 57 unmodified lines | ||
| 58 | 58 | Ethtool |
| 59 | 59 | ------- |
| 60 | 60 | The driver utilizes the ethtool interface for driver configuration and |
| 61 | − diagnostics, as well as displaying statistical information. | |
| 61 | + diagnostics, as well as displaying statistical information. The ethtool | |
| 62 | + version 3.0 or later is required for this functionality, although we | |
| 63 | + strongly recommend downloading the latest version at: | |
| 62 | 64 | |
| 63 | − http://sourceforge.net/projects/gkernel. | |
| 65 | + http://ftp.kernel.org/pub/software/network/ethtool/ | |
| 64 | 66 | |
| 65 | 67 | Support |
| 66 | 68 | ======= |
| @@ -11,7 +11,9 @@ ip_forward - BOOLEAN · 10 unmodified lines | ||
| 11 | 11 | for routers) |
| 12 | 12 | |
| 13 | 13 | ip_default_ttl - INTEGER |
| 14 | − default 64 | |
| 14 | + Default value of TTL field (Time To Live) for outgoing (but not | |
| 15 | + forwarded) IP packets. Should be between 1 and 255 inclusive. | |
| 16 | + Default: 64 (as recommended by RFC1700) | |
| 15 | 17 | |
| 16 | 18 | ip_no_pmtu_disc - BOOLEAN |
| 17 | 19 | Disable Path MTU Discovery. |
| @@ -185,7 +187,7 @@ tcp_cookie_size - INTEGER · 167 unmodified lines | ||
| 185 | 187 | tcp_dsack - BOOLEAN |
| 186 | 188 | Allows TCP to send "duplicate" SACKs. |
| 187 | 189 | |
| 188 | −tcp_ecn - BOOLEAN | |
| 190 | +tcp_ecn - INTEGER | |
| 189 | 191 | Enable Explicit Congestion Notification (ECN) in TCP. ECN is only |
| 190 | 192 | used when both ends of the TCP flow support it. It is useful to |
| 191 | 193 | avoid losses due to congestion (when the bottleneck router supports |
| @@ -708,10 +710,28 @@ igmp_max_memberships - INTEGER · 516 unmodified lines | ||
| 708 | 710 | Change the maximum number of multicast groups we can subscribe to. |
| 709 | 711 | Default: 20 |
| 710 | 712 | |
| 711 | −conf/interface/* changes special settings per interface (where "interface" is | |
| 712 | − the name of your network interface) | |
| 713 | −conf/all/* is special, changes the settings for all interfaces | |
| 713 | + Theoretical maximum value is bounded by having to send a membership | |
| 714 | + report in a single datagram (i.e. the report can't span multiple | |
| 715 | + datagrams, or risk confusing the switch and leaving groups you don't | |
| 716 | + intend to). | |
| 714 | 717 | |
| 718 | + The number of supported groups 'M' is bounded by the number of group | |
| 719 | + report entries you can fit into a single datagram of 65535 bytes. | |
| 720 | + | |
| 721 | + M = 65536-sizeof (ip header)/(sizeof(Group record)) | |
| 722 | + | |
| 723 | + Group records are variable length, with a minimum of 12 bytes. | |
| 724 | + So net.ipv4.igmp_max_memberships should not be set higher than: | |
| 725 | + | |
| 726 | + (65536-24) / 12 = 5459 | |
| 727 | + | |
| 728 | + The value 5459 assumes no IP header options, so in practice | |
| 729 | + this number may be lower. | |
| 730 | + | |
| 731 | + conf/interface/* changes special settings per interface (where | |
| 732 | + "interface" is the name of your network interface) | |
| 733 | + | |
| 734 | + conf/all/* is special, changes the settings for all interfaces | |
| 715 | 735 | |
| 716 | 736 | log_martians - BOOLEAN |
| 717 | 737 | Log packets with impossible addresses to kernel log. |
| @@ -309,15 +309,15 @@ Additional Configurations · 308 unmodified lines | ||
| 309 | 309 | Ethtool |
| 310 | 310 | ------- |
| 311 | 311 | The driver utilizes the ethtool interface for driver configuration and |
| 312 | − diagnostics, as well as displaying statistical information. Ethtool | |
| 312 | + diagnostics, as well as displaying statistical information. The ethtool | |
| 313 | 313 | version 1.6 or later is required for this functionality. |
| 314 | 314 | |
| 315 | 315 | The latest release of ethtool can be found from |
| 316 | − http://sourceforge.net/projects/gkernel | |
| 316 | + http://ftp.kernel.org/pub/software/network/ethtool/ | |
| 317 | 317 | |
| 318 | − NOTE: Ethtool 1.6 only supports a limited set of ethtool options. Support | |
| 319 | − for a more complete ethtool feature set can be enabled by upgrading | |
| 320 | − to the latest version. | |
| 318 | + NOTE: The ethtool version 1.6 only supports a limited set of ethtool options. | |
| 319 | + Support for a more complete ethtool feature set can be enabled by | |
| 320 | + upgrading to the latest version. | |
| 321 | 321 | |
| 322 | 322 | |
| 323 | 323 | NAPI |
| @@ -1,107 +1,126 @@ | ||
| 1 | 1 | Linux Base Driver for 10 Gigabit PCI Express Intel(R) Network Connection |
| 2 | 2 | ======================================================================== |
| 3 | 3 | |
| 4 | −March 10, 2009 | |
| 5 | − | |
| 4 | +Intel Gigabit Linux driver. | |
| 5 | +Copyright(c) 1999 - 2010 Intel Corporation. | |
| 6 | 6 | |
| 7 | 7 | Contents |
| 8 | 8 | ======== |
| 9 | 9 | |
| 10 | −- In This Release | |
| 11 | 10 | - Identifying Your Adapter |
| 12 | −- Building and Installation | |
| 13 | 11 | - Additional Configurations |
| 12 | +- Performance Tuning | |
| 13 | +- Known Issues | |
| 14 | 14 | - Support |
| 15 | 15 | |
| 16 | +Identifying Your Adapter | |
| 17 | +======================== | |
| 16 | 18 | |
| 19 | +The driver in this release is compatible with 82598 and 82599-based Intel | |
| 20 | +Network Connections. | |
| 17 | 21 | |
| 18 | −In This Release | |
| 19 | −=============== | |
| 22 | +For more information on how to identify your adapter, go to the Adapter & | |
| 23 | +Driver ID Guide at: | |
| 20 | 24 | |
| 21 | −This file describes the ixgbe Linux Base Driver for the 10 Gigabit PCI | |
| 22 | −Express Intel(R) Network Connection. This driver includes support for | |
| 23 | −Itanium(R)2-based systems. | |
| 25 | + http://support.intel.com/support/network/sb/CS-012904.htm | |
| 24 | 26 | |
| 25 | −For questions related to hardware requirements, refer to the documentation | |
| 26 | −supplied with your 10 Gigabit adapter. All hardware requirements listed apply | |
| 27 | −to use with Linux. | |
| 27 | +SFP+ Devices with Pluggable Optics | |
| 28 | +---------------------------------- | |
| 28 | 29 | |
| 29 | −The following features are available in this kernel: | |
| 30 | − - Native VLANs | |
| 31 | − - Channel Bonding (teaming) | |
| 32 | − - SNMP | |
| 33 | − - Generic Receive Offload | |
| 34 | − - Data Center Bridging | |
| 30 | +82599-BASED ADAPTERS | |
| 35 | 31 | |
| 36 | −Channel Bonding documentation can be found in the Linux kernel source: | |
| 37 | −/Documentation/networking/bonding.txt | |
| 32 | +NOTES: If your 82599-based Intel(R) Network Adapter came with Intel optics, or | |
| 33 | +is an Intel(R) Ethernet Server Adapter X520-2, then it only supports Intel | |
| 34 | +optics and/or the direct attach cables listed below. | |
| 38 | 35 | |
| 39 | −Ethtool, lspci, and ifconfig can be used to display device and driver | |
| 40 | −specific information. | |
| 36 | +When 82599-based SFP+ devices are connected back to back, they should be set to | |
| 37 | +the same Speed setting via ethtool. Results may vary if you mix speed settings. | |
| 38 | +82598-based adapters support all passive direct attach cables that comply | |
| 39 | +with SFF-8431 v4.1 and SFF-8472 v10.4 specifications. Active direct attach | |
| 40 | +cables are not supported. | |
| 41 | 41 | |
| 42 | +Supplier Type Part Numbers | |
| 42 | 43 | |
| 43 | −Identifying Your Adapter | |
| 44 | −======================== | |
| 44 | +SR Modules | |
| 45 | +Intel DUAL RATE 1G/10G SFP+ SR (bailed) FTLX8571D3BCV-IT | |
| 46 | +Intel DUAL RATE 1G/10G SFP+ SR (bailed) AFBR-703SDDZ-IN1 | |
| 47 | +Intel DUAL RATE 1G/10G SFP+ SR (bailed) AFBR-703SDZ-IN2 | |
| 48 | +LR Modules | |
| 49 | +Intel DUAL RATE 1G/10G SFP+ LR (bailed) FTLX1471D3BCV-IT | |
| 50 | +Intel DUAL RATE 1G/10G SFP+ LR (bailed) AFCT-701SDDZ-IN1 | |
| 51 | +Intel DUAL RATE 1G/10G SFP+ LR (bailed) AFCT-701SDZ-IN2 | |
| 45 | 52 | |
| 46 | −This driver supports devices based on the 82598 controller and the 82599 | |
| 47 | −controller. | |
| 53 | +The following is a list of 3rd party SFP+ modules and direct attach cables that | |
| 54 | +have received some testing. Not all modules are applicable to all devices. | |
| 48 | 55 | |
| 49 | −For specific information on identifying which adapter you have, please visit: | |
| 56 | +Supplier Type Part Numbers | |
| 50 | 57 | |
| 51 | − http://support.intel.com/support/network/sb/CS-008441.htm | |
| 58 | +Finisar SFP+ SR bailed, 10g single rate FTLX8571D3BCL | |
| 59 | +Avago SFP+ SR bailed, 10g single rate AFBR-700SDZ | |
| 60 | +Finisar SFP+ LR bailed, 10g single rate FTLX1471D3BCL | |
| 52 | 61 | |
| 62 | +Finisar DUAL RATE 1G/10G SFP+ SR (No Bail) FTLX8571D3QCV-IT | |
| 63 | +Avago DUAL RATE 1G/10G SFP+ SR (No Bail) AFBR-703SDZ-IN1 | |
| 64 | +Finisar DUAL RATE 1G/10G SFP+ LR (No Bail) FTLX1471D3QCV-IT | |
| 65 | +Avago DUAL RATE 1G/10G SFP+ LR (No Bail) AFCT-701SDZ-IN1 | |
| 66 | +Finistar 1000BASE-T SFP FCLF8522P2BTL | |
| 67 | +Avago 1000BASE-T SFP ABCU-5710RZ | |
| 53 | 68 | |
| 54 | −Building and Installation | |
| 55 | −========================= | |
| 69 | +82599-based adapters support all passive and active limiting direct attach | |
| 70 | +cables that comply with SFF-8431 v4.1 and SFF-8472 v10.4 specifications. | |
| 56 | 71 | |
| 57 | −select m for "Intel(R) 10GbE PCI Express adapters support" located at: | |
| 58 | − Location: | |
| 59 | − -> Device Drivers | |
| 60 | − -> Network device support (NETDEVICES [=y]) | |
| 61 | − -> Ethernet (10000 Mbit) (NETDEV_10000 [=y]) | |
| 72 | +Laser turns off for SFP+ when ifconfig down | |
| 73 | +------------------------------------------- | |
| 74 | +"ifconfig down" turns off the laser for 82599-based SFP+ fiber adapters. | |
| 75 | +"ifconfig up" turns on the later. | |
| 62 | 76 | |
| 63 | −1. make modules & make modules_install | |
| 64 | 77 | |
| 65 | −2. Load the module: | |
| 78 | +82598-BASED ADAPTERS | |
| 66 | 79 | |
| 67 | −# modprobe ixgbe | |
| 80 | +NOTES for 82598-Based Adapters: | |
| 81 | +- Intel(R) Network Adapters that support removable optical modules only support | |
| 82 | + their original module type (i.e., the Intel(R) 10 Gigabit SR Dual Port | |
| 83 | + Express Module only supports SR optical modules). If you plug in a different | |
| 84 | + type of module, the driver will not load. | |
| 85 | +- Hot Swapping/hot plugging optical modules is not supported. | |
| 86 | +- Only single speed, 10 gigabit modules are supported. | |
| 87 | +- LAN on Motherboard (LOMs) may support DA, SR, or LR modules. Other module | |
| 88 | + types are not supported. Please see your system documentation for details. | |
| 68 | 89 | |
| 69 | − The insmod command can be used if the full | |
| 70 | − path to the driver module is specified. For example: | |
| 90 | +The following is a list of 3rd party SFP+ modules and direct attach cables that | |
| 91 | +have received some testing. Not all modules are applicable to all devices. | |
| 71 | 92 | |
| 72 | − insmod /lib/modules/<KERNEL VERSION>/kernel/drivers/net/ixgbe/ixgbe.ko | |
| 93 | +Supplier Type Part Numbers | |
| 73 | 94 | |
| 74 | − With 2.6 based kernels also make sure that older ixgbe drivers are | |
| 75 | − removed from the kernel, before loading the new module: | |
| 95 | +Finisar SFP+ SR bailed, 10g single rate FTLX8571D3BCL | |
| 96 | +Avago SFP+ SR bailed, 10g single rate AFBR-700SDZ | |
| 97 | +Finisar SFP+ LR bailed, 10g single rate FTLX1471D3BCL | |
| 76 | 98 | |
| 77 | − rmmod ixgbe; modprobe ixgbe | |
| 99 | +82598-based adapters support all passive direct attach cables that comply | |
| 100 | +with SFF-8431 v4.1 and SFF-8472 v10.4 specifications. Active direct attach | |
| 101 | +cables are not supported. | |
| 78 | 102 | |
| 79 | −3. Assign an IP address to the interface by entering the following, where | |
| 80 | − x is the interface number: | |
| 81 | 103 | |
| 82 | − ifconfig ethx <IP_address> | |
| 104 | +Flow Control | |
| 105 | +------------ | |
| 106 | +Ethernet Flow Control (IEEE 802.3x) can be configured with ethtool to enable | |
| 107 | +receiving and transmitting pause frames for ixgbe. When TX is enabled, PAUSE | |
| 108 | +frames are generated when the receive packet buffer crosses a predefined | |
| 109 | +threshold. When rx is enabled, the transmit unit will halt for the time delay | |
| 110 | +specified when a PAUSE frame is received. | |
| 83 | 111 | |
| 84 | −4. Verify that the interface works. Enter the following, where <IP_address> | |
| 85 | − is the IP address for another machine on the same subnet as the interface | |
| 86 | − that is being tested: | |
| 112 | +Flow Control is enabled by default. If you want to disable a flow control | |
| 113 | +capable link partner, use ethtool: | |
| 87 | 114 | |
| 88 | − ping <IP_address> | |
| 115 | + ethtool -A eth? autoneg off RX off TX off | |
| 89 | 116 | |
| 117 | +NOTE: For 82598 backplane cards entering 1 gig mode, flow control default | |
| 118 | +behavior is changed to off. Flow control in 1 gig mode on these devices can | |
| 119 | +lead to Tx hangs. | |
| 90 | 120 | |
| 91 | 121 | Additional Configurations |
| 92 | 122 | ========================= |
| 93 | 123 | |
| 94 | − Viewing Link Messages | |
| 95 | − --------------------- | |
| 96 | − Link messages will not be displayed to the console if the distribution is | |
| 97 | − restricting system messages. In order to see network driver link messages on | |
| 98 | − your console, set dmesg to eight by entering the following: | |
| 99 | − | |
| 100 | − dmesg -n 8 | |
| 101 | − | |
| 102 | − NOTE: This setting is not saved across reboots. | |
| 103 | − | |
| 104 | − | |
| 105 | 124 | Jumbo Frames |
| 106 | 125 | ------------ |
| 107 | 126 | The driver supports Jumbo Frames for all adapters. Jumbo Frames support is |
| @@ -123,13 +142,8 @@ Additional Configurations · 15 unmodified lines | ||
| 123 | 142 | other protocols besides TCP. It's also safe to use with configurations that |
| 124 | 143 | are problematic for LRO, namely bridging and iSCSI. |
| 125 | 144 | |
| 126 | − GRO is enabled by default in the driver. Future versions of ethtool will | |
| 127 | − support disabling and re-enabling GRO on the fly. | |
| 128 | − | |
| 129 | − | |
| 130 | 145 | Data Center Bridging, aka DCB |
| 131 | 146 | ----------------------------- |
| 132 | − | |
| 133 | 147 | DCB is a configuration Quality of Service implementation in hardware. |
| 134 | 148 | It uses the VLAN priority tag (802.1p) to filter traffic. That means |
| 135 | 149 | that there are 8 different priorities that traffic can be filtered into. |
| @@ -163,24 +177,71 @@ Additional Configurations · 27 unmodified lines | ||
| 163 | 177 | |
| 164 | 178 | http://e1000.sf.net |
| 165 | 179 | |
| 166 | − | |
| 167 | 180 | Ethtool |
| 168 | 181 | ------- |
| 169 | 182 | The driver utilizes the ethtool interface for driver configuration and |
| 170 | − diagnostics, as well as displaying statistical information. Ethtool | |
| 171 | − version 3.0 or later is required for this functionality. | |
| 183 | + diagnostics, as well as displaying statistical information. The latest | |
| 184 | + ethtool version is required for this functionality. | |
| 172 | 185 | |
| 173 | 186 | The latest release of ethtool can be found from |
| 174 | − http://sourceforge.net/projects/gkernel. | |
| 187 | + http://ftp.kernel.org/pub/software/network/ethtool/ | |
| 175 | 188 | |
| 176 | − | |
| 177 | − NAPI | |
| 189 | + FCoE | |
| 178 | 190 | ---- |
| 191 | + This release of the ixgbe driver contains new code to enable users to use | |
| 192 | + Fiber Channel over Ethernet (FCoE) and Data Center Bridging (DCB) | |
| 193 | + functionality that is supported by the 82598-based hardware. This code has | |
| 194 | + no default effect on the regular driver operation, and configuring DCB and | |
| 195 | + FCoE is outside the scope of this driver README. Refer to | |
| 196 | + http://www.open-fcoe.org/ for FCoE project information and contact | |
| 197 | + e1000-eedc@lists.sourceforge.net for DCB information. | |
| 198 | + | |
| 199 | + MAC and VLAN anti-spoofing feature | |
| 200 | + ---------------------------------- | |
| 201 | + When a malicious driver attempts to send a spoofed packet, it is dropped by | |
| 202 | + the hardware and not transmitted. An interrupt is sent to the PF driver | |
| 203 | + notifying it of the spoof attempt. | |
| 204 | + | |
| 205 | + When a spoofed packet is detected the PF driver will send the following | |
| 206 | + message to the system log (displayed by the "dmesg" command): | |
| 207 | + | |
| 208 | + Spoof event(s) detected on VF (n) | |
| 209 | + | |
| 210 | + Where n=the VF that attempted to do the spoofing. | |
| 211 | + | |
| 212 | + | |
| 213 | +Performance Tuning | |
| 214 | +================== | |
| 215 | + | |
| 216 | +An excellent article on performance tuning can be found at: | |
| 217 | + | |
| 218 | +http://www.redhat.com/promo/summit/2008/downloads/pdf/Thursday/Mark_Wagner.pdf | |
| 219 | + | |
| 220 | + | |
| 221 | +Known Issues | |
| 222 | +============ | |
| 223 | + | |
| 224 | + Enabling SR-IOV in a 32-bit Microsoft* Windows* Server 2008 Guest OS using | |
| 225 | + Intel (R) 82576-based GbE or Intel (R) 82599-based 10GbE controller under KVM | |
| 226 | + ----------------------------------------------------------------------------- | |
| 227 | + KVM Hypervisor/VMM supports direct assignment of a PCIe device to a VM. This | |
| 228 | + includes traditional PCIe devices, as well as SR-IOV-capable devices using | |
| 229 | + Intel 82576-based and 82599-based controllers. | |
| 230 | + | |
| 231 | + While direct assignment of a PCIe device or an SR-IOV Virtual Function (VF) | |
| 232 | + to a Linux-based VM running 2.6.32 or later kernel works fine, there is a | |
| 233 | + known issue with Microsoft Windows Server 2008 VM that results in a "yellow | |
| 234 | + bang" error. This problem is within the KVM VMM itself, not the Intel driver, | |
| 235 | + or the SR-IOV logic of the VMM, but rather that KVM emulates an older CPU | |
| 236 | + model for the guests, and this older CPU model does not support MSI-X | |
| 237 | + interrupts, which is a requirement for Intel SR-IOV. | |
| 179 | 238 | |
| 180 | − NAPI (Rx polling mode) is supported in the ixgbe driver. NAPI is enabled | |
| 181 | − by default in the driver. | |
| 239 | + If you wish to use the Intel 82576 or 82599-based controllers in SR-IOV mode | |
| 240 | + with KVM and a Microsoft Windows Server 2008 guest try the following | |
| 241 | + workaround. The workaround is to tell KVM to emulate a different model of CPU | |
| 242 | + when using qemu to create the KVM guest: | |
| 182 | 243 | |
| 183 | − See www.cyberus.ca/~hadi/usenix-paper.tgz for more information on NAPI. | |
| 244 | + "-cpu qemu64,model=13" | |
| 184 | 245 | |
| 185 | 246 | |
| 186 | 247 | Support |
| @@ -35,10 +35,6 @@ Driver ID Guide at: · 34 unmodified lines | ||
| 35 | 35 | Known Issues/Troubleshooting |
| 36 | 36 | ============================ |
| 37 | 37 | |
| 38 | − Unloading Physical Function (PF) Driver Causes System Reboots When VM is | |
| 39 | − Running and VF is Loaded on the VM | |
| 40 | − ------------------------------------------------------------------------ | |
| 41 | − Do not unload the PF driver (ixgbe) while VFs are assigned to guests. | |
| 42 | 38 | |
| 43 | 39 | Support |
| 44 | 40 | ======= |
| @@ -7,7 +7,7 @@ This is the driver for the MAC 10/100/1000 on-chip Ethernet controllers · 6 unmodified lines | ||
| 7 | 7 | (Synopsys IP blocks); it has been fully tested on STLinux platforms. |
| 8 | 8 | |
| 9 | 9 | Currently this network device driver is for all STM embedded MAC/GMAC |
| 10 | −(7xxx SoCs). | |
| 10 | +(7xxx SoCs). Other platforms start using it i.e. ARM SPEAr. | |
| 11 | 11 | |
| 12 | 12 | DWC Ether MAC 10/100/1000 Universal version 3.41a and DWC Ether MAC 10/100 |
| 13 | 13 | Universal version 4.0 have been used for developing the first code |
| @@ -95,9 +95,14 @@ Several information came from the platform; please refer to the · 81 unmodified lines | ||
| 95 | 95 | driver's Header file in include/linux directory. |
| 96 | 96 | |
| 97 | 97 | struct plat_stmmacenet_data { |
| 98 | − int bus_id; | |
| 99 | − int pbl; | |
| 100 | − int has_gmac; | |
| 98 | + int bus_id; | |
| 99 | + int pbl; | |
| 100 | + int clk_csr; | |
| 101 | + int has_gmac; | |
| 102 | + int enh_desc; | |
| 103 | + int tx_coe; | |
| 104 | + int bugged_jumbo; | |
| 105 | + int pmt; | |
| 101 | 106 | void (*fix_mac_speed)(void *priv, unsigned int speed); |
| 102 | 107 | void (*bus_setup)(unsigned long ioaddr); |
| 103 | 108 | #ifdef CONFIG_STM_DRIVERS |
| @@ -114,6 +119,12 @@ Where: · 10 unmodified lines | ||
| 114 | 119 | registers (on STM platforms); |
| 115 | 120 | - has_gmac: GMAC core is on board (get it at run-time in the next step); |
| 116 | 121 | - bus_id: bus identifier. |
| 122 | +- tx_coe: core is able to perform the tx csum in HW. | |
| 123 | +- enh_desc: if sets the MAC will use the enhanced descriptor structure. | |
| 124 | +- clk_csr: CSR Clock range selection. | |
| 125 | +- bugged_jumbo: some HWs are not able to perform the csum in HW for | |
| 126 | + over-sized frames due to limited buffer sizes. Setting this | |
| 127 | + flag the csum will be done in SW on JUMBO frames. | |
| 117 | 128 | |
| 118 | 129 | struct plat_stmmacphy_data { |
| 119 | 130 | int bus_id; |
| @@ -131,13 +142,28 @@ Where: · 11 unmodified lines | ||
| 131 | 142 | - interface: physical MII interface mode; |
| 132 | 143 | - phy_reset: hook to reset HW function. |
| 133 | 144 | |
| 145 | +SOURCES: | |
| 146 | +- Kconfig | |
| 147 | +- Makefile | |
| 148 | +- stmmac_main.c: main network device driver; | |
| 149 | +- stmmac_mdio.c: mdio functions; | |
| 150 | +- stmmac_ethtool.c: ethtool support; | |
| 151 | +- stmmac_timer.[ch]: timer code used for mitigating the driver dma interrupts | |
| 152 | + Only tested on ST40 platforms based. | |
| 153 | +- stmmac.h: private driver structure; | |
| 154 | +- common.h: common definitions and VFTs; | |
| 155 | +- descs.h: descriptor structure definitions; | |
| 156 | +- dwmac1000_core.c: GMAC core functions; | |
| 157 | +- dwmac1000_dma.c: dma functions for the GMAC chip; | |
| 158 | +- dwmac1000.h: specific header file for the GMAC; | |
| 159 | +- dwmac100_core: MAC 100 core and dma code; | |
| 160 | +- dwmac100_dma.c: dma funtions for the MAC chip; | |
| 161 | +- dwmac1000.h: specific header file for the MAC; | |
| 162 | +- dwmac_lib.c: generic DMA functions shared among chips | |
| 163 | +- enh_desc.c: functions for handling enhanced descriptors | |
| 164 | +- norm_desc.c: functions for handling normal descriptors | |
| 165 | + | |
| 134 | 166 | TODO: |
| 135 | −- Continue to make the driver more generic and suitable for other Synopsys | |
| 136 | − Ethernet controllers used on other architectures (i.e. ARM). | |
| 137 | −- 10G controllers are not supported. | |
| 138 | −- MAC uses Normal descriptors and GMAC uses enhanced ones. | |
| 139 | − This is a limit that should be reviewed. MAC could want to | |
| 140 | − use the enhanced structure. | |
| 141 | −- Checksumming: Rx/Tx csum is done in HW in case of GMAC only. | |
| 167 | +- XGMAC controller is not supported. | |
| 142 | 168 | - Review the timer optimisation code to use an embedded device that seems to be |
| 143 | 169 | available in new chip generations. |
| @@ -0,0 +1,114 @@ | ||
| 1 | +Kernel driver for the NXP Semiconductors PN544 Near Field | |
| 2 | +Communication chip | |
| 3 | + | |
| 4 | +Author: Jari Vanhala | |
| 5 | +Contact: Matti Aaltonen (matti.j.aaltonen at nokia.com) | |
| 6 | + | |
| 7 | +General | |
| 8 | +------- | |
| 9 | + | |
| 10 | +The PN544 is an integrated transmission module for contactless | |
| 11 | +communication. The driver goes under drives/nfc/ and is compiled as a | |
| 12 | +module named "pn544". It registers a misc device and creates a device | |
| 13 | +file named "/dev/pn544". | |
| 14 | + | |
| 15 | +Host Interfaces: I2C, SPI and HSU, this driver supports currently only I2C. | |
| 16 | + | |
| 17 | +The Interface | |
| 18 | +------------- | |
| 19 | + | |
| 20 | +The driver offers a sysfs interface for a hardware test and an IOCTL | |
| 21 | +interface for selecting between two operating modes. There are read, | |
| 22 | +write and poll functions for transferring messages. The two operating | |
| 23 | +modes are the normal (HCI) mode and the firmware update mode. | |
| 24 | + | |
| 25 | +PN544 is controlled by sending messages from the userspace to the | |
| 26 | +chip. The main function of the driver is just to pass those messages | |
| 27 | +without caring about the message content. | |
| 28 | + | |
| 29 | + | |
| 30 | +Protocols | |
| 31 | +--------- | |
| 32 | + | |
| 33 | +In the normal (HCI) mode and in the firmware update mode read and | |
| 34 | +write functions behave a bit differently because the message formats | |
| 35 | +or the protocols are different. | |
| 36 | + | |
| 37 | +In the normal (HCI) mode the protocol used is derived from the ETSI | |
| 38 | +HCI specification. The firmware is updated using a specific protocol, | |
| 39 | +which is different from HCI. | |
| 40 | + | |
| 41 | +HCI messages consist of an eight bit header and the message body. The | |
| 42 | +header contains the message length. Maximum size for an HCI message is | |
| 43 | +33. In HCI mode sent messages are tested for a correct | |
| 44 | +checksum. Firmware update messages have the length in the second (MSB) | |
| 45 | +and third (LSB) bytes of the message. The maximum FW message length is | |
| 46 | +1024 bytes. | |
| 47 | + | |
| 48 | +For the ETSI HCI specification see | |
| 49 | +http://www.etsi.org/WebSite/Technologies/ProtocolSpecification.aspx | |
| 50 | + | |
| 51 | +The Hardware Test | |
| 52 | +----------------- | |
| 53 | + | |
| 54 | +The idea of the test is that it can performed by reading from the | |
| 55 | +corresponding sysfs file. The test is implemented in the board file | |
| 56 | +and it should test that PN544 can be put into the firmware update | |
| 57 | +mode. If the test is not implemented the sysfs file does not get | |
| 58 | +created. | |
| 59 | + | |
| 60 | +Example: | |
| 61 | +> cat /sys/module/pn544/drivers/i2c\:pn544/3-002b/nfc_test | |
| 62 | +1 | |
| 63 | + | |
| 64 | +Normal Operation | |
| 65 | +---------------- | |
| 66 | + | |
| 67 | +PN544 is powered up when the device file is opened, otherwise it's | |
| 68 | +turned off. Only one instance can use the device at a time. | |
| 69 | + | |
| 70 | +Userspace applications control PN544 with HCI messages. The hardware | |
| 71 | +sends an interrupt when data is available for reading. Data is | |
| 72 | +physically read when the read function is called by a userspace | |
| 73 | +application. Poll() checks the read interrupt state. Configuration and | |
| 74 | +self testing are also done from the userspace using read and write. | |
| 75 | + | |
| 76 | +Example platform data: | |
| 77 | + | |
| 78 | +static int rx71_pn544_nfc_request_resources(struct i2c_client *client) | |
| 79 | +{ | |
| 80 | + /* Get and setup the HW resources for the device */ | |
| 81 | +} | |
| 82 | + | |
| 83 | +static void rx71_pn544_nfc_free_resources(void) | |
| 84 | +{ | |
| 85 | + /* Release the HW resources */ | |
| 86 | +} | |
| 87 | + | |
| 88 | +static void rx71_pn544_nfc_enable(int fw) | |
| 89 | +{ | |
| 90 | + /* Turn the device on */ | |
| 91 | +} | |
| 92 | + | |
| 93 | +static int rx71_pn544_nfc_test(void) | |
| 94 | +{ | |
| 95 | + /* | |
| 96 | + * Put the device into the FW update mode | |
| 97 | + * and then back to the normal mode. | |
| 98 | + * Check the behavior and return one on success, | |
| 99 | + * zero on failure. | |
| 100 | + */ | |
| 101 | +} | |
| 102 | + | |
| 103 | +static void rx71_pn544_nfc_disable(void) | |
| 104 | +{ | |
| 105 | + /* turn the power off */ | |
| 106 | +} | |
| 107 | + | |
| 108 | +static struct pn544_nfc_platform_data rx71_nfc_data = { | |
| 109 | + .request_resources = rx71_pn544_nfc_request_resources, | |
| 110 | + .free_resources = rx71_pn544_nfc_free_resources, | |
| 111 | + .enable = rx71_pn544_nfc_enable, | |
| 112 | + .test = rx71_pn544_nfc_test, | |
| 113 | + .disable = rx71_pn544_nfc_disable, | |
| 114 | +}; | |
| @@ -23,10 +23,10 @@ Once you have resolved the suspend/resume-related problems with your test system · 22 unmodified lines | ||
| 23 | 23 | without the new driver, you are ready to test it: |
| 24 | 24 | |
| 25 | 25 | a) Build the driver as a module, load it and try the test modes of hibernation |
| 26 | − (see: Documents/power/basic-pm-debugging.txt, 1). | |
| 26 | + (see: Documentation/power/basic-pm-debugging.txt, 1). | |
| 27 | 27 | |
| 28 | 28 | b) Load the driver and attempt to hibernate in the "reboot", "shutdown" and |
| 29 | − "platform" modes (see: Documents/power/basic-pm-debugging.txt, 1). | |
| 29 | + "platform" modes (see: Documentation/power/basic-pm-debugging.txt, 1). | |
| 30 | 30 | |
| 31 | 31 | c) Compile the driver directly into the kernel and try the test modes of |
| 32 | 32 | hibernation. |
| @@ -34,12 +34,12 @@ c) Compile the driver directly into the kernel and try the test modes of · 1 unmodified line | ||
| 34 | 34 | d) Attempt to hibernate with the driver compiled directly into the kernel |
| 35 | 35 | in the "reboot", "shutdown" and "platform" modes. |
| 36 | 36 | |
| 37 | −e) Try the test modes of suspend (see: Documents/power/basic-pm-debugging.txt, | |
| 37 | +e) Try the test modes of suspend (see: Documentation/power/basic-pm-debugging.txt, | |
| 38 | 38 | 2). [As far as the STR tests are concerned, it should not matter whether or |
| 39 | 39 | not the driver is built as a module.] |
| 40 | 40 | |
| 41 | 41 | f) Attempt to suspend to RAM using the s2ram tool with the driver loaded |
| 42 | − (see: Documents/power/basic-pm-debugging.txt, 2). | |
| 42 | + (see: Documentation/power/basic-pm-debugging.txt, 2). | |
| 43 | 43 | |
| 44 | 44 | Each of the above tests should be repeated several times and the STD tests |
| 45 | 45 | should be mixed with the STR tests. If any of them fails, the driver cannot be |
| @@ -50,6 +50,15 @@ type's callbacks are not defined) of given device. The bus type, device type · 49 unmodified lines | ||
| 50 | 50 | and device class callbacks are referred to as subsystem-level callbacks in what |
| 51 | 51 | follows. |
| 52 | 52 | |
| 53 | +By default, the callbacks are always invoked in process context with interrupts | |
| 54 | +enabled. However, subsystems can use the pm_runtime_irq_safe() helper function | |
| 55 | +to tell the PM core that a device's ->runtime_suspend() and ->runtime_resume() | |
| 56 | +callbacks should be invoked in atomic context with interrupts disabled | |
| 57 | +(->runtime_idle() is still invoked the default way). This implies that these | |
| 58 | +callback routines must not block or sleep, but it also means that the | |
| 59 | +synchronous helper functions listed at the end of Section 4 can be used within | |
| 60 | +an interrupt handler or in an atomic context. | |
| 61 | + | |
| 53 | 62 | The subsystem-level suspend callback is _entirely_ _responsible_ for handling |
| 54 | 63 | the suspend of the device as appropriate, which may, but need not include |
| 55 | 64 | executing the device driver's own ->runtime_suspend() callback (from the |
| @@ -237,6 +246,10 @@ defined in include/linux/pm.h: · 181 unmodified lines | ||
| 237 | 246 | Section 8); it may be modified only by the pm_runtime_no_callbacks() |
| 238 | 247 | helper function |
| 239 | 248 | |
| 249 | + unsigned int irq_safe; | |
| 250 | + - indicates that the ->runtime_suspend() and ->runtime_resume() callbacks | |
| 251 | + will be invoked with the spinlock held and interrupts disabled | |
| 252 | + | |
| 240 | 253 | unsigned int use_autosuspend; |
| 241 | 254 | - indicates that the device's driver supports delayed autosuspend (see |
| 242 | 255 | Section 9); it may be modified only by the |
| @@ -344,6 +357,10 @@ drivers/base/power/runtime.c and include/linux/pm_runtime.h: · 101 unmodified lines | ||
| 344 | 357 | - decrement the device's usage counter; if the result is 0 then run |
| 345 | 358 | pm_runtime_idle(dev) and return its result |
| 346 | 359 | |
| 360 | + int pm_runtime_put_sync_suspend(struct device *dev); | |
| 361 | + - decrement the device's usage counter; if the result is 0 then run | |
| 362 | + pm_runtime_suspend(dev) and return its result | |
| 363 | + | |
| 347 | 364 | int pm_runtime_put_sync_autosuspend(struct device *dev); |
| 348 | 365 | - decrement the device's usage counter; if the result is 0 then run |
| 349 | 366 | pm_runtime_autosuspend(dev) and return its result |
| @@ -397,6 +414,11 @@ drivers/base/power/runtime.c and include/linux/pm_runtime.h: · 47 unmodified lines | ||
| 397 | 414 | PM attributes from /sys/devices/.../power (or prevent them from being |
| 398 | 415 | added when the device is registered) |
| 399 | 416 | |
| 417 | + void pm_runtime_irq_safe(struct device *dev); | |
| 418 | + - set the power.irq_safe flag for the device, causing the runtime-PM | |
| 419 | + suspend and resume callbacks (but not the idle callback) to be invoked | |
| 420 | + with interrupts disabled | |
| 421 | + | |
| 400 | 422 | void pm_runtime_mark_last_busy(struct device *dev); |
| 401 | 423 | - set the power.last_busy field to the current time |
| 402 | 424 | |
| @@ -438,6 +460,15 @@ pm_runtime_suspended() · 35 unmodified lines | ||
| 438 | 460 | pm_runtime_mark_last_busy() |
| 439 | 461 | pm_runtime_autosuspend_expiration() |
| 440 | 462 | |
| 463 | +If pm_runtime_irq_safe() has been called for a device then the following helper | |
| 464 | +functions may also be used in interrupt context: | |
| 465 | + | |
| 466 | +pm_runtime_suspend() | |
| 467 | +pm_runtime_autosuspend() | |
| 468 | +pm_runtime_resume() | |
| 469 | +pm_runtime_get_sync() | |
| 470 | +pm_runtime_put_sync_suspend() | |
| 471 | + | |
| 441 | 472 | 5. Run-time PM Initialization, Device Probing and Removal |
| 442 | 473 | |
| 443 | 474 | Initially, the run-time PM is disabled for all devices, which means that the |
| @@ -170,3 +170,49 @@ and the run ppstest as follow: · 169 unmodified lines | ||
| 170 | 170 | |
| 171 | 171 | Please, note that to compile userland programs you need the file timepps.h |
| 172 | 172 | (see Documentation/pps/). |
| 173 | + | |
| 174 | + | |
| 175 | +Generators | |
| 176 | +---------- | |
| 177 | + | |
| 178 | +Sometimes one needs to be able not only to catch PPS signals but to produce | |
| 179 | +them also. For example, running a distributed simulation, which requires | |
| 180 | +computers' clock to be synchronized very tightly. One way to do this is to | |
| 181 | +invent some complicated hardware solutions but it may be neither necessary | |
| 182 | +nor affordable. The cheap way is to load a PPS generator on one of the | |
| 183 | +computers (master) and PPS clients on others (slaves), and use very simple | |
| 184 | +cables to deliver signals using parallel ports, for example. | |
| 185 | + | |
| 186 | +Parallel port cable pinout: | |
| 187 | +pin name master slave | |
| 188 | +1 STROBE *------ * | |
| 189 | +2 D0 * | * | |
| 190 | +3 D1 * | * | |
| 191 | +4 D2 * | * | |
| 192 | +5 D3 * | * | |
| 193 | +6 D4 * | * | |
| 194 | +7 D5 * | * | |
| 195 | +8 D6 * | * | |
| 196 | +9 D7 * | * | |
| 197 | +10 ACK * ------* | |
| 198 | +11 BUSY * * | |
| 199 | +12 PE * * | |
| 200 | +13 SEL * * | |
| 201 | +14 AUTOFD * * | |
| 202 | +15 ERROR * * | |
| 203 | +16 INIT * * | |
| 204 | +17 SELIN * * | |
| 205 | +18-25 GND *-----------* | |
| 206 | + | |
| 207 | +Please note that parallel port interrupt occurs only on high->low transition, | |
| 208 | +so it is used for PPS assert edge. PPS clear edge can be determined only | |
| 209 | +using polling in the interrupt handler which actually can be done way more | |
| 210 | +precisely because interrupt handling delays can be quite big and random. So | |
| 211 | +current parport PPS generator implementation (pps_gen_parport module) is | |
| 212 | +geared towards using the clear edge for time synchronization. | |
| 213 | + | |
| 214 | +Clear edge polling is done with disabled interrupts so it's better to select | |
| 215 | +delay between assert and clear edge as small as possible to reduce system | |
| 216 | +latencies. But if it is too small slave won't be able to capture clear edge | |
| 217 | +transition. The default of 30us should be good enough in most situations. | |
| 218 | +The delay can be selected using 'delay' pps_gen_parport module parameter. | |
| @@ -3,7 +3,7 @@ · 2 unmodified lines | ||
| 3 | 3 | sched-arch.txt |
| 4 | 4 | - CPU Scheduler implementation hints for architecture specific code. |
| 5 | 5 | sched-design-CFS.txt |
| 6 | − - goals, design and implementation of the Complete Fair Scheduler. | |
| 6 | + - goals, design and implementation of the Completely Fair Scheduler. | |
| 7 | 7 | sched-domains.txt |
| 8 | 8 | - information on scheduling domains. |
| 9 | 9 | sched-nice-design.txt |
| @@ -1,3 +1,7 @@ | ||
| 1 | +Version 15 of schedstats dropped counters for some sched_yield: | |
| 2 | +yld_exp_empty, yld_act_empty and yld_both_empty. Otherwise, it is | |
| 3 | +identical to version 14. | |
| 4 | + | |
| 1 | 5 | Version 14 of schedstats includes support for sched_domains, which hit the |
| 2 | 6 | mainline kernel in 2.6.20 although it is identical to the stats from version |
| 3 | 7 | 12 which was in the kernel from 2.6.13-2.6.19 (version 13 never saw a kernel |
| @@ -28,32 +32,25 @@ to write their own scripts, the fields are described here. · 24 unmodified lines | ||
| 28 | 32 | |
| 29 | 33 | CPU statistics |
| 30 | 34 | -------------- |
| 31 | −cpu<N> 1 2 3 4 5 6 7 8 9 10 11 12 | |
| 32 | − | |
| 33 | −NOTE: In the sched_yield() statistics, the active queue is considered empty | |
| 34 | − if it has only one process in it, since obviously the process calling | |
| 35 | − sched_yield() is that process. | |
| 35 | +cpu<N> 1 2 3 4 5 6 7 8 9 | |
| 36 | 36 | |
| 37 | −First four fields are sched_yield() statistics: | |
| 38 | − 1) # of times both the active and the expired queue were empty | |
| 39 | − 2) # of times just the active queue was empty | |
| 40 | − 3) # of times just the expired queue was empty | |
| 41 | − 4) # of times sched_yield() was called | |
| 37 | +First field is a sched_yield() statistic: | |
| 38 | + 1) # of times sched_yield() was called | |
| 42 | 39 | |
| 43 | 40 | Next three are schedule() statistics: |
| 44 | − 5) # of times we switched to the expired queue and reused it | |
| 45 | − 6) # of times schedule() was called | |
| 46 | − 7) # of times schedule() left the processor idle | |
| 41 | + 2) # of times we switched to the expired queue and reused it | |
| 42 | + 3) # of times schedule() was called | |
| 43 | + 4) # of times schedule() left the processor idle | |
| 47 | 44 | |
| 48 | 45 | Next two are try_to_wake_up() statistics: |
| 49 | − 8) # of times try_to_wake_up() was called | |
| 50 | − 9) # of times try_to_wake_up() was called to wake up the local cpu | |
| 46 | + 5) # of times try_to_wake_up() was called | |
| 47 | + 6) # of times try_to_wake_up() was called to wake up the local cpu | |
| 51 | 48 | |
| 52 | 49 | Next three are statistics describing scheduling latency: |
| 53 | − 10) sum of all time spent running by tasks on this processor (in jiffies) | |
| 54 | − 11) sum of all time spent waiting to run by tasks on this processor (in | |
| 50 | + 7) sum of all time spent running by tasks on this processor (in jiffies) | |
| 51 | + 8) sum of all time spent waiting to run by tasks on this processor (in | |
| 55 | 52 | jiffies) |
| 56 | − 12) # of timeslices run on this cpu | |
| 53 | + 9) # of timeslices run on this cpu | |
| 57 | 54 | |
| 58 | 55 | |
| 59 | 56 | Domain statistics |
| @@ -573,7 +573,7 @@ Changes from 20041018 to 20041123 · 572 unmodified lines | ||
| 573 | 573 | * Backround nodev_timeout processing to DPC This enables us to |
| 574 | 574 | unblock (stop dev_loss_tmo) when appopriate. |
| 575 | 575 | * Fix array discovery with multiple luns. The max_luns was 0 at |
| 576 | − the time the host structure was intialized. lpfc_cfg_params | |
| 576 | + the time the host structure was initialized. lpfc_cfg_params | |
| 577 | 577 | then set the max_luns to the correct value afterwards. |
| 578 | 578 | * Remove unused define LPFC_MAX_LUN and set the default value of |
| 579 | 579 | lpfc_max_lun parameter to 512. |
| @@ -1,3 +1,25 @@ | ||
| 1 | +Release Date : Tues. Dec 14, 2010 17:00:00 PST 2010 - | |
| 2 | + (emaild-id:megaraidlinux@lsi.com) | |
| 3 | + Adam Radford | |
| 4 | +Current Version : 00.00.05.29-rc1 | |
| 5 | +Old Version : 00.00.04.31-rc1 | |
| 6 | + 1. Rename megaraid_sas.c to megaraid_sas_base.c. | |
| 7 | + 2. Update GPL headers. | |
| 8 | + 3. Add MSI-X support and 'msix_disable' module parameter. | |
| 9 | + 4. Use lowest memory bar (for SR-IOV VF support). | |
| 10 | + 5. Add struct megasas_instance_temlate changes, and change all code to use | |
| 11 | + new instance entries: | |
| 12 | + | |
| 13 | + irqreturn_t (*service_isr )(int irq, void *devp); | |
| 14 | + void (*tasklet)(unsigned long); | |
| 15 | + u32 (*init_adapter)(struct megasas_instance *); | |
| 16 | + u32 (*build_and_issue_cmd) (struct megasas_instance *, | |
| 17 | + struct scsi_cmnd *); | |
| 18 | + void (*issue_dcmd) (struct megasas_instance *instance, | |
| 19 | + struct megasas_cmd *cmd); | |
| 20 | + | |
| 21 | + 6. Add code to support MegaRAID 9265/9285 controllers device id (0x5b). | |
| 22 | +------------------------------------------------------------------------------- | |
| 1 | 23 | 1 Release Date : Thur. May 03, 2010 09:12:45 PST 2009 - |
| 2 | 24 | (emaild-id:megaraidlinux@lsi.com) |
| 3 | 25 | Bo Yang |
| @@ -14,6 +14,8 @@ riscom8.txt · 13 unmodified lines | ||
| 14 | 14 | - notes on using the RISCom/8 multi-port serial driver. |
| 15 | 15 | rocket.txt |
| 16 | 16 | - info on the Comtrol RocketPort multiport serial driver. |
| 17 | +serial-rs485.txt | |
| 18 | + - info about RS485 structures and support in the kernel. | |
| 17 | 19 | specialix.txt |
| 18 | 20 | - info on hardware/driver for specialix IO8+ multiport serial card. |
| 19 | 21 | stallion.txt |
| @@ -0,0 +1,120 @@ | ||
| 1 | + RS485 SERIAL COMMUNICATIONS | |
| 2 | + | |
| 3 | +1. INTRODUCTION | |
| 4 | + | |
| 5 | + EIA-485, also known as TIA/EIA-485 or RS-485, is a standard defining the | |
| 6 | + electrical characteristics of drivers and receivers for use in balanced | |
| 7 | + digital multipoint systems. | |
| 8 | + This standard is widely used for communications in industrial automation | |
| 9 | + because it can be used effectively over long distances and in electrically | |
| 10 | + noisy environments. | |
| 11 | + | |
| 12 | +2. HARDWARE-RELATED CONSIDERATIONS | |
| 13 | + | |
| 14 | + Some CPUs/UARTs (e.g., Atmel AT91 or 16C950 UART) contain a built-in | |
| 15 | + half-duplex mode capable of automatically controlling line direction by | |
| 16 | + toggling RTS or DTR signals. That can be used to control external | |
| 17 | + half-duplex hardware like an RS485 transceiver or any RS232-connected | |
| 18 | + half-duplex devices like some modems. | |
| 19 | + | |
| 20 | + For these microcontrollers, the Linux driver should be made capable of | |
| 21 | + working in both modes, and proper ioctls (see later) should be made | |
| 22 | + available at user-level to allow switching from one mode to the other, and | |
| 23 | + vice versa. | |
| 24 | + | |
| 25 | +3. DATA STRUCTURES ALREADY AVAILABLE IN THE KERNEL | |
| 26 | + | |
| 27 | + The Linux kernel provides the serial_rs485 structure (see [1]) to handle | |
| 28 | + RS485 communications. This data structure is used to set and configure RS485 | |
| 29 | + parameters in the platform data and in ioctls. | |
| 30 | + | |
| 31 | + Any driver for devices capable of working both as RS232 and RS485 should | |
| 32 | + provide at least the following ioctls: | |
| 33 | + | |
| 34 | + - TIOCSRS485 (typically associated with number 0x542F). This ioctl is used | |
| 35 | + to enable/disable RS485 mode from user-space | |
| 36 | + | |
| 37 | + - TIOCGRS485 (typically associated with number 0x542E). This ioctl is used | |
| 38 | + to get RS485 mode from kernel-space (i.e., driver) to user-space. | |
| 39 | + | |
| 40 | + In other words, the serial driver should contain a code similar to the next | |
| 41 | + one: | |
| 42 | + | |
| 43 | + static struct uart_ops atmel_pops = { | |
| 44 | + /* ... */ | |
| 45 | + .ioctl = handle_ioctl, | |
| 46 | + }; | |
| 47 | + | |
| 48 | + static int handle_ioctl(struct uart_port *port, | |
| 49 | + unsigned int cmd, | |
| 50 | + unsigned long arg) | |
| 51 | + { | |
| 52 | + struct serial_rs485 rs485conf; | |
| 53 | + | |
| 54 | + switch (cmd) { | |
| 55 | + case TIOCSRS485: | |
| 56 | + if (copy_from_user(&rs485conf, | |
| 57 | + (struct serial_rs485 *) arg, | |
| 58 | + sizeof(rs485conf))) | |
| 59 | + return -EFAULT; | |
| 60 | + | |
| 61 | + /* ... */ | |
| 62 | + break; | |
| 63 | + | |
| 64 | + case TIOCGRS485: | |
| 65 | + if (copy_to_user((struct serial_rs485 *) arg, | |
| 66 | + ..., | |
| 67 | + sizeof(rs485conf))) | |
| 68 | + return -EFAULT; | |
| 69 | + /* ... */ | |
| 70 | + break; | |
| 71 | + | |
| 72 | + /* ... */ | |
| 73 | + } | |
| 74 | + } | |
| 75 | + | |
| 76 | + | |
| 77 | +4. USAGE FROM USER-LEVEL | |
| 78 | + | |
| 79 | + From user-level, RS485 configuration can be get/set using the previous | |
| 80 | + ioctls. For instance, to set RS485 you can use the following code: | |
| 81 | + | |
| 82 | + #include <linux/serial.h> | |
| 83 | + | |
| 84 | + /* Driver-specific ioctls: */ | |
| 85 | + #define TIOCGRS485 0x542E | |
| 86 | + #define TIOCSRS485 0x542F | |
| 87 | + | |
| 88 | + /* Open your specific device (e.g., /dev/mydevice): */ | |
| 89 | + int fd = open ("/dev/mydevice", O_RDWR); | |
| 90 | + if (fd < 0) { | |
| 91 | + /* Error handling. See errno. */ | |
| 92 | + } | |
| 93 | + | |
| 94 | + struct serial_rs485 rs485conf; | |
| 95 | + | |
| 96 | + /* Set RS485 mode: */ | |
| 97 | + rs485conf.flags |= SER_RS485_ENABLED; | |
| 98 | + | |
| 99 | + /* Set rts delay before send, if needed: */ | |
| 100 | + rs485conf.flags |= SER_RS485_RTS_BEFORE_SEND; | |
| 101 | + rs485conf.delay_rts_before_send = ...; | |
| 102 | + | |
| 103 | + /* Set rts delay after send, if needed: */ | |
| 104 | + rs485conf.flags |= SER_RS485_RTS_AFTER_SEND; | |
| 105 | + rs485conf.delay_rts_after_send = ...; | |
| 106 | + | |
| 107 | + if (ioctl (fd, TIOCSRS485, &rs485conf) < 0) { | |
| 108 | + /* Error handling. See errno. */ | |
| 109 | + } | |
| 110 | + | |
| 111 | + /* Use read() and write() syscalls here... */ | |
| 112 | + | |
| 113 | + /* Close the device when finished: */ | |
| 114 | + if (close (fd) < 0) { | |
| 115 | + /* Error handling. See errno. */ | |
| 116 | + } | |
| 117 | + | |
| 118 | +5. REFERENCES | |
| 119 | + | |
| 120 | + [1] include/linux/serial.h | |
| @@ -107,7 +107,7 @@ write_wakeup() - May be called at any point between open and close. · 106 unmodified lines | ||
| 107 | 107 | |
| 108 | 108 | dcd_change() - Report to the tty line the current DCD pin status |
| 109 | 109 | changes and the relative timestamp. The timestamp |
| 110 | − can be NULL. | |
| 110 | + cannot be NULL. | |
| 111 | 111 | |
| 112 | 112 | |
| 113 | 113 | Driver Access |
| @@ -974,13 +974,6 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed. · 973 unmodified lines | ||
| 974 | 974 | |
| 975 | 975 | See hdspm.txt for details. |
| 976 | 976 | |
| 977 | − Module snd-hifier | |
| 978 | − ----------------- | |
| 979 | − | |
| 980 | − Module for the MediaTek/TempoTec HiFier Fantasia sound card. | |
| 981 | − | |
| 982 | − This module supports autoprobe and multiple cards. | |
| 983 | − | |
| 984 | 977 | Module snd-ice1712 |
| 985 | 978 | ------------------ |
| 986 | 979 | |
| @@ -1531,15 +1524,20 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed. · 544 unmodified lines | ||
| 1531 | 1524 | Module snd-oxygen |
| 1532 | 1525 | ----------------- |
| 1533 | 1526 | |
| 1534 | − Module for sound cards based on the C-Media CMI8788 chip: | |
| 1527 | + Module for sound cards based on the C-Media CMI8786/8787/8788 chip: | |
| 1535 | 1528 | * Asound A-8788 |
| 1529 | + * Asus Xonar DG | |
| 1536 | 1530 | * AuzenTech X-Meridian |
| 1531 | + * AuzenTech X-Meridian 2G | |
| 1537 | 1532 | * Bgears b-Enspirer |
| 1538 | 1533 | * Club3D Theatron DTS |
| 1539 | 1534 | * HT-Omega Claro (plus) |
| 1540 | 1535 | * HT-Omega Claro halo (XT) |
| 1536 | + * Kuroutoshikou CMI8787-HG2PCI | |
| 1541 | 1537 | * Razer Barracuda AC-1 |
| 1542 | 1538 | * Sondigo Inferno |
| 1539 | + * TempoTec HiFier Fantasia | |
| 1540 | + * TempoTec HiFier Serenade | |
| 1543 | 1541 | |
| 1544 | 1542 | This module supports autoprobe and multiple cards. |
| 1545 | 1543 | |
| @@ -2006,9 +2004,9 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed. · 460 unmodified lines | ||
| 2006 | 2004 | Module snd-virtuoso |
| 2007 | 2005 | ------------------- |
| 2008 | 2006 | |
| 2009 | − Module for sound cards based on the Asus AV100/AV200 chips, | |
| 2010 | − i.e., Xonar D1, DX, D2, D2X, DS, HDAV1.3 (Deluxe), Essence ST | |
| 2011 | − (Deluxe) and Essence STX. | |
| 2007 | + Module for sound cards based on the Asus AV66/AV100/AV200 chips, | |
| 2008 | + i.e., Xonar D1, DX, D2, D2X, DS, Essence ST (Deluxe), Essence STX, | |
| 2009 | + HDAV1.3 (Deluxe), and HDAV1.3 Slim. | |
| 2012 | 2010 | |
| 2013 | 2011 | This module supports autoprobe and multiple cards. |
| 2014 | 2012 | |
| @@ -149,7 +149,6 @@ ALC882/883/885/888/889 · 148 unmodified lines | ||
| 149 | 149 | acer-aspire-7730g Acer Aspire 7730G |
| 150 | 150 | acer-aspire-8930g Acer Aspire 8930G |
| 151 | 151 | medion Medion Laptops |
| 152 | − medion-md2 Medion MD2 | |
| 153 | 152 | targa-dig Targa/MSI |
| 154 | 153 | targa-2ch-dig Targa/MSI with 2-channel |
| 155 | 154 | targa-8ch-dig Targa/MSI with 8-channel (MSI GX620) |
| @@ -297,6 +296,7 @@ Conexant 5066 · 141 unmodified lines | ||
| 297 | 296 | ============= |
| 298 | 297 | laptop Basic Laptop config (default) |
| 299 | 298 | hp-laptop HP laptops, e g G60 |
| 299 | + asus Asus K52JU, Lenovo G560 | |
| 300 | 300 | dell-laptop Dell laptops |
| 301 | 301 | dell-vostro Dell Vostro |
| 302 | 302 | olpc-xo-1_5 OLPC XO 1.5 |
| @@ -27,42 +27,38 @@ ASoC Codec driver breakdown · 26 unmodified lines | ||
| 27 | 27 | |
| 28 | 28 | 1 - Codec DAI and PCM configuration |
| 29 | 29 | ----------------------------------- |
| 30 | −Each codec driver must have a struct snd_soc_codec_dai to define its DAI and | |
| 30 | +Each codec driver must have a struct snd_soc_dai_driver to define its DAI and | |
| 31 | 31 | PCM capabilities and operations. This struct is exported so that it can be |
| 32 | 32 | registered with the core by your machine driver. |
| 33 | 33 | |
| 34 | 34 | e.g. |
| 35 | 35 | |
| 36 | −struct snd_soc_codec_dai wm8731_dai = { | |
| 37 | − .name = "WM8731", | |
| 38 | − /* playback capabilities */ | |
| 36 | +static struct snd_soc_dai_ops wm8731_dai_ops = { | |
| 37 | + .prepare = wm8731_pcm_prepare, | |
| 38 | + .hw_params = wm8731_hw_params, | |
| 39 | + .shutdown = wm8731_shutdown, | |
| 40 | + .digital_mute = wm8731_mute, | |
| 41 | + .set_sysclk = wm8731_set_dai_sysclk, | |
| 42 | + .set_fmt = wm8731_set_dai_fmt, | |
| 43 | +}; | |
| 44 | + | |
| 45 | +struct snd_soc_dai_driver wm8731_dai = { | |
| 46 | + .name = "wm8731-hifi", | |
| 39 | 47 | .playback = { |
| 40 | 48 | .stream_name = "Playback", |
| 41 | 49 | .channels_min = 1, |
| 42 | 50 | .channels_max = 2, |
| 43 | 51 | .rates = WM8731_RATES, |
| 44 | 52 | .formats = WM8731_FORMATS,}, |
| 45 | − /* capture capabilities */ | |
| 46 | 53 | .capture = { |
| 47 | 54 | .stream_name = "Capture", |
| 48 | 55 | .channels_min = 1, |
| 49 | 56 | .channels_max = 2, |
| 50 | 57 | .rates = WM8731_RATES, |
| 51 | 58 | .formats = WM8731_FORMATS,}, |
| 52 | − /* pcm operations - see section 4 below */ | |
| 53 | − .ops = { | |
| 54 | − .prepare = wm8731_pcm_prepare, | |
| 55 | − .hw_params = wm8731_hw_params, | |
| 56 | − .shutdown = wm8731_shutdown, | |
| 57 | − }, | |
| 58 | − /* DAI operations - see DAI.txt */ | |
| 59 | − .dai_ops = { | |
| 60 | − .digital_mute = wm8731_mute, | |
| 61 | − .set_sysclk = wm8731_set_dai_sysclk, | |
| 62 | − .set_fmt = wm8731_set_dai_fmt, | |
| 63 | − } | |
| 59 | + .ops = &wm8731_dai_ops, | |
| 60 | + .symmetric_rates = 1, | |
| 64 | 61 | }; |
| 65 | −EXPORT_SYMBOL_GPL(wm8731_dai); | |
| 66 | 62 | |
| 67 | 63 | |
| 68 | 64 | 2 - Codec control IO |
| @@ -186,13 +182,14 @@ when the mute is applied or freed. · 117 unmodified lines | ||
| 186 | 182 | |
| 187 | 183 | i.e. |
| 188 | 184 | |
| 189 | −static int wm8974_mute(struct snd_soc_codec *codec, | |
| 190 | − struct snd_soc_codec_dai *dai, int mute) | |
| 185 | +static int wm8974_mute(struct snd_soc_dai *dai, int mute) | |
| 191 | 186 | { |
| 192 | − u16 mute_reg = wm8974_read_reg_cache(codec, WM8974_DAC) & 0xffbf; | |
| 193 | − if(mute) | |
| 194 | − wm8974_write(codec, WM8974_DAC, mute_reg | 0x40); | |
| 187 | + struct snd_soc_codec *codec = dai->codec; | |
| 188 | + u16 mute_reg = snd_soc_read(codec, WM8974_DAC) & 0xffbf; | |
| 189 | + | |
| 190 | + if (mute) | |
| 191 | + snd_soc_write(codec, WM8974_DAC, mute_reg | 0x40); | |
| 195 | 192 | else |
| 196 | − wm8974_write(codec, WM8974_DAC, mute_reg); | |
| 193 | + snd_soc_write(codec, WM8974_DAC, mute_reg); | |
| 197 | 194 | return 0; |
| 198 | 195 | } |
| @@ -12,6 +12,8 @@ the following struct:- · 11 unmodified lines | ||
| 12 | 12 | struct snd_soc_card { |
| 13 | 13 | char *name; |
| 14 | 14 | |
| 15 | + ... | |
| 16 | + | |
| 15 | 17 | int (*probe)(struct platform_device *pdev); |
| 16 | 18 | int (*remove)(struct platform_device *pdev); |
| 17 | 19 | |
| @@ -22,12 +24,13 @@ struct snd_soc_card { · 4 unmodified lines | ||
| 22 | 24 | int (*resume_pre)(struct platform_device *pdev); |
| 23 | 25 | int (*resume_post)(struct platform_device *pdev); |
| 24 | 26 | |
| 25 | − /* machine stream operations */ | |
| 26 | − struct snd_soc_ops *ops; | |
| 27 | + ... | |
| 27 | 28 | |
| 28 | 29 | /* CPU <--> Codec DAI links */ |
| 29 | 30 | struct snd_soc_dai_link *dai_link; |
| 30 | 31 | int num_links; |
| 32 | + | |
| 33 | + ... | |
| 31 | 34 | }; |
| 32 | 35 | |
| 33 | 36 | probe()/remove() |
| @@ -42,11 +45,6 @@ of any machine audio tasks that have to be done before or after the codec, DAIs · 8 unmodified lines | ||
| 42 | 45 | and DMA is suspended and resumed. Optional. |
| 43 | 46 | |
| 44 | 47 | |
| 45 | −Machine operations | |
| 46 | −------------------ | |
| 47 | −The machine specific audio operations can be set here. Again this is optional. | |
| 48 | − | |
| 49 | − | |
| 50 | 48 | Machine DAI Configuration |
| 51 | 49 | ------------------------- |
| 52 | 50 | The machine DAI configuration glues all the codec and CPU DAIs together. It can |
| @@ -61,8 +59,10 @@ struct snd_soc_dai_link is used to set up each DAI in your machine. e.g. · 8 unmodified lines | ||
| 61 | 59 | static struct snd_soc_dai_link corgi_dai = { |
| 62 | 60 | .name = "WM8731", |
| 63 | 61 | .stream_name = "WM8731", |
| 64 | − .cpu_dai = &pxa_i2s_dai, | |
| 65 | − .codec_dai = &wm8731_dai, | |
| 62 | + .cpu_dai_name = "pxa-is2-dai", | |
| 63 | + .codec_dai_name = "wm8731-hifi", | |
| 64 | + .platform_name = "pxa-pcm-audio", | |
| 65 | + .codec_name = "wm8713-codec.0-001a", | |
| 66 | 66 | .init = corgi_wm8731_init, |
| 67 | 67 | .ops = &corgi_ops, |
| 68 | 68 | }; |
| @@ -77,26 +77,6 @@ static struct snd_soc_card snd_soc_corgi = { · 8 unmodified lines | ||
| 77 | 77 | }; |
| 78 | 78 | |
| 79 | 79 | |
| 80 | −Machine Audio Subsystem | |
| 81 | −----------------------- | |
| 82 | − | |
| 83 | −The machine soc device glues the platform, machine and codec driver together. | |
| 84 | −Private data can also be set here. e.g. | |
| 85 | − | |
| 86 | −/* corgi audio private data */ | |
| 87 | −static struct wm8731_setup_data corgi_wm8731_setup = { | |
| 88 | − .i2c_address = 0x1b, | |
| 89 | −}; | |
| 90 | − | |
| 91 | −/* corgi audio subsystem */ | |
| 92 | −static struct snd_soc_device corgi_snd_devdata = { | |
| 93 | − .machine = &snd_soc_corgi, | |
| 94 | − .platform = &pxa2xx_soc_platform, | |
| 95 | − .codec_dev = &soc_codec_dev_wm8731, | |
| 96 | − .codec_data = &corgi_wm8731_setup, | |
| 97 | −}; | |
| 98 | − | |
| 99 | − | |
| 100 | 80 | Machine Power Map |
| 101 | 81 | ----------------- |
| 102 | 82 | |
| @@ -20,9 +20,10 @@ struct snd_soc_ops { · 19 unmodified lines | ||
| 20 | 20 | int (*trigger)(struct snd_pcm_substream *, int); |
| 21 | 21 | }; |
| 22 | 22 | |
| 23 | −The platform driver exports its DMA functionality via struct snd_soc_platform:- | |
| 23 | +The platform driver exports its DMA functionality via struct | |
| 24 | +snd_soc_platform_driver:- | |
| 24 | 25 | |
| 25 | −struct snd_soc_platform { | |
| 26 | +struct snd_soc_platform_driver { | |
| 26 | 27 | char *name; |
| 27 | 28 | |
| 28 | 29 | int (*probe)(struct platform_device *pdev); |
| @@ -34,6 +35,13 @@ struct snd_soc_platform { · 5 unmodified lines | ||
| 34 | 35 | int (*pcm_new)(struct snd_card *, struct snd_soc_codec_dai *, struct snd_pcm *); |
| 35 | 36 | void (*pcm_free)(struct snd_pcm *); |
| 36 | 37 | |
| 38 | + /* | |
| 39 | + * For platform caused delay reporting. | |
| 40 | + * Optional. | |
| 41 | + */ | |
| 42 | + snd_pcm_sframes_t (*delay)(struct snd_pcm_substream *, | |
| 43 | + struct snd_soc_dai *); | |
| 44 | + | |
| 37 | 45 | /* platform stream ops */ |
| 38 | 46 | struct snd_pcm_ops *pcm_ops; |
| 39 | 47 | }; |
| @@ -19,7 +19,7 @@ Declaring PXA2xx Master Controllers · 18 unmodified lines | ||
| 19 | 19 | ----------------------------------- |
| 20 | 20 | Typically a SPI master is defined in the arch/.../mach-*/board-*.c as a |
| 21 | 21 | "platform device". The master configuration is passed to the driver via a table |
| 22 | −found in arch/arm/mach-pxa/include/mach/pxa2xx_spi.h: | |
| 22 | +found in include/linux/spi/pxa2xx_spi.h: | |
| 23 | 23 | |
| 24 | 24 | struct pxa2xx_spi_master { |
| 25 | 25 | enum pxa_ssp_type ssp_type; |
| @@ -94,7 +94,7 @@ using the "spi_board_info" structure found in "linux/spi/spi.h". See · 68 unmodified lines | ||
| 94 | 94 | |
| 95 | 95 | Each slave device attached to the PXA must provide slave specific configuration |
| 96 | 96 | information via the structure "pxa2xx_spi_chip" found in |
| 97 | −"arch/arm/mach-pxa/include/mach/pxa2xx_spi.h". The pxa2xx_spi master controller driver | |
| 97 | +"include/linux/spi/pxa2xx_spi.h". The pxa2xx_spi master controller driver | |
| 98 | 98 | will uses the configuration whenever the driver communicates with the slave |
| 99 | 99 | device. All fields are optional. |
| 100 | 100 | |
| @@ -4,8 +4,6 @@ README · 3 unmodified lines | ||
| 4 | 4 | - general information about /proc/sys/ sysctl files. |
| 5 | 5 | abi.txt |
| 6 | 6 | - documentation for /proc/sys/abi/*. |
| 7 | −ctl_unnumbered.txt | |
| 8 | − - explanation of why one should not add new binary sysctl numbers. | |
| 9 | 7 | fs.txt |
| 10 | 8 | - documentation for /proc/sys/fs/*. |
| 11 | 9 | kernel.txt |
| @@ -34,6 +34,7 @@ show up in /proc/sys/kernel: · 33 unmodified lines | ||
| 34 | 34 | - hotplug |
| 35 | 35 | - java-appletviewer [ binfmt_java, obsolete ] |
| 36 | 36 | - java-interpreter [ binfmt_java, obsolete ] |
| 37 | +- kptr_restrict | |
| 37 | 38 | - kstack_depth_to_print [ X86 only ] |
| 38 | 39 | - l2cr [ PPC only ] |
| 39 | 40 | - modprobe ==> Documentation/debugging-modules.txt |
| @@ -219,7 +220,7 @@ dmesg_restrict: · 179 unmodified lines | ||
| 219 | 220 | This toggle indicates whether unprivileged users are prevented from using |
| 220 | 221 | dmesg(8) to view messages from the kernel's log buffer. When |
| 221 | 222 | dmesg_restrict is set to (0) there are no restrictions. When |
| 222 | −dmesg_restrict is set set to (1), users must have CAP_SYS_ADMIN to use | |
| 223 | +dmesg_restrict is set set to (1), users must have CAP_SYSLOG to use | |
| 223 | 224 | dmesg(8). |
| 224 | 225 | |
| 225 | 226 | The kernel config option CONFIG_SECURITY_DMESG_RESTRICT sets the default |
| @@ -261,6 +262,19 @@ This flag controls the L2 cache of G3 processor boards. If · 35 unmodified lines | ||
| 261 | 262 | |
| 262 | 263 | ============================================================== |
| 263 | 264 | |
| 265 | +kptr_restrict: | |
| 266 | + | |
| 267 | +This toggle indicates whether restrictions are placed on | |
| 268 | +exposing kernel addresses via /proc and other interfaces. When | |
| 269 | +kptr_restrict is set to (0), there are no restrictions. When | |
| 270 | +kptr_restrict is set to (1), the default, kernel pointers | |
| 271 | +printed using the %pK format specifier will be replaced with 0's | |
| 272 | +unless the user has CAP_SYSLOG. When kptr_restrict is set to | |
| 273 | +(2), kernel pointers printed using %pK will be replaced with 0's | |
| 274 | +regardless of privileges. | |
| 275 | + | |
| 276 | +============================================================== | |
| 277 | + | |
| 264 | 278 | kstack_depth_to_print: (X86 only) |
| 265 | 279 | |
| 266 | 280 | Controls the number of words to print when dumping the raw |
| @@ -0,0 +1,1094 @@ | ||
| 1 | +#!/usr/bin/python | |
| 2 | +# The TCM v4 multi-protocol fabric module generation script for drivers/target/$NEW_MOD | |
| 3 | +# | |
| 4 | +# Copyright (c) 2010 Rising Tide Systems | |
| 5 | +# Copyright (c) 2010 Linux-iSCSI.org | |
| 6 | +# | |
| 7 | +# Author: nab@kernel.org | |
| 8 | +# | |
| 9 | +import os, sys | |
| 10 | +import subprocess as sub | |
| 11 | +import string | |
| 12 | +import re | |
| 13 | +import optparse | |
| 14 | + | |
| 15 | +tcm_dir = "" | |
| 16 | + | |
| 17 | +fabric_ops = [] | |
| 18 | +fabric_mod_dir = "" | |
| 19 | +fabric_mod_port = "" | |
| 20 | +fabric_mod_init_port = "" | |
| 21 | + | |
| 22 | +def tcm_mod_err(msg): | |
| 23 | + print msg | |
| 24 | + sys.exit(1) | |
| 25 | + | |
| 26 | +def tcm_mod_create_module_subdir(fabric_mod_dir_var): | |
| 27 | + | |
| 28 | + if os.path.isdir(fabric_mod_dir_var) == True: | |
| 29 | + return 1 | |
| 30 | + | |
| 31 | + print "Creating fabric_mod_dir: " + fabric_mod_dir_var | |
| 32 | + ret = os.mkdir(fabric_mod_dir_var) | |
| 33 | + if ret: | |
| 34 | + tcm_mod_err("Unable to mkdir " + fabric_mod_dir_var) | |
| 35 | + | |
| 36 | + return | |
| 37 | + | |
| 38 | +def tcm_mod_build_FC_include(fabric_mod_dir_var, fabric_mod_name): | |
| 39 | + global fabric_mod_port | |
| 40 | + global fabric_mod_init_port | |
| 41 | + buf = "" | |
| 42 | + | |
| 43 | + f = fabric_mod_dir_var + "/" + fabric_mod_name + "_base.h" | |
| 44 | + print "Writing file: " + f | |
| 45 | + | |
| 46 | + p = open(f, 'w'); | |
| 47 | + if not p: | |
| 48 | + tcm_mod_err("Unable to open file: " + f) | |
| 49 | + | |
| 50 | + buf = "#define " + fabric_mod_name.upper() + "_VERSION \"v0.1\"\n" | |
| 51 | + buf += "#define " + fabric_mod_name.upper() + "_NAMELEN 32\n" | |
| 52 | + buf += "\n" | |
| 53 | + buf += "struct " + fabric_mod_name + "_nacl {\n" | |
| 54 | + buf += " /* Binary World Wide unique Port Name for FC Initiator Nport */\n" | |
| 55 | + buf += " u64 nport_wwpn;\n" | |
| 56 | + buf += " /* ASCII formatted WWPN for FC Initiator Nport */\n" | |
| 57 | + buf += " char nport_name[" + fabric_mod_name.upper() + "_NAMELEN];\n" | |
| 58 | + buf += " /* Returned by " + fabric_mod_name + "_make_nodeacl() */\n" | |
| 59 | + buf += " struct se_node_acl se_node_acl;\n" | |
| 60 | + buf += "};\n" | |
| 61 | + buf += "\n" | |
| 62 | + buf += "struct " + fabric_mod_name + "_tpg {\n" | |
| 63 | + buf += " /* FC lport target portal group tag for TCM */\n" | |
| 64 | + buf += " u16 lport_tpgt;\n" | |
| 65 | + buf += " /* Pointer back to " + fabric_mod_name + "_lport */\n" | |
| 66 | + buf += " struct " + fabric_mod_name + "_lport *lport;\n" | |
| 67 | + buf += " /* Returned by " + fabric_mod_name + "_make_tpg() */\n" | |
| 68 | + buf += " struct se_portal_group se_tpg;\n" | |
| 69 | + buf += "};\n" | |
| 70 | + buf += "\n" | |
| 71 | + buf += "struct " + fabric_mod_name + "_lport {\n" | |
| 72 | + buf += " /* SCSI protocol the lport is providing */\n" | |
| 73 | + buf += " u8 lport_proto_id;\n" | |
| 74 | + buf += " /* Binary World Wide unique Port Name for FC Target Lport */\n" | |
| 75 | + buf += " u64 lport_wwpn;\n" | |
| 76 | + buf += " /* ASCII formatted WWPN for FC Target Lport */\n" | |
| 77 | + buf += " char lport_name[" + fabric_mod_name.upper() + "_NAMELEN];\n" | |
| 78 | + buf += " /* Returned by " + fabric_mod_name + "_make_lport() */\n" | |
| 79 | + buf += " struct se_wwn lport_wwn;\n" | |
| 80 | + buf += "};\n" | |
| 81 | + | |
| 82 | + ret = p.write(buf) | |
| 83 | + if ret: | |
| 84 | + tcm_mod_err("Unable to write f: " + f) | |
| 85 | + | |
| 86 | + p.close() | |
| 87 | + | |
| 88 | + fabric_mod_port = "lport" | |
| 89 | + fabric_mod_init_port = "nport" | |
| 90 | + | |
| 91 | + return | |
| 92 | + | |
| 93 | +def tcm_mod_build_SAS_include(fabric_mod_dir_var, fabric_mod_name): | |
| 94 | + global fabric_mod_port | |
| 95 | + global fabric_mod_init_port | |
| 96 | + buf = "" | |
| 97 | + | |
| 98 | + f = fabric_mod_dir_var + "/" + fabric_mod_name + "_base.h" | |
| 99 | + print "Writing file: " + f | |
| 100 | + | |
| 101 | + p = open(f, 'w'); | |
| 102 | + if not p: | |
| 103 | + tcm_mod_err("Unable to open file: " + f) | |
| 104 | + | |
| 105 | + buf = "#define " + fabric_mod_name.upper() + "_VERSION \"v0.1\"\n" | |
| 106 | + buf += "#define " + fabric_mod_name.upper() + "_NAMELEN 32\n" | |
| 107 | + buf += "\n" | |
| 108 | + buf += "struct " + fabric_mod_name + "_nacl {\n" | |
| 109 | + buf += " /* Binary World Wide unique Port Name for SAS Initiator port */\n" | |
| 110 | + buf += " u64 iport_wwpn;\n" | |
| 111 | + buf += " /* ASCII formatted WWPN for Sas Initiator port */\n" | |
| 112 | + buf += " char iport_name[" + fabric_mod_name.upper() + "_NAMELEN];\n" | |
| 113 | + buf += " /* Returned by " + fabric_mod_name + "_make_nodeacl() */\n" | |
| 114 | + buf += " struct se_node_acl se_node_acl;\n" | |
| 115 | + buf += "};\n\n" | |
| 116 | + buf += "struct " + fabric_mod_name + "_tpg {\n" | |
| 117 | + buf += " /* SAS port target portal group tag for TCM */\n" | |
| 118 | + buf += " u16 tport_tpgt;\n" | |
| 119 | + buf += " /* Pointer back to " + fabric_mod_name + "_tport */\n" | |
| 120 | + buf += " struct " + fabric_mod_name + "_tport *tport;\n" | |
| 121 | + buf += " /* Returned by " + fabric_mod_name + "_make_tpg() */\n" | |
| 122 | + buf += " struct se_portal_group se_tpg;\n" | |
| 123 | + buf += "};\n\n" | |
| 124 | + buf += "struct " + fabric_mod_name + "_tport {\n" | |
| 125 | + buf += " /* SCSI protocol the tport is providing */\n" | |
| 126 | + buf += " u8 tport_proto_id;\n" | |
| 127 | + buf += " /* Binary World Wide unique Port Name for SAS Target port */\n" | |
| 128 | + buf += " u64 tport_wwpn;\n" | |
| 129 | + buf += " /* ASCII formatted WWPN for SAS Target port */\n" | |
| 130 | + buf += " char tport_name[" + fabric_mod_name.upper() + "_NAMELEN];\n" | |
| 131 | + buf += " /* Returned by " + fabric_mod_name + "_make_tport() */\n" | |
| 132 | + buf += " struct se_wwn tport_wwn;\n" | |
| 133 | + buf += "};\n" | |
| 134 | + | |
| 135 | + ret = p.write(buf) | |
| 136 | + if ret: | |
| 137 | + tcm_mod_err("Unable to write f: " + f) | |
| 138 | + | |
| 139 | + p.close() | |
| 140 | + | |
| 141 | + fabric_mod_port = "tport" | |
| 142 | + fabric_mod_init_port = "iport" | |
| 143 | + | |
| 144 | + return | |
| 145 | + | |
| 146 | +def tcm_mod_build_iSCSI_include(fabric_mod_dir_var, fabric_mod_name): | |
| 147 | + global fabric_mod_port | |
| 148 | + global fabric_mod_init_port | |
| 149 | + buf = "" | |
| 150 | + | |
| 151 | + f = fabric_mod_dir_var + "/" + fabric_mod_name + "_base.h" | |
| 152 | + print "Writing file: " + f | |
| 153 | + | |
| 154 | + p = open(f, 'w'); | |
| 155 | + if not p: | |
| 156 | + tcm_mod_err("Unable to open file: " + f) | |
| 157 | + | |
| 158 | + buf = "#define " + fabric_mod_name.upper() + "_VERSION \"v0.1\"\n" | |
| 159 | + buf += "#define " + fabric_mod_name.upper() + "_NAMELEN 32\n" | |
| 160 | + buf += "\n" | |
| 161 | + buf += "struct " + fabric_mod_name + "_nacl {\n" | |
| 162 | + buf += " /* ASCII formatted InitiatorName */\n" | |
| 163 | + buf += " char iport_name[" + fabric_mod_name.upper() + "_NAMELEN];\n" | |
| 164 | + buf += " /* Returned by " + fabric_mod_name + "_make_nodeacl() */\n" | |
| 165 | + buf += " struct se_node_acl se_node_acl;\n" | |
| 166 | + buf += "};\n\n" | |
| 167 | + buf += "struct " + fabric_mod_name + "_tpg {\n" | |
| 168 | + buf += " /* iSCSI target portal group tag for TCM */\n" | |
| 169 | + buf += " u16 tport_tpgt;\n" | |
| 170 | + buf += " /* Pointer back to " + fabric_mod_name + "_tport */\n" | |
| 171 | + buf += " struct " + fabric_mod_name + "_tport *tport;\n" | |
| 172 | + buf += " /* Returned by " + fabric_mod_name + "_make_tpg() */\n" | |
| 173 | + buf += " struct se_portal_group se_tpg;\n" | |
| 174 | + buf += "};\n\n" | |
| 175 | + buf += "struct " + fabric_mod_name + "_tport {\n" | |
| 176 | + buf += " /* SCSI protocol the tport is providing */\n" | |
| 177 | + buf += " u8 tport_proto_id;\n" | |
| 178 | + buf += " /* ASCII formatted TargetName for IQN */\n" | |
| 179 | + buf += " char tport_name[" + fabric_mod_name.upper() + "_NAMELEN];\n" | |
| 180 | + buf += " /* Returned by " + fabric_mod_name + "_make_tport() */\n" | |
| 181 | + buf += " struct se_wwn tport_wwn;\n" | |
| 182 | + buf += "};\n" | |
| 183 | + | |
| 184 | + ret = p.write(buf) | |
| 185 | + if ret: | |
| 186 | + tcm_mod_err("Unable to write f: " + f) | |
| 187 | + | |
| 188 | + p.close() | |
| 189 | + | |
| 190 | + fabric_mod_port = "tport" | |
| 191 | + fabric_mod_init_port = "iport" | |
| 192 | + | |
| 193 | + return | |
| 194 | + | |
| 195 | +def tcm_mod_build_base_includes(proto_ident, fabric_mod_dir_val, fabric_mod_name): | |
| 196 | + | |
| 197 | + if proto_ident == "FC": | |
| 198 | + tcm_mod_build_FC_include(fabric_mod_dir_val, fabric_mod_name) | |
| 199 | + elif proto_ident == "SAS": | |
| 200 | + tcm_mod_build_SAS_include(fabric_mod_dir_val, fabric_mod_name) | |
| 201 | + elif proto_ident == "iSCSI": | |
| 202 | + tcm_mod_build_iSCSI_include(fabric_mod_dir_val, fabric_mod_name) | |
| 203 | + else: | |
| 204 | + print "Unsupported proto_ident: " + proto_ident | |
| 205 | + sys.exit(1) | |
| 206 | + | |
| 207 | + return | |
| 208 | + | |
| 209 | +def tcm_mod_build_configfs(proto_ident, fabric_mod_dir_var, fabric_mod_name): | |
| 210 | + buf = "" | |
| 211 | + | |
| 212 | + f = fabric_mod_dir_var + "/" + fabric_mod_name + "_configfs.c" | |
| 213 | + print "Writing file: " + f | |
| 214 | + | |
| 215 | + p = open(f, 'w'); | |
| 216 | + if not p: | |
| 217 | + tcm_mod_err("Unable to open file: " + f) | |
| 218 | + | |
| 219 | + buf = "#include <linux/module.h>\n" | |
| 220 | + buf += "#include <linux/moduleparam.h>\n" | |
| 221 | + buf += "#include <linux/version.h>\n" | |
| 222 | + buf += "#include <generated/utsrelease.h>\n" | |
| 223 | + buf += "#include <linux/utsname.h>\n" | |
| 224 | + buf += "#include <linux/init.h>\n" | |
| 225 | + buf += "#include <linux/slab.h>\n" | |
| 226 | + buf += "#include <linux/kthread.h>\n" | |
| 227 | + buf += "#include <linux/types.h>\n" | |
| 228 | + buf += "#include <linux/string.h>\n" | |
| 229 | + buf += "#include <linux/configfs.h>\n" | |
| 230 | + buf += "#include <linux/ctype.h>\n" | |
| 231 | + buf += "#include <asm/unaligned.h>\n\n" | |
| 232 | + buf += "#include <target/target_core_base.h>\n" | |
| 233 | + buf += "#include <target/target_core_transport.h>\n" | |
| 234 | + buf += "#include <target/target_core_fabric_ops.h>\n" | |
| 235 | + buf += "#include <target/target_core_fabric_configfs.h>\n" | |
| 236 | + buf += "#include <target/target_core_fabric_lib.h>\n" | |
| 237 | + buf += "#include <target/target_core_device.h>\n" | |
| 238 | + buf += "#include <target/target_core_tpg.h>\n" | |
| 239 | + buf += "#include <target/target_core_configfs.h>\n" | |
| 240 | + buf += "#include <target/target_core_base.h>\n" | |
| 241 | + buf += "#include <target/configfs_macros.h>\n\n" | |
| 242 | + buf += "#include <" + fabric_mod_name + "_base.h>\n" | |
| 243 | + buf += "#include <" + fabric_mod_name + "_fabric.h>\n\n" | |
| 244 | + | |
| 245 | + buf += "/* Local pointer to allocated TCM configfs fabric module */\n" | |
| 246 | + buf += "struct target_fabric_configfs *" + fabric_mod_name + "_fabric_configfs;\n\n" | |
| 247 | + | |
| 248 | + buf += "static struct se_node_acl *" + fabric_mod_name + "_make_nodeacl(\n" | |
| 249 | + buf += " struct se_portal_group *se_tpg,\n" | |
| 250 | + buf += " struct config_group *group,\n" | |
| 251 | + buf += " const char *name)\n" | |
| 252 | + buf += "{\n" | |
| 253 | + buf += " struct se_node_acl *se_nacl, *se_nacl_new;\n" | |
| 254 | + buf += " struct " + fabric_mod_name + "_nacl *nacl;\n" | |
| 255 | + | |
| 256 | + if proto_ident == "FC" or proto_ident == "SAS": | |
| 257 | + buf += " u64 wwpn = 0;\n" | |
| 258 | + | |
| 259 | + buf += " u32 nexus_depth;\n\n" | |
| 260 | + buf += " /* " + fabric_mod_name + "_parse_wwn(name, &wwpn, 1) < 0)\n" | |
| 261 | + buf += " return ERR_PTR(-EINVAL); */\n" | |
| 262 | + buf += " se_nacl_new = " + fabric_mod_name + "_alloc_fabric_acl(se_tpg);\n" | |
| 263 | + buf += " if (!(se_nacl_new))\n" | |
| 264 | + buf += " return ERR_PTR(-ENOMEM);\n" | |
| 265 | + buf += "//#warning FIXME: Hardcoded nexus depth in " + fabric_mod_name + "_make_nodeacl()\n" | |
| 266 | + buf += " nexus_depth = 1;\n" | |
| 267 | + buf += " /*\n" | |
| 268 | + buf += " * se_nacl_new may be released by core_tpg_add_initiator_node_acl()\n" | |
| 269 | + buf += " * when converting a NodeACL from demo mode -> explict\n" | |
| 270 | + buf += " */\n" | |
| 271 | + buf += " se_nacl = core_tpg_add_initiator_node_acl(se_tpg, se_nacl_new,\n" | |
| 272 | + buf += " name, nexus_depth);\n" | |
| 273 | + buf += " if (IS_ERR(se_nacl)) {\n" | |
| 274 | + buf += " " + fabric_mod_name + "_release_fabric_acl(se_tpg, se_nacl_new);\n" | |
| 275 | + buf += " return se_nacl;\n" | |
| 276 | + buf += " }\n" | |
| 277 | + buf += " /*\n" | |
| 278 | + buf += " * Locate our struct " + fabric_mod_name + "_nacl and set the FC Nport WWPN\n" | |
| 279 | + buf += " */\n" | |
| 280 | + buf += " nacl = container_of(se_nacl, struct " + fabric_mod_name + "_nacl, se_node_acl);\n" | |
| 281 | + | |
| 282 | + if proto_ident == "FC" or proto_ident == "SAS": | |
| 283 | + buf += " nacl->" + fabric_mod_init_port + "_wwpn = wwpn;\n" | |
| 284 | + | |
| 285 | + buf += " /* " + fabric_mod_name + "_format_wwn(&nacl->" + fabric_mod_init_port + "_name[0], " + fabric_mod_name.upper() + "_NAMELEN, wwpn); */\n\n" | |
| 286 | + buf += " return se_nacl;\n" | |
| 287 | + buf += "}\n\n" | |
| 288 | + buf += "static void " + fabric_mod_name + "_drop_nodeacl(struct se_node_acl *se_acl)\n" | |
| 289 | + buf += "{\n" | |
| 290 | + buf += " struct " + fabric_mod_name + "_nacl *nacl = container_of(se_acl,\n" | |
| 291 | + buf += " struct " + fabric_mod_name + "_nacl, se_node_acl);\n" | |
| 292 | + buf += " kfree(nacl);\n" | |
| 293 | + buf += "}\n\n" | |
| 294 | + | |
| 295 | + buf += "static struct se_portal_group *" + fabric_mod_name + "_make_tpg(\n" | |
| 296 | + buf += " struct se_wwn *wwn,\n" | |
| 297 | + buf += " struct config_group *group,\n" | |
| 298 | + buf += " const char *name)\n" | |
| 299 | + buf += "{\n" | |
| 300 | + buf += " struct " + fabric_mod_name + "_" + fabric_mod_port + "*" + fabric_mod_port + " = container_of(wwn,\n" | |
| 301 | + buf += " struct " + fabric_mod_name + "_" + fabric_mod_port + ", " + fabric_mod_port + "_wwn);\n\n" | |
| 302 | + buf += " struct " + fabric_mod_name + "_tpg *tpg;\n" | |
| 303 | + buf += " unsigned long tpgt;\n" | |
| 304 | + buf += " int ret;\n\n" | |
| 305 | + buf += " if (strstr(name, \"tpgt_\") != name)\n" | |
| 306 | + buf += " return ERR_PTR(-EINVAL);\n" | |
| 307 | + buf += " if (strict_strtoul(name + 5, 10, &tpgt) || tpgt > UINT_MAX)\n" | |
| 308 | + buf += " return ERR_PTR(-EINVAL);\n\n" | |
| 309 | + buf += " tpg = kzalloc(sizeof(struct " + fabric_mod_name + "_tpg), GFP_KERNEL);\n" | |
| 310 | + buf += " if (!(tpg)) {\n" | |
| 311 | + buf += " printk(KERN_ERR \"Unable to allocate struct " + fabric_mod_name + "_tpg\");\n" | |
| 312 | + buf += " return ERR_PTR(-ENOMEM);\n" | |
| 313 | + buf += " }\n" | |
| 314 | + buf += " tpg->" + fabric_mod_port + " = " + fabric_mod_port + ";\n" | |
| 315 | + buf += " tpg->" + fabric_mod_port + "_tpgt = tpgt;\n\n" | |
| 316 | + buf += " ret = core_tpg_register(&" + fabric_mod_name + "_fabric_configfs->tf_ops, wwn,\n" | |
| 317 | + buf += " &tpg->se_tpg, (void *)tpg,\n" | |
| 318 | + buf += " TRANSPORT_TPG_TYPE_NORMAL);\n" | |
| 319 | + buf += " if (ret < 0) {\n" | |
| 320 | + buf += " kfree(tpg);\n" | |
| 321 | + buf += " return NULL;\n" | |
| 322 | + buf += " }\n" | |
| 323 | + buf += " return &tpg->se_tpg;\n" | |
| 324 | + buf += "}\n\n" | |
| 325 | + buf += "static void " + fabric_mod_name + "_drop_tpg(struct se_portal_group *se_tpg)\n" | |
| 326 | + buf += "{\n" | |
| 327 | + buf += " struct " + fabric_mod_name + "_tpg *tpg = container_of(se_tpg,\n" | |
| 328 | + buf += " struct " + fabric_mod_name + "_tpg, se_tpg);\n\n" | |
| 329 | + buf += " core_tpg_deregister(se_tpg);\n" | |
| 330 | + buf += " kfree(tpg);\n" | |
| 331 | + buf += "}\n\n" | |
| 332 | + | |
| 333 | + buf += "static struct se_wwn *" + fabric_mod_name + "_make_" + fabric_mod_port + "(\n" | |
| 334 | + buf += " struct target_fabric_configfs *tf,\n" | |
| 335 | + buf += " struct config_group *group,\n" | |
| 336 | + buf += " const char *name)\n" | |
| 337 | + buf += "{\n" | |
| 338 | + buf += " struct " + fabric_mod_name + "_" + fabric_mod_port + " *" + fabric_mod_port + ";\n" | |
| 339 | + | |
| 340 | + if proto_ident == "FC" or proto_ident == "SAS": | |
| 341 | + buf += " u64 wwpn = 0;\n\n" | |
| 342 | + | |
| 343 | + buf += " /* if (" + fabric_mod_name + "_parse_wwn(name, &wwpn, 1) < 0)\n" | |
| 344 | + buf += " return ERR_PTR(-EINVAL); */\n\n" | |
| 345 | + buf += " " + fabric_mod_port + " = kzalloc(sizeof(struct " + fabric_mod_name + "_" + fabric_mod_port + "), GFP_KERNEL);\n" | |
| 346 | + buf += " if (!(" + fabric_mod_port + ")) {\n" | |
| 347 | + buf += " printk(KERN_ERR \"Unable to allocate struct " + fabric_mod_name + "_" + fabric_mod_port + "\");\n" | |
| 348 | + buf += " return ERR_PTR(-ENOMEM);\n" | |
| 349 | + buf += " }\n" | |
| 350 | + | |
| 351 | + if proto_ident == "FC" or proto_ident == "SAS": | |
| 352 | + buf += " " + fabric_mod_port + "->" + fabric_mod_port + "_wwpn = wwpn;\n" | |
| 353 | + | |
| 354 | + buf += " /* " + fabric_mod_name + "_format_wwn(&" + fabric_mod_port + "->" + fabric_mod_port + "_name[0], " + fabric_mod_name.upper() + "__NAMELEN, wwpn); */\n\n" | |
| 355 | + buf += " return &" + fabric_mod_port + "->" + fabric_mod_port + "_wwn;\n" | |
| 356 | + buf += "}\n\n" | |
| 357 | + buf += "static void " + fabric_mod_name + "_drop_" + fabric_mod_port + "(struct se_wwn *wwn)\n" | |
| 358 | + buf += "{\n" | |
| 359 | + buf += " struct " + fabric_mod_name + "_" + fabric_mod_port + " *" + fabric_mod_port + " = container_of(wwn,\n" | |
| 360 | + buf += " struct " + fabric_mod_name + "_" + fabric_mod_port + ", " + fabric_mod_port + "_wwn);\n" | |
| 361 | + buf += " kfree(" + fabric_mod_port + ");\n" | |
| 362 | + buf += "}\n\n" | |
| 363 | + buf += "static ssize_t " + fabric_mod_name + "_wwn_show_attr_version(\n" | |
| 364 | + buf += " struct target_fabric_configfs *tf,\n" | |
| 365 | + buf += " char *page)\n" | |
| 366 | + buf += "{\n" | |
| 367 | + buf += " return sprintf(page, \"" + fabric_mod_name.upper() + " fabric module %s on %s/%s\"\n" | |
| 368 | + buf += " \"on \"UTS_RELEASE\"\\n\", " + fabric_mod_name.upper() + "_VERSION, utsname()->sysname,\n" | |
| 369 | + buf += " utsname()->machine);\n" | |
| 370 | + buf += "}\n\n" | |
| 371 | + buf += "TF_WWN_ATTR_RO(" + fabric_mod_name + ", version);\n\n" | |
| 372 | + buf += "static struct configfs_attribute *" + fabric_mod_name + "_wwn_attrs[] = {\n" | |
| 373 | + buf += " &" + fabric_mod_name + "_wwn_version.attr,\n" | |
| 374 | + buf += " NULL,\n" | |
| 375 | + buf += "};\n\n" | |
| 376 | + | |
| 377 | + buf += "static struct target_core_fabric_ops " + fabric_mod_name + "_ops = {\n" | |
| 378 | + buf += " .get_fabric_name = " + fabric_mod_name + "_get_fabric_name,\n" | |
| 379 | + buf += " .get_fabric_proto_ident = " + fabric_mod_name + "_get_fabric_proto_ident,\n" | |
| 380 | + buf += " .tpg_get_wwn = " + fabric_mod_name + "_get_fabric_wwn,\n" | |
| 381 | + buf += " .tpg_get_tag = " + fabric_mod_name + "_get_tag,\n" | |
| 382 | + buf += " .tpg_get_default_depth = " + fabric_mod_name + "_get_default_depth,\n" | |
| 383 | + buf += " .tpg_get_pr_transport_id = " + fabric_mod_name + "_get_pr_transport_id,\n" | |
| 384 | + buf += " .tpg_get_pr_transport_id_len = " + fabric_mod_name + "_get_pr_transport_id_len,\n" | |
| 385 | + buf += " .tpg_parse_pr_out_transport_id = " + fabric_mod_name + "_parse_pr_out_transport_id,\n" | |
| 386 | + buf += " .tpg_check_demo_mode = " + fabric_mod_name + "_check_false,\n" | |
| 387 | + buf += " .tpg_check_demo_mode_cache = " + fabric_mod_name + "_check_true,\n" | |
| 388 | + buf += " .tpg_check_demo_mode_write_protect = " + fabric_mod_name + "_check_true,\n" | |
| 389 | + buf += " .tpg_check_prod_mode_write_protect = " + fabric_mod_name + "_check_false,\n" | |
| 390 | + buf += " .tpg_alloc_fabric_acl = " + fabric_mod_name + "_alloc_fabric_acl,\n" | |
| 391 | + buf += " .tpg_release_fabric_acl = " + fabric_mod_name + "_release_fabric_acl,\n" | |
| 392 | + buf += " .tpg_get_inst_index = " + fabric_mod_name + "_tpg_get_inst_index,\n" | |
| 393 | + buf += " .release_cmd_to_pool = " + fabric_mod_name + "_release_cmd,\n" | |
| 394 | + buf += " .release_cmd_direct = " + fabric_mod_name + "_release_cmd,\n" | |
| 395 | + buf += " .shutdown_session = " + fabric_mod_name + "_shutdown_session,\n" | |
| 396 | + buf += " .close_session = " + fabric_mod_name + "_close_session,\n" | |
| 397 | + buf += " .stop_session = " + fabric_mod_name + "_stop_session,\n" | |
| 398 | + buf += " .fall_back_to_erl0 = " + fabric_mod_name + "_reset_nexus,\n" | |
| 399 | + buf += " .sess_logged_in = " + fabric_mod_name + "_sess_logged_in,\n" | |
| 400 | + buf += " .sess_get_index = " + fabric_mod_name + "_sess_get_index,\n" | |
| 401 | + buf += " .sess_get_initiator_sid = NULL,\n" | |
| 402 | + buf += " .write_pending = " + fabric_mod_name + "_write_pending,\n" | |
| 403 | + buf += " .write_pending_status = " + fabric_mod_name + "_write_pending_status,\n" | |
| 404 | + buf += " .set_default_node_attributes = " + fabric_mod_name + "_set_default_node_attrs,\n" | |
| 405 | + buf += " .get_task_tag = " + fabric_mod_name + "_get_task_tag,\n" | |
| 406 | + buf += " .get_cmd_state = " + fabric_mod_name + "_get_cmd_state,\n" | |
| 407 | + buf += " .new_cmd_failure = " + fabric_mod_name + "_new_cmd_failure,\n" | |
| 408 | + buf += " .queue_data_in = " + fabric_mod_name + "_queue_data_in,\n" | |
| 409 | + buf += " .queue_status = " + fabric_mod_name + "_queue_status,\n" | |
| 410 | + buf += " .queue_tm_rsp = " + fabric_mod_name + "_queue_tm_rsp,\n" | |
| 411 | + buf += " .get_fabric_sense_len = " + fabric_mod_name + "_get_fabric_sense_len,\n" | |
| 412 | + buf += " .set_fabric_sense_len = " + fabric_mod_name + "_set_fabric_sense_len,\n" | |
| 413 | + buf += " .is_state_remove = " + fabric_mod_name + "_is_state_remove,\n" | |
| 414 | + buf += " .pack_lun = " + fabric_mod_name + "_pack_lun,\n" | |
| 415 | + buf += " /*\n" | |
| 416 | + buf += " * Setup function pointers for generic logic in target_core_fabric_configfs.c\n" | |
| 417 | + buf += " */\n" | |
| 418 | + buf += " .fabric_make_wwn = " + fabric_mod_name + "_make_" + fabric_mod_port + ",\n" | |
| 419 | + buf += " .fabric_drop_wwn = " + fabric_mod_name + "_drop_" + fabric_mod_port + ",\n" | |
| 420 | + buf += " .fabric_make_tpg = " + fabric_mod_name + "_make_tpg,\n" | |
| 421 | + buf += " .fabric_drop_tpg = " + fabric_mod_name + "_drop_tpg,\n" | |
| 422 | + buf += " .fabric_post_link = NULL,\n" | |
| 423 | + buf += " .fabric_pre_unlink = NULL,\n" | |
| 424 | + buf += " .fabric_make_np = NULL,\n" | |
| 425 | + buf += " .fabric_drop_np = NULL,\n" | |
| 426 | + buf += " .fabric_make_nodeacl = " + fabric_mod_name + "_make_nodeacl,\n" | |
| 427 | + buf += " .fabric_drop_nodeacl = " + fabric_mod_name + "_drop_nodeacl,\n" | |
| 428 | + buf += "};\n\n" | |
| 429 | + | |
| 430 | + buf += "static int " + fabric_mod_name + "_register_configfs(void)\n" | |
| 431 | + buf += "{\n" | |
| 432 | + buf += " struct target_fabric_configfs *fabric;\n" | |
| 433 | + buf += " int ret;\n\n" | |
| 434 | + buf += " printk(KERN_INFO \"" + fabric_mod_name.upper() + " fabric module %s on %s/%s\"\n" | |
| 435 | + buf += " \" on \"UTS_RELEASE\"\\n\"," + fabric_mod_name.upper() + "_VERSION, utsname()->sysname,\n" | |
| 436 | + buf += " utsname()->machine);\n" | |
| 437 | + buf += " /*\n" | |
| 438 | + buf += " * Register the top level struct config_item_type with TCM core\n" | |
| 439 | + buf += " */\n" | |
| 440 | + buf += " fabric = target_fabric_configfs_init(THIS_MODULE, \"" + fabric_mod_name[4:] + "\");\n" | |
| 441 | + buf += " if (!(fabric)) {\n" | |
| 442 | + buf += " printk(KERN_ERR \"target_fabric_configfs_init() failed\\n\");\n" | |
| 443 | + buf += " return -ENOMEM;\n" | |
| 444 | + buf += " }\n" | |
| 445 | + buf += " /*\n" | |
| 446 | + buf += " * Setup fabric->tf_ops from our local " + fabric_mod_name + "_ops\n" | |
| 447 | + buf += " */\n" | |
| 448 | + buf += " fabric->tf_ops = " + fabric_mod_name + "_ops;\n" | |
| 449 | + buf += " /*\n" | |
| 450 | + buf += " * Setup default attribute lists for various fabric->tf_cit_tmpl\n" | |
| 451 | + buf += " */\n" | |
| 452 | + buf += " TF_CIT_TMPL(fabric)->tfc_wwn_cit.ct_attrs = " + fabric_mod_name + "_wwn_attrs;\n" | |
| 453 | + buf += " TF_CIT_TMPL(fabric)->tfc_tpg_base_cit.ct_attrs = NULL;\n" | |
| 454 | + buf += " TF_CIT_TMPL(fabric)->tfc_tpg_attrib_cit.ct_attrs = NULL;\n" | |
| 455 | + buf += " TF_CIT_TMPL(fabric)->tfc_tpg_param_cit.ct_attrs = NULL;\n" | |
| 456 | + buf += " TF_CIT_TMPL(fabric)->tfc_tpg_np_base_cit.ct_attrs = NULL;\n" | |
| 457 | + buf += " TF_CIT_TMPL(fabric)->tfc_tpg_nacl_base_cit.ct_attrs = NULL;\n" | |
| 458 | + buf += " TF_CIT_TMPL(fabric)->tfc_tpg_nacl_attrib_cit.ct_attrs = NULL;\n" | |
| 459 | + buf += " TF_CIT_TMPL(fabric)->tfc_tpg_nacl_auth_cit.ct_attrs = NULL;\n" | |
| 460 | + buf += " TF_CIT_TMPL(fabric)->tfc_tpg_nacl_param_cit.ct_attrs = NULL;\n" | |
| 461 | + buf += " /*\n" | |
| 462 | + buf += " * Register the fabric for use within TCM\n" | |
| 463 | + buf += " */\n" | |
| 464 | + buf += " ret = target_fabric_configfs_register(fabric);\n" | |
| 465 | + buf += " if (ret < 0) {\n" | |
| 466 | + buf += " printk(KERN_ERR \"target_fabric_configfs_register() failed\"\n" | |
| 467 | + buf += " \" for " + fabric_mod_name.upper() + "\\n\");\n" | |
| 468 | + buf += " return ret;\n" | |
| 469 | + buf += " }\n" | |
| 470 | + buf += " /*\n" | |
| 471 | + buf += " * Setup our local pointer to *fabric\n" | |
| 472 | + buf += " */\n" | |
| 473 | + buf += " " + fabric_mod_name + "_fabric_configfs = fabric;\n" | |
| 474 | + buf += " printk(KERN_INFO \"" + fabric_mod_name.upper() + "[0] - Set fabric -> " + fabric_mod_name + "_fabric_configfs\\n\");\n" | |
| 475 | + buf += " return 0;\n" | |
| 476 | + buf += "};\n\n" | |
| 477 | + buf += "static void " + fabric_mod_name + "_deregister_configfs(void)\n" | |
| 478 | + buf += "{\n" | |
| 479 | + buf += " if (!(" + fabric_mod_name + "_fabric_configfs))\n" | |
| 480 | + buf += " return;\n\n" | |
| 481 | + buf += " target_fabric_configfs_deregister(" + fabric_mod_name + "_fabric_configfs);\n" | |
| 482 | + buf += " " + fabric_mod_name + "_fabric_configfs = NULL;\n" | |
| 483 | + buf += " printk(KERN_INFO \"" + fabric_mod_name.upper() + "[0] - Cleared " + fabric_mod_name + "_fabric_configfs\\n\");\n" | |
| 484 | + buf += "};\n\n" | |
| 485 | + | |
| 486 | + buf += "static int __init " + fabric_mod_name + "_init(void)\n" | |
| 487 | + buf += "{\n" | |
| 488 | + buf += " int ret;\n\n" | |
| 489 | + buf += " ret = " + fabric_mod_name + "_register_configfs();\n" | |
| 490 | + buf += " if (ret < 0)\n" | |
| 491 | + buf += " return ret;\n\n" | |
| 492 | + buf += " return 0;\n" | |
| 493 | + buf += "};\n\n" | |
| 494 | + buf += "static void " + fabric_mod_name + "_exit(void)\n" | |
| 495 | + buf += "{\n" | |
| 496 | + buf += " " + fabric_mod_name + "_deregister_configfs();\n" | |
| 497 | + buf += "};\n\n" | |
| 498 | + | |
| 499 | + buf += "#ifdef MODULE\n" | |
| 500 | + buf += "MODULE_DESCRIPTION(\"" + fabric_mod_name.upper() + " series fabric driver\");\n" | |
| 501 | + buf += "MODULE_LICENSE(\"GPL\");\n" | |
| 502 | + buf += "module_init(" + fabric_mod_name + "_init);\n" | |
| 503 | + buf += "module_exit(" + fabric_mod_name + "_exit);\n" | |
| 504 | + buf += "#endif\n" | |
| 505 | + | |
| 506 | + ret = p.write(buf) | |
| 507 | + if ret: | |
| 508 | + tcm_mod_err("Unable to write f: " + f) | |
| 509 | + | |
| 510 | + p.close() | |
| 511 | + | |
| 512 | + return | |
| 513 | + | |
| 514 | +def tcm_mod_scan_fabric_ops(tcm_dir): | |
| 515 | + | |
| 516 | + fabric_ops_api = tcm_dir + "include/target/target_core_fabric_ops.h" | |
| 517 | + | |
| 518 | + print "Using tcm_mod_scan_fabric_ops: " + fabric_ops_api | |
| 519 | + process_fo = 0; | |
| 520 | + | |
| 521 | + p = open(fabric_ops_api, 'r') | |
| 522 | + | |
| 523 | + line = p.readline() | |
| 524 | + while line: | |
| 525 | + if process_fo == 0 and re.search('struct target_core_fabric_ops {', line): | |
| 526 | + line = p.readline() | |
| 527 | + continue | |
| 528 | + | |
| 529 | + if process_fo == 0: | |
| 530 | + process_fo = 1; | |
| 531 | + line = p.readline() | |
| 532 | + # Search for function pointer | |
| 533 | + if not re.search('\(\*', line): | |
| 534 | + continue | |
| 535 | + | |
| 536 | + fabric_ops.append(line.rstrip()) | |
| 537 | + continue | |
| 538 | + | |
| 539 | + line = p.readline() | |
| 540 | + # Search for function pointer | |
| 541 | + if not re.search('\(\*', line): | |
| 542 | + continue | |
| 543 | + | |
| 544 | + fabric_ops.append(line.rstrip()) | |
| 545 | + | |
| 546 | + p.close() | |
| 547 | + return | |
| 548 | + | |
| 549 | +def tcm_mod_dump_fabric_ops(proto_ident, fabric_mod_dir_var, fabric_mod_name): | |
| 550 | + buf = "" | |
| 551 | + bufi = "" | |
| 552 | + | |
| 553 | + f = fabric_mod_dir_var + "/" + fabric_mod_name + "_fabric.c" | |
| 554 | + print "Writing file: " + f | |
| 555 | + | |
| 556 | + p = open(f, 'w') | |
| 557 | + if not p: | |
| 558 | + tcm_mod_err("Unable to open file: " + f) | |
| 559 | + | |
| 560 | + fi = fabric_mod_dir_var + "/" + fabric_mod_name + "_fabric.h" | |
| 561 | + print "Writing file: " + fi | |
| 562 | + | |
| 563 | + pi = open(fi, 'w') | |
| 564 | + if not pi: | |
| 565 | + tcm_mod_err("Unable to open file: " + fi) | |
| 566 | + | |
| 567 | + buf = "#include <linux/slab.h>\n" | |
| 568 | + buf += "#include <linux/kthread.h>\n" | |
| 569 | + buf += "#include <linux/types.h>\n" | |
| 570 | + buf += "#include <linux/list.h>\n" | |
| 571 | + buf += "#include <linux/types.h>\n" | |
| 572 | + buf += "#include <linux/string.h>\n" | |
| 573 | + buf += "#include <linux/ctype.h>\n" | |
| 574 | + buf += "#include <asm/unaligned.h>\n" | |
| 575 | + buf += "#include <scsi/scsi.h>\n" | |
| 576 | + buf += "#include <scsi/scsi_host.h>\n" | |
| 577 | + buf += "#include <scsi/scsi_device.h>\n" | |
| 578 | + buf += "#include <scsi/scsi_cmnd.h>\n" | |
| 579 | + buf += "#include <scsi/libfc.h>\n\n" | |
| 580 | + buf += "#include <target/target_core_base.h>\n" | |
| 581 | + buf += "#include <target/target_core_transport.h>\n" | |
| 582 | + buf += "#include <target/target_core_fabric_ops.h>\n" | |
| 583 | + buf += "#include <target/target_core_fabric_lib.h>\n" | |
| 584 | + buf += "#include <target/target_core_device.h>\n" | |
| 585 | + buf += "#include <target/target_core_tpg.h>\n" | |
| 586 | + buf += "#include <target/target_core_configfs.h>\n" | |
| 587 | + buf += "#include <" + fabric_mod_name + "_base.h>\n" | |
| 588 | + buf += "#include <" + fabric_mod_name + "_fabric.h>\n\n" | |
| 589 | + | |
| 590 | + buf += "int " + fabric_mod_name + "_check_true(struct se_portal_group *se_tpg)\n" | |
| 591 | + buf += "{\n" | |
| 592 | + buf += " return 1;\n" | |
| 593 | + buf += "}\n\n" | |
| 594 | + bufi += "int " + fabric_mod_name + "_check_true(struct se_portal_group *);\n" | |
| 595 | + | |
| 596 | + buf += "int " + fabric_mod_name + "_check_false(struct se_portal_group *se_tpg)\n" | |
| 597 | + buf += "{\n" | |
| 598 | + buf += " return 0;\n" | |
| 599 | + buf += "}\n\n" | |
| 600 | + bufi += "int " + fabric_mod_name + "_check_false(struct se_portal_group *);\n" | |
| 601 | + | |
| 602 | + total_fabric_ops = len(fabric_ops) | |
| 603 | + i = 0 | |
| 604 | + | |
| 605 | + while i < total_fabric_ops: | |
| 606 | + fo = fabric_ops[i] | |
| 607 | + i += 1 | |
| 608 | +# print "fabric_ops: " + fo | |
| 609 | + | |
| 610 | + if re.search('get_fabric_name', fo): | |
| 611 | + buf += "char *" + fabric_mod_name + "_get_fabric_name(void)\n" | |
| 612 | + buf += "{\n" | |
| 613 | + buf += " return \"" + fabric_mod_name[4:] + "\";\n" | |
| 614 | + buf += "}\n\n" | |
| 615 | + bufi += "char *" + fabric_mod_name + "_get_fabric_name(void);\n" | |
| 616 | + continue | |
| 617 | + | |
| 618 | + if re.search('get_fabric_proto_ident', fo): | |
| 619 | + buf += "u8 " + fabric_mod_name + "_get_fabric_proto_ident(struct se_portal_group *se_tpg)\n" | |
| 620 | + buf += "{\n" | |
| 621 | + buf += " struct " + fabric_mod_name + "_tpg *tpg = container_of(se_tpg,\n" | |
| 622 | + buf += " struct " + fabric_mod_name + "_tpg, se_tpg);\n" | |
| 623 | + buf += " struct " + fabric_mod_name + "_" + fabric_mod_port + " *" + fabric_mod_port + " = tpg->" + fabric_mod_port + ";\n" | |
| 624 | + buf += " u8 proto_id;\n\n" | |
| 625 | + buf += " switch (" + fabric_mod_port + "->" + fabric_mod_port + "_proto_id) {\n" | |
| 626 | + if proto_ident == "FC": | |
| 627 | + buf += " case SCSI_PROTOCOL_FCP:\n" | |
| 628 | + buf += " default:\n" | |
| 629 | + buf += " proto_id = fc_get_fabric_proto_ident(se_tpg);\n" | |
| 630 | + buf += " break;\n" | |
| 631 | + elif proto_ident == "SAS": | |
| 632 | + buf += " case SCSI_PROTOCOL_SAS:\n" | |
| 633 | + buf += " default:\n" | |
| 634 | + buf += " proto_id = sas_get_fabric_proto_ident(se_tpg);\n" | |
| 635 | + buf += " break;\n" | |
| 636 | + elif proto_ident == "iSCSI": | |
| 637 | + buf += " case SCSI_PROTOCOL_ISCSI:\n" | |
| 638 | + buf += " default:\n" | |
| 639 | + buf += " proto_id = iscsi_get_fabric_proto_ident(se_tpg);\n" | |
| 640 | + buf += " break;\n" | |
| 641 | + | |
| 642 | + buf += " }\n\n" | |
| 643 | + buf += " return proto_id;\n" | |
| 644 | + buf += "}\n\n" | |
| 645 | + bufi += "u8 " + fabric_mod_name + "_get_fabric_proto_ident(struct se_portal_group *);\n" | |
| 646 | + | |
| 647 | + if re.search('get_wwn', fo): | |
| 648 | + buf += "char *" + fabric_mod_name + "_get_fabric_wwn(struct se_portal_group *se_tpg)\n" | |
| 649 | + buf += "{\n" | |
| 650 | + buf += " struct " + fabric_mod_name + "_tpg *tpg = container_of(se_tpg,\n" | |
| 651 | + buf += " struct " + fabric_mod_name + "_tpg, se_tpg);\n" | |
| 652 | + buf += " struct " + fabric_mod_name + "_" + fabric_mod_port + " *" + fabric_mod_port + " = tpg->" + fabric_mod_port + ";\n\n" | |
| 653 | + buf += " return &" + fabric_mod_port + "->" + fabric_mod_port + "_name[0];\n" | |
| 654 | + buf += "}\n\n" | |
| 655 | + bufi += "char *" + fabric_mod_name + "_get_fabric_wwn(struct se_portal_group *);\n" | |
| 656 | + | |
| 657 | + if re.search('get_tag', fo): | |
| 658 | + buf += "u16 " + fabric_mod_name + "_get_tag(struct se_portal_group *se_tpg)\n" | |
| 659 | + buf += "{\n" | |
| 660 | + buf += " struct " + fabric_mod_name + "_tpg *tpg = container_of(se_tpg,\n" | |
| 661 | + buf += " struct " + fabric_mod_name + "_tpg, se_tpg);\n" | |
| 662 | + buf += " return tpg->" + fabric_mod_port + "_tpgt;\n" | |
| 663 | + buf += "}\n\n" | |
| 664 | + bufi += "u16 " + fabric_mod_name + "_get_tag(struct se_portal_group *);\n" | |
| 665 | + | |
| 666 | + if re.search('get_default_depth', fo): | |
| 667 | + buf += "u32 " + fabric_mod_name + "_get_default_depth(struct se_portal_group *se_tpg)\n" | |
| 668 | + buf += "{\n" | |
| 669 | + buf += " return 1;\n" | |
| 670 | + buf += "}\n\n" | |
| 671 | + bufi += "u32 " + fabric_mod_name + "_get_default_depth(struct se_portal_group *);\n" | |
| 672 | + | |
| 673 | + if re.search('get_pr_transport_id\)\(', fo): | |
| 674 | + buf += "u32 " + fabric_mod_name + "_get_pr_transport_id(\n" | |
| 675 | + buf += " struct se_portal_group *se_tpg,\n" | |
| 676 | + buf += " struct se_node_acl *se_nacl,\n" | |
| 677 | + buf += " struct t10_pr_registration *pr_reg,\n" | |
| 678 | + buf += " int *format_code,\n" | |
| 679 | + buf += " unsigned char *buf)\n" | |
| 680 | + buf += "{\n" | |
| 681 | + buf += " struct " + fabric_mod_name + "_tpg *tpg = container_of(se_tpg,\n" | |
| 682 | + buf += " struct " + fabric_mod_name + "_tpg, se_tpg);\n" | |
| 683 | + buf += " struct " + fabric_mod_name + "_" + fabric_mod_port + " *" + fabric_mod_port + " = tpg->" + fabric_mod_port + ";\n" | |
| 684 | + buf += " int ret = 0;\n\n" | |
| 685 | + buf += " switch (" + fabric_mod_port + "->" + fabric_mod_port + "_proto_id) {\n" | |
| 686 | + if proto_ident == "FC": | |
| 687 | + buf += " case SCSI_PROTOCOL_FCP:\n" | |
| 688 | + buf += " default:\n" | |
| 689 | + buf += " ret = fc_get_pr_transport_id(se_tpg, se_nacl, pr_reg,\n" | |
| 690 | + buf += " format_code, buf);\n" | |
| 691 | + buf += " break;\n" | |
| 692 | + elif proto_ident == "SAS": | |
| 693 | + buf += " case SCSI_PROTOCOL_SAS:\n" | |
| 694 | + buf += " default:\n" | |
| 695 | + buf += " ret = sas_get_pr_transport_id(se_tpg, se_nacl, pr_reg,\n" | |
| 696 | + buf += " format_code, buf);\n" | |
| 697 | + buf += " break;\n" | |
| 698 | + elif proto_ident == "iSCSI": | |
| 699 | + buf += " case SCSI_PROTOCOL_ISCSI:\n" | |
| 700 | + buf += " default:\n" | |
| 701 | + buf += " ret = iscsi_get_pr_transport_id(se_tpg, se_nacl, pr_reg,\n" | |
| 702 | + buf += " format_code, buf);\n" | |
| 703 | + buf += " break;\n" | |
| 704 | + | |
| 705 | + buf += " }\n\n" | |
| 706 | + buf += " return ret;\n" | |
| 707 | + buf += "}\n\n" | |
| 708 | + bufi += "u32 " + fabric_mod_name + "_get_pr_transport_id(struct se_portal_group *,\n" | |
| 709 | + bufi += " struct se_node_acl *, struct t10_pr_registration *,\n" | |
| 710 | + bufi += " int *, unsigned char *);\n" | |
| 711 | + | |
| 712 | + if re.search('get_pr_transport_id_len\)\(', fo): | |
| 713 | + buf += "u32 " + fabric_mod_name + "_get_pr_transport_id_len(\n" | |
| 714 | + buf += " struct se_portal_group *se_tpg,\n" | |
| 715 | + buf += " struct se_node_acl *se_nacl,\n" | |
| 716 | + buf += " struct t10_pr_registration *pr_reg,\n" | |
| 717 | + buf += " int *format_code)\n" | |
| 718 | + buf += "{\n" | |
| 719 | + buf += " struct " + fabric_mod_name + "_tpg *tpg = container_of(se_tpg,\n" | |
| 720 | + buf += " struct " + fabric_mod_name + "_tpg, se_tpg);\n" | |
| 721 | + buf += " struct " + fabric_mod_name + "_" + fabric_mod_port + " *" + fabric_mod_port + " = tpg->" + fabric_mod_port + ";\n" | |
| 722 | + buf += " int ret = 0;\n\n" | |
| 723 | + buf += " switch (" + fabric_mod_port + "->" + fabric_mod_port + "_proto_id) {\n" | |
| 724 | + if proto_ident == "FC": | |
| 725 | + buf += " case SCSI_PROTOCOL_FCP:\n" | |
| 726 | + buf += " default:\n" | |
| 727 | + buf += " ret = fc_get_pr_transport_id_len(se_tpg, se_nacl, pr_reg,\n" | |
| 728 | + buf += " format_code);\n" | |
| 729 | + buf += " break;\n" | |
| 730 | + elif proto_ident == "SAS": | |
| 731 | + buf += " case SCSI_PROTOCOL_SAS:\n" | |
| 732 | + buf += " default:\n" | |
| 733 | + buf += " ret = sas_get_pr_transport_id_len(se_tpg, se_nacl, pr_reg,\n" | |
| 734 | + buf += " format_code);\n" | |
| 735 | + buf += " break;\n" | |
| 736 | + elif proto_ident == "iSCSI": | |
| 737 | + buf += " case SCSI_PROTOCOL_ISCSI:\n" | |
| 738 | + buf += " default:\n" | |
| 739 | + buf += " ret = iscsi_get_pr_transport_id_len(se_tpg, se_nacl, pr_reg,\n" | |
| 740 | + buf += " format_code);\n" | |
| 741 | + buf += " break;\n" | |
| 742 | + | |
| 743 | + | |
| 744 | + buf += " }\n\n" | |
| 745 | + buf += " return ret;\n" | |
| 746 | + buf += "}\n\n" | |
| 747 | + bufi += "u32 " + fabric_mod_name + "_get_pr_transport_id_len(struct se_portal_group *,\n" | |
| 748 | + bufi += " struct se_node_acl *, struct t10_pr_registration *,\n" | |
| 749 | + bufi += " int *);\n" | |
| 750 | + | |
| 751 | + if re.search('parse_pr_out_transport_id\)\(', fo): | |
| 752 | + buf += "char *" + fabric_mod_name + "_parse_pr_out_transport_id(\n" | |
| 753 | + buf += " struct se_portal_group *se_tpg,\n" | |
| 754 | + buf += " const char *buf,\n" | |
| 755 | + buf += " u32 *out_tid_len,\n" | |
| 756 | + buf += " char **port_nexus_ptr)\n" | |
| 757 | + buf += "{\n" | |
| 758 | + buf += " struct " + fabric_mod_name + "_tpg *tpg = container_of(se_tpg,\n" | |
| 759 | + buf += " struct " + fabric_mod_name + "_tpg, se_tpg);\n" | |
| 760 | + buf += " struct " + fabric_mod_name + "_" + fabric_mod_port + " *" + fabric_mod_port + " = tpg->" + fabric_mod_port + ";\n" | |
| 761 | + buf += " char *tid = NULL;\n\n" | |
| 762 | + buf += " switch (" + fabric_mod_port + "->" + fabric_mod_port + "_proto_id) {\n" | |
| 763 | + if proto_ident == "FC": | |
| 764 | + buf += " case SCSI_PROTOCOL_FCP:\n" | |
| 765 | + buf += " default:\n" | |
| 766 | + buf += " tid = fc_parse_pr_out_transport_id(se_tpg, buf, out_tid_len,\n" | |
| 767 | + buf += " port_nexus_ptr);\n" | |
| 768 | + elif proto_ident == "SAS": | |
| 769 | + buf += " case SCSI_PROTOCOL_SAS:\n" | |
| 770 | + buf += " default:\n" | |
| 771 | + buf += " tid = sas_parse_pr_out_transport_id(se_tpg, buf, out_tid_len,\n" | |
| 772 | + buf += " port_nexus_ptr);\n" | |
| 773 | + elif proto_ident == "iSCSI": | |
| 774 | + buf += " case SCSI_PROTOCOL_ISCSI:\n" | |
| 775 | + buf += " default:\n" | |
| 776 | + buf += " tid = iscsi_parse_pr_out_transport_id(se_tpg, buf, out_tid_len,\n" | |
| 777 | + buf += " port_nexus_ptr);\n" | |
| 778 | + | |
| 779 | + buf += " }\n\n" | |
| 780 | + buf += " return tid;\n" | |
| 781 | + buf += "}\n\n" | |
| 782 | + bufi += "char *" + fabric_mod_name + "_parse_pr_out_transport_id(struct se_portal_group *,\n" | |
| 783 | + bufi += " const char *, u32 *, char **);\n" | |
| 784 | + | |
| 785 | + if re.search('alloc_fabric_acl\)\(', fo): | |
| 786 | + buf += "struct se_node_acl *" + fabric_mod_name + "_alloc_fabric_acl(struct se_portal_group *se_tpg)\n" | |
| 787 | + buf += "{\n" | |
| 788 | + buf += " struct " + fabric_mod_name + "_nacl *nacl;\n\n" | |
| 789 | + buf += " nacl = kzalloc(sizeof(struct " + fabric_mod_name + "_nacl), GFP_KERNEL);\n" | |
| 790 | + buf += " if (!(nacl)) {\n" | |
| 791 | + buf += " printk(KERN_ERR \"Unable to alocate struct " + fabric_mod_name + "_nacl\\n\");\n" | |
| 792 | + buf += " return NULL;\n" | |
| 793 | + buf += " }\n\n" | |
| 794 | + buf += " return &nacl->se_node_acl;\n" | |
| 795 | + buf += "}\n\n" | |
| 796 | + bufi += "struct se_node_acl *" + fabric_mod_name + "_alloc_fabric_acl(struct se_portal_group *);\n" | |
| 797 | + | |
| 798 | + if re.search('release_fabric_acl\)\(', fo): | |
| 799 | + buf += "void " + fabric_mod_name + "_release_fabric_acl(\n" | |
| 800 | + buf += " struct se_portal_group *se_tpg,\n" | |
| 801 | + buf += " struct se_node_acl *se_nacl)\n" | |
| 802 | + buf += "{\n" | |
| 803 | + buf += " struct " + fabric_mod_name + "_nacl *nacl = container_of(se_nacl,\n" | |
| 804 | + buf += " struct " + fabric_mod_name + "_nacl, se_node_acl);\n" | |
| 805 | + buf += " kfree(nacl);\n" | |
| 806 | + buf += "}\n\n" | |
| 807 | + bufi += "void " + fabric_mod_name + "_release_fabric_acl(struct se_portal_group *,\n" | |
| 808 | + bufi += " struct se_node_acl *);\n" | |
| 809 | + | |
| 810 | + if re.search('tpg_get_inst_index\)\(', fo): | |
| 811 | + buf += "u32 " + fabric_mod_name + "_tpg_get_inst_index(struct se_portal_group *se_tpg)\n" | |
| 812 | + buf += "{\n" | |
| 813 | + buf += " return 1;\n" | |
| 814 | + buf += "}\n\n" | |
| 815 | + bufi += "u32 " + fabric_mod_name + "_tpg_get_inst_index(struct se_portal_group *);\n" | |
| 816 | + | |
| 817 | + if re.search('release_cmd_to_pool', fo): | |
| 818 | + buf += "void " + fabric_mod_name + "_release_cmd(struct se_cmd *se_cmd)\n" | |
| 819 | + buf += "{\n" | |
| 820 | + buf += " return;\n" | |
| 821 | + buf += "}\n\n" | |
| 822 | + bufi += "void " + fabric_mod_name + "_release_cmd(struct se_cmd *);\n" | |
| 823 | + | |
| 824 | + if re.search('shutdown_session\)\(', fo): | |
| 825 | + buf += "int " + fabric_mod_name + "_shutdown_session(struct se_session *se_sess)\n" | |
| 826 | + buf += "{\n" | |
| 827 | + buf += " return 0;\n" | |
| 828 | + buf += "}\n\n" | |
| 829 | + bufi += "int " + fabric_mod_name + "_shutdown_session(struct se_session *);\n" | |
| 830 | + | |
| 831 | + if re.search('close_session\)\(', fo): | |
| 832 | + buf += "void " + fabric_mod_name + "_close_session(struct se_session *se_sess)\n" | |
| 833 | + buf += "{\n" | |
| 834 | + buf += " return;\n" | |
| 835 | + buf += "}\n\n" | |
| 836 | + bufi += "void " + fabric_mod_name + "_close_session(struct se_session *);\n" | |
| 837 | + | |
| 838 | + if re.search('stop_session\)\(', fo): | |
| 839 | + buf += "void " + fabric_mod_name + "_stop_session(struct se_session *se_sess, int sess_sleep , int conn_sleep)\n" | |
| 840 | + buf += "{\n" | |
| 841 | + buf += " return;\n" | |
| 842 | + buf += "}\n\n" | |
| 843 | + bufi += "void " + fabric_mod_name + "_stop_session(struct se_session *, int, int);\n" | |
| 844 | + | |
| 845 | + if re.search('fall_back_to_erl0\)\(', fo): | |
| 846 | + buf += "void " + fabric_mod_name + "_reset_nexus(struct se_session *se_sess)\n" | |
| 847 | + buf += "{\n" | |
| 848 | + buf += " return;\n" | |
| 849 | + buf += "}\n\n" | |
| 850 | + bufi += "void " + fabric_mod_name + "_reset_nexus(struct se_session *);\n" | |
| 851 | + | |
| 852 | + if re.search('sess_logged_in\)\(', fo): | |
| 853 | + buf += "int " + fabric_mod_name + "_sess_logged_in(struct se_session *se_sess)\n" | |
| 854 | + buf += "{\n" | |
| 855 | + buf += " return 0;\n" | |
| 856 | + buf += "}\n\n" | |
| 857 | + bufi += "int " + fabric_mod_name + "_sess_logged_in(struct se_session *);\n" | |
| 858 | + | |
| 859 | + if re.search('sess_get_index\)\(', fo): | |
| 860 | + buf += "u32 " + fabric_mod_name + "_sess_get_index(struct se_session *se_sess)\n" | |
| 861 | + buf += "{\n" | |
| 862 | + buf += " return 0;\n" | |
| 863 | + buf += "}\n\n" | |
| 864 | + bufi += "u32 " + fabric_mod_name + "_sess_get_index(struct se_session *);\n" | |
| 865 | + | |
| 866 | + if re.search('write_pending\)\(', fo): | |
| 867 | + buf += "int " + fabric_mod_name + "_write_pending(struct se_cmd *se_cmd)\n" | |
| 868 | + buf += "{\n" | |
| 869 | + buf += " return 0;\n" | |
| 870 | + buf += "}\n\n" | |
| 871 | + bufi += "int " + fabric_mod_name + "_write_pending(struct se_cmd *);\n" | |
| 872 | + | |
| 873 | + if re.search('write_pending_status\)\(', fo): | |
| 874 | + buf += "int " + fabric_mod_name + "_write_pending_status(struct se_cmd *se_cmd)\n" | |
| 875 | + buf += "{\n" | |
| 876 | + buf += " return 0;\n" | |
| 877 | + buf += "}\n\n" | |
| 878 | + bufi += "int " + fabric_mod_name + "_write_pending_status(struct se_cmd *);\n" | |
| 879 | + | |
| 880 | + if re.search('set_default_node_attributes\)\(', fo): | |
| 881 | + buf += "void " + fabric_mod_name + "_set_default_node_attrs(struct se_node_acl *nacl)\n" | |
| 882 | + buf += "{\n" | |
| 883 | + buf += " return;\n" | |
| 884 | + buf += "}\n\n" | |
| 885 | + bufi += "void " + fabric_mod_name + "_set_default_node_attrs(struct se_node_acl *);\n" | |
| 886 | + | |
| 887 | + if re.search('get_task_tag\)\(', fo): | |
| 888 | + buf += "u32 " + fabric_mod_name + "_get_task_tag(struct se_cmd *se_cmd)\n" | |
| 889 | + buf += "{\n" | |
| 890 | + buf += " return 0;\n" | |
| 891 | + buf += "}\n\n" | |
| 892 | + bufi += "u32 " + fabric_mod_name + "_get_task_tag(struct se_cmd *);\n" | |
| 893 | + | |
| 894 | + if re.search('get_cmd_state\)\(', fo): | |
| 895 | + buf += "int " + fabric_mod_name + "_get_cmd_state(struct se_cmd *se_cmd)\n" | |
| 896 | + buf += "{\n" | |
| 897 | + buf += " return 0;\n" | |
| 898 | + buf += "}\n\n" | |
| 899 | + bufi += "int " + fabric_mod_name + "_get_cmd_state(struct se_cmd *);\n" | |
| 900 | + | |
| 901 | + if re.search('new_cmd_failure\)\(', fo): | |
| 902 | + buf += "void " + fabric_mod_name + "_new_cmd_failure(struct se_cmd *se_cmd)\n" | |
| 903 | + buf += "{\n" | |
| 904 | + buf += " return;\n" | |
| 905 | + buf += "}\n\n" | |
| 906 | + bufi += "void " + fabric_mod_name + "_new_cmd_failure(struct se_cmd *);\n" | |
| 907 | + | |
| 908 | + if re.search('queue_data_in\)\(', fo): | |
| 909 | + buf += "int " + fabric_mod_name + "_queue_data_in(struct se_cmd *se_cmd)\n" | |
| 910 | + buf += "{\n" | |
| 911 | + buf += " return 0;\n" | |
| 912 | + buf += "}\n\n" | |
| 913 | + bufi += "int " + fabric_mod_name + "_queue_data_in(struct se_cmd *);\n" | |
| 914 | + | |
| 915 | + if re.search('queue_status\)\(', fo): | |
| 916 | + buf += "int " + fabric_mod_name + "_queue_status(struct se_cmd *se_cmd)\n" | |
| 917 | + buf += "{\n" | |
| 918 | + buf += " return 0;\n" | |
| 919 | + buf += "}\n\n" | |
| 920 | + bufi += "int " + fabric_mod_name + "_queue_status(struct se_cmd *);\n" | |
| 921 | + | |
| 922 | + if re.search('queue_tm_rsp\)\(', fo): | |
| 923 | + buf += "int " + fabric_mod_name + "_queue_tm_rsp(struct se_cmd *se_cmd)\n" | |
| 924 | + buf += "{\n" | |
| 925 | + buf += " return 0;\n" | |
| 926 | + buf += "}\n\n" | |
| 927 | + bufi += "int " + fabric_mod_name + "_queue_tm_rsp(struct se_cmd *);\n" | |
| 928 | + | |
| 929 | + if re.search('get_fabric_sense_len\)\(', fo): | |
| 930 | + buf += "u16 " + fabric_mod_name + "_get_fabric_sense_len(void)\n" | |
| 931 | + buf += "{\n" | |
| 932 | + buf += " return 0;\n" | |
| 933 | + buf += "}\n\n" | |
| 934 | + bufi += "u16 " + fabric_mod_name + "_get_fabric_sense_len(void);\n" | |
| 935 | + | |
| 936 | + if re.search('set_fabric_sense_len\)\(', fo): | |
| 937 | + buf += "u16 " + fabric_mod_name + "_set_fabric_sense_len(struct se_cmd *se_cmd, u32 sense_length)\n" | |
| 938 | + buf += "{\n" | |
| 939 | + buf += " return 0;\n" | |
| 940 | + buf += "}\n\n" | |
| 941 | + bufi += "u16 " + fabric_mod_name + "_set_fabric_sense_len(struct se_cmd *, u32);\n" | |
| 942 | + | |
| 943 | + if re.search('is_state_remove\)\(', fo): | |
| 944 | + buf += "int " + fabric_mod_name + "_is_state_remove(struct se_cmd *se_cmd)\n" | |
| 945 | + buf += "{\n" | |
| 946 | + buf += " return 0;\n" | |
| 947 | + buf += "}\n\n" | |
| 948 | + bufi += "int " + fabric_mod_name + "_is_state_remove(struct se_cmd *);\n" | |
| 949 | + | |
| 950 | + if re.search('pack_lun\)\(', fo): | |
| 951 | + buf += "u64 " + fabric_mod_name + "_pack_lun(unsigned int lun)\n" | |
| 952 | + buf += "{\n" | |
| 953 | + buf += " WARN_ON(lun >= 256);\n" | |
| 954 | + buf += " /* Caller wants this byte-swapped */\n" | |
| 955 | + buf += " return cpu_to_le64((lun & 0xff) << 8);\n" | |
| 956 | + buf += "}\n\n" | |
| 957 | + bufi += "u64 " + fabric_mod_name + "_pack_lun(unsigned int);\n" | |
| 958 | + | |
| 959 | + | |
| 960 | + ret = p.write(buf) | |
| 961 | + if ret: | |
| 962 | + tcm_mod_err("Unable to write f: " + f) | |
| 963 | + | |
| 964 | + p.close() | |
| 965 | + | |
| 966 | + ret = pi.write(bufi) | |
| 967 | + if ret: | |
| 968 | + tcm_mod_err("Unable to write fi: " + fi) | |
| 969 | + | |
| 970 | + pi.close() | |
| 971 | + return | |
| 972 | + | |
| 973 | +def tcm_mod_build_kbuild(fabric_mod_dir_var, fabric_mod_name): | |
| 974 | + | |
| 975 | + buf = "" | |
| 976 | + f = fabric_mod_dir_var + "/Kbuild" | |
| 977 | + print "Writing file: " + f | |
| 978 | + | |
| 979 | + p = open(f, 'w') | |
| 980 | + if not p: | |
| 981 | + tcm_mod_err("Unable to open file: " + f) | |
| 982 | + | |
| 983 | + buf = "EXTRA_CFLAGS += -I$(srctree)/drivers/target/ -I$(srctree)/include/ -I$(srctree)/drivers/scsi/ -I$(srctree)/include/scsi/ -I$(srctree)/drivers/target/" + fabric_mod_name + "\n\n" | |
| 984 | + buf += fabric_mod_name + "-objs := " + fabric_mod_name + "_fabric.o \\\n" | |
| 985 | + buf += " " + fabric_mod_name + "_configfs.o\n" | |
| 986 | + buf += "obj-$(CONFIG_" + fabric_mod_name.upper() + ") += " + fabric_mod_name + ".o\n" | |
| 987 | + | |
| 988 | + ret = p.write(buf) | |
| 989 | + if ret: | |
| 990 | + tcm_mod_err("Unable to write f: " + f) | |
| 991 | + | |
| 992 | + p.close() | |
| 993 | + return | |
| 994 | + | |
| 995 | +def tcm_mod_build_kconfig(fabric_mod_dir_var, fabric_mod_name): | |
| 996 | + | |
| 997 | + buf = "" | |
| 998 | + f = fabric_mod_dir_var + "/Kconfig" | |
| 999 | + print "Writing file: " + f | |
| 1000 | + | |
| 1001 | + p = open(f, 'w') | |
| 1002 | + if not p: | |
| 1003 | + tcm_mod_err("Unable to open file: " + f) | |
| 1004 | + | |
| 1005 | + buf = "config " + fabric_mod_name.upper() + "\n" | |
| 1006 | + buf += " tristate \"" + fabric_mod_name.upper() + " fabric module\"\n" | |
| 1007 | + buf += " depends on TARGET_CORE && CONFIGFS_FS\n" | |
| 1008 | + buf += " default n\n" | |
| 1009 | + buf += " ---help---\n" | |
| 1010 | + buf += " Say Y here to enable the " + fabric_mod_name.upper() + " fabric module\n" | |
| 1011 | + | |
| 1012 | + ret = p.write(buf) | |
| 1013 | + if ret: | |
| 1014 | + tcm_mod_err("Unable to write f: " + f) | |
| 1015 | + | |
| 1016 | + p.close() | |
| 1017 | + return | |
| 1018 | + | |
| 1019 | +def tcm_mod_add_kbuild(tcm_dir, fabric_mod_name): | |
| 1020 | + buf = "obj-$(CONFIG_" + fabric_mod_name.upper() + ") += " + fabric_mod_name.lower() + "/\n" | |
| 1021 | + kbuild = tcm_dir + "/drivers/target/Kbuild" | |
| 1022 | + | |
| 1023 | + f = open(kbuild, 'a') | |
| 1024 | + f.write(buf) | |
| 1025 | + f.close() | |
| 1026 | + return | |
| 1027 | + | |
| 1028 | +def tcm_mod_add_kconfig(tcm_dir, fabric_mod_name): | |
| 1029 | + buf = "source \"drivers/target/" + fabric_mod_name.lower() + "/Kconfig\"\n" | |
| 1030 | + kconfig = tcm_dir + "/drivers/target/Kconfig" | |
| 1031 | + | |
| 1032 | + f = open(kconfig, 'a') | |
| 1033 | + f.write(buf) | |
| 1034 | + f.close() | |
| 1035 | + return | |
| 1036 | + | |
| 1037 | +def main(modname, proto_ident): | |
| 1038 | +# proto_ident = "FC" | |
| 1039 | +# proto_ident = "SAS" | |
| 1040 | +# proto_ident = "iSCSI" | |
| 1041 | + | |
| 1042 | + tcm_dir = os.getcwd(); | |
| 1043 | + tcm_dir += "/../../" | |
| 1044 | + print "tcm_dir: " + tcm_dir | |
| 1045 | + fabric_mod_name = modname | |
| 1046 | + fabric_mod_dir = tcm_dir + "drivers/target/" + fabric_mod_name | |
| 1047 | + print "Set fabric_mod_name: " + fabric_mod_name | |
| 1048 | + print "Set fabric_mod_dir: " + fabric_mod_dir | |
| 1049 | + print "Using proto_ident: " + proto_ident | |
| 1050 | + | |
| 1051 | + if proto_ident != "FC" and proto_ident != "SAS" and proto_ident != "iSCSI": | |
| 1052 | + print "Unsupported proto_ident: " + proto_ident | |
| 1053 | + sys.exit(1) | |
| 1054 | + | |
| 1055 | + ret = tcm_mod_create_module_subdir(fabric_mod_dir) | |
| 1056 | + if ret: | |
| 1057 | + print "tcm_mod_create_module_subdir() failed because module already exists!" | |
| 1058 | + sys.exit(1) | |
| 1059 | + | |
| 1060 | + tcm_mod_build_base_includes(proto_ident, fabric_mod_dir, fabric_mod_name) | |
| 1061 | + tcm_mod_scan_fabric_ops(tcm_dir) | |
| 1062 | + tcm_mod_dump_fabric_ops(proto_ident, fabric_mod_dir, fabric_mod_name) | |
| 1063 | + tcm_mod_build_configfs(proto_ident, fabric_mod_dir, fabric_mod_name) | |
| 1064 | + tcm_mod_build_kbuild(fabric_mod_dir, fabric_mod_name) | |
| 1065 | + tcm_mod_build_kconfig(fabric_mod_dir, fabric_mod_name) | |
| 1066 | + | |
| 1067 | + input = raw_input("Would you like to add " + fabric_mod_name + "to drivers/target/Kbuild..? [yes,no]: ") | |
| 1068 | + if input == "yes" or input == "y": | |
| 1069 | + tcm_mod_add_kbuild(tcm_dir, fabric_mod_name) | |
| 1070 | + | |
| 1071 | + input = raw_input("Would you like to add " + fabric_mod_name + "to drivers/target/Kconfig..? [yes,no]: ") | |
| 1072 | + if input == "yes" or input == "y": | |
| 1073 | + tcm_mod_add_kconfig(tcm_dir, fabric_mod_name) | |
| 1074 | + | |
| 1075 | + return | |
| 1076 | + | |
| 1077 | +parser = optparse.OptionParser() | |
| 1078 | +parser.add_option('-m', '--modulename', help='Module name', dest='modname', | |
| 1079 | + action='store', nargs=1, type='string') | |
| 1080 | +parser.add_option('-p', '--protoident', help='Protocol Ident', dest='protoident', | |
| 1081 | + action='store', nargs=1, type='string') | |
| 1082 | + | |
| 1083 | +(opts, args) = parser.parse_args() | |
| 1084 | + | |
| 1085 | +mandatories = ['modname', 'protoident'] | |
| 1086 | +for m in mandatories: | |
| 1087 | + if not opts.__dict__[m]: | |
| 1088 | + print "mandatory option is missing\n" | |
| 1089 | + parser.print_help() | |
| 1090 | + exit(-1) | |
| 1091 | + | |
| 1092 | +if __name__ == "__main__": | |
| 1093 | + | |
| 1094 | + main(str(opts.modname), opts.protoident) | |
| @@ -0,0 +1,145 @@ | ||
| 1 | +>>>>>>>>>> The TCM v4 fabric module script generator <<<<<<<<<< | |
| 2 | + | |
| 3 | +Greetings all, | |
| 4 | + | |
| 5 | +This document is intended to be a mini-HOWTO for using the tcm_mod_builder.py | |
| 6 | +script to generate a brand new functional TCM v4 fabric .ko module of your very own, | |
| 7 | +that once built can be immediately be loaded to start access the new TCM/ConfigFS | |
| 8 | +fabric skeleton, by simply using: | |
| 9 | + | |
| 10 | + modprobe $TCM_NEW_MOD | |
| 11 | + mkdir -p /sys/kernel/config/target/$TCM_NEW_MOD | |
| 12 | + | |
| 13 | +This script will create a new drivers/target/$TCM_NEW_MOD/, and will do the following | |
| 14 | + | |
| 15 | + *) Generate new API callers for drivers/target/target_core_fabric_configs.c logic | |
| 16 | + ->make_nodeacl(), ->drop_nodeacl(), ->make_tpg(), ->drop_tpg() | |
| 17 | + ->make_wwn(), ->drop_wwn(). These are created into $TCM_NEW_MOD/$TCM_NEW_MOD_configfs.c | |
| 18 | + *) Generate basic infrastructure for loading/unloading LKMs and TCM/ConfigFS fabric module | |
| 19 | + using a skeleton struct target_core_fabric_ops API template. | |
| 20 | + *) Based on user defined T10 Proto_Ident for the new fabric module being built, | |
| 21 | + the TransportID / Initiator and Target WWPN related handlers for | |
| 22 | + SPC-3 persistent reservation are automatically generated in $TCM_NEW_MOD/$TCM_NEW_MOD_fabric.c | |
| 23 | + using drivers/target/target_core_fabric_lib.c logic. | |
| 24 | + *) NOP API calls for all other Data I/O path and fabric dependent attribute logic | |
| 25 | + in $TCM_NEW_MOD/$TCM_NEW_MOD_fabric.c | |
| 26 | + | |
| 27 | +tcm_mod_builder.py depends upon the mandatory '-p $PROTO_IDENT' and '-m | |
| 28 | +$FABRIC_MOD_name' parameters, and actually running the script looks like: | |
| 29 | + | |
| 30 | +target:/mnt/sdb/lio-core-2.6.git/Documentation/target# python tcm_mod_builder.py -p iSCSI -m tcm_nab5000 | |
| 31 | +tcm_dir: /mnt/sdb/lio-core-2.6.git/Documentation/target/../../ | |
| 32 | +Set fabric_mod_name: tcm_nab5000 | |
| 33 | +Set fabric_mod_dir: | |
| 34 | +/mnt/sdb/lio-core-2.6.git/Documentation/target/../../drivers/target/tcm_nab5000 | |
| 35 | +Using proto_ident: iSCSI | |
| 36 | +Creating fabric_mod_dir: | |
| 37 | +/mnt/sdb/lio-core-2.6.git/Documentation/target/../../drivers/target/tcm_nab5000 | |
| 38 | +Writing file: | |
| 39 | +/mnt/sdb/lio-core-2.6.git/Documentation/target/../../drivers/target/tcm_nab5000/tcm_nab5000_base.h | |
| 40 | +Using tcm_mod_scan_fabric_ops: | |
| 41 | +/mnt/sdb/lio-core-2.6.git/Documentation/target/../../include/target/target_core_fabric_ops.h | |
| 42 | +Writing file: | |
| 43 | +/mnt/sdb/lio-core-2.6.git/Documentation/target/../../drivers/target/tcm_nab5000/tcm_nab5000_fabric.c | |
| 44 | +Writing file: | |
| 45 | +/mnt/sdb/lio-core-2.6.git/Documentation/target/../../drivers/target/tcm_nab5000/tcm_nab5000_fabric.h | |
| 46 | +Writing file: | |
| 47 | +/mnt/sdb/lio-core-2.6.git/Documentation/target/../../drivers/target/tcm_nab5000/tcm_nab5000_configfs.c | |
| 48 | +Writing file: | |
| 49 | +/mnt/sdb/lio-core-2.6.git/Documentation/target/../../drivers/target/tcm_nab5000/Kbuild | |
| 50 | +Writing file: | |
| 51 | +/mnt/sdb/lio-core-2.6.git/Documentation/target/../../drivers/target/tcm_nab5000/Kconfig | |
| 52 | +Would you like to add tcm_nab5000to drivers/target/Kbuild..? [yes,no]: yes | |
| 53 | +Would you like to add tcm_nab5000to drivers/target/Kconfig..? [yes,no]: yes | |
| 54 | + | |
| 55 | +At the end of tcm_mod_builder.py. the script will ask to add the following | |
| 56 | +line to drivers/target/Kbuild: | |
| 57 | + | |
| 58 | + obj-$(CONFIG_TCM_NAB5000) += tcm_nab5000/ | |
| 59 | + | |
| 60 | +and the same for drivers/target/Kconfig: | |
| 61 | + | |
| 62 | + source "drivers/target/tcm_nab5000/Kconfig" | |
| 63 | + | |
| 64 | +*) Run 'make menuconfig' and select the new CONFIG_TCM_NAB5000 item: | |
| 65 | + | |
| 66 | + <M> TCM_NAB5000 fabric module | |
| 67 | + | |
| 68 | +*) Build using 'make modules', once completed you will have: | |
| 69 | + | |
| 70 | +target:/mnt/sdb/lio-core-2.6.git# ls -la drivers/target/tcm_nab5000/ | |
| 71 | +total 1348 | |
| 72 | +drwxr-xr-x 2 root root 4096 2010-10-05 03:23 . | |
| 73 | +drwxr-xr-x 9 root root 4096 2010-10-05 03:22 .. | |
| 74 | +-rw-r--r-- 1 root root 282 2010-10-05 03:22 Kbuild | |
| 75 | +-rw-r--r-- 1 root root 171 2010-10-05 03:22 Kconfig | |
| 76 | +-rw-r--r-- 1 root root 49 2010-10-05 03:23 modules.order | |
| 77 | +-rw-r--r-- 1 root root 738 2010-10-05 03:22 tcm_nab5000_base.h | |
| 78 | +-rw-r--r-- 1 root root 9096 2010-10-05 03:22 tcm_nab5000_configfs.c | |
| 79 | +-rw-r--r-- 1 root root 191200 2010-10-05 03:23 tcm_nab5000_configfs.o | |
| 80 | +-rw-r--r-- 1 root root 40504 2010-10-05 03:23 .tcm_nab5000_configfs.o.cmd | |
| 81 | +-rw-r--r-- 1 root root 5414 2010-10-05 03:22 tcm_nab5000_fabric.c | |
| 82 | +-rw-r--r-- 1 root root 2016 2010-10-05 03:22 tcm_nab5000_fabric.h | |
| 83 | +-rw-r--r-- 1 root root 190932 2010-10-05 03:23 tcm_nab5000_fabric.o | |
| 84 | +-rw-r--r-- 1 root root 40713 2010-10-05 03:23 .tcm_nab5000_fabric.o.cmd | |
| 85 | +-rw-r--r-- 1 root root 401861 2010-10-05 03:23 tcm_nab5000.ko | |
| 86 | +-rw-r--r-- 1 root root 265 2010-10-05 03:23 .tcm_nab5000.ko.cmd | |
| 87 | +-rw-r--r-- 1 root root 459 2010-10-05 03:23 tcm_nab5000.mod.c | |
| 88 | +-rw-r--r-- 1 root root 23896 2010-10-05 03:23 tcm_nab5000.mod.o | |
| 89 | +-rw-r--r-- 1 root root 22655 2010-10-05 03:23 .tcm_nab5000.mod.o.cmd | |
| 90 | +-rw-r--r-- 1 root root 379022 2010-10-05 03:23 tcm_nab5000.o | |
| 91 | +-rw-r--r-- 1 root root 211 2010-10-05 03:23 .tcm_nab5000.o.cmd | |
| 92 | + | |
| 93 | +*) Load the new module, create a lun_0 configfs group, and add new TCM Core | |
| 94 | + IBLOCK backstore symlink to port: | |
| 95 | + | |
| 96 | +target:/mnt/sdb/lio-core-2.6.git# insmod drivers/target/tcm_nab5000.ko | |
| 97 | +target:/mnt/sdb/lio-core-2.6.git# mkdir -p /sys/kernel/config/target/nab5000/iqn.foo/tpgt_1/lun/lun_0 | |
| 98 | +target:/mnt/sdb/lio-core-2.6.git# cd /sys/kernel/config/target/nab5000/iqn.foo/tpgt_1/lun/lun_0/ | |
| 99 | +target:/sys/kernel/config/target/nab5000/iqn.foo/tpgt_1/lun/lun_0# ln -s /sys/kernel/config/target/core/iblock_0/lvm_test0 nab5000_port | |
| 100 | + | |
| 101 | +target:/sys/kernel/config/target/nab5000/iqn.foo/tpgt_1/lun/lun_0# cd - | |
| 102 | +target:/mnt/sdb/lio-core-2.6.git# tree /sys/kernel/config/target/nab5000/ | |
| 103 | +/sys/kernel/config/target/nab5000/ | |
| 104 | +|-- discovery_auth | |
| 105 | +|-- iqn.foo | |
| 106 | +| `-- tpgt_1 | |
| 107 | +| |-- acls | |
| 108 | +| |-- attrib | |
| 109 | +| |-- lun | |
| 110 | +| | `-- lun_0 | |
| 111 | +| | |-- alua_tg_pt_gp | |
| 112 | +| | |-- alua_tg_pt_offline | |
| 113 | +| | |-- alua_tg_pt_status | |
| 114 | +| | |-- alua_tg_pt_write_md | |
| 115 | +| | `-- nab5000_port -> ../../../../../../target/core/iblock_0/lvm_test0 | |
| 116 | +| |-- np | |
| 117 | +| `-- param | |
| 118 | +`-- version | |
| 119 | + | |
| 120 | +target:/mnt/sdb/lio-core-2.6.git# lsmod | |
| 121 | +Module Size Used by | |
| 122 | +tcm_nab5000 3935 4 | |
| 123 | +iscsi_target_mod 193211 0 | |
| 124 | +target_core_stgt 8090 0 | |
| 125 | +target_core_pscsi 11122 1 | |
| 126 | +target_core_file 9172 2 | |
| 127 | +target_core_iblock 9280 1 | |
| 128 | +target_core_mod 228575 31 | |
| 129 | +tcm_nab5000,iscsi_target_mod,target_core_stgt,target_core_pscsi,target_core_file,target_core_iblock | |
| 130 | +libfc 73681 0 | |
| 131 | +scsi_debug 56265 0 | |
| 132 | +scsi_tgt 8666 1 target_core_stgt | |
| 133 | +configfs 20644 2 target_core_mod | |
| 134 | + | |
| 135 | +---------------------------------------------------------------------- | |
| 136 | + | |
| 137 | +Future TODO items: | |
| 138 | + | |
| 139 | + *) Add more T10 proto_idents | |
| 140 | + *) Make tcm_mod_dump_fabric_ops() smarter and generate function pointer | |
| 141 | + defs directly from include/target/target_core_fabric_ops.h:struct target_core_fabric_ops | |
| 142 | + structure members. | |
| 143 | + | |
| 144 | +October 5th, 2010 | |
| 145 | +Nicholas A. Bellinger <nab@linux-iscsi.org> | |
| @@ -278,3 +278,15 @@ method, the sys I/F structure will be built like this: · 277 unmodified lines | ||
| 278 | 278 | |---name: acpitz |
| 279 | 279 | |---temp1_input: 37000 |
| 280 | 280 | |---temp1_crit: 100000 |
| 281 | + | |
| 282 | +4. Event Notification | |
| 283 | + | |
| 284 | +The framework includes a simple notification mechanism, in the form of a | |
| 285 | +netlink event. Netlink socket initialization is done during the _init_ | |
| 286 | +of the framework. Drivers which intend to use the notification mechanism | |
| 287 | +just need to call generate_netlink_event() with two arguments viz | |
| 288 | +(originator, event). Typically the originator will be an integer assigned | |
| 289 | +to a thermal_zone_device when it registers itself with the framework. The | |
| 290 | +event will be one of:{THERMAL_AUX0, THERMAL_AUX1, THERMAL_CRITICAL, | |
| 291 | +THERMAL_DEV_FAULT}. Notification can be sent when the current temperature | |
| 292 | +crosses any of the configured thresholds. | |
| @@ -19,7 +19,7 @@ Linux system over a sample period: · 18 unmodified lines | ||
| 19 | 19 | |
| 20 | 20 | - the pid of the task(process) which initialized the timer |
| 21 | 21 | - the name of the process which initialized the timer |
| 22 | −- the function where the timer was intialized | |
| 22 | +- the function where the timer was initialized | |
| 23 | 23 | - the callback function which is associated to the timer |
| 24 | 24 | - the number of events (callbacks) |
| 25 | 25 | |
| @@ -0,0 +1,90 @@ | ||
| 1 | + | |
| 2 | + Subsystem Trace Points: power | |
| 3 | + | |
| 4 | +The power tracing system captures events related to power transitions | |
| 5 | +within the kernel. Broadly speaking there are three major subheadings: | |
| 6 | + | |
| 7 | + o Power state switch which reports events related to suspend (S-states), | |
| 8 | + cpuidle (C-states) and cpufreq (P-states) | |
| 9 | + o System clock related changes | |
| 10 | + o Power domains related changes and transitions | |
| 11 | + | |
| 12 | +This document describes what each of the tracepoints is and why they | |
| 13 | +might be useful. | |
| 14 | + | |
| 15 | +Cf. include/trace/events/power.h for the events definitions. | |
| 16 | + | |
| 17 | +1. Power state switch events | |
| 18 | +============================ | |
| 19 | + | |
| 20 | +1.1 New trace API | |
| 21 | +----------------- | |
| 22 | + | |
| 23 | +A 'cpu' event class gathers the CPU-related events: cpuidle and | |
| 24 | +cpufreq. | |
| 25 | + | |
| 26 | +cpu_idle "state=%lu cpu_id=%lu" | |
| 27 | +cpu_frequency "state=%lu cpu_id=%lu" | |
| 28 | + | |
| 29 | +A suspend event is used to indicate the system going in and out of the | |
| 30 | +suspend mode: | |
| 31 | + | |
| 32 | +machine_suspend "state=%lu" | |
| 33 | + | |
| 34 | + | |
| 35 | +Note: the value of '-1' or '4294967295' for state means an exit from the current state, | |
| 36 | +i.e. trace_cpu_idle(4, smp_processor_id()) means that the system | |
| 37 | +enters the idle state 4, while trace_cpu_idle(PWR_EVENT_EXIT, smp_processor_id()) | |
| 38 | +means that the system exits the previous idle state. | |
| 39 | + | |
| 40 | +The event which has 'state=4294967295' in the trace is very important to the user | |
| 41 | +space tools which are using it to detect the end of the current state, and so to | |
| 42 | +correctly draw the states diagrams and to calculate accurate statistics etc. | |
| 43 | + | |
| 44 | +1.2 DEPRECATED trace API | |
| 45 | +------------------------ | |
| 46 | + | |
| 47 | +A new Kconfig option CONFIG_EVENT_POWER_TRACING_DEPRECATED with the default value of | |
| 48 | +'y' has been created. This allows the legacy trace power API to be used conjointly | |
| 49 | +with the new trace API. | |
| 50 | +The Kconfig option, the old trace API (in include/trace/events/power.h) and the | |
| 51 | +old trace points will disappear in a future release (namely 2.6.41). | |
| 52 | + | |
| 53 | +power_start "type=%lu state=%lu cpu_id=%lu" | |
| 54 | +power_frequency "type=%lu state=%lu cpu_id=%lu" | |
| 55 | +power_end "cpu_id=%lu" | |
| 56 | + | |
| 57 | +The 'type' parameter takes one of those macros: | |
| 58 | + . POWER_NONE = 0, | |
| 59 | + . POWER_CSTATE = 1, /* C-State */ | |
| 60 | + . POWER_PSTATE = 2, /* Fequency change or DVFS */ | |
| 61 | + | |
| 62 | +The 'state' parameter is set depending on the type: | |
| 63 | + . Target C-state for type=POWER_CSTATE, | |
| 64 | + . Target frequency for type=POWER_PSTATE, | |
| 65 | + | |
| 66 | +power_end is used to indicate the exit of a state, corresponding to the latest | |
| 67 | +power_start event. | |
| 68 | + | |
| 69 | +2. Clocks events | |
| 70 | +================ | |
| 71 | +The clock events are used for clock enable/disable and for | |
| 72 | +clock rate change. | |
| 73 | + | |
| 74 | +clock_enable "%s state=%lu cpu_id=%lu" | |
| 75 | +clock_disable "%s state=%lu cpu_id=%lu" | |
| 76 | +clock_set_rate "%s state=%lu cpu_id=%lu" | |
| 77 | + | |
| 78 | +The first parameter gives the clock name (e.g. "gpio1_iclk"). | |
| 79 | +The second parameter is '1' for enable, '0' for disable, the target | |
| 80 | +clock rate for set_rate. | |
| 81 | + | |
| 82 | +3. Power domains events | |
| 83 | +======================= | |
| 84 | +The power domain events are used for power domains transitions | |
| 85 | + | |
| 86 | +power_domain_target "%s state=%lu cpu_id=%lu" | |
| 87 | + | |
| 88 | +The first parameter gives the power domain name (e.g. "mpu_pwrdm"). | |
| 89 | +The second parameter is the power domain target state. | |
| 90 | + | |
| @@ -125,7 +125,7 @@ is the size of the data item, in bytes. · 124 unmodified lines | ||
| 125 | 125 | For example, here's the information displayed for the 'sched_wakeup' |
| 126 | 126 | event: |
| 127 | 127 | |
| 128 | −# cat /debug/tracing/events/sched/sched_wakeup/format | |
| 128 | +# cat /sys/kernel/debug/tracing/events/sched/sched_wakeup/format | |
| 129 | 129 | |
| 130 | 130 | name: sched_wakeup |
| 131 | 131 | ID: 60 |
| @@ -201,19 +201,19 @@ to the 'filter' file for the given event. · 69 unmodified lines | ||
| 201 | 201 | |
| 202 | 202 | For example: |
| 203 | 203 | |
| 204 | −# cd /debug/tracing/events/sched/sched_wakeup | |
| 204 | +# cd /sys/kernel/debug/tracing/events/sched/sched_wakeup | |
| 205 | 205 | # echo "common_preempt_count > 4" > filter |
| 206 | 206 | |
| 207 | 207 | A slightly more involved example: |
| 208 | 208 | |
| 209 | −# cd /debug/tracing/events/sched/sched_signal_send | |
| 209 | +# cd /sys/kernel/debug/tracing/events/signal/signal_generate | |
| 210 | 210 | # echo "((sig >= 10 && sig < 15) || sig == 17) && comm != bash" > filter |
| 211 | 211 | |
| 212 | 212 | If there is an error in the expression, you'll get an 'Invalid |
| 213 | 213 | argument' error when setting it, and the erroneous string along with |
| 214 | 214 | an error message can be seen by looking at the filter e.g.: |
| 215 | 215 | |
| 216 | −# cd /debug/tracing/events/sched/sched_signal_send | |
| 216 | +# cd /sys/kernel/debug/tracing/events/signal/signal_generate | |
| 217 | 217 | # echo "((sig >= 10 && sig < 15) || dsig == 17) && comm != bash" > filter |
| 218 | 218 | -bash: echo: write error: Invalid argument |
| 219 | 219 | # cat filter |
| @@ -2,7 +2,7 @@ · 1 unmodified line | ||
| 2 | 2 | |
| 3 | 3 | Alan Stern <stern@rowland.harvard.edu> |
| 4 | 4 | |
| 5 | − December 11, 2009 | |
| 5 | + October 28, 2010 | |
| 6 | 6 | |
| 7 | 7 | |
| 8 | 8 | |
| @@ -107,9 +107,14 @@ allowed to issue dynamic suspends. · 98 unmodified lines | ||
| 107 | 107 | The user interface for controlling dynamic PM is located in the power/ |
| 108 | 108 | subdirectory of each USB device's sysfs directory, that is, in |
| 109 | 109 | /sys/bus/usb/devices/.../power/ where "..." is the device's ID. The |
| 110 | −relevant attribute files are: wakeup, control, and autosuspend. | |
| 111 | −(There may also be a file named "level"; this file was deprecated | |
| 112 | −as of the 2.6.35 kernel and replaced by the "control" file.) | |
| 110 | +relevant attribute files are: wakeup, control, and | |
| 111 | +autosuspend_delay_ms. (There may also be a file named "level"; this | |
| 112 | +file was deprecated as of the 2.6.35 kernel and replaced by the | |
| 113 | +"control" file. In 2.6.38 the "autosuspend" file will be deprecated | |
| 114 | +and replaced by the "autosuspend_delay_ms" file. The only difference | |
| 115 | +is that the newer file expresses the delay in milliseconds whereas the | |
| 116 | +older file uses seconds. Confusingly, both files are present in 2.6.37 | |
| 117 | +but only "autosuspend" works.) | |
| 113 | 118 | |
| 114 | 119 | power/wakeup |
| 115 | 120 | |
| @@ -140,33 +145,36 @@ as of the 2.6.35 kernel and replaced by the "control" file.) · 24 unmodified lines | ||
| 140 | 145 | suspended and autoresume was not allowed. This |
| 141 | 146 | setting is no longer supported.) |
| 142 | 147 | |
| 143 | − power/autosuspend | |
| 148 | + power/autosuspend_delay_ms | |
| 144 | 149 | |
| 145 | 150 | This file contains an integer value, which is the |
| 146 | − number of seconds the device should remain idle before | |
| 147 | − the kernel will autosuspend it (the idle-delay time). | |
| 148 | − The default is 2. 0 means to autosuspend as soon as | |
| 149 | − the device becomes idle, and negative values mean | |
| 150 | − never to autosuspend. You can write a number to the | |
| 151 | − file to change the autosuspend idle-delay time. | |
| 152 | − | |
| 153 | −Writing "-1" to power/autosuspend and writing "on" to power/control do | |
| 154 | −essentially the same thing -- they both prevent the device from being | |
| 155 | −autosuspended. Yes, this is a redundancy in the API. | |
| 151 | + number of milliseconds the device should remain idle | |
| 152 | + before the kernel will autosuspend it (the idle-delay | |
| 153 | + time). The default is 2000. 0 means to autosuspend | |
| 154 | + as soon as the device becomes idle, and negative | |
| 155 | + values mean never to autosuspend. You can write a | |
| 156 | + number to the file to change the autosuspend | |
| 157 | + idle-delay time. | |
| 158 | + | |
| 159 | +Writing "-1" to power/autosuspend_delay_ms and writing "on" to | |
| 160 | +power/control do essentially the same thing -- they both prevent the | |
| 161 | +device from being autosuspended. Yes, this is a redundancy in the | |
| 162 | +API. | |
| 156 | 163 | |
| 157 | 164 | (In 2.6.21 writing "0" to power/autosuspend would prevent the device |
| 158 | 165 | from being autosuspended; the behavior was changed in 2.6.22. The |
| 159 | 166 | power/autosuspend attribute did not exist prior to 2.6.21, and the |
| 160 | 167 | power/level attribute did not exist prior to 2.6.22. power/control |
| 161 | −was added in 2.6.34.) | |
| 168 | +was added in 2.6.34, and power/autosuspend_delay_ms was added in | |
| 169 | +2.6.37 but did not become functional until 2.6.38.) | |
| 162 | 170 | |
| 163 | 171 | |
| 164 | 172 | Changing the default idle-delay time |
| 165 | 173 | ------------------------------------ |
| 166 | 174 | |
| 167 | −The default autosuspend idle-delay time is controlled by a module | |
| 168 | −parameter in usbcore. You can specify the value when usbcore is | |
| 169 | −loaded. For example, to set it to 5 seconds instead of 2 you would | |
| 175 | +The default autosuspend idle-delay time (in seconds) is controlled by | |
| 176 | +a module parameter in usbcore. You can specify the value when usbcore | |
| 177 | +is loaded. For example, to set it to 5 seconds instead of 2 you would | |
| 170 | 178 | do: |
| 171 | 179 | |
| 172 | 180 | modprobe usbcore autosuspend=5 |
| @@ -234,25 +242,23 @@ every device. · 61 unmodified lines | ||
| 234 | 242 | |
| 235 | 243 | If a driver knows that its device has proper suspend/resume support, |
| 236 | 244 | it can enable autosuspend all by itself. For example, the video |
| 237 | −driver for a laptop's webcam might do this, since these devices are | |
| 238 | −rarely used and so should normally be autosuspended. | |
| 245 | +driver for a laptop's webcam might do this (in recent kernels they | |
| 246 | +do), since these devices are rarely used and so should normally be | |
| 247 | +autosuspended. | |
| 239 | 248 | |
| 240 | 249 | Sometimes it turns out that even when a device does work okay with |
| 241 | −autosuspend there are still problems. For example, there are | |
| 242 | −experimental patches adding autosuspend support to the usbhid driver, | |
| 243 | −which manages keyboards and mice, among other things. Tests with a | |
| 244 | −number of keyboards showed that typing on a suspended keyboard, while | |
| 245 | −causing the keyboard to do a remote wakeup all right, would | |
| 246 | −nonetheless frequently result in lost keystrokes. Tests with mice | |
| 247 | −showed that some of them would issue a remote-wakeup request in | |
| 248 | −response to button presses but not to motion, and some in response to | |
| 249 | −neither. | |
| 250 | +autosuspend there are still problems. For example, the usbhid driver, | |
| 251 | +which manages keyboards and mice, has autosuspend support. Tests with | |
| 252 | +a number of keyboards show that typing on a suspended keyboard, while | |
| 253 | +causing the keyboard to do a remote wakeup all right, will nonetheless | |
| 254 | +frequently result in lost keystrokes. Tests with mice show that some | |
| 255 | +of them will issue a remote-wakeup request in response to button | |
| 256 | +presses but not to motion, and some in response to neither. | |
| 250 | 257 | |
| 251 | 258 | The kernel will not prevent you from enabling autosuspend on devices |
| 252 | 259 | that can't handle it. It is even possible in theory to damage a |
| 253 | −device by suspending it at the wrong time -- for example, suspending a | |
| 254 | −USB hard disk might cause it to spin down without parking the heads. | |
| 255 | −(Highly unlikely, but possible.) Take care. | |
| 260 | +device by suspending it at the wrong time. (Highly unlikely, but | |
| 261 | +possible.) Take care. | |
| 256 | 262 | |
| 257 | 263 | |
| 258 | 264 | The driver interface for Power Management |
| @@ -336,10 +342,6 @@ autosuspend the interface's device. When the usage counter is = 0 · 77 unmodified lines | ||
| 336 | 342 | then the interface is considered to be idle, and the kernel may |
| 337 | 343 | autosuspend the device. |
| 338 | 344 | |
| 339 | −(There is a similar usage counter field in struct usb_device, | |
| 340 | −associated with the device itself rather than any of its interfaces. | |
| 341 | −This counter is used only by the USB core.) | |
| 342 | − | |
| 343 | 345 | Drivers need not be concerned about balancing changes to the usage |
| 344 | 346 | counter; the USB core will undo any remaining "get"s when a driver |
| 345 | 347 | is unbound from its interface. As a corollary, drivers must not call |
| @@ -409,11 +411,11 @@ during autosuspend. For example, there's not much point · 63 unmodified lines | ||
| 409 | 411 | autosuspending a keyboard if the user can't cause the keyboard to do a |
| 410 | 412 | remote wakeup by typing on it. If the driver sets |
| 411 | 413 | intf->needs_remote_wakeup to 1, the kernel won't autosuspend the |
| 412 | −device if remote wakeup isn't available or has been disabled through | |
| 413 | −the power/wakeup attribute. (If the device is already autosuspended, | |
| 414 | −though, setting this flag won't cause the kernel to autoresume it. | |
| 415 | −Normally a driver would set this flag in its probe method, at which | |
| 416 | −time the device is guaranteed not to be autosuspended.) | |
| 414 | +device if remote wakeup isn't available. (If the device is already | |
| 415 | +autosuspended, though, setting this flag won't cause the kernel to | |
| 416 | +autoresume it. Normally a driver would set this flag in its probe | |
| 417 | +method, at which time the device is guaranteed not to be | |
| 418 | +autosuspended.) | |
| 417 | 419 | |
| 418 | 420 | If a driver does its I/O asynchronously in interrupt context, it |
| 419 | 421 | should call usb_autopm_get_interface_async() before starting output and |
| @@ -422,20 +424,19 @@ it receives an input event, it should call · 2 unmodified lines | ||
| 422 | 424 | |
| 423 | 425 | usb_mark_last_busy(struct usb_device *udev); |
| 424 | 426 | |
| 425 | −in the event handler. This sets udev->last_busy to the current time. | |
| 426 | −udev->last_busy is the field used for idle-delay calculations; | |
| 427 | −updating it will cause any pending autosuspend to be moved back. Most | |
| 428 | −of the usb_autopm_* routines will also set the last_busy field to the | |
| 429 | −current time. | |
| 427 | +in the event handler. This tells the PM core that the device was just | |
| 428 | +busy and therefore the next autosuspend idle-delay expiration should | |
| 429 | +be pushed back. Many of the usb_autopm_* routines also make this call, | |
| 430 | +so drivers need to worry only when interrupt-driven input arrives. | |
| 430 | 431 | |
| 431 | 432 | Asynchronous operation is always subject to races. For example, a |
| 432 | −driver may call one of the usb_autopm_*_interface_async() routines at | |
| 433 | −a time when the core has just finished deciding the device has been | |
| 434 | −idle for long enough but not yet gotten around to calling the driver's | |
| 435 | −suspend method. The suspend method must be responsible for | |
| 436 | −synchronizing with the output request routine and the URB completion | |
| 437 | −handler; it should cause autosuspends to fail with -EBUSY if the | |
| 438 | −driver needs to use the device. | |
| 433 | +driver may call the usb_autopm_get_interface_async() routine at a time | |
| 434 | +when the core has just finished deciding the device has been idle for | |
| 435 | +long enough but not yet gotten around to calling the driver's suspend | |
| 436 | +method. The suspend method must be responsible for synchronizing with | |
| 437 | +the I/O request routine and the URB completion handler; it should | |
| 438 | +cause autosuspends to fail with -EBUSY if the driver needs to use the | |
| 439 | +device. | |
| 439 | 440 | |
| 440 | 441 | External suspend calls should never be allowed to fail in this way, |
| 441 | 442 | only autosuspend calls. The driver can tell them apart by checking |
| @@ -472,7 +473,9 @@ Firstly, a device may already be autosuspended when a system suspend · 30 unmodified lines | ||
| 472 | 473 | occurs. Since system suspends are supposed to be as transparent as |
| 473 | 474 | possible, the device should remain suspended following the system |
| 474 | 475 | resume. But this theory may not work out well in practice; over time |
| 475 | −the kernel's behavior in this regard has changed. | |
| 476 | +the kernel's behavior in this regard has changed. As of 2.6.37 the | |
| 477 | +policy is to resume all devices during a system resume and let them | |
| 478 | +handle their own runtime suspends afterward. | |
| 476 | 479 | |
| 477 | 480 | Secondly, a dynamic power-management event may occur as a system |
| 478 | 481 | suspend is underway. The window for this is short, since system |
| @@ -1,5 +1,5 @@ | ||
| 1 | 1 | 0 -> Unknown EM2800 video grabber (em2800) [eb1a:2800] |
| 2 | − 1 -> Unknown EM2750/28xx video grabber (em2820/em2840) [eb1a:2710,eb1a:2820,eb1a:2821,eb1a:2860,eb1a:2861,eb1a:2862,eb1a:2863,eb1a:2870,eb1a:2881,eb1a:2883,eb1a:2868] | |
| 2 | + 1 -> Unknown EM2750/28xx video grabber (em2820/em2840) [eb1a:2710,eb1a:2820,eb1a:2821,eb1a:2860,eb1a:2861,eb1a:2862,eb1a:2863,eb1a:2870,eb1a:2881,eb1a:2883,eb1a:2868,eb1a:2875] | |
| 3 | 3 | 2 -> Terratec Cinergy 250 USB (em2820/em2840) [0ccd:0036] |
| 4 | 4 | 3 -> Pinnacle PCTV USB 2 (em2820/em2840) [2304:0208] |
| 5 | 5 | 4 -> Hauppauge WinTV USB 2 (em2820/em2840) [2040:4200,2040:4201] |
| @@ -9,7 +9,7 @@ · 3 unmodified lines | ||
| 9 | 9 | 8 -> Kworld USB2800 (em2800) |
| 10 | 10 | 9 -> Pinnacle Dazzle DVC 90/100/101/107 / Kaiser Baas Video to DVD maker (em2820/em2840) [1b80:e302,1b80:e304,2304:0207,2304:021a] |
| 11 | 11 | 10 -> Hauppauge WinTV HVR 900 (em2880) [2040:6500] |
| 12 | − 11 -> Terratec Hybrid XS (em2880) [0ccd:0042] | |
| 12 | + 11 -> Terratec Hybrid XS (em2880) | |
| 13 | 13 | 12 -> Kworld PVR TV 2800 RF (em2820/em2840) |
| 14 | 14 | 13 -> Terratec Prodigy XS (em2880) [0ccd:0047] |
| 15 | 15 | 14 -> SIIG AVTuner-PVR / Pixelview Prolink PlayTV USB 2.0 (em2820/em2840) |
| @@ -53,7 +53,7 @@ · 37 unmodified lines | ||
| 53 | 53 | 52 -> DNT DA2 Hybrid (em2881) |
| 54 | 54 | 53 -> Pinnacle Hybrid Pro (em2881) |
| 55 | 55 | 54 -> Kworld VS-DVB-T 323UR (em2882) [eb1a:e323] |
| 56 | − 55 -> Terratec Hybrid XS (em2882) (em2882) [0ccd:005e] | |
| 56 | + 55 -> Terratec Cinnergy Hybrid T USB XS (em2882) (em2882) [0ccd:005e,0ccd:0042] | |
| 57 | 57 | 56 -> Pinnacle Hybrid Pro (2) (em2882) [2304:0226] |
| 58 | 58 | 57 -> Kworld PlusTV HD Hybrid 330 (em2883) [eb1a:a316] |
| 59 | 59 | 58 -> Compro VideoMate ForYou/Stereo (em2820/em2840) [185b:2041] |
| @@ -180,3 +180,5 @@ · 179 unmodified lines | ||
| 180 | 180 | 179 -> Beholder BeholdTV A7 [5ace:7090] |
| 181 | 181 | 180 -> Avermedia PCI M733A [1461:4155,1461:4255] |
| 182 | 182 | 181 -> TechoTrend TT-budget T-3000 [13c2:2804] |
| 183 | +182 -> Kworld PCI SBTVD/ISDB-T Full-Seg Hybrid [17de:b136] | |
| 184 | +183 -> Compro VideoMate Vista M1F [185b:c900] | |
| @@ -1,8 +0,0 @@ | ||
| 1 | −# kbuild trick to avoid linker error. Can be omitted if a module is built. | |
| 2 | −obj- := dummy.o | |
| 3 | − | |
| 4 | −# List of programs to build | |
| 5 | −hostprogs-y := v4lgrab | |
| 6 | − | |
| 7 | −# Tell kbuild to always build the programs | |
| 8 | −always := $(hostprogs-y) | |
| @@ -1,191 +0,0 @@ | ||
| 1 | −This is a driver for the CPiA PPC2 driven parallel connected | |
| 2 | −Camera. For example the Creative WebcamII is CPiA driven. | |
| 3 | − | |
| 4 | − ) [1]Peter Pregler, Linz 2000, published under the [2]GNU GPL | |
| 5 | − | |
| 6 | −--------------------------------------------------------------------------- | |
| 7 | − | |
| 8 | −USAGE: | |
| 9 | − | |
| 10 | −General: | |
| 11 | −======== | |
| 12 | − | |
| 13 | −1) Make sure you have created the video devices (/dev/video*): | |
| 14 | − | |
| 15 | −- if you have a recent MAKEDEV do a 'cd /dev;./MAKEDEV video' | |
| 16 | −- otherwise do a: | |
| 17 | − | |
| 18 | −cd /dev | |
| 19 | −mknod video0 c 81 0 | |
| 20 | −ln -s video0 video | |
| 21 | − | |
| 22 | −2) Compile the kernel (see below for the list of options to use), | |
| 23 | − configure your parport and reboot. | |
| 24 | − | |
| 25 | −3) If all worked well you should get messages similar | |
| 26 | − to the following (your versions may be different) on the console: | |
| 27 | − | |
| 28 | −V4L-Driver for Vision CPiA based cameras v0.7.4 | |
| 29 | −parport0: read2 timeout. | |
| 30 | −parport0: Multimedia device, VLSI Vision Ltd PPC2 | |
| 31 | −Parallel port driver for Vision CPiA based camera | |
| 32 | − CPIA Version: 1.20 (2.0) | |
| 33 | − CPIA PnP-ID: 0553:0002:0100 | |
| 34 | − VP-Version: 1.0 0100 | |
| 35 | − 1 camera(s) found | |
| 36 | − | |
| 37 | − | |
| 38 | −As modules: | |
| 39 | −=========== | |
| 40 | − | |
| 41 | −Make sure you have selected the following kernel options (you can | |
| 42 | −select all stuff as modules): | |
| 43 | − | |
| 44 | −The cpia-stuff is in the section 'Character devices -> Video For Linux'. | |
| 45 | − | |
| 46 | −CONFIG_PARPORT=m | |
| 47 | −CONFIG_PARPORT_PC=m | |
| 48 | −CONFIG_PARPORT_PC_FIFO=y | |
| 49 | −CONFIG_PARPORT_1284=y | |
| 50 | −CONFIG_VIDEO_DEV=m | |
| 51 | −CONFIG_VIDEO_CPIA=m | |
| 52 | −CONFIG_VIDEO_CPIA_PP=m | |
| 53 | − | |
| 54 | −For autoloading of all those modules you need to tell module-init-tools | |
| 55 | −some stuff. Add the following line to your module-init-tools config-file | |
| 56 | −(e.g. /etc/modprobe.conf or wherever your distribution does store that | |
| 57 | −stuff): | |
| 58 | − | |
| 59 | −options parport_pc io=0x378 irq=7 dma=3 | |
| 60 | −alias char-major-81 cpia_pp | |
| 61 | − | |
| 62 | −The first line tells the dma/irq channels to use. Those _must_ match | |
| 63 | −the settings of your BIOS. Do NOT simply use the values above. See | |
| 64 | −Documentation/parport.txt for more information about this. The second | |
| 65 | −line associates the video-device file with the driver. Of cause you | |
| 66 | −can also load the modules once upon boot (usually done in /etc/modules). | |
| 67 | − | |
| 68 | −Linked into the kernel: | |
| 69 | −======================= | |
| 70 | − | |
| 71 | −Make sure you have selected the following kernel options. Note that | |
| 72 | −you cannot compile the parport-stuff as modules and the cpia-driver | |
| 73 | −statically (the other way round is okay though). | |
| 74 | − | |
| 75 | −The cpia-stuff is in the section 'Character devices -> Video For Linux'. | |
| 76 | − | |
| 77 | −CONFIG_PARPORT=y | |
| 78 | −CONFIG_PARPORT_PC=y | |
| 79 | −CONFIG_PARPORT_PC_FIFO=y | |
| 80 | −CONFIG_PARPORT_1284=y | |
| 81 | −CONFIG_VIDEO_DEV=y | |
| 82 | −CONFIG_VIDEO_CPIA=y | |
| 83 | −CONFIG_VIDEO_CPIA_PP=y | |
| 84 | − | |
| 85 | −To use DMA/irq you will need to tell the kernel upon boot time the | |
| 86 | −hardware configuration of the parport. You can give the boot-parameter | |
| 87 | −at the LILO-prompt or specify it in lilo.conf. I use the following | |
| 88 | −append-line in lilo.conf: | |
| 89 | − | |
| 90 | − append="parport=0x378,7,3" | |
| 91 | − | |
| 92 | −See Documentation/parport.txt for more information about the | |
| 93 | −configuration of the parport and the values given above. Do not simply | |
| 94 | −use the values given above. | |
| 95 | − | |
| 96 | −--------------------------------------------------------------------------- | |
| 97 | −FEATURES: | |
| 98 | − | |
| 99 | −- mmap/read v4l-interface (but no overlay) | |
| 100 | −- image formats: CIF/QCIF, SIF/QSIF, various others used by isabel; | |
| 101 | − note: all sizes except CIF/QCIF are implemented by clipping, i.e. | |
| 102 | − pixels are not uploaded from the camera | |
| 103 | −- palettes: VIDEO_PALETTE_GRAY, VIDEO_PALETTE_RGB565, VIDEO_PALETTE_RGB555, | |
| 104 | − VIDEO_PALETTE_RGB24, VIDEO_PALETTE_RGB32, VIDEO_PALETTE_YUYV, | |
| 105 | − VIDEO_PALETTE_UYVY, VIDEO_PALETTE_YUV422 | |
| 106 | −- state information (color balance, exposure, ...) is preserved between | |
| 107 | − device opens | |
| 108 | −- complete control over camera via proc-interface (_all_ camera settings are | |
| 109 | − supported), there is also a python-gtk application available for this [3] | |
| 110 | −- works under SMP (but the driver is completely serialized and synchronous) | |
| 111 | − so you get no benefit from SMP, but at least it does not crash your box | |
| 112 | −- might work for non-Intel architecture, let us know about this | |
| 113 | − | |
| 114 | −--------------------------------------------------------------------------- | |
| 115 | −TESTED APPLICATIONS: | |
| 116 | − | |
| 117 | −- a simple test application based on Xt is available at [3] | |
| 118 | −- another test-application based on gqcam-0.4 (uses GTK) | |
| 119 | −- gqcam-0.6 should work | |
| 120 | −- xawtv-3.x (also the webcam software) | |
| 121 | −- xawtv-2.46 | |
| 122 | −- w3cam (cgi-interface and vidcat, e.g. you may try out 'vidcat |xv | |
| 123 | − -maxpect -root -quit +noresetroot -rmode 5 -') | |
| 124 | −- vic, the MBONE video conferencing tool (version 2.8ucl4-1) | |
| 125 | −- isabel 3R4beta (barely working, but AFAICT all the problems are on | |
| 126 | − their side) | |
| 127 | −- camserv-0.40 | |
| 128 | − | |
| 129 | −See [3] for pointers to v4l-applications. | |
| 130 | − | |
| 131 | −--------------------------------------------------------------------------- | |
| 132 | −KNOWN PROBLEMS: | |
| 133 | − | |
| 134 | −- some applications do not handle the image format correctly, you will | |
| 135 | − see strange horizontal stripes instead of a nice picture -> make sure | |
| 136 | − your application does use a supported image size or queries the driver | |
| 137 | − for the actually used size (reason behind this: the camera cannot | |
| 138 | − provide any image format, so if size NxM is requested the driver will | |
| 139 | − use a format to the closest fitting N1xM1, the application should now | |
| 140 | − query for this granted size, most applications do not). | |
| 141 | −- all the todo ;) | |
| 142 | −- if there is not enough light and the picture is too dark try to | |
| 143 | − adjust the SetSensorFPS setting, automatic frame rate adjustment | |
| 144 | − has its price | |
| 145 | −- do not try out isabel 3R4beta (built 135), you will be disappointed | |
| 146 | − | |
| 147 | −--------------------------------------------------------------------------- | |
| 148 | −TODO: | |
| 149 | − | |
| 150 | −- multiple camera support (struct camera or something) - This should work, | |
| 151 | − but hasn't been tested yet. | |
| 152 | −- architecture independence? | |
| 153 | −- SMP-safe asynchronous mmap interface | |
| 154 | −- nibble mode for old parport interfaces | |
| 155 | −- streaming capture, this should give a performance gain | |
| 156 | − | |
| 157 | −--------------------------------------------------------------------------- | |
| 158 | −IMPLEMENTATION NOTES: | |
| 159 | − | |
| 160 | −The camera can act in two modes, streaming or grabbing. Right now a | |
| 161 | −polling grab-scheme is used. Maybe interrupt driven streaming will be | |
| 162 | −used for a asynchronous mmap interface in the next major release of the | |
| 163 | −driver. This might give a better frame rate. | |
| 164 | − | |
| 165 | −--------------------------------------------------------------------------- | |
| 166 | −THANKS (in no particular order): | |
| 167 | − | |
| 168 | −- Scott J. Bertin <sbertin@mindspring.com> for cleanups, the proc-filesystem | |
| 169 | − and much more | |
| 170 | −- Henry Bruce <whb@vvl.co.uk> for providing developers information about | |
| 171 | − the CPiA chip, I wish all companies would treat Linux as seriously | |
| 172 | −- Karoly Erdei <Karoly.Erdei@risc.uni-linz.ac.at> and RISC-Linz for being | |
| 173 | − my boss ;) resp. my employer and for providing me the hardware and | |
| 174 | − allow me to devote some working time to this project | |
| 175 | −- Manuel J. Petit de Gabriel <mpetit@dit.upm.es> for providing help | |
| 176 | − with Isabel (http://isabel.dit.upm.es/) | |
| 177 | −- Bas Huisman <bhuism@cs.utwente.nl> for writing the initial parport code | |
| 178 | −- Jarl Totland <Jarl.Totland@bdc.no> for setting up the mailing list | |
| 179 | − and maintaining the web-server[3] | |
| 180 | −- Chris Whiteford <Chris@informinteractive.com> for fixes related to the | |
| 181 | − 1.02 firmware | |
| 182 | −- special kudos to all the tester whose machines crashed and/or | |
| 183 | − will crash. :) | |
| 184 | − | |
| 185 | −--------------------------------------------------------------------------- | |
| 186 | −REFERENCES | |
| 187 | − | |
| 188 | − 1. http://www.risc.uni-linz.ac.at/ | |
| 189 | − mailto:Peter_Pregler@email.com | |
| 190 | − 2. see the file COPYING in the top directory of the kernel tree | |
| 191 | − 3. http://webcam.sourceforge.net/ | |
| @@ -322,76 +322,11 @@ your IRQs and make sure the card has its own interrupts. · 321 unmodified lines | ||
| 322 | 322 | |
| 323 | 323 | 4. Programming interface |
| 324 | 324 | |
| 325 | −This driver conforms to video4linux and video4linux2, both can be used to | |
| 326 | −use the driver. Since video4linux didn't provide adequate calls to fully | |
| 327 | −use the cards' features, we've introduced several programming extensions, | |
| 328 | −which are currently officially accepted in the 2.4.x branch of the kernel. | |
| 329 | −These extensions are known as the v4l/mjpeg extensions. See zoran.h for | |
| 330 | −details (structs/ioctls). | |
| 331 | − | |
| 332 | −Information - video4linux: | |
| 333 | −http://linux.bytesex.org/v4l2/API.html | |
| 334 | −Documentation/video4linux/API.html | |
| 335 | −/usr/include/linux/videodev.h | |
| 336 | − | |
| 337 | −Information - video4linux/mjpeg extensions: | |
| 338 | −./zoran.h | |
| 339 | −(also see below) | |
| 340 | − | |
| 341 | −Information - video4linux2: | |
| 342 | −http://linuxtv.org | |
| 343 | −http://v4l2spec.bytesex.org/ | |
| 344 | −/usr/include/linux/videodev2.h | |
| 345 | − | |
| 346 | −More information on the video4linux/mjpeg extensions, by Serguei | |
| 347 | −Miridonovi and Rainer Johanni: | |
| 348 | −-- | |
| 349 | −The ioctls for that interface are as follows: | |
| 350 | − | |
| 351 | −BUZIOC_G_PARAMS | |
| 352 | −BUZIOC_S_PARAMS | |
| 353 | − | |
| 354 | −Get and set the parameters of the buz. The user should always do a | |
| 355 | −BUZIOC_G_PARAMS (with a struct buz_params) to obtain the default | |
| 356 | −settings, change what he likes and then make a BUZIOC_S_PARAMS call. | |
| 357 | − | |
| 358 | −BUZIOC_REQBUFS | |
| 359 | − | |
| 360 | −Before being able to capture/playback, the user has to request | |
| 361 | −the buffers he is wanting to use. Fill the structure | |
| 362 | −zoran_requestbuffers with the size (recommended: 256*1024) and | |
| 363 | −the number (recommended 32 up to 256). There are no such restrictions | |
| 364 | −as for the Video for Linux buffers, you should LEAVE SUFFICIENT | |
| 365 | −MEMORY for your system however, else strange things will happen .... | |
| 366 | −On return, the zoran_requestbuffers structure contains number and | |
| 367 | −size of the actually allocated buffers. | |
| 368 | −You should use these numbers for doing a mmap of the buffers | |
| 369 | −into the user space. | |
| 370 | −The BUZIOC_REQBUFS ioctl also makes it happen, that the next mmap | |
| 371 | −maps the MJPEG buffer instead of the V4L buffers. | |
| 372 | − | |
| 373 | −BUZIOC_QBUF_CAPT | |
| 374 | −BUZIOC_QBUF_PLAY | |
| 375 | − | |
| 376 | −Queue a buffer for capture or playback. The first call also starts | |
| 377 | −streaming capture. When streaming capture is going on, you may | |
| 378 | −only queue further buffers or issue syncs until streaming | |
| 379 | −capture is switched off again with a argument of -1 to | |
| 380 | −a BUZIOC_QBUF_CAPT/BUZIOC_QBUF_PLAY ioctl. | |
| 381 | − | |
| 382 | −BUZIOC_SYNC | |
| 383 | − | |
| 384 | −Issue this ioctl when all buffers are queued. This ioctl will | |
| 385 | −block until the first buffer becomes free for saving its | |
| 386 | −data to disk (after BUZIOC_QBUF_CAPT) or for reuse (after BUZIOC_QBUF_PLAY). | |
| 387 | − | |
| 388 | −BUZIOC_G_STATUS | |
| 389 | − | |
| 390 | −Get the status of the input lines (video source connected/norm). | |
| 325 | +This driver conforms to video4linux2. Support for V4L1 and for the custom | |
| 326 | +zoran ioctls has been removed in kernel 2.6.38. | |
| 391 | 327 | |
| 392 | 328 | For programming example, please, look at lavrec.c and lavplay.c code in |
| 393 | −lavtools-1.2p2 package (URL: http://www.cicese.mx/) | |
| 394 | −and the 'examples' directory in the original Buz driver distribution. | |
| 329 | +the MJPEG-tools (http://mjpeg.sf.net/). | |
| 395 | 330 | |
| 396 | 331 | Additional notes for software developers: |
| 397 | 332 | |
| @@ -402,9 +337,6 @@ Additional notes for software developers: · 4 unmodified lines | ||
| 402 | 337 | standard is "more constant" for current country than geometry |
| 403 | 338 | settings of a variety of TV capture cards which may work in ITU or |
| 404 | 339 | square pixel format. |
| 405 | −-- | |
| 406 | −Please note that lavplay/lavrec are also included in the MJPEG-tools | |
| 407 | −(http://mjpeg.sf.net/). | |
| 408 | 340 | |
| 409 | 341 | =========================== |
| 410 | 342 | |
| @@ -464,10 +464,6 @@ Siemens · 463 unmodified lines | ||
| 464 | 464 | ------- |
| 465 | 465 | Multimedia eXtension Board (MXB) (SAA7146, SAA7111) |
| 466 | 466 | |
| 467 | −Stradis | |
| 468 | −------- | |
| 469 | − SDM275,SDM250,SDM026,SDM025 (SAA7146, IBMMPEG2): MPEG2 decoder only | |
| 470 | − | |
| 471 | 467 | Powercolor |
| 472 | 468 | ---------- |
| 473 | 469 | MTV878 |
| @@ -366,6 +366,7 @@ t613 17a1:0128 TASCORP JPEG Webcam, NGS Cyclops · 365 unmodified lines | ||
| 366 | 366 | vc032x 17ef:4802 Lenovo Vc0323+MI1310_SOC |
| 367 | 367 | pac207 2001:f115 D-Link DSB-C120 |
| 368 | 368 | sq905c 2770:9050 Disney pix micro (CIF) |
| 369 | +sq905c 2770:9051 Lego Bionicle | |
| 369 | 370 | sq905c 2770:9052 Disney pix micro 2 (VGA) |
| 370 | 371 | sq905c 2770:905c All 11 known cameras with this ID |
| 371 | 372 | sq905 2770:9120 All 24 known cameras with this ID |
| @@ -45,8 +45,6 @@ module argument syntax (<param>=<value> when passing the option to the · 44 unmodified lines | ||
| 45 | 45 | module or meye.<param>=<value> on the kernel boot line when meye is |
| 46 | 46 | statically linked into the kernel). Those options are: |
| 47 | 47 | |
| 48 | − forcev4l1: force use of V4L1 API instead of V4L2 | |
| 49 | − | |
| 50 | 48 | gbuffers: number of capture buffers, default is 2 (32 max) |
| 51 | 49 | |
| 52 | 50 | gbufsize: size of each capture buffer, default is 614400 |
| @@ -79,9 +77,8 @@ Usage: · 26 unmodified lines | ||
| 79 | 77 | Private API: |
| 80 | 78 | ------------ |
| 81 | 79 | |
| 82 | − The driver supports frame grabbing with the video4linux API | |
| 83 | − (either v4l1 or v4l2), so all video4linux tools (like xawtv) | |
| 84 | − should work with this driver. | |
| 80 | + The driver supports frame grabbing with the video4linux API, | |
| 81 | + so all video4linux tools (like xawtv) should work with this driver. | |
| 85 | 82 | |
| 86 | 83 | Besides the video4linux interface, the driver has a private interface |
| 87 | 84 | for accessing the Motion Eye extended parameters (camera sharpness, |
| @@ -123,7 +120,4 @@ Private API: · 35 unmodified lines | ||
| 123 | 120 | Bugs / Todo: |
| 124 | 121 | ------------ |
| 125 | 122 | |
| 126 | − - the driver could be much cleaned up by removing the v4l1 support. | |
| 127 | − However, this means all v4l1-only applications will stop working. | |
| 128 | − | |
| 129 | 123 | - 'motioneye' still uses the meye private v4l1 API extensions. |
| @@ -285,6 +285,9 @@ implement g_volatile_ctrl like this: · 284 unmodified lines | ||
| 285 | 285 | The 'new value' union is not used in g_volatile_ctrl. In general controls |
| 286 | 286 | that need to implement g_volatile_ctrl are read-only controls. |
| 287 | 287 | |
| 288 | +Note that if one or more controls in a control cluster are marked as volatile, | |
| 289 | +then all the controls in the cluster are seen as volatile. | |
| 290 | + | |
| 288 | 291 | To mark a control as volatile you have to set the is_volatile flag: |
| 289 | 292 | |
| 290 | 293 | ctrl = v4l2_ctrl_new_std(&sd->ctrl_handler, ...); |
| @@ -462,6 +465,15 @@ pointer to the v4l2_ctrl_ops struct that is used for that cluster. · 171 unmodified lines | ||
| 462 | 465 | Obviously, all controls in the cluster array must be initialized to either |
| 463 | 466 | a valid control or to NULL. |
| 464 | 467 | |
| 468 | +In rare cases you might want to know which controls of a cluster actually | |
| 469 | +were set explicitly by the user. For this you can check the 'is_new' flag of | |
| 470 | +each control. For example, in the case of a volume/mute cluster the 'is_new' | |
| 471 | +flag of the mute control would be set if the user called VIDIOC_S_CTRL for | |
| 472 | +mute only. If the user would call VIDIOC_S_EXT_CTRLS for both mute and volume | |
| 473 | +controls, then the 'is_new' flag would be 1 for both controls. | |
| 474 | + | |
| 475 | +The 'is_new' flag is always 1 when called from v4l2_ctrl_handler_setup(). | |
| 476 | + | |
| 465 | 477 | |
| 466 | 478 | VIDIOC_LOG_STATUS Support |
| 467 | 479 | ========================= |
| @@ -1,201 +0,0 @@ | ||
| 1 | −/* Simple Video4Linux image grabber. */ | |
| 2 | −/* | |
| 3 | − * Video4Linux Driver Test/Example Framegrabbing Program | |
| 4 | − * | |
| 5 | − * Compile with: | |
| 6 | − * gcc -s -Wall -Wstrict-prototypes v4lgrab.c -o v4lgrab | |
| 7 | − * Use as: | |
| 8 | − * v4lgrab >image.ppm | |
| 9 | − * | |
| 10 | − * Copyright (C) 1998-05-03, Phil Blundell <philb@gnu.org> | |
| 11 | − * Copied from http://www.tazenda.demon.co.uk/phil/vgrabber.c | |
| 12 | − * with minor modifications (Dave Forrest, drf5n@virginia.edu). | |
| 13 | − * | |
| 14 | − * | |
| 15 | − * For some cameras you may need to pre-load libv4l to perform | |
| 16 | − * the necessary decompression, e.g.: | |
| 17 | − * | |
| 18 | − * export LD_PRELOAD=/usr/lib/libv4l/v4l1compat.so | |
| 19 | − * ./v4lgrab >image.ppm | |
| 20 | − * | |
| 21 | − * see http://hansdegoede.livejournal.com/3636.html for details. | |
| 22 | − * | |
| 23 | − */ | |
| 24 | − | |
| 25 | −#include <unistd.h> | |
| 26 | −#include <sys/types.h> | |
| 27 | −#include <sys/stat.h> | |
| 28 | −#include <fcntl.h> | |
| 29 | −#include <stdio.h> | |
| 30 | −#include <sys/ioctl.h> | |
| 31 | −#include <stdlib.h> | |
| 32 | − | |
| 33 | −#include <linux/types.h> | |
| 34 | −#include <linux/videodev.h> | |
| 35 | − | |
| 36 | −#define VIDEO_DEV "/dev/video0" | |
| 37 | − | |
| 38 | −/* Stole this from tvset.c */ | |
| 39 | − | |
| 40 | −#define READ_VIDEO_PIXEL(buf, format, depth, r, g, b) \ | |
| 41 | −{ \ | |
| 42 | − switch (format) \ | |
| 43 | − { \ | |
| 44 | − case VIDEO_PALETTE_GREY: \ | |
| 45 | − switch (depth) \ | |
| 46 | − { \ | |
| 47 | − case 4: \ | |
| 48 | − case 6: \ | |
| 49 | − case 8: \ | |
| 50 | − (r) = (g) = (b) = (*buf++ << 8);\ | |
| 51 | − break; \ | |
| 52 | − \ | |
| 53 | − case 16: \ | |
| 54 | − (r) = (g) = (b) = \ | |
| 55 | − *((unsigned short *) buf); \ | |
| 56 | − buf += 2; \ | |
| 57 | − break; \ | |
| 58 | − } \ | |
| 59 | − break; \ | |
| 60 | − \ | |
| 61 | − \ | |
| 62 | − case VIDEO_PALETTE_RGB565: \ | |
| 63 | − { \ | |
| 64 | − unsigned short tmp = *(unsigned short *)buf; \ | |
| 65 | − (r) = tmp&0xF800; \ | |
| 66 | − (g) = (tmp<<5)&0xFC00; \ | |
| 67 | − (b) = (tmp<<11)&0xF800; \ | |
| 68 | − buf += 2; \ | |
| 69 | − } \ | |
| 70 | − break; \ | |
| 71 | − \ | |
| 72 | − case VIDEO_PALETTE_RGB555: \ | |
| 73 | − (r) = (buf[0]&0xF8)<<8; \ | |
| 74 | − (g) = ((buf[0] << 5 | buf[1] >> 3)&0xF8)<<8; \ | |
| 75 | − (b) = ((buf[1] << 2 ) & 0xF8)<<8; \ | |
| 76 | − buf += 2; \ | |
| 77 | − break; \ | |
| 78 | − \ | |
| 79 | − case VIDEO_PALETTE_RGB24: \ | |
| 80 | − (r) = buf[0] << 8; (g) = buf[1] << 8; \ | |
| 81 | − (b) = buf[2] << 8; \ | |
| 82 | − buf += 3; \ | |
| 83 | − break; \ | |
| 84 | − \ | |
| 85 | − default: \ | |
| 86 | − fprintf(stderr, \ | |
| 87 | − "Format %d not yet supported\n", \ | |
| 88 | − format); \ | |
| 89 | − } \ | |
| 90 | −} | |
| 91 | − | |
| 92 | −static int get_brightness_adj(unsigned char *image, long size, int *brightness) { | |
| 93 | − long i, tot = 0; | |
| 94 | − for (i=0;i<size*3;i++) | |
| 95 | − tot += image[i]; | |
| 96 | − *brightness = (128 - tot/(size*3))/3; | |
| 97 | − return !((tot/(size*3)) >= 126 && (tot/(size*3)) <= 130); | |
| 98 | −} | |
| 99 | − | |
| 100 | −int main(int argc, char ** argv) | |
| 101 | −{ | |
| 102 | − int fd = open(VIDEO_DEV, O_RDONLY), f; | |
| 103 | − struct video_capability cap; | |
| 104 | − struct video_window win; | |
| 105 | − struct video_picture vpic; | |
| 106 | − | |
| 107 | − unsigned char *buffer, *src; | |
| 108 | − int bpp = 24, r = 0, g = 0, b = 0; | |
| 109 | − unsigned int i, src_depth = 16; | |
| 110 | − | |
| 111 | − if (fd < 0) { | |
| 112 | − perror(VIDEO_DEV); | |
| 113 | − exit(1); | |
| 114 | − } | |
| 115 | − | |
| 116 | − if (ioctl(fd, VIDIOCGCAP, &cap) < 0) { | |
| 117 | − perror("VIDIOGCAP"); | |
| 118 | − fprintf(stderr, "(" VIDEO_DEV " not a video4linux device?)\n"); | |
| 119 | − close(fd); | |
| 120 | − exit(1); | |
| 121 | − } | |
| 122 | − | |
| 123 | − if (ioctl(fd, VIDIOCGWIN, &win) < 0) { | |
| 124 | − perror("VIDIOCGWIN"); | |
| 125 | − close(fd); | |
| 126 | − exit(1); | |
| 127 | − } | |
| 128 | − | |
| 129 | − if (ioctl(fd, VIDIOCGPICT, &vpic) < 0) { | |
| 130 | − perror("VIDIOCGPICT"); | |
| 131 | − close(fd); | |
| 132 | − exit(1); | |
| 133 | − } | |
| 134 | − | |
| 135 | − if (cap.type & VID_TYPE_MONOCHROME) { | |
| 136 | − vpic.depth=8; | |
| 137 | − vpic.palette=VIDEO_PALETTE_GREY; /* 8bit grey */ | |
| 138 | − if(ioctl(fd, VIDIOCSPICT, &vpic) < 0) { | |
| 139 | − vpic.depth=6; | |
| 140 | − if(ioctl(fd, VIDIOCSPICT, &vpic) < 0) { | |
| 141 | − vpic.depth=4; | |
| 142 | − if(ioctl(fd, VIDIOCSPICT, &vpic) < 0) { | |
| 143 | − fprintf(stderr, "Unable to find a supported capture format.\n"); | |
| 144 | − close(fd); | |
| 145 | − exit(1); | |
| 146 | − } | |
| 147 | − } | |
| 148 | − } | |
| 149 | − } else { | |
| 150 | − vpic.depth=24; | |
| 151 | − vpic.palette=VIDEO_PALETTE_RGB24; | |
| 152 | − | |
| 153 | − if(ioctl(fd, VIDIOCSPICT, &vpic) < 0) { | |
| 154 | − vpic.palette=VIDEO_PALETTE_RGB565; | |
| 155 | − vpic.depth=16; | |
| 156 | − | |
| 157 | − if(ioctl(fd, VIDIOCSPICT, &vpic)==-1) { | |
| 158 | − vpic.palette=VIDEO_PALETTE_RGB555; | |
| 159 | − vpic.depth=15; | |
| 160 | − | |
| 161 | − if(ioctl(fd, VIDIOCSPICT, &vpic)==-1) { | |
| 162 | − fprintf(stderr, "Unable to find a supported capture format.\n"); | |
| 163 | − return -1; | |
| 164 | − } | |
| 165 | − } | |
| 166 | − } | |
| 167 | − } | |
| 168 | − | |
| 169 | − buffer = malloc(win.width * win.height * bpp); | |
| 170 | − if (!buffer) { | |
| 171 | − fprintf(stderr, "Out of memory.\n"); | |
| 172 | − exit(1); | |
| 173 | − } | |
| 174 | − | |
| 175 | − do { | |
| 176 | − int newbright; | |
| 177 | − read(fd, buffer, win.width * win.height * bpp); | |
| 178 | − f = get_brightness_adj(buffer, win.width * win.height, &newbright); | |
| 179 | − if (f) { | |
| 180 | − vpic.brightness += (newbright << 8); | |
| 181 | − if(ioctl(fd, VIDIOCSPICT, &vpic)==-1) { | |
| 182 | − perror("VIDIOSPICT"); | |
| 183 | − break; | |
| 184 | − } | |
| 185 | − } | |
| 186 | − } while (f); | |
| 187 | − | |
| 188 | − fprintf(stdout, "P6\n%d %d 255\n", win.width, win.height); | |
| 189 | − | |
| 190 | − src = buffer; | |
| 191 | − | |
| 192 | − for (i = 0; i < win.width * win.height; i++) { | |
| 193 | − READ_VIDEO_PIXEL(src, vpic.palette, src_depth, r, g, b); | |
| 194 | − fputc(r>>8, stdout); | |
| 195 | − fputc(g>>8, stdout); | |
| 196 | − fputc(b>>8, stdout); | |
| 197 | − } | |
| 198 | − | |
| 199 | − close(fd); | |
| 200 | − return 0; | |
| 201 | −} | |
| @@ -247,8 +247,6 @@ calls. The relevant helper functions are: · 246 unmodified lines | ||
| 247 | 247 | int nonblocking); |
| 248 | 248 | int videobuf_streamon(struct videobuf_queue *q); |
| 249 | 249 | int videobuf_streamoff(struct videobuf_queue *q); |
| 250 | − int videobuf_cgmbuf(struct videobuf_queue *q, struct video_mbuf *mbuf, | |
| 251 | − int count); | |
| 252 | 250 | |
| 253 | 251 | So, for example, a VIDIOC_REQBUFS call turns into a call to the driver's |
| 254 | 252 | vidioc_reqbufs() callback which, in turn, usually only needs to locate the |
| @@ -258,10 +256,7 @@ boilerplate in a lot of V4L2 drivers. · 3 unmodified lines | ||
| 258 | 256 | |
| 259 | 257 | The vidioc_streamon() and vidioc_streamoff() functions will be a bit more |
| 260 | 258 | complex, of course, since they will also need to deal with starting and |
| 261 | −stopping the capture engine. videobuf_cgmbuf(), called from the driver's | |
| 262 | −vidiocgmbuf() function, only exists if the V4L1 compatibility module has | |
| 263 | −been selected with CONFIG_VIDEO_V4L1_COMPAT, so its use must be surrounded | |
| 264 | −with #ifdef directives. | |
| 259 | +stopping the capture engine. | |
| 265 | 260 | |
| 266 | 261 | Buffer allocation |
| 267 | 262 | |
| @@ -2,7 +2,7 @@ · 1 unmodified line | ||
| 2 | 2 | obj- := dummy.o |
| 3 | 3 | |
| 4 | 4 | # List of programs to build |
| 5 | −hostprogs-y := slabinfo page-types hugepage-mmap hugepage-shm map_hugetlb | |
| 5 | +hostprogs-y := page-types hugepage-mmap hugepage-shm map_hugetlb | |
| 6 | 6 | |
| 7 | 7 | # Tell kbuild to always build the programs |
| 8 | 8 | always := $(hostprogs-y) |
| @@ -0,0 +1,298 @@ | ||
| 1 | += Transparent Hugepage Support = | |
| 2 | + | |
| 3 | +== Objective == | |
| 4 | + | |
| 5 | +Performance critical computing applications dealing with large memory | |
| 6 | +working sets are already running on top of libhugetlbfs and in turn | |
| 7 | +hugetlbfs. Transparent Hugepage Support is an alternative means of | |
| 8 | +using huge pages for the backing of virtual memory with huge pages | |
| 9 | +that supports the automatic promotion and demotion of page sizes and | |
| 10 | +without the shortcomings of hugetlbfs. | |
| 11 | + | |
| 12 | +Currently it only works for anonymous memory mappings but in the | |
| 13 | +future it can expand over the pagecache layer starting with tmpfs. | |
| 14 | + | |
| 15 | +The reason applications are running faster is because of two | |
| 16 | +factors. The first factor is almost completely irrelevant and it's not | |
| 17 | +of significant interest because it'll also have the downside of | |
| 18 | +requiring larger clear-page copy-page in page faults which is a | |
| 19 | +potentially negative effect. The first factor consists in taking a | |
| 20 | +single page fault for each 2M virtual region touched by userland (so | |
| 21 | +reducing the enter/exit kernel frequency by a 512 times factor). This | |
| 22 | +only matters the first time the memory is accessed for the lifetime of | |
| 23 | +a memory mapping. The second long lasting and much more important | |
| 24 | +factor will affect all subsequent accesses to the memory for the whole | |
| 25 | +runtime of the application. The second factor consist of two | |
| 26 | +components: 1) the TLB miss will run faster (especially with | |
| 27 | +virtualization using nested pagetables but almost always also on bare | |
| 28 | +metal without virtualization) and 2) a single TLB entry will be | |
| 29 | +mapping a much larger amount of virtual memory in turn reducing the | |
| 30 | +number of TLB misses. With virtualization and nested pagetables the | |
| 31 | +TLB can be mapped of larger size only if both KVM and the Linux guest | |
| 32 | +are using hugepages but a significant speedup already happens if only | |
| 33 | +one of the two is using hugepages just because of the fact the TLB | |
| 34 | +miss is going to run faster. | |
| 35 | + | |
| 36 | +== Design == | |
| 37 | + | |
| 38 | +- "graceful fallback": mm components which don't have transparent | |
| 39 | + hugepage knowledge fall back to breaking a transparent hugepage and | |
| 40 | + working on the regular pages and their respective regular pmd/pte | |
| 41 | + mappings | |
| 42 | + | |
| 43 | +- if a hugepage allocation fails because of memory fragmentation, | |
| 44 | + regular pages should be gracefully allocated instead and mixed in | |
| 45 | + the same vma without any failure or significant delay and without | |
| 46 | + userland noticing | |
| 47 | + | |
| 48 | +- if some task quits and more hugepages become available (either | |
| 49 | + immediately in the buddy or through the VM), guest physical memory | |
| 50 | + backed by regular pages should be relocated on hugepages | |
| 51 | + automatically (with khugepaged) | |
| 52 | + | |
| 53 | +- it doesn't require memory reservation and in turn it uses hugepages | |
| 54 | + whenever possible (the only possible reservation here is kernelcore= | |
| 55 | + to avoid unmovable pages to fragment all the memory but such a tweak | |
| 56 | + is not specific to transparent hugepage support and it's a generic | |
| 57 | + feature that applies to all dynamic high order allocations in the | |
| 58 | + kernel) | |
| 59 | + | |
| 60 | +- this initial support only offers the feature in the anonymous memory | |
| 61 | + regions but it'd be ideal to move it to tmpfs and the pagecache | |
| 62 | + later | |
| 63 | + | |
| 64 | +Transparent Hugepage Support maximizes the usefulness of free memory | |
| 65 | +if compared to the reservation approach of hugetlbfs by allowing all | |
| 66 | +unused memory to be used as cache or other movable (or even unmovable | |
| 67 | +entities). It doesn't require reservation to prevent hugepage | |
| 68 | +allocation failures to be noticeable from userland. It allows paging | |
| 69 | +and all other advanced VM features to be available on the | |
| 70 | +hugepages. It requires no modifications for applications to take | |
| 71 | +advantage of it. | |
| 72 | + | |
| 73 | +Applications however can be further optimized to take advantage of | |
| 74 | +this feature, like for example they've been optimized before to avoid | |
| 75 | +a flood of mmap system calls for every malloc(4k). Optimizing userland | |
| 76 | +is by far not mandatory and khugepaged already can take care of long | |
| 77 | +lived page allocations even for hugepage unaware applications that | |
| 78 | +deals with large amounts of memory. | |
| 79 | + | |
| 80 | +In certain cases when hugepages are enabled system wide, application | |
| 81 | +may end up allocating more memory resources. An application may mmap a | |
| 82 | +large region but only touch 1 byte of it, in that case a 2M page might | |
| 83 | +be allocated instead of a 4k page for no good. This is why it's | |
| 84 | +possible to disable hugepages system-wide and to only have them inside | |
| 85 | +MADV_HUGEPAGE madvise regions. | |
| 86 | + | |
| 87 | +Embedded systems should enable hugepages only inside madvise regions | |
| 88 | +to eliminate any risk of wasting any precious byte of memory and to | |
| 89 | +only run faster. | |
| 90 | + | |
| 91 | +Applications that gets a lot of benefit from hugepages and that don't | |
| 92 | +risk to lose memory by using hugepages, should use | |
| 93 | +madvise(MADV_HUGEPAGE) on their critical mmapped regions. | |
| 94 | + | |
| 95 | +== sysfs == | |
| 96 | + | |
| 97 | +Transparent Hugepage Support can be entirely disabled (mostly for | |
| 98 | +debugging purposes) or only enabled inside MADV_HUGEPAGE regions (to | |
| 99 | +avoid the risk of consuming more memory resources) or enabled system | |
| 100 | +wide. This can be achieved with one of: | |
| 101 | + | |
| 102 | +echo always >/sys/kernel/mm/transparent_hugepage/enabled | |
| 103 | +echo madvise >/sys/kernel/mm/transparent_hugepage/enabled | |
| 104 | +echo never >/sys/kernel/mm/transparent_hugepage/enabled | |
| 105 | + | |
| 106 | +It's also possible to limit defrag efforts in the VM to generate | |
| 107 | +hugepages in case they're not immediately free to madvise regions or | |
| 108 | +to never try to defrag memory and simply fallback to regular pages | |
| 109 | +unless hugepages are immediately available. Clearly if we spend CPU | |
| 110 | +time to defrag memory, we would expect to gain even more by the fact | |
| 111 | +we use hugepages later instead of regular pages. This isn't always | |
| 112 | +guaranteed, but it may be more likely in case the allocation is for a | |
| 113 | +MADV_HUGEPAGE region. | |
| 114 | + | |
| 115 | +echo always >/sys/kernel/mm/transparent_hugepage/defrag | |
| 116 | +echo madvise >/sys/kernel/mm/transparent_hugepage/defrag | |
| 117 | +echo never >/sys/kernel/mm/transparent_hugepage/defrag | |
| 118 | + | |
| 119 | +khugepaged will be automatically started when | |
| 120 | +transparent_hugepage/enabled is set to "always" or "madvise, and it'll | |
| 121 | +be automatically shutdown if it's set to "never". | |
| 122 | + | |
| 123 | +khugepaged runs usually at low frequency so while one may not want to | |
| 124 | +invoke defrag algorithms synchronously during the page faults, it | |
| 125 | +should be worth invoking defrag at least in khugepaged. However it's | |
| 126 | +also possible to disable defrag in khugepaged: | |
| 127 | + | |
| 128 | +echo yes >/sys/kernel/mm/transparent_hugepage/khugepaged/defrag | |
| 129 | +echo no >/sys/kernel/mm/transparent_hugepage/khugepaged/defrag | |
| 130 | + | |
| 131 | +You can also control how many pages khugepaged should scan at each | |
| 132 | +pass: | |
| 133 | + | |
| 134 | +/sys/kernel/mm/transparent_hugepage/khugepaged/pages_to_scan | |
| 135 | + | |
| 136 | +and how many milliseconds to wait in khugepaged between each pass (you | |
| 137 | +can set this to 0 to run khugepaged at 100% utilization of one core): | |
| 138 | + | |
| 139 | +/sys/kernel/mm/transparent_hugepage/khugepaged/scan_sleep_millisecs | |
| 140 | + | |
| 141 | +and how many milliseconds to wait in khugepaged if there's an hugepage | |
| 142 | +allocation failure to throttle the next allocation attempt. | |
| 143 | + | |
| 144 | +/sys/kernel/mm/transparent_hugepage/khugepaged/alloc_sleep_millisecs | |
| 145 | + | |
| 146 | +The khugepaged progress can be seen in the number of pages collapsed: | |
| 147 | + | |
| 148 | +/sys/kernel/mm/transparent_hugepage/khugepaged/pages_collapsed | |
| 149 | + | |
| 150 | +for each pass: | |
| 151 | + | |
| 152 | +/sys/kernel/mm/transparent_hugepage/khugepaged/full_scans | |
| 153 | + | |
| 154 | +== Boot parameter == | |
| 155 | + | |
| 156 | +You can change the sysfs boot time defaults of Transparent Hugepage | |
| 157 | +Support by passing the parameter "transparent_hugepage=always" or | |
| 158 | +"transparent_hugepage=madvise" or "transparent_hugepage=never" | |
| 159 | +(without "") to the kernel command line. | |
| 160 | + | |
| 161 | +== Need of application restart == | |
| 162 | + | |
| 163 | +The transparent_hugepage/enabled values only affect future | |
| 164 | +behavior. So to make them effective you need to restart any | |
| 165 | +application that could have been using hugepages. This also applies to | |
| 166 | +the regions registered in khugepaged. | |
| 167 | + | |
| 168 | +== get_user_pages and follow_page == | |
| 169 | + | |
| 170 | +get_user_pages and follow_page if run on a hugepage, will return the | |
| 171 | +head or tail pages as usual (exactly as they would do on | |
| 172 | +hugetlbfs). Most gup users will only care about the actual physical | |
| 173 | +address of the page and its temporary pinning to release after the I/O | |
| 174 | +is complete, so they won't ever notice the fact the page is huge. But | |
| 175 | +if any driver is going to mangle over the page structure of the tail | |
| 176 | +page (like for checking page->mapping or other bits that are relevant | |
| 177 | +for the head page and not the tail page), it should be updated to jump | |
| 178 | +to check head page instead (while serializing properly against | |
| 179 | +split_huge_page() to avoid the head and tail pages to disappear from | |
| 180 | +under it, see the futex code to see an example of that, hugetlbfs also | |
| 181 | +needed special handling in futex code for similar reasons). | |
| 182 | + | |
| 183 | +NOTE: these aren't new constraints to the GUP API, and they match the | |
| 184 | +same constrains that applies to hugetlbfs too, so any driver capable | |
| 185 | +of handling GUP on hugetlbfs will also work fine on transparent | |
| 186 | +hugepage backed mappings. | |
| 187 | + | |
| 188 | +In case you can't handle compound pages if they're returned by | |
| 189 | +follow_page, the FOLL_SPLIT bit can be specified as parameter to | |
| 190 | +follow_page, so that it will split the hugepages before returning | |
| 191 | +them. Migration for example passes FOLL_SPLIT as parameter to | |
| 192 | +follow_page because it's not hugepage aware and in fact it can't work | |
| 193 | +at all on hugetlbfs (but it instead works fine on transparent | |
| 194 | +hugepages thanks to FOLL_SPLIT). migration simply can't deal with | |
| 195 | +hugepages being returned (as it's not only checking the pfn of the | |
| 196 | +page and pinning it during the copy but it pretends to migrate the | |
| 197 | +memory in regular page sizes and with regular pte/pmd mappings). | |
| 198 | + | |
| 199 | +== Optimizing the applications == | |
| 200 | + | |
| 201 | +To be guaranteed that the kernel will map a 2M page immediately in any | |
| 202 | +memory region, the mmap region has to be hugepage naturally | |
| 203 | +aligned. posix_memalign() can provide that guarantee. | |
| 204 | + | |
| 205 | +== Hugetlbfs == | |
| 206 | + | |
| 207 | +You can use hugetlbfs on a kernel that has transparent hugepage | |
| 208 | +support enabled just fine as always. No difference can be noted in | |
| 209 | +hugetlbfs other than there will be less overall fragmentation. All | |
| 210 | +usual features belonging to hugetlbfs are preserved and | |
| 211 | +unaffected. libhugetlbfs will also work fine as usual. | |
| 212 | + | |
| 213 | +== Graceful fallback == | |
| 214 | + | |
| 215 | +Code walking pagetables but unware about huge pmds can simply call | |
| 216 | +split_huge_page_pmd(mm, pmd) where the pmd is the one returned by | |
| 217 | +pmd_offset. It's trivial to make the code transparent hugepage aware | |
| 218 | +by just grepping for "pmd_offset" and adding split_huge_page_pmd where | |
| 219 | +missing after pmd_offset returns the pmd. Thanks to the graceful | |
| 220 | +fallback design, with a one liner change, you can avoid to write | |
| 221 | +hundred if not thousand of lines of complex code to make your code | |
| 222 | +hugepage aware. | |
| 223 | + | |
| 224 | +If you're not walking pagetables but you run into a physical hugepage | |
| 225 | +but you can't handle it natively in your code, you can split it by | |
| 226 | +calling split_huge_page(page). This is what the Linux VM does before | |
| 227 | +it tries to swapout the hugepage for example. | |
| 228 | + | |
| 229 | +Example to make mremap.c transparent hugepage aware with a one liner | |
| 230 | +change: | |
| 231 | + | |
| 232 | +diff --git a/mm/mremap.c b/mm/mremap.c | |
| 233 | +--- a/mm/mremap.c | |
| 234 | ++++ b/mm/mremap.c | |
| 235 | +@@ -41,6 +41,7 @@ static pmd_t *get_old_pmd(struct mm_stru | |
| 236 | + return NULL; | |
| 237 | + | |
| 238 | + pmd = pmd_offset(pud, addr); | |
| 239 | ++ split_huge_page_pmd(mm, pmd); | |
| 240 | + if (pmd_none_or_clear_bad(pmd)) | |
| 241 | + return NULL; | |
| 242 | + | |
| 243 | +== Locking in hugepage aware code == | |
| 244 | + | |
| 245 | +We want as much code as possible hugepage aware, as calling | |
| 246 | +split_huge_page() or split_huge_page_pmd() has a cost. | |
| 247 | + | |
| 248 | +To make pagetable walks huge pmd aware, all you need to do is to call | |
| 249 | +pmd_trans_huge() on the pmd returned by pmd_offset. You must hold the | |
| 250 | +mmap_sem in read (or write) mode to be sure an huge pmd cannot be | |
| 251 | +created from under you by khugepaged (khugepaged collapse_huge_page | |
| 252 | +takes the mmap_sem in write mode in addition to the anon_vma lock). If | |
| 253 | +pmd_trans_huge returns false, you just fallback in the old code | |
| 254 | +paths. If instead pmd_trans_huge returns true, you have to take the | |
| 255 | +mm->page_table_lock and re-run pmd_trans_huge. Taking the | |
| 256 | +page_table_lock will prevent the huge pmd to be converted into a | |
| 257 | +regular pmd from under you (split_huge_page can run in parallel to the | |
| 258 | +pagetable walk). If the second pmd_trans_huge returns false, you | |
| 259 | +should just drop the page_table_lock and fallback to the old code as | |
| 260 | +before. Otherwise you should run pmd_trans_splitting on the pmd. In | |
| 261 | +case pmd_trans_splitting returns true, it means split_huge_page is | |
| 262 | +already in the middle of splitting the page. So if pmd_trans_splitting | |
| 263 | +returns true it's enough to drop the page_table_lock and call | |
| 264 | +wait_split_huge_page and then fallback the old code paths. You are | |
| 265 | +guaranteed by the time wait_split_huge_page returns, the pmd isn't | |
| 266 | +huge anymore. If pmd_trans_splitting returns false, you can proceed to | |
| 267 | +process the huge pmd and the hugepage natively. Once finished you can | |
| 268 | +drop the page_table_lock. | |
| 269 | + | |
| 270 | +== compound_lock, get_user_pages and put_page == | |
| 271 | + | |
| 272 | +split_huge_page internally has to distribute the refcounts in the head | |
| 273 | +page to the tail pages before clearing all PG_head/tail bits from the | |
| 274 | +page structures. It can do that easily for refcounts taken by huge pmd | |
| 275 | +mappings. But the GUI API as created by hugetlbfs (that returns head | |
| 276 | +and tail pages if running get_user_pages on an address backed by any | |
| 277 | +hugepage), requires the refcount to be accounted on the tail pages and | |
| 278 | +not only in the head pages, if we want to be able to run | |
| 279 | +split_huge_page while there are gup pins established on any tail | |
| 280 | +page. Failure to be able to run split_huge_page if there's any gup pin | |
| 281 | +on any tail page, would mean having to split all hugepages upfront in | |
| 282 | +get_user_pages which is unacceptable as too many gup users are | |
| 283 | +performance critical and they must work natively on hugepages like | |
| 284 | +they work natively on hugetlbfs already (hugetlbfs is simpler because | |
| 285 | +hugetlbfs pages cannot be splitted so there wouldn't be requirement of | |
| 286 | +accounting the pins on the tail pages for hugetlbfs). If we wouldn't | |
| 287 | +account the gup refcounts on the tail pages during gup, we won't know | |
| 288 | +anymore which tail page is pinned by gup and which is not while we run | |
| 289 | +split_huge_page. But we still have to add the gup pin to the head page | |
| 290 | +too, to know when we can free the compound page in case it's never | |
| 291 | +splitted during its lifetime. That requires changing not just | |
| 292 | +get_page, but put_page as well so that when put_page runs on a tail | |
| 293 | +page (and only on a tail page) it will find its respective head page, | |
| 294 | +and then it will decrease the head page refcount in addition to the | |
| 295 | +tail page refcount. To obtain a head page reliably and to decrease its | |
| 296 | +refcount without race conditions, put_page has to serialize against | |
| 297 | +__split_huge_page_refcount using a special per-page lock called | |
| 298 | +compound_lock. | |
| @@ -2,3 +2,5 @@ · 1 unmodified line | ||
| 2 | 2 | - This file |
| 3 | 3 | w1_therm |
| 4 | 4 | - The Maxim/Dallas Semiconductor ds18*20 temperature sensor. |
| 5 | +w1_ds2423 | |
| 6 | + - The Maxim/Dallas Semiconductor ds2423 counter device. | |
| @@ -0,0 +1,47 @@ | ||
| 1 | +Kernel driver w1_ds2423 | |
| 2 | +======================= | |
| 3 | + | |
| 4 | +Supported chips: | |
| 5 | + * Maxim DS2423 based counter devices. | |
| 6 | + | |
| 7 | +supported family codes: | |
| 8 | + W1_THERM_DS2423 0x1D | |
| 9 | + | |
| 10 | +Author: Mika Laitio <lamikr@pilppa.org> | |
| 11 | + | |
| 12 | +Description | |
| 13 | +----------- | |
| 14 | + | |
| 15 | +Support is provided through the sysfs w1_slave file. Each opening and | |
| 16 | +read sequence of w1_slave file initiates the read of counters and ram | |
| 17 | +available in DS2423 pages 12 - 15. | |
| 18 | + | |
| 19 | +Result of each page is provided as an ASCII output where each counter | |
| 20 | +value and associated ram buffer is outpputed to own line. | |
| 21 | + | |
| 22 | +Each lines will contain the values of 42 bytes read from the counter and | |
| 23 | +memory page along the crc=YES or NO for indicating whether the read operation | |
| 24 | +was successfull and CRC matched. | |
| 25 | +If the operation was successfull, there is also in the end of each line | |
| 26 | +a counter value expressed as an integer after c= | |
| 27 | + | |
| 28 | +Meaning of 42 bytes represented is following: | |
| 29 | + - 1 byte from ram page | |
| 30 | + - 4 bytes for the counter value | |
| 31 | + - 4 zero bytes | |
| 32 | + - 2 bytes for crc16 which was calculated from the data read since the previous crc bytes | |
| 33 | + - 31 remaining bytes from the ram page | |
| 34 | + - crc=YES/NO indicating whether read was ok and crc matched | |
| 35 | + - c=<int> current counter value | |
| 36 | + | |
| 37 | +example from the successfull read: | |
| 38 | +00 02 00 00 00 00 00 00 00 6d 38 00 ff ff 00 00 fe ff 00 00 ff ff 00 00 ff ff 00 00 ff ff 00 00 ff ff 00 00 ff ff 00 00 ff ff crc=YES c=2 | |
| 39 | +00 02 00 00 00 00 00 00 00 e0 1f 00 ff ff 00 00 ff ff 00 00 ff ff 00 00 ff ff 00 00 ff ff 00 00 ff ff 00 00 ff ff 00 00 ff ff crc=YES c=2 | |
| 40 | +00 29 c6 5d 18 00 00 00 00 04 37 00 ff ff 00 00 ff ff 00 00 ff ff 00 00 ff ff 00 00 ff ff 00 00 ff ff 00 00 ff ff 00 00 ff ff crc=YES c=408798761 | |
| 41 | +00 05 00 00 00 00 00 00 00 8d 39 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff crc=YES c=5 | |
| 42 | + | |
| 43 | +example from the read with crc errors: | |
| 44 | +00 02 00 00 00 00 00 00 00 6d 38 00 ff ff 00 00 fe ff 00 00 ff ff 00 00 ff ff 00 00 ff ff 00 00 ff ff 00 00 ff ff 00 00 ff ff crc=YES c=2 | |
| 45 | +00 02 00 00 22 00 00 00 00 e0 1f 00 ff ff 00 00 ff ff 00 00 ff ff 00 00 ff ff 00 00 ff ff 00 00 ff ff 00 00 ff ff 00 00 ff ff crc=NO | |
| 46 | +00 e1 61 5d 19 00 00 00 00 df 0b 00 ff ff 00 00 ff ff 00 00 ff ff 00 00 ff ff 00 00 ff ff 00 00 ff ff 00 00 ff ff 00 00 ff ff crc=NO | |
| 47 | +00 05 00 00 20 00 00 00 00 8d 39 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff crc=NO | |
| @@ -190,9 +190,9 @@ resources, scheduled and executed. · 189 unmodified lines | ||
| 190 | 190 | * Long running CPU intensive workloads which can be better |
| 191 | 191 | managed by the system scheduler. |
| 192 | 192 | |
| 193 | − WQ_FREEZEABLE | |
| 193 | + WQ_FREEZABLE | |
| 194 | 194 | |
| 195 | − A freezeable wq participates in the freeze phase of the system | |
| 195 | + A freezable wq participates in the freeze phase of the system | |
| 196 | 196 | suspend operations. Work items on the wq are drained and no |
| 197 | 197 | new work item starts execution until thawed. |
| 198 | 198 | |
| @@ -600,6 +600,7 @@ Protocol: 2.07+ · 599 unmodified lines | ||
| 600 | 600 | 0x00000001 lguest |
| 601 | 601 | 0x00000002 Xen |
| 602 | 602 | 0x00000003 Moorestown MID |
| 603 | + 0x00000004 CE4100 TV Platform | |
| 603 | 604 | |
| 604 | 605 | Field name: hardware_subarch_data |
| 605 | 606 | Type: write (subarch-dependent) |
| @@ -621,9 +622,9 @@ Protocol: 2.08+ · 15 unmodified lines | ||
| 621 | 622 | The payload may be compressed. The format of both the compressed and |
| 622 | 623 | uncompressed data should be determined using the standard magic |
| 623 | 624 | numbers. The currently supported compression formats are gzip |
| 624 | − (magic numbers 1F 8B or 1F 9E), bzip2 (magic number 42 5A) and LZMA | |
| 625 | − (magic number 5D 00). The uncompressed payload is currently always ELF | |
| 626 | − (magic number 7F 45 4C 46). | |
| 625 | + (magic numbers 1F 8B or 1F 9E), bzip2 (magic number 42 5A), LZMA | |
| 626 | + (magic number 5D 00), and XZ (magic number FD 37). The uncompressed | |
| 627 | + payload is currently always ELF (magic number 7F 45 4C 46). | |
| 627 | 628 | |
| 628 | 629 | Field name: payload_length |
| 629 | 630 | Type: read |
| @@ -0,0 +1,121 @@ | ||
| 1 | + | |
| 2 | +XZ data compression in Linux | |
| 3 | +============================ | |
| 4 | + | |
| 5 | +Introduction | |
| 6 | + | |
| 7 | + XZ is a general purpose data compression format with high compression | |
| 8 | + ratio and relatively fast decompression. The primary compression | |
| 9 | + algorithm (filter) is LZMA2. Additional filters can be used to improve | |
| 10 | + compression ratio even further. E.g. Branch/Call/Jump (BCJ) filters | |
| 11 | + improve compression ratio of executable data. | |
| 12 | + | |
| 13 | + The XZ decompressor in Linux is called XZ Embedded. It supports | |
| 14 | + the LZMA2 filter and optionally also BCJ filters. CRC32 is supported | |
| 15 | + for integrity checking. The home page of XZ Embedded is at | |
| 16 | + <http://tukaani.org/xz/embedded.html>, where you can find the | |
| 17 | + latest version and also information about using the code outside | |
| 18 | + the Linux kernel. | |
| 19 | + | |
| 20 | + For userspace, XZ Utils provide a zlib-like compression library | |
| 21 | + and a gzip-like command line tool. XZ Utils can be downloaded from | |
| 22 | + <http://tukaani.org/xz/>. | |
| 23 | + | |
| 24 | +XZ related components in the kernel | |
| 25 | + | |
| 26 | + The xz_dec module provides XZ decompressor with single-call (buffer | |
| 27 | + to buffer) and multi-call (stateful) APIs. The usage of the xz_dec | |
| 28 | + module is documented in include/linux/xz.h. | |
| 29 | + | |
| 30 | + The xz_dec_test module is for testing xz_dec. xz_dec_test is not | |
| 31 | + useful unless you are hacking the XZ decompressor. xz_dec_test | |
| 32 | + allocates a char device major dynamically to which one can write | |
| 33 | + .xz files from userspace. The decompressed output is thrown away. | |
| 34 | + Keep an eye on dmesg to see diagnostics printed by xz_dec_test. | |
| 35 | + See the xz_dec_test source code for the details. | |
| 36 | + | |
| 37 | + For decompressing the kernel image, initramfs, and initrd, there | |
| 38 | + is a wrapper function in lib/decompress_unxz.c. Its API is the | |
| 39 | + same as in other decompress_*.c files, which is defined in | |
| 40 | + include/linux/decompress/generic.h. | |
| 41 | + | |
| 42 | + scripts/xz_wrap.sh is a wrapper for the xz command line tool found | |
| 43 | + from XZ Utils. The wrapper sets compression options to values suitable | |
| 44 | + for compressing the kernel image. | |
| 45 | + | |
| 46 | + For kernel makefiles, two commands are provided for use with | |
| 47 | + $(call if_needed). The kernel image should be compressed with | |
| 48 | + $(call if_needed,xzkern) which will use a BCJ filter and a big LZMA2 | |
| 49 | + dictionary. It will also append a four-byte trailer containing the | |
| 50 | + uncompressed size of the file, which is needed by the boot code. | |
| 51 | + Other things should be compressed with $(call if_needed,xzmisc) | |
| 52 | + which will use no BCJ filter and 1 MiB LZMA2 dictionary. | |
| 53 | + | |
| 54 | +Notes on compression options | |
| 55 | + | |
| 56 | + Since the XZ Embedded supports only streams with no integrity check or | |
| 57 | + CRC32, make sure that you don't use some other integrity check type | |
| 58 | + when encoding files that are supposed to be decoded by the kernel. With | |
| 59 | + liblzma, you need to use either LZMA_CHECK_NONE or LZMA_CHECK_CRC32 | |
| 60 | + when encoding. With the xz command line tool, use --check=none or | |
| 61 | + --check=crc32. | |
| 62 | + | |
| 63 | + Using CRC32 is strongly recommended unless there is some other layer | |
| 64 | + which will verify the integrity of the uncompressed data anyway. | |
| 65 | + Double checking the integrity would probably be waste of CPU cycles. | |
| 66 | + Note that the headers will always have a CRC32 which will be validated | |
| 67 | + by the decoder; you can only change the integrity check type (or | |
| 68 | + disable it) for the actual uncompressed data. | |
| 69 | + | |
| 70 | + In userspace, LZMA2 is typically used with dictionary sizes of several | |
| 71 | + megabytes. The decoder needs to have the dictionary in RAM, thus big | |
| 72 | + dictionaries cannot be used for files that are intended to be decoded | |
| 73 | + by the kernel. 1 MiB is probably the maximum reasonable dictionary | |
| 74 | + size for in-kernel use (maybe more is OK for initramfs). The presets | |
| 75 | + in XZ Utils may not be optimal when creating files for the kernel, | |
| 76 | + so don't hesitate to use custom settings. Example: | |
| 77 | + | |
| 78 | + xz --check=crc32 --lzma2=dict=512KiB inputfile | |
| 79 | + | |
| 80 | + An exception to above dictionary size limitation is when the decoder | |
| 81 | + is used in single-call mode. Decompressing the kernel itself is an | |
| 82 | + example of this situation. In single-call mode, the memory usage | |
| 83 | + doesn't depend on the dictionary size, and it is perfectly fine to | |
| 84 | + use a big dictionary: for maximum compression, the dictionary should | |
| 85 | + be at least as big as the uncompressed data itself. | |
| 86 | + | |
| 87 | +Future plans | |
| 88 | + | |
| 89 | + Creating a limited XZ encoder may be considered if people think it is | |
| 90 | + useful. LZMA2 is slower to compress than e.g. Deflate or LZO even at | |
| 91 | + the fastest settings, so it isn't clear if LZMA2 encoder is wanted | |
| 92 | + into the kernel. | |
| 93 | + | |
| 94 | + Support for limited random-access reading is planned for the | |
| 95 | + decompression code. I don't know if it could have any use in the | |
| 96 | + kernel, but I know that it would be useful in some embedded projects | |
| 97 | + outside the Linux kernel. | |
| 98 | + | |
| 99 | +Conformance to the .xz file format specification | |
| 100 | + | |
| 101 | + There are a couple of corner cases where things have been simplified | |
| 102 | + at expense of detecting errors as early as possible. These should not | |
| 103 | + matter in practice all, since they don't cause security issues. But | |
| 104 | + it is good to know this if testing the code e.g. with the test files | |
| 105 | + from XZ Utils. | |
| 106 | + | |
| 107 | +Reporting bugs | |
| 108 | + | |
| 109 | + Before reporting a bug, please check that it's not fixed already | |
| 110 | + at upstream. See <http://tukaani.org/xz/embedded.html> to get the | |
| 111 | + latest code. | |
| 112 | + | |
| 113 | + Report bugs to <lasse.collin@tukaani.org> or visit #tukaani on | |
| 114 | + Freenode and talk to Larhzu. I don't actively read LKML or other | |
| 115 | + kernel-related mailing lists, so if there's something I should know, | |
| 116 | + you should email to me personally or use IRC. | |
| 117 | + | |
| 118 | + Don't bother Igor Pavlov with questions about the XZ implementation | |
| 119 | + in the kernel or about XZ Utils. While these two implementations | |
| 120 | + include essential code that is directly based on Igor Pavlov's code, | |
| 121 | + these implementations aren't maintained nor supported by him. | |
| @@ -347,8 +347,8 @@ bugzilla.kernel.org是Linux内核开发者们用来跟踪内核Bug的网站。 · 346 unmodified lines | ||
| 347 | 347 | 最新bug的通知,可以订阅bugme-new邮件列表(只有新的bug报告会被寄到这里) |
| 348 | 348 | 或者订阅bugme-janitor邮件列表(所有bugzilla的变动都会被寄到这里)。 |
| 349 | 349 | |
| 350 | − http://lists.osdl.org/mailman/listinfo/bugme-new | |
| 351 | − http://lists.osdl.org/mailman/listinfo/bugme-janitors | |
| 350 | + https://lists.linux-foundation.org/mailman/listinfo/bugme-new | |
| 351 | + https://lists.linux-foundation.org/mailman/listinfo/bugme-janitors | |
| 352 | 352 | |
| 353 | 353 | |
| 354 | 354 | 邮件列表 |
| @@ -61,7 +61,7 @@ Linux 2.4: · 60 unmodified lines | ||
| 61 | 61 | Linux 2.6: |
| 62 | 62 | 除了遵循和 2.4 版内核同样的规则外,你还需要在 linux-kernel 邮件 |
| 63 | 63 | 列表上跟踪最新的 API 变化。向 Linux 2.6 内核提交驱动的顶级联系人 |
| 64 | − 是 Andrew Morton <akpm@osdl.org>。 | |
| 64 | + 是 Andrew Morton <akpm@linux-foundation.org>。 | |
| 65 | 65 | |
| 66 | 66 | 决定设备驱动能否被接受的条件 |
| 67 | 67 | ---------------------------- |
| @@ -162,13 +162,12 @@ L: linux-serial@vger.kernel.org · 161 unmodified lines | ||
| 162 | 162 | W: http://serial.sourceforge.net |
| 163 | 163 | S: Maintained |
| 164 | 164 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty-2.6.git |
| 165 | −F: drivers/serial/8250* | |
| 165 | +F: drivers/tty/serial/8250* | |
| 166 | 166 | F: include/linux/serial_8250.h |
| 167 | 167 | |
| 168 | 168 | 8390 NETWORK DRIVERS [WD80x3/SMC-ELITE, SMC-ULTRA, NE2000, 3C503, etc.] |
| 169 | −M: Paul Gortmaker <p_gortmaker@yahoo.com> | |
| 170 | 169 | L: netdev@vger.kernel.org |
| 171 | −S: Maintained | |
| 170 | +S: Orphan / Obsolete | |
| 172 | 171 | F: drivers/net/*8390* |
| 173 | 172 | F: drivers/net/ax88796.c |
| 174 | 173 | |
| @@ -286,6 +285,41 @@ L: linux-parisc@vger.kernel.org · 111 unmodified lines | ||
| 286 | 285 | S: Maintained |
| 287 | 286 | F: sound/pci/ad1889.* |
| 288 | 287 | |
| 288 | +AD525X ANALOG DEVICES DIGITAL POTENTIOMETERS DRIVER | |
| 289 | +M: Michael Hennerich <michael.hennerich@analog.com> | |
| 290 | +L: device-driver-devel@blackfin.uclinux.org | |
| 291 | +W: http://wiki-analog.com/AD5254 | |
| 292 | +S: Supported | |
| 293 | +F: drivers/misc/ad525x_dpot.c | |
| 294 | + | |
| 295 | +AD5398 CURRENT REGULATOR DRIVER (AD5398/AD5821) | |
| 296 | +M: Michael Hennerich <michael.hennerich@analog.com> | |
| 297 | +L: device-driver-devel@blackfin.uclinux.org | |
| 298 | +W: http://wiki-analog.com/AD5398 | |
| 299 | +S: Supported | |
| 300 | +F: drivers/regulator/ad5398.c | |
| 301 | + | |
| 302 | +AD714X CAPACITANCE TOUCH SENSOR DRIVER (AD7142/3/7/8/7A) | |
| 303 | +M: Michael Hennerich <michael.hennerich@analog.com> | |
| 304 | +L: device-driver-devel@blackfin.uclinux.org | |
| 305 | +W: http://wiki-analog.com/AD7142 | |
| 306 | +S: Supported | |
| 307 | +F: drivers/input/misc/ad714x.c | |
| 308 | + | |
| 309 | +AD7877 TOUCHSCREEN DRIVER | |
| 310 | +M: Michael Hennerich <michael.hennerich@analog.com> | |
| 311 | +L: device-driver-devel@blackfin.uclinux.org | |
| 312 | +W: http://wiki-analog.com/AD7877 | |
| 313 | +S: Supported | |
| 314 | +F: drivers/input/touchscreen/ad7877.c | |
| 315 | + | |
| 316 | +AD7879 TOUCHSCREEN DRIVER (AD7879/AD7889) | |
| 317 | +M: Michael Hennerich <michael.hennerich@analog.com> | |
| 318 | +L: device-driver-devel@blackfin.uclinux.org | |
| 319 | +W: http://wiki-analog.com/AD7879 | |
| 320 | +S: Supported | |
| 321 | +F: drivers/input/touchscreen/ad7879.c | |
| 322 | + | |
| 289 | 323 | ADM1025 HARDWARE MONITOR DRIVER |
| 290 | 324 | M: Jean Delvare <khali@linux-fr.org> |
| 291 | 325 | L: lm-sensors@lm-sensors.org |
| @@ -305,6 +339,32 @@ W: http://linuxwireless.org/ · 13 unmodified lines | ||
| 305 | 339 | S: Orphan |
| 306 | 340 | F: drivers/net/wireless/adm8211.* |
| 307 | 341 | |
| 342 | +ADP5520 BACKLIGHT DRIVER WITH IO EXPANDER (ADP5520/ADP5501) | |
| 343 | +M: Michael Hennerich <michael.hennerich@analog.com> | |
| 344 | +L: device-driver-devel@blackfin.uclinux.org | |
| 345 | +W: http://wiki-analog.com/ADP5520 | |
| 346 | +S: Supported | |
| 347 | +F: drivers/mfd/adp5520.c | |
| 348 | +F: drivers/video/backlight/adp5520_bl.c | |
| 349 | +F: drivers/led/leds-adp5520.c | |
| 350 | +F: drivers/gpio/adp5520-gpio.c | |
| 351 | +F: drivers/input/keyboard/adp5520-keys.c | |
| 352 | + | |
| 353 | +ADP5588 QWERTY KEYPAD AND IO EXPANDER DRIVER (ADP5588/ADP5587) | |
| 354 | +M: Michael Hennerich <michael.hennerich@analog.com> | |
| 355 | +L: device-driver-devel@blackfin.uclinux.org | |
| 356 | +W: http://wiki-analog.com/ADP5588 | |
| 357 | +S: Supported | |
| 358 | +F: drivers/input/keyboard/adp5588-keys.c | |
| 359 | +F: drivers/gpio/adp5588-gpio.c | |
| 360 | + | |
| 361 | +ADP8860 BACKLIGHT DRIVER (ADP8860/ADP8861/ADP8863) | |
| 362 | +M: Michael Hennerich <michael.hennerich@analog.com> | |
| 363 | +L: device-driver-devel@blackfin.uclinux.org | |
| 364 | +W: http://wiki-analog.com/ADP8860 | |
| 365 | +S: Supported | |
| 366 | +F: drivers/video/backlight/adp8860_bl.c | |
| 367 | + | |
| 308 | 368 | ADT746X FAN DRIVER |
| 309 | 369 | M: Colin Leroy <colin@colino.net> |
| 310 | 370 | S: Maintained |
| @@ -317,6 +377,13 @@ S: Maintained · 6 unmodified lines | ||
| 317 | 377 | F: Documentation/hwmon/adt7475 |
| 318 | 378 | F: drivers/hwmon/adt7475.c |
| 319 | 379 | |
| 380 | +ADXL34X THREE-AXIS DIGITAL ACCELEROMETER DRIVER (ADXL345/ADXL346) | |
| 381 | +M: Michael Hennerich <michael.hennerich@analog.com> | |
| 382 | +L: device-driver-devel@blackfin.uclinux.org | |
| 383 | +W: http://wiki-analog.com/ADXL345 | |
| 384 | +S: Supported | |
| 385 | +F: drivers/input/misc/adxl34x.c | |
| 386 | + | |
| 320 | 387 | ADVANSYS SCSI DRIVER |
| 321 | 388 | M: Matthew Wilcox <matthew@wil.cx> |
| 322 | 389 | L: linux-scsi@vger.kernel.org |
| @@ -429,7 +496,6 @@ S: Supported · 106 unmodified lines | ||
| 429 | 496 | F: arch/x86/kernel/microcode_amd.c |
| 430 | 497 | |
| 431 | 498 | AMS (Apple Motion Sensor) DRIVER |
| 432 | −M: Stelian Pop <stelian@popies.net> | |
| 433 | 499 | M: Michael Hanselmann <linux-kernel@hansmi.ch> |
| 434 | 500 | S: Supported |
| 435 | 501 | F: drivers/macintosh/ams/ |
| @@ -441,17 +507,23 @@ L: linux-rdma@vger.kernel.org · 5 unmodified lines | ||
| 441 | 507 | S: Maintained |
| 442 | 508 | F: drivers/infiniband/hw/amso1100/ |
| 443 | 509 | |
| 444 | −ANALOG DEVICES INC ASOC DRIVERS | |
| 445 | −L: uclinux-dist-devel@blackfin.uclinux.org | |
| 510 | +ANALOG DEVICES INC ASOC CODEC DRIVERS | |
| 511 | +L: device-driver-devel@blackfin.uclinux.org | |
| 446 | 512 | L: alsa-devel@alsa-project.org (moderated for non-subscribers) |
| 447 | −W: http://blackfin.uclinux.org/ | |
| 513 | +W: http://wiki-analog.com/ | |
| 448 | 514 | S: Supported |
| 449 | −F: sound/soc/blackfin/* | |
| 450 | 515 | F: sound/soc/codecs/ad1* |
| 451 | 516 | F: sound/soc/codecs/adau* |
| 452 | 517 | F: sound/soc/codecs/adav* |
| 453 | 518 | F: sound/soc/codecs/ssm* |
| 454 | 519 | |
| 520 | +ANALOG DEVICES INC ASOC DRIVERS | |
| 521 | +L: uclinux-dist-devel@blackfin.uclinux.org | |
| 522 | +L: alsa-devel@alsa-project.org (moderated for non-subscribers) | |
| 523 | +W: http://blackfin.uclinux.org/ | |
| 524 | +S: Supported | |
| 525 | +F: sound/soc/blackfin/* | |
| 526 | + | |
| 455 | 527 | AOA (Apple Onboard Audio) ALSA DRIVER |
| 456 | 528 | M: Johannes Berg <johannes@sipsolutions.net> |
| 457 | 529 | L: linuxppc-dev@lists.ozlabs.org |
| @@ -552,11 +624,15 @@ M: Lennert Buytenhek <kernel@wantstofly.org> · 94 unmodified lines | ||
| 552 | 624 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
| 553 | 625 | S: Maintained |
| 554 | 626 | |
| 555 | −ARM/ATMEL AT91RM9200 ARM ARCHITECTURE | |
| 627 | +ARM/ATMEL AT91RM9200 AND AT91SAM ARM ARCHITECTURES | |
| 556 | 628 | M: Andrew Victor <linux@maxim.org.za> |
| 629 | +M: Nicolas Ferre <nicolas.ferre@atmel.com> | |
| 630 | +M: Jean-Christophe Plagniol-Villard <plagnioj@jcrosoft.com> | |
| 557 | 631 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
| 558 | 632 | W: http://maxim.org.za/at91_26.html |
| 559 | −S: Maintained | |
| 633 | +W: http://www.linux4sam.org | |
| 634 | +S: Supported | |
| 635 | +F: arch/arm/mach-at91/ | |
| 560 | 636 | |
| 561 | 637 | ARM/BCMRING ARM ARCHITECTURE |
| 562 | 638 | M: Jiandong Zheng <jdzheng@broadcom.com> |
| @@ -809,15 +885,15 @@ S: Supported · 246 unmodified lines | ||
| 809 | 885 | |
| 810 | 886 | ARM/QUALCOMM MSM MACHINE SUPPORT |
| 811 | 887 | M: David Brown <davidb@codeaurora.org> |
| 812 | −M: Daniel Walker <dwalker@codeaurora.org> | |
| 888 | +M: Daniel Walker <dwalker@fifo99.com> | |
| 813 | 889 | M: Bryan Huntsman <bryanh@codeaurora.org> |
| 814 | 890 | L: linux-arm-msm@vger.kernel.org |
| 815 | 891 | F: arch/arm/mach-msm/ |
| 816 | 892 | F: drivers/video/msm/ |
| 817 | 893 | F: drivers/mmc/host/msm_sdcc.c |
| 818 | 894 | F: drivers/mmc/host/msm_sdcc.h |
| 819 | −F: drivers/serial/msm_serial.h | |
| 820 | −F: drivers/serial/msm_serial.c | |
| 895 | +F: drivers/tty/serial/msm_serial.h | |
| 896 | +F: drivers/tty/serial/msm_serial.c | |
| 821 | 897 | T: git git://codeaurora.org/quic/kernel/davidb/linux-msm.git |
| 822 | 898 | S: Maintained |
| 823 | 899 | |
| @@ -902,6 +978,8 @@ S: Maintained · 78 unmodified lines | ||
| 902 | 978 | F: arch/arm/plat-samsung/ |
| 903 | 979 | F: arch/arm/plat-s3c24xx/ |
| 904 | 980 | F: arch/arm/plat-s5p/ |
| 981 | +F: drivers/*/*s3c2410* | |
| 982 | +F: drivers/*/*/*s3c2410* | |
| 905 | 983 | |
| 906 | 984 | ARM/S3C2410 ARM ARCHITECTURE |
| 907 | 985 | M: Ben Dooks <ben-linux@fluff.org> |
| @@ -1095,6 +1173,12 @@ S: Supported · 187 unmodified lines | ||
| 1095 | 1173 | F: Documentation/aoe/ |
| 1096 | 1174 | F: drivers/block/aoe/ |
| 1097 | 1175 | |
| 1176 | +ATHEROS ATH GENERIC UTILITIES | |
| 1177 | +M: "Luis R. Rodriguez" <lrodriguez@atheros.com> | |
| 1178 | +L: linux-wireless@vger.kernel.org | |
| 1179 | +S: Supported | |
| 1180 | +F: drivers/net/wireless/ath/* | |
| 1181 | + | |
| 1098 | 1182 | ATHEROS ATH5K WIRELESS DRIVER |
| 1099 | 1183 | M: Jiri Slaby <jirislaby@gmail.com> |
| 1100 | 1184 | M: Nick Kossifidis <mickflemm@gmail.com> |
| @@ -1178,7 +1262,7 @@ F: drivers/mmc/host/atmel-mci-regs.h · 77 unmodified lines | ||
| 1178 | 1262 | ATMEL AT91 / AT32 SERIAL DRIVER |
| 1179 | 1263 | M: Nicolas Ferre <nicolas.ferre@atmel.com> |
| 1180 | 1264 | S: Supported |
| 1181 | −F: drivers/serial/atmel_serial.c | |
| 1265 | +F: drivers/tty/serial/atmel_serial.c | |
| 1182 | 1266 | |
| 1183 | 1267 | ATMEL LCDFB DRIVER |
| 1184 | 1268 | M: Nicolas Ferre <nicolas.ferre@atmel.com> |
| @@ -1273,6 +1357,15 @@ S: Maintained · 88 unmodified lines | ||
| 1273 | 1357 | F: drivers/video/backlight/ |
| 1274 | 1358 | F: include/linux/backlight.h |
| 1275 | 1359 | |
| 1360 | +BATMAN ADVANCED | |
| 1361 | +M: Marek Lindner <lindner_marek@yahoo.de> | |
| 1362 | +M: Simon Wunderlich <siwu@hrz.tu-chemnitz.de> | |
| 1363 | +M: Sven Eckelmann <sven@narfation.org> | |
| 1364 | +L: b.a.t.m.a.n@lists.open-mesh.org | |
| 1365 | +W: http://www.open-mesh.org/ | |
| 1366 | +S: Maintained | |
| 1367 | +F: net/batman-adv/ | |
| 1368 | + | |
| 1276 | 1369 | BAYCOM/HDLCDRV DRIVERS FOR AX.25 |
| 1277 | 1370 | M: Thomas Sailer <t.sailer@alumni.ethz.ch> |
| 1278 | 1371 | L: linux-hams@vger.kernel.org |
| @@ -1325,7 +1418,7 @@ M: Sonic Zhang <sonic.zhang@analog.com> · 46 unmodified lines | ||
| 1325 | 1418 | L: uclinux-dist-devel@blackfin.uclinux.org |
| 1326 | 1419 | W: http://blackfin.uclinux.org |
| 1327 | 1420 | S: Supported |
| 1328 | −F: drivers/serial/bfin_5xx.c | |
| 1421 | +F: drivers/tty/serial/bfin_5xx.c | |
| 1329 | 1422 | |
| 1330 | 1423 | BLACKFIN WATCHDOG DRIVER |
| 1331 | 1424 | M: Mike Frysinger <vapier.adi@gmail.com> |
| @@ -1409,7 +1502,9 @@ F: drivers/net/tg3.* · 77 unmodified lines | ||
| 1409 | 1502 | BROADCOM BRCM80211 IEEE802.11n WIRELESS DRIVER |
| 1410 | 1503 | M: Brett Rudley <brudley@broadcom.com> |
| 1411 | 1504 | M: Henry Ptasinski <henryp@broadcom.com> |
| 1412 | −M: Nohee Ko <noheek@broadcom.com> | |
| 1505 | +M: Dowan Kim <dowan@broadcom.com> | |
| 1506 | +M: Roland Vossen <rvossen@broadcom.com> | |
| 1507 | +M: Arend van Spriel <arend@broadcom.com> | |
| 1413 | 1508 | L: linux-wireless@vger.kernel.org |
| 1414 | 1509 | S: Supported |
| 1415 | 1510 | F: drivers/staging/brcm80211/ |
| @@ -1434,6 +1529,14 @@ S: Supported · 18 unmodified lines | ||
| 1434 | 1529 | F: block/bsg.c |
| 1435 | 1530 | F: include/linux/bsg.h |
| 1436 | 1531 | |
| 1532 | +BT87X AUDIO DRIVER | |
| 1533 | +M: Clemens Ladisch <clemens@ladisch.de> | |
| 1534 | +L: alsa-devel@alsa-project.org (moderated for non-subscribers) | |
| 1535 | +T: git git://git.alsa-project.org/alsa-kernel.git | |
| 1536 | +S: Maintained | |
| 1537 | +F: Documentation/sound/alsa/Bt87x.txt | |
| 1538 | +F: sound/pci/bt87x.c | |
| 1539 | + | |
| 1437 | 1540 | BT8XXGPIO DRIVER |
| 1438 | 1541 | M: Michael Buesch <mb@bu3sch.de> |
| 1439 | 1542 | W: http://bu3sch.de/btgpio.php |
| @@ -1459,6 +1562,13 @@ S: Maintained · 19 unmodified lines | ||
| 1459 | 1562 | F: Documentation/video4linux/bttv/ |
| 1460 | 1563 | F: drivers/media/video/bt8xx/bttv* |
| 1461 | 1564 | |
| 1565 | +C-MEDIA CMI8788 DRIVER | |
| 1566 | +M: Clemens Ladisch <clemens@ladisch.de> | |
| 1567 | +L: alsa-devel@alsa-project.org (moderated for non-subscribers) | |
| 1568 | +T: git git://git.alsa-project.org/alsa-kernel.git | |
| 1569 | +S: Maintained | |
| 1570 | +F: sound/pci/oxygen/ | |
| 1571 | + | |
| 1462 | 1572 | CACHEFILES: FS-CACHE BACKEND FOR CACHING ON MOUNTED FILESYSTEMS |
| 1463 | 1573 | M: David Howells <dhowells@redhat.com> |
| 1464 | 1574 | L: linux-cachefs@redhat.com |
| @@ -1695,7 +1805,8 @@ S: Maintained · 230 unmodified lines | ||
| 1695 | 1805 | F: drivers/usb/atm/cxacru.c |
| 1696 | 1806 | |
| 1697 | 1807 | CONFIGFS |
| 1698 | −M: Joel Becker <joel.becker@oracle.com> | |
| 1808 | +M: Joel Becker <jlbec@evilplan.org> | |
| 1809 | +T: git git://git.kernel.org/pub/scm/linux/kernel/git/jlbec/configfs.git | |
| 1699 | 1810 | S: Supported |
| 1700 | 1811 | F: fs/configfs/ |
| 1701 | 1812 | F: include/linux/configfs.h |
| @@ -1772,7 +1883,7 @@ L: linux-cris-kernel@axis.com · 70 unmodified lines | ||
| 1772 | 1883 | W: http://developer.axis.com |
| 1773 | 1884 | S: Maintained |
| 1774 | 1885 | F: arch/cris/ |
| 1775 | −F: drivers/serial/crisv10.* | |
| 1886 | +F: drivers/tty/serial/crisv10.* | |
| 1776 | 1887 | |
| 1777 | 1888 | CRYPTO API |
| 1778 | 1889 | M: Herbert Xu <herbert@gondor.apana.org.au> |
| @@ -1917,7 +2028,7 @@ F: drivers/scsi/dc395x.* · 138 unmodified lines | ||
| 1917 | 2028 | DCCP PROTOCOL |
| 1918 | 2029 | M: Arnaldo Carvalho de Melo <acme@ghostprotocols.net> |
| 1919 | 2030 | L: dccp@vger.kernel.org |
| 1920 | −W: http://linux-net.osdl.org/index.php/DCCP | |
| 2031 | +W: http://www.linuxfoundation.org/collaborate/workgroups/networking/dccp | |
| 1921 | 2032 | S: Maintained |
| 1922 | 2033 | F: include/linux/dccp.h |
| 1923 | 2034 | F: include/linux/tfrc.h |
| @@ -2015,6 +2126,7 @@ S: Supported · 91 unmodified lines | ||
| 2015 | 2126 | F: fs/dlm/ |
| 2016 | 2127 | |
| 2017 | 2128 | DMA GENERIC OFFLOAD ENGINE SUBSYSTEM |
| 2129 | +M: Vinod Koul <vinod.koul@intel.com> | |
| 2018 | 2130 | M: Dan Williams <dan.j.williams@intel.com> |
| 2019 | 2131 | S: Supported |
| 2020 | 2132 | F: drivers/dma/ |
| @@ -2111,7 +2223,7 @@ F: drivers/net/wan/dscc4.c · 90 unmodified lines | ||
| 2111 | 2223 | DZ DECSTATION DZ11 SERIAL DRIVER |
| 2112 | 2224 | M: "Maciej W. Rozycki" <macro@linux-mips.org> |
| 2113 | 2225 | S: Maintained |
| 2114 | −F: drivers/serial/dz.* | |
| 2226 | +F: drivers/tty/serial/dz.* | |
| 2115 | 2227 | |
| 2116 | 2228 | EATA-DMA SCSI DRIVER |
| 2117 | 2229 | M: Michael Neuffer <mike@i-Connect.Net> |
| @@ -2249,6 +2361,13 @@ W: bluesmoke.sourceforge.net · 131 unmodified lines | ||
| 2249 | 2361 | S: Maintained |
| 2250 | 2362 | F: drivers/edac/r82600_edac.c |
| 2251 | 2363 | |
| 2364 | +EDIROL UA-101/UA-1000 DRIVER | |
| 2365 | +M: Clemens Ladisch <clemens@ladisch.de> | |
| 2366 | +L: alsa-devel@alsa-project.org (moderated for non-subscribers) | |
| 2367 | +T: git git://git.alsa-project.org/alsa-kernel.git | |
| 2368 | +S: Maintained | |
| 2369 | +F: sound/usb/misc/ua101.c | |
| 2370 | + | |
| 2252 | 2371 | EEEPC LAPTOP EXTRAS DRIVER |
| 2253 | 2372 | M: Corentin Chary <corentincj@iksaif.net> |
| 2254 | 2373 | L: acpi4asus-user@lists.sourceforge.net |
| @@ -2257,6 +2376,14 @@ W: http://acpi4asus.sf.net · 2 unmodified lines | ||
| 2257 | 2376 | S: Maintained |
| 2258 | 2377 | F: drivers/platform/x86/eeepc-laptop.c |
| 2259 | 2378 | |
| 2379 | +EEEPC WMI EXTRAS DRIVER | |
| 2380 | +M: Corentin Chary <corentincj@iksaif.net> | |
| 2381 | +L: acpi4asus-user@lists.sourceforge.net | |
| 2382 | +L: platform-driver-x86@vger.kernel.org | |
| 2383 | +W: http://acpi4asus.sf.net | |
| 2384 | +S: Maintained | |
| 2385 | +F: drivers/platform/x86/eeepc-wmi.c | |
| 2386 | + | |
| 2260 | 2387 | EFIFB FRAMEBUFFER DRIVER |
| 2261 | 2388 | L: linux-fbdev@vger.kernel.org |
| 2262 | 2389 | M: Peter Jones <pjones@redhat.com> |
| @@ -2331,7 +2458,7 @@ ETHERNET BRIDGE · 68 unmodified lines | ||
| 2331 | 2458 | M: Stephen Hemminger <shemminger@linux-foundation.org> |
| 2332 | 2459 | L: bridge@lists.linux-foundation.org |
| 2333 | 2460 | L: netdev@vger.kernel.org |
| 2334 | −W: http://www.linux-foundation.org/en/Net:Bridge | |
| 2461 | +W: http://www.linuxfoundation.org/en/Net:Bridge | |
| 2335 | 2462 | S: Maintained |
| 2336 | 2463 | F: include/linux/netfilter_bridge/ |
| 2337 | 2464 | F: net/bridge/ |
| @@ -2523,7 +2650,7 @@ FREESCALE QUICC ENGINE UCC UART DRIVER · 185 unmodified lines | ||
| 2523 | 2650 | M: Timur Tabi <timur@freescale.com> |
| 2524 | 2651 | L: linuxppc-dev@lists.ozlabs.org |
| 2525 | 2652 | S: Supported |
| 2526 | −F: drivers/serial/ucc_uart.c | |
| 2653 | +F: drivers/tty/serial/ucc_uart.c | |
| 2527 | 2654 | |
| 2528 | 2655 | FREESCALE SOC SOUND DRIVERS |
| 2529 | 2656 | M: Timur Tabi <timur@freescale.com> |
| @@ -2594,6 +2721,14 @@ S: Supported · 64 unmodified lines | ||
| 2594 | 2721 | F: drivers/i2c/busses/i2c-gpio.c |
| 2595 | 2722 | F: include/linux/i2c-gpio.h |
| 2596 | 2723 | |
| 2724 | +GENERIC GPIO I2C MULTIPLEXER DRIVER | |
| 2725 | +M: Peter Korsgaard <peter.korsgaard@barco.com> | |
| 2726 | +L: linux-i2c@vger.kernel.org | |
| 2727 | +S: Supported | |
| 2728 | +F: drivers/i2c/muxes/gpio-i2cmux.c | |
| 2729 | +F: include/linux/gpio-i2cmux.h | |
| 2730 | +F: Documentation/i2c/muxes/gpio-i2cmux | |
| 2731 | + | |
| 2597 | 2732 | GENERIC HDLC (WAN) DRIVERS |
| 2598 | 2733 | M: Krzysztof Halasa <khc@pm.waw.pl> |
| 2599 | 2734 | W: http://www.kernel.org/pub/linux/utils/net/hdlc/ |
| @@ -2640,6 +2775,15 @@ F: Documentation/isdn/README.gigaset · 40 unmodified lines | ||
| 2640 | 2775 | F: drivers/isdn/gigaset/ |
| 2641 | 2776 | F: include/linux/gigaset_dev.h |
| 2642 | 2777 | |
| 2778 | +GPIO SUBSYSTEM | |
| 2779 | +M: Grant Likely <grant.likely@secretlab.ca> | |
| 2780 | +L: linux-kernel@vger.kernel.org | |
| 2781 | +S: Maintained | |
| 2782 | +T: git git://git.secretlab.ca/git/linux-2.6.git | |
| 2783 | +F: Documentation/gpio/gpio.txt | |
| 2784 | +F: drivers/gpio/ | |
| 2785 | +F: include/linux/gpio* | |
| 2786 | + | |
| 2643 | 2787 | GRETH 10/100/1G Ethernet MAC device driver |
| 2644 | 2788 | M: Kristoffer Glembo <kristoffer@gaisler.com> |
| 2645 | 2789 | L: netdev@vger.kernel.org |
| @@ -2729,7 +2873,6 @@ M: Guenter Roeck <guenter.roeck@ericsson.com> · 83 unmodified lines | ||
| 2729 | 2873 | L: lm-sensors@lm-sensors.org |
| 2730 | 2874 | W: http://www.lm-sensors.org/ |
| 2731 | 2875 | T: quilt kernel.org/pub/linux/kernel/people/jdelvare/linux-2.6/jdelvare-hwmon/ |
| 2732 | −T: quilt kernel.org/pub/linux/kernel/people/groeck/linux-staging/ | |
| 2733 | 2876 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging.git |
| 2734 | 2877 | S: Maintained |
| 2735 | 2878 | F: Documentation/hwmon/ |
| @@ -2812,6 +2955,10 @@ M: Thomas Gleixner <tglx@linutronix.de> · 76 unmodified lines | ||
| 2812 | 2955 | S: Maintained |
| 2813 | 2956 | F: Documentation/timers/ |
| 2814 | 2957 | F: kernel/hrtimer.c |
| 2958 | +F: kernel/time/clockevents.c | |
| 2959 | +F: kernel/time/tick*.* | |
| 2960 | +F: kernel/time/timer_*.c | |
| 2961 | +F include/linux/clockevents.h | |
| 2815 | 2962 | F: include/linux/hrtimer.h |
| 2816 | 2963 | |
| 2817 | 2964 | HIGH-SPEED SCC DRIVER FOR AX.25 |
| @@ -3003,6 +3150,12 @@ S: Maintained · 185 unmodified lines | ||
| 3003 | 3150 | F: net/ieee802154/ |
| 3004 | 3151 | F: drivers/ieee802154/ |
| 3005 | 3152 | |
| 3153 | +IKANOS/ADI EAGLE ADSL USB DRIVER | |
| 3154 | +M: Matthieu Castet <castet.matthieu@free.fr> | |
| 3155 | +M: Stanislaw Gruszka <stf_xl@wp.pl> | |
| 3156 | +S: Maintained | |
| 3157 | +F: drivers/usb/atm/ueagle-atm.c | |
| 3158 | + | |
| 3006 | 3159 | INTEGRITY MEASUREMENT ARCHITECTURE (IMA) |
| 3007 | 3160 | M: Mimi Zohar <zohar@us.ibm.com> |
| 3008 | 3161 | S: Supported |
| @@ -3014,7 +3167,7 @@ S: Orphan · 5 unmodified lines | ||
| 3014 | 3167 | F: drivers/video/imsttfb.c |
| 3015 | 3168 | |
| 3016 | 3169 | INFINIBAND SUBSYSTEM |
| 3017 | −M: Roland Dreier <rolandd@cisco.com> | |
| 3170 | +M: Roland Dreier <roland@kernel.org> | |
| 3018 | 3171 | M: Sean Hefty <sean.hefty@intel.com> |
| 3019 | 3172 | M: Hal Rosenstock <hal.rosenstock@gmail.com> |
| 3020 | 3173 | L: linux-rdma@vger.kernel.org |
| @@ -3047,8 +3200,10 @@ F: drivers/input/ · 26 unmodified lines | ||
| 3047 | 3200 | INPUT MULTITOUCH (MT) PROTOCOL |
| 3048 | 3201 | M: Henrik Rydberg <rydberg@euromail.se> |
| 3049 | 3202 | L: linux-input@vger.kernel.org |
| 3203 | +T: git git://git.kernel.org/pub/scm/linux/kernel/git/rydberg/input-mt.git | |
| 3050 | 3204 | S: Maintained |
| 3051 | 3205 | F: Documentation/input/multi-touch-protocol.txt |
| 3206 | +F: drivers/input/input-mt.c | |
| 3052 | 3207 | K: \b(ABS|SYN)_MT_ |
| 3053 | 3208 | |
| 3054 | 3209 | INTEL IDLE DRIVER |
| @@ -3135,6 +3290,8 @@ M: Alex Duyck <alexander.h.duyck@intel.com> · 80 unmodified lines | ||
| 3135 | 3290 | M: John Ronciak <john.ronciak@intel.com> |
| 3136 | 3291 | L: e1000-devel@lists.sourceforge.net |
| 3137 | 3292 | W: http://e1000.sourceforge.net/ |
| 3293 | +T: git git://git.kernel.org/pub/scm/linux/kernel/git/jkirsher/net-2.6.git | |
| 3294 | +T: git git://git.kernel.org/pub/scm/linux/kernel/git/jkirsher/net-next-2.6.git | |
| 3138 | 3295 | S: Supported |
| 3139 | 3296 | F: Documentation/networking/e100.txt |
| 3140 | 3297 | F: Documentation/networking/e1000.txt |
| @@ -3187,7 +3344,6 @@ F: drivers/net/wimax/i2400m/ · 46 unmodified lines | ||
| 3187 | 3344 | F: include/linux/wimax/i2400m.h |
| 3188 | 3345 | |
| 3189 | 3346 | INTEL WIRELESS WIFI LINK (iwlwifi) |
| 3190 | −M: Reinette Chatre <reinette.chatre@intel.com> | |
| 3191 | 3347 | M: Wey-Yi Guy <wey-yi.w.guy@intel.com> |
| 3192 | 3348 | M: Intel Linux Wireless <ilw@linux.intel.com> |
| 3193 | 3349 | L: linux-wireless@vger.kernel.org |
| @@ -3214,7 +3370,7 @@ IOC3 SERIAL DRIVER · 20 unmodified lines | ||
| 3214 | 3370 | M: Pat Gefre <pfg@sgi.com> |
| 3215 | 3371 | L: linux-serial@vger.kernel.org |
| 3216 | 3372 | S: Maintained |
| 3217 | −F: drivers/serial/ioc3_serial.c | |
| 3373 | +F: drivers/tty/serial/ioc3_serial.c | |
| 3218 | 3374 | |
| 3219 | 3375 | IP MASQUERADING |
| 3220 | 3376 | M: Juanjo Ciarlante <jjciarla@raiz.uncu.edu.ar> |
| @@ -3391,7 +3547,14 @@ JSM Neo PCI based serial card · 170 unmodified lines | ||
| 3391 | 3547 | M: Breno Leitao <leitao@linux.vnet.ibm.com> |
| 3392 | 3548 | L: linux-serial@vger.kernel.org |
| 3393 | 3549 | S: Maintained |
| 3394 | −F: drivers/serial/jsm/ | |
| 3550 | +F: drivers/tty/serial/jsm/ | |
| 3551 | + | |
| 3552 | +K10TEMP HARDWARE MONITORING DRIVER | |
| 3553 | +M: Clemens Ladisch <clemens@ladisch.de> | |
| 3554 | +L: lm-sensors@lm-sensors.org | |
| 3555 | +S: Maintained | |
| 3556 | +F: Documentation/hwmon/k10temp | |
| 3557 | +F: drivers/hwmon/k10temp.c | |
| 3395 | 3558 | |
| 3396 | 3559 | K8TEMP HARDWARE MONITORING DRIVER |
| 3397 | 3560 | M: Rudolf Marek <r.marek@assembler.cz> |
| @@ -3527,6 +3690,28 @@ F: include/linux/key-type.h · 129 unmodified lines | ||
| 3527 | 3690 | F: include/keys/ |
| 3528 | 3691 | F: security/keys/ |
| 3529 | 3692 | |
| 3693 | +KEYS-TRUSTED | |
| 3694 | +M: David Safford <safford@watson.ibm.com> | |
| 3695 | +M: Mimi Zohar <zohar@us.ibm.com> | |
| 3696 | +L: linux-security-module@vger.kernel.org | |
| 3697 | +L: keyrings@linux-nfs.org | |
| 3698 | +S: Supported | |
| 3699 | +F: Documentation/keys-trusted-encrypted.txt | |
| 3700 | +F: include/keys/trusted-type.h | |
| 3701 | +F: security/keys/trusted.c | |
| 3702 | +F: security/keys/trusted.h | |
| 3703 | + | |
| 3704 | +KEYS-ENCRYPTED | |
| 3705 | +M: Mimi Zohar <zohar@us.ibm.com> | |
| 3706 | +M: David Safford <safford@watson.ibm.com> | |
| 3707 | +L: linux-security-module@vger.kernel.org | |
| 3708 | +L: keyrings@linux-nfs.org | |
| 3709 | +S: Supported | |
| 3710 | +F: Documentation/keys-trusted-encrypted.txt | |
| 3711 | +F: include/keys/encrypted-type.h | |
| 3712 | +F: security/keys/encrypted.c | |
| 3713 | +F: security/keys/encrypted.h | |
| 3714 | + | |
| 3530 | 3715 | KGDB / KDB /debug_core |
| 3531 | 3716 | M: Jason Wessel <jason.wessel@windriver.com> |
| 3532 | 3717 | W: http://kgdb.wiki.kernel.org/ |
| @@ -3534,14 +3719,14 @@ L: kgdb-bugreport@lists.sourceforge.net · 1 unmodified line | ||
| 3534 | 3719 | S: Maintained |
| 3535 | 3720 | F: Documentation/DocBook/kgdb.tmpl |
| 3536 | 3721 | F: drivers/misc/kgdbts.c |
| 3537 | −F: drivers/serial/kgdboc.c | |
| 3722 | +F: drivers/tty/serial/kgdboc.c | |
| 3538 | 3723 | F: include/linux/kdb.h |
| 3539 | 3724 | F: include/linux/kgdb.h |
| 3540 | 3725 | F: kernel/debug/ |
| 3541 | 3726 | |
| 3542 | 3727 | KMEMCHECK |
| 3543 | 3728 | M: Vegard Nossum <vegardno@ifi.uio.no> |
| 3544 | −M: Pekka Enberg <penberg@cs.helsinki.fi> | |
| 3729 | +M: Pekka Enberg <penberg@kernel.org> | |
| 3545 | 3730 | S: Maintained |
| 3546 | 3731 | F: Documentation/kmemcheck.txt |
| 3547 | 3732 | F: arch/x86/include/asm/kmemcheck.h |
| @@ -3978,9 +4163,8 @@ F: include/linux/module.h · 430 unmodified lines | ||
| 3978 | 4163 | F: kernel/module.c |
| 3979 | 4164 | |
| 3980 | 4165 | MOTION EYE VAIO PICTUREBOOK CAMERA DRIVER |
| 3981 | −M: Stelian Pop <stelian@popies.net> | |
| 3982 | 4166 | W: http://popies.net/meye/ |
| 3983 | −S: Maintained | |
| 4167 | +S: Orphan | |
| 3984 | 4168 | F: Documentation/video4linux/meye.txt |
| 3985 | 4169 | F: drivers/media/video/meye.* |
| 3986 | 4170 | F: include/linux/meye.h |
| @@ -4246,6 +4430,7 @@ NILFS2 FILESYSTEM · 259 unmodified lines | ||
| 4246 | 4430 | M: KONISHI Ryusuke <konishi.ryusuke@lab.ntt.co.jp> |
| 4247 | 4431 | L: linux-nilfs@vger.kernel.org |
| 4248 | 4432 | W: http://www.nilfs.org/en/ |
| 4433 | +T: git git://git.kernel.org/pub/scm/linux/kernel/git/ryusuke/nilfs2.git | |
| 4249 | 4434 | S: Supported |
| 4250 | 4435 | F: Documentation/filesystems/nilfs2.txt |
| 4251 | 4436 | F: fs/nilfs2/ |
| @@ -4267,11 +4452,11 @@ F: Documentation/scsi/NinjaSCSI.txt · 15 unmodified lines | ||
| 4267 | 4452 | F: drivers/scsi/nsp32* |
| 4268 | 4453 | |
| 4269 | 4454 | NTFS FILESYSTEM |
| 4270 | −M: Anton Altaparmakov <aia21@cantab.net> | |
| 4455 | +M: Anton Altaparmakov <anton@tuxera.com> | |
| 4271 | 4456 | L: linux-ntfs-dev@lists.sourceforge.net |
| 4272 | −W: http://www.linux-ntfs.org/ | |
| 4457 | +W: http://www.tuxera.com/ | |
| 4273 | 4458 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/aia21/ntfs-2.6.git |
| 4274 | −S: Maintained | |
| 4459 | +S: Supported | |
| 4275 | 4460 | F: Documentation/filesystems/ntfs.txt |
| 4276 | 4461 | F: fs/ntfs/ |
| 4277 | 4462 | |
| @@ -4343,6 +4528,20 @@ M: Deepak Saxena <dsaxena@plexity.net> · 65 unmodified lines | ||
| 4343 | 4528 | S: Maintained |
| 4344 | 4529 | F: drivers/char/hw_random/omap-rng.c |
| 4345 | 4530 | |
| 4531 | +OMAP HWMOD SUPPORT | |
| 4532 | +M: Benoît Cousson <b-cousson@ti.com> | |
| 4533 | +M: Paul Walmsley <paul@pwsan.com> | |
| 4534 | +L: linux-omap@vger.kernel.org | |
| 4535 | +S: Maintained | |
| 4536 | +F: arch/arm/mach-omap2/omap_hwmod.c | |
| 4537 | +F: arch/arm/plat-omap/include/plat/omap_hwmod.h | |
| 4538 | + | |
| 4539 | +OMAP HWMOD DATA FOR OMAP4-BASED DEVICES | |
| 4540 | +M: Benoît Cousson <b-cousson@ti.com> | |
| 4541 | +L: linux-omap@vger.kernel.org | |
| 4542 | +S: Maintained | |
| 4543 | +F: arch/arm/mach-omap2/omap_hwmod_44xx_data.c | |
| 4544 | + | |
| 4346 | 4545 | OMAP USB SUPPORT |
| 4347 | 4546 | M: Felipe Balbi <balbi@ti.com> |
| 4348 | 4547 | M: David Brownell <dbrownell@users.sourceforge.net> |
| @@ -4401,7 +4600,7 @@ F: drivers/i2c/busses/i2c-ocores.c · 52 unmodified lines | ||
| 4401 | 4600 | |
| 4402 | 4601 | OPEN FIRMWARE AND FLATTENED DEVICE TREE |
| 4403 | 4602 | M: Grant Likely <grant.likely@secretlab.ca> |
| 4404 | −L: devicetree-discuss@lists.ozlabs.org | |
| 4603 | +L: devicetree-discuss@lists.ozlabs.org (moderated for non-subscribers) | |
| 4405 | 4604 | W: http://fdt.secretlab.ca |
| 4406 | 4605 | T: git git://git.secretlab.ca/git/linux-2.6.git |
| 4407 | 4606 | S: Maintained |
| @@ -4409,6 +4608,13 @@ F: drivers/of · 1 unmodified line | ||
| 4409 | 4608 | F: include/linux/of*.h |
| 4410 | 4609 | K: of_get_property |
| 4411 | 4610 | |
| 4611 | +OPL4 DRIVER | |
| 4612 | +M: Clemens Ladisch <clemens@ladisch.de> | |
| 4613 | +L: alsa-devel@alsa-project.org (moderated for non-subscribers) | |
| 4614 | +T: git git://git.alsa-project.org/alsa-kernel.git | |
| 4615 | +S: Maintained | |
| 4616 | +F: sound/drivers/opl4/ | |
| 4617 | + | |
| 4412 | 4618 | OPROFILE |
| 4413 | 4619 | M: Robert Richter <robert.richter@amd.com> |
| 4414 | 4620 | L: oprofile-list@lists.sf.net |
| @@ -4420,7 +4626,7 @@ F: include/linux/oprofile.h · 5 unmodified lines | ||
| 4420 | 4626 | |
| 4421 | 4627 | ORACLE CLUSTER FILESYSTEM 2 (OCFS2) |
| 4422 | 4628 | M: Mark Fasheh <mfasheh@suse.com> |
| 4423 | −M: Joel Becker <joel.becker@oracle.com> | |
| 4629 | +M: Joel Becker <jlbec@evilplan.org> | |
| 4424 | 4630 | L: ocfs2-devel@oss.oracle.com (moderated for non-subscribers) |
| 4425 | 4631 | W: http://oss.oracle.com/projects/ocfs2/ |
| 4426 | 4632 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/jlbec/ocfs2.git |
| @@ -4505,7 +4711,7 @@ M: Jeremy Fitzhardinge <jeremy@xensource.com> · 78 unmodified lines | ||
| 4505 | 4711 | M: Chris Wright <chrisw@sous-sol.org> |
| 4506 | 4712 | M: Alok Kataria <akataria@vmware.com> |
| 4507 | 4713 | M: Rusty Russell <rusty@rustcorp.com.au> |
| 4508 | −L: virtualization@lists.osdl.org | |
| 4714 | +L: virtualization@lists.linux-foundation.org | |
| 4509 | 4715 | S: Supported |
| 4510 | 4716 | F: Documentation/ia64/paravirt_ops.txt |
| 4511 | 4717 | F: arch/*/kernel/paravirt* |
| @@ -4617,6 +4823,16 @@ S: Maintained · 105 unmodified lines | ||
| 4617 | 4823 | F: crypto/pcrypt.c |
| 4618 | 4824 | F: include/crypto/pcrypt.h |
| 4619 | 4825 | |
| 4826 | +PER-CPU MEMORY ALLOCATOR | |
| 4827 | +M: Tejun Heo <tj@kernel.org> | |
| 4828 | +M: Christoph Lameter <cl@linux-foundation.org> | |
| 4829 | +L: linux-kernel@vger.kernel.org | |
| 4830 | +T: git git://git.kernel.org/pub/scm/linux/kernel/git/tj/percpu.git | |
| 4831 | +S: Maintained | |
| 4832 | +F: include/linux/percpu*.h | |
| 4833 | +F: mm/percpu*.c | |
| 4834 | +F: arch/*/include/asm/percpu.h | |
| 4835 | + | |
| 4620 | 4836 | PER-TASK DELAY ACCOUNTING |
| 4621 | 4837 | M: Balbir Singh <balbir@linux.vnet.ibm.com> |
| 4622 | 4838 | S: Maintained |
| @@ -4627,7 +4843,7 @@ PERFORMANCE EVENTS SUBSYSTEM · 4 unmodified lines | ||
| 4627 | 4843 | M: Peter Zijlstra <a.p.zijlstra@chello.nl> |
| 4628 | 4844 | M: Paul Mackerras <paulus@samba.org> |
| 4629 | 4845 | M: Ingo Molnar <mingo@elte.hu> |
| 4630 | −M: Arnaldo Carvalho de Melo <acme@redhat.com> | |
| 4846 | +M: Arnaldo Carvalho de Melo <acme@ghostprotocols.net> | |
| 4631 | 4847 | S: Supported |
| 4632 | 4848 | F: kernel/perf_event*.c |
| 4633 | 4849 | F: include/linux/perf_event.h |
| @@ -4993,11 +5209,6 @@ F: kernel/rcu* · 359 unmodified lines | ||
| 4993 | 5209 | F: kernel/srcu* |
| 4994 | 5210 | X: kernel/rcutorture.c |
| 4995 | 5211 | |
| 4996 | −REAL TIME CLOCK DRIVER (LEGACY) | |
| 4997 | −M: Paul Gortmaker <p_gortmaker@yahoo.com> | |
| 4998 | −S: Maintained | |
| 4999 | −F: drivers/char/rtc.c | |
| 5000 | − | |
| 5001 | 5212 | REAL TIME CLOCK (RTC) SUBSYSTEM |
| 5002 | 5213 | M: Alessandro Zummo <a.zummo@towertech.it> |
| 5003 | 5214 | L: rtc-linux@googlegroups.com |
| @@ -5052,7 +5263,7 @@ L: linux-wireless@vger.kernel.org · 48 unmodified lines | ||
| 5052 | 5263 | W: http://linuxwireless.org/ |
| 5053 | 5264 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-testing.git |
| 5054 | 5265 | S: Maintained |
| 5055 | −F: drivers/net/wireless/rtl818x/rtl8180* | |
| 5266 | +F: drivers/net/wireless/rtl818x/rtl8180/ | |
| 5056 | 5267 | |
| 5057 | 5268 | RTL8187 WIRELESS DRIVER |
| 5058 | 5269 | M: Herton Ronaldo Krzesinski <herton@mandriva.com.br> |
| @@ -5062,7 +5273,17 @@ L: linux-wireless@vger.kernel.org · 3 unmodified lines | ||
| 5062 | 5273 | W: http://linuxwireless.org/ |
| 5063 | 5274 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-testing.git |
| 5064 | 5275 | S: Maintained |
| 5065 | −F: drivers/net/wireless/rtl818x/rtl8187* | |
| 5276 | +F: drivers/net/wireless/rtl818x/rtl8187/ | |
| 5277 | + | |
| 5278 | +RTL8192CE WIRELESS DRIVER | |
| 5279 | +M: Larry Finger <Larry.Finger@lwfinger.net> | |
| 5280 | +M: Chaoming Li <chaoming_li@realsil.com.cn> | |
| 5281 | +L: linux-wireless@vger.kernel.org | |
| 5282 | +W: http://linuxwireless.org/ | |
| 5283 | +T: git git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-testing.git | |
| 5284 | +S: Maintained | |
| 5285 | +F: drivers/net/wireless/rtlwifi/ | |
| 5286 | +F: drivers/net/wireless/rtlwifi/rtl8192ce/ | |
| 5066 | 5287 | |
| 5067 | 5288 | S3 SAVAGE FRAMEBUFFER DRIVER |
| 5068 | 5289 | M: Antonino Daplas <adaplas@gmail.com> |
| @@ -5093,8 +5314,7 @@ S: Supported · 24 unmodified lines | ||
| 5093 | 5314 | F: drivers/s390/net/ |
| 5094 | 5315 | |
| 5095 | 5316 | S390 ZCRYPT DRIVER |
| 5096 | −M: Felix Beck <felix.beck@de.ibm.com> | |
| 5097 | −M: Ralph Wuerthner <ralph.wuerthner@de.ibm.com> | |
| 5317 | +M: Holger Dengler <hd@linux.vnet.ibm.com> | |
| 5098 | 5318 | M: linux390@de.ibm.com |
| 5099 | 5319 | L: linux-s390@vger.kernel.org |
| 5100 | 5320 | W: http://www.ibm.com/developerworks/linux/linux390/ |
| @@ -5140,7 +5360,19 @@ SAMSUNG AUDIO (ASoC) DRIVERS · 39 unmodified lines | ||
| 5140 | 5360 | M: Jassi Brar <jassi.brar@samsung.com> |
| 5141 | 5361 | L: alsa-devel@alsa-project.org (moderated for non-subscribers) |
| 5142 | 5362 | S: Supported |
| 5143 | −F: sound/soc/s3c24xx | |
| 5363 | +F: sound/soc/samsung | |
| 5364 | + | |
| 5365 | +TIMEKEEPING, NTP | |
| 5366 | +M: John Stultz <johnstul@us.ibm.com> | |
| 5367 | +M: Thomas Gleixner <tglx@linutronix.de> | |
| 5368 | +S: Supported | |
| 5369 | +F: include/linux/clocksource.h | |
| 5370 | +F: include/linux/time.h | |
| 5371 | +F: include/linux/timex.h | |
| 5372 | +F: include/linux/timekeeping.h | |
| 5373 | +F: kernel/time/clocksource.c | |
| 5374 | +F: kernel/time/time*.c | |
| 5375 | +F: kernel/time/ntp.c | |
| 5144 | 5376 | |
| 5145 | 5377 | TLG2300 VIDEO4LINUX-2 DRIVER |
| 5146 | 5378 | M: Huang Shijie <shijie8@gmail.com> |
| @@ -5328,12 +5560,11 @@ S: Supported · 181 unmodified lines | ||
| 5328 | 5560 | F: drivers/scsi/be2iscsi/ |
| 5329 | 5561 | |
| 5330 | 5562 | SERVER ENGINES 10Gbps NIC - BladeEngine 2 DRIVER |
| 5331 | −M: Sathya Perla <sathyap@serverengines.com> | |
| 5332 | −M: Subbu Seetharaman <subbus@serverengines.com> | |
| 5333 | −M: Sarveshwar Bandi <sarveshwarb@serverengines.com> | |
| 5334 | −M: Ajit Khaparde <ajitk@serverengines.com> | |
| 5563 | +M: Sathya Perla <sathya.perla@emulex.com> | |
| 5564 | +M: Subbu Seetharaman <subbu.seetharaman@emulex.com> | |
| 5565 | +M: Ajit Khaparde <ajit.khaparde@emulex.com> | |
| 5335 | 5566 | L: netdev@vger.kernel.org |
| 5336 | −W: http://www.serverengines.com | |
| 5567 | +W: http://www.emulex.com | |
| 5337 | 5568 | S: Supported |
| 5338 | 5569 | F: drivers/net/benet/ |
| 5339 | 5570 | |
| @@ -5355,7 +5586,7 @@ M: Pat Gefre <pfg@sgi.com> · 15 unmodified lines | ||
| 5355 | 5586 | L: linux-ia64@vger.kernel.org |
| 5356 | 5587 | S: Supported |
| 5357 | 5588 | F: Documentation/ia64/serial.txt |
| 5358 | −F: drivers/serial/ioc?_serial.c | |
| 5589 | +F: drivers/tty/serial/ioc?_serial.c | |
| 5359 | 5590 | F: include/linux/ioc?.h |
| 5360 | 5591 | |
| 5361 | 5592 | SGI VISUAL WORKSTATION 320 AND 540 |
| @@ -5377,7 +5608,7 @@ L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) · 15 unmodified lines | ||
| 5377 | 5608 | S: Maintained |
| 5378 | 5609 | F: Documentation/arm/Sharp-LH/ADC-LH7-Touchscreen |
| 5379 | 5610 | F: arch/arm/mach-lh7a40x/ |
| 5380 | −F: drivers/serial/serial_lh7a40x.c | |
| 5611 | +F: drivers/tty/serial/serial_lh7a40x.c | |
| 5381 | 5612 | F: drivers/usb/gadget/lh7a40* |
| 5382 | 5613 | F: drivers/usb/host/ohci-lh7a40* |
| 5383 | 5614 | |
| @@ -5393,18 +5624,20 @@ F: include/linux/sfi*.h · 9 unmodified lines | ||
| 5393 | 5624 | |
| 5394 | 5625 | SIMTEC EB110ATX (Chalice CATS) |
| 5395 | 5626 | P: Ben Dooks |
| 5396 | −M: Vincent Sanders <support@simtec.co.uk> | |
| 5627 | +P: Vincent Sanders <vince@simtec.co.uk> | |
| 5628 | +M: Simtec Linux Team <linux@simtec.co.uk> | |
| 5397 | 5629 | W: http://www.simtec.co.uk/products/EB110ATX/ |
| 5398 | 5630 | S: Supported |
| 5399 | 5631 | |
| 5400 | 5632 | SIMTEC EB2410ITX (BAST) |
| 5401 | 5633 | P: Ben Dooks |
| 5402 | −M: Vincent Sanders <support@simtec.co.uk> | |
| 5634 | +P: Vincent Sanders <vince@simtec.co.uk> | |
| 5635 | +M: Simtec Linux Team <linux@simtec.co.uk> | |
| 5403 | 5636 | W: http://www.simtec.co.uk/products/EB2410ITX/ |
| 5404 | 5637 | S: Supported |
| 5405 | −F: arch/arm/mach-s3c2410/ | |
| 5406 | −F: drivers/*/*s3c2410* | |
| 5407 | −F: drivers/*/*/*s3c2410* | |
| 5638 | +F: arch/arm/mach-s3c2410/mach-bast.c | |
| 5639 | +F: arch/arm/mach-s3c2410/bast-ide.c | |
| 5640 | +F: arch/arm/mach-s3c2410/bast-irq.c | |
| 5408 | 5641 | |
| 5409 | 5642 | TI DAVINCI MACHINE SUPPORT |
| 5410 | 5643 | M: Kevin Hilman <khilman@deeprootsystems.com> |
| @@ -5456,7 +5689,7 @@ F: drivers/net/sky2.* · 45 unmodified lines | ||
| 5456 | 5689 | |
| 5457 | 5690 | SLAB ALLOCATOR |
| 5458 | 5691 | M: Christoph Lameter <cl@linux-foundation.org> |
| 5459 | −M: Pekka Enberg <penberg@cs.helsinki.fi> | |
| 5692 | +M: Pekka Enberg <penberg@kernel.org> | |
| 5460 | 5693 | M: Matt Mackall <mpm@selenic.com> |
| 5461 | 5694 | L: linux-mm@kvack.org |
| 5462 | 5695 | S: Maintained |
| @@ -5597,14 +5830,14 @@ L: sparclinux@vger.kernel.org · 134 unmodified lines | ||
| 5597 | 5830 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-2.6.git |
| 5598 | 5831 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-next-2.6.git |
| 5599 | 5832 | S: Maintained |
| 5600 | −F: drivers/serial/suncore.c | |
| 5601 | −F: drivers/serial/suncore.h | |
| 5602 | −F: drivers/serial/sunhv.c | |
| 5603 | −F: drivers/serial/sunsab.c | |
| 5604 | −F: drivers/serial/sunsab.h | |
| 5605 | −F: drivers/serial/sunsu.c | |
| 5606 | −F: drivers/serial/sunzilog.c | |
| 5607 | −F: drivers/serial/sunzilog.h | |
| 5833 | +F: drivers/tty/serial/suncore.c | |
| 5834 | +F: drivers/tty/serial/suncore.h | |
| 5835 | +F: drivers/tty/serial/sunhv.c | |
| 5836 | +F: drivers/tty/serial/sunsab.c | |
| 5837 | +F: drivers/tty/serial/sunsab.h | |
| 5838 | +F: drivers/tty/serial/sunsu.c | |
| 5839 | +F: drivers/tty/serial/sunzilog.c | |
| 5840 | +F: drivers/tty/serial/sunzilog.h | |
| 5608 | 5841 | |
| 5609 | 5842 | SPEAR PLATFORM SUPPORT |
| 5610 | 5843 | M: Viresh Kumar <viresh.kumar@st.com> |
| @@ -5712,12 +5945,6 @@ M: Ion Badulescu <ionut@badula.org> · 101 unmodified lines | ||
| 5712 | 5945 | S: Odd Fixes |
| 5713 | 5946 | F: drivers/net/starfire* |
| 5714 | 5947 | |
| 5715 | −STRADIS MPEG-2 DECODER DRIVER | |
| 5716 | −M: Nathan Laredo <laredo@gnu.org> | |
| 5717 | −W: http://www.stradis.com/ | |
| 5718 | −S: Maintained | |
| 5719 | −F: drivers/media/video/stradis.c | |
| 5720 | − | |
| 5721 | 5948 | SUN3/3X |
| 5722 | 5949 | M: Sam Creasey <sammy@sammy.net> |
| 5723 | 5950 | W: http://sammy.net/sun3/ |
| @@ -5867,7 +6094,8 @@ F: drivers/net/tlan.* · 143 unmodified lines | ||
| 5867 | 6094 | TOMOYO SECURITY MODULE |
| 5868 | 6095 | M: Kentaro Takeda <takedakn@nttdata.co.jp> |
| 5869 | 6096 | M: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp> |
| 5870 | −L: tomoyo-users-en@lists.sourceforge.jp (subscribers-only, for developers and users in English) | |
| 6097 | +L: tomoyo-dev-en@lists.sourceforge.jp (subscribers-only, for developers in English) | |
| 6098 | +L: tomoyo-users-en@lists.sourceforge.jp (subscribers-only, for users in English) | |
| 5871 | 6099 | L: tomoyo-dev@lists.sourceforge.jp (subscribers-only, for developers in Japanese) |
| 5872 | 6100 | L: tomoyo-users@lists.sourceforge.jp (subscribers-only, for users in Japanese) |
| 5873 | 6101 | W: http://tomoyo.sourceforge.jp/ |
| @@ -5939,8 +6167,8 @@ TTY LAYER · 65 unmodified lines | ||
| 5939 | 6167 | M: Greg Kroah-Hartman <gregkh@suse.de> |
| 5940 | 6168 | S: Maintained |
| 5941 | 6169 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty-2.6.git |
| 5942 | −F: drivers/char/tty_* | |
| 5943 | −F: drivers/serial/serial_core.c | |
| 6170 | +F: drivers/tty/* | |
| 6171 | +F: drivers/tty/serial/serial_core.c | |
| 5944 | 6172 | F: include/linux/serial_core.h |
| 5945 | 6173 | F: include/linux/serial.h |
| 5946 | 6174 | F: include/linux/tty.h |
| @@ -6141,6 +6369,13 @@ S: Maintained · 194 unmodified lines | ||
| 6141 | 6369 | W: http://www.one-eyed-alien.net/~mdharm/linux-usb/ |
| 6142 | 6370 | F: drivers/usb/storage/ |
| 6143 | 6371 | |
| 6372 | +USB MIDI DRIVER | |
| 6373 | +M: Clemens Ladisch <clemens@ladisch.de> | |
| 6374 | +L: alsa-devel@alsa-project.org (moderated for non-subscribers) | |
| 6375 | +T: git git://git.alsa-project.org/alsa-kernel.git | |
| 6376 | +S: Maintained | |
| 6377 | +F: sound/usb/midi.* | |
| 6378 | + | |
| 6144 | 6379 | USB OHCI DRIVER |
| 6145 | 6380 | M: David Brownell <dbrownell@users.sourceforge.net> |
| 6146 | 6381 | L: linux-usb@vger.kernel.org |
| @@ -6377,10 +6612,20 @@ S: Maintained · 230 unmodified lines | ||
| 6377 | 6612 | F: drivers/char/virtio_console.c |
| 6378 | 6613 | F: include/linux/virtio_console.h |
| 6379 | 6614 | |
| 6615 | +VIRTIO CORE, NET AND BLOCK DRIVERS | |
| 6616 | +M: Rusty Russell <rusty@rustcorp.com.au> | |
| 6617 | +M: "Michael S. Tsirkin" <mst@redhat.com> | |
| 6618 | +L: virtualization@lists.linux-foundation.org | |
| 6619 | +S: Maintained | |
| 6620 | +F: drivers/virtio/ | |
| 6621 | +F: drivers/net/virtio_net.c | |
| 6622 | +F: drivers/block/virtio_blk.c | |
| 6623 | +F: include/linux/virtio_*.h | |
| 6624 | + | |
| 6380 | 6625 | VIRTIO HOST (VHOST) |
| 6381 | 6626 | M: "Michael S. Tsirkin" <mst@redhat.com> |
| 6382 | 6627 | L: kvm@vger.kernel.org |
| 6383 | −L: virtualization@lists.osdl.org | |
| 6628 | +L: virtualization@lists.linux-foundation.org | |
| 6384 | 6629 | L: netdev@vger.kernel.org |
| 6385 | 6630 | S: Maintained |
| 6386 | 6631 | F: drivers/vhost/ |
| @@ -6399,13 +6644,12 @@ F: Documentation/i2c/busses/i2c-viapro · 12 unmodified lines | ||
| 6399 | 6644 | F: drivers/i2c/busses/i2c-viapro.c |
| 6400 | 6645 | |
| 6401 | 6646 | VIA SD/MMC CARD CONTROLLER DRIVER |
| 6402 | −M: Joseph Chan <JosephChan@via.com.tw> | |
| 6647 | +M: Bruce Chang <brucechang@via.com.tw> | |
| 6403 | 6648 | M: Harald Welte <HaraldWelte@viatech.com> |
| 6404 | 6649 | S: Maintained |
| 6405 | 6650 | F: drivers/mmc/host/via-sdmmc.c |
| 6406 | 6651 | |
| 6407 | 6652 | VIA UNICHROME(PRO)/CHROME9 FRAMEBUFFER DRIVER |
| 6408 | −M: Joseph Chan <JosephChan@via.com.tw> | |
| 6409 | 6653 | M: Florian Tobias Schandinat <FlorianSchandinat@gmx.de> |
| 6410 | 6654 | L: linux-fbdev@vger.kernel.org |
| 6411 | 6655 | S: Maintained |
| @@ -6430,7 +6674,7 @@ F: net/8021q/ · 18 unmodified lines | ||
| 6430 | 6674 | |
| 6431 | 6675 | VLYNQ BUS |
| 6432 | 6676 | M: Florian Fainelli <florian@openwrt.org> |
| 6433 | −L: openwrt-devel@lists.openwrt.org | |
| 6677 | +L: openwrt-devel@lists.openwrt.org (subscribers-only) | |
| 6434 | 6678 | S: Maintained |
| 6435 | 6679 | F: drivers/vlynq/vlynq.c |
| 6436 | 6680 | F: include/linux/vlynq.h |
| @@ -6551,12 +6795,12 @@ S: Maintained · 114 unmodified lines | ||
| 6551 | 6795 | F: drivers/net/wireless/wl1251/* |
| 6552 | 6796 | |
| 6553 | 6797 | WL1271 WIRELESS DRIVER |
| 6554 | −M: Luciano Coelho <luciano.coelho@nokia.com> | |
| 6798 | +M: Luciano Coelho <coelho@ti.com> | |
| 6555 | 6799 | L: linux-wireless@vger.kernel.org |
| 6556 | −W: http://wireless.kernel.org | |
| 6800 | +W: http://wireless.kernel.org/en/users/Drivers/wl12xx | |
| 6557 | 6801 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/luca/wl12xx.git |
| 6558 | 6802 | S: Maintained |
| 6559 | −F: drivers/net/wireless/wl12xx/wl1271* | |
| 6803 | +F: drivers/net/wireless/wl12xx/ | |
| 6560 | 6804 | F: include/linux/wl12xx.h |
| 6561 | 6805 | |
| 6562 | 6806 | WL3501 WIRELESS PCMCIA CARD DRIVER |
| @@ -6650,7 +6894,7 @@ XEN HYPERVISOR INTERFACE · 87 unmodified lines | ||
| 6650 | 6894 | M: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com> |
| 6651 | 6895 | M: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> |
| 6652 | 6896 | L: xen-devel@lists.xensource.com (moderated for non-subscribers) |
| 6653 | −L: virtualization@lists.osdl.org | |
| 6897 | +L: virtualization@lists.linux-foundation.org | |
| 6654 | 6898 | S: Supported |
| 6655 | 6899 | F: arch/x86/xen/ |
| 6656 | 6900 | F: drivers/*/xen-*front.c |
| @@ -6679,7 +6923,7 @@ XILINX UARTLITE SERIAL DRIVER · 22 unmodified lines | ||
| 6679 | 6923 | M: Peter Korsgaard <jacmet@sunsite.dk> |
| 6680 | 6924 | L: linux-serial@vger.kernel.org |
| 6681 | 6925 | S: Maintained |
| 6682 | −F: drivers/serial/uartlite.c | |
| 6926 | +F: drivers/tty/serial/uartlite.c | |
| 6683 | 6927 | |
| 6684 | 6928 | YAM DRIVER FOR AX.25 |
| 6685 | 6929 | M: Jean-Paul Roubelat <jpr@f6fbb.org> |
| @@ -6725,7 +6969,7 @@ F: drivers/media/video/zoran/ · 39 unmodified lines | ||
| 6725 | 6969 | ZS DECSTATION Z85C30 SERIAL DRIVER |
| 6726 | 6970 | M: "Maciej W. Rozycki" <macro@linux-mips.org> |
| 6727 | 6971 | S: Maintained |
| 6728 | −F: drivers/serial/zs.* | |
| 6972 | +F: drivers/tty/serial/zs.* | |
| 6729 | 6973 | |
| 6730 | 6974 | GRE DEMULTIPLEXER DRIVER |
| 6731 | 6975 | M: Dmitry Kozlov <xeb@mail.ru> |
| @@ -1,7 +1,7 @@ | ||
| 1 | 1 | VERSION = 2 |
| 2 | 2 | PATCHLEVEL = 6 |
| 3 | −SUBLEVEL = 37 | |
| 4 | −EXTRAVERSION = | |
| 3 | +SUBLEVEL = 38 | |
| 4 | +EXTRAVERSION = -rc6 | |
| 5 | 5 | NAME = Flesh-Eating Bats with Fangs |
| 6 | 6 | |
| 7 | 7 | # *DOCUMENTATION* |
| @@ -224,6 +224,7 @@ ifeq ($(ARCH),m68knommu) · 216 unmodified lines | ||
| 224 | 224 | endif |
| 225 | 225 | |
| 226 | 226 | KCONFIG_CONFIG ?= .config |
| 227 | +export KCONFIG_CONFIG | |
| 227 | 228 | |
| 228 | 229 | # SHELL used by kbuild |
| 229 | 230 | CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \ |
| @@ -175,4 +175,7 @@ config HAVE_PERF_EVENTS_NMI · 174 unmodified lines | ||
| 175 | 175 | config HAVE_ARCH_JUMP_LABEL |
| 176 | 176 | bool |
| 177 | 177 | |
| 178 | +config HAVE_ARCH_MUTEX_CPU_RELAX | |
| 179 | + bool | |
| 180 | + | |
| 178 | 181 | source "kernel/gcov/Kconfig" |
| @@ -8,6 +8,9 @@ config ALPHA · 7 unmodified lines | ||
| 8 | 8 | select HAVE_IRQ_WORK |
| 9 | 9 | select HAVE_PERF_EVENTS |
| 10 | 10 | select HAVE_DMA_ATTRS |
| 11 | + select HAVE_GENERIC_HARDIRQS | |
| 12 | + select GENERIC_IRQ_PROBE | |
| 13 | + select AUTO_IRQ_AFFINITY if SMP | |
| 11 | 14 | help |
| 12 | 15 | The Alpha is a 64-bit general-purpose processor designed and |
| 13 | 16 | marketed by the Digital Equipment Corporation of blessed memory, |
| @@ -68,19 +71,6 @@ config GENERIC_IOMAP · 54 unmodified lines | ||
| 68 | 71 | bool |
| 69 | 72 | default n |
| 70 | 73 | |
| 71 | −config GENERIC_HARDIRQS | |
| 72 | − bool | |
| 73 | − default y | |
| 74 | − | |
| 75 | −config GENERIC_IRQ_PROBE | |
| 76 | − bool | |
| 77 | − default y | |
| 78 | − | |
| 79 | −config AUTO_IRQ_AFFINITY | |
| 80 | − bool | |
| 81 | − depends on SMP | |
| 82 | − default y | |
| 83 | − | |
| 84 | 74 | source "init/Kconfig" |
| 85 | 75 | source "kernel/Kconfig.freezer" |
| 86 | 76 | |
| @@ -37,8 +37,9 @@ · 36 unmodified lines | ||
| 37 | 37 | */ |
| 38 | 38 | extern inline void __set_hae(unsigned long new_hae) |
| 39 | 39 | { |
| 40 | − unsigned long flags; | |
| 41 | − local_irq_save(flags); | |
| 40 | + unsigned long flags = swpipl(IPL_MAX); | |
| 41 | + | |
| 42 | + barrier(); | |
| 42 | 43 | |
| 43 | 44 | alpha_mv.hae_cache = new_hae; |
| 44 | 45 | *alpha_mv.hae_register = new_hae; |
| @@ -46,7 +47,8 @@ extern inline void __set_hae(unsigned long new_hae) · 1 unmodified line | ||
| 46 | 47 | /* Re-read to make sure it was written. */ |
| 47 | 48 | new_hae = *alpha_mv.hae_register; |
| 48 | 49 | |
| 49 | − local_irq_restore(flags); | |
| 50 | + setipl(flags); | |
| 51 | + barrier(); | |
| 50 | 52 | } |
| 51 | 53 | |
| 52 | 54 | extern inline void set_hae(unsigned long new_hae) |
| @@ -92,6 +92,7 @@ · 91 unmodified lines | ||
| 92 | 92 | #define TIOCGSID 0x5429 /* Return the session ID of FD */ |
| 93 | 93 | #define TIOCGPTN _IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux device) */ |
| 94 | 94 | #define TIOCSPTLCK _IOW('T',0x31, int) /* Lock/unlock Pty */ |
| 95 | +#define TIOCGDEV _IOR('T',0x32, unsigned int) /* Get primary device node of /dev/console */ | |
| 95 | 96 | #define TIOCSIG _IOW('T',0x36, int) /* Generate signal on Pty slave */ |
| 96 | 97 | |
| 97 | 98 | #define TIOCSERCONFIG 0x5453 |
| @@ -53,6 +53,9 @@ · 52 unmodified lines | ||
| 53 | 53 | #define MADV_MERGEABLE 12 /* KSM may merge identical pages */ |
| 54 | 54 | #define MADV_UNMERGEABLE 13 /* KSM may not merge identical pages */ |
| 55 | 55 | |
| 56 | +#define MADV_HUGEPAGE 14 /* Worth backing with hugepages */ | |
| 57 | +#define MADV_NOHUGEPAGE 15 /* Not worth backing with hugepages */ | |
| 58 | + | |
| 56 | 59 | /* compatibility flags */ |
| 57 | 60 | #define MAP_FILE 0 |
| 58 | 61 | |
| @@ -1,10 +1,4 @@ | ||
| 1 | 1 | #ifndef __ASM_ALPHA_PERF_EVENT_H |
| 2 | 2 | #define __ASM_ALPHA_PERF_EVENT_H |
| 3 | 3 | |
| 4 | −#ifdef CONFIG_PERF_EVENTS | |
| 5 | −extern void init_hw_perf_events(void); | |
| 6 | −#else | |
| 7 | −static inline void init_hw_perf_events(void) { } | |
| 8 | −#endif | |
| 9 | − | |
| 10 | 4 | #endif /* __ASM_ALPHA_PERF_EVENT_H */ |
| @@ -3,8 +3,8 @@ · 2 unmodified lines | ||
| 3 | 3 | # |
| 4 | 4 | |
| 5 | 5 | extra-y := head.o vmlinux.lds |
| 6 | −EXTRA_AFLAGS := $(KBUILD_CFLAGS) | |
| 7 | −EXTRA_CFLAGS := -Werror -Wno-sign-compare | |
| 6 | +asflags-y := $(KBUILD_CFLAGS) | |
| 7 | +ccflags-y := -Werror -Wno-sign-compare | |
| 8 | 8 | |
| 9 | 9 | obj-y := entry.o traps.o process.o init_task.o osf_sys.o irq.o \ |
| 10 | 10 | irq_alpha.o signal.o setup.o ptrace.o time.o \ |
| @@ -44,10 +44,11 @@ static char irq_user_affinity[NR_IRQS]; · 43 unmodified lines | ||
| 44 | 44 | |
| 45 | 45 | int irq_select_affinity(unsigned int irq) |
| 46 | 46 | { |
| 47 | + struct irq_desc *desc = irq_to_desc[irq]; | |
| 47 | 48 | static int last_cpu; |
| 48 | 49 | int cpu = last_cpu + 1; |
| 49 | 50 | |
| 50 | − if (!irq_desc[irq].chip->set_affinity || irq_user_affinity[irq]) | |
| 51 | + if (!desc || !get_irq_desc_chip(desc)->set_affinity || irq_user_affinity[irq]) | |
| 51 | 52 | return 1; |
| 52 | 53 | |
| 53 | 54 | while (!cpu_possible(cpu) || |
| @@ -55,8 +56,8 @@ int irq_select_affinity(unsigned int irq) · 1 unmodified line | ||
| 55 | 56 | cpu = (cpu < (NR_CPUS-1) ? cpu + 1 : 0); |
| 56 | 57 | last_cpu = cpu; |
| 57 | 58 | |
| 58 | − cpumask_copy(irq_desc[irq].affinity, cpumask_of(cpu)); | |
| 59 | − irq_desc[irq].chip->set_affinity(irq, cpumask_of(cpu)); | |
| 59 | + cpumask_copy(desc->affinity, cpumask_of(cpu)); | |
| 60 | + get_irq_desc_chip(desc)->set_affinity(irq, cpumask_of(cpu)); | |
| 60 | 61 | return 0; |
| 61 | 62 | } |
| 62 | 63 | #endif /* CONFIG_SMP */ |
| @@ -67,6 +68,7 @@ show_interrupts(struct seq_file *p, void *v) · 4 unmodified lines | ||
| 67 | 68 | int j; |
| 68 | 69 | int irq = *(loff_t *) v; |
| 69 | 70 | struct irqaction * action; |
| 71 | + struct irq_desc *desc; | |
| 70 | 72 | unsigned long flags; |
| 71 | 73 | |
| 72 | 74 | #ifdef CONFIG_SMP |
| @@ -79,8 +81,13 @@ show_interrupts(struct seq_file *p, void *v) · 6 unmodified lines | ||
| 79 | 81 | #endif |
| 80 | 82 | |
| 81 | 83 | if (irq < ACTUAL_NR_IRQS) { |
| 82 | − raw_spin_lock_irqsave(&irq_desc[irq].lock, flags); | |
| 83 | − action = irq_desc[irq].action; | |
| 84 | + desc = irq_to_desc(irq); | |
| 85 | + | |
| 86 | + if (!desc) | |
| 87 | + return 0; | |
| 88 | + | |
| 89 | + raw_spin_lock_irqsave(&desc->lock, flags); | |
| 90 | + action = desc->action; | |
| 84 | 91 | if (!action) |
| 85 | 92 | goto unlock; |
| 86 | 93 | seq_printf(p, "%3d: ", irq); |
| @@ -90,7 +97,7 @@ show_interrupts(struct seq_file *p, void *v) · 3 unmodified lines | ||
| 90 | 97 | for_each_online_cpu(j) |
| 91 | 98 | seq_printf(p, "%10u ", kstat_irqs_cpu(irq, j)); |
| 92 | 99 | #endif |
| 93 | − seq_printf(p, " %14s", irq_desc[irq].chip->name); | |
| 100 | + seq_printf(p, " %14s", get_irq_desc_chip(desc)->name); | |
| 94 | 101 | seq_printf(p, " %c%s", |
| 95 | 102 | (action->flags & IRQF_DISABLED)?'+':' ', |
| 96 | 103 | action->name); |
| @@ -103,7 +110,7 @@ show_interrupts(struct seq_file *p, void *v) · 6 unmodified lines | ||
| 103 | 110 | |
| 104 | 111 | seq_putc(p, '\n'); |
| 105 | 112 | unlock: |
| 106 | − raw_spin_unlock_irqrestore(&irq_desc[irq].lock, flags); | |
| 113 | + raw_spin_unlock_irqrestore(&desc->lock, flags); | |
| 107 | 114 | } else if (irq == ACTUAL_NR_IRQS) { |
| 108 | 115 | #ifdef CONFIG_SMP |
| 109 | 116 | seq_puts(p, "IPI: "); |
| @@ -142,8 +149,10 @@ handle_irq(int irq) · 32 unmodified lines | ||
| 142 | 149 | * handled by some other CPU. (or is disabled) |
| 143 | 150 | */ |
| 144 | 151 | static unsigned int illegal_count=0; |
| 152 | + struct irq_desc *desc = irq_to_desc(irq); | |
| 145 | 153 | |
| 146 | − if ((unsigned) irq > ACTUAL_NR_IRQS && illegal_count < MAX_ILLEGAL_IRQS ) { | |
| 154 | + if (!desc || ((unsigned) irq > ACTUAL_NR_IRQS && | |
| 155 | + illegal_count < MAX_ILLEGAL_IRQS)) { | |
| 147 | 156 | irq_err_count++; |
| 148 | 157 | illegal_count++; |
| 149 | 158 | printk(KERN_CRIT "device_interrupt: invalid interrupt %d\n", |
| @@ -151,14 +160,14 @@ handle_irq(int irq) · 1 unmodified line | ||
| 151 | 160 | return; |
| 152 | 161 | } |
| 153 | 162 | |
| 154 | − irq_enter(); | |
| 155 | 163 | /* |
| 156 | − * __do_IRQ() must be called with IPL_MAX. Note that we do not | |
| 164 | + * From here we must proceed with IPL_MAX. Note that we do not | |
| 157 | 165 | * explicitly enable interrupts afterwards - some MILO PALcode |
| 158 | 166 | * (namely LX164 one) seems to have severe problems with RTI |
| 159 | 167 | * at IPL 0. |
| 160 | 168 | */ |
| 161 | 169 | local_irq_disable(); |
| 162 | − __do_IRQ(irq); | |
| 170 | + irq_enter(); | |
| 171 | + generic_handle_irq_desc(irq, desc); | |
| 163 | 172 | irq_exit(); |
| 164 | 173 | } |
| @@ -112,8 +112,6 @@ init_IRQ(void) · 111 unmodified lines | ||
| 112 | 112 | wrent(entInt, 0); |
| 113 | 113 | |
| 114 | 114 | alpha_mv.init_irq(); |
| 115 | − | |
| 116 | − init_hw_perf_events(); | |
| 117 | 115 | } |
| 118 | 116 | |
| 119 | 117 | /* |
| @@ -221,31 +219,23 @@ process_mcheck_info(unsigned long vector, unsigned long la_ptr, · 101 unmodified lines | ||
| 221 | 219 | * processed by PALcode, and comes in via entInt vector 1. |
| 222 | 220 | */ |
| 223 | 221 | |
| 224 | −static void rtc_enable_disable(unsigned int irq) { } | |
| 225 | −static unsigned int rtc_startup(unsigned int irq) { return 0; } | |
| 226 | − | |
| 227 | 222 | struct irqaction timer_irqaction = { |
| 228 | 223 | .handler = timer_interrupt, |
| 229 | 224 | .flags = IRQF_DISABLED, |
| 230 | 225 | .name = "timer", |
| 231 | 226 | }; |
| 232 | 227 | |
| 233 | −static struct irq_chip rtc_irq_type = { | |
| 234 | − .name = "RTC", | |
| 235 | − .startup = rtc_startup, | |
| 236 | − .shutdown = rtc_enable_disable, | |
| 237 | − .enable = rtc_enable_disable, | |
| 238 | − .disable = rtc_enable_disable, | |
| 239 | − .ack = rtc_enable_disable, | |
| 240 | − .end = rtc_enable_disable, | |
| 241 | −}; | |
| 242 | − | |
| 243 | 228 | void __init |
| 244 | 229 | init_rtc_irq(void) |
| 245 | 230 | { |
| 246 | − irq_desc[RTC_IRQ].status = IRQ_DISABLED; | |
| 247 | − irq_desc[RTC_IRQ].chip = &rtc_irq_type; | |
| 248 | − setup_irq(RTC_IRQ, &timer_irqaction); | |
| 231 | + struct irq_desc *desc = irq_to_desc(RTC_IRQ); | |
| 232 | + | |
| 233 | + if (desc) { | |
| 234 | + desc->status |= IRQ_DISABLED; | |
| 235 | + set_irq_chip_and_handler_name(RTC_IRQ, &no_irq_chip, | |
| 236 | + handle_simple_irq, "RTC"); | |
| 237 | + setup_irq(RTC_IRQ, &timer_irqaction); | |
| 238 | + } | |
| 249 | 239 | } |
| 250 | 240 | |
| 251 | 241 | /* Dummy irqactions. */ |
| @@ -69,28 +69,11 @@ i8259a_mask_and_ack_irq(unsigned int irq) · 68 unmodified lines | ||
| 69 | 69 | spin_unlock(&i8259_irq_lock); |
| 70 | 70 | } |
| 71 | 71 | |
| 72 | −unsigned int | |
| 73 | −i8259a_startup_irq(unsigned int irq) | |
| 74 | −{ | |
| 75 | − i8259a_enable_irq(irq); | |
| 76 | − return 0; /* never anything pending */ | |
| 77 | −} | |
| 78 | − | |
| 79 | −void | |
| 80 | −i8259a_end_irq(unsigned int irq) | |
| 81 | −{ | |
| 82 | − if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS))) | |
| 83 | − i8259a_enable_irq(irq); | |
| 84 | −} | |
| 85 | − | |
| 86 | 72 | struct irq_chip i8259a_irq_type = { |
| 87 | 73 | .name = "XT-PIC", |
| 88 | − .startup = i8259a_startup_irq, | |
| 89 | − .shutdown = i8259a_disable_irq, | |
| 90 | − .enable = i8259a_enable_irq, | |
| 91 | − .disable = i8259a_disable_irq, | |
| 92 | − .ack = i8259a_mask_and_ack_irq, | |
| 93 | − .end = i8259a_end_irq, | |
| 74 | + .unmask = i8259a_enable_irq, | |
| 75 | + .mask = i8259a_disable_irq, | |
| 76 | + .mask_ack = i8259a_mask_and_ack_irq, | |
| 94 | 77 | }; |
| 95 | 78 | |
| 96 | 79 | void __init |
| @@ -107,8 +90,7 @@ init_i8259a_irqs(void) · 10 unmodified lines | ||
| 107 | 90 | outb(0xff, 0xA1); /* mask all of 8259A-2 */ |
| 108 | 91 | |
| 109 | 92 | for (i = 0; i < 16; i++) { |
| 110 | − irq_desc[i].status = IRQ_DISABLED; | |
| 111 | − irq_desc[i].chip = &i8259a_irq_type; | |
| 93 | + set_irq_chip_and_handler(i, &i8259a_irq_type, handle_level_irq); | |
| 112 | 94 | } |
| 113 | 95 | |
| 114 | 96 | setup_irq(2, &cascade); |
| @@ -40,20 +40,6 @@ pyxis_disable_irq(unsigned int irq) · 39 unmodified lines | ||
| 40 | 40 | pyxis_update_irq_hw(cached_irq_mask &= ~(1UL << (irq - 16))); |
| 41 | 41 | } |
| 42 | 42 | |
| 43 | −static unsigned int | |
| 44 | −pyxis_startup_irq(unsigned int irq) | |
| 45 | −{ | |
| 46 | − pyxis_enable_irq(irq); | |
| 47 | − return 0; | |
| 48 | −} | |
| 49 | − | |
| 50 | −static void | |
| 51 | −pyxis_end_irq(unsigned int irq) | |
| 52 | −{ | |
| 53 | − if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS))) | |
| 54 | − pyxis_enable_irq(irq); | |
| 55 | −} | |
| 56 | − | |
| 57 | 43 | static void |
| 58 | 44 | pyxis_mask_and_ack_irq(unsigned int irq) |
| 59 | 45 | { |
| @@ -72,12 +58,9 @@ pyxis_mask_and_ack_irq(unsigned int irq) · 12 unmodified lines | ||
| 72 | 58 | |
| 73 | 59 | static struct irq_chip pyxis_irq_type = { |
| 74 | 60 | .name = "PYXIS", |
| 75 | − .startup = pyxis_startup_irq, | |
| 76 | − .shutdown = pyxis_disable_irq, | |
| 77 | − .enable = pyxis_enable_irq, | |
| 78 | − .disable = pyxis_disable_irq, | |
| 79 | − .ack = pyxis_mask_and_ack_irq, | |
| 80 | − .end = pyxis_end_irq, | |
| 61 | + .mask_ack = pyxis_mask_and_ack_irq, | |
| 62 | + .mask = pyxis_disable_irq, | |
| 63 | + .unmask = pyxis_enable_irq, | |
| 81 | 64 | }; |
| 82 | 65 | |
| 83 | 66 | void |
| @@ -119,8 +102,8 @@ init_pyxis_irqs(unsigned long ignore_mask) · 35 unmodified lines | ||
| 119 | 102 | for (i = 16; i < 48; ++i) { |
| 120 | 103 | if ((ignore_mask >> i) & 1) |
| 121 | 104 | continue; |
| 122 | − irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; | |
| 123 | − irq_desc[i].chip = &pyxis_irq_type; | |
| 105 | + set_irq_chip_and_handler(i, &pyxis_irq_type, handle_level_irq); | |
| 106 | + irq_to_desc(i)->status |= IRQ_LEVEL; | |
| 124 | 107 | } |
| 125 | 108 | |
| 126 | 109 | setup_irq(16+7, &isa_cascade_irqaction); |
| @@ -33,29 +33,12 @@ srm_disable_irq(unsigned int irq) · 32 unmodified lines | ||
| 33 | 33 | spin_unlock(&srm_irq_lock); |
| 34 | 34 | } |
| 35 | 35 | |
| 36 | −static unsigned int | |
| 37 | −srm_startup_irq(unsigned int irq) | |
| 38 | −{ | |
| 39 | − srm_enable_irq(irq); | |
| 40 | − return 0; | |
| 41 | −} | |
| 42 | − | |
| 43 | −static void | |
| 44 | −srm_end_irq(unsigned int irq) | |
| 45 | −{ | |
| 46 | − if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS))) | |
| 47 | − srm_enable_irq(irq); | |
| 48 | −} | |
| 49 | − | |
| 50 | 36 | /* Handle interrupts from the SRM, assuming no additional weirdness. */ |
| 51 | 37 | static struct irq_chip srm_irq_type = { |
| 52 | 38 | .name = "SRM", |
| 53 | − .startup = srm_startup_irq, | |
| 54 | − .shutdown = srm_disable_irq, | |
| 55 | − .enable = srm_enable_irq, | |
| 56 | − .disable = srm_disable_irq, | |
| 57 | − .ack = srm_disable_irq, | |
| 58 | − .end = srm_end_irq, | |
| 39 | + .unmask = srm_enable_irq, | |
| 40 | + .mask = srm_disable_irq, | |
| 41 | + .mask_ack = srm_disable_irq, | |
| 59 | 42 | }; |
| 60 | 43 | |
| 61 | 44 | void __init |
| @@ -68,8 +51,8 @@ init_srm_irqs(long max, unsigned long ignore_mask) · 6 unmodified lines | ||
| 68 | 51 | for (i = 16; i < max; ++i) { |
| 69 | 52 | if (i < 64 && ((ignore_mask >> i) & 1)) |
| 70 | 53 | continue; |
| 71 | − irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; | |
| 72 | − irq_desc[i].chip = &srm_irq_type; | |
| 54 | + set_irq_chip_and_handler(i, &srm_irq_type, handle_level_irq); | |
| 55 | + irq_to_desc(i)->status |= IRQ_LEVEL; | |
| 73 | 56 | } |
| 74 | 57 | } |
| 75 | 58 | |
| @@ -951,9 +951,6 @@ SYSCALL_DEFINE2(osf_utimes, const char __user *, filename, · 950 unmodified lines | ||
| 951 | 951 | return do_utimes(AT_FDCWD, filename, tvs ? tv : NULL, 0); |
| 952 | 952 | } |
| 953 | 953 | |
| 954 | −#define MAX_SELECT_SECONDS \ | |
| 955 | − ((unsigned long) (MAX_SCHEDULE_TIMEOUT / HZ)-1) | |
| 956 | − | |
| 957 | 954 | SYSCALL_DEFINE5(osf_select, int, n, fd_set __user *, inp, fd_set __user *, outp, |
| 958 | 955 | fd_set __user *, exp, struct timeval32 __user *, tvp) |
| 959 | 956 | { |
| @@ -14,6 +14,7 @@ · 13 unmodified lines | ||
| 14 | 14 | #include <linux/kernel.h> |
| 15 | 15 | #include <linux/kdebug.h> |
| 16 | 16 | #include <linux/mutex.h> |
| 17 | +#include <linux/init.h> | |
| 17 | 18 | |
| 18 | 19 | #include <asm/hwrpb.h> |
| 19 | 20 | #include <asm/atomic.h> |
| @@ -863,13 +864,13 @@ static void alpha_perf_event_irq_handler(unsigned long la_ptr, · 843 unmodified lines | ||
| 863 | 864 | /* |
| 864 | 865 | * Init call to initialise performance events at kernel startup. |
| 865 | 866 | */ |
| 866 | −void __init init_hw_perf_events(void) | |
| 867 | +int __init init_hw_perf_events(void) | |
| 867 | 868 | { |
| 868 | 869 | pr_info("Performance events: "); |
| 869 | 870 | |
| 870 | 871 | if (!supported_cpu()) { |
| 871 | 872 | pr_cont("No support for your CPU.\n"); |
| 872 | − return; | |
| 873 | + return 0; | |
| 873 | 874 | } |
| 874 | 875 | |
| 875 | 876 | pr_cont("Supported CPU type!\n"); |
| @@ -881,6 +882,8 @@ void __init init_hw_perf_events(void) · 5 unmodified lines | ||
| 881 | 882 | /* And set up PMU specification */ |
| 882 | 883 | alpha_pmu = &ev67_pmu; |
| 883 | 884 | |
| 884 | − perf_pmu_register(&pmu); | |
| 885 | −} | |
| 885 | + perf_pmu_register(&pmu, "cpu", PERF_TYPE_RAW); | |
| 886 | 886 | |
| 887 | + return 0; | |
| 888 | +} | |
| 889 | +early_initcall(init_hw_perf_events); | |
| @@ -65,13 +65,6 @@ alcor_mask_and_ack_irq(unsigned int irq) · 64 unmodified lines | ||
| 65 | 65 | *(vuip)GRU_INT_CLEAR = 0; mb(); |
| 66 | 66 | } |
| 67 | 67 | |
| 68 | −static unsigned int | |
| 69 | −alcor_startup_irq(unsigned int irq) | |
| 70 | −{ | |
| 71 | − alcor_enable_irq(irq); | |
| 72 | − return 0; | |
| 73 | −} | |
| 74 | − | |
| 75 | 68 | static void |
| 76 | 69 | alcor_isa_mask_and_ack_irq(unsigned int irq) |
| 77 | 70 | { |
| @@ -82,21 +75,11 @@ alcor_isa_mask_and_ack_irq(unsigned int irq) · 4 unmodified lines | ||
| 82 | 75 | *(vuip)GRU_INT_CLEAR = 0; mb(); |
| 83 | 76 | } |
| 84 | 77 | |
| 85 | −static void | |
| 86 | −alcor_end_irq(unsigned int irq) | |
| 87 | −{ | |
| 88 | − if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS))) | |
| 89 | − alcor_enable_irq(irq); | |
| 90 | −} | |
| 91 | − | |
| 92 | 78 | static struct irq_chip alcor_irq_type = { |
| 93 | 79 | .name = "ALCOR", |
| 94 | − .startup = alcor_startup_irq, | |
| 95 | − .shutdown = alcor_disable_irq, | |
| 96 | − .enable = alcor_enable_irq, | |
| 97 | − .disable = alcor_disable_irq, | |
| 98 | − .ack = alcor_mask_and_ack_irq, | |
| 99 | − .end = alcor_end_irq, | |
| 80 | + .unmask = alcor_enable_irq, | |
| 81 | + .mask = alcor_disable_irq, | |
| 82 | + .mask_ack = alcor_mask_and_ack_irq, | |
| 100 | 83 | }; |
| 101 | 84 | |
| 102 | 85 | static void |
| @@ -142,8 +125,8 @@ alcor_init_irq(void) · 39 unmodified lines | ||
| 142 | 125 | on while IRQ probing. */ |
| 143 | 126 | if (i >= 16+20 && i <= 16+30) |
| 144 | 127 | continue; |
| 145 | − irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; | |
| 146 | − irq_desc[i].chip = &alcor_irq_type; | |
| 128 | + set_irq_chip_and_handler(i, &alcor_irq_type, handle_level_irq); | |
| 129 | + irq_to_desc(i)->status |= IRQ_LEVEL; | |
| 147 | 130 | } |
| 148 | 131 | i8259a_irq_type.ack = alcor_isa_mask_and_ack_irq; |
| 149 | 132 | |
| @@ -57,28 +57,11 @@ cabriolet_disable_irq(unsigned int irq) · 56 unmodified lines | ||
| 57 | 57 | cabriolet_update_irq_hw(irq, cached_irq_mask |= 1UL << irq); |
| 58 | 58 | } |
| 59 | 59 | |
| 60 | −static unsigned int | |
| 61 | −cabriolet_startup_irq(unsigned int irq) | |
| 62 | −{ | |
| 63 | − cabriolet_enable_irq(irq); | |
| 64 | − return 0; /* never anything pending */ | |
| 65 | −} | |
| 66 | − | |
| 67 | −static void | |
| 68 | −cabriolet_end_irq(unsigned int irq) | |
| 69 | −{ | |
| 70 | − if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS))) | |
| 71 | − cabriolet_enable_irq(irq); | |
| 72 | −} | |
| 73 | − | |
| 74 | 60 | static struct irq_chip cabriolet_irq_type = { |
| 75 | 61 | .name = "CABRIOLET", |
| 76 | − .startup = cabriolet_startup_irq, | |
| 77 | − .shutdown = cabriolet_disable_irq, | |
| 78 | − .enable = cabriolet_enable_irq, | |
| 79 | − .disable = cabriolet_disable_irq, | |
| 80 | − .ack = cabriolet_disable_irq, | |
| 81 | − .end = cabriolet_end_irq, | |
| 62 | + .unmask = cabriolet_enable_irq, | |
| 63 | + .mask = cabriolet_disable_irq, | |
| 64 | + .mask_ack = cabriolet_disable_irq, | |
| 82 | 65 | }; |
| 83 | 66 | |
| 84 | 67 | static void |
| @@ -122,8 +105,9 @@ common_init_irq(void (*srm_dev_int)(unsigned long v)) · 37 unmodified lines | ||
| 122 | 105 | outb(0xff, 0x806); |
| 123 | 106 | |
| 124 | 107 | for (i = 16; i < 35; ++i) { |
| 125 | − irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; | |
| 126 | − irq_desc[i].chip = &cabriolet_irq_type; | |
| 108 | + set_irq_chip_and_handler(i, &cabriolet_irq_type, | |
| 109 | + handle_level_irq); | |
| 110 | + irq_to_desc(i)->status |= IRQ_LEVEL; | |
| 127 | 111 | } |
| 128 | 112 | } |
| 129 | 113 | |
| @@ -115,20 +115,6 @@ dp264_disable_irq(unsigned int irq) · 114 unmodified lines | ||
| 115 | 115 | spin_unlock(&dp264_irq_lock); |
| 116 | 116 | } |
| 117 | 117 | |
| 118 | −static unsigned int | |
| 119 | −dp264_startup_irq(unsigned int irq) | |
| 120 | −{ | |
| 121 | − dp264_enable_irq(irq); | |
| 122 | − return 0; /* never anything pending */ | |
| 123 | −} | |
| 124 | − | |
| 125 | −static void | |
| 126 | −dp264_end_irq(unsigned int irq) | |
| 127 | −{ | |
| 128 | − if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS))) | |
| 129 | − dp264_enable_irq(irq); | |
| 130 | −} | |
| 131 | − | |
| 132 | 118 | static void |
| 133 | 119 | clipper_enable_irq(unsigned int irq) |
| 134 | 120 | { |
| @@ -147,20 +133,6 @@ clipper_disable_irq(unsigned int irq) · 12 unmodified lines | ||
| 147 | 133 | spin_unlock(&dp264_irq_lock); |
| 148 | 134 | } |
| 149 | 135 | |
| 150 | −static unsigned int | |
| 151 | −clipper_startup_irq(unsigned int irq) | |
| 152 | −{ | |
| 153 | − clipper_enable_irq(irq); | |
| 154 | − return 0; /* never anything pending */ | |
| 155 | −} | |
| 156 | − | |
| 157 | −static void | |
| 158 | −clipper_end_irq(unsigned int irq) | |
| 159 | −{ | |
| 160 | − if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS))) | |
| 161 | − clipper_enable_irq(irq); | |
| 162 | −} | |
| 163 | − | |
| 164 | 136 | static void |
| 165 | 137 | cpu_set_irq_affinity(unsigned int irq, cpumask_t affinity) |
| 166 | 138 | { |
| @@ -200,23 +172,17 @@ clipper_set_affinity(unsigned int irq, const struct cpumask *affinity) · 33 unmodified lines | ||
| 200 | 172 | |
| 201 | 173 | static struct irq_chip dp264_irq_type = { |
| 202 | 174 | .name = "DP264", |
| 203 | − .startup = dp264_startup_irq, | |
| 204 | − .shutdown = dp264_disable_irq, | |
| 205 | − .enable = dp264_enable_irq, | |
| 206 | − .disable = dp264_disable_irq, | |
| 207 | − .ack = dp264_disable_irq, | |
| 208 | − .end = dp264_end_irq, | |
| 175 | + .unmask = dp264_enable_irq, | |
| 176 | + .mask = dp264_disable_irq, | |
| 177 | + .mask_ack = dp264_disable_irq, | |
| 209 | 178 | .set_affinity = dp264_set_affinity, |
| 210 | 179 | }; |
| 211 | 180 | |
| 212 | 181 | static struct irq_chip clipper_irq_type = { |
| 213 | 182 | .name = "CLIPPER", |
| 214 | − .startup = clipper_startup_irq, | |
| 215 | − .shutdown = clipper_disable_irq, | |
| 216 | − .enable = clipper_enable_irq, | |
| 217 | − .disable = clipper_disable_irq, | |
| 218 | − .ack = clipper_disable_irq, | |
| 219 | − .end = clipper_end_irq, | |
| 183 | + .unmask = clipper_enable_irq, | |
| 184 | + .mask = clipper_disable_irq, | |
| 185 | + .mask_ack = clipper_disable_irq, | |
| 220 | 186 | .set_affinity = clipper_set_affinity, |
| 221 | 187 | }; |
| 222 | 188 | |
| @@ -302,8 +268,8 @@ init_tsunami_irqs(struct irq_chip * ops, int imin, int imax) · 79 unmodified lines | ||
| 302 | 268 | { |
| 303 | 269 | long i; |
| 304 | 270 | for (i = imin; i <= imax; ++i) { |
| 305 | − irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; | |
| 306 | − irq_desc[i].chip = ops; | |
| 271 | + irq_to_desc(i)->status |= IRQ_LEVEL; | |
| 272 | + set_irq_chip_and_handler(i, ops, handle_level_irq); | |
| 307 | 273 | } |
| 308 | 274 | } |
| 309 | 275 | |
| @@ -55,28 +55,11 @@ eb64p_disable_irq(unsigned int irq) · 54 unmodified lines | ||
| 55 | 55 | eb64p_update_irq_hw(irq, cached_irq_mask |= 1 << irq); |
| 56 | 56 | } |
| 57 | 57 | |
| 58 | −static unsigned int | |
| 59 | −eb64p_startup_irq(unsigned int irq) | |
| 60 | −{ | |
| 61 | − eb64p_enable_irq(irq); | |
| 62 | − return 0; /* never anything pending */ | |
| 63 | −} | |
| 64 | − | |
| 65 | −static void | |
| 66 | −eb64p_end_irq(unsigned int irq) | |
| 67 | −{ | |
| 68 | − if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS))) | |
| 69 | − eb64p_enable_irq(irq); | |
| 70 | −} | |
| 71 | − | |
| 72 | 58 | static struct irq_chip eb64p_irq_type = { |
| 73 | 59 | .name = "EB64P", |
| 74 | − .startup = eb64p_startup_irq, | |
| 75 | − .shutdown = eb64p_disable_irq, | |
| 76 | − .enable = eb64p_enable_irq, | |
| 77 | − .disable = eb64p_disable_irq, | |
| 78 | − .ack = eb64p_disable_irq, | |
| 79 | − .end = eb64p_end_irq, | |
| 60 | + .unmask = eb64p_enable_irq, | |
| 61 | + .mask = eb64p_disable_irq, | |
| 62 | + .mask_ack = eb64p_disable_irq, | |
| 80 | 63 | }; |
| 81 | 64 | |
| 82 | 65 | static void |
| @@ -135,8 +118,8 @@ eb64p_init_irq(void) · 52 unmodified lines | ||
| 135 | 118 | init_i8259a_irqs(); |
| 136 | 119 | |
| 137 | 120 | for (i = 16; i < 32; ++i) { |
| 138 | − irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; | |
| 139 | − irq_desc[i].chip = &eb64p_irq_type; | |
| 121 | + irq_to_desc(i)->status |= IRQ_LEVEL; | |
| 122 | + set_irq_chip_and_handler(i, &eb64p_irq_type, handle_level_irq); | |
| 140 | 123 | } |
| 141 | 124 | |
| 142 | 125 | common_init_isa_dma(); |
| @@ -66,28 +66,11 @@ eiger_disable_irq(unsigned int irq) · 65 unmodified lines | ||
| 66 | 66 | eiger_update_irq_hw(irq, mask); |
| 67 | 67 | } |
| 68 | 68 | |
| 69 | −static unsigned int | |
| 70 | −eiger_startup_irq(unsigned int irq) | |
| 71 | −{ | |
| 72 | − eiger_enable_irq(irq); | |
| 73 | − return 0; /* never anything pending */ | |
| 74 | −} | |
| 75 | − | |
| 76 | −static void | |
| 77 | −eiger_end_irq(unsigned int irq) | |
| 78 | −{ | |
| 79 | − if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS))) | |
| 80 | − eiger_enable_irq(irq); | |
| 81 | −} | |
| 82 | − | |
| 83 | 69 | static struct irq_chip eiger_irq_type = { |
| 84 | 70 | .name = "EIGER", |
| 85 | − .startup = eiger_startup_irq, | |
| 86 | − .shutdown = eiger_disable_irq, | |
| 87 | − .enable = eiger_enable_irq, | |
| 88 | − .disable = eiger_disable_irq, | |
| 89 | − .ack = eiger_disable_irq, | |
| 90 | − .end = eiger_end_irq, | |
| 71 | + .unmask = eiger_enable_irq, | |
| 72 | + .mask = eiger_disable_irq, | |
| 73 | + .mask_ack = eiger_disable_irq, | |
| 91 | 74 | }; |
| 92 | 75 | |
| 93 | 76 | static void |
| @@ -153,8 +136,8 @@ eiger_init_irq(void) · 59 unmodified lines | ||
| 153 | 136 | init_i8259a_irqs(); |
| 154 | 137 | |
| 155 | 138 | for (i = 16; i < 128; ++i) { |
| 156 | − irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; | |
| 157 | − irq_desc[i].chip = &eiger_irq_type; | |
| 139 | + irq_to_desc(i)->status |= IRQ_LEVEL; | |
| 140 | + set_irq_chip_and_handler(i, &eiger_irq_type, handle_level_irq); | |
| 158 | 141 | } |
| 159 | 142 | } |
| 160 | 143 | |
| @@ -62,30 +62,6 @@ · 61 unmodified lines | ||
| 62 | 62 | * world. |
| 63 | 63 | */ |
| 64 | 64 | |
| 65 | −static unsigned int | |
| 66 | −jensen_local_startup(unsigned int irq) | |
| 67 | −{ | |
| 68 | − /* the parport is really hw IRQ 1, silly Jensen. */ | |
| 69 | − if (irq == 7) | |
| 70 | − i8259a_startup_irq(1); | |
| 71 | − else | |
| 72 | − /* | |
| 73 | − * For all true local interrupts, set the flag that prevents | |
| 74 | − * the IPL from being dropped during handler processing. | |
| 75 | − */ | |
| 76 | − if (irq_desc[irq].action) | |
| 77 | − irq_desc[irq].action->flags |= IRQF_DISABLED; | |
| 78 | − return 0; | |
| 79 | −} | |
| 80 | − | |
| 81 | −static void | |
| 82 | −jensen_local_shutdown(unsigned int irq) | |
| 83 | −{ | |
| 84 | − /* the parport is really hw IRQ 1, silly Jensen. */ | |
| 85 | − if (irq == 7) | |
| 86 | − i8259a_disable_irq(1); | |
| 87 | −} | |
| 88 | − | |
| 89 | 65 | static void |
| 90 | 66 | jensen_local_enable(unsigned int irq) |
| 91 | 67 | { |
| @@ -103,29 +79,18 @@ jensen_local_disable(unsigned int irq) · 11 unmodified lines | ||
| 103 | 79 | } |
| 104 | 80 | |
| 105 | 81 | static void |
| 106 | −jensen_local_ack(unsigned int irq) | |
| 82 | +jensen_local_mask_ack(unsigned int irq) | |
| 107 | 83 | { |
| 108 | 84 | /* the parport is really hw IRQ 1, silly Jensen. */ |
| 109 | 85 | if (irq == 7) |
| 110 | 86 | i8259a_mask_and_ack_irq(1); |
| 111 | 87 | } |
| 112 | 88 | |
| 113 | −static void | |
| 114 | −jensen_local_end(unsigned int irq) | |
| 115 | −{ | |
| 116 | − /* the parport is really hw IRQ 1, silly Jensen. */ | |
| 117 | − if (irq == 7) | |
| 118 | − i8259a_end_irq(1); | |
| 119 | −} | |
| 120 | − | |
| 121 | 89 | static struct irq_chip jensen_local_irq_type = { |
| 122 | 90 | .name = "LOCAL", |
| 123 | − .startup = jensen_local_startup, | |
| 124 | − .shutdown = jensen_local_shutdown, | |
| 125 | − .enable = jensen_local_enable, | |
| 126 | − .disable = jensen_local_disable, | |
| 127 | − .ack = jensen_local_ack, | |
| 128 | − .end = jensen_local_end, | |
| 91 | + .unmask = jensen_local_enable, | |
| 92 | + .mask = jensen_local_disable, | |
| 93 | + .mask_ack = jensen_local_mask_ack, | |
| 129 | 94 | }; |
| 130 | 95 | |
| 131 | 96 | static void |
| @@ -158,7 +123,7 @@ jensen_device_interrupt(unsigned long vector) · 26 unmodified lines | ||
| 158 | 123 | } |
| 159 | 124 | |
| 160 | 125 | /* If there is no handler yet... */ |
| 161 | − if (irq_desc[irq].action == NULL) { | |
| 126 | + if (!irq_has_action(irq)) { | |
| 162 | 127 | /* If it is a local interrupt that cannot be masked... */ |
| 163 | 128 | if (vector >= 0x900) |
| 164 | 129 | { |
| @@ -206,11 +171,11 @@ jensen_init_irq(void) · 41 unmodified lines | ||
| 206 | 171 | { |
| 207 | 172 | init_i8259a_irqs(); |
| 208 | 173 | |
| 209 | − irq_desc[1].chip = &jensen_local_irq_type; | |
| 210 | − irq_desc[4].chip = &jensen_local_irq_type; | |
| 211 | − irq_desc[3].chip = &jensen_local_irq_type; | |
| 212 | − irq_desc[7].chip = &jensen_local_irq_type; | |
| 213 | − irq_desc[9].chip = &jensen_local_irq_type; | |
| 174 | + set_irq_chip_and_handler(1, &jensen_local_irq_type, handle_level_irq); | |
| 175 | + set_irq_chip_and_handler(4, &jensen_local_irq_type, handle_level_irq); | |
| 176 | + set_irq_chip_and_handler(3, &jensen_local_irq_type, handle_level_irq); | |
| 177 | + set_irq_chip_and_handler(7, &jensen_local_irq_type, handle_level_irq); | |
| 178 | + set_irq_chip_and_handler(9, &jensen_local_irq_type, handle_level_irq); | |
| 214 | 179 | |
| 215 | 180 | common_init_isa_dma(); |
| 216 | 181 | } |
| @@ -143,20 +143,6 @@ io7_disable_irq(unsigned int irq) · 142 unmodified lines | ||
| 143 | 143 | spin_unlock(&io7->irq_lock); |
| 144 | 144 | } |
| 145 | 145 | |
| 146 | −static unsigned int | |
| 147 | −io7_startup_irq(unsigned int irq) | |
| 148 | −{ | |
| 149 | − io7_enable_irq(irq); | |
| 150 | − return 0; /* never anything pending */ | |
| 151 | −} | |
| 152 | − | |
| 153 | −static void | |
| 154 | −io7_end_irq(unsigned int irq) | |
| 155 | −{ | |
| 156 | − if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS))) | |
| 157 | − io7_enable_irq(irq); | |
| 158 | −} | |
| 159 | − | |
| 160 | 146 | static void |
| 161 | 147 | marvel_irq_noop(unsigned int irq) |
| 162 | 148 | { |
| @@ -171,32 +157,22 @@ marvel_irq_noop_return(unsigned int irq) · 8 unmodified lines | ||
| 171 | 157 | |
| 172 | 158 | static struct irq_chip marvel_legacy_irq_type = { |
| 173 | 159 | .name = "LEGACY", |
| 174 | − .startup = marvel_irq_noop_return, | |
| 175 | − .shutdown = marvel_irq_noop, | |
| 176 | − .enable = marvel_irq_noop, | |
| 177 | − .disable = marvel_irq_noop, | |
| 178 | − .ack = marvel_irq_noop, | |
| 179 | − .end = marvel_irq_noop, | |
| 160 | + .mask = marvel_irq_noop, | |
| 161 | + .unmask = marvel_irq_noop, | |
| 180 | 162 | }; |
| 181 | 163 | |
| 182 | 164 | static struct irq_chip io7_lsi_irq_type = { |
| 183 | 165 | .name = "LSI", |
| 184 | − .startup = io7_startup_irq, | |
| 185 | − .shutdown = io7_disable_irq, | |
| 186 | − .enable = io7_enable_irq, | |
| 187 | − .disable = io7_disable_irq, | |
| 188 | − .ack = io7_disable_irq, | |
| 189 | − .end = io7_end_irq, | |
| 166 | + .unmask = io7_enable_irq, | |
| 167 | + .mask = io7_disable_irq, | |
| 168 | + .mask_ack = io7_disable_irq, | |
| 190 | 169 | }; |
| 191 | 170 | |
| 192 | 171 | static struct irq_chip io7_msi_irq_type = { |
| 193 | 172 | .name = "MSI", |
| 194 | − .startup = io7_startup_irq, | |
| 195 | − .shutdown = io7_disable_irq, | |
| 196 | − .enable = io7_enable_irq, | |
| 197 | − .disable = io7_disable_irq, | |
| 173 | + .unmask = io7_enable_irq, | |
| 174 | + .mask = io7_disable_irq, | |
| 198 | 175 | .ack = marvel_irq_noop, |
| 199 | − .end = io7_end_irq, | |
| 200 | 176 | }; |
| 201 | 177 | |
| 202 | 178 | static void |
| @@ -304,8 +280,8 @@ init_io7_irqs(struct io7 *io7, · 101 unmodified lines | ||
| 304 | 280 | |
| 305 | 281 | /* Set up the lsi irqs. */ |
| 306 | 282 | for (i = 0; i < 128; ++i) { |
| 307 | − irq_desc[base + i].status = IRQ_DISABLED | IRQ_LEVEL; | |
| 308 | − irq_desc[base + i].chip = lsi_ops; | |
| 283 | + irq_to_desc(base + i)->status |= IRQ_LEVEL; | |
| 284 | + set_irq_chip_and_handler(base + i, lsi_ops, handle_level_irq); | |
| 309 | 285 | } |
| 310 | 286 | |
| 311 | 287 | /* Disable the implemented irqs in hardware. */ |
| @@ -318,8 +294,8 @@ init_io7_irqs(struct io7 *io7, · 6 unmodified lines | ||
| 318 | 294 | |
| 319 | 295 | /* Set up the msi irqs. */ |
| 320 | 296 | for (i = 128; i < (128 + 512); ++i) { |
| 321 | − irq_desc[base + i].status = IRQ_DISABLED | IRQ_LEVEL; | |
| 322 | − irq_desc[base + i].chip = msi_ops; | |
| 297 | + irq_to_desc(base + i)->status |= IRQ_LEVEL; | |
| 298 | + set_irq_chip_and_handler(base + i, msi_ops, handle_level_irq); | |
| 323 | 299 | } |
| 324 | 300 | |
| 325 | 301 | for (i = 0; i < 16; ++i) |
| @@ -336,8 +312,8 @@ marvel_init_irq(void) · 10 unmodified lines | ||
| 336 | 312 | |
| 337 | 313 | /* Reserve the legacy irqs. */ |
| 338 | 314 | for (i = 0; i < 16; ++i) { |
| 339 | − irq_desc[i].status = IRQ_DISABLED; | |
| 340 | − irq_desc[i].chip = &marvel_legacy_irq_type; | |
| 315 | + set_irq_chip_and_handler(i, &marvel_legacy_irq_type, | |
| 316 | + handle_level_irq); | |
| 341 | 317 | } |
| 342 | 318 | |
| 343 | 319 | /* Init the io7 irqs. */ |
| @@ -54,28 +54,11 @@ mikasa_disable_irq(unsigned int irq) · 53 unmodified lines | ||
| 54 | 54 | mikasa_update_irq_hw(cached_irq_mask &= ~(1 << (irq - 16))); |
| 55 | 55 | } |
| 56 | 56 | |
| 57 | −static unsigned int | |
| 58 | −mikasa_startup_irq(unsigned int irq) | |
| 59 | −{ | |
| 60 | − mikasa_enable_irq(irq); | |
| 61 | − return 0; | |
| 62 | −} | |
| 63 | − | |
| 64 | −static void | |
| 65 | −mikasa_end_irq(unsigned int irq) | |
| 66 | −{ | |
| 67 | − if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS))) | |
| 68 | − mikasa_enable_irq(irq); | |
| 69 | −} | |
| 70 | − | |
| 71 | 57 | static struct irq_chip mikasa_irq_type = { |
| 72 | 58 | .name = "MIKASA", |
| 73 | − .startup = mikasa_startup_irq, | |
| 74 | − .shutdown = mikasa_disable_irq, | |
| 75 | − .enable = mikasa_enable_irq, | |
| 76 | − .disable = mikasa_disable_irq, | |
| 77 | − .ack = mikasa_disable_irq, | |
| 78 | − .end = mikasa_end_irq, | |
| 59 | + .unmask = mikasa_enable_irq, | |
| 60 | + .mask = mikasa_disable_irq, | |
| 61 | + .mask_ack = mikasa_disable_irq, | |
| 79 | 62 | }; |
| 80 | 63 | |
| 81 | 64 | static void |
| @@ -115,8 +98,8 @@ mikasa_init_irq(void) · 33 unmodified lines | ||
| 115 | 98 | mikasa_update_irq_hw(0); |
| 116 | 99 | |
| 117 | 100 | for (i = 16; i < 32; ++i) { |
| 118 | − irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; | |
| 119 | − irq_desc[i].chip = &mikasa_irq_type; | |
| 101 | + irq_to_desc(i)->status |= IRQ_LEVEL; | |
| 102 | + set_irq_chip_and_handler(i, &mikasa_irq_type, handle_level_irq); | |
| 120 | 103 | } |
| 121 | 104 | |
| 122 | 105 | init_i8259a_irqs(); |
| @@ -59,28 +59,11 @@ noritake_disable_irq(unsigned int irq) · 58 unmodified lines | ||
| 59 | 59 | noritake_update_irq_hw(irq, cached_irq_mask &= ~(1 << (irq - 16))); |
| 60 | 60 | } |
| 61 | 61 | |
| 62 | −static unsigned int | |
| 63 | −noritake_startup_irq(unsigned int irq) | |
| 64 | −{ | |
| 65 | − noritake_enable_irq(irq); | |
| 66 | − return 0; | |
| 67 | −} | |
| 68 | − | |
| 69 | −static void | |
| 70 | −noritake_end_irq(unsigned int irq) | |
| 71 | −{ | |
| 72 | − if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS))) | |
| 73 | − noritake_enable_irq(irq); | |
| 74 | −} | |
| 75 | − | |
| 76 | 62 | static struct irq_chip noritake_irq_type = { |
| 77 | 63 | .name = "NORITAKE", |
| 78 | − .startup = noritake_startup_irq, | |
| 79 | − .shutdown = noritake_disable_irq, | |
| 80 | − .enable = noritake_enable_irq, | |
| 81 | − .disable = noritake_disable_irq, | |
| 82 | − .ack = noritake_disable_irq, | |
| 83 | − .end = noritake_end_irq, | |
| 64 | + .unmask = noritake_enable_irq, | |
| 65 | + .mask = noritake_disable_irq, | |
| 66 | + .mask_ack = noritake_disable_irq, | |
| 84 | 67 | }; |
| 85 | 68 | |
| 86 | 69 | static void |
| @@ -144,8 +127,8 @@ noritake_init_irq(void) · 57 unmodified lines | ||
| 144 | 127 | outw(0, 0x54c); |
| 145 | 128 | |
| 146 | 129 | for (i = 16; i < 48; ++i) { |
| 147 | − irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; | |
| 148 | − irq_desc[i].chip = &noritake_irq_type; | |
| 130 | + irq_to_desc(i)->status |= IRQ_LEVEL; | |
| 131 | + set_irq_chip_and_handler(i, &noritake_irq_type, handle_level_irq); | |
| 149 | 132 | } |
| 150 | 133 | |
| 151 | 134 | init_i8259a_irqs(); |
| @@ -121,28 +121,11 @@ rawhide_mask_and_ack_irq(unsigned int irq) · 120 unmodified lines | ||
| 121 | 121 | spin_unlock(&rawhide_irq_lock); |
| 122 | 122 | } |
| 123 | 123 | |
| 124 | −static unsigned int | |
| 125 | −rawhide_startup_irq(unsigned int irq) | |
| 126 | −{ | |
| 127 | − rawhide_enable_irq(irq); | |
| 128 | − return 0; | |
| 129 | −} | |
| 130 | − | |
| 131 | −static void | |
| 132 | −rawhide_end_irq(unsigned int irq) | |
| 133 | −{ | |
| 134 | − if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS))) | |
| 135 | − rawhide_enable_irq(irq); | |
| 136 | −} | |
| 137 | − | |
| 138 | 124 | static struct irq_chip rawhide_irq_type = { |
| 139 | 125 | .name = "RAWHIDE", |
| 140 | − .startup = rawhide_startup_irq, | |
| 141 | − .shutdown = rawhide_disable_irq, | |
| 142 | − .enable = rawhide_enable_irq, | |
| 143 | − .disable = rawhide_disable_irq, | |
| 144 | − .ack = rawhide_mask_and_ack_irq, | |
| 145 | − .end = rawhide_end_irq, | |
| 126 | + .unmask = rawhide_enable_irq, | |
| 127 | + .mask = rawhide_disable_irq, | |
| 128 | + .mask_ack = rawhide_mask_and_ack_irq, | |
| 146 | 129 | }; |
| 147 | 130 | |
| 148 | 131 | static void |
| @@ -194,8 +177,8 @@ rawhide_init_irq(void) · 45 unmodified lines | ||
| 194 | 177 | } |
| 195 | 178 | |
| 196 | 179 | for (i = 16; i < 128; ++i) { |
| 197 | − irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; | |
| 198 | − irq_desc[i].chip = &rawhide_irq_type; | |
| 180 | + irq_to_desc(i)->status |= IRQ_LEVEL; | |
| 181 | + set_irq_chip_and_handler(i, &rawhide_irq_type, handle_level_irq); | |
| 199 | 182 | } |
| 200 | 183 | |
| 201 | 184 | init_i8259a_irqs(); |
| @@ -58,28 +58,11 @@ rx164_disable_irq(unsigned int irq) · 57 unmodified lines | ||
| 58 | 58 | rx164_update_irq_hw(cached_irq_mask &= ~(1UL << (irq - 16))); |
| 59 | 59 | } |
| 60 | 60 | |
| 61 | −static unsigned int | |
| 62 | −rx164_startup_irq(unsigned int irq) | |
| 63 | −{ | |
| 64 | − rx164_enable_irq(irq); | |
| 65 | − return 0; | |
| 66 | −} | |
| 67 | − | |
| 68 | −static void | |
| 69 | −rx164_end_irq(unsigned int irq) | |
| 70 | −{ | |
| 71 | − if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS))) | |
| 72 | − rx164_enable_irq(irq); | |
| 73 | −} | |
| 74 | − | |
| 75 | 61 | static struct irq_chip rx164_irq_type = { |
| 76 | 62 | .name = "RX164", |
| 77 | − .startup = rx164_startup_irq, | |
| 78 | − .shutdown = rx164_disable_irq, | |
| 79 | − .enable = rx164_enable_irq, | |
| 80 | − .disable = rx164_disable_irq, | |
| 81 | − .ack = rx164_disable_irq, | |
| 82 | − .end = rx164_end_irq, | |
| 63 | + .unmask = rx164_enable_irq, | |
| 64 | + .mask = rx164_disable_irq, | |
| 65 | + .mask_ack = rx164_disable_irq, | |
| 83 | 66 | }; |
| 84 | 67 | |
| 85 | 68 | static void |
| @@ -116,8 +99,8 @@ rx164_init_irq(void) · 30 unmodified lines | ||
| 116 | 99 | |
| 117 | 100 | rx164_update_irq_hw(0); |
| 118 | 101 | for (i = 16; i < 40; ++i) { |
| 119 | − irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; | |
| 120 | − irq_desc[i].chip = &rx164_irq_type; | |
| 102 | + irq_to_desc(i)->status |= IRQ_LEVEL; | |
| 103 | + set_irq_chip_and_handler(i, &rx164_irq_type, handle_level_irq); | |
| 121 | 104 | } |
| 122 | 105 | |
| 123 | 106 | init_i8259a_irqs(); |
| @@ -474,20 +474,6 @@ sable_lynx_disable_irq(unsigned int irq) · 473 unmodified lines | ||
| 474 | 474 | #endif |
| 475 | 475 | } |
| 476 | 476 | |
| 477 | −static unsigned int | |
| 478 | −sable_lynx_startup_irq(unsigned int irq) | |
| 479 | −{ | |
| 480 | − sable_lynx_enable_irq(irq); | |
| 481 | − return 0; | |
| 482 | −} | |
| 483 | − | |
| 484 | −static void | |
| 485 | −sable_lynx_end_irq(unsigned int irq) | |
| 486 | −{ | |
| 487 | − if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS))) | |
| 488 | − sable_lynx_enable_irq(irq); | |
| 489 | −} | |
| 490 | − | |
| 491 | 477 | static void |
| 492 | 478 | sable_lynx_mask_and_ack_irq(unsigned int irq) |
| 493 | 479 | { |
| @@ -503,12 +489,9 @@ sable_lynx_mask_and_ack_irq(unsigned int irq) · 9 unmodified lines | ||
| 503 | 489 | |
| 504 | 490 | static struct irq_chip sable_lynx_irq_type = { |
| 505 | 491 | .name = "SABLE/LYNX", |
| 506 | − .startup = sable_lynx_startup_irq, | |
| 507 | − .shutdown = sable_lynx_disable_irq, | |
| 508 | − .enable = sable_lynx_enable_irq, | |
| 509 | − .disable = sable_lynx_disable_irq, | |
| 510 | − .ack = sable_lynx_mask_and_ack_irq, | |
| 511 | − .end = sable_lynx_end_irq, | |
| 492 | + .unmask = sable_lynx_enable_irq, | |
| 493 | + .mask = sable_lynx_disable_irq, | |
| 494 | + .mask_ack = sable_lynx_mask_and_ack_irq, | |
| 512 | 495 | }; |
| 513 | 496 | |
| 514 | 497 | static void |
| @@ -535,8 +518,9 @@ sable_lynx_init_irq(int nr_of_irqs) · 20 unmodified lines | ||
| 535 | 518 | long i; |
| 536 | 519 | |
| 537 | 520 | for (i = 0; i < nr_of_irqs; ++i) { |
| 538 | − irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; | |
| 539 | − irq_desc[i].chip = &sable_lynx_irq_type; | |
| 521 | + irq_to_desc(i)->status |= IRQ_LEVEL; | |
| 522 | + set_irq_chip_and_handler(i, &sable_lynx_irq_type, | |
| 523 | + handle_level_irq); | |
| 540 | 524 | } |
| 541 | 525 | |
| 542 | 526 | common_init_isa_dma(); |
| @@ -60,28 +60,11 @@ takara_disable_irq(unsigned int irq) · 59 unmodified lines | ||
| 60 | 60 | takara_update_irq_hw(irq, mask); |
| 61 | 61 | } |
| 62 | 62 | |
| 63 | −static unsigned int | |
| 64 | −takara_startup_irq(unsigned int irq) | |
| 65 | −{ | |
| 66 | − takara_enable_irq(irq); | |
| 67 | − return 0; /* never anything pending */ | |
| 68 | −} | |
| 69 | − | |
| 70 | −static void | |
| 71 | −takara_end_irq(unsigned int irq) | |
| 72 | −{ | |
| 73 | − if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS))) | |
| 74 | − takara_enable_irq(irq); | |
| 75 | −} | |
| 76 | − | |
| 77 | 63 | static struct irq_chip takara_irq_type = { |
| 78 | 64 | .name = "TAKARA", |
| 79 | − .startup = takara_startup_irq, | |
| 80 | − .shutdown = takara_disable_irq, | |
| 81 | − .enable = takara_enable_irq, | |
| 82 | − .disable = takara_disable_irq, | |
| 83 | − .ack = takara_disable_irq, | |
| 84 | − .end = takara_end_irq, | |
| 65 | + .unmask = takara_enable_irq, | |
| 66 | + .mask = takara_disable_irq, | |
| 67 | + .mask_ack = takara_disable_irq, | |
| 85 | 68 | }; |
| 86 | 69 | |
| 87 | 70 | static void |
| @@ -153,8 +136,8 @@ takara_init_irq(void) · 65 unmodified lines | ||
| 153 | 136 | takara_update_irq_hw(i, -1); |
| 154 | 137 | |
| 155 | 138 | for (i = 16; i < 128; ++i) { |
| 156 | − irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; | |
| 157 | − irq_desc[i].chip = &takara_irq_type; | |
| 139 | + irq_to_desc(i)->status |= IRQ_LEVEL; | |
| 140 | + set_irq_chip_and_handler(i, &takara_irq_type, handle_level_irq); | |
| 158 | 141 | } |
| 159 | 142 | |
| 160 | 143 | common_init_isa_dma(); |
| @@ -129,20 +129,6 @@ titan_disable_irq(unsigned int irq) · 128 unmodified lines | ||
| 129 | 129 | spin_unlock(&titan_irq_lock); |
| 130 | 130 | } |
| 131 | 131 | |
| 132 | −static unsigned int | |
| 133 | −titan_startup_irq(unsigned int irq) | |
| 134 | −{ | |
| 135 | − titan_enable_irq(irq); | |
| 136 | − return 0; /* never anything pending */ | |
| 137 | −} | |
| 138 | − | |
| 139 | −static void | |
| 140 | −titan_end_irq(unsigned int irq) | |
| 141 | −{ | |
| 142 | − if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS))) | |
| 143 | − titan_enable_irq(irq); | |
| 144 | −} | |
| 145 | − | |
| 146 | 132 | static void |
| 147 | 133 | titan_cpu_set_irq_affinity(unsigned int irq, cpumask_t affinity) |
| 148 | 134 | { |
| @@ -189,20 +175,17 @@ init_titan_irqs(struct irq_chip * ops, int imin, int imax) · 40 unmodified lines | ||
| 189 | 175 | { |
| 190 | 176 | long i; |
| 191 | 177 | for (i = imin; i <= imax; ++i) { |
| 192 | − irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL; | |
| 193 | − irq_desc[i].chip = ops; | |
| 178 | + irq_to_desc(i)->status |= IRQ_LEVEL; | |
| 179 | + set_irq_chip_and_handler(i, ops, handle_level_irq); | |
| 194 | 180 | } |
| 195 | 181 | } |
| 196 | 182 | |
| 197 | 183 | static struct irq_chip titan_irq_type = { |
| 198 | − .name = "TITAN", | |
| 199 | − .startup = titan_startup_irq, | |
| 200 | − .shutdown = titan_disable_irq, | |
| 201 | − .enable = titan_enable_irq, | |
| 202 | − .disable = titan_disable_irq, | |
| 203 | − .ack = titan_disable_irq, | |
| 204 | − .end = titan_end_irq, | |
| 205 | − .set_affinity = titan_set_irq_affinity, | |
| 184 | + .name = "TITAN", | |
| 185 | + .unmask = titan_enable_irq, | |
| 186 | + .mask = titan_disable_irq, | |
| 187 | + .mask_ack = titan_disable_irq, | |
| 188 | + .set_affinity = titan_set_irq_affinity, | |
| 206 | 189 | }; |
| 207 | 190 | |
| 208 | 191 | static irqreturn_t |
| @@ -139,32 +139,11 @@ wildfire_mask_and_ack_irq(unsigned int irq) · 138 unmodified lines | ||
| 139 | 139 | spin_unlock(&wildfire_irq_lock); |
| 140 | 140 | } |
| 141 | 141 | |
| 142 | −static unsigned int | |
| 143 | −wildfire_startup_irq(unsigned int irq) | |
| 144 | −{ | |
| 145 | − wildfire_enable_irq(irq); | |
| 146 | − return 0; /* never anything pending */ | |
| 147 | −} | |
| 148 | − | |
| 149 | −static void | |
| 150 | −wildfire_end_irq(unsigned int irq) | |
| 151 | −{ | |
| 152 | −#if 0 | |
| 153 | − if (!irq_desc[irq].action) | |
| 154 | − printk("got irq %d\n", irq); | |
| 155 | −#endif | |
| 156 | − if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS))) | |
| 157 | − wildfire_enable_irq(irq); | |
| 158 | −} | |
| 159 | − | |
| 160 | 142 | static struct irq_chip wildfire_irq_type = { |
| 161 | 143 | .name = "WILDFIRE", |
| 162 | − .startup = wildfire_startup_irq, | |
| 163 | − .shutdown = wildfire_disable_irq, | |
| 164 | − .enable = wildfire_enable_irq, | |
| 165 | − .disable = wildfire_disable_irq, | |
| 166 | − .ack = wildfire_mask_and_ack_irq, | |
| 167 | − .end = wildfire_end_irq, | |
| 144 | + .unmask = wildfire_enable_irq, | |
| 145 | + .mask = wildfire_disable_irq, | |
| 146 | + .mask_ack = wildfire_mask_and_ack_irq, | |
| 168 | 147 | }; |
| 169 | 148 | |
| 170 | 149 | static void __init |
| @@ -198,15 +177,18 @@ wildfire_init_irq_per_pca(int qbbno, int pcano) · 27 unmodified lines | ||
| 198 | 177 | for (i = 0; i < 16; ++i) { |
| 199 | 178 | if (i == 2) |
| 200 | 179 | continue; |
| 201 | − irq_desc[i+irq_bias].status = IRQ_DISABLED | IRQ_LEVEL; | |
| 202 | − irq_desc[i+irq_bias].chip = &wildfire_irq_type; | |
| 180 | + irq_to_desc(i+irq_bias)->status |= IRQ_LEVEL; | |
| 181 | + set_irq_chip_and_handler(i+irq_bias, &wildfire_irq_type, | |
| 182 | + handle_level_irq); | |
| 203 | 183 | } |
| 204 | 184 | |
| 205 | − irq_desc[36+irq_bias].status = IRQ_DISABLED | IRQ_LEVEL; | |
| 206 | − irq_desc[36+irq_bias].chip = &wildfire_irq_type; | |
| 185 | + irq_to_desc(36+irq_bias)->status |= IRQ_LEVEL; | |
| 186 | + set_irq_chip_and_handler(36+irq_bias, &wildfire_irq_type, | |
| 187 | + handle_level_irq); | |
| 207 | 188 | for (i = 40; i < 64; ++i) { |
| 208 | − irq_desc[i+irq_bias].status = IRQ_DISABLED | IRQ_LEVEL; | |
| 209 | − irq_desc[i+irq_bias].chip = &wildfire_irq_type; | |
| 189 | + irq_to_desc(i+irq_bias)->status |= IRQ_LEVEL; | |
| 190 | + set_irq_chip_and_handler(i+irq_bias, &wildfire_irq_type, | |
| 191 | + handle_level_irq); | |
| 210 | 192 | } |
| 211 | 193 | |
| 212 | 194 | setup_irq(32+irq_bias, &isa_enable); |
| @@ -506,7 +506,7 @@ set_rtc_mmss(unsigned long nowtime) · 505 unmodified lines | ||
| 506 | 506 | CMOS_WRITE(real_seconds,RTC_SECONDS); |
| 507 | 507 | CMOS_WRITE(real_minutes,RTC_MINUTES); |
| 508 | 508 | } else { |
| 509 | − printk(KERN_WARNING | |
| 509 | + printk_once(KERN_NOTICE | |
| 510 | 510 | "set_rtc_mmss: can't update from %d to %d\n", |
| 511 | 511 | cmos_minutes, real_minutes); |
| 512 | 512 | retval = -1; |
| @@ -2,8 +2,8 @@ · 1 unmodified line | ||
| 2 | 2 | # Makefile for alpha-specific library files.. |
| 3 | 3 | # |
| 4 | 4 | |
| 5 | −EXTRA_AFLAGS := $(KBUILD_CFLAGS) | |
| 6 | −EXTRA_CFLAGS := -Werror | |
| 5 | +asflags-y := $(KBUILD_CFLAGS) | |
| 6 | +ccflags-y := -Werror | |
| 7 | 7 | |
| 8 | 8 | # Many of these routines have implementations tuned for ev6. |
| 9 | 9 | # Choose them iff we're targeting ev6 specifically. |
| @@ -2,7 +2,7 @@ · 1 unmodified line | ||
| 2 | 2 | # Makefile for the FPU instruction emulation. |
| 3 | 3 | # |
| 4 | 4 | |
| 5 | −EXTRA_CFLAGS := -w | |
| 5 | +ccflags-y := -w | |
| 6 | 6 | |
| 7 | 7 | obj-$(CONFIG_MATHEMU) += math-emu.o |
| 8 | 8 | |
| @@ -2,7 +2,7 @@ · 1 unmodified line | ||
| 2 | 2 | # Makefile for the linux alpha-specific parts of the memory manager. |
| 3 | 3 | # |
| 4 | 4 | |
| 5 | −EXTRA_CFLAGS := -Werror | |
| 5 | +ccflags-y := -Werror | |
| 6 | 6 | |
| 7 | 7 | obj-y := init.o fault.o extable.o |
| 8 | 8 | |
| @@ -1,4 +1,4 @@ | ||
| 1 | −EXTRA_CFLAGS := -Werror -Wno-sign-compare | |
| 1 | +ccflags-y := -Werror -Wno-sign-compare | |
| 2 | 2 | |
| 3 | 3 | obj-$(CONFIG_OPROFILE) += oprofile.o |
| 4 | 4 | |
| @@ -2,6 +2,7 @@ config ARM · 1 unmodified line | ||
| 2 | 2 | bool |
| 3 | 3 | default y |
| 4 | 4 | select HAVE_AOUT |
| 5 | + select HAVE_DMA_API_DEBUG | |
| 5 | 6 | select HAVE_IDE |
| 6 | 7 | select HAVE_MEMBLOCK |
| 7 | 8 | select RTC_LIB |
| @@ -14,6 +15,7 @@ config ARM · 6 unmodified lines | ||
| 14 | 15 | select HAVE_FUNCTION_TRACER if (!XIP_KERNEL) |
| 15 | 16 | select HAVE_FTRACE_MCOUNT_RECORD if (!XIP_KERNEL) |
| 16 | 17 | select HAVE_DYNAMIC_FTRACE if (!XIP_KERNEL) |
| 18 | + select HAVE_FUNCTION_GRAPH_TRACER if (!THUMB2_KERNEL) | |
| 17 | 19 | select HAVE_GENERIC_DMA_COHERENT |
| 18 | 20 | select HAVE_KERNEL_GZIP |
| 19 | 21 | select HAVE_KERNEL_LZO |
| @@ -23,6 +25,9 @@ config ARM · 3 unmodified lines | ||
| 23 | 25 | select PERF_USE_VMALLOC |
| 24 | 26 | select HAVE_REGS_AND_STACK_ACCESS_API |
| 25 | 27 | select HAVE_HW_BREAKPOINT if (PERF_EVENTS && (CPU_V6 || CPU_V7)) |
| 28 | + select HAVE_C_RECORDMCOUNT | |
| 29 | + select HAVE_GENERIC_HARDIRQS | |
| 30 | + select HAVE_SPARSE_IRQ | |
| 26 | 31 | help |
| 27 | 32 | The ARM series is a line of low-power-consumption RISC chip designs |
| 28 | 33 | licensed by ARM Ltd and targeted at embedded applications and |
| @@ -34,9 +39,15 @@ config ARM · 5 unmodified lines | ||
| 34 | 39 | config HAVE_PWM |
| 35 | 40 | bool |
| 36 | 41 | |
| 42 | +config MIGHT_HAVE_PCI | |
| 43 | + bool | |
| 44 | + | |
| 37 | 45 | config SYS_SUPPORTS_APM_EMULATION |
| 38 | 46 | bool |
| 39 | 47 | |
| 48 | +config HAVE_SCHED_CLOCK | |
| 49 | + bool | |
| 50 | + | |
| 40 | 51 | config GENERIC_GPIO |
| 41 | 52 | bool |
| 42 | 53 | |
| @@ -88,10 +99,6 @@ config MCA · 45 unmodified lines | ||
| 88 | 99 | <file:Documentation/mca.txt> (and especially the web page given |
| 89 | 100 | there) before attempting to build an MCA bus kernel. |
| 90 | 101 | |
| 91 | −config GENERIC_HARDIRQS | |
| 92 | − bool | |
| 93 | − default y | |
| 94 | − | |
| 95 | 102 | config STACKTRACE_SUPPORT |
| 96 | 103 | bool |
| 97 | 104 | default y |
| @@ -171,9 +178,6 @@ config FIQ · 73 unmodified lines | ||
| 171 | 178 | config ARCH_MTD_XIP |
| 172 | 179 | bool |
| 173 | 180 | |
| 174 | −config GENERIC_HARDIRQS_NO__DO_IRQ | |
| 175 | − def_bool y | |
| 176 | − | |
| 177 | 181 | config ARM_L1_CACHE_SHIFT_6 |
| 178 | 182 | bool |
| 179 | 183 | help |
| @@ -221,7 +225,7 @@ config ARCH_INTEGRATOR · 41 unmodified lines | ||
| 221 | 225 | bool "ARM Ltd. Integrator family" |
| 222 | 226 | select ARM_AMBA |
| 223 | 227 | select ARCH_HAS_CPUFREQ |
| 224 | − select COMMON_CLKDEV | |
| 228 | + select CLKDEV_LOOKUP | |
| 225 | 229 | select ICST |
| 226 | 230 | select GENERIC_CLOCKEVENTS |
| 227 | 231 | select PLAT_VERSATILE |
| @@ -231,7 +235,8 @@ config ARCH_INTEGRATOR · 3 unmodified lines | ||
| 231 | 235 | config ARCH_REALVIEW |
| 232 | 236 | bool "ARM Ltd. RealView family" |
| 233 | 237 | select ARM_AMBA |
| 234 | − select COMMON_CLKDEV | |
| 238 | + select CLKDEV_LOOKUP | |
| 239 | + select HAVE_SCHED_CLOCK | |
| 235 | 240 | select ICST |
| 236 | 241 | select GENERIC_CLOCKEVENTS |
| 237 | 242 | select ARCH_WANT_OPTIONAL_GPIOLIB |
| @@ -245,7 +250,8 @@ config ARCH_VERSATILE · 7 unmodified lines | ||
| 245 | 250 | bool "ARM Ltd. Versatile family" |
| 246 | 251 | select ARM_AMBA |
| 247 | 252 | select ARM_VIC |
| 248 | − select COMMON_CLKDEV | |
| 253 | + select CLKDEV_LOOKUP | |
| 254 | + select HAVE_SCHED_CLOCK | |
| 249 | 255 | select ICST |
| 250 | 256 | select GENERIC_CLOCKEVENTS |
| 251 | 257 | select ARCH_WANT_OPTIONAL_GPIOLIB |
| @@ -259,9 +265,10 @@ config ARCH_VEXPRESS · 7 unmodified lines | ||
| 259 | 265 | select ARCH_WANT_OPTIONAL_GPIOLIB |
| 260 | 266 | select ARM_AMBA |
| 261 | 267 | select ARM_TIMER_SP804 |
| 262 | − select COMMON_CLKDEV | |
| 268 | + select CLKDEV_LOOKUP | |
| 263 | 269 | select GENERIC_CLOCKEVENTS |
| 264 | 270 | select HAVE_CLK |
| 271 | + select HAVE_SCHED_CLOCK | |
| 265 | 272 | select ICST |
| 266 | 273 | select PLAT_VERSATILE |
| 267 | 274 | help |
| @@ -280,7 +287,7 @@ config ARCH_BCMRING · 12 unmodified lines | ||
| 280 | 287 | depends on MMU |
| 281 | 288 | select CPU_V6 |
| 282 | 289 | select ARM_AMBA |
| 283 | − select COMMON_CLKDEV | |
| 290 | + select CLKDEV_LOOKUP | |
| 284 | 291 | select GENERIC_CLOCKEVENTS |
| 285 | 292 | select ARCH_WANT_OPTIONAL_GPIOLIB |
| 286 | 293 | help |
| @@ -298,6 +305,7 @@ config ARCH_CNS3XXX · 11 unmodified lines | ||
| 298 | 305 | select CPU_V6 |
| 299 | 306 | select GENERIC_CLOCKEVENTS |
| 300 | 307 | select ARM_GIC |
| 308 | + select MIGHT_HAVE_PCI | |
| 301 | 309 | select PCI_DOMAINS if PCI |
| 302 | 310 | help |
| 303 | 311 | Support for Cavium Networks CNS3XXX platform. |
| @@ -327,7 +335,7 @@ config ARCH_EP93XX · 23 unmodified lines | ||
| 327 | 335 | select CPU_ARM920T |
| 328 | 336 | select ARM_AMBA |
| 329 | 337 | select ARM_VIC |
| 330 | − select COMMON_CLKDEV | |
| 338 | + select CLKDEV_LOOKUP | |
| 331 | 339 | select ARCH_REQUIRE_GPIOLIB |
| 332 | 340 | select ARCH_HAS_HOLES_MEMORYMODEL |
| 333 | 341 | select ARCH_USES_GETTIMEOFFSET |
| @@ -347,14 +355,22 @@ config ARCH_MXC · 13 unmodified lines | ||
| 347 | 355 | bool "Freescale MXC/iMX-based" |
| 348 | 356 | select GENERIC_CLOCKEVENTS |
| 349 | 357 | select ARCH_REQUIRE_GPIOLIB |
| 350 | − select COMMON_CLKDEV | |
| 358 | + select CLKDEV_LOOKUP | |
| 351 | 359 | help |
| 352 | 360 | Support for Freescale MXC/iMX-based family of processors |
| 353 | 361 | |
| 362 | +config ARCH_MXS | |
| 363 | + bool "Freescale MXS-based" | |
| 364 | + select GENERIC_CLOCKEVENTS | |
| 365 | + select ARCH_REQUIRE_GPIOLIB | |
| 366 | + select CLKDEV_LOOKUP | |
| 367 | + help | |
| 368 | + Support for Freescale MXS-based family of processors | |
| 369 | + | |
| 354 | 370 | config ARCH_STMP3XXX |
| 355 | 371 | bool "Freescale STMP3xxx" |
| 356 | 372 | select CPU_ARM926T |
| 357 | − select COMMON_CLKDEV | |
| 373 | + select CLKDEV_LOOKUP | |
| 358 | 374 | select ARCH_REQUIRE_GPIOLIB |
| 359 | 375 | select GENERIC_CLOCKEVENTS |
| 360 | 376 | select USB_ARCH_HAS_EHCI |
| @@ -433,6 +449,8 @@ config ARCH_IXP4XX · 72 unmodified lines | ||
| 433 | 449 | select CPU_XSCALE |
| 434 | 450 | select GENERIC_GPIO |
| 435 | 451 | select GENERIC_CLOCKEVENTS |
| 452 | + select HAVE_SCHED_CLOCK | |
| 453 | + select MIGHT_HAVE_PCI | |
| 436 | 454 | select DMABOUNCE if PCI |
| 437 | 455 | help |
| 438 | 456 | Support for Intel's IXP4XX (XScale) family of processors. |
| @@ -472,7 +490,7 @@ config ARCH_LPC32XX · 33 unmodified lines | ||
| 472 | 490 | select HAVE_IDE |
| 473 | 491 | select ARM_AMBA |
| 474 | 492 | select USB_ARCH_HAS_OHCI |
| 475 | − select COMMON_CLKDEV | |
| 493 | + select CLKDEV_LOOKUP | |
| 476 | 494 | select GENERIC_TIME |
| 477 | 495 | select GENERIC_CLOCKEVENTS |
| 478 | 496 | help |
| @@ -506,8 +524,9 @@ config ARCH_MMP · 27 unmodified lines | ||
| 506 | 524 | bool "Marvell PXA168/910/MMP2" |
| 507 | 525 | depends on MMU |
| 508 | 526 | select ARCH_REQUIRE_GPIOLIB |
| 509 | − select COMMON_CLKDEV | |
| 527 | + select CLKDEV_LOOKUP | |
| 510 | 528 | select GENERIC_CLOCKEVENTS |
| 529 | + select HAVE_SCHED_CLOCK | |
| 511 | 530 | select TICK_ONESHOT |
| 512 | 531 | select PLAT_PXA |
| 513 | 532 | select SPARSE_IRQ |
| @@ -539,7 +558,7 @@ config ARCH_W90X900 · 25 unmodified lines | ||
| 539 | 558 | bool "Nuvoton W90X900 CPU" |
| 540 | 559 | select CPU_ARM926T |
| 541 | 560 | select ARCH_REQUIRE_GPIOLIB |
| 542 | − select COMMON_CLKDEV | |
| 561 | + select CLKDEV_LOOKUP | |
| 543 | 562 | select GENERIC_CLOCKEVENTS |
| 544 | 563 | help |
| 545 | 564 | Support for Nuvoton (Winbond logic dept.) ARM9 processor, |
| @@ -553,18 +572,19 @@ config ARCH_W90X900 · 7 unmodified lines | ||
| 553 | 572 | config ARCH_NUC93X |
| 554 | 573 | bool "Nuvoton NUC93X CPU" |
| 555 | 574 | select CPU_ARM926T |
| 556 | − select COMMON_CLKDEV | |
| 575 | + select CLKDEV_LOOKUP | |
| 557 | 576 | help |
| 558 | 577 | Support for Nuvoton (Winbond logic dept.) NUC93X MCU,The NUC93X is a |
| 559 | 578 | low-power and high performance MPEG-4/JPEG multimedia controller chip. |
| 560 | 579 | |
| 561 | 580 | config ARCH_TEGRA |
| 562 | 581 | bool "NVIDIA Tegra" |
| 582 | + select CLKDEV_LOOKUP | |
| 563 | 583 | select GENERIC_TIME |
| 564 | 584 | select GENERIC_CLOCKEVENTS |
| 565 | 585 | select GENERIC_GPIO |
| 566 | 586 | select HAVE_CLK |
| 567 | − select COMMON_CLKDEV | |
| 587 | + select HAVE_SCHED_CLOCK | |
| 568 | 588 | select ARCH_HAS_BARRIERS if CACHE_L2X0 |
| 569 | 589 | select ARCH_HAS_CPUFREQ |
| 570 | 590 | help |
| @@ -574,7 +594,7 @@ config ARCH_TEGRA · 3 unmodified lines | ||
| 574 | 594 | config ARCH_PNX4008 |
| 575 | 595 | bool "Philips Nexperia PNX4008 Mobile" |
| 576 | 596 | select CPU_ARM926T |
| 577 | − select COMMON_CLKDEV | |
| 597 | + select CLKDEV_LOOKUP | |
| 578 | 598 | select ARCH_USES_GETTIMEOFFSET |
| 579 | 599 | help |
| 580 | 600 | This enables support for Philips PNX4008 mobile platform. |
| @@ -584,9 +604,10 @@ config ARCH_PXA · 3 unmodified lines | ||
| 584 | 604 | depends on MMU |
| 585 | 605 | select ARCH_MTD_XIP |
| 586 | 606 | select ARCH_HAS_CPUFREQ |
| 587 | − select COMMON_CLKDEV | |
| 607 | + select CLKDEV_LOOKUP | |
| 588 | 608 | select ARCH_REQUIRE_GPIOLIB |
| 589 | 609 | select GENERIC_CLOCKEVENTS |
| 610 | + select HAVE_SCHED_CLOCK | |
| 590 | 611 | select TICK_ONESHOT |
| 591 | 612 | select PLAT_PXA |
| 592 | 613 | select SPARSE_IRQ |
| @@ -606,9 +627,15 @@ config ARCH_MSM · 13 unmodified lines | ||
| 606 | 627 | (clock and power control, etc). |
| 607 | 628 | |
| 608 | 629 | config ARCH_SHMOBILE |
| 609 | − bool "Renesas SH-Mobile" | |
| 630 | + bool "Renesas SH-Mobile / R-Mobile" | |
| 631 | + select HAVE_CLK | |
| 632 | + select CLKDEV_LOOKUP | |
| 633 | + select GENERIC_CLOCKEVENTS | |
| 634 | + select NO_IOPORT | |
| 635 | + select SPARSE_IRQ | |
| 636 | + select MULTI_IRQ_HANDLER | |
| 610 | 637 | help |
| 611 | − Support for Renesas's SH-Mobile ARM platforms | |
| 638 | + Support for Renesas's SH-Mobile and R-Mobile ARM platforms. | |
| 612 | 639 | |
| 613 | 640 | config ARCH_RPC |
| 614 | 641 | bool "RiscPC" |
| @@ -635,6 +662,7 @@ config ARCH_SA1100 · 20 unmodified lines | ||
| 635 | 662 | select CPU_FREQ |
| 636 | 663 | select GENERIC_CLOCKEVENTS |
| 637 | 664 | select HAVE_CLK |
| 665 | + select HAVE_SCHED_CLOCK | |
| 638 | 666 | select TICK_ONESHOT |
| 639 | 667 | select ARCH_REQUIRE_GPIOLIB |
| 640 | 668 | help |
| @@ -738,6 +766,7 @@ config ARCH_S5PV310 · 97 unmodified lines | ||
| 738 | 766 | select ARCH_SPARSEMEM_ENABLE |
| 739 | 767 | select GENERIC_GPIO |
| 740 | 768 | select HAVE_CLK |
| 769 | + select ARCH_HAS_CPUFREQ | |
| 741 | 770 | select GENERIC_CLOCKEVENTS |
| 742 | 771 | select HAVE_S3C_RTC if RTC_CLASS |
| 743 | 772 | select HAVE_S3C2410_I2C if I2C |
| @@ -761,7 +790,7 @@ config ARCH_TCC_926 · 17 unmodified lines | ||
| 761 | 790 | bool "Telechips TCC ARM926-based systems" |
| 762 | 791 | select CPU_ARM926T |
| 763 | 792 | select HAVE_CLK |
| 764 | − select COMMON_CLKDEV | |
| 793 | + select CLKDEV_LOOKUP | |
| 765 | 794 | select GENERIC_CLOCKEVENTS |
| 766 | 795 | help |
| 767 | 796 | Support for Telechips TCC ARM926-based systems. |
| @@ -781,11 +810,12 @@ config ARCH_U300 · 13 unmodified lines | ||
| 781 | 810 | bool "ST-Ericsson U300 Series" |
| 782 | 811 | depends on MMU |
| 783 | 812 | select CPU_ARM926T |
| 813 | + select HAVE_SCHED_CLOCK | |
| 784 | 814 | select HAVE_TCM |
| 785 | 815 | select ARM_AMBA |
| 786 | 816 | select ARM_VIC |
| 787 | 817 | select GENERIC_CLOCKEVENTS |
| 788 | − select COMMON_CLKDEV | |
| 818 | + select CLKDEV_LOOKUP | |
| 789 | 819 | select GENERIC_GPIO |
| 790 | 820 | help |
| 791 | 821 | Support for ST-Ericsson U300 series mobile platforms. |
| @@ -795,8 +825,9 @@ config ARCH_U8500 · 3 unmodified lines | ||
| 795 | 825 | select CPU_V7 |
| 796 | 826 | select ARM_AMBA |
| 797 | 827 | select GENERIC_CLOCKEVENTS |
| 798 | − select COMMON_CLKDEV | |
| 828 | + select CLKDEV_LOOKUP | |
| 799 | 829 | select ARCH_REQUIRE_GPIOLIB |
| 830 | + select ARCH_HAS_CPUFREQ | |
| 800 | 831 | help |
| 801 | 832 | Support for ST-Ericsson's Ux500 architecture |
| 802 | 833 | |
| @@ -805,7 +836,7 @@ config ARCH_NOMADIK · 2 unmodified lines | ||
| 805 | 836 | select ARM_AMBA |
| 806 | 837 | select ARM_VIC |
| 807 | 838 | select CPU_ARM926T |
| 808 | − select COMMON_CLKDEV | |
| 839 | + select CLKDEV_LOOKUP | |
| 809 | 840 | select GENERIC_CLOCKEVENTS |
| 810 | 841 | select ARCH_REQUIRE_GPIOLIB |
| 811 | 842 | help |
| @@ -817,7 +848,7 @@ config ARCH_DAVINCI · 5 unmodified lines | ||
| 817 | 848 | select ARCH_REQUIRE_GPIOLIB |
| 818 | 849 | select ZONE_DMA |
| 819 | 850 | select HAVE_IDE |
| 820 | − select COMMON_CLKDEV | |
| 851 | + select CLKDEV_LOOKUP | |
| 821 | 852 | select GENERIC_ALLOCATOR |
| 822 | 853 | select ARCH_HAS_HOLES_MEMORYMODEL |
| 823 | 854 | help |
| @@ -829,6 +860,7 @@ config ARCH_OMAP · 5 unmodified lines | ||
| 829 | 860 | select ARCH_REQUIRE_GPIOLIB |
| 830 | 861 | select ARCH_HAS_CPUFREQ |
| 831 | 862 | select GENERIC_CLOCKEVENTS |
| 863 | + select HAVE_SCHED_CLOCK | |
| 832 | 864 | select ARCH_HAS_HOLES_MEMORYMODEL |
| 833 | 865 | help |
| 834 | 866 | Support for TI's OMAP platform (OMAP1/2/3/4). |
| @@ -837,7 +869,7 @@ config PLAT_SPEAR · 2 unmodified lines | ||
| 837 | 869 | bool "ST SPEAr" |
| 838 | 870 | select ARM_AMBA |
| 839 | 871 | select ARCH_REQUIRE_GPIOLIB |
| 840 | − select COMMON_CLKDEV | |
| 872 | + select CLKDEV_LOOKUP | |
| 841 | 873 | select GENERIC_CLOCKEVENTS |
| 842 | 874 | select HAVE_CLK |
| 843 | 875 | help |
| @@ -902,6 +934,8 @@ source "arch/arm/mach-mv78xx0/Kconfig" · 58 unmodified lines | ||
| 902 | 934 | |
| 903 | 935 | source "arch/arm/plat-mxc/Kconfig" |
| 904 | 936 | |
| 937 | +source "arch/arm/mach-mxs/Kconfig" | |
| 938 | + | |
| 905 | 939 | source "arch/arm/mach-netx/Kconfig" |
| 906 | 940 | |
| 907 | 941 | source "arch/arm/mach-nomadik/Kconfig" |
| @@ -982,9 +1016,11 @@ config ARCH_ACORN · 74 unmodified lines | ||
| 982 | 1016 | config PLAT_IOP |
| 983 | 1017 | bool |
| 984 | 1018 | select GENERIC_CLOCKEVENTS |
| 1019 | + select HAVE_SCHED_CLOCK | |
| 985 | 1020 | |
| 986 | 1021 | config PLAT_ORION |
| 987 | 1022 | bool |
| 1023 | + select HAVE_SCHED_CLOCK | |
| 988 | 1024 | |
| 989 | 1025 | config PLAT_PXA |
| 990 | 1026 | bool |
| @@ -999,8 +1035,8 @@ source arch/arm/mm/Kconfig · 8 unmodified lines | ||
| 999 | 1035 | |
| 1000 | 1036 | config IWMMXT |
| 1001 | 1037 | bool "Enable iWMMXt support" |
| 1002 | − depends on CPU_XSCALE || CPU_XSC3 || CPU_MOHAWK | |
| 1003 | − default y if PXA27x || PXA3xx || ARCH_MMP | |
| 1038 | + depends on CPU_XSCALE || CPU_XSC3 || CPU_MOHAWK || CPU_PJ4 | |
| 1039 | + default y if PXA27x || PXA3xx || PXA95x || ARCH_MMP | |
| 1004 | 1040 | help |
| 1005 | 1041 | Enable support for iWMMXt context switching at run time if |
| 1006 | 1042 | running on a CPU that supports it. |
| @@ -1017,6 +1053,11 @@ config CPU_HAS_PMU · 10 unmodified lines | ||
| 1017 | 1053 | default y |
| 1018 | 1054 | bool |
| 1019 | 1055 | |
| 1056 | +config MULTI_IRQ_HANDLER | |
| 1057 | + bool | |
| 1058 | + help | |
| 1059 | + Allow each machine to specify it's own IRQ handler at run time. | |
| 1060 | + | |
| 1020 | 1061 | if !MMU |
| 1021 | 1062 | source "arch/arm/Kconfig-nommu" |
| 1022 | 1063 | endif |
| @@ -1136,6 +1177,31 @@ config ARM_ERRATA_743622 · 113 unmodified lines | ||
| 1136 | 1177 | visible impact on the overall performance or power consumption of the |
| 1137 | 1178 | processor. |
| 1138 | 1179 | |
| 1180 | +config ARM_ERRATA_751472 | |
| 1181 | + bool "ARM errata: Interrupted ICIALLUIS may prevent completion of broadcasted operation" | |
| 1182 | + depends on CPU_V7 && SMP | |
| 1183 | + help | |
| 1184 | + This option enables the workaround for the 751472 Cortex-A9 (prior | |
| 1185 | + to r3p0) erratum. An interrupted ICIALLUIS operation may prevent the | |
| 1186 | + completion of a following broadcasted operation if the second | |
| 1187 | + operation is received by a CPU before the ICIALLUIS has completed, | |
| 1188 | + potentially leading to corrupted entries in the cache or TLB. | |
| 1189 | + | |
| 1190 | +config ARM_ERRATA_753970 | |
| 1191 | + bool "ARM errata: cache sync operation may be faulty" | |
| 1192 | + depends on CACHE_PL310 | |
| 1193 | + help | |
| 1194 | + This option enables the workaround for the 753970 PL310 (r3p0) erratum. | |
| 1195 | + | |
| 1196 | + Under some condition the effect of cache sync operation on | |
| 1197 | + the store buffer still remains when the operation completes. | |
| 1198 | + This means that the store buffer is always asked to drain and | |
| 1199 | + this prevents it from merging any further writes. The workaround | |
| 1200 | + is to replace the normal offset of cache sync operation (0x730) | |
| 1201 | + by another offset targeting an unmapped PL310 register 0x740. | |
| 1202 | + This has the same effect as the cache sync operation: store buffer | |
| 1203 | + drain and waiting for all buffers empty. | |
| 1204 | + | |
| 1139 | 1205 | endmenu |
| 1140 | 1206 | |
| 1141 | 1207 | source "arch/arm/common/Kconfig" |
| @@ -1164,7 +1230,7 @@ config ISA_DMA_API · 22 unmodified lines | ||
| 1164 | 1230 | bool |
| 1165 | 1231 | |
| 1166 | 1232 | config PCI |
| 1167 | − bool "PCI support" if ARCH_INTEGRATOR_AP || ARCH_VERSATILE_PB || ARCH_IXP4XX || ARCH_KS8695 || MACH_ARMCORE || ARCH_CNS3XXX | |
| 1233 | + bool "PCI support" if MIGHT_HAVE_PCI | |
| 1168 | 1234 | help |
| 1169 | 1235 | Find out whether you have a PCI motherboard. PCI is the name of a |
| 1170 | 1236 | bus system, i.e. the way the CPU talks to the other stuff inside |
| @@ -1175,6 +1241,12 @@ config PCI_DOMAINS · 4 unmodified lines | ||
| 1175 | 1241 | bool |
| 1176 | 1242 | depends on PCI |
| 1177 | 1243 | |
| 1244 | +config PCI_NANOENGINE | |
| 1245 | + bool "BSE nanoEngine PCI support" | |
| 1246 | + depends on SA1100_NANOENGINE | |
| 1247 | + help | |
| 1248 | + Enable PCI on the BSE nanoEngine board. | |
| 1249 | + | |
| 1178 | 1250 | config PCI_SYSCALL |
| 1179 | 1251 | def_bool PCI |
| 1180 | 1252 | |
| @@ -1205,10 +1277,11 @@ config SMP · 24 unmodified lines | ||
| 1205 | 1277 | depends on EXPERIMENTAL |
| 1206 | 1278 | depends on GENERIC_CLOCKEVENTS |
| 1207 | 1279 | depends on REALVIEW_EB_ARM11MP || REALVIEW_EB_A9MP || \ |
| 1208 | − MACH_REALVIEW_PB11MP || MACH_REALVIEW_PBX || ARCH_OMAP4 ||\ | |
| 1209 | − ARCH_S5PV310 || ARCH_TEGRA || ARCH_U8500 || ARCH_VEXPRESS_CA9X4 | |
| 1280 | + MACH_REALVIEW_PB11MP || MACH_REALVIEW_PBX || ARCH_OMAP4 || \ | |
| 1281 | + ARCH_S5PV310 || ARCH_TEGRA || ARCH_U8500 || ARCH_VEXPRESS_CA9X4 || \ | |
| 1282 | + ARCH_MSM_SCORPIONMP || ARCH_SHMOBILE | |
| 1210 | 1283 | select USE_GENERIC_SMP_HELPERS |
| 1211 | − select HAVE_ARM_SCU | |
| 1284 | + select HAVE_ARM_SCU if !ARCH_MSM_SCORPIONMP | |
| 1212 | 1285 | help |
| 1213 | 1286 | This enables support for systems with more than one CPU. If you have |
| 1214 | 1287 | a system with only one CPU, like most personal computers, say N. If |
| @@ -1229,7 +1302,7 @@ config SMP · 14 unmodified lines | ||
| 1229 | 1302 | config SMP_ON_UP |
| 1230 | 1303 | bool "Allow booting SMP kernel on uniprocessor systems (EXPERIMENTAL)" |
| 1231 | 1304 | depends on EXPERIMENTAL |
| 1232 | − depends on SMP && !XIP && !THUMB2_KERNEL | |
| 1305 | + depends on SMP && !XIP_KERNEL | |
| 1233 | 1306 | default y |
| 1234 | 1307 | help |
| 1235 | 1308 | SMP kernels contain instructions which fail on non-SMP processors. |
| @@ -1248,6 +1321,7 @@ config HAVE_ARM_SCU · 12 unmodified lines | ||
| 1248 | 1321 | config HAVE_ARM_TWD |
| 1249 | 1322 | bool |
| 1250 | 1323 | depends on SMP |
| 1324 | + select TICK_ONESHOT | |
| 1251 | 1325 | help |
| 1252 | 1326 | This options enables support for the ARM timer and watchdog unit |
| 1253 | 1327 | |
| @@ -1283,6 +1357,7 @@ config NR_CPUS · 29 unmodified lines | ||
| 1283 | 1357 | config HOTPLUG_CPU |
| 1284 | 1358 | bool "Support for hot-pluggable CPUs (EXPERIMENTAL)" |
| 1285 | 1359 | depends on SMP && HOTPLUG && EXPERIMENTAL |
| 1360 | + depends on !ARCH_MSM | |
| 1286 | 1361 | help |
| 1287 | 1362 | Say Y here to experiment with turning CPUs off and on. CPUs |
| 1288 | 1363 | can be controlled through /sys/devices/system/cpu. |
| @@ -1291,7 +1366,7 @@ config LOCAL_TIMERS · 2 unmodified lines | ||
| 1291 | 1366 | bool "Use local timer interrupts" |
| 1292 | 1367 | depends on SMP |
| 1293 | 1368 | default y |
| 1294 | − select HAVE_ARM_TWD | |
| 1369 | + select HAVE_ARM_TWD if !ARCH_MSM_SCORPIONMP | |
| 1295 | 1370 | help |
| 1296 | 1371 | Enable support for local timers on SMP platforms, rather then the |
| 1297 | 1372 | legacy IPI broadcast method. Local timers allows the system |
| @@ -1310,7 +1385,7 @@ config HZ · 12 unmodified lines | ||
| 1310 | 1385 | default 100 |
| 1311 | 1386 | |
| 1312 | 1387 | config THUMB2_KERNEL |
| 1313 | − bool "Compile the kernel in Thumb-2 mode" | |
| 1388 | + bool "Compile the kernel in Thumb-2 mode (EXPERIMENTAL)" | |
| 1314 | 1389 | depends on CPU_V7 && !CPU_V6 && EXPERIMENTAL |
| 1315 | 1390 | select AEABI |
| 1316 | 1391 | select ARM_ASM_UNIFIED |
| @@ -1341,7 +1416,7 @@ config AEABI · 24 unmodified lines | ||
| 1341 | 1416 | |
| 1342 | 1417 | config OABI_COMPAT |
| 1343 | 1418 | bool "Allow old ABI binaries to run with this kernel (EXPERIMENTAL)" |
| 1344 | − depends on AEABI && EXPERIMENTAL | |
| 1419 | + depends on AEABI && EXPERIMENTAL && !THUMB2_KERNEL | |
| 1345 | 1420 | default y |
| 1346 | 1421 | help |
| 1347 | 1422 | This option preserves the old syscall interface along with the |
| @@ -1398,15 +1473,6 @@ config HW_PERF_EVENTS · 50 unmodified lines | ||
| 1398 | 1473 | Enable hardware performance counter support for perf events. If |
| 1399 | 1474 | disabled, perf events will use software events only. |
| 1400 | 1475 | |
| 1401 | −config SPARSE_IRQ | |
| 1402 | − def_bool n | |
| 1403 | − help | |
| 1404 | − This enables support for sparse irqs. This is useful in general | |
| 1405 | − as most CPUs have a fairly sparse array of IRQ vectors, which | |
| 1406 | − the irq_desc then maps directly on to. Systems with a high | |
| 1407 | − number of off-chip IRQs will want to treat this as | |
| 1408 | − experimental until they have been independently verified. | |
| 1409 | − | |
| 1410 | 1476 | source "mm/Kconfig" |
| 1411 | 1477 | |
| 1412 | 1478 | config FORCE_MAX_ZONEORDER |
| @@ -1524,6 +1590,7 @@ config SECCOMP · 111 unmodified lines | ||
| 1524 | 1590 | |
| 1525 | 1591 | config CC_STACKPROTECTOR |
| 1526 | 1592 | bool "Enable -fstack-protector buffer overflow detection (EXPERIMENTAL)" |
| 1593 | + depends on EXPERIMENTAL | |
| 1527 | 1594 | help |
| 1528 | 1595 | This option turns on the -fstack-protector GCC feature. This |
| 1529 | 1596 | feature puts, at the beginning of functions, a canary value on |
| @@ -1650,6 +1717,19 @@ config ATAGS_PROC · 120 unmodified lines | ||
| 1650 | 1717 | Should the atags used to boot the kernel be exported in an "atags" |
| 1651 | 1718 | file in procfs. Useful with kexec. |
| 1652 | 1719 | |
| 1720 | +config CRASH_DUMP | |
| 1721 | + bool "Build kdump crash kernel (EXPERIMENTAL)" | |
| 1722 | + depends on EXPERIMENTAL | |
| 1723 | + help | |
| 1724 | + Generate crash dump after being started by kexec. This should | |
| 1725 | + be normally only set in special crash dump kernels which are | |
| 1726 | + loaded in the main kernel with kexec-tools into a specially | |
| 1727 | + reserved region and then later executed after a crash by | |
| 1728 | + kdump/kexec. The crash dump kernel must be compiled to a | |
| 1729 | + memory address not used by the main kernel | |
| 1730 | + | |
| 1731 | + For more details see Documentation/kdump/kdump.txt | |
| 1732 | + | |
| 1653 | 1733 | config AUTO_ZRELADDR |
| 1654 | 1734 | bool "Auto calculation of the decompressed kernel image address" |
| 1655 | 1735 | depends on !ZBOOT_ROM && !ARCH_U300 |
| @@ -1707,7 +1787,7 @@ config CPU_FREQ_S3C · 51 unmodified lines | ||
| 1707 | 1787 | Internal configuration node for common cpufreq on Samsung SoC |
| 1708 | 1788 | |
| 1709 | 1789 | config CPU_FREQ_S3C24XX |
| 1710 | − bool "CPUfreq driver for Samsung S3C24XX series CPUs" | |
| 1790 | + bool "CPUfreq driver for Samsung S3C24XX series CPUs (EXPERIMENTAL)" | |
| 1711 | 1791 | depends on ARCH_S3C2410 && CPU_FREQ && EXPERIMENTAL |
| 1712 | 1792 | select CPU_FREQ_S3C |
| 1713 | 1793 | help |
| @@ -1719,7 +1799,7 @@ config CPU_FREQ_S3C24XX · 5 unmodified lines | ||
| 1719 | 1799 | If in doubt, say N. |
| 1720 | 1800 | |
| 1721 | 1801 | config CPU_FREQ_S3C24XX_PLL |
| 1722 | − bool "Support CPUfreq changing of PLL frequency" | |
| 1802 | + bool "Support CPUfreq changing of PLL frequency (EXPERIMENTAL)" | |
| 1723 | 1803 | depends on CPU_FREQ_S3C24XX && EXPERIMENTAL |
| 1724 | 1804 | help |
| 1725 | 1805 | Compile in support for changing the PLL frequency from the |
| @@ -23,7 +23,7 @@ config STRICT_DEVMEM · 22 unmodified lines | ||
| 23 | 23 | config FRAME_POINTER |
| 24 | 24 | bool |
| 25 | 25 | depends on !THUMB2_KERNEL |
| 26 | − default y if !ARM_UNWIND | |
| 26 | + default y if !ARM_UNWIND || FUNCTION_GRAPH_TRACER | |
| 27 | 27 | help |
| 28 | 28 | If you say N here, the resulting kernel will be slightly smaller and |
| 29 | 29 | faster. However, if neither FRAME_POINTER nor ARM_UNWIND are enabled, |
| @@ -31,7 +31,7 @@ config FRAME_POINTER · 1 unmodified line | ||
| 31 | 31 | reported is severely limited. |
| 32 | 32 | |
| 33 | 33 | config ARM_UNWIND |
| 34 | − bool "Enable stack unwinding support" | |
| 34 | + bool "Enable stack unwinding support (EXPERIMENTAL)" | |
| 35 | 35 | depends on AEABI && EXPERIMENTAL |
| 36 | 36 | default y |
| 37 | 37 | help |
| @@ -15,7 +15,7 @@ ifeq ($(CONFIG_CPU_ENDIAN_BE8),y) · 14 unmodified lines | ||
| 15 | 15 | LDFLAGS_vmlinux += --be8 |
| 16 | 16 | endif |
| 17 | 17 | |
| 18 | −OBJCOPYFLAGS :=-O binary -R .note -R .note.gnu.build-id -R .comment -S | |
| 18 | +OBJCOPYFLAGS :=-O binary -R .comment -S | |
| 19 | 19 | GZFLAGS :=-9 |
| 20 | 20 | #KBUILD_CFLAGS +=-pipe |
| 21 | 21 | # Explicitly specifiy 32-bit ARM ISA since toolchain default can be -mthumb: |
| @@ -154,10 +154,11 @@ machine-$(CONFIG_ARCH_MSM) := msm · 132 unmodified lines | ||
| 154 | 154 | machine-$(CONFIG_ARCH_MV78XX0) := mv78xx0 |
| 155 | 155 | machine-$(CONFIG_ARCH_MX1) := imx |
| 156 | 156 | machine-$(CONFIG_ARCH_MX2) := imx |
| 157 | −machine-$(CONFIG_ARCH_MX25) := mx25 | |
| 157 | +machine-$(CONFIG_ARCH_MX25) := imx | |
| 158 | 158 | machine-$(CONFIG_ARCH_MX3) := mx3 |
| 159 | 159 | machine-$(CONFIG_ARCH_MX5) := mx5 |
| 160 | 160 | machine-$(CONFIG_ARCH_MXC91231) := mxc91231 |
| 161 | +machine-$(CONFIG_ARCH_MXS) := mxs | |
| 161 | 162 | machine-$(CONFIG_ARCH_NETX) := netx |
| 162 | 163 | machine-$(CONFIG_ARCH_NOMADIK) := nomadik |
| 163 | 164 | machine-$(CONFIG_ARCH_NS9XXX) := ns9xxx |
| @@ -1,3 +1,7 @@ | ||
| 1 | 1 | font.c |
| 2 | −piggy.gz | |
| 2 | +lib1funcs.S | |
| 3 | +piggy.gzip | |
| 4 | +piggy.lzo | |
| 5 | +piggy.lzma | |
| 6 | +vmlinux | |
| 3 | 7 | vmlinux.lds |
| @@ -45,6 +45,10 @@ else · 44 unmodified lines | ||
| 45 | 45 | endif |
| 46 | 46 | endif |
| 47 | 47 | |
| 48 | +ifeq ($(CONFIG_ARCH_SHMOBILE),y) | |
| 49 | +OBJS += head-shmobile.o | |
| 50 | +endif | |
| 51 | + | |
| 48 | 52 | # |
| 49 | 53 | # We now have a PIC decompressor implementation. Decompressors running |
| 50 | 54 | # from RAM should not define ZTEXTADDR. Decompressors running directly |
| @@ -0,0 +1,53 @@ | ||
| 1 | +/* | |
| 2 | + * The head-file for SH-Mobile ARM platforms | |
| 3 | + * | |
| 4 | + * Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> | |
| 5 | + * Simon Horman <horms@verge.net.au> | |
| 6 | + * | |
| 7 | + * This program is free software; you can redistribute it and/or modify | |
| 8 | + * it under the terms of the GNU General Public License as published by | |
| 9 | + * the Free Software Foundation; version 2 of the License. | |
| 10 | + * | |
| 11 | + * This program is distributed in the hope that it will be useful, | |
| 12 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 13 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 14 | + * GNU General Public License for more details. | |
| 15 | + * | |
| 16 | + * You should have received a copy of the GNU General Public License | |
| 17 | + * along with this program; if not, write to the Free Software | |
| 18 | + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | |
| 19 | + */ | |
| 20 | + | |
| 21 | +#ifdef CONFIG_ZBOOT_ROM | |
| 22 | + | |
| 23 | + .section ".start", "ax" | |
| 24 | + | |
| 25 | + /* load board-specific initialization code */ | |
| 26 | +#include <mach/zboot.h> | |
| 27 | + | |
| 28 | + b 1f | |
| 29 | +__atags:@ tag #1 | |
| 30 | + .long 12 @ tag->hdr.size = tag_size(tag_core); | |
| 31 | + .long 0x54410001 @ tag->hdr.tag = ATAG_CORE; | |
| 32 | + .long 0 @ tag->u.core.flags = 0; | |
| 33 | + .long 0 @ tag->u.core.pagesize = 0; | |
| 34 | + .long 0 @ tag->u.core.rootdev = 0; | |
| 35 | + @ tag #2 | |
| 36 | + .long 8 @ tag->hdr.size = tag_size(tag_mem32); | |
| 37 | + .long 0x54410002 @ tag->hdr.tag = ATAG_MEM; | |
| 38 | + .long CONFIG_MEMORY_SIZE @ tag->u.mem.size = CONFIG_MEMORY_SIZE; | |
| 39 | + .long CONFIG_MEMORY_START @ @ tag->u.mem.start = CONFIG_MEMORY_START; | |
| 40 | + @ tag #3 | |
| 41 | + .long 0 @ tag->hdr.size = 0 | |
| 42 | + .long 0 @ tag->hdr.tag = ATAG_NONE; | |
| 43 | +1: | |
| 44 | + | |
| 45 | + /* Set board ID necessary for boot */ | |
| 46 | + ldr r7, 1f @ Set machine type register | |
| 47 | + adr r8, __atags @ Set atag register | |
| 48 | + b 2f | |
| 49 | + | |
| 50 | +1 : .long MACH_TYPE | |
| 51 | +2 : | |
| 52 | + | |
| 53 | +#endif /* CONFIG_ZBOOT_ROM */ | |
| @@ -37,7 +37,3 @@ config SHARP_PARAM · 36 unmodified lines | ||
| 37 | 37 | |
| 38 | 38 | config SHARP_SCOOP |
| 39 | 39 | bool |
| 40 | − | |
| 41 | −config COMMON_CLKDEV | |
| 42 | − bool | |
| 43 | − select HAVE_CLK | |
| @@ -17,3 +17,4 @@ obj-$(CONFIG_ARCH_IXP2000) += uengine.o · 16 unmodified lines | ||
| 17 | 17 | obj-$(CONFIG_ARCH_IXP23XX) += uengine.o |
| 18 | 18 | obj-$(CONFIG_PCI_HOST_ITE8152) += it8152.o |
| 19 | 19 | obj-$(CONFIG_COMMON_CLKDEV) += clkdev.o |
| 20 | +obj-$(CONFIG_ARM_TIMER_SP804) += timer-sp.o | |
| @@ -328,7 +328,7 @@ static inline void unmap_single(struct device *dev, dma_addr_t dma_addr, · 327 unmodified lines | ||
| 328 | 328 | * substitute the safe buffer for the unsafe one. |
| 329 | 329 | * (basically move the buffer from an unsafe area to a safe one) |
| 330 | 330 | */ |
| 331 | −dma_addr_t dma_map_single(struct device *dev, void *ptr, size_t size, | |
| 331 | +dma_addr_t __dma_map_single(struct device *dev, void *ptr, size_t size, | |
| 332 | 332 | enum dma_data_direction dir) |
| 333 | 333 | { |
| 334 | 334 | dev_dbg(dev, "%s(ptr=%p,size=%d,dir=%x)\n", |
| @@ -338,7 +338,7 @@ dma_addr_t dma_map_single(struct device *dev, void *ptr, size_t size, · 3 unmodified lines | ||
| 338 | 338 | |
| 339 | 339 | return map_single(dev, ptr, size, dir); |
| 340 | 340 | } |
| 341 | −EXPORT_SYMBOL(dma_map_single); | |
| 341 | +EXPORT_SYMBOL(__dma_map_single); | |
| 342 | 342 | |
| 343 | 343 | /* |
| 344 | 344 | * see if a mapped address was really a "safe" buffer and if so, copy |
| @@ -346,7 +346,7 @@ EXPORT_SYMBOL(dma_map_single); · 1 unmodified line | ||
| 346 | 346 | * the safe buffer. (basically return things back to the way they |
| 347 | 347 | * should be) |
| 348 | 348 | */ |
| 349 | −void dma_unmap_single(struct device *dev, dma_addr_t dma_addr, size_t size, | |
| 349 | +void __dma_unmap_single(struct device *dev, dma_addr_t dma_addr, size_t size, | |
| 350 | 350 | enum dma_data_direction dir) |
| 351 | 351 | { |
| 352 | 352 | dev_dbg(dev, "%s(ptr=%p,size=%d,dir=%x)\n", |
| @@ -354,9 +354,9 @@ void dma_unmap_single(struct device *dev, dma_addr_t dma_addr, size_t size, · 1 unmodified line | ||
| 354 | 354 | |
| 355 | 355 | unmap_single(dev, dma_addr, size, dir); |
| 356 | 356 | } |
| 357 | −EXPORT_SYMBOL(dma_unmap_single); | |
| 357 | +EXPORT_SYMBOL(__dma_unmap_single); | |
| 358 | 358 | |
| 359 | −dma_addr_t dma_map_page(struct device *dev, struct page *page, | |
| 359 | +dma_addr_t __dma_map_page(struct device *dev, struct page *page, | |
| 360 | 360 | unsigned long offset, size_t size, enum dma_data_direction dir) |
| 361 | 361 | { |
| 362 | 362 | dev_dbg(dev, "%s(page=%p,off=%#lx,size=%zx,dir=%x)\n", |
| @@ -372,7 +372,7 @@ dma_addr_t dma_map_page(struct device *dev, struct page *page, · 9 unmodified lines | ||
| 372 | 372 | |
| 373 | 373 | return map_single(dev, page_address(page) + offset, size, dir); |
| 374 | 374 | } |
| 375 | −EXPORT_SYMBOL(dma_map_page); | |
| 375 | +EXPORT_SYMBOL(__dma_map_page); | |
| 376 | 376 | |
| 377 | 377 | /* |
| 378 | 378 | * see if a mapped address was really a "safe" buffer and if so, copy |
| @@ -380,7 +380,7 @@ EXPORT_SYMBOL(dma_map_page); · 1 unmodified line | ||
| 380 | 380 | * the safe buffer. (basically return things back to the way they |
| 381 | 381 | * should be) |
| 382 | 382 | */ |
| 383 | −void dma_unmap_page(struct device *dev, dma_addr_t dma_addr, size_t size, | |
| 383 | +void __dma_unmap_page(struct device *dev, dma_addr_t dma_addr, size_t size, | |
| 384 | 384 | enum dma_data_direction dir) |
| 385 | 385 | { |
| 386 | 386 | dev_dbg(dev, "%s(ptr=%p,size=%d,dir=%x)\n", |
| @@ -388,7 +388,7 @@ void dma_unmap_page(struct device *dev, dma_addr_t dma_addr, size_t size, · 1 unmodified line | ||
| 388 | 388 | |
| 389 | 389 | unmap_single(dev, dma_addr, size, dir); |
| 390 | 390 | } |
| 391 | −EXPORT_SYMBOL(dma_unmap_page); | |
| 391 | +EXPORT_SYMBOL(__dma_unmap_page); | |
| 392 | 392 | |
| 393 | 393 | int dmabounce_sync_for_cpu(struct device *dev, dma_addr_t addr, |
| 394 | 394 | unsigned long off, size_t sz, enum dma_data_direction dir) |
| @@ -35,6 +35,9 @@ · 34 unmodified lines | ||
| 35 | 35 | |
| 36 | 36 | static DEFINE_SPINLOCK(irq_controller_lock); |
| 37 | 37 | |
| 38 | +/* Address of GIC 0 CPU interface */ | |
| 39 | +void __iomem *gic_cpu_base_addr __read_mostly; | |
| 40 | + | |
| 38 | 41 | struct gic_chip_data { |
| 39 | 42 | unsigned int irq_offset; |
| 40 | 43 | void __iomem *dist_base; |
| @@ -45,59 +48,58 @@ struct gic_chip_data { · 4 unmodified lines | ||
| 45 | 48 | #define MAX_GIC_NR 1 |
| 46 | 49 | #endif |
| 47 | 50 | |
| 48 | −static struct gic_chip_data gic_data[MAX_GIC_NR]; | |
| 51 | +static struct gic_chip_data gic_data[MAX_GIC_NR] __read_mostly; | |
| 49 | 52 | |
| 50 | −static inline void __iomem *gic_dist_base(unsigned int irq) | |
| 53 | +static inline void __iomem *gic_dist_base(struct irq_data *d) | |
| 51 | 54 | { |
| 52 | − struct gic_chip_data *gic_data = get_irq_chip_data(irq); | |
| 55 | + struct gic_chip_data *gic_data = irq_data_get_irq_chip_data(d); | |
| 53 | 56 | return gic_data->dist_base; |
| 54 | 57 | } |
| 55 | 58 | |
| 56 | −static inline void __iomem *gic_cpu_base(unsigned int irq) | |
| 59 | +static inline void __iomem *gic_cpu_base(struct irq_data *d) | |
| 57 | 60 | { |
| 58 | − struct gic_chip_data *gic_data = get_irq_chip_data(irq); | |
| 61 | + struct gic_chip_data *gic_data = irq_data_get_irq_chip_data(d); | |
| 59 | 62 | return gic_data->cpu_base; |
| 60 | 63 | } |
| 61 | 64 | |
| 62 | −static inline unsigned int gic_irq(unsigned int irq) | |
| 65 | +static inline unsigned int gic_irq(struct irq_data *d) | |
| 63 | 66 | { |
| 64 | − struct gic_chip_data *gic_data = get_irq_chip_data(irq); | |
| 65 | − return irq - gic_data->irq_offset; | |
| 67 | + struct gic_chip_data *gic_data = irq_data_get_irq_chip_data(d); | |
| 68 | + return d->irq - gic_data->irq_offset; | |
| 66 | 69 | } |
| 67 | 70 | |
| 68 | 71 | /* |
| 69 | 72 | * Routines to acknowledge, disable and enable interrupts |
| 70 | 73 | */ |
| 71 | −static void gic_ack_irq(unsigned int irq) | |
| 74 | +static void gic_ack_irq(struct irq_data *d) | |
| 72 | 75 | { |
| 73 | − | |
| 74 | 76 | spin_lock(&irq_controller_lock); |
| 75 | − writel(gic_irq(irq), gic_cpu_base(irq) + GIC_CPU_EOI); | |
| 77 | + writel(gic_irq(d), gic_cpu_base(d) + GIC_CPU_EOI); | |
| 76 | 78 | spin_unlock(&irq_controller_lock); |
| 77 | 79 | } |
| 78 | 80 | |
| 79 | −static void gic_mask_irq(unsigned int irq) | |
| 81 | +static void gic_mask_irq(struct irq_data *d) | |
| 80 | 82 | { |
| 81 | − u32 mask = 1 << (irq % 32); | |
| 83 | + u32 mask = 1 << (d->irq % 32); | |
| 82 | 84 | |
| 83 | 85 | spin_lock(&irq_controller_lock); |
| 84 | − writel(mask, gic_dist_base(irq) + GIC_DIST_ENABLE_CLEAR + (gic_irq(irq) / 32) * 4); | |
| 86 | + writel(mask, gic_dist_base(d) + GIC_DIST_ENABLE_CLEAR + (gic_irq(d) / 32) * 4); | |
| 85 | 87 | spin_unlock(&irq_controller_lock); |
| 86 | 88 | } |
| 87 | 89 | |
| 88 | −static void gic_unmask_irq(unsigned int irq) | |
| 90 | +static void gic_unmask_irq(struct irq_data *d) | |
| 89 | 91 | { |
| 90 | − u32 mask = 1 << (irq % 32); | |
| 92 | + u32 mask = 1 << (d->irq % 32); | |
| 91 | 93 | |
| 92 | 94 | spin_lock(&irq_controller_lock); |
| 93 | − writel(mask, gic_dist_base(irq) + GIC_DIST_ENABLE_SET + (gic_irq(irq) / 32) * 4); | |
| 95 | + writel(mask, gic_dist_base(d) + GIC_DIST_ENABLE_SET + (gic_irq(d) / 32) * 4); | |
| 94 | 96 | spin_unlock(&irq_controller_lock); |
| 95 | 97 | } |
| 96 | 98 | |
| 97 | −static int gic_set_type(unsigned int irq, unsigned int type) | |
| 99 | +static int gic_set_type(struct irq_data *d, unsigned int type) | |
| 98 | 100 | { |
| 99 | − void __iomem *base = gic_dist_base(irq); | |
| 100 | − unsigned int gicirq = gic_irq(irq); | |
| 101 | + void __iomem *base = gic_dist_base(d); | |
| 102 | + unsigned int gicirq = gic_irq(d); | |
| 101 | 103 | u32 enablemask = 1 << (gicirq % 32); |
| 102 | 104 | u32 enableoff = (gicirq / 32) * 4; |
| 103 | 105 | u32 confmask = 0x2 << ((gicirq % 16) * 2); |
| @@ -140,21 +142,22 @@ static int gic_set_type(unsigned int irq, unsigned int type) · 36 unmodified lines | ||
| 140 | 142 | } |
| 141 | 143 | |
| 142 | 144 | #ifdef CONFIG_SMP |
| 143 | −static int gic_set_cpu(unsigned int irq, const struct cpumask *mask_val) | |
| 145 | +static int | |
| 146 | +gic_set_cpu(struct irq_data *d, const struct cpumask *mask_val, bool force) | |
| 144 | 147 | { |
| 145 | − void __iomem *reg = gic_dist_base(irq) + GIC_DIST_TARGET + (gic_irq(irq) & ~3); | |
| 146 | − unsigned int shift = (irq % 4) * 8; | |
| 148 | + void __iomem *reg = gic_dist_base(d) + GIC_DIST_TARGET + (gic_irq(d) & ~3); | |
| 149 | + unsigned int shift = (d->irq % 4) * 8; | |
| 147 | 150 | unsigned int cpu = cpumask_first(mask_val); |
| 148 | 151 | u32 val; |
| 149 | 152 | struct irq_desc *desc; |
| 150 | 153 | |
| 151 | 154 | spin_lock(&irq_controller_lock); |
| 152 | − desc = irq_to_desc(irq); | |
| 155 | + desc = irq_to_desc(d->irq); | |
| 153 | 156 | if (desc == NULL) { |
| 154 | 157 | spin_unlock(&irq_controller_lock); |
| 155 | 158 | return -EINVAL; |
| 156 | 159 | } |
| 157 | − desc->node = cpu; | |
| 160 | + d->node = cpu; | |
| 158 | 161 | val = readl(reg) & ~(0xff << shift); |
| 159 | 162 | val |= 1 << (cpu + shift); |
| 160 | 163 | writel(val, reg); |
| @@ -172,7 +175,7 @@ static void gic_handle_cascade_irq(unsigned int irq, struct irq_desc *desc) · 11 unmodified lines | ||
| 172 | 175 | unsigned long status; |
| 173 | 176 | |
| 174 | 177 | /* primary controller ack'ing */ |
| 175 | − chip->ack(irq); | |
| 178 | + chip->irq_ack(&desc->irq_data); | |
| 176 | 179 | |
| 177 | 180 | spin_lock(&irq_controller_lock); |
| 178 | 181 | status = readl(chip_data->cpu_base + GIC_CPU_INTACK); |
| @@ -190,17 +193,17 @@ static void gic_handle_cascade_irq(unsigned int irq, struct irq_desc *desc) · 11 unmodified lines | ||
| 190 | 193 | |
| 191 | 194 | out: |
| 192 | 195 | /* primary controller unmasking */ |
| 193 | − chip->unmask(irq); | |
| 196 | + chip->irq_unmask(&desc->irq_data); | |
| 194 | 197 | } |
| 195 | 198 | |
| 196 | 199 | static struct irq_chip gic_chip = { |
| 197 | − .name = "GIC", | |
| 198 | − .ack = gic_ack_irq, | |
| 199 | − .mask = gic_mask_irq, | |
| 200 | − .unmask = gic_unmask_irq, | |
| 201 | − .set_type = gic_set_type, | |
| 200 | + .name = "GIC", | |
| 201 | + .irq_ack = gic_ack_irq, | |
| 202 | + .irq_mask = gic_mask_irq, | |
| 203 | + .irq_unmask = gic_unmask_irq, | |
| 204 | + .irq_set_type = gic_set_type, | |
| 202 | 205 | #ifdef CONFIG_SMP |
| 203 | − .set_affinity = gic_set_cpu, | |
| 206 | + .irq_set_affinity = gic_set_cpu, | |
| 204 | 207 | #endif |
| 205 | 208 | }; |
| 206 | 209 | |
| @@ -213,21 +216,16 @@ void __init gic_cascade_irq(unsigned int gic_nr, unsigned int irq) · 6 unmodified lines | ||
| 213 | 216 | set_irq_chained_handler(irq, gic_handle_cascade_irq); |
| 214 | 217 | } |
| 215 | 218 | |
| 216 | −void __init gic_dist_init(unsigned int gic_nr, void __iomem *base, | |
| 217 | − unsigned int irq_start) | |
| 219 | +static void __init gic_dist_init(struct gic_chip_data *gic, | |
| 220 | + unsigned int irq_start) | |
| 218 | 221 | { |
| 219 | 222 | unsigned int gic_irqs, irq_limit, i; |
| 223 | + void __iomem *base = gic->dist_base; | |
| 220 | 224 | u32 cpumask = 1 << smp_processor_id(); |
| 221 | 225 | |
| 222 | − if (gic_nr >= MAX_GIC_NR) | |
| 223 | − BUG(); | |
| 224 | − | |
| 225 | 226 | cpumask |= cpumask << 8; |
| 226 | 227 | cpumask |= cpumask << 16; |
| 227 | 228 | |
| 228 | − gic_data[gic_nr].dist_base = base; | |
| 229 | − gic_data[gic_nr].irq_offset = (irq_start - 1) & ~31; | |
| 230 | − | |
| 231 | 229 | writel(0, base + GIC_DIST_CTRL); |
| 232 | 230 | |
| 233 | 231 | /* |
| @@ -267,7 +265,7 @@ void __init gic_dist_init(unsigned int gic_nr, void __iomem *base, · 33 unmodified lines | ||
| 267 | 265 | /* |
| 268 | 266 | * Limit number of interrupts registered to the platform maximum |
| 269 | 267 | */ |
| 270 | − irq_limit = gic_data[gic_nr].irq_offset + gic_irqs; | |
| 268 | + irq_limit = gic->irq_offset + gic_irqs; | |
| 271 | 269 | if (WARN_ON(irq_limit > NR_IRQS)) |
| 272 | 270 | irq_limit = NR_IRQS; |
| 273 | 271 | |
| @@ -276,7 +274,7 @@ void __init gic_dist_init(unsigned int gic_nr, void __iomem *base, · 2 unmodified lines | ||
| 276 | 274 | */ |
| 277 | 275 | for (i = irq_start; i < irq_limit; i++) { |
| 278 | 276 | set_irq_chip(i, &gic_chip); |
| 279 | − set_irq_chip_data(i, &gic_data[gic_nr]); | |
| 277 | + set_irq_chip_data(i, gic); | |
| 280 | 278 | set_irq_handler(i, handle_level_irq); |
| 281 | 279 | set_irq_flags(i, IRQF_VALID | IRQF_PROBE); |
| 282 | 280 | } |
| @@ -284,19 +282,12 @@ void __init gic_dist_init(unsigned int gic_nr, void __iomem *base, · 1 unmodified line | ||
| 284 | 282 | writel(1, base + GIC_DIST_CTRL); |
| 285 | 283 | } |
| 286 | 284 | |
| 287 | −void __cpuinit gic_cpu_init(unsigned int gic_nr, void __iomem *base) | |
| 285 | +static void __cpuinit gic_cpu_init(struct gic_chip_data *gic) | |
| 288 | 286 | { |
| 289 | − void __iomem *dist_base; | |
| 287 | + void __iomem *dist_base = gic->dist_base; | |
| 288 | + void __iomem *base = gic->cpu_base; | |
| 290 | 289 | int i; |
| 291 | 290 | |
| 292 | − if (gic_nr >= MAX_GIC_NR) | |
| 293 | − BUG(); | |
| 294 | − | |
| 295 | − dist_base = gic_data[gic_nr].dist_base; | |
| 296 | − BUG_ON(!dist_base); | |
| 297 | − | |
| 298 | − gic_data[gic_nr].cpu_base = base; | |
| 299 | − | |
| 300 | 291 | /* |
| 301 | 292 | * Deal with the banked PPI and SGI interrupts - disable all |
| 302 | 293 | * PPI interrupts, ensure all SGI interrupts are enabled. |
| @@ -314,6 +305,42 @@ void __cpuinit gic_cpu_init(unsigned int gic_nr, void __iomem *base) · 11 unmodified lines | ||
| 314 | 305 | writel(1, base + GIC_CPU_CTRL); |
| 315 | 306 | } |
| 316 | 307 | |
| 308 | +void __init gic_init(unsigned int gic_nr, unsigned int irq_start, | |
| 309 | + void __iomem *dist_base, void __iomem *cpu_base) | |
| 310 | +{ | |
| 311 | + struct gic_chip_data *gic; | |
| 312 | + | |
| 313 | + BUG_ON(gic_nr >= MAX_GIC_NR); | |
| 314 | + | |
| 315 | + gic = &gic_data[gic_nr]; | |
| 316 | + gic->dist_base = dist_base; | |
| 317 | + gic->cpu_base = cpu_base; | |
| 318 | + gic->irq_offset = (irq_start - 1) & ~31; | |
| 319 | + | |
| 320 | + if (gic_nr == 0) | |
| 321 | + gic_cpu_base_addr = cpu_base; | |
| 322 | + | |
| 323 | + gic_dist_init(gic, irq_start); | |
| 324 | + gic_cpu_init(gic); | |
| 325 | +} | |
| 326 | + | |
| 327 | +void __cpuinit gic_secondary_init(unsigned int gic_nr) | |
| 328 | +{ | |
| 329 | + BUG_ON(gic_nr >= MAX_GIC_NR); | |
| 330 | + | |
| 331 | + gic_cpu_init(&gic_data[gic_nr]); | |
| 332 | +} | |
| 333 | + | |
| 334 | +void __cpuinit gic_enable_ppi(unsigned int irq) | |
| 335 | +{ | |
| 336 | + unsigned long flags; | |
| 337 | + | |
| 338 | + local_irq_save(flags); | |
| 339 | + irq_to_desc(irq)->status |= IRQ_NOPROBE; | |
| 340 | + gic_unmask_irq(irq_get_irq_data(irq)); | |
| 341 | + local_irq_restore(flags); | |
| 342 | +} | |
| 343 | + | |
| 317 | 344 | #ifdef CONFIG_SMP |
| 318 | 345 | void gic_raise_softirq(const struct cpumask *mask, unsigned int irq) |
| 319 | 346 | { |
| @@ -31,8 +31,10 @@ · 30 unmodified lines | ||
| 31 | 31 | |
| 32 | 32 | #define MAX_SLOTS 21 |
| 33 | 33 | |
| 34 | −static void it8152_mask_irq(unsigned int irq) | |
| 34 | +static void it8152_mask_irq(struct irq_data *d) | |
| 35 | 35 | { |
| 36 | + unsigned int irq = d->irq; | |
| 37 | + | |
| 36 | 38 | if (irq >= IT8152_LD_IRQ(0)) { |
| 37 | 39 | __raw_writel((__raw_readl(IT8152_INTC_LDCNIMR) | |
| 38 | 40 | (1 << (irq - IT8152_LD_IRQ(0)))), |
| @@ -48,8 +50,10 @@ static void it8152_mask_irq(unsigned int irq) · 9 unmodified lines | ||
| 48 | 50 | } |
| 49 | 51 | } |
| 50 | 52 | |
| 51 | −static void it8152_unmask_irq(unsigned int irq) | |
| 53 | +static void it8152_unmask_irq(struct irq_data *d) | |
| 52 | 54 | { |
| 55 | + unsigned int irq = d->irq; | |
| 56 | + | |
| 53 | 57 | if (irq >= IT8152_LD_IRQ(0)) { |
| 54 | 58 | __raw_writel((__raw_readl(IT8152_INTC_LDCNIMR) & |
| 55 | 59 | ~(1 << (irq - IT8152_LD_IRQ(0)))), |
| @@ -67,9 +71,9 @@ static void it8152_unmask_irq(unsigned int irq) · 11 unmodified lines | ||
| 67 | 71 | |
| 68 | 72 | static struct irq_chip it8152_irq_chip = { |
| 69 | 73 | .name = "it8152", |
| 70 | − .ack = it8152_mask_irq, | |
| 71 | − .mask = it8152_mask_irq, | |
| 72 | − .unmask = it8152_unmask_irq, | |
| 74 | + .irq_ack = it8152_mask_irq, | |
| 75 | + .irq_mask = it8152_mask_irq, | |
| 76 | + .irq_unmask = it8152_unmask_irq, | |
| 73 | 77 | }; |
| 74 | 78 | |
| 75 | 79 | void it8152_init_irq(void) |
| @@ -236,7 +240,7 @@ static struct resource it8152_mem = { · 160 unmodified lines | ||
| 236 | 240 | |
| 237 | 241 | /* |
| 238 | 242 | * The following functions are needed for DMA bouncing. |
| 239 | − * ITE8152 chip can addrees up to 64MByte, so all the devices | |
| 243 | + * ITE8152 chip can address up to 64MByte, so all the devices | |
| 240 | 244 | * connected to ITE8152 (PCI and USB) should have limited DMA window |
| 241 | 245 | */ |
| 242 | 246 | |
| @@ -144,7 +144,7 @@ static void locomo_handler(unsigned int irq, struct irq_desc *desc) · 143 unmodified lines | ||
| 144 | 144 | int req, i; |
| 145 | 145 | |
| 146 | 146 | /* Acknowledge the parent IRQ */ |
| 147 | − desc->chip->ack(irq); | |
| 147 | + desc->irq_data.chip->irq_ack(&desc->irq_data); | |
| 148 | 148 | |
| 149 | 149 | /* check why this interrupt was generated */ |
| 150 | 150 | req = locomo_readl(lchip->base + LOCOMO_ICR) & 0x0f00; |
| @@ -161,33 +161,33 @@ static void locomo_handler(unsigned int irq, struct irq_desc *desc) · 10 unmodified lines | ||
| 161 | 161 | } |
| 162 | 162 | } |
| 163 | 163 | |
| 164 | −static void locomo_ack_irq(unsigned int irq) | |
| 164 | +static void locomo_ack_irq(struct irq_data *d) | |
| 165 | 165 | { |
| 166 | 166 | } |
| 167 | 167 | |
| 168 | −static void locomo_mask_irq(unsigned int irq) | |
| 168 | +static void locomo_mask_irq(struct irq_data *d) | |
| 169 | 169 | { |
| 170 | − struct locomo *lchip = get_irq_chip_data(irq); | |
| 170 | + struct locomo *lchip = irq_data_get_irq_chip_data(d); | |
| 171 | 171 | unsigned int r; |
| 172 | 172 | r = locomo_readl(lchip->base + LOCOMO_ICR); |
| 173 | − r &= ~(0x0010 << (irq - lchip->irq_base)); | |
| 173 | + r &= ~(0x0010 << (d->irq - lchip->irq_base)); | |
| 174 | 174 | locomo_writel(r, lchip->base + LOCOMO_ICR); |
| 175 | 175 | } |
| 176 | 176 | |
| 177 | −static void locomo_unmask_irq(unsigned int irq) | |
| 177 | +static void locomo_unmask_irq(struct irq_data *d) | |
| 178 | 178 | { |
| 179 | − struct locomo *lchip = get_irq_chip_data(irq); | |
| 179 | + struct locomo *lchip = irq_data_get_irq_chip_data(d); | |
| 180 | 180 | unsigned int r; |
| 181 | 181 | r = locomo_readl(lchip->base + LOCOMO_ICR); |
| 182 | − r |= (0x0010 << (irq - lchip->irq_base)); | |
| 182 | + r |= (0x0010 << (d->irq - lchip->irq_base)); | |
| 183 | 183 | locomo_writel(r, lchip->base + LOCOMO_ICR); |
| 184 | 184 | } |
| 185 | 185 | |
| 186 | 186 | static struct irq_chip locomo_chip = { |
| 187 | − .name = "LOCOMO", | |
| 188 | − .ack = locomo_ack_irq, | |
| 189 | − .mask = locomo_mask_irq, | |
| 190 | − .unmask = locomo_unmask_irq, | |
| 187 | + .name = "LOCOMO", | |
| 188 | + .irq_ack = locomo_ack_irq, | |
| 189 | + .irq_mask = locomo_mask_irq, | |
| 190 | + .irq_unmask = locomo_unmask_irq, | |
| 191 | 191 | }; |
| 192 | 192 | |
| 193 | 193 | static void locomo_setup_irq(struct locomo *lchip) |
| @@ -210,7 +210,7 @@ sa1111_irq_handler(unsigned int irq, struct irq_desc *desc) · 209 unmodified lines | ||
| 210 | 210 | |
| 211 | 211 | sa1111_writel(stat0, mapbase + SA1111_INTSTATCLR0); |
| 212 | 212 | |
| 213 | − desc->chip->ack(irq); | |
| 213 | + desc->irq_data.chip->irq_ack(&desc->irq_data); | |
| 214 | 214 | |
| 215 | 215 | sa1111_writel(stat1, mapbase + SA1111_INTSTATCLR1); |
| 216 | 216 | |
| @@ -228,35 +228,35 @@ sa1111_irq_handler(unsigned int irq, struct irq_desc *desc) · 11 unmodified lines | ||
| 228 | 228 | generic_handle_irq(i + sachip->irq_base); |
| 229 | 229 | |
| 230 | 230 | /* For level-based interrupts */ |
| 231 | − desc->chip->unmask(irq); | |
| 231 | + desc->irq_data.chip->irq_unmask(&desc->irq_data); | |
| 232 | 232 | } |
| 233 | 233 | |
| 234 | 234 | #define SA1111_IRQMASK_LO(x) (1 << (x - sachip->irq_base)) |
| 235 | 235 | #define SA1111_IRQMASK_HI(x) (1 << (x - sachip->irq_base - 32)) |
| 236 | 236 | |
| 237 | −static void sa1111_ack_irq(unsigned int irq) | |
| 237 | +static void sa1111_ack_irq(struct irq_data *d) | |
| 238 | 238 | { |
| 239 | 239 | } |
| 240 | 240 | |
| 241 | −static void sa1111_mask_lowirq(unsigned int irq) | |
| 241 | +static void sa1111_mask_lowirq(struct irq_data *d) | |
| 242 | 242 | { |
| 243 | − struct sa1111 *sachip = get_irq_chip_data(irq); | |
| 243 | + struct sa1111 *sachip = irq_data_get_irq_chip_data(d); | |
| 244 | 244 | void __iomem *mapbase = sachip->base + SA1111_INTC; |
| 245 | 245 | unsigned long ie0; |
| 246 | 246 | |
| 247 | 247 | ie0 = sa1111_readl(mapbase + SA1111_INTEN0); |
| 248 | − ie0 &= ~SA1111_IRQMASK_LO(irq); | |
| 248 | + ie0 &= ~SA1111_IRQMASK_LO(d->irq); | |
| 249 | 249 | writel(ie0, mapbase + SA1111_INTEN0); |
| 250 | 250 | } |
| 251 | 251 | |
| 252 | −static void sa1111_unmask_lowirq(unsigned int irq) | |
| 252 | +static void sa1111_unmask_lowirq(struct irq_data *d) | |
| 253 | 253 | { |
| 254 | − struct sa1111 *sachip = get_irq_chip_data(irq); | |
| 254 | + struct sa1111 *sachip = irq_data_get_irq_chip_data(d); | |
| 255 | 255 | void __iomem *mapbase = sachip->base + SA1111_INTC; |
| 256 | 256 | unsigned long ie0; |
| 257 | 257 | |
| 258 | 258 | ie0 = sa1111_readl(mapbase + SA1111_INTEN0); |
| 259 | − ie0 |= SA1111_IRQMASK_LO(irq); | |
| 259 | + ie0 |= SA1111_IRQMASK_LO(d->irq); | |
| 260 | 260 | sa1111_writel(ie0, mapbase + SA1111_INTEN0); |
| 261 | 261 | } |
| 262 | 262 | |
| @@ -267,11 +267,11 @@ static void sa1111_unmask_lowirq(unsigned int irq) · 4 unmodified lines | ||
| 267 | 267 | * be triggered. In fact, its very difficult, if not impossible to get |
| 268 | 268 | * INTSET to re-trigger the interrupt. |
| 269 | 269 | */ |
| 270 | −static int sa1111_retrigger_lowirq(unsigned int irq) | |
| 270 | +static int sa1111_retrigger_lowirq(struct irq_data *d) | |
| 271 | 271 | { |
| 272 | − struct sa1111 *sachip = get_irq_chip_data(irq); | |
| 272 | + struct sa1111 *sachip = irq_data_get_irq_chip_data(d); | |
| 273 | 273 | void __iomem *mapbase = sachip->base + SA1111_INTC; |
| 274 | − unsigned int mask = SA1111_IRQMASK_LO(irq); | |
| 274 | + unsigned int mask = SA1111_IRQMASK_LO(d->irq); | |
| 275 | 275 | unsigned long ip0; |
| 276 | 276 | int i; |
| 277 | 277 | |
| @@ -279,21 +279,21 @@ static int sa1111_retrigger_lowirq(unsigned int irq) · 1 unmodified line | ||
| 279 | 279 | for (i = 0; i < 8; i++) { |
| 280 | 280 | sa1111_writel(ip0 ^ mask, mapbase + SA1111_INTPOL0); |
| 281 | 281 | sa1111_writel(ip0, mapbase + SA1111_INTPOL0); |
| 282 | − if (sa1111_readl(mapbase + SA1111_INTSTATCLR1) & mask) | |
| 282 | + if (sa1111_readl(mapbase + SA1111_INTSTATCLR0) & mask) | |
| 283 | 283 | break; |
| 284 | 284 | } |
| 285 | 285 | |
| 286 | 286 | if (i == 8) |
| 287 | 287 | printk(KERN_ERR "Danger Will Robinson: failed to " |
| 288 | − "re-trigger IRQ%d\n", irq); | |
| 288 | + "re-trigger IRQ%d\n", d->irq); | |
| 289 | 289 | return i == 8 ? -1 : 0; |
| 290 | 290 | } |
| 291 | 291 | |
| 292 | −static int sa1111_type_lowirq(unsigned int irq, unsigned int flags) | |
| 292 | +static int sa1111_type_lowirq(struct irq_data *d, unsigned int flags) | |
| 293 | 293 | { |
| 294 | − struct sa1111 *sachip = get_irq_chip_data(irq); | |
| 294 | + struct sa1111 *sachip = irq_data_get_irq_chip_data(d); | |
| 295 | 295 | void __iomem *mapbase = sachip->base + SA1111_INTC; |
| 296 | − unsigned int mask = SA1111_IRQMASK_LO(irq); | |
| 296 | + unsigned int mask = SA1111_IRQMASK_LO(d->irq); | |
| 297 | 297 | unsigned long ip0; |
| 298 | 298 | |
| 299 | 299 | if (flags == IRQ_TYPE_PROBE) |
| @@ -313,11 +313,11 @@ static int sa1111_type_lowirq(unsigned int irq, unsigned int flags) · 13 unmodified lines | ||
| 313 | 313 | return 0; |
| 314 | 314 | } |
| 315 | 315 | |
| 316 | −static int sa1111_wake_lowirq(unsigned int irq, unsigned int on) | |
| 316 | +static int sa1111_wake_lowirq(struct irq_data *d, unsigned int on) | |
| 317 | 317 | { |
| 318 | − struct sa1111 *sachip = get_irq_chip_data(irq); | |
| 318 | + struct sa1111 *sachip = irq_data_get_irq_chip_data(d); | |
| 319 | 319 | void __iomem *mapbase = sachip->base + SA1111_INTC; |
| 320 | − unsigned int mask = SA1111_IRQMASK_LO(irq); | |
| 320 | + unsigned int mask = SA1111_IRQMASK_LO(d->irq); | |
| 321 | 321 | unsigned long we0; |
| 322 | 322 | |
| 323 | 323 | we0 = sa1111_readl(mapbase + SA1111_WAKEEN0); |
| @@ -332,33 +332,33 @@ static int sa1111_wake_lowirq(unsigned int irq, unsigned int on) · 8 unmodified lines | ||
| 332 | 332 | |
| 333 | 333 | static struct irq_chip sa1111_low_chip = { |
| 334 | 334 | .name = "SA1111-l", |
| 335 | − .ack = sa1111_ack_irq, | |
| 336 | − .mask = sa1111_mask_lowirq, | |
| 337 | − .unmask = sa1111_unmask_lowirq, | |
| 338 | − .retrigger = sa1111_retrigger_lowirq, | |
| 339 | − .set_type = sa1111_type_lowirq, | |
| 340 | − .set_wake = sa1111_wake_lowirq, | |
| 335 | + .irq_ack = sa1111_ack_irq, | |
| 336 | + .irq_mask = sa1111_mask_lowirq, | |
| 337 | + .irq_unmask = sa1111_unmask_lowirq, | |
| 338 | + .irq_retrigger = sa1111_retrigger_lowirq, | |
| 339 | + .irq_set_type = sa1111_type_lowirq, | |
| 340 | + .irq_set_wake = sa1111_wake_lowirq, | |
| 341 | 341 | }; |
| 342 | 342 | |
| 343 | −static void sa1111_mask_highirq(unsigned int irq) | |
| 343 | +static void sa1111_mask_highirq(struct irq_data *d) | |
| 344 | 344 | { |
| 345 | − struct sa1111 *sachip = get_irq_chip_data(irq); | |
| 345 | + struct sa1111 *sachip = irq_data_get_irq_chip_data(d); | |
| 346 | 346 | void __iomem *mapbase = sachip->base + SA1111_INTC; |
| 347 | 347 | unsigned long ie1; |
| 348 | 348 | |
| 349 | 349 | ie1 = sa1111_readl(mapbase + SA1111_INTEN1); |
| 350 | − ie1 &= ~SA1111_IRQMASK_HI(irq); | |
| 350 | + ie1 &= ~SA1111_IRQMASK_HI(d->irq); | |
| 351 | 351 | sa1111_writel(ie1, mapbase + SA1111_INTEN1); |
| 352 | 352 | } |
| 353 | 353 | |
| 354 | −static void sa1111_unmask_highirq(unsigned int irq) | |
| 354 | +static void sa1111_unmask_highirq(struct irq_data *d) | |
| 355 | 355 | { |
| 356 | − struct sa1111 *sachip = get_irq_chip_data(irq); | |
| 356 | + struct sa1111 *sachip = irq_data_get_irq_chip_data(d); | |
| 357 | 357 | void __iomem *mapbase = sachip->base + SA1111_INTC; |
| 358 | 358 | unsigned long ie1; |
| 359 | 359 | |
| 360 | 360 | ie1 = sa1111_readl(mapbase + SA1111_INTEN1); |
| 361 | − ie1 |= SA1111_IRQMASK_HI(irq); | |
| 361 | + ie1 |= SA1111_IRQMASK_HI(d->irq); | |
| 362 | 362 | sa1111_writel(ie1, mapbase + SA1111_INTEN1); |
| 363 | 363 | } |
| 364 | 364 | |
| @@ -369,11 +369,11 @@ static void sa1111_unmask_highirq(unsigned int irq) · 4 unmodified lines | ||
| 369 | 369 | * be triggered. In fact, its very difficult, if not impossible to get |
| 370 | 370 | * INTSET to re-trigger the interrupt. |
| 371 | 371 | */ |
| 372 | −static int sa1111_retrigger_highirq(unsigned int irq) | |
| 372 | +static int sa1111_retrigger_highirq(struct irq_data *d) | |
| 373 | 373 | { |
| 374 | − struct sa1111 *sachip = get_irq_chip_data(irq); | |
| 374 | + struct sa1111 *sachip = irq_data_get_irq_chip_data(d); | |
| 375 | 375 | void __iomem *mapbase = sachip->base + SA1111_INTC; |
| 376 | − unsigned int mask = SA1111_IRQMASK_HI(irq); | |
| 376 | + unsigned int mask = SA1111_IRQMASK_HI(d->irq); | |
| 377 | 377 | unsigned long ip1; |
| 378 | 378 | int i; |
| 379 | 379 | |
| @@ -387,15 +387,15 @@ static int sa1111_retrigger_highirq(unsigned int irq) · 7 unmodified lines | ||
| 387 | 387 | |
| 388 | 388 | if (i == 8) |
| 389 | 389 | printk(KERN_ERR "Danger Will Robinson: failed to " |
| 390 | − "re-trigger IRQ%d\n", irq); | |
| 390 | + "re-trigger IRQ%d\n", d->irq); | |
| 391 | 391 | return i == 8 ? -1 : 0; |
| 392 | 392 | } |
| 393 | 393 | |
| 394 | −static int sa1111_type_highirq(unsigned int irq, unsigned int flags) | |
| 394 | +static int sa1111_type_highirq(struct irq_data *d, unsigned int flags) | |
| 395 | 395 | { |
| 396 | − struct sa1111 *sachip = get_irq_chip_data(irq); | |
| 396 | + struct sa1111 *sachip = irq_data_get_irq_chip_data(d); | |
| 397 | 397 | void __iomem *mapbase = sachip->base + SA1111_INTC; |
| 398 | − unsigned int mask = SA1111_IRQMASK_HI(irq); | |
| 398 | + unsigned int mask = SA1111_IRQMASK_HI(d->irq); | |
| 399 | 399 | unsigned long ip1; |
| 400 | 400 | |
| 401 | 401 | if (flags == IRQ_TYPE_PROBE) |
| @@ -415,11 +415,11 @@ static int sa1111_type_highirq(unsigned int irq, unsigned int flags) · 13 unmodified lines | ||
| 415 | 415 | return 0; |
| 416 | 416 | } |
| 417 | 417 | |
| 418 | −static int sa1111_wake_highirq(unsigned int irq, unsigned int on) | |
| 418 | +static int sa1111_wake_highirq(struct irq_data *d, unsigned int on) | |
| 419 | 419 | { |
| 420 | − struct sa1111 *sachip = get_irq_chip_data(irq); | |
| 420 | + struct sa1111 *sachip = irq_data_get_irq_chip_data(d); | |
| 421 | 421 | void __iomem *mapbase = sachip->base + SA1111_INTC; |
| 422 | − unsigned int mask = SA1111_IRQMASK_HI(irq); | |
| 422 | + unsigned int mask = SA1111_IRQMASK_HI(d->irq); | |
| 423 | 423 | unsigned long we1; |
| 424 | 424 | |
| 425 | 425 | we1 = sa1111_readl(mapbase + SA1111_WAKEEN1); |
| @@ -434,12 +434,12 @@ static int sa1111_wake_highirq(unsigned int irq, unsigned int on) · 8 unmodified lines | ||
| 434 | 434 | |
| 435 | 435 | static struct irq_chip sa1111_high_chip = { |
| 436 | 436 | .name = "SA1111-h", |
| 437 | − .ack = sa1111_ack_irq, | |
| 438 | − .mask = sa1111_mask_highirq, | |
| 439 | − .unmask = sa1111_unmask_highirq, | |
| 440 | − .retrigger = sa1111_retrigger_highirq, | |
| 441 | − .set_type = sa1111_type_highirq, | |
| 442 | − .set_wake = sa1111_wake_highirq, | |
| 437 | + .irq_ack = sa1111_ack_irq, | |
| 438 | + .irq_mask = sa1111_mask_highirq, | |
| 439 | + .irq_unmask = sa1111_unmask_highirq, | |
| 440 | + .irq_retrigger = sa1111_retrigger_highirq, | |
| 441 | + .irq_set_type = sa1111_type_highirq, | |
| 442 | + .irq_set_wake = sa1111_wake_highirq, | |
| 443 | 443 | }; |
| 444 | 444 | |
| 445 | 445 | static void sa1111_setup_irq(struct sa1111 *sachip) |
| @@ -1,5 +1,5 @@ | ||
| 1 | 1 | /* |
| 2 | − * linux/arch/arm/plat-versatile/timer-sp.c | |
| 2 | + * linux/arch/arm/common/timer-sp.c | |
| 3 | 3 | * |
| 4 | 4 | * Copyright (C) 1999 - 2003 ARM Limited |
| 5 | 5 | * Copyright (C) 2000 Deep Blue Solutions Ltd |
| @@ -26,8 +26,6 @@ · 20 unmodified lines | ||
| 26 | 26 | |
| 27 | 27 | #include <asm/hardware/arm_timer.h> |
| 28 | 28 | |
| 29 | −#include <plat/timer-sp.h> | |
| 30 | − | |
| 31 | 29 | /* |
| 32 | 30 | * These timers are currently always setup to be clocked at 1MHz. |
| 33 | 31 | */ |
| @@ -46,7 +44,6 @@ static struct clocksource clocksource_sp804 = { · 12 unmodified lines | ||
| 46 | 44 | .rating = 200, |
| 47 | 45 | .read = sp804_read, |
| 48 | 46 | .mask = CLOCKSOURCE_MASK(32), |
| 49 | − .shift = 20, | |
| 50 | 47 | .flags = CLOCK_SOURCE_IS_CONTINUOUS, |
| 51 | 48 | }; |
| 52 | 49 | |
| @@ -63,8 +60,7 @@ void __init sp804_clocksource_init(void __iomem *base) · 10 unmodified lines | ||
| 63 | 60 | writel(TIMER_CTRL_32BIT | TIMER_CTRL_ENABLE | TIMER_CTRL_PERIODIC, |
| 64 | 61 | clksrc_base + TIMER_CTRL); |
| 65 | 62 | |
| 66 | − cs->mult = clocksource_khz2mult(TIMER_FREQ_KHZ, cs->shift); | |
| 67 | − clocksource_register(cs); | |
| 63 | + clocksource_register_khz(cs, TIMER_FREQ_KHZ); | |
| 68 | 64 | } |
| 69 | 65 | |
| 70 | 66 | |
| @@ -70,7 +70,7 @@ static inline struct vic_device *to_vic(struct sys_device *sys) · 69 unmodified lines | ||
| 70 | 70 | * vic_init2 - common initialisation code |
| 71 | 71 | * @base: Base of the VIC. |
| 72 | 72 | * |
| 73 | − * Common initialisation code for registeration | |
| 73 | + * Common initialisation code for registration | |
| 74 | 74 | * and resume. |
| 75 | 75 | */ |
| 76 | 76 | static void vic_init2(void __iomem *base) |
| @@ -204,26 +204,26 @@ static void __init vic_pm_register(void __iomem *base, unsigned int irq, u32 res · 127 unmodified lines | ||
| 204 | 204 | static inline void vic_pm_register(void __iomem *base, unsigned int irq, u32 arg1) { } |
| 205 | 205 | #endif /* CONFIG_PM */ |
| 206 | 206 | |
| 207 | −static void vic_ack_irq(unsigned int irq) | |
| 207 | +static void vic_ack_irq(struct irq_data *d) | |
| 208 | 208 | { |
| 209 | − void __iomem *base = get_irq_chip_data(irq); | |
| 210 | − irq &= 31; | |
| 209 | + void __iomem *base = irq_data_get_irq_chip_data(d); | |
| 210 | + unsigned int irq = d->irq & 31; | |
| 211 | 211 | writel(1 << irq, base + VIC_INT_ENABLE_CLEAR); |
| 212 | 212 | /* moreover, clear the soft-triggered, in case it was the reason */ |
| 213 | 213 | writel(1 << irq, base + VIC_INT_SOFT_CLEAR); |
| 214 | 214 | } |
| 215 | 215 | |
| 216 | −static void vic_mask_irq(unsigned int irq) | |
| 216 | +static void vic_mask_irq(struct irq_data *d) | |
| 217 | 217 | { |
| 218 | − void __iomem *base = get_irq_chip_data(irq); | |
| 219 | − irq &= 31; | |
| 218 | + void __iomem *base = irq_data_get_irq_chip_data(d); | |
| 219 | + unsigned int irq = d->irq & 31; | |
| 220 | 220 | writel(1 << irq, base + VIC_INT_ENABLE_CLEAR); |
| 221 | 221 | } |
| 222 | 222 | |
| 223 | −static void vic_unmask_irq(unsigned int irq) | |
| 223 | +static void vic_unmask_irq(struct irq_data *d) | |
| 224 | 224 | { |
| 225 | − void __iomem *base = get_irq_chip_data(irq); | |
| 226 | − irq &= 31; | |
| 225 | + void __iomem *base = irq_data_get_irq_chip_data(d); | |
| 226 | + unsigned int irq = d->irq & 31; | |
| 227 | 227 | writel(1 << irq, base + VIC_INT_ENABLE); |
| 228 | 228 | } |
| 229 | 229 | |
| @@ -242,10 +242,10 @@ static struct vic_device *vic_from_irq(unsigned int irq) · 12 unmodified lines | ||
| 242 | 242 | return NULL; |
| 243 | 243 | } |
| 244 | 244 | |
| 245 | −static int vic_set_wake(unsigned int irq, unsigned int on) | |
| 245 | +static int vic_set_wake(struct irq_data *d, unsigned int on) | |
| 246 | 246 | { |
| 247 | − struct vic_device *v = vic_from_irq(irq); | |
| 248 | − unsigned int off = irq & 31; | |
| 247 | + struct vic_device *v = vic_from_irq(d->irq); | |
| 248 | + unsigned int off = d->irq & 31; | |
| 249 | 249 | u32 bit = 1 << off; |
| 250 | 250 | |
| 251 | 251 | if (!v) |
| @@ -267,10 +267,10 @@ static int vic_set_wake(unsigned int irq, unsigned int on) · 15 unmodified lines | ||
| 267 | 267 | |
| 268 | 268 | static struct irq_chip vic_chip = { |
| 269 | 269 | .name = "VIC", |
| 270 | − .ack = vic_ack_irq, | |
| 271 | − .mask = vic_mask_irq, | |
| 272 | − .unmask = vic_unmask_irq, | |
| 273 | − .set_wake = vic_set_wake, | |
| 270 | + .irq_ack = vic_ack_irq, | |
| 271 | + .irq_mask = vic_mask_irq, | |
| 272 | + .irq_unmask = vic_unmask_irq, | |
| 273 | + .irq_set_wake = vic_set_wake, | |
| 274 | 274 | }; |
| 275 | 275 | |
| 276 | 276 | static void __init vic_disable(void __iomem *base) |
| @@ -0,0 +1,83 @@ | ||
| 1 | +CONFIG_EXPERIMENTAL=y | |
| 2 | +CONFIG_SYSVIPC=y | |
| 3 | +CONFIG_IKCONFIG=y | |
| 4 | +CONFIG_IKCONFIG_PROC=y | |
| 5 | +CONFIG_LOG_BUF_SHIFT=16 | |
| 6 | +CONFIG_NAMESPACES=y | |
| 7 | +# CONFIG_UTS_NS is not set | |
| 8 | +# CONFIG_IPC_NS is not set | |
| 9 | +# CONFIG_USER_NS is not set | |
| 10 | +# CONFIG_PID_NS is not set | |
| 11 | +CONFIG_BLK_DEV_INITRD=y | |
| 12 | +CONFIG_INITRAMFS_SOURCE="" | |
| 13 | +CONFIG_EXPERT=y | |
| 14 | +CONFIG_SLAB=y | |
| 15 | +# CONFIG_BLK_DEV_BSG is not set | |
| 16 | +# CONFIG_IOSCHED_DEADLINE is not set | |
| 17 | +# CONFIG_IOSCHED_CFQ is not set | |
| 18 | +CONFIG_ARCH_SHMOBILE=y | |
| 19 | +CONFIG_ARCH_SH73A0=y | |
| 20 | +CONFIG_MACH_AG5EVM=y | |
| 21 | +CONFIG_MEMORY_SIZE=0x10000000 | |
| 22 | +CONFIG_CPU_BPREDICT_DISABLE=y | |
| 23 | +CONFIG_ARM_ERRATA_430973=y | |
| 24 | +CONFIG_ARM_ERRATA_458693=y | |
| 25 | +CONFIG_NO_HZ=y | |
| 26 | +CONFIG_AEABI=y | |
| 27 | +# CONFIG_OABI_COMPAT is not set | |
| 28 | +CONFIG_HIGHMEM=y | |
| 29 | +CONFIG_ZBOOT_ROM_TEXT=0x0 | |
| 30 | +CONFIG_ZBOOT_ROM_BSS=0x0 | |
| 31 | +CONFIG_CMDLINE="console=tty0 console=ttySC2,115200 earlyprintk=sh-sci.2,115200 ignore_loglevel" | |
| 32 | +CONFIG_CMDLINE_FORCE=y | |
| 33 | +CONFIG_KEXEC=y | |
| 34 | +# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set | |
| 35 | +CONFIG_PM=y | |
| 36 | +# CONFIG_SUSPEND is not set | |
| 37 | +CONFIG_PM_RUNTIME=y | |
| 38 | +CONFIG_NET=y | |
| 39 | +CONFIG_PACKET=y | |
| 40 | +CONFIG_UNIX=y | |
| 41 | +CONFIG_INET=y | |
| 42 | +# CONFIG_INET_XFRM_MODE_TRANSPORT is not set | |
| 43 | +# CONFIG_INET_XFRM_MODE_TUNNEL is not set | |
| 44 | +# CONFIG_INET_XFRM_MODE_BEET is not set | |
| 45 | +# CONFIG_INET_LRO is not set | |
| 46 | +# CONFIG_INET_DIAG is not set | |
| 47 | +# CONFIG_IPV6 is not set | |
| 48 | +# CONFIG_WIRELESS is not set | |
| 49 | +CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | |
| 50 | +# CONFIG_BLK_DEV is not set | |
| 51 | +CONFIG_NETDEVICES=y | |
| 52 | +CONFIG_NET_ETHERNET=y | |
| 53 | +CONFIG_SMSC911X=y | |
| 54 | +# CONFIG_NETDEV_1000 is not set | |
| 55 | +# CONFIG_NETDEV_10000 is not set | |
| 56 | +# CONFIG_WLAN is not set | |
| 57 | +CONFIG_INPUT_SPARSEKMAP=y | |
| 58 | +# CONFIG_INPUT_MOUSEDEV_PSAUX is not set | |
| 59 | +CONFIG_INPUT_EVDEV=y | |
| 60 | +# CONFIG_INPUT_KEYBOARD is not set | |
| 61 | +# CONFIG_INPUT_MOUSE is not set | |
| 62 | +CONFIG_SERIAL_SH_SCI=y | |
| 63 | +CONFIG_SERIAL_SH_SCI_NR_UARTS=9 | |
| 64 | +CONFIG_SERIAL_SH_SCI_CONSOLE=y | |
| 65 | +# CONFIG_LEGACY_PTYS is not set | |
| 66 | +# CONFIG_HW_RANDOM is not set | |
| 67 | +CONFIG_I2C=y | |
| 68 | +CONFIG_I2C_SH_MOBILE=y | |
| 69 | +# CONFIG_HWMON is not set | |
| 70 | +# CONFIG_MFD_SUPPORT is not set | |
| 71 | +CONFIG_FB=y | |
| 72 | +CONFIG_FB_SH_MOBILE_LCDC=y | |
| 73 | +CONFIG_FRAMEBUFFER_CONSOLE=y | |
| 74 | +CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y | |
| 75 | +# CONFIG_HID_SUPPORT is not set | |
| 76 | +# CONFIG_USB_SUPPORT is not set | |
| 77 | +# CONFIG_DNOTIFY is not set | |
| 78 | +# CONFIG_INOTIFY_USER is not set | |
| 79 | +CONFIG_TMPFS=y | |
| 80 | +# CONFIG_MISC_FILESYSTEMS is not set | |
| 81 | +CONFIG_MAGIC_SYSRQ=y | |
| 82 | +CONFIG_DEBUG_KERNEL=y | |
| 83 | +# CONFIG_FTRACE is not set | |
| @@ -3,7 +3,7 @@ CONFIG_LOCALVERSION="gum" · 2 unmodified lines | ||
| 3 | 3 | # CONFIG_SWAP is not set |
| 4 | 4 | CONFIG_SYSVIPC=y |
| 5 | 5 | CONFIG_SYSFS_DEPRECATED_V2=y |
| 6 | −CONFIG_EMBEDDED=y | |
| 6 | +CONFIG_EXPERT=y | |
| 7 | 7 | # CONFIG_SYSCTL_SYSCALL is not set |
| 8 | 8 | # CONFIG_EPOLL is not set |
| 9 | 9 | # CONFIG_SHMEM is not set |
| @@ -1,121 +0,0 @@ | ||
| 1 | −CONFIG_EXPERIMENTAL=y | |
| 2 | −# CONFIG_SWAP is not set | |
| 3 | −CONFIG_SYSVIPC=y | |
| 4 | −CONFIG_TREE_PREEMPT_RCU=y | |
| 5 | −CONFIG_LOG_BUF_SHIFT=14 | |
| 6 | −CONFIG_BLK_DEV_INITRD=y | |
| 7 | −CONFIG_EMBEDDED=y | |
| 8 | −# CONFIG_KALLSYMS is not set | |
| 9 | −CONFIG_SLAB=y | |
| 10 | −CONFIG_MODULES=y | |
| 11 | −CONFIG_MODULE_UNLOAD=y | |
| 12 | −CONFIG_MODULE_FORCE_UNLOAD=y | |
| 13 | −# CONFIG_LBDAF is not set | |
| 14 | −CONFIG_ARCH_OMAP=y | |
| 15 | −CONFIG_ARCH_OMAP1=y | |
| 16 | −CONFIG_OMAP_MBOX_FWK=m | |
| 17 | −CONFIG_MACH_AMS_DELTA=y | |
| 18 | −CONFIG_OMAP_ARM_150MHZ=y | |
| 19 | −# CONFIG_OMAP_ARM_60MHZ is not set | |
| 20 | −CONFIG_PREEMPT=y | |
| 21 | −CONFIG_AEABI=y | |
| 22 | −CONFIG_ZBOOT_ROM_TEXT=0x0 | |
| 23 | −CONFIG_ZBOOT_ROM_BSS=0x0 | |
| 24 | −CONFIG_CMDLINE="mem=32M console=ttyS0,115200n8 root=/dev/ram0 initrd=0x11c00000,4M" | |
| 25 | −CONFIG_FPE_NWFPE=y | |
| 26 | −CONFIG_PM=y | |
| 27 | −# CONFIG_SUSPEND is not set | |
| 28 | −CONFIG_PM_RUNTIME=y | |
| 29 | −CONFIG_NET=y | |
| 30 | −CONFIG_PACKET=y | |
| 31 | −CONFIG_UNIX=y | |
| 32 | −CONFIG_INET=y | |
| 33 | −CONFIG_IP_MULTICAST=y | |
| 34 | −CONFIG_IPV6=y | |
| 35 | −# CONFIG_FW_LOADER is not set | |
| 36 | −CONFIG_MTD=y | |
| 37 | −CONFIG_MTD_PARTITIONS=y | |
| 38 | −CONFIG_MTD_CHAR=y | |
| 39 | −CONFIG_MTD_BLOCK=y | |
| 40 | −CONFIG_MTD_NAND=y | |
| 41 | −CONFIG_MTD_NAND_AMS_DELTA=y | |
| 42 | −CONFIG_BLK_DEV_LOOP=y | |
| 43 | −CONFIG_BLK_DEV_RAM=y | |
| 44 | −CONFIG_BLK_DEV_RAM_SIZE=8192 | |
| 45 | −CONFIG_SCSI=y | |
| 46 | −CONFIG_BLK_DEV_SD=y | |
| 47 | −CONFIG_NETDEVICES=y | |
| 48 | −CONFIG_NET_ETHERNET=y | |
| 49 | −CONFIG_USB_CATC=y | |
| 50 | −CONFIG_USB_KAWETH=y | |
| 51 | −CONFIG_USB_PEGASUS=y | |
| 52 | −CONFIG_USB_RTL8150=y | |
| 53 | −CONFIG_USB_USBNET=y | |
| 54 | −CONFIG_PPP=y | |
| 55 | −CONFIG_PPP_MULTILINK=y | |
| 56 | −CONFIG_INPUT_EVDEV=y | |
| 57 | −CONFIG_KEYBOARD_OMAP=y | |
| 58 | −# CONFIG_INPUT_MOUSE is not set | |
| 59 | −CONFIG_SERIAL_8250=y | |
| 60 | −CONFIG_SERIAL_8250_CONSOLE=y | |
| 61 | −# CONFIG_LEGACY_PTYS is not set | |
| 62 | −CONFIG_HW_RANDOM=y | |
| 63 | −CONFIG_I2C=y | |
| 64 | −CONFIG_I2C_CHARDEV=y | |
| 65 | −CONFIG_I2C_OMAP=y | |
| 66 | −CONFIG_GPIO_SYSFS=y | |
| 67 | −# CONFIG_HWMON is not set | |
| 68 | −CONFIG_FB=y | |
| 69 | −CONFIG_FIRMWARE_EDID=y | |
| 70 | −CONFIG_FB_OMAP=y | |
| 71 | −CONFIG_BACKLIGHT_LCD_SUPPORT=y | |
| 72 | −CONFIG_LCD_CLASS_DEVICE=y | |
| 73 | −# CONFIG_VGA_CONSOLE is not set | |
| 74 | −CONFIG_FRAMEBUFFER_CONSOLE=y | |
| 75 | −CONFIG_FONTS=y | |
| 76 | −CONFIG_FONT_6x11=y | |
| 77 | −CONFIG_LOGO=y | |
| 78 | −# CONFIG_LOGO_LINUX_MONO is not set | |
| 79 | −# CONFIG_LOGO_LINUX_VGA16 is not set | |
| 80 | −CONFIG_SOUND=y | |
| 81 | −CONFIG_SND=y | |
| 82 | −CONFIG_SND_MIXER_OSS=y | |
| 83 | −CONFIG_SND_PCM_OSS=y | |
| 84 | −CONFIG_SND_SOC=y | |
| 85 | −CONFIG_SND_OMAP_SOC=y | |
| 86 | −CONFIG_SND_OMAP_SOC_AMS_DELTA=y | |
| 87 | −CONFIG_USB=y | |
| 88 | −CONFIG_USB_DEVICEFS=y | |
| 89 | −# CONFIG_USB_DEVICE_CLASS is not set | |
| 90 | −CONFIG_USB_MON=y | |
| 91 | −CONFIG_USB_OHCI_HCD=y | |
| 92 | −CONFIG_USB_STORAGE=y | |
| 93 | −CONFIG_NEW_LEDS=y | |
| 94 | −CONFIG_LEDS_CLASS=y | |
| 95 | −CONFIG_LEDS_AMS_DELTA=y | |
| 96 | −CONFIG_LEDS_TRIGGERS=y | |
| 97 | −CONFIG_LEDS_TRIGGER_TIMER=y | |
| 98 | −CONFIG_LEDS_TRIGGER_HEARTBEAT=y | |
| 99 | −CONFIG_LEDS_TRIGGER_DEFAULT_ON=y | |
| 100 | −CONFIG_RTC_CLASS=y | |
| 101 | −CONFIG_RTC_DRV_OMAP=y | |
| 102 | −CONFIG_EXT2_FS=y | |
| 103 | −CONFIG_EXT3_FS=y | |
| 104 | −CONFIG_INOTIFY=y | |
| 105 | −CONFIG_AUTOFS_FS=y | |
| 106 | −CONFIG_AUTOFS4_FS=y | |
| 107 | −CONFIG_MSDOS_FS=y | |
| 108 | −CONFIG_VFAT_FS=y | |
| 109 | −CONFIG_TMPFS=y | |
| 110 | −CONFIG_JFFS2_FS=y | |
| 111 | −CONFIG_JFFS2_SUMMARY=y | |
| 112 | −CONFIG_NFS_FS=y | |
| 113 | −CONFIG_PARTITION_ADVANCED=y | |
| 114 | −CONFIG_NLS_CODEPAGE_437=y | |
| 115 | −CONFIG_NLS_CODEPAGE_850=y | |
| 116 | −CONFIG_NLS_CODEPAGE_852=y | |
| 117 | −CONFIG_NLS_ISO8859_1=y | |
| 118 | −CONFIG_NLS_ISO8859_2=y | |
| 119 | −CONFIG_MAGIC_SYSRQ=y | |
| 120 | −CONFIG_DEBUG_KERNEL=y | |
| 121 | −# CONFIG_DEBUG_BUGVERBOSE is not set | |
| @@ -17,7 +17,7 @@ CONFIG_SYSFS_DEPRECATED_V2=y · 16 unmodified lines | ||
| 17 | 17 | CONFIG_RELAY=y |
| 18 | 18 | CONFIG_BLK_DEV_INITRD=y |
| 19 | 19 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set |
| 20 | −CONFIG_EMBEDDED=y | |
| 20 | +CONFIG_EXPERT=y | |
| 21 | 21 | CONFIG_SLAB=y |
| 22 | 22 | CONFIG_PROFILING=y |
| 23 | 23 | CONFIG_OPROFILE=m |
| @@ -1,6 +1,6 @@ | ||
| 1 | 1 | CONFIG_EXPERIMENTAL=y |
| 2 | 2 | CONFIG_LOG_BUF_SHIFT=14 |
| 3 | −CONFIG_EMBEDDED=y | |
| 3 | +CONFIG_EXPERT=y | |
| 4 | 4 | CONFIG_MODULES=y |
| 5 | 5 | CONFIG_MODVERSIONS=y |
| 6 | 6 | CONFIG_ARCH_SA1100=y |
| @@ -2,7 +2,7 @@ CONFIG_EXPERIMENTAL=y · 1 unmodified line | ||
| 2 | 2 | # CONFIG_LOCALVERSION_AUTO is not set |
| 3 | 3 | # CONFIG_SWAP is not set |
| 4 | 4 | CONFIG_SYSVIPC=y |
| 5 | −CONFIG_EMBEDDED=y | |
| 5 | +CONFIG_EXPERT=y | |
| 6 | 6 | CONFIG_KALLSYMS_EXTRA_PASS=y |
| 7 | 7 | # CONFIG_HOTPLUG is not set |
| 8 | 8 | # CONFIG_ELF_CORE is not set |
| @@ -6,7 +6,7 @@ CONFIG_IKCONFIG_PROC=y · 5 unmodified lines | ||
| 6 | 6 | CONFIG_LOG_BUF_SHIFT=14 |
| 7 | 7 | CONFIG_SYSFS_DEPRECATED_V2=y |
| 8 | 8 | CONFIG_BLK_DEV_INITRD=y |
| 9 | −CONFIG_EMBEDDED=y | |
| 9 | +CONFIG_EXPERT=y | |
| 10 | 10 | # CONFIG_VM_EVENT_COUNTERS is not set |
| 11 | 11 | # CONFIG_SLUB_DEBUG is not set |
| 12 | 12 | # CONFIG_COMPAT_BRK is not set |
| @@ -8,7 +8,7 @@ CONFIG_IKCONFIG_PROC=y · 7 unmodified lines | ||
| 8 | 8 | CONFIG_LOG_BUF_SHIFT=14 |
| 9 | 9 | CONFIG_SYSFS_DEPRECATED_V2=y |
| 10 | 10 | CONFIG_BLK_DEV_INITRD=y |
| 11 | −CONFIG_EMBEDDED=y | |
| 11 | +CONFIG_EXPERT=y | |
| 12 | 12 | CONFIG_KALLSYMS_EXTRA_PASS=y |
| 13 | 13 | CONFIG_SLAB=y |
| 14 | 14 | CONFIG_MODULES=y |
| @@ -4,7 +4,7 @@ CONFIG_SYSVIPC=y · 3 unmodified lines | ||
| 4 | 4 | CONFIG_LOG_BUF_SHIFT=14 |
| 5 | 5 | CONFIG_BLK_DEV_INITRD=y |
| 6 | 6 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set |
| 7 | −CONFIG_EMBEDDED=y | |
| 7 | +CONFIG_EXPERT=y | |
| 8 | 8 | # CONFIG_BASE_FULL is not set |
| 9 | 9 | # CONFIG_EPOLL is not set |
| 10 | 10 | CONFIG_SLOB=y |
| @@ -4,7 +4,7 @@ CONFIG_BSD_PROCESS_ACCT=y · 3 unmodified lines | ||
| 4 | 4 | CONFIG_LOG_BUF_SHIFT=14 |
| 5 | 5 | CONFIG_SYSFS_DEPRECATED_V2=y |
| 6 | 6 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set |
| 7 | −CONFIG_EMBEDDED=y | |
| 7 | +CONFIG_EXPERT=y | |
| 8 | 8 | CONFIG_PROFILING=y |
| 9 | 9 | CONFIG_OPROFILE=m |
| 10 | 10 | CONFIG_MODULES=y |
| @@ -6,7 +6,7 @@ CONFIG_IKCONFIG=y · 5 unmodified lines | ||
| 6 | 6 | CONFIG_IKCONFIG_PROC=y |
| 7 | 7 | CONFIG_LOG_BUF_SHIFT=14 |
| 8 | 8 | CONFIG_BLK_DEV_INITRD=y |
| 9 | −CONFIG_EMBEDDED=y | |
| 9 | +CONFIG_EXPERT=y | |
| 10 | 10 | CONFIG_MODULES=y |
| 11 | 11 | CONFIG_MODULE_UNLOAD=y |
| 12 | 12 | CONFIG_MODULE_FORCE_UNLOAD=y |
| @@ -6,7 +6,7 @@ CONFIG_IKCONFIG=y · 5 unmodified lines | ||
| 6 | 6 | CONFIG_IKCONFIG_PROC=y |
| 7 | 7 | CONFIG_LOG_BUF_SHIFT=14 |
| 8 | 8 | CONFIG_BLK_DEV_INITRD=y |
| 9 | −CONFIG_EMBEDDED=y | |
| 9 | +CONFIG_EXPERT=y | |
| 10 | 10 | CONFIG_MODULES=y |
| 11 | 11 | CONFIG_MODULE_UNLOAD=y |
| 12 | 12 | CONFIG_MODULE_FORCE_UNLOAD=y |
| @@ -1,7 +1,7 @@ | ||
| 1 | 1 | CONFIG_EXPERIMENTAL=y |
| 2 | 2 | CONFIG_SYSVIPC=y |
| 3 | 3 | CONFIG_LOG_BUF_SHIFT=14 |
| 4 | −CONFIG_EMBEDDED=y | |
| 4 | +CONFIG_EXPERT=y | |
| 5 | 5 | CONFIG_SLAB=y |
| 6 | 6 | CONFIG_MODULES=y |
| 7 | 7 | CONFIG_MODULE_UNLOAD=y |
| @@ -2,7 +2,7 @@ CONFIG_EXPERIMENTAL=y · 1 unmodified line | ||
| 2 | 2 | CONFIG_SYSVIPC=y |
| 3 | 3 | CONFIG_BSD_PROCESS_ACCT=y |
| 4 | 4 | CONFIG_LOG_BUF_SHIFT=14 |
| 5 | −CONFIG_EMBEDDED=y | |
| 5 | +CONFIG_EXPERT=y | |
| 6 | 6 | CONFIG_MODULES=y |
| 7 | 7 | CONFIG_ARCH_EBSA110=y |
| 8 | 8 | CONFIG_PCCARD=m |
| @@ -2,7 +2,7 @@ CONFIG_EXPERIMENTAL=y · 1 unmodified line | ||
| 2 | 2 | CONFIG_SYSVIPC=y |
| 3 | 3 | CONFIG_LOG_BUF_SHIFT=14 |
| 4 | 4 | CONFIG_BLK_DEV_INITRD=y |
| 5 | −CONFIG_EMBEDDED=y | |
| 5 | +CONFIG_EXPERT=y | |
| 6 | 6 | # CONFIG_HOTPLUG is not set |
| 7 | 7 | CONFIG_ARCH_CLPS711X=y |
| 8 | 8 | CONFIG_ARCH_EDB7211=y |
| @@ -6,7 +6,7 @@ CONFIG_IKCONFIG_PROC=y · 5 unmodified lines | ||
| 6 | 6 | CONFIG_LOG_BUF_SHIFT=14 |
| 7 | 7 | CONFIG_SYSFS_DEPRECATED_V2=y |
| 8 | 8 | CONFIG_BLK_DEV_INITRD=y |
| 9 | −CONFIG_EMBEDDED=y | |
| 9 | +CONFIG_EXPERT=y | |
| 10 | 10 | # CONFIG_VM_EVENT_COUNTERS is not set |
| 11 | 11 | # CONFIG_SLUB_DEBUG is not set |
| 12 | 12 | # CONFIG_COMPAT_BRK is not set |
| @@ -4,7 +4,7 @@ CONFIG_IKCONFIG=y · 3 unmodified lines | ||
| 4 | 4 | CONFIG_IKCONFIG_PROC=y |
| 5 | 5 | CONFIG_LOG_BUF_SHIFT=14 |
| 6 | 6 | CONFIG_SYSFS_DEPRECATED_V2=y |
| 7 | −CONFIG_EMBEDDED=y | |
| 7 | +CONFIG_EXPERT=y | |
| 8 | 8 | CONFIG_SLAB=y |
| 9 | 9 | CONFIG_MODULES=y |
| 10 | 10 | CONFIG_MODULE_UNLOAD=y |
| @@ -2,7 +2,7 @@ CONFIG_EXPERIMENTAL=y · 1 unmodified line | ||
| 2 | 2 | CONFIG_SYSVIPC=y |
| 3 | 3 | CONFIG_LOG_BUF_SHIFT=14 |
| 4 | 4 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set |
| 5 | −CONFIG_EMBEDDED=y | |
| 5 | +CONFIG_EXPERT=y | |
| 6 | 6 | # CONFIG_KALLSYMS is not set |
| 7 | 7 | # CONFIG_COMPAT_BRK is not set |
| 8 | 8 | CONFIG_SLAB=y |
| @@ -7,7 +7,7 @@ CONFIG_SYSFS_DEPRECATED_V2=y · 6 unmodified lines | ||
| 7 | 7 | CONFIG_BLK_DEV_INITRD=y |
| 8 | 8 | CONFIG_RD_BZIP2=y |
| 9 | 9 | CONFIG_RD_LZMA=y |
| 10 | −CONFIG_EMBEDDED=y | |
| 10 | +CONFIG_EXPERT=y | |
| 11 | 11 | # CONFIG_COMPAT_BRK is not set |
| 12 | 12 | CONFIG_SLAB=y |
| 13 | 13 | CONFIG_MODULES=y |
| @@ -3,7 +3,7 @@ CONFIG_SYSVIPC=y · 2 unmodified lines | ||
| 3 | 3 | CONFIG_BSD_PROCESS_ACCT=y |
| 4 | 4 | CONFIG_LOG_BUF_SHIFT=14 |
| 5 | 5 | CONFIG_BLK_DEV_INITRD=y |
| 6 | −CONFIG_EMBEDDED=y | |
| 6 | +CONFIG_EXPERT=y | |
| 7 | 7 | # CONFIG_HOTPLUG is not set |
| 8 | 8 | CONFIG_MODULES=y |
| 9 | 9 | CONFIG_ARCH_FOOTBRIDGE=y |
| @@ -2,7 +2,7 @@ CONFIG_EXPERIMENTAL=y · 1 unmodified line | ||
| 2 | 2 | CONFIG_SYSVIPC=y |
| 3 | 3 | CONFIG_LOG_BUF_SHIFT=14 |
| 4 | 4 | CONFIG_BLK_DEV_INITRD=y |
| 5 | −CONFIG_EMBEDDED=y | |
| 5 | +CONFIG_EXPERT=y | |
| 6 | 6 | # CONFIG_HOTPLUG is not set |
| 7 | 7 | CONFIG_ARCH_CLPS711X=y |
| 8 | 8 | CONFIG_ARCH_FORTUNET=y |
| @@ -4,7 +4,7 @@ CONFIG_IKCONFIG=y · 3 unmodified lines | ||
| 4 | 4 | CONFIG_IKCONFIG_PROC=y |
| 5 | 5 | CONFIG_LOG_BUF_SHIFT=16 |
| 6 | 6 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set |
| 7 | −CONFIG_EMBEDDED=y | |
| 7 | +CONFIG_EXPERT=y | |
| 8 | 8 | # CONFIG_UID16 is not set |
| 9 | 9 | CONFIG_SLAB=y |
| 10 | 10 | CONFIG_MODULES=y |
| @@ -1,73 +0,0 @@ | ||
| 1 | −CONFIG_EXPERIMENTAL=y | |
| 2 | −CONFIG_SYSVIPC=y | |
| 3 | −CONFIG_LOG_BUF_SHIFT=14 | |
| 4 | −CONFIG_BLK_DEV_INITRD=y | |
| 5 | −CONFIG_SLAB=y | |
| 6 | −CONFIG_MODULES=y | |
| 7 | −CONFIG_MODULE_UNLOAD=y | |
| 8 | −# CONFIG_BLK_DEV_BSG is not set | |
| 9 | −CONFIG_ARCH_OMAP=y | |
| 10 | −CONFIG_ARCH_OMAP1=y | |
| 11 | −CONFIG_ARCH_OMAP850=y | |
| 12 | −# CONFIG_ARCH_OMAP15XX is not set | |
| 13 | −CONFIG_MACH_HERALD=y | |
| 14 | −CONFIG_OMAP_ARM_195MHZ=y | |
| 15 | −# CONFIG_OMAP_ARM_60MHZ is not set | |
| 16 | −CONFIG_CPU_ARM925T=y | |
| 17 | −CONFIG_PREEMPT=y | |
| 18 | −CONFIG_AEABI=y | |
| 19 | −CONFIG_LEDS=y | |
| 20 | −CONFIG_ZBOOT_ROM_TEXT=0x0 | |
| 21 | −CONFIG_ZBOOT_ROM_BSS=0x0 | |
| 22 | −CONFIG_CMDLINE="mem=32M console=ttyS0,115200 ip=dhcp" | |
| 23 | −CONFIG_FPE_NWFPE=y | |
| 24 | −CONFIG_PM=y | |
| 25 | −CONFIG_NET=y | |
| 26 | −CONFIG_PACKET=y | |
| 27 | −CONFIG_UNIX=y | |
| 28 | −CONFIG_INET=y | |
| 29 | −CONFIG_IP_MULTICAST=y | |
| 30 | −CONFIG_IP_PNP=y | |
| 31 | −CONFIG_IP_PNP_DHCP=y | |
| 32 | −CONFIG_IP_PNP_BOOTP=y | |
| 33 | −# CONFIG_IPV6 is not set | |
| 34 | −CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | |
| 35 | −CONFIG_BLK_DEV_LOOP=y | |
| 36 | −CONFIG_BLK_DEV_RAM=y | |
| 37 | −CONFIG_BLK_DEV_RAM_SIZE=8192 | |
| 38 | −CONFIG_NETDEVICES=y | |
| 39 | −CONFIG_NET_ETHERNET=y | |
| 40 | −CONFIG_SMC91X=y | |
| 41 | −# CONFIG_KEYBOARD_ATKBD is not set | |
| 42 | −CONFIG_KEYBOARD_OMAP=y | |
| 43 | −# CONFIG_INPUT_MOUSE is not set | |
| 44 | −CONFIG_SERIAL_8250=m | |
| 45 | −# CONFIG_LEGACY_PTYS is not set | |
| 46 | −CONFIG_VIDEO_OUTPUT_CONTROL=m | |
| 47 | −CONFIG_FB=y | |
| 48 | −CONFIG_FB_MODE_HELPERS=y | |
| 49 | −CONFIG_FB_OMAP=y | |
| 50 | −# CONFIG_VGA_CONSOLE is not set | |
| 51 | −CONFIG_FRAMEBUFFER_CONSOLE=y | |
| 52 | −CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y | |
| 53 | −CONFIG_FONTS=y | |
| 54 | −CONFIG_FONT_MINI_4x6=y | |
| 55 | −CONFIG_USB_GADGET=y | |
| 56 | −CONFIG_USB_ETH=m | |
| 57 | −# CONFIG_USB_ETH_RNDIS is not set | |
| 58 | −CONFIG_MMC=y | |
| 59 | −CONFIG_MMC_SDHCI=y | |
| 60 | −CONFIG_MMC_SDHCI_PLTFM=y | |
| 61 | −CONFIG_MMC_OMAP=y | |
| 62 | −CONFIG_RTC_CLASS=y | |
| 63 | −CONFIG_EXT2_FS=y | |
| 64 | −CONFIG_EXT3_FS=y | |
| 65 | −CONFIG_INOTIFY=y | |
| 66 | −CONFIG_TMPFS=y | |
| 67 | −CONFIG_NFS_FS=y | |
| 68 | −CONFIG_ROOT_NFS=y | |
| 69 | −# CONFIG_RCU_CPU_STALL_DETECTOR is not set | |
| 70 | −CONFIG_CRYPTO_DEFLATE=y | |
| 71 | −CONFIG_CRYPTO_ZLIB=y | |
| 72 | −CONFIG_CRYPTO_LZO=y | |
| 73 | −# CONFIG_CRYPTO_ANSI_CPRNG is not set | |
| @@ -6,7 +6,7 @@ CONFIG_SYSFS_DEPRECATED_V2=y · 5 unmodified lines | ||
| 6 | 6 | CONFIG_BLK_DEV_INITRD=y |
| 7 | 7 | CONFIG_RD_BZIP2=y |
| 8 | 8 | CONFIG_RD_LZMA=y |
| 9 | −CONFIG_EMBEDDED=y | |
| 9 | +CONFIG_EXPERT=y | |
| 10 | 10 | # CONFIG_COMPAT_BRK is not set |
| 11 | 11 | CONFIG_SLAB=y |
| 12 | 12 | CONFIG_MODULES=y |
| @@ -3,7 +3,7 @@ CONFIG_SYSVIPC=y · 2 unmodified lines | ||
| 3 | 3 | CONFIG_BSD_PROCESS_ACCT=y |
| 4 | 4 | CONFIG_LOG_BUF_SHIFT=14 |
| 5 | 5 | CONFIG_BLK_DEV_INITRD=y |
| 6 | −CONFIG_EMBEDDED=y | |
| 6 | +CONFIG_EXPERT=y | |
| 7 | 7 | # CONFIG_HOTPLUG is not set |
| 8 | 8 | CONFIG_SLAB=y |
| 9 | 9 | CONFIG_MODULES=y |
| @@ -3,7 +3,7 @@ CONFIG_SYSVIPC=y · 2 unmodified lines | ||
| 3 | 3 | CONFIG_BSD_PROCESS_ACCT=y |
| 4 | 4 | CONFIG_LOG_BUF_SHIFT=14 |
| 5 | 5 | CONFIG_BLK_DEV_INITRD=y |
| 6 | −CONFIG_EMBEDDED=y | |
| 6 | +CONFIG_EXPERT=y | |
| 7 | 7 | CONFIG_SLAB=y |
| 8 | 8 | CONFIG_MODULES=y |
| 9 | 9 | CONFIG_MODULE_UNLOAD=y |
| @@ -3,7 +3,7 @@ CONFIG_SYSVIPC=y · 2 unmodified lines | ||
| 3 | 3 | CONFIG_BSD_PROCESS_ACCT=y |
| 4 | 4 | CONFIG_LOG_BUF_SHIFT=14 |
| 5 | 5 | CONFIG_BLK_DEV_INITRD=y |
| 6 | −CONFIG_EMBEDDED=y | |
| 6 | +CONFIG_EXPERT=y | |
| 7 | 7 | CONFIG_MODULES=y |
| 8 | 8 | CONFIG_MODVERSIONS=y |
| 9 | 9 | # CONFIG_BLK_DEV_BSG is not set |
| @@ -1,7 +1,7 @@ | ||
| 1 | 1 | CONFIG_EXPERIMENTAL=y |
| 2 | 2 | CONFIG_SYSVIPC=y |
| 3 | 3 | CONFIG_LOG_BUF_SHIFT=14 |
| 4 | −CONFIG_EMBEDDED=y | |
| 4 | +CONFIG_EXPERT=y | |
| 5 | 5 | CONFIG_SLAB=y |
| 6 | 6 | CONFIG_MODULES=y |
| 7 | 7 | CONFIG_MODULE_UNLOAD=y |
| @@ -3,7 +3,7 @@ CONFIG_EXPERIMENTAL=y · 2 unmodified lines | ||
| 3 | 3 | CONFIG_SYSVIPC=y |
| 4 | 4 | CONFIG_IKCONFIG=y |
| 5 | 5 | CONFIG_LOG_BUF_SHIFT=14 |
| 6 | −CONFIG_EMBEDDED=y | |
| 6 | +CONFIG_EXPERT=y | |
| 7 | 7 | # CONFIG_HOTPLUG is not set |
| 8 | 8 | # CONFIG_EPOLL is not set |
| 9 | 9 | # CONFIG_IOSCHED_DEADLINE is not set |
| @@ -3,7 +3,7 @@ CONFIG_EXPERIMENTAL=y · 2 unmodified lines | ||
| 3 | 3 | CONFIG_SYSVIPC=y |
| 4 | 4 | CONFIG_IKCONFIG=y |
| 5 | 5 | CONFIG_LOG_BUF_SHIFT=16 |
| 6 | −CONFIG_EMBEDDED=y | |
| 6 | +CONFIG_EXPERT=y | |
| 7 | 7 | # CONFIG_HOTPLUG is not set |
| 8 | 8 | # CONFIG_EPOLL is not set |
| 9 | 9 | CONFIG_SLAB=y |
| @@ -0,0 +1,138 @@ | ||
| 1 | +CONFIG_EXPERIMENTAL=y | |
| 2 | +CONFIG_SYSVIPC=y | |
| 3 | +CONFIG_IKCONFIG=y | |
| 4 | +CONFIG_IKCONFIG_PROC=y | |
| 5 | +CONFIG_LOG_BUF_SHIFT=16 | |
| 6 | +# CONFIG_UTS_NS is not set | |
| 7 | +# CONFIG_IPC_NS is not set | |
| 8 | +# CONFIG_USER_NS is not set | |
| 9 | +# CONFIG_PID_NS is not set | |
| 10 | +# CONFIG_NET_NS is not set | |
| 11 | +CONFIG_SLAB=y | |
| 12 | +CONFIG_MODULES=y | |
| 13 | +CONFIG_MODULE_UNLOAD=y | |
| 14 | +# CONFIG_BLK_DEV_BSG is not set | |
| 15 | +# CONFIG_IOSCHED_DEADLINE is not set | |
| 16 | +# CONFIG_IOSCHED_CFQ is not set | |
| 17 | +CONFIG_ARCH_SHMOBILE=y | |
| 18 | +CONFIG_ARCH_SH7372=y | |
| 19 | +CONFIG_MACH_MACKEREL=y | |
| 20 | +CONFIG_MEMORY_SIZE=0x10000000 | |
| 21 | +CONFIG_AEABI=y | |
| 22 | +# CONFIG_OABI_COMPAT is not set | |
| 23 | +CONFIG_FORCE_MAX_ZONEORDER=15 | |
| 24 | +CONFIG_ZBOOT_ROM_TEXT=0x0 | |
| 25 | +CONFIG_ZBOOT_ROM_BSS=0x0 | |
| 26 | +CONFIG_CMDLINE="console=tty0, console=ttySC0,115200 earlyprintk=sh-sci.0,115200 root=/dev/nfs nfsroot=,tcp,v3 ip=dhcp memchunk.vpu=64m memchunk.veu0=8m memchunk.spu0=2m mem=240m" | |
| 27 | +CONFIG_KEXEC=y | |
| 28 | +# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set | |
| 29 | +CONFIG_PM=y | |
| 30 | +CONFIG_PM_RUNTIME=y | |
| 31 | +CONFIG_NET=y | |
| 32 | +CONFIG_PACKET=y | |
| 33 | +CONFIG_UNIX=y | |
| 34 | +CONFIG_INET=y | |
| 35 | +CONFIG_IP_MULTICAST=y | |
| 36 | +CONFIG_IP_PNP=y | |
| 37 | +CONFIG_IP_PNP_DHCP=y | |
| 38 | +# CONFIG_INET_XFRM_MODE_TRANSPORT is not set | |
| 39 | +# CONFIG_INET_XFRM_MODE_TUNNEL is not set | |
| 40 | +# CONFIG_INET_XFRM_MODE_BEET is not set | |
| 41 | +# CONFIG_IPV6 is not set | |
| 42 | +# CONFIG_WIRELESS is not set | |
| 43 | +CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | |
| 44 | +# CONFIG_FIRMWARE_IN_KERNEL is not set | |
| 45 | +CONFIG_MTD=y | |
| 46 | +CONFIG_MTD_CONCAT=y | |
| 47 | +CONFIG_MTD_PARTITIONS=y | |
| 48 | +CONFIG_MTD_CHAR=y | |
| 49 | +CONFIG_MTD_BLOCK=y | |
| 50 | +CONFIG_MTD_CFI=y | |
| 51 | +CONFIG_MTD_CFI_ADV_OPTIONS=y | |
| 52 | +CONFIG_MTD_CFI_INTELEXT=y | |
| 53 | +CONFIG_MTD_PHYSMAP=y | |
| 54 | +CONFIG_MTD_ARM_INTEGRATOR=y | |
| 55 | +CONFIG_MTD_BLOCK2MTD=y | |
| 56 | +CONFIG_SCSI=y | |
| 57 | +CONFIG_BLK_DEV_SD=y | |
| 58 | +# CONFIG_SCSI_LOWLEVEL is not set | |
| 59 | +CONFIG_NETDEVICES=y | |
| 60 | +CONFIG_NET_ETHERNET=y | |
| 61 | +CONFIG_SMSC911X=y | |
| 62 | +# CONFIG_NETDEV_1000 is not set | |
| 63 | +# CONFIG_NETDEV_10000 is not set | |
| 64 | +# CONFIG_WLAN is not set | |
| 65 | +# CONFIG_INPUT_MOUSEDEV_PSAUX is not set | |
| 66 | +# CONFIG_INPUT_KEYBOARD is not set | |
| 67 | +# CONFIG_INPUT_MOUSE is not set | |
| 68 | +CONFIG_SERIAL_SH_SCI=y | |
| 69 | +CONFIG_SERIAL_SH_SCI_NR_UARTS=8 | |
| 70 | +CONFIG_SERIAL_SH_SCI_CONSOLE=y | |
| 71 | +# CONFIG_LEGACY_PTYS is not set | |
| 72 | +# CONFIG_HW_RANDOM is not set | |
| 73 | +# CONFIG_HWMON is not set | |
| 74 | +# CONFIG_MFD_SUPPORT is not set | |
| 75 | +CONFIG_FB=y | |
| 76 | +CONFIG_FB_MODE_HELPERS=y | |
| 77 | +CONFIG_FB_SH_MOBILE_LCDC=y | |
| 78 | +CONFIG_FRAMEBUFFER_CONSOLE=y | |
| 79 | +CONFIG_LOGO=y | |
| 80 | +# CONFIG_LOGO_LINUX_MONO is not set | |
| 81 | +# CONFIG_LOGO_LINUX_CLUT224 is not set | |
| 82 | +# CONFIG_HID_SUPPORT is not set | |
| 83 | +# CONFIG_USB_SUPPORT is not set | |
| 84 | +CONFIG_EXT2_FS=y | |
| 85 | +CONFIG_EXT2_FS_XATTR=y | |
| 86 | +CONFIG_EXT2_FS_POSIX_ACL=y | |
| 87 | +CONFIG_EXT2_FS_SECURITY=y | |
| 88 | +CONFIG_EXT2_FS_XIP=y | |
| 89 | +CONFIG_EXT3_FS=y | |
| 90 | +# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set | |
| 91 | +CONFIG_EXT3_FS_POSIX_ACL=y | |
| 92 | +CONFIG_EXT3_FS_SECURITY=y | |
| 93 | +# CONFIG_DNOTIFY is not set | |
| 94 | +# CONFIG_INOTIFY_USER is not set | |
| 95 | +CONFIG_MSDOS_FS=y | |
| 96 | +CONFIG_VFAT_FS=y | |
| 97 | +CONFIG_TMPFS=y | |
| 98 | +# CONFIG_MISC_FILESYSTEMS is not set | |
| 99 | +CONFIG_NFS_FS=y | |
| 100 | +CONFIG_NFS_V3=y | |
| 101 | +CONFIG_NFS_V3_ACL=y | |
| 102 | +CONFIG_NFS_V4=y | |
| 103 | +CONFIG_NFS_V4_1=y | |
| 104 | +CONFIG_ROOT_NFS=y | |
| 105 | +CONFIG_NLS_CODEPAGE_437=y | |
| 106 | +CONFIG_NLS_CODEPAGE_737=y | |
| 107 | +CONFIG_NLS_CODEPAGE_775=y | |
| 108 | +CONFIG_NLS_CODEPAGE_850=y | |
| 109 | +CONFIG_NLS_CODEPAGE_852=y | |
| 110 | +CONFIG_NLS_CODEPAGE_855=y | |
| 111 | +CONFIG_NLS_CODEPAGE_857=y | |
| 112 | +CONFIG_NLS_CODEPAGE_860=y | |
| 113 | +CONFIG_NLS_CODEPAGE_861=y | |
| 114 | +CONFIG_NLS_CODEPAGE_862=y | |
| 115 | +CONFIG_NLS_CODEPAGE_863=y | |
| 116 | +CONFIG_NLS_CODEPAGE_864=y | |
| 117 | +CONFIG_NLS_CODEPAGE_865=y | |
| 118 | +CONFIG_NLS_CODEPAGE_866=y | |
| 119 | +CONFIG_NLS_CODEPAGE_869=y | |
| 120 | +CONFIG_NLS_ISO8859_1=y | |
| 121 | +CONFIG_NLS_ISO8859_2=y | |
| 122 | +CONFIG_NLS_ISO8859_3=y | |
| 123 | +CONFIG_NLS_ISO8859_4=y | |
| 124 | +CONFIG_NLS_ISO8859_5=y | |
| 125 | +CONFIG_NLS_ISO8859_6=y | |
| 126 | +CONFIG_NLS_ISO8859_7=y | |
| 127 | +CONFIG_NLS_ISO8859_9=y | |
| 128 | +CONFIG_NLS_ISO8859_13=y | |
| 129 | +CONFIG_NLS_ISO8859_14=y | |
| 130 | +CONFIG_NLS_ISO8859_15=y | |
| 131 | +CONFIG_NLS_KOI8_R=y | |
| 132 | +CONFIG_NLS_KOI8_U=y | |
| 133 | +CONFIG_NLS_UTF8=y | |
| 134 | +# CONFIG_ENABLE_WARN_DEPRECATED is not set | |
| 135 | +# CONFIG_ENABLE_MUST_CHECK is not set | |
| 136 | +# CONFIG_ARM_UNWIND is not set | |
| 137 | +CONFIG_CRYPTO=y | |
| 138 | +CONFIG_CRYPTO_ANSI_CPRNG=y | |
| @@ -4,7 +4,7 @@ CONFIG_IKCONFIG=y · 3 unmodified lines | ||
| 4 | 4 | CONFIG_IKCONFIG_PROC=y |
| 5 | 5 | CONFIG_LOG_BUF_SHIFT=16 |
| 6 | 6 | CONFIG_BLK_DEV_INITRD=y |
| 7 | −CONFIG_EMBEDDED=y | |
| 7 | +CONFIG_EXPERT=y | |
| 8 | 8 | # CONFIG_UID16 is not set |
| 9 | 9 | CONFIG_SLAB=y |
| 10 | 10 | CONFIG_MODULES=y |
| @@ -2,7 +2,7 @@ CONFIG_EXPERIMENTAL=y · 1 unmodified line | ||
| 2 | 2 | CONFIG_SYSVIPC=y |
| 3 | 3 | CONFIG_LOG_BUF_SHIFT=14 |
| 4 | 4 | CONFIG_SYSFS_DEPRECATED_V2=y |
| 5 | −CONFIG_EMBEDDED=y | |
| 5 | +CONFIG_EXPERT=y | |
| 6 | 6 | CONFIG_KALLSYMS_ALL=y |
| 7 | 7 | # CONFIG_SLUB_DEBUG is not set |
| 8 | 8 | CONFIG_PROFILING=y |
| @@ -4,7 +4,7 @@ CONFIG_IKCONFIG=y · 3 unmodified lines | ||
| 4 | 4 | CONFIG_IKCONFIG_PROC=y |
| 5 | 5 | CONFIG_LOG_BUF_SHIFT=14 |
| 6 | 6 | CONFIG_SYSFS_DEPRECATED_V2=y |
| 7 | −CONFIG_EMBEDDED=y | |
| 7 | +CONFIG_EXPERT=y | |
| 8 | 8 | CONFIG_SLAB=y |
| 9 | 9 | CONFIG_MODULES=y |
| 10 | 10 | CONFIG_MODULE_UNLOAD=y |
| @@ -4,7 +4,7 @@ CONFIG_SYSVIPC=y · 3 unmodified lines | ||
| 4 | 4 | CONFIG_LOG_BUF_SHIFT=14 |
| 5 | 5 | CONFIG_SYSFS_DEPRECATED_V2=y |
| 6 | 6 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set |
| 7 | −CONFIG_EMBEDDED=y | |
| 7 | +CONFIG_EXPERT=y | |
| 8 | 8 | CONFIG_KALLSYMS_EXTRA_PASS=y |
| 9 | 9 | CONFIG_SLAB=y |
| 10 | 10 | CONFIG_MODULES=y |
| @@ -4,7 +4,7 @@ CONFIG_SYSVIPC=y · 3 unmodified lines | ||
| 4 | 4 | CONFIG_POSIX_MQUEUE=y |
| 5 | 5 | CONFIG_LOG_BUF_SHIFT=14 |
| 6 | 6 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set |
| 7 | −CONFIG_EMBEDDED=y | |
| 7 | +CONFIG_EXPERT=y | |
| 8 | 8 | CONFIG_KALLSYMS_EXTRA_PASS=y |
| 9 | 9 | # CONFIG_COMPAT_BRK is not set |
| 10 | 10 | CONFIG_SLAB=y |
| @@ -4,7 +4,7 @@ CONFIG_IKCONFIG=y · 3 unmodified lines | ||
| 4 | 4 | CONFIG_IKCONFIG_PROC=y |
| 5 | 5 | CONFIG_LOG_BUF_SHIFT=14 |
| 6 | 6 | CONFIG_SYSFS_DEPRECATED_V2=y |
| 7 | −CONFIG_EMBEDDED=y | |
| 7 | +CONFIG_EXPERT=y | |
| 8 | 8 | CONFIG_SLAB=y |
| 9 | 9 | CONFIG_MODULES=y |
| 10 | 10 | CONFIG_MODULE_UNLOAD=y |
| @@ -84,6 +84,7 @@ CONFIG_SERIAL_IMX_CONSOLE=y · 73 unmodified lines | ||
| 84 | 84 | CONFIG_I2C=y |
| 85 | 85 | CONFIG_I2C_CHARDEV=y |
| 86 | 86 | CONFIG_I2C_IMX=y |
| 87 | +CONFIG_SPI=y | |
| 87 | 88 | CONFIG_W1=y |
| 88 | 89 | CONFIG_W1_MASTER_MXC=y |
| 89 | 90 | CONFIG_W1_SLAVE_THERM=y |
| @@ -3,7 +3,7 @@ CONFIG_EXPERIMENTAL=y · 2 unmodified lines | ||
| 3 | 3 | CONFIG_SYSVIPC=y |
| 4 | 4 | CONFIG_LOG_BUF_SHIFT=18 |
| 5 | 5 | CONFIG_RELAY=y |
| 6 | −CONFIG_EMBEDDED=y | |
| 6 | +CONFIG_EXPERT=y | |
| 7 | 7 | # CONFIG_SLUB_DEBUG is not set |
| 8 | 8 | # CONFIG_COMPAT_BRK is not set |
| 9 | 9 | CONFIG_MODULES=y |
| @@ -1,138 +0,0 @@ | ||
| 1 | −CONFIG_EXPERIMENTAL=y | |
| 2 | −CONFIG_SYSVIPC=y | |
| 3 | −CONFIG_POSIX_MQUEUE=y | |
| 4 | −CONFIG_LOG_BUF_SHIFT=14 | |
| 5 | −CONFIG_SLAB=y | |
| 6 | −CONFIG_MODULES=y | |
| 7 | −CONFIG_MODULE_UNLOAD=y | |
| 8 | −# CONFIG_BLK_DEV_BSG is not set | |
| 9 | −# CONFIG_IOSCHED_DEADLINE is not set | |
| 10 | −CONFIG_ARCH_OMAP=y | |
| 11 | −CONFIG_ARCH_OMAP1=y | |
| 12 | −CONFIG_OMAP_RESET_CLOCKS=y | |
| 13 | −# CONFIG_OMAP_MUX is not set | |
| 14 | −CONFIG_OMAP_MBOX_FWK=y | |
| 15 | −CONFIG_OMAP_32K_TIMER=y | |
| 16 | −CONFIG_OMAP_DM_TIMER=y | |
| 17 | −# CONFIG_ARCH_OMAP15XX is not set | |
| 18 | −CONFIG_ARCH_OMAP16XX=y | |
| 19 | −CONFIG_MACH_NOKIA770=y | |
| 20 | −CONFIG_OMAP_CLOCKS_SET_BY_BOOTLOADER=y | |
| 21 | −CONFIG_OMAP_ARM_216MHZ=y | |
| 22 | −# CONFIG_OMAP_ARM_60MHZ is not set | |
| 23 | −CONFIG_ZBOOT_ROM_TEXT=0x0 | |
| 24 | −CONFIG_ZBOOT_ROM_BSS=0x0 | |
| 25 | −CONFIG_CMDLINE="root=1f03 rootfstype=jffs2 time" | |
| 26 | −CONFIG_FPE_NWFPE=y | |
| 27 | −CONFIG_PM=y | |
| 28 | −CONFIG_PM_RUNTIME=y | |
| 29 | −CONFIG_NET=y | |
| 30 | −CONFIG_PACKET=y | |
| 31 | −CONFIG_UNIX=y | |
| 32 | −CONFIG_INET=y | |
| 33 | −CONFIG_IP_MULTICAST=y | |
| 34 | −CONFIG_IP_PNP=y | |
| 35 | −CONFIG_IP_PNP_DHCP=y | |
| 36 | −CONFIG_IP_PNP_BOOTP=y | |
| 37 | −# CONFIG_INET_LRO is not set | |
| 38 | −# CONFIG_INET_DIAG is not set | |
| 39 | −# CONFIG_IPV6 is not set | |
| 40 | −CONFIG_NETFILTER=y | |
| 41 | −CONFIG_BT=y | |
| 42 | −CONFIG_BT_L2CAP=y | |
| 43 | −CONFIG_BT_SCO=y | |
| 44 | −CONFIG_BT_RFCOMM=y | |
| 45 | −CONFIG_BT_RFCOMM_TTY=y | |
| 46 | −CONFIG_BT_BNEP=y | |
| 47 | −CONFIG_BT_HIDP=y | |
| 48 | −CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | |
| 49 | −CONFIG_CONNECTOR=y | |
| 50 | −# CONFIG_PROC_EVENTS is not set | |
| 51 | −CONFIG_MTD=y | |
| 52 | −CONFIG_MTD_PARTITIONS=y | |
| 53 | −CONFIG_MTD_CMDLINE_PARTS=y | |
| 54 | −CONFIG_MTD_CHAR=y | |
| 55 | −CONFIG_MTD_BLOCK=y | |
| 56 | −CONFIG_MTD_NAND=y | |
| 57 | −CONFIG_BLK_DEV_LOOP=y | |
| 58 | −CONFIG_SCSI=y | |
| 59 | −# CONFIG_SCSI_PROC_FS is not set | |
| 60 | −CONFIG_BLK_DEV_SD=y | |
| 61 | −CONFIG_NETDEVICES=y | |
| 62 | −CONFIG_TUN=y | |
| 63 | −CONFIG_NET_ETHERNET=y | |
| 64 | −CONFIG_USB_USBNET=y | |
| 65 | −# CONFIG_USB_NET_AX8817X is not set | |
| 66 | −# CONFIG_USB_NET_CDC_SUBSET is not set | |
| 67 | −CONFIG_PPP=y | |
| 68 | −CONFIG_PPP_FILTER=y | |
| 69 | −CONFIG_PPP_ASYNC=y | |
| 70 | −CONFIG_PPP_DEFLATE=y | |
| 71 | −CONFIG_PPP_BSDCOMP=y | |
| 72 | −# CONFIG_INPUT_MOUSEDEV_PSAUX is not set | |
| 73 | −CONFIG_INPUT_EVDEV=y | |
| 74 | −# CONFIG_KEYBOARD_ATKBD is not set | |
| 75 | −CONFIG_KEYBOARD_OMAP=y | |
| 76 | −# CONFIG_INPUT_MOUSE is not set | |
| 77 | −CONFIG_INPUT_TOUCHSCREEN=y | |
| 78 | −CONFIG_TOUCHSCREEN_ADS7846=y | |
| 79 | −CONFIG_SERIAL_8250=y | |
| 80 | −CONFIG_SERIAL_8250_CONSOLE=y | |
| 81 | −# CONFIG_LEGACY_PTYS is not set | |
| 82 | −CONFIG_I2C=y | |
| 83 | −CONFIG_I2C_OMAP=y | |
| 84 | −CONFIG_SPI=y | |
| 85 | −CONFIG_SPI_OMAP_UWIRE=y | |
| 86 | −# CONFIG_HWMON is not set | |
| 87 | −CONFIG_WATCHDOG=y | |
| 88 | −CONFIG_WATCHDOG_NOWAYOUT=y | |
| 89 | −CONFIG_OMAP_WATCHDOG=y | |
| 90 | −CONFIG_FB=y | |
| 91 | −CONFIG_FB_OMAP=y | |
| 92 | −CONFIG_FB_OMAP_LCDC_EXTERNAL=y | |
| 93 | −CONFIG_FB_OMAP_LCDC_HWA742=y | |
| 94 | −CONFIG_FB_OMAP_MANUAL_UPDATE=y | |
| 95 | −CONFIG_FB_OMAP_LCD_MIPID=y | |
| 96 | −# CONFIG_VGA_CONSOLE is not set | |
| 97 | −CONFIG_SOUND=y | |
| 98 | −CONFIG_SND=y | |
| 99 | −# CONFIG_SND_SUPPORT_OLD_API is not set | |
| 100 | −CONFIG_SND_DUMMY=y | |
| 101 | −CONFIG_SND_USB_AUDIO=y | |
| 102 | −CONFIG_USB=y | |
| 103 | −CONFIG_USB_DEVICEFS=y | |
| 104 | −CONFIG_USB_SUSPEND=y | |
| 105 | −CONFIG_USB_OTG=y | |
| 106 | −# CONFIG_USB_OTG_WHITELIST is not set | |
| 107 | −CONFIG_USB_OHCI_HCD=y | |
| 108 | −CONFIG_USB_STORAGE=y | |
| 109 | −CONFIG_USB_SERIAL=y | |
| 110 | −CONFIG_USB_SERIAL_CONSOLE=y | |
| 111 | −CONFIG_USB_SERIAL_PL2303=y | |
| 112 | −CONFIG_USB_GADGET=y | |
| 113 | −CONFIG_USB_ETH=m | |
| 114 | −CONFIG_USB_FILE_STORAGE=m | |
| 115 | −CONFIG_USB_FILE_STORAGE_TEST=y | |
| 116 | −CONFIG_MMC=y | |
| 117 | −CONFIG_MMC_OMAP=y | |
| 118 | −CONFIG_EXT2_FS=y | |
| 119 | −CONFIG_EXT3_FS=y | |
| 120 | −CONFIG_MSDOS_FS=y | |
| 121 | −CONFIG_VFAT_FS=y | |
| 122 | −CONFIG_TMPFS=y | |
| 123 | −CONFIG_JFFS2_FS=y | |
| 124 | −CONFIG_JFFS2_SUMMARY=y | |
| 125 | −CONFIG_JFFS2_COMPRESSION_OPTIONS=y | |
| 126 | −CONFIG_NFS_FS=y | |
| 127 | −CONFIG_NFS_V3=y | |
| 128 | −CONFIG_PARTITION_ADVANCED=y | |
| 129 | −CONFIG_NLS_CODEPAGE_437=y | |
| 130 | −CONFIG_NLS_CODEPAGE_852=y | |
| 131 | −CONFIG_NLS_ISO8859_1=y | |
| 132 | −CONFIG_NLS_ISO8859_15=y | |
| 133 | −CONFIG_NLS_UTF8=y | |
| 134 | −CONFIG_MAGIC_SYSRQ=y | |
| 135 | −CONFIG_DEBUG_KERNEL=y | |
| 136 | −CONFIG_DEBUG_MUTEXES=y | |
| 137 | −CONFIG_DEBUG_ERRORS=y | |
| 138 | −CONFIG_SECURITY=y | |
| @@ -7,7 +7,7 @@ CONFIG_IKCONFIG_PROC=y · 6 unmodified lines | ||
| 7 | 7 | CONFIG_LOG_BUF_SHIFT=14 |
| 8 | 8 | CONFIG_SYSFS_DEPRECATED_V2=y |
| 9 | 9 | CONFIG_BLK_DEV_INITRD=y |
| 10 | −CONFIG_EMBEDDED=y | |
| 10 | +CONFIG_EXPERT=y | |
| 11 | 11 | CONFIG_KALLSYMS_ALL=y |
| 12 | 12 | CONFIG_SLAB=y |
| 13 | 13 | CONFIG_MODULES=y |
| @@ -0,0 +1,286 @@ | ||
| 1 | +CONFIG_EXPERIMENTAL=y | |
| 2 | +# CONFIG_SWAP is not set | |
| 3 | +CONFIG_SYSVIPC=y | |
| 4 | +CONFIG_POSIX_MQUEUE=y | |
| 5 | +CONFIG_BSD_PROCESS_ACCT=y | |
| 6 | +CONFIG_IKCONFIG=y | |
| 7 | +CONFIG_LOG_BUF_SHIFT=14 | |
| 8 | +CONFIG_BLK_DEV_INITRD=y | |
| 9 | +CONFIG_EXPERT=y | |
| 10 | +# CONFIG_KALLSYMS is not set | |
| 11 | +# CONFIG_ELF_CORE is not set | |
| 12 | +# CONFIG_BASE_FULL is not set | |
| 13 | +# CONFIG_SHMEM is not set | |
| 14 | +# CONFIG_VM_EVENT_COUNTERS is not set | |
| 15 | +CONFIG_SLOB=y | |
| 16 | +CONFIG_PROFILING=y | |
| 17 | +CONFIG_OPROFILE=y | |
| 18 | +CONFIG_MODULES=y | |
| 19 | +CONFIG_MODULE_UNLOAD=y | |
| 20 | +CONFIG_MODULE_FORCE_UNLOAD=y | |
| 21 | +# CONFIG_LBDAF is not set | |
| 22 | +# CONFIG_BLK_DEV_BSG is not set | |
| 23 | +# CONFIG_IOSCHED_DEADLINE is not set | |
| 24 | +# CONFIG_IOSCHED_CFQ is not set | |
| 25 | +CONFIG_ARCH_OMAP=y | |
| 26 | +CONFIG_ARCH_OMAP1=y | |
| 27 | +CONFIG_OMAP_RESET_CLOCKS=y | |
| 28 | +# CONFIG_OMAP_MUX is not set | |
| 29 | +CONFIG_OMAP_MBOX_FWK=y | |
| 30 | +CONFIG_OMAP_32K_TIMER=y | |
| 31 | +CONFIG_OMAP_DM_TIMER=y | |
| 32 | +CONFIG_ARCH_OMAP730=y | |
| 33 | +CONFIG_ARCH_OMAP850=y | |
| 34 | +CONFIG_ARCH_OMAP16XX=y | |
| 35 | +CONFIG_MACH_OMAP_INNOVATOR=y | |
| 36 | +CONFIG_MACH_OMAP_H2=y | |
| 37 | +CONFIG_MACH_OMAP_H3=y | |
| 38 | +CONFIG_MACH_OMAP_HTCWIZARD=y | |
| 39 | +CONFIG_MACH_HERALD=y | |
| 40 | +CONFIG_MACH_OMAP_OSK=y | |
| 41 | +CONFIG_MACH_OMAP_PERSEUS2=y | |
| 42 | +CONFIG_MACH_OMAP_FSAMPLE=y | |
| 43 | +CONFIG_MACH_VOICEBLUE=y | |
| 44 | +CONFIG_MACH_OMAP_PALMTE=y | |
| 45 | +CONFIG_MACH_OMAP_PALMZ71=y | |
| 46 | +CONFIG_MACH_OMAP_PALMTT=y | |
| 47 | +CONFIG_MACH_SX1=y | |
| 48 | +CONFIG_MACH_NOKIA770=y | |
| 49 | +CONFIG_MACH_AMS_DELTA=y | |
| 50 | +CONFIG_MACH_OMAP_GENERIC=y | |
| 51 | +CONFIG_OMAP_CLOCKS_SET_BY_BOOTLOADER=y | |
| 52 | +CONFIG_OMAP_ARM_216MHZ=y | |
| 53 | +CONFIG_OMAP_ARM_195MHZ=y | |
| 54 | +CONFIG_OMAP_ARM_192MHZ=y | |
| 55 | +CONFIG_OMAP_ARM_182MHZ=y | |
| 56 | +CONFIG_OMAP_ARM_168MHZ=y | |
| 57 | +# CONFIG_OMAP_ARM_60MHZ is not set | |
| 58 | +# CONFIG_ARM_THUMB is not set | |
| 59 | +CONFIG_PCCARD=y | |
| 60 | +CONFIG_OMAP_CF=y | |
| 61 | +CONFIG_NO_HZ=y | |
| 62 | +CONFIG_HIGH_RES_TIMERS=y | |
| 63 | +CONFIG_PREEMPT=y | |
| 64 | +CONFIG_AEABI=y | |
| 65 | +CONFIG_LEDS=y | |
| 66 | +CONFIG_LEDS_CPU=y | |
| 67 | +CONFIG_ZBOOT_ROM_TEXT=0x0 | |
| 68 | +CONFIG_ZBOOT_ROM_BSS=0x0 | |
| 69 | +CONFIG_CMDLINE="root=1f03 rootfstype=jffs2" | |
| 70 | +CONFIG_FPE_NWFPE=y | |
| 71 | +CONFIG_BINFMT_MISC=y | |
| 72 | +CONFIG_PM=y | |
| 73 | +# CONFIG_SUSPEND is not set | |
| 74 | +CONFIG_PM_RUNTIME=y | |
| 75 | +CONFIG_NET=y | |
| 76 | +CONFIG_PACKET=y | |
| 77 | +CONFIG_UNIX=y | |
| 78 | +CONFIG_NET_KEY=y | |
| 79 | +CONFIG_INET=y | |
| 80 | +CONFIG_IP_MULTICAST=y | |
| 81 | +CONFIG_IP_PNP=y | |
| 82 | +CONFIG_IP_PNP_DHCP=y | |
| 83 | +CONFIG_IP_PNP_BOOTP=y | |
| 84 | +# CONFIG_INET_XFRM_MODE_TRANSPORT is not set | |
| 85 | +# CONFIG_INET_XFRM_MODE_TUNNEL is not set | |
| 86 | +# CONFIG_INET_XFRM_MODE_BEET is not set | |
| 87 | +# CONFIG_INET_LRO is not set | |
| 88 | +# CONFIG_INET_DIAG is not set | |
| 89 | +CONFIG_IPV6=y | |
| 90 | +CONFIG_NETFILTER=y | |
| 91 | +CONFIG_BT=y | |
| 92 | +CONFIG_BT_L2CAP=y | |
| 93 | +CONFIG_BT_SCO=y | |
| 94 | +CONFIG_BT_RFCOMM=y | |
| 95 | +CONFIG_BT_RFCOMM_TTY=y | |
| 96 | +CONFIG_BT_BNEP=y | |
| 97 | +CONFIG_BT_HIDP=y | |
| 98 | +CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | |
| 99 | +# CONFIG_STANDALONE is not set | |
| 100 | +# CONFIG_PREVENT_FIRMWARE_BUILD is not set | |
| 101 | +CONFIG_CONNECTOR=y | |
| 102 | +# CONFIG_PROC_EVENTS is not set | |
| 103 | +CONFIG_MTD=y | |
| 104 | +CONFIG_MTD_DEBUG=y | |
| 105 | +CONFIG_MTD_DEBUG_VERBOSE=3 | |
| 106 | +CONFIG_MTD_PARTITIONS=y | |
| 107 | +CONFIG_MTD_CMDLINE_PARTS=y | |
| 108 | +CONFIG_MTD_CHAR=y | |
| 109 | +CONFIG_MTD_BLOCK=y | |
| 110 | +CONFIG_MTD_CFI=y | |
| 111 | +CONFIG_MTD_CFI_INTELEXT=y | |
| 112 | +CONFIG_MTD_NAND=y | |
| 113 | +CONFIG_BLK_DEV_LOOP=y | |
| 114 | +CONFIG_BLK_DEV_RAM=y | |
| 115 | +CONFIG_BLK_DEV_RAM_COUNT=2 | |
| 116 | +CONFIG_BLK_DEV_RAM_SIZE=8192 | |
| 117 | +CONFIG_IDE=m | |
| 118 | +CONFIG_BLK_DEV_IDECS=m | |
| 119 | +CONFIG_SCSI=y | |
| 120 | +# CONFIG_SCSI_PROC_FS is not set | |
| 121 | +CONFIG_BLK_DEV_SD=y | |
| 122 | +CONFIG_CHR_DEV_ST=y | |
| 123 | +CONFIG_BLK_DEV_SR=y | |
| 124 | +CONFIG_CHR_DEV_SG=y | |
| 125 | +CONFIG_SCSI_MULTI_LUN=y | |
| 126 | +CONFIG_NETDEVICES=y | |
| 127 | +CONFIG_TUN=y | |
| 128 | +CONFIG_PHYLIB=y | |
| 129 | +CONFIG_NET_ETHERNET=y | |
| 130 | +CONFIG_SMC91X=y | |
| 131 | +CONFIG_USB_CATC=y | |
| 132 | +CONFIG_USB_KAWETH=y | |
| 133 | +CONFIG_USB_PEGASUS=y | |
| 134 | +CONFIG_USB_RTL8150=y | |
| 135 | +CONFIG_USB_USBNET=y | |
| 136 | +# CONFIG_USB_NET_AX8817X is not set | |
| 137 | +# CONFIG_USB_NET_CDC_SUBSET is not set | |
| 138 | +CONFIG_PPP=y | |
| 139 | +CONFIG_PPP_MULTILINK=y | |
| 140 | +CONFIG_PPP_FILTER=y | |
| 141 | +CONFIG_PPP_ASYNC=y | |
| 142 | +CONFIG_PPP_DEFLATE=y | |
| 143 | +CONFIG_PPP_BSDCOMP=y | |
| 144 | +CONFIG_SLIP=y | |
| 145 | +CONFIG_SLIP_COMPRESSED=y | |
| 146 | +# CONFIG_INPUT_MOUSEDEV is not set | |
| 147 | +CONFIG_INPUT_EVDEV=y | |
| 148 | +CONFIG_INPUT_EVBUG=y | |
| 149 | +# CONFIG_INPUT_KEYBOARD is not set | |
| 150 | +# CONFIG_INPUT_MOUSE is not set | |
| 151 | +CONFIG_INPUT_TOUCHSCREEN=y | |
| 152 | +CONFIG_TOUCHSCREEN_ADS7846=y | |
| 153 | +CONFIG_INPUT_MISC=y | |
| 154 | +CONFIG_INPUT_UINPUT=y | |
| 155 | +# CONFIG_SERIO is not set | |
| 156 | +CONFIG_SERIAL_8250=y | |
| 157 | +CONFIG_SERIAL_8250_CONSOLE=y | |
| 158 | +CONFIG_SERIAL_8250_NR_UARTS=3 | |
| 159 | +CONFIG_SERIAL_8250_RUNTIME_UARTS=3 | |
| 160 | +# CONFIG_LEGACY_PTYS is not set | |
| 161 | +CONFIG_HW_RANDOM=y | |
| 162 | +CONFIG_I2C=y | |
| 163 | +CONFIG_I2C_CHARDEV=y | |
| 164 | +CONFIG_SPI=y | |
| 165 | +CONFIG_SPI_OMAP_UWIRE=y | |
| 166 | +# CONFIG_HWMON is not set | |
| 167 | +CONFIG_WATCHDOG=y | |
| 168 | +CONFIG_WATCHDOG_NOWAYOUT=y | |
| 169 | +CONFIG_OMAP_WATCHDOG=y | |
| 170 | +CONFIG_VIDEO_OUTPUT_CONTROL=y | |
| 171 | +CONFIG_FB=y | |
| 172 | +CONFIG_FIRMWARE_EDID=y | |
| 173 | +CONFIG_FB_MODE_HELPERS=y | |
| 174 | +CONFIG_FB_VIRTUAL=y | |
| 175 | +CONFIG_FB_OMAP=y | |
| 176 | +CONFIG_FB_OMAP_LCDC_EXTERNAL=y | |
| 177 | +CONFIG_FB_OMAP_LCDC_HWA742=y | |
| 178 | +CONFIG_FB_OMAP_MANUAL_UPDATE=y | |
| 179 | +CONFIG_FB_OMAP_LCD_MIPID=y | |
| 180 | +CONFIG_FB_OMAP_BOOTLOADER_INIT=y | |
| 181 | +CONFIG_BACKLIGHT_LCD_SUPPORT=y | |
| 182 | +CONFIG_LCD_CLASS_DEVICE=y | |
| 183 | +CONFIG_FRAMEBUFFER_CONSOLE=y | |
| 184 | +CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y | |
| 185 | +CONFIG_FONTS=y | |
| 186 | +CONFIG_FONT_8x8=y | |
| 187 | +CONFIG_FONT_8x16=y | |
| 188 | +CONFIG_FONT_6x11=y | |
| 189 | +CONFIG_FONT_MINI_4x6=y | |
| 190 | +CONFIG_LOGO=y | |
| 191 | +# CONFIG_LOGO_LINUX_MONO is not set | |
| 192 | +# CONFIG_LOGO_LINUX_VGA16 is not set | |
| 193 | +CONFIG_SOUND=y | |
| 194 | +CONFIG_SND=y | |
| 195 | +CONFIG_SND_MIXER_OSS=y | |
| 196 | +CONFIG_SND_PCM_OSS=y | |
| 197 | +# CONFIG_SND_SUPPORT_OLD_API is not set | |
| 198 | +# CONFIG_SND_VERBOSE_PROCFS is not set | |
| 199 | +CONFIG_SND_DUMMY=y | |
| 200 | +CONFIG_SND_USB_AUDIO=y | |
| 201 | +CONFIG_SND_SOC=y | |
| 202 | +CONFIG_SND_OMAP_SOC=y | |
| 203 | +# CONFIG_USB_HID is not set | |
| 204 | +CONFIG_USB=y | |
| 205 | +CONFIG_USB_DEBUG=y | |
| 206 | +CONFIG_USB_DEVICEFS=y | |
| 207 | +# CONFIG_USB_DEVICE_CLASS is not set | |
| 208 | +CONFIG_USB_SUSPEND=y | |
| 209 | +CONFIG_USB_MON=y | |
| 210 | +CONFIG_USB_OHCI_HCD=y | |
| 211 | +CONFIG_USB_STORAGE=y | |
| 212 | +CONFIG_USB_STORAGE_DATAFAB=y | |
| 213 | +CONFIG_USB_STORAGE_FREECOM=y | |
| 214 | +CONFIG_USB_STORAGE_SDDR09=y | |
| 215 | +CONFIG_USB_STORAGE_SDDR55=y | |
| 216 | +CONFIG_USB_STORAGE_JUMPSHOT=y | |
| 217 | +CONFIG_USB_SERIAL=y | |
| 218 | +CONFIG_USB_SERIAL_CONSOLE=y | |
| 219 | +CONFIG_USB_SERIAL_PL2303=y | |
| 220 | +CONFIG_USB_TEST=y | |
| 221 | +CONFIG_USB_GADGET=y | |
| 222 | +CONFIG_USB_ETH=m | |
| 223 | +# CONFIG_USB_ETH_RNDIS is not set | |
| 224 | +CONFIG_USB_FILE_STORAGE=m | |
| 225 | +CONFIG_USB_FILE_STORAGE_TEST=y | |
| 226 | +CONFIG_MMC=y | |
| 227 | +CONFIG_MMC_SDHCI=y | |
| 228 | +CONFIG_MMC_SDHCI_PLTFM=y | |
| 229 | +CONFIG_MMC_OMAP=y | |
| 230 | +CONFIG_NEW_LEDS=y | |
| 231 | +CONFIG_LEDS_CLASS=y | |
| 232 | +CONFIG_LEDS_TRIGGERS=y | |
| 233 | +CONFIG_LEDS_TRIGGER_TIMER=y | |
| 234 | +CONFIG_LEDS_TRIGGER_HEARTBEAT=y | |
| 235 | +CONFIG_LEDS_TRIGGER_DEFAULT_ON=y | |
| 236 | +CONFIG_RTC_CLASS=y | |
| 237 | +CONFIG_RTC_DRV_OMAP=y | |
| 238 | +CONFIG_EXT2_FS=y | |
| 239 | +CONFIG_EXT3_FS=y | |
| 240 | +# CONFIG_DNOTIFY is not set | |
| 241 | +CONFIG_AUTOFS4_FS=y | |
| 242 | +CONFIG_ISO9660_FS=y | |
| 243 | +CONFIG_JOLIET=y | |
| 244 | +CONFIG_MSDOS_FS=y | |
| 245 | +CONFIG_VFAT_FS=y | |
| 246 | +CONFIG_FAT_DEFAULT_CODEPAGE=866 | |
| 247 | +CONFIG_FAT_DEFAULT_IOCHARSET="koi8-r" | |
| 248 | +CONFIG_JFFS2_FS=y | |
| 249 | +CONFIG_JFFS2_SUMMARY=y | |
| 250 | +CONFIG_JFFS2_COMPRESSION_OPTIONS=y | |
| 251 | +CONFIG_CRAMFS=y | |
| 252 | +CONFIG_ROMFS_FS=y | |
| 253 | +CONFIG_NFS_FS=y | |
| 254 | +CONFIG_NFS_V3=y | |
| 255 | +CONFIG_NFS_V4=y | |
| 256 | +CONFIG_ROOT_NFS=y | |
| 257 | +CONFIG_PARTITION_ADVANCED=y | |
| 258 | +CONFIG_NLS_CODEPAGE_437=y | |
| 259 | +CONFIG_NLS_CODEPAGE_850=y | |
| 260 | +CONFIG_NLS_CODEPAGE_852=y | |
| 261 | +CONFIG_NLS_CODEPAGE_866=y | |
| 262 | +CONFIG_NLS_CODEPAGE_1251=y | |
| 263 | +CONFIG_NLS_ISO8859_1=y | |
| 264 | +CONFIG_NLS_ISO8859_2=y | |
| 265 | +CONFIG_NLS_ISO8859_5=y | |
| 266 | +CONFIG_NLS_ISO8859_15=y | |
| 267 | +CONFIG_NLS_KOI8_R=y | |
| 268 | +CONFIG_NLS_UTF8=y | |
| 269 | +# CONFIG_ENABLE_MUST_CHECK is not set | |
| 270 | +CONFIG_MAGIC_SYSRQ=y | |
| 271 | +CONFIG_DEBUG_KERNEL=y | |
| 272 | +CONFIG_DEBUG_SPINLOCK=y | |
| 273 | +CONFIG_DEBUG_MUTEXES=y | |
| 274 | +# CONFIG_DEBUG_BUGVERBOSE is not set | |
| 275 | +CONFIG_DEBUG_INFO=y | |
| 276 | +# CONFIG_RCU_CPU_STALL_DETECTOR is not set | |
| 277 | +CONFIG_DEBUG_USER=y | |
| 278 | +CONFIG_DEBUG_ERRORS=y | |
| 279 | +CONFIG_SECURITY=y | |
| 280 | +CONFIG_CRYPTO_ECB=y | |
| 281 | +CONFIG_CRYPTO_PCBC=y | |
| 282 | +CONFIG_CRYPTO_DEFLATE=y | |
| 283 | +CONFIG_CRYPTO_ZLIB=y | |
| 284 | +CONFIG_CRYPTO_LZO=y | |
| 285 | +# CONFIG_CRYPTO_ANSI_CPRNG is not set | |
| 286 | +CONFIG_LIBCRC32C=y | |
| @@ -6,7 +6,7 @@ CONFIG_IKCONFIG=y · 5 unmodified lines | ||
| 6 | 6 | CONFIG_IKCONFIG_PROC=y |
| 7 | 7 | CONFIG_LOG_BUF_SHIFT=16 |
| 8 | 8 | CONFIG_BLK_DEV_INITRD=y |
| 9 | −CONFIG_EMBEDDED=y | |
| 9 | +CONFIG_EXPERT=y | |
| 10 | 10 | # CONFIG_SYSCTL_SYSCALL is not set |
| 11 | 11 | CONFIG_KALLSYMS_EXTRA_PASS=y |
| 12 | 12 | CONFIG_SLAB=y |
| @@ -1,84 +0,0 @@ | ||
| 1 | −CONFIG_EXPERIMENTAL=y | |
| 2 | −CONFIG_SYSVIPC=y | |
| 3 | −CONFIG_LOG_BUF_SHIFT=14 | |
| 4 | −CONFIG_BLK_DEV_INITRD=y | |
| 5 | −CONFIG_SLAB=y | |
| 6 | −CONFIG_MODULES=y | |
| 7 | −CONFIG_MODULE_UNLOAD=y | |
| 8 | −CONFIG_MODULE_FORCE_UNLOAD=y | |
| 9 | −# CONFIG_BLK_DEV_BSG is not set | |
| 10 | −CONFIG_ARCH_OMAP=y | |
| 11 | −CONFIG_ARCH_OMAP1=y | |
| 12 | −CONFIG_MACH_OMAP_GENERIC=y | |
| 13 | −CONFIG_OMAP_ARM_168MHZ=y | |
| 14 | −# CONFIG_OMAP_ARM_60MHZ is not set | |
| 15 | −# CONFIG_ARM_THUMB is not set | |
| 16 | −CONFIG_PREEMPT=y | |
| 17 | −CONFIG_ZBOOT_ROM_TEXT=0x0 | |
| 18 | −CONFIG_ZBOOT_ROM_BSS=0x0 | |
| 19 | −CONFIG_CMDLINE="mem=64M console=ttyS2,115200 root=0803 ro init=/bin/sh" | |
| 20 | −CONFIG_FPE_NWFPE=y | |
| 21 | −CONFIG_PM=y | |
| 22 | −CONFIG_NET=y | |
| 23 | −CONFIG_PACKET=y | |
| 24 | −CONFIG_UNIX=y | |
| 25 | −CONFIG_INET=y | |
| 26 | −CONFIG_IP_MULTICAST=y | |
| 27 | −CONFIG_IP_PNP=y | |
| 28 | −CONFIG_IP_PNP_DHCP=y | |
| 29 | −CONFIG_IP_PNP_BOOTP=y | |
| 30 | −# CONFIG_IPV6 is not set | |
| 31 | −CONFIG_BLK_DEV_LOOP=y | |
| 32 | −CONFIG_BLK_DEV_RAM=y | |
| 33 | −CONFIG_BLK_DEV_RAM_SIZE=8192 | |
| 34 | −CONFIG_SCSI=y | |
| 35 | −CONFIG_BLK_DEV_SD=y | |
| 36 | −CONFIG_BLK_DEV_SR=y | |
| 37 | −CONFIG_CHR_DEV_SG=y | |
| 38 | −CONFIG_SCSI_MULTI_LUN=y | |
| 39 | −CONFIG_NETDEVICES=y | |
| 40 | −CONFIG_NET_ETHERNET=y | |
| 41 | −CONFIG_USB_RTL8150=y | |
| 42 | −CONFIG_USB_USBNET=y | |
| 43 | −CONFIG_USB_AN2720=y | |
| 44 | −CONFIG_USB_EPSON2888=y | |
| 45 | −CONFIG_PPP=y | |
| 46 | −CONFIG_PPP_MULTILINK=y | |
| 47 | −CONFIG_KEYBOARD_OMAP=y | |
| 48 | −# CONFIG_INPUT_MOUSE is not set | |
| 49 | −CONFIG_SERIAL_8250=y | |
| 50 | −CONFIG_SERIAL_8250_CONSOLE=y | |
| 51 | −# CONFIG_LEGACY_PTYS is not set | |
| 52 | −CONFIG_I2C=y | |
| 53 | −CONFIG_I2C_CHARDEV=y | |
| 54 | −CONFIG_VIDEO_OUTPUT_CONTROL=m | |
| 55 | −# CONFIG_VGA_CONSOLE is not set | |
| 56 | −CONFIG_USB=y | |
| 57 | −CONFIG_USB_DEBUG=y | |
| 58 | −CONFIG_USB_DEVICEFS=y | |
| 59 | −# CONFIG_USB_DEVICE_CLASS is not set | |
| 60 | −CONFIG_USB_MON=y | |
| 61 | −CONFIG_USB_OHCI_HCD=y | |
| 62 | −CONFIG_USB_STORAGE=y | |
| 63 | −CONFIG_USB_STORAGE_DATAFAB=y | |
| 64 | −CONFIG_USB_STORAGE_FREECOM=y | |
| 65 | −CONFIG_USB_STORAGE_SDDR09=y | |
| 66 | −CONFIG_USB_STORAGE_SDDR55=y | |
| 67 | −CONFIG_USB_STORAGE_JUMPSHOT=y | |
| 68 | −CONFIG_MMC=y | |
| 69 | −CONFIG_MMC_OMAP=y | |
| 70 | −CONFIG_RTC_CLASS=y | |
| 71 | −CONFIG_RTC_DRV_OMAP=y | |
| 72 | −CONFIG_EXT2_FS=y | |
| 73 | −CONFIG_EXT3_FS=y | |
| 74 | −CONFIG_INOTIFY=y | |
| 75 | −CONFIG_AUTOFS_FS=y | |
| 76 | −CONFIG_AUTOFS4_FS=y | |
| 77 | −CONFIG_ISO9660_FS=y | |
| 78 | −CONFIG_JOLIET=y | |
| 79 | −CONFIG_MSDOS_FS=m | |
| 80 | −CONFIG_VFAT_FS=m | |
| 81 | −CONFIG_NFS_FS=y | |
| 82 | −CONFIG_PARTITION_ADVANCED=y | |
| 83 | −CONFIG_MAGIC_SYSRQ=y | |
| 84 | −CONFIG_DEBUG_KERNEL=y | |
| @@ -1,87 +0,0 @@ | ||
| 1 | −CONFIG_EXPERIMENTAL=y | |
| 2 | −CONFIG_SYSVIPC=y | |
| 3 | −CONFIG_LOG_BUF_SHIFT=14 | |
| 4 | −CONFIG_BLK_DEV_INITRD=y | |
| 5 | −CONFIG_SLAB=y | |
| 6 | −CONFIG_MODULES=y | |
| 7 | −CONFIG_MODULE_UNLOAD=y | |
| 8 | −CONFIG_MODULE_FORCE_UNLOAD=y | |
| 9 | −# CONFIG_BLK_DEV_BSG is not set | |
| 10 | −CONFIG_ARCH_OMAP=y | |
| 11 | −CONFIG_ARCH_OMAP1=y | |
| 12 | −# CONFIG_ARCH_OMAP15XX is not set | |
| 13 | −CONFIG_ARCH_OMAP16XX=y | |
| 14 | −CONFIG_MACH_OMAP_GENERIC=y | |
| 15 | −CONFIG_OMAP_ARM_192MHZ=y | |
| 16 | −# CONFIG_OMAP_ARM_60MHZ is not set | |
| 17 | −# CONFIG_ARM_THUMB is not set | |
| 18 | −CONFIG_PREEMPT=y | |
| 19 | −CONFIG_ZBOOT_ROM_TEXT=0x0 | |
| 20 | −CONFIG_ZBOOT_ROM_BSS=0x0 | |
| 21 | −CONFIG_CMDLINE="mem=64M console=ttyS2,115200 root=0803 ro init=/bin/sh" | |
| 22 | −CONFIG_FPE_NWFPE=y | |
| 23 | −CONFIG_PM=y | |
| 24 | −CONFIG_NET=y | |
| 25 | −CONFIG_PACKET=y | |
| 26 | −CONFIG_UNIX=y | |
| 27 | −CONFIG_INET=y | |
| 28 | −CONFIG_IP_MULTICAST=y | |
| 29 | −CONFIG_IP_PNP=y | |
| 30 | −CONFIG_IP_PNP_DHCP=y | |
| 31 | −CONFIG_IP_PNP_BOOTP=y | |
| 32 | −# CONFIG_IPV6 is not set | |
| 33 | −CONFIG_BLK_DEV_LOOP=y | |
| 34 | −CONFIG_BLK_DEV_RAM=y | |
| 35 | −CONFIG_BLK_DEV_RAM_SIZE=8192 | |
| 36 | −CONFIG_SCSI=y | |
| 37 | −CONFIG_BLK_DEV_SD=y | |
| 38 | −CONFIG_BLK_DEV_SR=y | |
| 39 | −CONFIG_CHR_DEV_SG=y | |
| 40 | −CONFIG_SCSI_MULTI_LUN=y | |
| 41 | −CONFIG_NETDEVICES=y | |
| 42 | −CONFIG_NET_ETHERNET=y | |
| 43 | −CONFIG_USB_RTL8150=y | |
| 44 | −CONFIG_USB_USBNET=y | |
| 45 | −CONFIG_USB_ALI_M5632=y | |
| 46 | −CONFIG_USB_AN2720=y | |
| 47 | −CONFIG_USB_EPSON2888=y | |
| 48 | −CONFIG_PPP=y | |
| 49 | −CONFIG_PPP_MULTILINK=y | |
| 50 | −CONFIG_KEYBOARD_OMAP=y | |
| 51 | −# CONFIG_INPUT_MOUSE is not set | |
| 52 | −CONFIG_SERIAL_8250=y | |
| 53 | −CONFIG_SERIAL_8250_CONSOLE=y | |
| 54 | −# CONFIG_LEGACY_PTYS is not set | |
| 55 | −CONFIG_I2C=y | |
| 56 | −CONFIG_I2C_CHARDEV=y | |
| 57 | −CONFIG_VIDEO_OUTPUT_CONTROL=m | |
| 58 | −# CONFIG_VGA_CONSOLE is not set | |
| 59 | −CONFIG_USB=y | |
| 60 | −CONFIG_USB_DEBUG=y | |
| 61 | −CONFIG_USB_DEVICEFS=y | |
| 62 | −# CONFIG_USB_DEVICE_CLASS is not set | |
| 63 | −CONFIG_USB_MON=y | |
| 64 | −CONFIG_USB_OHCI_HCD=y | |
| 65 | −CONFIG_USB_STORAGE=y | |
| 66 | −CONFIG_USB_STORAGE_DATAFAB=y | |
| 67 | −CONFIG_USB_STORAGE_FREECOM=y | |
| 68 | −CONFIG_USB_STORAGE_SDDR09=y | |
| 69 | −CONFIG_USB_STORAGE_SDDR55=y | |
| 70 | −CONFIG_USB_STORAGE_JUMPSHOT=y | |
| 71 | −CONFIG_MMC=y | |
| 72 | −CONFIG_MMC_OMAP=y | |
| 73 | −CONFIG_RTC_CLASS=y | |
| 74 | −CONFIG_RTC_DRV_OMAP=y | |
| 75 | −CONFIG_EXT2_FS=y | |
| 76 | −CONFIG_EXT3_FS=y | |
| 77 | −CONFIG_INOTIFY=y | |
| 78 | −CONFIG_AUTOFS_FS=y | |
| 79 | −CONFIG_AUTOFS4_FS=y | |
| 80 | −CONFIG_ISO9660_FS=y | |
| 81 | −CONFIG_JOLIET=y | |
| 82 | −CONFIG_MSDOS_FS=m | |
| 83 | −CONFIG_VFAT_FS=m | |
| 84 | −CONFIG_NFS_FS=y | |
| 85 | −CONFIG_PARTITION_ADVANCED=y | |
| 86 | −CONFIG_MAGIC_SYSRQ=y | |
| 87 | −CONFIG_DEBUG_KERNEL=y | |
| @@ -1,75 +0,0 @@ | ||
| 1 | −CONFIG_EXPERIMENTAL=y | |
| 2 | −CONFIG_SYSVIPC=y | |
| 3 | −CONFIG_LOG_BUF_SHIFT=14 | |
| 4 | −CONFIG_BLK_DEV_INITRD=y | |
| 5 | −# CONFIG_BLK_DEV_BSG is not set | |
| 6 | −CONFIG_ARCH_OMAP=y | |
| 7 | −CONFIG_ARCH_OMAP1=y | |
| 8 | −# CONFIG_OMAP_MUX is not set | |
| 9 | −# CONFIG_ARCH_OMAP15XX is not set | |
| 10 | −CONFIG_ARCH_OMAP16XX=y | |
| 11 | −CONFIG_MACH_OMAP_GENERIC=y | |
| 12 | −CONFIG_OMAP_ARM_192MHZ=y | |
| 13 | −# CONFIG_OMAP_ARM_60MHZ is not set | |
| 14 | −# CONFIG_ARM_THUMB is not set | |
| 15 | −CONFIG_ZBOOT_ROM_TEXT=0x0 | |
| 16 | −CONFIG_ZBOOT_ROM_BSS=0x0 | |
| 17 | −CONFIG_CMDLINE="mem=64M console=tty0 console=ttyS2,115200 root=0801" | |
| 18 | −CONFIG_FPE_NWFPE=y | |
| 19 | −CONFIG_ARTHUR=y | |
| 20 | −CONFIG_PM=y | |
| 21 | −CONFIG_NET=y | |
| 22 | −CONFIG_PACKET=y | |
| 23 | −CONFIG_UNIX=y | |
| 24 | −CONFIG_INET=y | |
| 25 | −CONFIG_IP_MULTICAST=y | |
| 26 | −CONFIG_IP_PNP=y | |
| 27 | −CONFIG_IP_PNP_DHCP=y | |
| 28 | −CONFIG_IP_PNP_BOOTP=y | |
| 29 | −# CONFIG_IPV6 is not set | |
| 30 | −CONFIG_BLK_DEV_LOOP=y | |
| 31 | −CONFIG_BLK_DEV_RAM=y | |
| 32 | −CONFIG_BLK_DEV_RAM_SIZE=8192 | |
| 33 | −CONFIG_SCSI=y | |
| 34 | −CONFIG_BLK_DEV_SD=y | |
| 35 | −CONFIG_NETDEVICES=y | |
| 36 | −CONFIG_NET_ETHERNET=y | |
| 37 | −CONFIG_USB_USBNET=y | |
| 38 | −CONFIG_USB_ALI_M5632=y | |
| 39 | −# CONFIG_USB_BELKIN is not set | |
| 40 | −# CONFIG_USB_ARMLINUX is not set | |
| 41 | −CONFIG_PPP=y | |
| 42 | −CONFIG_INPUT_EVDEV=y | |
| 43 | −CONFIG_KEYBOARD_OMAP=y | |
| 44 | −# CONFIG_INPUT_MOUSE is not set | |
| 45 | −CONFIG_SERIAL_8250=y | |
| 46 | −CONFIG_SERIAL_8250_CONSOLE=y | |
| 47 | −CONFIG_VIDEO_OUTPUT_CONTROL=y | |
| 48 | −# CONFIG_VGA_CONSOLE is not set | |
| 49 | −CONFIG_USB=y | |
| 50 | −CONFIG_USB_DEBUG=y | |
| 51 | −CONFIG_USB_DEVICEFS=y | |
| 52 | −CONFIG_USB_MON=y | |
| 53 | −CONFIG_USB_OHCI_HCD=y | |
| 54 | −CONFIG_USB_STORAGE=y | |
| 55 | −CONFIG_MMC=y | |
| 56 | −CONFIG_MMC_OMAP=y | |
| 57 | −CONFIG_EXT2_FS=y | |
| 58 | −CONFIG_EXT3_FS=y | |
| 59 | −CONFIG_INOTIFY=y | |
| 60 | −CONFIG_TMPFS=y | |
| 61 | −CONFIG_NFS_FS=y | |
| 62 | −CONFIG_NFS_V3=y | |
| 63 | −CONFIG_NFS_V4=y | |
| 64 | −CONFIG_PARTITION_ADVANCED=y | |
| 65 | −CONFIG_NLS_CODEPAGE_437=y | |
| 66 | −CONFIG_NLS_CODEPAGE_852=y | |
| 67 | −CONFIG_NLS_ISO8859_1=y | |
| 68 | −CONFIG_NLS_ISO8859_15=y | |
| 69 | −CONFIG_MAGIC_SYSRQ=y | |
| 70 | −CONFIG_DEBUG_KERNEL=y | |
| 71 | −CONFIG_DEBUG_SPINLOCK=y | |
| 72 | −CONFIG_DEBUG_ERRORS=y | |
| 73 | −CONFIG_SECURITY=y | |
| 74 | −CONFIG_CRYPTO_ECB=y | |
| 75 | −CONFIG_CRYPTO_PCBC=y | |
| @@ -1,109 +0,0 @@ | ||
| 1 | −CONFIG_EXPERIMENTAL=y | |
| 2 | −CONFIG_SYSVIPC=y | |
| 3 | −CONFIG_LOG_BUF_SHIFT=14 | |
| 4 | −CONFIG_BLK_DEV_INITRD=y | |
| 5 | −CONFIG_SLAB=y | |
| 6 | −CONFIG_MODULES=y | |
| 7 | −CONFIG_MODULE_UNLOAD=y | |
| 8 | −# CONFIG_BLK_DEV_BSG is not set | |
| 9 | −CONFIG_ARCH_OMAP=y | |
| 10 | −CONFIG_ARCH_OMAP1=y | |
| 11 | −CONFIG_OMAP_MUX_DEBUG=y | |
| 12 | −CONFIG_OMAP_32K_TIMER=y | |
| 13 | −CONFIG_OMAP_DM_TIMER=y | |
| 14 | −# CONFIG_ARCH_OMAP15XX is not set | |
| 15 | −CONFIG_ARCH_OMAP16XX=y | |
| 16 | −CONFIG_MACH_OMAP_H2=y | |
| 17 | −CONFIG_NO_HZ=y | |
| 18 | −CONFIG_HIGH_RES_TIMERS=y | |
| 19 | −CONFIG_LEDS=y | |
| 20 | −CONFIG_ZBOOT_ROM_TEXT=0x0 | |
| 21 | −CONFIG_ZBOOT_ROM_BSS=0x0 | |
| 22 | −CONFIG_CMDLINE="mem=32M console=ttyS0,115200n8 root=/dev/ram0 rw initrd=0x10600000,8M ramdisk_size=8192" | |
| 23 | −CONFIG_FPE_NWFPE=y | |
| 24 | −CONFIG_PM=y | |
| 25 | −CONFIG_PM_RUNTIME=y | |
| 26 | −CONFIG_NET=y | |
| 27 | −CONFIG_PACKET=y | |
| 28 | −CONFIG_UNIX=y | |
| 29 | −CONFIG_INET=y | |
| 30 | −CONFIG_IP_PNP=y | |
| 31 | −CONFIG_IP_PNP_DHCP=y | |
| 32 | −CONFIG_IP_PNP_BOOTP=y | |
| 33 | −# CONFIG_INET_LRO is not set | |
| 34 | −# CONFIG_IPV6 is not set | |
| 35 | −CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | |
| 36 | −CONFIG_DEBUG_DRIVER=y | |
| 37 | −CONFIG_MTD=y | |
| 38 | −CONFIG_MTD_DEBUG=y | |
| 39 | −CONFIG_MTD_DEBUG_VERBOSE=3 | |
| 40 | −CONFIG_MTD_PARTITIONS=y | |
| 41 | −CONFIG_MTD_CMDLINE_PARTS=y | |
| 42 | −CONFIG_MTD_CHAR=y | |
| 43 | −CONFIG_MTD_BLOCK=y | |
| 44 | −CONFIG_MTD_CFI=y | |
| 45 | −CONFIG_MTD_CFI_INTELEXT=y | |
| 46 | −CONFIG_BLK_DEV_LOOP=y | |
| 47 | −CONFIG_BLK_DEV_RAM=y | |
| 48 | −CONFIG_BLK_DEV_RAM_SIZE=8192 | |
| 49 | −CONFIG_NETDEVICES=y | |
| 50 | −CONFIG_NET_ETHERNET=y | |
| 51 | −CONFIG_SMC91X=y | |
| 52 | −CONFIG_PPP=y | |
| 53 | −CONFIG_SLIP=y | |
| 54 | −CONFIG_SLIP_COMPRESSED=y | |
| 55 | −CONFIG_INPUT_EVDEV=y | |
| 56 | −CONFIG_INPUT_EVBUG=y | |
| 57 | −# CONFIG_INPUT_KEYBOARD is not set | |
| 58 | −# CONFIG_INPUT_MOUSE is not set | |
| 59 | −CONFIG_INPUT_MISC=y | |
| 60 | −CONFIG_INPUT_UINPUT=y | |
| 61 | −CONFIG_SERIAL_8250=y | |
| 62 | −CONFIG_SERIAL_8250_CONSOLE=y | |
| 63 | −# CONFIG_LEGACY_PTYS is not set | |
| 64 | −CONFIG_I2C=y | |
| 65 | −CONFIG_I2C_OMAP=y | |
| 66 | −CONFIG_SPI=y | |
| 67 | −CONFIG_SPI_OMAP_UWIRE=y | |
| 68 | −CONFIG_WATCHDOG=y | |
| 69 | −CONFIG_WATCHDOG_NOWAYOUT=y | |
| 70 | −CONFIG_VIDEO_OUTPUT_CONTROL=m | |
| 71 | −CONFIG_FB=y | |
| 72 | −CONFIG_FIRMWARE_EDID=y | |
| 73 | −CONFIG_FB_MODE_HELPERS=y | |
| 74 | −CONFIG_FB_OMAP=y | |
| 75 | −# CONFIG_VGA_CONSOLE is not set | |
| 76 | −CONFIG_FRAMEBUFFER_CONSOLE=y | |
| 77 | −CONFIG_LOGO=y | |
| 78 | −# CONFIG_LOGO_LINUX_MONO is not set | |
| 79 | −# CONFIG_LOGO_LINUX_VGA16 is not set | |
| 80 | −# CONFIG_USB_HID is not set | |
| 81 | −CONFIG_USB=y | |
| 82 | −CONFIG_USB_DEVICEFS=y | |
| 83 | −# CONFIG_USB_DEVICE_CLASS is not set | |
| 84 | −CONFIG_USB_SUSPEND=y | |
| 85 | −CONFIG_USB_OTG=y | |
| 86 | −CONFIG_USB_MON=y | |
| 87 | −CONFIG_USB_OHCI_HCD=y | |
| 88 | −CONFIG_USB_TEST=y | |
| 89 | −CONFIG_USB_GADGET=y | |
| 90 | −CONFIG_USB_ETH=m | |
| 91 | −CONFIG_MMC=y | |
| 92 | −CONFIG_MMC_OMAP=y | |
| 93 | −CONFIG_RTC_CLASS=y | |
| 94 | −CONFIG_RTC_DRV_OMAP=y | |
| 95 | −CONFIG_EXT2_FS=y | |
| 96 | −CONFIG_INOTIFY=y | |
| 97 | −CONFIG_MSDOS_FS=y | |
| 98 | −CONFIG_VFAT_FS=y | |
| 99 | −CONFIG_JFFS2_FS=y | |
| 100 | −CONFIG_CRAMFS=y | |
| 101 | −CONFIG_ROMFS_FS=y | |
| 102 | −CONFIG_NFS_FS=y | |
| 103 | −CONFIG_ROOT_NFS=y | |
| 104 | −CONFIG_NLS_CODEPAGE_437=y | |
| 105 | −CONFIG_NLS_ISO8859_1=y | |
| 106 | −CONFIG_DEBUG_KERNEL=y | |
| 107 | −CONFIG_DEBUG_INFO=y | |
| 108 | −CONFIG_DEBUG_USER=y | |
| 109 | −CONFIG_DEBUG_ERRORS=y | |
| @@ -1,102 +0,0 @@ | ||
| 1 | −CONFIG_EXPERIMENTAL=y | |
| 2 | −CONFIG_SYSVIPC=y | |
| 3 | −CONFIG_LOG_BUF_SHIFT=14 | |
| 4 | −CONFIG_BLK_DEV_INITRD=y | |
| 5 | −CONFIG_SLAB=y | |
| 6 | −CONFIG_MODULES=y | |
| 7 | −CONFIG_MODULE_UNLOAD=y | |
| 8 | −# CONFIG_BLK_DEV_BSG is not set | |
| 9 | −CONFIG_ARCH_OMAP=y | |
| 10 | −CONFIG_ARCH_OMAP1=y | |
| 11 | −CONFIG_MACH_OMAP_INNOVATOR=y | |
| 12 | −CONFIG_OMAP_ARM_168MHZ=y | |
| 13 | −# CONFIG_OMAP_ARM_60MHZ is not set | |
| 14 | −CONFIG_PREEMPT=y | |
| 15 | −CONFIG_LEDS=y | |
| 16 | −CONFIG_ZBOOT_ROM_TEXT=0x0 | |
| 17 | −CONFIG_ZBOOT_ROM_BSS=0x0 | |
| 18 | −CONFIG_CMDLINE="console=ttyS0,115200n8 root=/dev/nfs ip=bootp noinitrd" | |
| 19 | −CONFIG_FPE_NWFPE=y | |
| 20 | −CONFIG_PM=y | |
| 21 | −CONFIG_NET=y | |
| 22 | −CONFIG_PACKET=y | |
| 23 | −CONFIG_UNIX=y | |
| 24 | −CONFIG_INET=y | |
| 25 | −CONFIG_IP_MULTICAST=y | |
| 26 | −CONFIG_IP_PNP=y | |
| 27 | −CONFIG_IP_PNP_DHCP=y | |
| 28 | −CONFIG_IP_PNP_BOOTP=y | |
| 29 | −# CONFIG_IPV6 is not set | |
| 30 | −CONFIG_BLK_DEV_LOOP=y | |
| 31 | −CONFIG_BLK_DEV_RAM=y | |
| 32 | −CONFIG_BLK_DEV_RAM_SIZE=8192 | |
| 33 | −CONFIG_SCSI=y | |
| 34 | −CONFIG_BLK_DEV_SD=y | |
| 35 | −CONFIG_CHR_DEV_ST=y | |
| 36 | −CONFIG_BLK_DEV_SR=y | |
| 37 | −CONFIG_CHR_DEV_SG=y | |
| 38 | −CONFIG_SCSI_MULTI_LUN=y | |
| 39 | −CONFIG_NETDEVICES=y | |
| 40 | −CONFIG_NET_ETHERNET=y | |
| 41 | −CONFIG_SMC91X=y | |
| 42 | −CONFIG_USB_RTL8150=y | |
| 43 | −CONFIG_USB_USBNET=y | |
| 44 | −# CONFIG_USB_NET_CDC_SUBSET is not set | |
| 45 | −CONFIG_PPP=y | |
| 46 | −CONFIG_PPP_MULTILINK=y | |
| 47 | −CONFIG_PPP_ASYNC=y | |
| 48 | −CONFIG_PPP_DEFLATE=y | |
| 49 | −CONFIG_PPP_BSDCOMP=y | |
| 50 | −CONFIG_INPUT_MOUSEDEV_SCREEN_X=240 | |
| 51 | −CONFIG_INPUT_MOUSEDEV_SCREEN_Y=320 | |
| 52 | −# CONFIG_KEYBOARD_ATKBD is not set | |
| 53 | −CONFIG_KEYBOARD_OMAP=y | |
| 54 | −# CONFIG_INPUT_MOUSE is not set | |
| 55 | −CONFIG_SERIAL_8250=y | |
| 56 | −CONFIG_SERIAL_8250_CONSOLE=y | |
| 57 | −# CONFIG_LEGACY_PTYS is not set | |
| 58 | −CONFIG_I2C=y | |
| 59 | −CONFIG_VIDEO_OUTPUT_CONTROL=m | |
| 60 | −CONFIG_FB=y | |
| 61 | −CONFIG_FB_OMAP=y | |
| 62 | −# CONFIG_VGA_CONSOLE is not set | |
| 63 | −CONFIG_FRAMEBUFFER_CONSOLE=y | |
| 64 | −CONFIG_FONTS=y | |
| 65 | −CONFIG_FONT_8x8=y | |
| 66 | −CONFIG_FONT_8x16=y | |
| 67 | −CONFIG_LOGO=y | |
| 68 | −CONFIG_USB=y | |
| 69 | −CONFIG_USB_DEBUG=y | |
| 70 | −CONFIG_USB_DEVICEFS=y | |
| 71 | −# CONFIG_USB_DEVICE_CLASS is not set | |
| 72 | −CONFIG_USB_MON=y | |
| 73 | −CONFIG_USB_OHCI_HCD=y | |
| 74 | −CONFIG_USB_STORAGE=y | |
| 75 | −CONFIG_USB_STORAGE_DATAFAB=y | |
| 76 | −CONFIG_USB_STORAGE_FREECOM=y | |
| 77 | −CONFIG_USB_STORAGE_SDDR09=y | |
| 78 | −CONFIG_USB_STORAGE_SDDR55=y | |
| 79 | −CONFIG_USB_STORAGE_JUMPSHOT=y | |
| 80 | −CONFIG_MMC=y | |
| 81 | −CONFIG_MMC_OMAP=y | |
| 82 | −CONFIG_RTC_CLASS=y | |
| 83 | −CONFIG_RTC_DRV_OMAP=y | |
| 84 | −CONFIG_EXT2_FS=y | |
| 85 | −CONFIG_EXT3_FS=y | |
| 86 | −CONFIG_INOTIFY=y | |
| 87 | −CONFIG_AUTOFS_FS=y | |
| 88 | −CONFIG_AUTOFS4_FS=y | |
| 89 | −CONFIG_ISO9660_FS=y | |
| 90 | −CONFIG_JOLIET=y | |
| 91 | −CONFIG_MSDOS_FS=m | |
| 92 | −CONFIG_VFAT_FS=m | |
| 93 | −CONFIG_TMPFS=y | |
| 94 | −CONFIG_NFS_FS=y | |
| 95 | −CONFIG_NFS_V3=y | |
| 96 | −CONFIG_NFS_V4=y | |
| 97 | −CONFIG_ROOT_NFS=y | |
| 98 | −CONFIG_PARTITION_ADVANCED=y | |
| 99 | −CONFIG_MAGIC_SYSRQ=y | |
| 100 | −CONFIG_DEBUG_KERNEL=y | |
| 101 | −CONFIG_CRYPTO_ECB=m | |
| 102 | −CONFIG_CRYPTO_PCBC=m | |
| @@ -1,58 +0,0 @@ | ||
| 1 | −CONFIG_EXPERIMENTAL=y | |
| 2 | −CONFIG_SYSVIPC=y | |
| 3 | −CONFIG_LOG_BUF_SHIFT=14 | |
| 4 | −CONFIG_BLK_DEV_INITRD=y | |
| 5 | −CONFIG_MODULES=y | |
| 6 | −CONFIG_MODULE_UNLOAD=y | |
| 7 | −# CONFIG_BLK_DEV_BSG is not set | |
| 8 | −CONFIG_ARCH_OMAP=y | |
| 9 | −CONFIG_ARCH_OMAP1=y | |
| 10 | −# CONFIG_ARCH_OMAP15XX is not set | |
| 11 | −CONFIG_ARCH_OMAP16XX=y | |
| 12 | −CONFIG_MACH_OMAP_INNOVATOR=y | |
| 13 | −CONFIG_OMAP_ARM_192MHZ=y | |
| 14 | −# CONFIG_OMAP_ARM_60MHZ is not set | |
| 15 | −# CONFIG_ARM_THUMB is not set | |
| 16 | −CONFIG_CPU_DCACHE_WRITETHROUGH=y | |
| 17 | −CONFIG_ZBOOT_ROM_TEXT=0x0 | |
| 18 | −CONFIG_ZBOOT_ROM_BSS=0x0 | |
| 19 | −CONFIG_CMDLINE="mem=32M console=tty0 console=ttyS0,115200 initrd=0x10200000,8M root=/dev/ram0 rw" | |
| 20 | −CONFIG_FPE_NWFPE=y | |
| 21 | −CONFIG_NET=y | |
| 22 | −CONFIG_PACKET=m | |
| 23 | −CONFIG_UNIX=y | |
| 24 | −CONFIG_INET=y | |
| 25 | −CONFIG_IP_MULTICAST=y | |
| 26 | −CONFIG_IP_PNP=y | |
| 27 | −CONFIG_IP_PNP_DHCP=y | |
| 28 | −CONFIG_IP_PNP_BOOTP=y | |
| 29 | −# CONFIG_IPV6 is not set | |
| 30 | −CONFIG_BLK_DEV_LOOP=y | |
| 31 | −CONFIG_BLK_DEV_RAM=y | |
| 32 | −CONFIG_BLK_DEV_RAM_SIZE=8192 | |
| 33 | −CONFIG_NETDEVICES=y | |
| 34 | −CONFIG_NET_ETHERNET=y | |
| 35 | −CONFIG_SMC91X=y | |
| 36 | −CONFIG_PPP=y | |
| 37 | −CONFIG_PPP_MULTILINK=y | |
| 38 | −# CONFIG_KEYBOARD_ATKBD is not set | |
| 39 | −CONFIG_KEYBOARD_OMAP=y | |
| 40 | −# CONFIG_INPUT_MOUSE is not set | |
| 41 | −CONFIG_SERIAL_8250=y | |
| 42 | −CONFIG_SERIAL_8250_CONSOLE=y | |
| 43 | −CONFIG_VIDEO_OUTPUT_CONTROL=m | |
| 44 | −CONFIG_FB=y | |
| 45 | −CONFIG_FB_MODE_HELPERS=y | |
| 46 | −CONFIG_FB_OMAP=y | |
| 47 | −# CONFIG_VGA_CONSOLE is not set | |
| 48 | −CONFIG_FRAMEBUFFER_CONSOLE=y | |
| 49 | −CONFIG_FONTS=y | |
| 50 | −CONFIG_FONT_8x8=y | |
| 51 | −CONFIG_FONT_8x16=y | |
| 52 | −CONFIG_LOGO=y | |
| 53 | −CONFIG_EXT2_FS=y | |
| 54 | −CONFIG_INOTIFY=y | |
| 55 | −CONFIG_AUTOFS_FS=y | |
| 56 | −CONFIG_AUTOFS4_FS=y | |
| 57 | −CONFIG_NFS_FS=y | |
| 58 | −CONFIG_NFS_V3=y | |
| @@ -1,87 +0,0 @@ | ||
| 1 | −CONFIG_EXPERIMENTAL=y | |
| 2 | −CONFIG_SYSVIPC=y | |
| 3 | −CONFIG_LOG_BUF_SHIFT=14 | |
| 4 | −CONFIG_BLK_DEV_INITRD=y | |
| 5 | −CONFIG_MODULES=y | |
| 6 | −CONFIG_MODULE_UNLOAD=y | |
| 7 | −# CONFIG_BLK_DEV_BSG is not set | |
| 8 | −CONFIG_ARCH_OMAP=y | |
| 9 | −CONFIG_ARCH_OMAP1=y | |
| 10 | −CONFIG_OMAP_RESET_CLOCKS=y | |
| 11 | −CONFIG_OMAP_32K_TIMER=y | |
| 12 | −# CONFIG_ARCH_OMAP15XX is not set | |
| 13 | −CONFIG_ARCH_OMAP16XX=y | |
| 14 | −CONFIG_MACH_OMAP_OSK=y | |
| 15 | −CONFIG_OMAP_ARM_192MHZ=y | |
| 16 | −# CONFIG_OMAP_ARM_60MHZ is not set | |
| 17 | −# CONFIG_ARM_THUMB is not set | |
| 18 | −CONFIG_PCCARD=y | |
| 19 | −CONFIG_OMAP_CF=y | |
| 20 | −CONFIG_NO_HZ=y | |
| 21 | −CONFIG_ZBOOT_ROM_TEXT=0x0 | |
| 22 | −CONFIG_ZBOOT_ROM_BSS=0x0 | |
| 23 | −CONFIG_CMDLINE="mem=32M console=ttyS0,115200 initrd=0x10400000,8M root=/dev/ram0 rw" | |
| 24 | −CONFIG_FPE_NWFPE=y | |
| 25 | −CONFIG_PM=y | |
| 26 | −CONFIG_NET=y | |
| 27 | −CONFIG_PACKET=m | |
| 28 | −CONFIG_UNIX=y | |
| 29 | −CONFIG_INET=y | |
| 30 | −CONFIG_IP_MULTICAST=y | |
| 31 | −CONFIG_IP_PNP=y | |
| 32 | −CONFIG_IP_PNP_DHCP=y | |
| 33 | −CONFIG_IP_PNP_BOOTP=y | |
| 34 | −# CONFIG_INET_LRO is not set | |
| 35 | −# CONFIG_IPV6 is not set | |
| 36 | −CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | |
| 37 | −CONFIG_MTD=y | |
| 38 | −CONFIG_MTD_PARTITIONS=y | |
| 39 | −CONFIG_MTD_CMDLINE_PARTS=y | |
| 40 | −CONFIG_MTD_CHAR=y | |
| 41 | −CONFIG_MTD_BLOCK=y | |
| 42 | −CONFIG_MTD_CFI=y | |
| 43 | −CONFIG_MTD_CFI_INTELEXT=y | |
| 44 | −CONFIG_BLK_DEV_LOOP=y | |
| 45 | −CONFIG_BLK_DEV_RAM=y | |
| 46 | −CONFIG_BLK_DEV_RAM_SIZE=8192 | |
| 47 | −CONFIG_IDE=m | |
| 48 | −CONFIG_BLK_DEV_IDECS=m | |
| 49 | −CONFIG_NETDEVICES=y | |
| 50 | −CONFIG_NET_ETHERNET=y | |
| 51 | −CONFIG_SMC91X=y | |
| 52 | −CONFIG_PPP=y | |
| 53 | −CONFIG_PPP_MULTILINK=y | |
| 54 | −# CONFIG_INPUT_MOUSEDEV_PSAUX is not set | |
| 55 | −CONFIG_INPUT_EVDEV=y | |
| 56 | −# CONFIG_KEYBOARD_ATKBD is not set | |
| 57 | −CONFIG_KEYBOARD_OMAP=y | |
| 58 | −# CONFIG_INPUT_MOUSE is not set | |
| 59 | −CONFIG_INPUT_TOUCHSCREEN=y | |
| 60 | −# CONFIG_SERIO is not set | |
| 61 | −CONFIG_SERIAL_8250=y | |
| 62 | −CONFIG_SERIAL_8250_CONSOLE=y | |
| 63 | −CONFIG_I2C=y | |
| 64 | −CONFIG_I2C_CHARDEV=y | |
| 65 | −CONFIG_VIDEO_OUTPUT_CONTROL=m | |
| 66 | −CONFIG_FB=y | |
| 67 | −CONFIG_FB_MODE_HELPERS=y | |
| 68 | −CONFIG_FB_OMAP=y | |
| 69 | −# CONFIG_VGA_CONSOLE is not set | |
| 70 | −CONFIG_FRAMEBUFFER_CONSOLE=y | |
| 71 | −CONFIG_FONTS=y | |
| 72 | −CONFIG_FONT_8x8=y | |
| 73 | −CONFIG_LOGO=y | |
| 74 | −# CONFIG_LOGO_LINUX_MONO is not set | |
| 75 | −# CONFIG_LOGO_LINUX_VGA16 is not set | |
| 76 | −CONFIG_EXT2_FS=y | |
| 77 | −CONFIG_INOTIFY=y | |
| 78 | −CONFIG_AUTOFS_FS=y | |
| 79 | −CONFIG_AUTOFS4_FS=y | |
| 80 | −CONFIG_MSDOS_FS=m | |
| 81 | −CONFIG_VFAT_FS=m | |
| 82 | −CONFIG_JFFS2_FS=y | |
| 83 | −CONFIG_NFS_FS=y | |
| 84 | −CONFIG_NFS_V3=y | |
| 85 | −CONFIG_ROOT_NFS=y | |
| 86 | −CONFIG_NLS_CODEPAGE_437=m | |
| 87 | −CONFIG_NLS_ISO8859_1=m | |
| @@ -1,65 +0,0 @@ | ||
| 1 | −CONFIG_EXPERIMENTAL=y | |
| 2 | −CONFIG_SYSVIPC=y | |
| 3 | −CONFIG_LOG_BUF_SHIFT=14 | |
| 4 | −CONFIG_BLK_DEV_INITRD=y | |
| 5 | −CONFIG_SLAB=y | |
| 6 | −CONFIG_MODULES=y | |
| 7 | −CONFIG_MODULE_UNLOAD=y | |
| 8 | −# CONFIG_BLK_DEV_BSG is not set | |
| 9 | −CONFIG_ARCH_OMAP=y | |
| 10 | −CONFIG_ARCH_OMAP1=y | |
| 11 | −CONFIG_ARCH_OMAP730=y | |
| 12 | −# CONFIG_ARCH_OMAP15XX is not set | |
| 13 | −CONFIG_MACH_OMAP_PERSEUS2=y | |
| 14 | −CONFIG_OMAP_ARM_182MHZ=y | |
| 15 | −# CONFIG_OMAP_ARM_60MHZ is not set | |
| 16 | −# CONFIG_ARM_THUMB is not set | |
| 17 | −CONFIG_PREEMPT=y | |
| 18 | −CONFIG_LEDS=y | |
| 19 | −CONFIG_LEDS_CPU=y | |
| 20 | −CONFIG_ZBOOT_ROM_TEXT=0x0 | |
| 21 | −CONFIG_ZBOOT_ROM_BSS=0x0 | |
| 22 | −CONFIG_CMDLINE="mem=32M console=ttyS0,115200 ip=dhcp" | |
| 23 | −CONFIG_FPE_NWFPE=y | |
| 24 | −CONFIG_PM=y | |
| 25 | −CONFIG_NET=y | |
| 26 | −CONFIG_PACKET=y | |
| 27 | −CONFIG_UNIX=y | |
| 28 | −CONFIG_INET=y | |
| 29 | −CONFIG_IP_MULTICAST=y | |
| 30 | −CONFIG_IP_PNP=y | |
| 31 | −CONFIG_IP_PNP_DHCP=y | |
| 32 | −CONFIG_IP_PNP_BOOTP=y | |
| 33 | −# CONFIG_IPV6 is not set | |
| 34 | −CONFIG_MTD=y | |
| 35 | −CONFIG_MTD_PARTITIONS=y | |
| 36 | −CONFIG_MTD_CMDLINE_PARTS=y | |
| 37 | −CONFIG_MTD_CHAR=y | |
| 38 | −CONFIG_MTD_BLOCK=y | |
| 39 | −CONFIG_MTD_CFI=y | |
| 40 | −CONFIG_MTD_CFI_INTELEXT=y | |
| 41 | −CONFIG_MTD_NAND=y | |
| 42 | −CONFIG_BLK_DEV_LOOP=y | |
| 43 | −CONFIG_BLK_DEV_RAM=y | |
| 44 | −CONFIG_BLK_DEV_RAM_SIZE=8192 | |
| 45 | −CONFIG_NETDEVICES=y | |
| 46 | −CONFIG_NET_ETHERNET=y | |
| 47 | −CONFIG_SMC91X=y | |
| 48 | −# CONFIG_KEYBOARD_ATKBD is not set | |
| 49 | −CONFIG_KEYBOARD_OMAP=y | |
| 50 | −# CONFIG_INPUT_MOUSE is not set | |
| 51 | −CONFIG_SERIAL_8250=y | |
| 52 | −CONFIG_SERIAL_8250_CONSOLE=y | |
| 53 | −# CONFIG_LEGACY_PTYS is not set | |
| 54 | −CONFIG_VIDEO_OUTPUT_CONTROL=m | |
| 55 | −CONFIG_FB=y | |
| 56 | −CONFIG_FB_MODE_HELPERS=y | |
| 57 | −CONFIG_FB_VIRTUAL=y | |
| 58 | −# CONFIG_VGA_CONSOLE is not set | |
| 59 | −CONFIG_RTC_CLASS=y | |
| 60 | −CONFIG_RTC_DRV_OMAP=y | |
| 61 | −CONFIG_EXT2_FS=y | |
| 62 | −CONFIG_INOTIFY=y | |
| 63 | −CONFIG_JFFS2_FS=y | |
| 64 | −CONFIG_NFS_FS=y | |
| 65 | −CONFIG_ROOT_NFS=y | |
| @@ -2,7 +2,7 @@ CONFIG_EXPERIMENTAL=y · 1 unmodified line | ||
| 2 | 2 | CONFIG_SYSVIPC=y |
| 3 | 3 | CONFIG_LOG_BUF_SHIFT=14 |
| 4 | 4 | CONFIG_SYSFS_DEPRECATED_V2=y |
| 5 | −CONFIG_EMBEDDED=y | |
| 5 | +CONFIG_EXPERT=y | |
| 6 | 6 | # CONFIG_SLUB_DEBUG is not set |
| 7 | 7 | CONFIG_PROFILING=y |
| 8 | 8 | CONFIG_OPROFILE=y |
| @@ -1,48 +0,0 @@ | ||
| 1 | −CONFIG_EXPERIMENTAL=y | |
| 2 | −# CONFIG_SWAP is not set | |
| 3 | −CONFIG_SYSVIPC=y | |
| 4 | −CONFIG_BSD_PROCESS_ACCT=y | |
| 5 | −CONFIG_LOG_BUF_SHIFT=14 | |
| 6 | −CONFIG_SLAB=y | |
| 7 | −# CONFIG_IOSCHED_DEADLINE is not set | |
| 8 | −# CONFIG_IOSCHED_CFQ is not set | |
| 9 | −CONFIG_ARCH_OMAP=y | |
| 10 | −CONFIG_ARCH_OMAP1=y | |
| 11 | −CONFIG_MACH_OMAP_PALMTE=y | |
| 12 | −CONFIG_OMAP_CLOCKS_SET_BY_BOOTLOADER=y | |
| 13 | −# CONFIG_OMAP_ARM_60MHZ is not set | |
| 14 | −# CONFIG_ARM_THUMB is not set | |
| 15 | −# CONFIG_CPU_DCACHE_WRITETHROUGH is not set | |
| 16 | −CONFIG_ZBOOT_ROM_TEXT=0x0 | |
| 17 | −CONFIG_ZBOOT_ROM_BSS=0x0 | |
| 18 | −CONFIG_FPE_NWFPE=y | |
| 19 | −# CONFIG_STANDALONE is not set | |
| 20 | −# CONFIG_PREVENT_FIRMWARE_BUILD is not set | |
| 21 | −# CONFIG_INPUT_MOUSEDEV_PSAUX is not set | |
| 22 | −CONFIG_INPUT_MOUSEDEV_SCREEN_X=320 | |
| 23 | −CONFIG_INPUT_MOUSEDEV_SCREEN_Y=320 | |
| 24 | −# CONFIG_INPUT_KEYBOARD is not set | |
| 25 | −# CONFIG_INPUT_MOUSE is not set | |
| 26 | −# CONFIG_SERIO is not set | |
| 27 | −# CONFIG_LEGACY_PTYS is not set | |
| 28 | −# CONFIG_HWMON is not set | |
| 29 | −CONFIG_FB=y | |
| 30 | −CONFIG_FB_OMAP=y | |
| 31 | −# CONFIG_VGA_CONSOLE is not set | |
| 32 | −CONFIG_FRAMEBUFFER_CONSOLE=y | |
| 33 | −CONFIG_LOGO=y | |
| 34 | −# CONFIG_LOGO_LINUX_MONO is not set | |
| 35 | −# CONFIG_LOGO_LINUX_VGA16 is not set | |
| 36 | −CONFIG_USB_GADGET=y | |
| 37 | −CONFIG_MMC=y | |
| 38 | −CONFIG_MMC_OMAP=y | |
| 39 | −CONFIG_EXT2_FS=y | |
| 40 | −CONFIG_MSDOS_FS=y | |
| 41 | −CONFIG_VFAT_FS=y | |
| 42 | −CONFIG_FAT_DEFAULT_CODEPAGE=850 | |
| 43 | −CONFIG_TMPFS=y | |
| 44 | −CONFIG_CRAMFS=y | |
| 45 | −CONFIG_PARTITION_ADVANCED=y | |
| 46 | −CONFIG_NLS_CODEPAGE_850=y | |
| 47 | −CONFIG_NLS_ISO8859_1=y | |
| 48 | −CONFIG_CRC_CCITT=y | |
| @@ -1,56 +0,0 @@ | ||
| 1 | −CONFIG_EXPERIMENTAL=y | |
| 2 | −CONFIG_SYSVIPC=y | |
| 3 | −CONFIG_BSD_PROCESS_ACCT=y | |
| 4 | −CONFIG_LOG_BUF_SHIFT=14 | |
| 5 | −CONFIG_SLAB=y | |
| 6 | −# CONFIG_IOSCHED_DEADLINE is not set | |
| 7 | −# CONFIG_IOSCHED_CFQ is not set | |
| 8 | −CONFIG_ARCH_OMAP=y | |
| 9 | −CONFIG_ARCH_OMAP1=y | |
| 10 | −CONFIG_MACH_OMAP_PALMTT=y | |
| 11 | −CONFIG_OMAP_CLOCKS_SET_BY_BOOTLOADER=y | |
| 12 | −# CONFIG_OMAP_ARM_60MHZ is not set | |
| 13 | −# CONFIG_CPU_DCACHE_WRITETHROUGH is not set | |
| 14 | −CONFIG_ZBOOT_ROM_TEXT=0x0 | |
| 15 | −CONFIG_ZBOOT_ROM_BSS=0x0 | |
| 16 | −CONFIG_CMDLINE="root=/dev/mmcblk0p2 rw init=/init" | |
| 17 | −CONFIG_FPE_NWFPE=y | |
| 18 | −CONFIG_NET=y | |
| 19 | −CONFIG_PACKET=y | |
| 20 | −CONFIG_UNIX=y | |
| 21 | −CONFIG_NET_KEY=y | |
| 22 | −CONFIG_INET=y | |
| 23 | −# CONFIG_INET_XFRM_MODE_TRANSPORT is not set | |
| 24 | −# CONFIG_INET_XFRM_MODE_TUNNEL is not set | |
| 25 | −# CONFIG_INET_XFRM_MODE_BEET is not set | |
| 26 | −# CONFIG_INET_DIAG is not set | |
| 27 | −# CONFIG_IPV6 is not set | |
| 28 | −CONFIG_INPUT_MOUSEDEV_SCREEN_X=320 | |
| 29 | −CONFIG_INPUT_MOUSEDEV_SCREEN_Y=320 | |
| 30 | −CONFIG_INPUT_EVDEV=y | |
| 31 | −# CONFIG_INPUT_KEYBOARD is not set | |
| 32 | −# CONFIG_INPUT_MOUSE is not set | |
| 33 | −CONFIG_INPUT_TOUCHSCREEN=y | |
| 34 | −CONFIG_TOUCHSCREEN_ADS7846=y | |
| 35 | −# CONFIG_SERIO is not set | |
| 36 | −CONFIG_SPI=y | |
| 37 | −CONFIG_SPI_OMAP_UWIRE=y | |
| 38 | −CONFIG_FB=y | |
| 39 | −CONFIG_FIRMWARE_EDID=y | |
| 40 | −CONFIG_FB_OMAP=y | |
| 41 | −CONFIG_BACKLIGHT_LCD_SUPPORT=y | |
| 42 | −# CONFIG_VGA_CONSOLE is not set | |
| 43 | −CONFIG_FRAMEBUFFER_CONSOLE=y | |
| 44 | −CONFIG_NEW_LEDS=y | |
| 45 | −CONFIG_LEDS_CLASS=y | |
| 46 | −CONFIG_LEDS_TRIGGERS=y | |
| 47 | −CONFIG_LEDS_TRIGGER_TIMER=y | |
| 48 | −CONFIG_LEDS_TRIGGER_HEARTBEAT=y | |
| 49 | −CONFIG_RTC_CLASS=y | |
| 50 | −CONFIG_RTC_DRV_OMAP=y | |
| 51 | −CONFIG_EXT2_FS=y | |
| 52 | −CONFIG_PARTITION_ADVANCED=y | |
| 53 | −# CONFIG_ENABLE_MUST_CHECK is not set | |
| 54 | −CONFIG_CRC_CCITT=y | |
| 55 | −CONFIG_CRC16=y | |
| 56 | −CONFIG_LIBCRC32C=y | |
| @@ -1,53 +0,0 @@ | ||
| 1 | −CONFIG_EXPERIMENTAL=y | |
| 2 | −CONFIG_LOCALVERSION="-z71" | |
| 3 | −CONFIG_SYSVIPC=y | |
| 4 | −CONFIG_BSD_PROCESS_ACCT=y | |
| 5 | −CONFIG_LOG_BUF_SHIFT=14 | |
| 6 | −CONFIG_SLAB=y | |
| 7 | −# CONFIG_IOSCHED_DEADLINE is not set | |
| 8 | −# CONFIG_IOSCHED_CFQ is not set | |
| 9 | −CONFIG_ARCH_OMAP=y | |
| 10 | −CONFIG_ARCH_OMAP1=y | |
| 11 | −CONFIG_MACH_OMAP_PALMZ71=y | |
| 12 | −CONFIG_OMAP_CLOCKS_SET_BY_BOOTLOADER=y | |
| 13 | −# CONFIG_OMAP_ARM_60MHZ is not set | |
| 14 | −# CONFIG_ARM_THUMB is not set | |
| 15 | −# CONFIG_CPU_DCACHE_WRITETHROUGH is not set | |
| 16 | −CONFIG_ZBOOT_ROM_TEXT=0x0 | |
| 17 | −CONFIG_ZBOOT_ROM_BSS=0x0 | |
| 18 | −CONFIG_FPE_NWFPE=y | |
| 19 | −CONFIG_NET=y | |
| 20 | −CONFIG_PACKET=y | |
| 21 | −CONFIG_UNIX=y | |
| 22 | −CONFIG_NET_KEY=y | |
| 23 | −CONFIG_INET=y | |
| 24 | −# CONFIG_INET_XFRM_MODE_TRANSPORT is not set | |
| 25 | −# CONFIG_INET_XFRM_MODE_TUNNEL is not set | |
| 26 | −# CONFIG_INET_DIAG is not set | |
| 27 | −# CONFIG_IPV6 is not set | |
| 28 | −CONFIG_INPUT_MOUSEDEV_SCREEN_X=320 | |
| 29 | −CONFIG_INPUT_MOUSEDEV_SCREEN_Y=320 | |
| 30 | −# CONFIG_INPUT_KEYBOARD is not set | |
| 31 | −# CONFIG_INPUT_MOUSE is not set | |
| 32 | −CONFIG_INPUT_TOUCHSCREEN=y | |
| 33 | −CONFIG_TOUCHSCREEN_ADS7846=y | |
| 34 | −# CONFIG_SERIO is not set | |
| 35 | −CONFIG_SERIAL_8250=y | |
| 36 | −CONFIG_SERIAL_8250_CONSOLE=y | |
| 37 | −CONFIG_LEGACY_PTY_COUNT=16 | |
| 38 | −CONFIG_SPI=y | |
| 39 | −CONFIG_SPI_OMAP_UWIRE=y | |
| 40 | −CONFIG_FB=y | |
| 41 | −CONFIG_FIRMWARE_EDID=y | |
| 42 | −CONFIG_FB_OMAP=y | |
| 43 | −CONFIG_BACKLIGHT_LCD_SUPPORT=y | |
| 44 | −# CONFIG_VGA_CONSOLE is not set | |
| 45 | −CONFIG_FRAMEBUFFER_CONSOLE=y | |
| 46 | −CONFIG_MMC=y | |
| 47 | −CONFIG_MMC_OMAP=y | |
| 48 | −CONFIG_RTC_CLASS=y | |
| 49 | −CONFIG_RTC_DRV_OMAP=y | |
| 50 | −CONFIG_EXT2_FS=y | |
| 51 | −CONFIG_CRC_CCITT=y | |
| 52 | −CONFIG_CRC16=y | |
| 53 | −CONFIG_LIBCRC32C=y | |
| @@ -7,7 +7,7 @@ CONFIG_IKCONFIG=y · 6 unmodified lines | ||
| 7 | 7 | CONFIG_IKCONFIG_PROC=y |
| 8 | 8 | CONFIG_LOG_BUF_SHIFT=14 |
| 9 | 9 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set |
| 10 | −CONFIG_EMBEDDED=y | |
| 10 | +CONFIG_EXPERT=y | |
| 11 | 11 | # CONFIG_KALLSYMS is not set |
| 12 | 12 | CONFIG_SLAB=y |
| 13 | 13 | CONFIG_MODULES=y |
| @@ -10,7 +10,7 @@ CONFIG_IKCONFIG_PROC=y · 9 unmodified lines | ||
| 10 | 10 | CONFIG_LOG_BUF_SHIFT=14 |
| 11 | 11 | CONFIG_NAMESPACES=y |
| 12 | 12 | CONFIG_BLK_DEV_INITRD=y |
| 13 | −CONFIG_EMBEDDED=y | |
| 13 | +CONFIG_EXPERT=y | |
| 14 | 14 | # CONFIG_SYSCTL_SYSCALL is not set |
| 15 | 15 | # CONFIG_KALLSYMS is not set |
| 16 | 16 | # CONFIG_VM_EVENT_COUNTERS is not set |
| @@ -3,7 +3,7 @@ CONFIG_EXPERIMENTAL=y · 2 unmodified lines | ||
| 3 | 3 | CONFIG_SYSVIPC=y |
| 4 | 4 | CONFIG_LOG_BUF_SHIFT=14 |
| 5 | 5 | CONFIG_BLK_DEV_INITRD=y |
| 6 | −CONFIG_EMBEDDED=y | |
| 6 | +CONFIG_EXPERT=y | |
| 7 | 7 | # CONFIG_HOTPLUG is not set |
| 8 | 8 | # CONFIG_SHMEM is not set |
| 9 | 9 | CONFIG_MODULES=y |
| @@ -5,7 +5,7 @@ CONFIG_BSD_PROCESS_ACCT=y · 4 unmodified lines | ||
| 5 | 5 | CONFIG_AUDIT=y |
| 6 | 6 | CONFIG_LOG_BUF_SHIFT=14 |
| 7 | 7 | CONFIG_BLK_DEV_INITRD=y |
| 8 | −CONFIG_EMBEDDED=y | |
| 8 | +CONFIG_EXPERT=y | |
| 9 | 9 | CONFIG_SLAB=y |
| 10 | 10 | CONFIG_MODULES=y |
| 11 | 11 | CONFIG_MODULE_UNLOAD=y |
| @@ -2,7 +2,7 @@ CONFIG_EXPERIMENTAL=y · 1 unmodified line | ||
| 2 | 2 | CONFIG_LOCALVERSION="oe1" |
| 3 | 3 | CONFIG_SYSVIPC=y |
| 4 | 4 | CONFIG_LOG_BUF_SHIFT=14 |
| 5 | −CONFIG_EMBEDDED=y | |
| 5 | +CONFIG_EXPERT=y | |
| 6 | 6 | CONFIG_KALLSYMS_ALL=y |
| 7 | 7 | CONFIG_KALLSYMS_EXTRA_PASS=y |
| 8 | 8 | CONFIG_MODULES=y |
| @@ -4,7 +4,7 @@ CONFIG_BSD_PROCESS_ACCT=y · 3 unmodified lines | ||
| 4 | 4 | CONFIG_LOG_BUF_SHIFT=14 |
| 5 | 5 | CONFIG_SYSFS_DEPRECATED_V2=y |
| 6 | 6 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set |
| 7 | −CONFIG_EMBEDDED=y | |
| 7 | +CONFIG_EXPERT=y | |
| 8 | 8 | CONFIG_PROFILING=y |
| 9 | 9 | CONFIG_OPROFILE=m |
| 10 | 10 | CONFIG_MODULES=y |
| @@ -5,7 +5,7 @@ CONFIG_POSIX_MQUEUE=y · 4 unmodified lines | ||
| 5 | 5 | CONFIG_BSD_PROCESS_ACCT=y |
| 6 | 6 | CONFIG_SYSFS_DEPRECATED_V2=y |
| 7 | 7 | CONFIG_BLK_DEV_INITRD=y |
| 8 | −CONFIG_EMBEDDED=y | |
| 8 | +CONFIG_EXPERT=y | |
| 9 | 9 | CONFIG_SLAB=y |
| 10 | 10 | CONFIG_MODULES=y |
| 11 | 11 | CONFIG_MODULE_UNLOAD=y |
| @@ -5,7 +5,7 @@ CONFIG_POSIX_MQUEUE=y · 4 unmodified lines | ||
| 5 | 5 | CONFIG_BSD_PROCESS_ACCT=y |
| 6 | 6 | CONFIG_SYSFS_DEPRECATED_V2=y |
| 7 | 7 | CONFIG_BLK_DEV_INITRD=y |
| 8 | −CONFIG_EMBEDDED=y | |
| 8 | +CONFIG_EXPERT=y | |
| 9 | 9 | CONFIG_SLAB=y |
| 10 | 10 | CONFIG_MODULES=y |
| 11 | 11 | CONFIG_MODULE_UNLOAD=y |
| @@ -1,110 +0,0 @@ | ||
| 1 | −CONFIG_EXPERIMENTAL=y | |
| 2 | −CONFIG_SYSVIPC=y | |
| 3 | −CONFIG_POSIX_MQUEUE=y | |
| 4 | −CONFIG_IKCONFIG=y | |
| 5 | −CONFIG_LOG_BUF_SHIFT=14 | |
| 6 | −CONFIG_EMBEDDED=y | |
| 7 | −# CONFIG_KALLSYMS is not set | |
| 8 | −# CONFIG_ELF_CORE is not set | |
| 9 | −# CONFIG_BASE_FULL is not set | |
| 10 | −# CONFIG_SHMEM is not set | |
| 11 | −# CONFIG_VM_EVENT_COUNTERS is not set | |
| 12 | −CONFIG_SLOB=y | |
| 13 | −CONFIG_PROFILING=y | |
| 14 | −CONFIG_OPROFILE=y | |
| 15 | −CONFIG_MODULES=y | |
| 16 | −CONFIG_MODULE_UNLOAD=y | |
| 17 | −# CONFIG_IOSCHED_CFQ is not set | |
| 18 | −CONFIG_ARCH_OMAP=y | |
| 19 | −CONFIG_ARCH_OMAP1=y | |
| 20 | −CONFIG_OMAP_MBOX_FWK=y | |
| 21 | −CONFIG_MACH_SX1=y | |
| 22 | −CONFIG_OMAP_ARM_168MHZ=y | |
| 23 | −# CONFIG_OMAP_ARM_60MHZ is not set | |
| 24 | −# CONFIG_CPU_DCACHE_WRITETHROUGH is not set | |
| 25 | −CONFIG_PREEMPT=y | |
| 26 | −CONFIG_ZBOOT_ROM_TEXT=0x0 | |
| 27 | −CONFIG_ZBOOT_ROM_BSS=0x0 | |
| 28 | −CONFIG_FPE_NWFPE=y | |
| 29 | −CONFIG_BINFMT_MISC=y | |
| 30 | −CONFIG_NET=y | |
| 31 | −CONFIG_PACKET=y | |
| 32 | −CONFIG_UNIX=y | |
| 33 | −CONFIG_INET=y | |
| 34 | −CONFIG_IP_PNP=y | |
| 35 | −# CONFIG_INET_XFRM_MODE_TRANSPORT is not set | |
| 36 | −# CONFIG_INET_XFRM_MODE_TUNNEL is not set | |
| 37 | −# CONFIG_INET_XFRM_MODE_BEET is not set | |
| 38 | −# CONFIG_INET_DIAG is not set | |
| 39 | −# CONFIG_IPV6 is not set | |
| 40 | −# CONFIG_FW_LOADER is not set | |
| 41 | −CONFIG_CONNECTOR=y | |
| 42 | −# CONFIG_PROC_EVENTS is not set | |
| 43 | −CONFIG_BLK_DEV_LOOP=m | |
| 44 | −CONFIG_BLK_DEV_RAM=m | |
| 45 | −CONFIG_BLK_DEV_RAM_COUNT=2 | |
| 46 | −CONFIG_NETDEVICES=y | |
| 47 | −CONFIG_PHYLIB=y | |
| 48 | −CONFIG_NET_ETHERNET=y | |
| 49 | −CONFIG_MII=y | |
| 50 | −# CONFIG_INPUT_MOUSEDEV is not set | |
| 51 | −CONFIG_INPUT_EVDEV=y | |
| 52 | −# CONFIG_KEYBOARD_ATKBD is not set | |
| 53 | −CONFIG_KEYBOARD_OMAP=y | |
| 54 | −# CONFIG_INPUT_MOUSE is not set | |
| 55 | −# CONFIG_SERIO is not set | |
| 56 | −CONFIG_SERIAL_8250=y | |
| 57 | −CONFIG_SERIAL_8250_NR_UARTS=3 | |
| 58 | −# CONFIG_LEGACY_PTYS is not set | |
| 59 | −# CONFIG_HW_RANDOM is not set | |
| 60 | −CONFIG_I2C=y | |
| 61 | −CONFIG_I2C_CHARDEV=y | |
| 62 | −CONFIG_I2C_OMAP=y | |
| 63 | −# CONFIG_HWMON is not set | |
| 64 | −CONFIG_FB=y | |
| 65 | −CONFIG_FB_OMAP=y | |
| 66 | −CONFIG_FB_OMAP_BOOTLOADER_INIT=y | |
| 67 | −# CONFIG_VGA_CONSOLE is not set | |
| 68 | −CONFIG_FRAMEBUFFER_CONSOLE=y | |
| 69 | −CONFIG_FONTS=y | |
| 70 | −CONFIG_FONT_MINI_4x6=y | |
| 71 | −CONFIG_LOGO=y | |
| 72 | −# CONFIG_LOGO_LINUX_MONO is not set | |
| 73 | −# CONFIG_LOGO_LINUX_VGA16 is not set | |
| 74 | −CONFIG_SOUND=y | |
| 75 | −CONFIG_SND=y | |
| 76 | −CONFIG_SND_MIXER_OSS=y | |
| 77 | −CONFIG_SND_PCM_OSS=y | |
| 78 | −# CONFIG_SND_SUPPORT_OLD_API is not set | |
| 79 | −# CONFIG_SND_VERBOSE_PROCFS is not set | |
| 80 | −CONFIG_USB_GADGET=y | |
| 81 | −CONFIG_USB_ETH=m | |
| 82 | −CONFIG_MMC=y | |
| 83 | −CONFIG_MMC_OMAP=y | |
| 84 | −CONFIG_RTC_CLASS=y | |
| 85 | −CONFIG_RTC_DRV_OMAP=y | |
| 86 | −CONFIG_EXT2_FS=y | |
| 87 | −# CONFIG_DNOTIFY is not set | |
| 88 | −CONFIG_INOTIFY=y | |
| 89 | −CONFIG_MSDOS_FS=y | |
| 90 | −CONFIG_VFAT_FS=y | |
| 91 | −CONFIG_FAT_DEFAULT_CODEPAGE=866 | |
| 92 | −CONFIG_FAT_DEFAULT_IOCHARSET="koi8-r" | |
| 93 | −CONFIG_CRAMFS=y | |
| 94 | −CONFIG_NFS_FS=y | |
| 95 | −CONFIG_ROOT_NFS=y | |
| 96 | −CONFIG_PARTITION_ADVANCED=y | |
| 97 | −CONFIG_NLS_CODEPAGE_437=y | |
| 98 | −CONFIG_NLS_CODEPAGE_866=y | |
| 99 | −CONFIG_NLS_CODEPAGE_1251=y | |
| 100 | −CONFIG_NLS_ISO8859_1=y | |
| 101 | −CONFIG_NLS_ISO8859_5=y | |
| 102 | −CONFIG_NLS_KOI8_R=y | |
| 103 | −CONFIG_NLS_UTF8=y | |
| 104 | −# CONFIG_ENABLE_MUST_CHECK is not set | |
| 105 | −CONFIG_DEBUG_KERNEL=y | |
| 106 | −# CONFIG_DETECT_SOFTLOCKUP is not set | |
| 107 | −# CONFIG_DEBUG_BUGVERBOSE is not set | |
| 108 | −CONFIG_CRC_CCITT=y | |
| 109 | −CONFIG_CRC16=y | |
| 110 | −CONFIG_LIBCRC32C=y | |
| @@ -5,7 +5,7 @@ CONFIG_SYSVIPC=y · 4 unmodified lines | ||
| 5 | 5 | CONFIG_LOG_BUF_SHIFT=14 |
| 6 | 6 | CONFIG_SYSFS_DEPRECATED_V2=y |
| 7 | 7 | CONFIG_BLK_DEV_INITRD=y |
| 8 | −CONFIG_EMBEDDED=y | |
| 8 | +CONFIG_EXPERT=y | |
| 9 | 9 | # CONFIG_KALLSYMS is not set |
| 10 | 10 | # CONFIG_BUG is not set |
| 11 | 11 | # CONFIG_ELF_CORE is not set |
| @@ -7,7 +7,7 @@ CONFIG_IKCONFIG=y · 6 unmodified lines | ||
| 7 | 7 | CONFIG_IKCONFIG_PROC=y |
| 8 | 8 | CONFIG_LOG_BUF_SHIFT=14 |
| 9 | 9 | CONFIG_BLK_DEV_INITRD=y |
| 10 | −CONFIG_EMBEDDED=y | |
| 10 | +CONFIG_EXPERT=y | |
| 11 | 11 | CONFIG_KALLSYMS_EXTRA_PASS=y |
| 12 | 12 | CONFIG_SLAB=y |
| 13 | 13 | CONFIG_MODULES=y |
| @@ -3,7 +3,7 @@ CONFIG_EXPERIMENTAL=y · 2 unmodified lines | ||
| 3 | 3 | # CONFIG_SWAP is not set |
| 4 | 4 | CONFIG_SYSVIPC=y |
| 5 | 5 | CONFIG_LOG_BUF_SHIFT=14 |
| 6 | −CONFIG_EMBEDDED=y | |
| 6 | +CONFIG_EXPERT=y | |
| 7 | 7 | # CONFIG_AIO is not set |
| 8 | 8 | # CONFIG_VM_EVENT_COUNTERS is not set |
| 9 | 9 | CONFIG_MODULES=y |
| @@ -9,6 +9,10 @@ CONFIG_MODULE_UNLOAD=y · 8 unmodified lines | ||
| 9 | 9 | # CONFIG_LBDAF is not set |
| 10 | 10 | # CONFIG_BLK_DEV_BSG is not set |
| 11 | 11 | CONFIG_ARCH_U8500=y |
| 12 | +CONFIG_UX500_SOC_DB5500=y | |
| 13 | +CONFIG_UX500_SOC_DB8500=y | |
| 14 | +CONFIG_MACH_U8500=y | |
| 15 | +CONFIG_MACH_U5500=y | |
| 12 | 16 | CONFIG_SMP=y |
| 13 | 17 | CONFIG_NR_CPUS=2 |
| 14 | 18 | CONFIG_PREEMPT=y |
| @@ -3,7 +3,7 @@ CONFIG_EXPERIMENTAL=y · 2 unmodified lines | ||
| 3 | 3 | CONFIG_SYSVIPC=y |
| 4 | 4 | CONFIG_LOG_BUF_SHIFT=13 |
| 5 | 5 | CONFIG_SYSFS_DEPRECATED_V2=y |
| 6 | −CONFIG_EMBEDDED=y | |
| 6 | +CONFIG_EXPERT=y | |
| 7 | 7 | # CONFIG_ELF_CORE is not set |
| 8 | 8 | # CONFIG_SHMEM is not set |
| 9 | 9 | CONFIG_SLAB=y |
| @@ -8,7 +8,7 @@ CONFIG_IKCONFIG_PROC=y · 7 unmodified lines | ||
| 8 | 8 | CONFIG_LOG_BUF_SHIFT=16 |
| 9 | 9 | CONFIG_SYSFS_DEPRECATED_V2=y |
| 10 | 10 | CONFIG_BLK_DEV_INITRD=y |
| 11 | −CONFIG_EMBEDDED=y | |
| 11 | +CONFIG_EXPERT=y | |
| 12 | 12 | # CONFIG_UID16 is not set |
| 13 | 13 | # CONFIG_SHMEM is not set |
| 14 | 14 | # CONFIG_VM_EVENT_COUNTERS is not set |
| @@ -18,6 +18,7 @@ · 17 unmodified lines | ||
| 18 | 18 | #endif |
| 19 | 19 | |
| 20 | 20 | #include <asm/ptrace.h> |
| 21 | +#include <asm/domain.h> | |
| 21 | 22 | |
| 22 | 23 | /* |
| 23 | 24 | * Endian independent macros for shifting bytes within registers. |
| @@ -157,16 +158,24 @@ · 133 unmodified lines | ||
| 157 | 158 | #ifdef CONFIG_SMP |
| 158 | 159 | #define ALT_SMP(instr...) \ |
| 159 | 160 | 9998: instr |
| 161 | +/* | |
| 162 | + * Note: if you get assembler errors from ALT_UP() when building with | |
| 163 | + * CONFIG_THUMB2_KERNEL, you almost certainly need to use | |
| 164 | + * ALT_SMP( W(instr) ... ) | |
| 165 | + */ | |
| 160 | 166 | #define ALT_UP(instr...) \ |
| 161 | 167 | .pushsection ".alt.smp.init", "a" ;\ |
| 162 | 168 | .long 9998b ;\ |
| 163 | − instr ;\ | |
| 169 | +9997: instr ;\ | |
| 170 | + .if . - 9997b != 4 ;\ | |
| 171 | + .error "ALT_UP() content must assemble to exactly 4 bytes";\ | |
| 172 | + .endif ;\ | |
| 164 | 173 | .popsection |
| 165 | 174 | #define ALT_UP_B(label) \ |
| 166 | 175 | .equ up_b_offset, label - 9998b ;\ |
| 167 | 176 | .pushsection ".alt.smp.init", "a" ;\ |
| 168 | 177 | .long 9998b ;\ |
| 169 | − b . + up_b_offset ;\ | |
| 178 | + W(b) . + up_b_offset ;\ | |
| 170 | 179 | .popsection |
| 171 | 180 | #else |
| 172 | 181 | #define ALT_SMP(instr...) |
| @@ -177,16 +186,24 @@ · 4 unmodified lines | ||
| 177 | 186 | /* |
| 178 | 187 | * SMP data memory barrier |
| 179 | 188 | */ |
| 180 | − .macro smp_dmb | |
| 189 | + .macro smp_dmb mode | |
| 181 | 190 | #ifdef CONFIG_SMP |
| 182 | 191 | #if __LINUX_ARM_ARCH__ >= 7 |
| 192 | + .ifeqs "\mode","arm" | |
| 183 | 193 | ALT_SMP(dmb) |
| 194 | + .else | |
| 195 | + ALT_SMP(W(dmb)) | |
| 196 | + .endif | |
| 184 | 197 | #elif __LINUX_ARM_ARCH__ == 6 |
| 185 | 198 | ALT_SMP(mcr p15, 0, r0, c7, c10, 5) @ dmb |
| 186 | 199 | #else |
| 187 | 200 | #error Incompatible SMP platform |
| 188 | 201 | #endif |
| 202 | + .ifeqs "\mode","arm" | |
| 189 | 203 | ALT_UP(nop) |
| 204 | + .else | |
| 205 | + ALT_UP(W(nop)) | |
| 206 | + .endif | |
| 190 | 207 | #endif |
| 191 | 208 | .endm |
| 192 | 209 | |
| @@ -206,12 +223,12 @@ · 13 unmodified lines | ||
| 206 | 223 | */ |
| 207 | 224 | #ifdef CONFIG_THUMB2_KERNEL |
| 208 | 225 | |
| 209 | − .macro usraccoff, instr, reg, ptr, inc, off, cond, abort | |
| 226 | + .macro usraccoff, instr, reg, ptr, inc, off, cond, abort, t=T() | |
| 210 | 227 | 9999: |
| 211 | 228 | .if \inc == 1 |
| 212 | − \instr\cond\()bt \reg, [\ptr, #\off] | |
| 229 | + \instr\cond\()b\()\t\().w \reg, [\ptr, #\off] | |
| 213 | 230 | .elseif \inc == 4 |
| 214 | − \instr\cond\()t \reg, [\ptr, #\off] | |
| 231 | + \instr\cond\()\t\().w \reg, [\ptr, #\off] | |
| 215 | 232 | .else |
| 216 | 233 | .error "Unsupported inc macro argument" |
| 217 | 234 | .endif |
| @@ -246,13 +263,13 @@ · 28 unmodified lines | ||
| 246 | 263 | |
| 247 | 264 | #else /* !CONFIG_THUMB2_KERNEL */ |
| 248 | 265 | |
| 249 | − .macro usracc, instr, reg, ptr, inc, cond, rept, abort | |
| 266 | + .macro usracc, instr, reg, ptr, inc, cond, rept, abort, t=T() | |
| 250 | 267 | .rept \rept |
| 251 | 268 | 9999: |
| 252 | 269 | .if \inc == 1 |
| 253 | − \instr\cond\()bt \reg, [\ptr], #\inc | |
| 270 | + \instr\cond\()b\()\t \reg, [\ptr], #\inc | |
| 254 | 271 | .elseif \inc == 4 |
| 255 | − \instr\cond\()t \reg, [\ptr], #\inc | |
| 272 | + \instr\cond\()\t \reg, [\ptr], #\inc | |
| 256 | 273 | .else |
| 257 | 274 | .error "Unsupported inc macro argument" |
| 258 | 275 | .endif |
| @@ -285,7 +285,7 @@ static inline int fls(int x) · 284 unmodified lines | ||
| 285 | 285 | if (__builtin_constant_p(x)) |
| 286 | 286 | return constant_fls(x); |
| 287 | 287 | |
| 288 | − asm("clz\t%0, %1" : "=r" (ret) : "r" (x) : "cc"); | |
| 288 | + asm("clz\t%0, %1" : "=r" (ret) : "r" (x)); | |
| 289 | 289 | ret = 32 - ret; |
| 290 | 290 | return ret; |
| 291 | 291 | } |
| @@ -23,4 +23,6 @@ · 22 unmodified lines | ||
| 23 | 23 | #define ARCH_SLAB_MINALIGN 8 |
| 24 | 24 | #endif |
| 25 | 25 | |
| 26 | +#define __read_mostly __attribute__((__section__(".data..read_mostly"))) | |
| 27 | + | |
| 26 | 28 | #endif |
| @@ -12,23 +12,13 @@ · 11 unmodified lines | ||
| 12 | 12 | #ifndef __ASM_CLKDEV_H |
| 13 | 13 | #define __ASM_CLKDEV_H |
| 14 | 14 | |
| 15 | −struct clk; | |
| 16 | −struct device; | |
| 15 | +#include <linux/slab.h> | |
| 17 | 16 | |
| 18 | −struct clk_lookup { | |
| 19 | − struct list_head node; | |
| 20 | − const char *dev_id; | |
| 21 | − const char *con_id; | |
| 22 | − struct clk *clk; | |
| 23 | −}; | |
| 17 | +#include <mach/clkdev.h> | |
| 24 | 18 | |
| 25 | −struct clk_lookup *clkdev_alloc(struct clk *clk, const char *con_id, | |
| 26 | − const char *dev_fmt, ...); | |
| 27 | − | |
| 28 | −void clkdev_add(struct clk_lookup *cl); | |
| 29 | −void clkdev_drop(struct clk_lookup *cl); | |
| 30 | − | |
| 31 | −void clkdev_add_table(struct clk_lookup *, size_t); | |
| 32 | −int clk_add_alias(const char *, const char *, char *, struct device *); | |
| 19 | +static inline struct clk_lookup_alloc *__clkdev_alloc(size_t size) | |
| 20 | +{ | |
| 21 | + return kzalloc(size, GFP_KERNEL); | |
| 22 | +} | |
| 33 | 23 | |
| 34 | 24 | #endif |
| @@ -5,24 +5,29 @@ · 4 unmodified lines | ||
| 5 | 5 | |
| 6 | 6 | #include <linux/mm_types.h> |
| 7 | 7 | #include <linux/scatterlist.h> |
| 8 | +#include <linux/dma-debug.h> | |
| 8 | 9 | |
| 9 | 10 | #include <asm-generic/dma-coherent.h> |
| 10 | 11 | #include <asm/memory.h> |
| 11 | 12 | |
| 13 | +#ifdef __arch_page_to_dma | |
| 14 | +#error Please update to __arch_pfn_to_dma | |
| 15 | +#endif | |
| 16 | + | |
| 12 | 17 | /* |
| 13 | − * page_to_dma/dma_to_virt/virt_to_dma are architecture private functions | |
| 14 | − * used internally by the DMA-mapping API to provide DMA addresses. They | |
| 15 | − * must not be used by drivers. | |
| 18 | + * dma_to_pfn/pfn_to_dma/dma_to_virt/virt_to_dma are architecture private | |
| 19 | + * functions used internally by the DMA-mapping API to provide DMA | |
| 20 | + * addresses. They must not be used by drivers. | |
| 16 | 21 | */ |
| 17 | −#ifndef __arch_page_to_dma | |
| 18 | −static inline dma_addr_t page_to_dma(struct device *dev, struct page *page) | |
| 22 | +#ifndef __arch_pfn_to_dma | |
| 23 | +static inline dma_addr_t pfn_to_dma(struct device *dev, unsigned long pfn) | |
| 19 | 24 | { |
| 20 | − return (dma_addr_t)__pfn_to_bus(page_to_pfn(page)); | |
| 25 | + return (dma_addr_t)__pfn_to_bus(pfn); | |
| 21 | 26 | } |
| 22 | 27 | |
| 23 | −static inline struct page *dma_to_page(struct device *dev, dma_addr_t addr) | |
| 28 | +static inline unsigned long dma_to_pfn(struct device *dev, dma_addr_t addr) | |
| 24 | 29 | { |
| 25 | − return pfn_to_page(__bus_to_pfn(addr)); | |
| 30 | + return __bus_to_pfn(addr); | |
| 26 | 31 | } |
| 27 | 32 | |
| 28 | 33 | static inline void *dma_to_virt(struct device *dev, dma_addr_t addr) |
| @@ -35,14 +40,14 @@ static inline dma_addr_t virt_to_dma(struct device *dev, void *addr) · 6 unmodified lines | ||
| 35 | 40 | return (dma_addr_t)__virt_to_bus((unsigned long)(addr)); |
| 36 | 41 | } |
| 37 | 42 | #else |
| 38 | −static inline dma_addr_t page_to_dma(struct device *dev, struct page *page) | |
| 43 | +static inline dma_addr_t pfn_to_dma(struct device *dev, unsigned long pfn) | |
| 39 | 44 | { |
| 40 | − return __arch_page_to_dma(dev, page); | |
| 45 | + return __arch_pfn_to_dma(dev, pfn); | |
| 41 | 46 | } |
| 42 | 47 | |
| 43 | −static inline struct page *dma_to_page(struct device *dev, dma_addr_t addr) | |
| 48 | +static inline unsigned long dma_to_pfn(struct device *dev, dma_addr_t addr) | |
| 44 | 49 | { |
| 45 | − return __arch_dma_to_page(dev, addr); | |
| 50 | + return __arch_dma_to_pfn(dev, addr); | |
| 46 | 51 | } |
| 47 | 52 | |
| 48 | 53 | static inline void *dma_to_virt(struct device *dev, dma_addr_t addr) |
| @@ -293,13 +298,13 @@ extern int dma_needs_bounce(struct device*, dma_addr_t, size_t); · 244 unmodified lines | ||
| 293 | 298 | /* |
| 294 | 299 | * The DMA API, implemented by dmabounce.c. See below for descriptions. |
| 295 | 300 | */ |
| 296 | −extern dma_addr_t dma_map_single(struct device *, void *, size_t, | |
| 301 | +extern dma_addr_t __dma_map_single(struct device *, void *, size_t, | |
| 297 | 302 | enum dma_data_direction); |
| 298 | −extern void dma_unmap_single(struct device *, dma_addr_t, size_t, | |
| 303 | +extern void __dma_unmap_single(struct device *, dma_addr_t, size_t, | |
| 299 | 304 | enum dma_data_direction); |
| 300 | −extern dma_addr_t dma_map_page(struct device *, struct page *, | |
| 305 | +extern dma_addr_t __dma_map_page(struct device *, struct page *, | |
| 301 | 306 | unsigned long, size_t, enum dma_data_direction); |
| 302 | −extern void dma_unmap_page(struct device *, dma_addr_t, size_t, | |
| 307 | +extern void __dma_unmap_page(struct device *, dma_addr_t, size_t, | |
| 303 | 308 | enum dma_data_direction); |
| 304 | 309 | |
| 305 | 310 | /* |
| @@ -323,6 +328,34 @@ static inline int dmabounce_sync_for_device(struct device *d, dma_addr_t addr, · 17 unmodified lines | ||
| 323 | 328 | } |
| 324 | 329 | |
| 325 | 330 | |
| 331 | +static inline dma_addr_t __dma_map_single(struct device *dev, void *cpu_addr, | |
| 332 | + size_t size, enum dma_data_direction dir) | |
| 333 | +{ | |
| 334 | + __dma_single_cpu_to_dev(cpu_addr, size, dir); | |
| 335 | + return virt_to_dma(dev, cpu_addr); | |
| 336 | +} | |
| 337 | + | |
| 338 | +static inline dma_addr_t __dma_map_page(struct device *dev, struct page *page, | |
| 339 | + unsigned long offset, size_t size, enum dma_data_direction dir) | |
| 340 | +{ | |
| 341 | + __dma_page_cpu_to_dev(page, offset, size, dir); | |
| 342 | + return pfn_to_dma(dev, page_to_pfn(page)) + offset; | |
| 343 | +} | |
| 344 | + | |
| 345 | +static inline void __dma_unmap_single(struct device *dev, dma_addr_t handle, | |
| 346 | + size_t size, enum dma_data_direction dir) | |
| 347 | +{ | |
| 348 | + __dma_single_dev_to_cpu(dma_to_virt(dev, handle), size, dir); | |
| 349 | +} | |
| 350 | + | |
| 351 | +static inline void __dma_unmap_page(struct device *dev, dma_addr_t handle, | |
| 352 | + size_t size, enum dma_data_direction dir) | |
| 353 | +{ | |
| 354 | + __dma_page_dev_to_cpu(pfn_to_page(dma_to_pfn(dev, handle)), | |
| 355 | + handle & ~PAGE_MASK, size, dir); | |
| 356 | +} | |
| 357 | +#endif /* CONFIG_DMABOUNCE */ | |
| 358 | + | |
| 326 | 359 | /** |
| 327 | 360 | * dma_map_single - map a single buffer for streaming DMA |
| 328 | 361 | * @dev: valid struct device pointer, or NULL for ISA and EISA-like devices |
| @@ -340,11 +373,16 @@ static inline int dmabounce_sync_for_device(struct device *d, dma_addr_t addr, · 11 unmodified lines | ||
| 340 | 373 | static inline dma_addr_t dma_map_single(struct device *dev, void *cpu_addr, |
| 341 | 374 | size_t size, enum dma_data_direction dir) |
| 342 | 375 | { |
| 376 | + dma_addr_t addr; | |
| 377 | + | |
| 343 | 378 | BUG_ON(!valid_dma_direction(dir)); |
| 344 | 379 | |
| 345 | − __dma_single_cpu_to_dev(cpu_addr, size, dir); | |
| 380 | + addr = __dma_map_single(dev, cpu_addr, size, dir); | |
| 381 | + debug_dma_map_page(dev, virt_to_page(cpu_addr), | |
| 382 | + (unsigned long)cpu_addr & ~PAGE_MASK, size, | |
| 383 | + dir, addr, true); | |
| 346 | 384 | |
| 347 | − return virt_to_dma(dev, cpu_addr); | |
| 385 | + return addr; | |
| 348 | 386 | } |
| 349 | 387 | |
| 350 | 388 | /** |
| @@ -364,11 +402,14 @@ static inline dma_addr_t dma_map_single(struct device *dev, void *cpu_addr, · 13 unmodified lines | ||
| 364 | 402 | static inline dma_addr_t dma_map_page(struct device *dev, struct page *page, |
| 365 | 403 | unsigned long offset, size_t size, enum dma_data_direction dir) |
| 366 | 404 | { |
| 405 | + dma_addr_t addr; | |
| 406 | + | |
| 367 | 407 | BUG_ON(!valid_dma_direction(dir)); |
| 368 | 408 | |
| 369 | − __dma_page_cpu_to_dev(page, offset, size, dir); | |
| 409 | + addr = __dma_map_page(dev, page, offset, size, dir); | |
| 410 | + debug_dma_map_page(dev, page, offset, size, dir, addr, false); | |
| 370 | 411 | |
| 371 | − return page_to_dma(dev, page) + offset; | |
| 412 | + return addr; | |
| 372 | 413 | } |
| 373 | 414 | |
| 374 | 415 | /** |
| @@ -388,7 +429,8 @@ static inline dma_addr_t dma_map_page(struct device *dev, struct page *page, · 13 unmodified lines | ||
| 388 | 429 | static inline void dma_unmap_single(struct device *dev, dma_addr_t handle, |
| 389 | 430 | size_t size, enum dma_data_direction dir) |
| 390 | 431 | { |
| 391 | − __dma_single_dev_to_cpu(dma_to_virt(dev, handle), size, dir); | |
| 432 | + debug_dma_unmap_page(dev, handle, size, dir, true); | |
| 433 | + __dma_unmap_single(dev, handle, size, dir); | |
| 392 | 434 | } |
| 393 | 435 | |
| 394 | 436 | /** |
| @@ -408,10 +450,9 @@ static inline void dma_unmap_single(struct device *dev, dma_addr_t handle, · 13 unmodified lines | ||
| 408 | 450 | static inline void dma_unmap_page(struct device *dev, dma_addr_t handle, |
| 409 | 451 | size_t size, enum dma_data_direction dir) |
| 410 | 452 | { |
| 411 | − __dma_page_dev_to_cpu(dma_to_page(dev, handle), handle & ~PAGE_MASK, | |
| 412 | − size, dir); | |
| 453 | + debug_dma_unmap_page(dev, handle, size, dir, false); | |
| 454 | + __dma_unmap_page(dev, handle, size, dir); | |
| 413 | 455 | } |
| 414 | −#endif /* CONFIG_DMABOUNCE */ | |
| 415 | 456 | |
| 416 | 457 | /** |
| 417 | 458 | * dma_sync_single_range_for_cpu |
| @@ -437,6 +478,8 @@ static inline void dma_sync_single_range_for_cpu(struct device *dev, · 19 unmodified lines | ||
| 437 | 478 | { |
| 438 | 479 | BUG_ON(!valid_dma_direction(dir)); |
| 439 | 480 | |
| 481 | + debug_dma_sync_single_for_cpu(dev, handle + offset, size, dir); | |
| 482 | + | |
| 440 | 483 | if (!dmabounce_sync_for_cpu(dev, handle, offset, size, dir)) |
| 441 | 484 | return; |
| 442 | 485 | |
| @@ -449,6 +492,8 @@ static inline void dma_sync_single_range_for_device(struct device *dev, · 6 unmodified lines | ||
| 449 | 492 | { |
| 450 | 493 | BUG_ON(!valid_dma_direction(dir)); |
| 451 | 494 | |
| 495 | + debug_dma_sync_single_for_device(dev, handle + offset, size, dir); | |
| 496 | + | |
| 452 | 497 | if (!dmabounce_sync_for_device(dev, handle, offset, size, dir)) |
| 453 | 498 | return; |
| 454 | 499 | |
| @@ -45,13 +45,17 @@ · 44 unmodified lines | ||
| 45 | 45 | */ |
| 46 | 46 | #define DOMAIN_NOACCESS 0 |
| 47 | 47 | #define DOMAIN_CLIENT 1 |
| 48 | +#ifdef CONFIG_CPU_USE_DOMAINS | |
| 48 | 49 | #define DOMAIN_MANAGER 3 |
| 50 | +#else | |
| 51 | +#define DOMAIN_MANAGER 1 | |
| 52 | +#endif | |
| 49 | 53 | |
| 50 | 54 | #define domain_val(dom,type) ((type) << (2*(dom))) |
| 51 | 55 | |
| 52 | 56 | #ifndef __ASSEMBLY__ |
| 53 | 57 | |
| 54 | −#ifdef CONFIG_MMU | |
| 58 | +#ifdef CONFIG_CPU_USE_DOMAINS | |
| 55 | 59 | #define set_domain(x) \ |
| 56 | 60 | do { \ |
| 57 | 61 | __asm__ __volatile__( \ |
| @@ -74,5 +78,28 @@ · 16 unmodified lines | ||
| 74 | 78 | #define modify_domain(dom,type) do { } while (0) |
| 75 | 79 | #endif |
| 76 | 80 | |
| 81 | +/* | |
| 82 | + * Generate the T (user) versions of the LDR/STR and related | |
| 83 | + * instructions (inline assembly) | |
| 84 | + */ | |
| 85 | +#ifdef CONFIG_CPU_USE_DOMAINS | |
| 86 | +#define T(instr) #instr "t" | |
| 87 | +#else | |
| 88 | +#define T(instr) #instr | |
| 77 | 89 | #endif |
| 78 | −#endif /* !__ASSEMBLY__ */ | |
| 90 | + | |
| 91 | +#else /* __ASSEMBLY__ */ | |
| 92 | + | |
| 93 | +/* | |
| 94 | + * Generate the T (user) versions of the LDR/STR and related | |
| 95 | + * instructions | |
| 96 | + */ | |
| 97 | +#ifdef CONFIG_CPU_USE_DOMAINS | |
| 98 | +#define T(instr) instr ## t | |
| 99 | +#else | |
| 100 | +#define T(instr) instr | |
| 101 | +#endif | |
| 102 | + | |
| 103 | +#endif /* __ASSEMBLY__ */ | |
| 104 | + | |
| 105 | +#endif /* !__ASM_PROC_DOMAIN_H */ | |
| @@ -99,6 +99,8 @@ struct elf32_hdr; · 98 unmodified lines | ||
| 99 | 99 | extern int elf_check_arch(const struct elf32_hdr *); |
| 100 | 100 | #define elf_check_arch elf_check_arch |
| 101 | 101 | |
| 102 | +#define vmcore_elf64_check_arch(x) (0) | |
| 103 | + | |
| 102 | 104 | extern int arm_elf_read_implies_exec(const struct elf32_hdr *, int); |
| 103 | 105 | #define elf_read_implies_exec(ex,stk) arm_elf_read_implies_exec(&(ex), stk) |
| 104 | 106 | |
| @@ -0,0 +1,44 @@ | ||
| 1 | +/* | |
| 2 | + * Interrupt handling. Preserves r7, r8, r9 | |
| 3 | + */ | |
| 4 | + .macro arch_irq_handler_default | |
| 5 | + get_irqnr_preamble r5, lr | |
| 6 | +1: get_irqnr_and_base r0, r6, r5, lr | |
| 7 | + movne r1, sp | |
| 8 | + @ | |
| 9 | + @ routine called with r0 = irq number, r1 = struct pt_regs * | |
| 10 | + @ | |
| 11 | + adrne lr, BSYM(1b) | |
| 12 | + bne asm_do_IRQ | |
| 13 | + | |
| 14 | +#ifdef CONFIG_SMP | |
| 15 | + /* | |
| 16 | + * XXX | |
| 17 | + * | |
| 18 | + * this macro assumes that irqstat (r6) and base (r5) are | |
| 19 | + * preserved from get_irqnr_and_base above | |
| 20 | + */ | |
| 21 | + ALT_SMP(test_for_ipi r0, r6, r5, lr) | |
| 22 | + ALT_UP_B(9997f) | |
| 23 | + movne r1, sp | |
| 24 | + adrne lr, BSYM(1b) | |
| 25 | + bne do_IPI | |
| 26 | + | |
| 27 | +#ifdef CONFIG_LOCAL_TIMERS | |
| 28 | + test_for_ltirq r0, r6, r5, lr | |
| 29 | + movne r0, sp | |
| 30 | + adrne lr, BSYM(1b) | |
| 31 | + bne do_local_timer | |
| 32 | +#endif | |
| 33 | +#endif | |
| 34 | +9997: | |
| 35 | + .endm | |
| 36 | + | |
| 37 | + .macro arch_irq_handler, symbol_name | |
| 38 | + .align 5 | |
| 39 | + .global \symbol_name | |
| 40 | +\symbol_name: | |
| 41 | + mov r4, lr | |
| 42 | + arch_irq_handler_default | |
| 43 | + mov pc, r4 | |
| 44 | + .endm | |
| @@ -13,12 +13,13 @@ · 12 unmodified lines | ||
| 13 | 13 | #include <linux/preempt.h> |
| 14 | 14 | #include <linux/uaccess.h> |
| 15 | 15 | #include <asm/errno.h> |
| 16 | +#include <asm/domain.h> | |
| 16 | 17 | |
| 17 | 18 | #define __futex_atomic_op(insn, ret, oldval, uaddr, oparg) \ |
| 18 | 19 | __asm__ __volatile__( \ |
| 19 | − "1: ldrt %1, [%2]\n" \ | |
| 20 | + "1: " T(ldr) " %1, [%2]\n" \ | |
| 20 | 21 | " " insn "\n" \ |
| 21 | − "2: strt %0, [%2]\n" \ | |
| 22 | + "2: " T(str) " %0, [%2]\n" \ | |
| 22 | 23 | " mov %0, #0\n" \ |
| 23 | 24 | "3:\n" \ |
| 24 | 25 | " .pushsection __ex_table,\"a\"\n" \ |
| @@ -97,10 +98,10 @@ futex_atomic_cmpxchg_inatomic(int __user *uaddr, int oldval, int newval) · 72 unmodified lines | ||
| 97 | 98 | pagefault_disable(); /* implies preempt_disable() */ |
| 98 | 99 | |
| 99 | 100 | __asm__ __volatile__("@futex_atomic_cmpxchg_inatomic\n" |
| 100 | − "1: ldrt %0, [%3]\n" | |
| 101 | + "1: " T(ldr) " %0, [%3]\n" | |
| 101 | 102 | " teq %0, %1\n" |
| 102 | 103 | " it eq @ explicit IT needed for the 2b label\n" |
| 103 | − "2: streqt %2, [%3]\n" | |
| 104 | + "2: " T(streq) " %2, [%3]\n" | |
| 104 | 105 | "3:\n" |
| 105 | 106 | " .pushsection __ex_table,\"a\"\n" |
| 106 | 107 | " .align 3\n" |
| @@ -5,13 +5,31 @@ · 4 unmodified lines | ||
| 5 | 5 | #include <linux/threads.h> |
| 6 | 6 | #include <asm/irq.h> |
| 7 | 7 | |
| 8 | +#define NR_IPI 5 | |
| 9 | + | |
| 8 | 10 | typedef struct { |
| 9 | 11 | unsigned int __softirq_pending; |
| 12 | +#ifdef CONFIG_LOCAL_TIMERS | |
| 10 | 13 | unsigned int local_timer_irqs; |
| 14 | +#endif | |
| 15 | +#ifdef CONFIG_SMP | |
| 16 | + unsigned int ipi_irqs[NR_IPI]; | |
| 17 | +#endif | |
| 11 | 18 | } ____cacheline_aligned irq_cpustat_t; |
| 12 | 19 | |
| 13 | 20 | #include <linux/irq_cpustat.h> /* Standard mappings for irq_cpustat_t above */ |
| 14 | 21 | |
| 22 | +#define __inc_irq_stat(cpu, member) __IRQ_STAT(cpu, member)++ | |
| 23 | +#define __get_irq_stat(cpu, member) __IRQ_STAT(cpu, member) | |
| 24 | + | |
| 25 | +#ifdef CONFIG_SMP | |
| 26 | +u64 smp_irq_stat_cpu(unsigned int cpu); | |
| 27 | +#else | |
| 28 | +#define smp_irq_stat_cpu(cpu) 0 | |
| 29 | +#endif | |
| 30 | + | |
| 31 | +#define arch_irq_stat_cpu smp_irq_stat_cpu | |
| 32 | + | |
| 15 | 33 | #if NR_IRQS > 512 |
| 16 | 34 | #define HARDIRQ_BITS 10 |
| 17 | 35 | #elif NR_IRQS > 256 |
| @@ -36,6 +36,7 @@ · 35 unmodified lines | ||
| 36 | 36 | #define L2X0_RAW_INTR_STAT 0x21C |
| 37 | 37 | #define L2X0_INTR_CLEAR 0x220 |
| 38 | 38 | #define L2X0_CACHE_SYNC 0x730 |
| 39 | +#define L2X0_DUMMY_REG 0x740 | |
| 39 | 40 | #define L2X0_INV_LINE_PA 0x770 |
| 40 | 41 | #define L2X0_INV_WAY 0x77C |
| 41 | 42 | #define L2X0_CLEAN_LINE_PA 0x7B0 |
| @@ -59,7 +60,17 @@ · 17 unmodified lines | ||
| 59 | 60 | #define L2X0_CACHE_ID_PART_MASK (0xf << 6) |
| 60 | 61 | #define L2X0_CACHE_ID_PART_L210 (1 << 6) |
| 61 | 62 | #define L2X0_CACHE_ID_PART_L310 (3 << 6) |
| 62 | −#define L2X0_AUX_CTRL_WAY_SIZE_MASK (0x3 << 17) | |
| 63 | + | |
| 64 | +#define L2X0_AUX_CTRL_MASK 0xc0000fff | |
| 65 | +#define L2X0_AUX_CTRL_ASSOCIATIVITY_SHIFT 16 | |
| 66 | +#define L2X0_AUX_CTRL_WAY_SIZE_SHIFT 17 | |
| 67 | +#define L2X0_AUX_CTRL_WAY_SIZE_MASK (0x3 << 17) | |
| 68 | +#define L2X0_AUX_CTRL_SHARE_OVERRIDE_SHIFT 22 | |
| 69 | +#define L2X0_AUX_CTRL_NS_LOCKDOWN_SHIFT 26 | |
| 70 | +#define L2X0_AUX_CTRL_NS_INT_CTRL_SHIFT 27 | |
| 71 | +#define L2X0_AUX_CTRL_DATA_PREFETCH_SHIFT 28 | |
| 72 | +#define L2X0_AUX_CTRL_INSTR_PREFETCH_SHIFT 29 | |
| 73 | +#define L2X0_AUX_CTRL_EARLY_BRESP_SHIFT 30 | |
| 63 | 74 | |
| 64 | 75 | #ifndef __ASSEMBLY__ |
| 65 | 76 | extern void __init l2x0_init(void __iomem *base, __u32 aux_val, __u32 aux_mask); |
| @@ -0,0 +1,75 @@ | ||
| 1 | +/* | |
| 2 | + * arch/arm/include/asm/hardware/entry-macro-gic.S | |
| 3 | + * | |
| 4 | + * Low-level IRQ helper macros for GIC | |
| 5 | + * | |
| 6 | + * This file is licensed under the terms of the GNU General Public | |
| 7 | + * License version 2. This program is licensed "as is" without any | |
| 8 | + * warranty of any kind, whether express or implied. | |
| 9 | + */ | |
| 10 | + | |
| 11 | +#include <asm/hardware/gic.h> | |
| 12 | + | |
| 13 | +#ifndef HAVE_GET_IRQNR_PREAMBLE | |
| 14 | + .macro get_irqnr_preamble, base, tmp | |
| 15 | + ldr \base, =gic_cpu_base_addr | |
| 16 | + ldr \base, [\base] | |
| 17 | + .endm | |
| 18 | +#endif | |
| 19 | + | |
| 20 | +/* | |
| 21 | + * The interrupt numbering scheme is defined in the | |
| 22 | + * interrupt controller spec. To wit: | |
| 23 | + * | |
| 24 | + * Interrupts 0-15 are IPI | |
| 25 | + * 16-28 are reserved | |
| 26 | + * 29-31 are local. We allow 30 to be used for the watchdog. | |
| 27 | + * 32-1020 are global | |
| 28 | + * 1021-1022 are reserved | |
| 29 | + * 1023 is "spurious" (no interrupt) | |
| 30 | + * | |
| 31 | + * For now, we ignore all local interrupts so only return an interrupt if it's | |
| 32 | + * between 30 and 1020. The test_for_ipi routine below will pick up on IPIs. | |
| 33 | + * | |
| 34 | + * A simple read from the controller will tell us the number of the highest | |
| 35 | + * priority enabled interrupt. We then just need to check whether it is in the | |
| 36 | + * valid range for an IRQ (30-1020 inclusive). | |
| 37 | + */ | |
| 38 | + | |
| 39 | + .macro get_irqnr_and_base, irqnr, irqstat, base, tmp | |
| 40 | + | |
| 41 | + ldr \irqstat, [\base, #GIC_CPU_INTACK] | |
| 42 | + /* bits 12-10 = src CPU, 9-0 = int # */ | |
| 43 | + | |
| 44 | + ldr \tmp, =1021 | |
| 45 | + bic \irqnr, \irqstat, #0x1c00 | |
| 46 | + cmp \irqnr, #29 | |
| 47 | + cmpcc \irqnr, \irqnr | |
| 48 | + cmpne \irqnr, \tmp | |
| 49 | + cmpcs \irqnr, \irqnr | |
| 50 | + .endm | |
| 51 | + | |
| 52 | +/* We assume that irqstat (the raw value of the IRQ acknowledge | |
| 53 | + * register) is preserved from the macro above. | |
| 54 | + * If there is an IPI, we immediately signal end of interrupt on the | |
| 55 | + * controller, since this requires the original irqstat value which | |
| 56 | + * we won't easily be able to recreate later. | |
| 57 | + */ | |
| 58 | + | |
| 59 | + .macro test_for_ipi, irqnr, irqstat, base, tmp | |
| 60 | + bic \irqnr, \irqstat, #0x1c00 | |
| 61 | + cmp \irqnr, #16 | |
| 62 | + strcc \irqstat, [\base, #GIC_CPU_EOI] | |
| 63 | + cmpcs \irqnr, \irqnr | |
| 64 | + .endm | |
| 65 | + | |
| 66 | +/* As above, this assumes that irqstat and base are preserved.. */ | |
| 67 | + | |
| 68 | + .macro test_for_ltirq, irqnr, irqstat, base, tmp | |
| 69 | + bic \irqnr, \irqstat, #0x1c00 | |
| 70 | + mov \tmp, #0 | |
| 71 | + cmp \irqnr, #29 | |
| 72 | + moveq \tmp, #1 | |
| 73 | + streq \irqstat, [\base, #GIC_CPU_EOI] | |
| 74 | + cmp \tmp, #0 | |
| 75 | + .endm | |
| @@ -33,10 +33,13 @@ · 32 unmodified lines | ||
| 33 | 33 | #define GIC_DIST_SOFTINT 0xf00 |
| 34 | 34 | |
| 35 | 35 | #ifndef __ASSEMBLY__ |
| 36 | −void gic_dist_init(unsigned int gic_nr, void __iomem *base, unsigned int irq_start); | |
| 37 | −void gic_cpu_init(unsigned int gic_nr, void __iomem *base); | |
| 36 | +extern void __iomem *gic_cpu_base_addr; | |
| 37 | + | |
| 38 | +void gic_init(unsigned int, unsigned int, void __iomem *, void __iomem *); | |
| 39 | +void gic_secondary_init(unsigned int); | |
| 38 | 40 | void gic_cascade_irq(unsigned int gic_nr, unsigned int irq); |
| 39 | 41 | void gic_raise_softirq(const struct cpumask *mask, unsigned int irq); |
| 42 | +void gic_enable_ppi(unsigned int); | |
| 40 | 43 | #endif |
| 41 | 44 | |
| 42 | 45 | #endif |
| @@ -50,8 +50,17 @@ · 49 unmodified lines | ||
| 50 | 50 | #define SCPCELLID2 0xFF8 |
| 51 | 51 | #define SCPCELLID3 0xFFC |
| 52 | 52 | |
| 53 | +#define SCCTRL_TIMEREN0SEL_REFCLK (0 << 15) | |
| 54 | +#define SCCTRL_TIMEREN0SEL_TIMCLK (1 << 15) | |
| 55 | + | |
| 56 | +#define SCCTRL_TIMEREN1SEL_REFCLK (0 << 17) | |
| 57 | +#define SCCTRL_TIMEREN1SEL_TIMCLK (1 << 17) | |
| 58 | + | |
| 53 | 59 | static inline void sysctl_soft_reset(void __iomem *base) |
| 54 | 60 | { |
| 61 | + /* switch to slow mode */ | |
| 62 | + writel(0x2, base + SCCTRL); | |
| 63 | + | |
| 55 | 64 | /* writing any value to SCSYSSTAT reg will reset system */ |
| 56 | 65 | writel(0, base + SCSYSSTAT); |
| 57 | 66 | } |
File renamed without changes.
| @@ -20,8 +20,8 @@ struct arch_hw_breakpoint_ctrl { · 19 unmodified lines | ||
| 20 | 20 | struct arch_hw_breakpoint { |
| 21 | 21 | u32 address; |
| 22 | 22 | u32 trigger; |
| 23 | − struct perf_event *suspended_wp; | |
| 24 | − struct arch_hw_breakpoint_ctrl ctrl; | |
| 23 | + struct arch_hw_breakpoint_ctrl step_ctrl; | |
| 24 | + struct arch_hw_breakpoint_ctrl ctrl; | |
| 25 | 25 | }; |
| 26 | 26 | |
| 27 | 27 | static inline u32 encode_ctrl_reg(struct arch_hw_breakpoint_ctrl ctrl) |
| @@ -95,6 +95,15 @@ static inline void __iomem *__typesafe_io(unsigned long addr) · 94 unmodified lines | ||
| 95 | 95 | return (void __iomem *)addr; |
| 96 | 96 | } |
| 97 | 97 | |
| 98 | +/* IO barriers */ | |
| 99 | +#ifdef CONFIG_ARM_DMA_MEM_BUFFERABLE | |
| 100 | +#define __iormb() rmb() | |
| 101 | +#define __iowmb() wmb() | |
| 102 | +#else | |
| 103 | +#define __iormb() do { } while (0) | |
| 104 | +#define __iowmb() do { } while (0) | |
| 105 | +#endif | |
| 106 | + | |
| 98 | 107 | /* |
| 99 | 108 | * Now, pick up the machine-defined IO definitions |
| 100 | 109 | */ |
| @@ -125,17 +134,17 @@ static inline void __iomem *__typesafe_io(unsigned long addr) · 24 unmodified lines | ||
| 125 | 134 | * The {in,out}[bwl] macros are for emulating x86-style PCI/ISA IO space. |
| 126 | 135 | */ |
| 127 | 136 | #ifdef __io |
| 128 | −#define outb(v,p) __raw_writeb(v,__io(p)) | |
| 129 | −#define outw(v,p) __raw_writew((__force __u16) \ | |
| 130 | − cpu_to_le16(v),__io(p)) | |
| 131 | −#define outl(v,p) __raw_writel((__force __u32) \ | |
| 132 | − cpu_to_le32(v),__io(p)) | |
| 137 | +#define outb(v,p) ({ __iowmb(); __raw_writeb(v,__io(p)); }) | |
| 138 | +#define outw(v,p) ({ __iowmb(); __raw_writew((__force __u16) \ | |
| 139 | + cpu_to_le16(v),__io(p)); }) | |
| 140 | +#define outl(v,p) ({ __iowmb(); __raw_writel((__force __u32) \ | |
| 141 | + cpu_to_le32(v),__io(p)); }) | |
| 133 | 142 | |
| 134 | −#define inb(p) ({ __u8 __v = __raw_readb(__io(p)); __v; }) | |
| 143 | +#define inb(p) ({ __u8 __v = __raw_readb(__io(p)); __iormb(); __v; }) | |
| 135 | 144 | #define inw(p) ({ __u16 __v = le16_to_cpu((__force __le16) \ |
| 136 | − __raw_readw(__io(p))); __v; }) | |
| 145 | + __raw_readw(__io(p))); __iormb(); __v; }) | |
| 137 | 146 | #define inl(p) ({ __u32 __v = le32_to_cpu((__force __le32) \ |
| 138 | − __raw_readl(__io(p))); __v; }) | |
| 147 | + __raw_readl(__io(p))); __iormb(); __v; }) | |
| 139 | 148 | |
| 140 | 149 | #define outsb(p,d,l) __raw_writesb(__io(p),d,l) |
| 141 | 150 | #define outsw(p,d,l) __raw_writesw(__io(p),d,l) |
| @@ -192,14 +201,6 @@ extern void _memset_io(volatile void __iomem *, int, size_t); · 50 unmodified lines | ||
| 192 | 201 | #define writel_relaxed(v,c) ((void)__raw_writel((__force u32) \ |
| 193 | 202 | cpu_to_le32(v),__mem_pci(c))) |
| 194 | 203 | |
| 195 | −#ifdef CONFIG_ARM_DMA_MEM_BUFFERABLE | |
| 196 | −#define __iormb() rmb() | |
| 197 | −#define __iowmb() wmb() | |
| 198 | −#else | |
| 199 | −#define __iormb() do { } while (0) | |
| 200 | −#define __iowmb() do { } while (0) | |
| 201 | −#endif | |
| 202 | − | |
| 203 | 204 | #define readb(c) ({ u8 __v = readb_relaxed(c); __iormb(); __v; }) |
| 204 | 205 | #define readw(c) ({ u16 __v = readw_relaxed(c); __iormb(); __v; }) |
| 205 | 206 | #define readl(c) ({ u32 __v = readl_relaxed(c); __iormb(); __v; }) |
| @@ -241,18 +242,15 @@ extern void _memset_io(volatile void __iomem *, int, size_t); · 35 unmodified lines | ||
| 241 | 242 | * |
| 242 | 243 | */ |
| 243 | 244 | #ifndef __arch_ioremap |
| 244 | −#define ioremap(cookie,size) __arm_ioremap(cookie, size, MT_DEVICE) | |
| 245 | −#define ioremap_nocache(cookie,size) __arm_ioremap(cookie, size, MT_DEVICE) | |
| 246 | −#define ioremap_cached(cookie,size) __arm_ioremap(cookie, size, MT_DEVICE_CACHED) | |
| 247 | −#define ioremap_wc(cookie,size) __arm_ioremap(cookie, size, MT_DEVICE_WC) | |
| 248 | −#define iounmap(cookie) __iounmap(cookie) | |
| 249 | −#else | |
| 245 | +#define __arch_ioremap __arm_ioremap | |
| 246 | +#define __arch_iounmap __iounmap | |
| 247 | +#endif | |
| 248 | + | |
| 250 | 249 | #define ioremap(cookie,size) __arch_ioremap((cookie), (size), MT_DEVICE) |
| 251 | 250 | #define ioremap_nocache(cookie,size) __arch_ioremap((cookie), (size), MT_DEVICE) |
| 252 | 251 | #define ioremap_cached(cookie,size) __arch_ioremap((cookie), (size), MT_DEVICE_CACHED) |
| 253 | 252 | #define ioremap_wc(cookie,size) __arch_ioremap((cookie), (size), MT_DEVICE_WC) |
| 254 | −#define iounmap(cookie) __arch_iounmap(cookie) | |
| 255 | −#endif | |
| 253 | +#define iounmap __arch_iounmap | |
| 256 | 254 | |
| 257 | 255 | /* |
| 258 | 256 | * io{read,write}{8,16,32} macros |
| @@ -33,10 +33,20 @@ static inline void crash_setup_regs(struct pt_regs *newregs, · 32 unmodified lines | ||
| 33 | 33 | if (oldregs) { |
| 34 | 34 | memcpy(newregs, oldregs, sizeof(*newregs)); |
| 35 | 35 | } else { |
| 36 | − __asm__ __volatile__ ("stmia %0, {r0 - r15}" | |
| 37 | − : : "r" (&newregs->ARM_r0)); | |
| 38 | − __asm__ __volatile__ ("mrs %0, cpsr" | |
| 39 | − : "=r" (newregs->ARM_cpsr)); | |
| 36 | + __asm__ __volatile__ ( | |
| 37 | + "stmia %[regs_base], {r0-r12}\n\t" | |
| 38 | + "mov %[_ARM_sp], sp\n\t" | |
| 39 | + "str lr, %[_ARM_lr]\n\t" | |
| 40 | + "adr %[_ARM_pc], 1f\n\t" | |
| 41 | + "mrs %[_ARM_cpsr], cpsr\n\t" | |
| 42 | + "1:" | |
| 43 | + : [_ARM_pc] "=r" (newregs->ARM_pc), | |
| 44 | + [_ARM_cpsr] "=r" (newregs->ARM_cpsr), | |
| 45 | + [_ARM_sp] "=r" (newregs->ARM_sp), | |
| 46 | + [_ARM_lr] "=o" (newregs->ARM_lr) | |
| 47 | + : [regs_base] "r" (&newregs->ARM_r0) | |
| 48 | + : "memory" | |
| 49 | + ); | |
| 40 | 50 | } |
| 41 | 51 | } |
| 42 | 52 | |
| @@ -30,7 +30,6 @@ asmlinkage void do_local_timer(struct pt_regs *); · 29 unmodified lines | ||
| 30 | 30 | #include "smp_twd.h" |
| 31 | 31 | |
| 32 | 32 | #define local_timer_ack() twd_timer_ack() |
| 33 | −#define local_timer_stop() twd_timer_stop() | |
| 34 | 33 | |
| 35 | 34 | #else |
| 36 | 35 | |
| @@ -40,11 +39,6 @@ asmlinkage void do_local_timer(struct pt_regs *); · 3 unmodified lines | ||
| 40 | 39 | */ |
| 41 | 40 | int local_timer_ack(void); |
| 42 | 41 | |
| 43 | −/* | |
| 44 | − * Stop a local timer interrupt. | |
| 45 | − */ | |
| 46 | −void local_timer_stop(void); | |
| 47 | − | |
| 48 | 42 | #endif |
| 49 | 43 | |
| 50 | 44 | /* |
| @@ -52,12 +46,6 @@ void local_timer_stop(void); · 1 unmodified line | ||
| 52 | 46 | */ |
| 53 | 47 | void local_timer_setup(struct clock_event_device *); |
| 54 | 48 | |
| 55 | −#else | |
| 56 | − | |
| 57 | −static inline void local_timer_stop(void) | |
| 58 | −{ | |
| 59 | −} | |
| 60 | − | |
| 61 | 49 | #endif |
| 62 | 50 | |
| 63 | 51 | #endif |
| @@ -37,11 +37,20 @@ struct machine_desc { · 36 unmodified lines | ||
| 37 | 37 | struct meminfo *); |
| 38 | 38 | void (*reserve)(void);/* reserve mem blocks */ |
| 39 | 39 | void (*map_io)(void);/* IO mapping function */ |
| 40 | + void (*init_early)(void); | |
| 40 | 41 | void (*init_irq)(void); |
| 41 | 42 | struct sys_timer *timer; /* system tick timer */ |
| 42 | 43 | void (*init_machine)(void); |
| 44 | +#ifdef CONFIG_MULTI_IRQ_HANDLER | |
| 45 | + void (*handle_irq)(struct pt_regs *); | |
| 46 | +#endif | |
| 43 | 47 | }; |
| 44 | 48 | |
| 49 | +/* | |
| 50 | + * Current machine - only accessible during boot. | |
| 51 | + */ | |
| 52 | +extern struct machine_desc *machine_desc; | |
| 53 | + | |
| 45 | 54 | /* |
| 46 | 55 | * Set of macros to define architecture features. This is built into |
| 47 | 56 | * a table by the linker. |
| @@ -17,10 +17,12 @@ struct seq_file; · 16 unmodified lines | ||
| 17 | 17 | /* |
| 18 | 18 | * This is internal. Do not use it. |
| 19 | 19 | */ |
| 20 | −extern unsigned int arch_nr_irqs; | |
| 21 | −extern void (*init_arch_irq)(void); | |
| 22 | 20 | extern void init_FIQ(void); |
| 23 | −extern int show_fiq_list(struct seq_file *, void *); | |
| 21 | +extern int show_fiq_list(struct seq_file *, int); | |
| 22 | + | |
| 23 | +#ifdef CONFIG_MULTI_IRQ_HANDLER | |
| 24 | +extern void (*handle_arch_irq)(struct pt_regs *); | |
| 25 | +#endif | |
| 24 | 26 | |
| 25 | 27 | /* |
| 26 | 28 | * This is for easy migration, but should be changed in the source |
| @@ -43,7 +43,6 @@ struct sys_timer { · 42 unmodified lines | ||
| 43 | 43 | #endif |
| 44 | 44 | }; |
| 45 | 45 | |
| 46 | −extern struct sys_timer *system_timer; | |
| 47 | 46 | extern void timer_tick(void); |
| 48 | 47 | |
| 49 | 48 | #endif |
| @@ -188,7 +188,7 @@ · 187 unmodified lines | ||
| 188 | 188 | * translation for translating DMA addresses. Use the driver |
| 189 | 189 | * DMA support - see dma-mapping.h. |
| 190 | 190 | */ |
| 191 | −static inline unsigned long virt_to_phys(void *x) | |
| 191 | +static inline unsigned long virt_to_phys(const volatile void *x) | |
| 192 | 192 | { |
| 193 | 193 | return __virt_to_phys((unsigned long)(x)); |
| 194 | 194 | } |
| @@ -8,11 +8,6 @@ · 7 unmodified lines | ||
| 8 | 8 | struct unwind_table; |
| 9 | 9 | |
| 10 | 10 | #ifdef CONFIG_ARM_UNWIND |
| 11 | −struct arm_unwind_mapping { | |
| 12 | − Elf_Shdr *unw_sec; | |
| 13 | − Elf_Shdr *sec_text; | |
| 14 | − struct unwind_table *unwind; | |
| 15 | −}; | |
| 16 | 11 | enum { |
| 17 | 12 | ARM_SEC_INIT, |
| 18 | 13 | ARM_SEC_DEVINIT, |
| @@ -21,13 +16,13 @@ enum { · 2 unmodified lines | ||
| 21 | 16 | ARM_SEC_DEVEXIT, |
| 22 | 17 | ARM_SEC_MAX, |
| 23 | 18 | }; |
| 19 | +#endif | |
| 20 | + | |
| 24 | 21 | struct mod_arch_specific { |
| 25 | − struct arm_unwind_mapping map[ARM_SEC_MAX]; | |
| 26 | −}; | |
| 27 | −#else | |
| 28 | −struct mod_arch_specific { | |
| 29 | −}; | |
| 22 | +#ifdef CONFIG_ARM_UNWIND | |
| 23 | + struct unwind_table *unwind[ARM_SEC_MAX]; | |
| 30 | 24 | #endif |
| 25 | +}; | |
| 31 | 26 | |
| 32 | 27 | /* |
| 33 | 28 | * Include the ARM architecture version. |
| @@ -151,13 +151,15 @@ extern void __cpu_copy_user_highpage(struct page *to, struct page *from, · 150 unmodified lines | ||
| 151 | 151 | #define clear_page(page) memset((void *)(page), 0, PAGE_SIZE) |
| 152 | 152 | extern void copy_page(void *to, const void *from); |
| 153 | 153 | |
| 154 | +typedef unsigned long pteval_t; | |
| 155 | + | |
| 154 | 156 | #undef STRICT_MM_TYPECHECKS |
| 155 | 157 | |
| 156 | 158 | #ifdef STRICT_MM_TYPECHECKS |
| 157 | 159 | /* |
| 158 | 160 | * These are used to make use of C type-checking.. |
| 159 | 161 | */ |
| 160 | −typedef struct { unsigned long pte; } pte_t; | |
| 162 | +typedef struct { pteval_t pte; } pte_t; | |
| 161 | 163 | typedef struct { unsigned long pmd; } pmd_t; |
| 162 | 164 | typedef struct { unsigned long pgd[2]; } pgd_t; |
| 163 | 165 | typedef struct { unsigned long pgprot; } pgprot_t; |
| @@ -175,7 +177,7 @@ typedef struct { unsigned long pgprot; } pgprot_t; · 11 unmodified lines | ||
| 175 | 177 | /* |
| 176 | 178 | * .. while these make it easier on the compiler |
| 177 | 179 | */ |
| 178 | −typedef unsigned long pte_t; | |
| 180 | +typedef pteval_t pte_t; | |
| 179 | 181 | typedef unsigned long pmd_t; |
| 180 | 182 | typedef unsigned long pgd_t[2]; |
| 181 | 183 | typedef unsigned long pgprot_t; |
| @@ -30,14 +30,16 @@ · 29 unmodified lines | ||
| 30 | 30 | #define pmd_free(mm, pmd) do { } while (0) |
| 31 | 31 | #define pgd_populate(mm,pmd,pte) BUG() |
| 32 | 32 | |
| 33 | −extern pgd_t *get_pgd_slow(struct mm_struct *mm); | |
| 34 | −extern void free_pgd_slow(struct mm_struct *mm, pgd_t *pgd); | |
| 35 | − | |
| 36 | −#define pgd_alloc(mm) get_pgd_slow(mm) | |
| 37 | −#define pgd_free(mm, pgd) free_pgd_slow(mm, pgd) | |
| 33 | +extern pgd_t *pgd_alloc(struct mm_struct *mm); | |
| 34 | +extern void pgd_free(struct mm_struct *mm, pgd_t *pgd); | |
| 38 | 35 | |
| 39 | 36 | #define PGALLOC_GFP (GFP_KERNEL | __GFP_NOTRACK | __GFP_REPEAT | __GFP_ZERO) |
| 40 | 37 | |
| 38 | +static inline void clean_pte_table(pte_t *pte) | |
| 39 | +{ | |
| 40 | + clean_dcache_area(pte + PTE_HWTABLE_PTRS, PTE_HWTABLE_SIZE); | |
| 41 | +} | |
| 42 | + | |
| 41 | 43 | /* |
| 42 | 44 | * Allocate one PTE table. |
| 43 | 45 | * |
| @@ -45,14 +47,14 @@ extern void free_pgd_slow(struct mm_struct *mm, pgd_t *pgd); · 1 unmodified line | ||
| 45 | 47 | * into one table thus: |
| 46 | 48 | * |
| 47 | 49 | * +------------+ |
| 48 | − * | h/w pt 0 | | |
| 49 | − * +------------+ | |
| 50 | − * | h/w pt 1 | | |
| 51 | − * +------------+ | |
| 52 | 50 | * | Linux pt 0 | |
| 53 | 51 | * +------------+ |
| 54 | 52 | * | Linux pt 1 | |
| 55 | 53 | * +------------+ |
| 54 | + * | h/w pt 0 | | |
| 55 | + * +------------+ | |
| 56 | + * | h/w pt 1 | | |
| 57 | + * +------------+ | |
| 56 | 58 | */ |
| 57 | 59 | static inline pte_t * |
| 58 | 60 | pte_alloc_one_kernel(struct mm_struct *mm, unsigned long addr) |
| @@ -60,10 +62,8 @@ pte_alloc_one_kernel(struct mm_struct *mm, unsigned long addr) · 1 unmodified line | ||
| 60 | 62 | pte_t *pte; |
| 61 | 63 | |
| 62 | 64 | pte = (pte_t *)__get_free_page(PGALLOC_GFP); |
| 63 | − if (pte) { | |
| 64 | − clean_dcache_area(pte, sizeof(pte_t) * PTRS_PER_PTE); | |
| 65 | − pte += PTRS_PER_PTE; | |
| 66 | − } | |
| 65 | + if (pte) | |
| 66 | + clean_pte_table(pte); | |
| 67 | 67 | |
| 68 | 68 | return pte; |
| 69 | 69 | } |
| @@ -79,10 +79,8 @@ pte_alloc_one(struct mm_struct *mm, unsigned long addr) · 9 unmodified lines | ||
| 79 | 79 | pte = alloc_pages(PGALLOC_GFP, 0); |
| 80 | 80 | #endif |
| 81 | 81 | if (pte) { |
| 82 | − if (!PageHighMem(pte)) { | |
| 83 | − void *page = page_address(pte); | |
| 84 | − clean_dcache_area(page, sizeof(pte_t) * PTRS_PER_PTE); | |
| 85 | − } | |
| 82 | + if (!PageHighMem(pte)) | |
| 83 | + clean_pte_table(page_address(pte)); | |
| 86 | 84 | pgtable_page_ctor(pte); |
| 87 | 85 | } |
| 88 | 86 | |
| @@ -94,10 +92,8 @@ pte_alloc_one(struct mm_struct *mm, unsigned long addr) · 5 unmodified lines | ||
| 94 | 92 | */ |
| 95 | 93 | static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte) |
| 96 | 94 | { |
| 97 | − if (pte) { | |
| 98 | − pte -= PTRS_PER_PTE; | |
| 95 | + if (pte) | |
| 99 | 96 | free_page((unsigned long)pte); |
| 100 | − } | |
| 101 | 97 | } |
| 102 | 98 | |
| 103 | 99 | static inline void pte_free(struct mm_struct *mm, pgtable_t pte) |
| @@ -106,8 +102,10 @@ static inline void pte_free(struct mm_struct *mm, pgtable_t pte) · 2 unmodified lines | ||
| 106 | 102 | __free_page(pte); |
| 107 | 103 | } |
| 108 | 104 | |
| 109 | −static inline void __pmd_populate(pmd_t *pmdp, unsigned long pmdval) | |
| 105 | +static inline void __pmd_populate(pmd_t *pmdp, phys_addr_t pte, | |
| 106 | + unsigned long prot) | |
| 110 | 107 | { |
| 108 | + unsigned long pmdval = (pte + PTE_HWTABLE_OFF) | prot; | |
| 111 | 109 | pmdp[0] = __pmd(pmdval); |
| 112 | 110 | pmdp[1] = __pmd(pmdval + 256 * sizeof(pte_t)); |
| 113 | 111 | flush_pmd_entry(pmdp); |
| @@ -122,20 +120,16 @@ static inline void __pmd_populate(pmd_t *pmdp, unsigned long pmdval) · 8 unmodified lines | ||
| 122 | 120 | static inline void |
| 123 | 121 | pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmdp, pte_t *ptep) |
| 124 | 122 | { |
| 125 | − unsigned long pte_ptr = (unsigned long)ptep; | |
| 126 | − | |
| 127 | 123 | /* |
| 128 | − * The pmd must be loaded with the physical | |
| 129 | − * address of the PTE table | |
| 124 | + * The pmd must be loaded with the physical address of the PTE table | |
| 130 | 125 | */ |
| 131 | − pte_ptr -= PTRS_PER_PTE * sizeof(void *); | |
| 132 | − __pmd_populate(pmdp, __pa(pte_ptr) | _PAGE_KERNEL_TABLE); | |
| 126 | + __pmd_populate(pmdp, __pa(ptep), _PAGE_KERNEL_TABLE); | |
| 133 | 127 | } |
| 134 | 128 | |
| 135 | 129 | static inline void |
| 136 | 130 | pmd_populate(struct mm_struct *mm, pmd_t *pmdp, pgtable_t ptep) |
| 137 | 131 | { |
| 138 | − __pmd_populate(pmdp, page_to_pfn(ptep) << PAGE_SHIFT | _PAGE_USER_TABLE); | |
| 132 | + __pmd_populate(pmdp, page_to_phys(ptep), _PAGE_USER_TABLE); | |
| 139 | 133 | } |
| 140 | 134 | #define pmd_pgtable(pmd) pmd_page(pmd) |
| 141 | 135 | |
| @@ -10,6 +10,7 @@ · 9 unmodified lines | ||
| 10 | 10 | #ifndef _ASMARM_PGTABLE_H |
| 11 | 11 | #define _ASMARM_PGTABLE_H |
| 12 | 12 | |
| 13 | +#include <linux/const.h> | |
| 13 | 14 | #include <asm-generic/4level-fixup.h> |
| 14 | 15 | #include <asm/proc-fns.h> |
| 15 | 16 | |
| @@ -54,7 +55,7 @@ · 38 unmodified lines | ||
| 54 | 55 | * Therefore, we tweak the implementation slightly - we tell Linux that we |
| 55 | 56 | * have 2048 entries in the first level, each of which is 8 bytes (iow, two |
| 56 | 57 | * hardware pointers to the second level.) The second level contains two |
| 57 | − * hardware PTE tables arranged contiguously, followed by Linux versions | |
| 58 | + * hardware PTE tables arranged contiguously, preceded by Linux versions | |
| 58 | 59 | * which contain the state information Linux needs. We, therefore, end up |
| 59 | 60 | * with 512 entries in the "PTE" level. |
| 60 | 61 | * |
| @@ -62,15 +63,15 @@ · 1 unmodified line | ||
| 62 | 63 | * |
| 63 | 64 | * pgd pte |
| 64 | 65 | * | | |
| 65 | − * +--------+ +0 | |
| 66 | − * | |-----> +------------+ +0 | |
| 66 | + * +--------+ | |
| 67 | + * | | +------------+ +0 | |
| 68 | + * +- - - - + | Linux pt 0 | | |
| 69 | + * | | +------------+ +1024 | |
| 70 | + * +--------+ +0 | Linux pt 1 | | |
| 71 | + * | |-----> +------------+ +2048 | |
| 67 | 72 | * +- - - - + +4 | h/w pt 0 | |
| 68 | − * | |-----> +------------+ +1024 | |
| 73 | + * | |-----> +------------+ +3072 | |
| 69 | 74 | * +--------+ +8 | h/w pt 1 | |
| 70 | − * | | +------------+ +2048 | |
| 71 | − * +- - - - + | Linux pt 0 | | |
| 72 | − * | | +------------+ +3072 | |
| 73 | − * +--------+ | Linux pt 1 | | |
| 74 | 75 | * | | +------------+ +4096 |
| 75 | 76 | * |
| 76 | 77 | * See L_PTE_xxx below for definitions of bits in the "Linux pt", and |
| @@ -102,6 +103,10 @@ · 25 unmodified lines | ||
| 102 | 103 | #define PTRS_PER_PMD 1 |
| 103 | 104 | #define PTRS_PER_PGD 2048 |
| 104 | 105 | |
| 106 | +#define PTE_HWTABLE_PTRS (PTRS_PER_PTE) | |
| 107 | +#define PTE_HWTABLE_OFF (PTE_HWTABLE_PTRS * sizeof(pte_t)) | |
| 108 | +#define PTE_HWTABLE_SIZE (PTRS_PER_PTE * sizeof(u32)) | |
| 109 | + | |
| 105 | 110 | /* |
| 106 | 111 | * PMD_SHIFT determines the size of the area a second-level page table can map |
| 107 | 112 | * PGDIR_SHIFT determines what a third-level page table entry can map |
| @@ -112,13 +117,13 @@ · 4 unmodified lines | ||
| 112 | 117 | #define LIBRARY_TEXT_START 0x0c000000 |
| 113 | 118 | |
| 114 | 119 | #ifndef __ASSEMBLY__ |
| 115 | −extern void __pte_error(const char *file, int line, unsigned long val); | |
| 116 | −extern void __pmd_error(const char *file, int line, unsigned long val); | |
| 117 | −extern void __pgd_error(const char *file, int line, unsigned long val); | |
| 120 | +extern void __pte_error(const char *file, int line, pte_t); | |
| 121 | +extern void __pmd_error(const char *file, int line, pmd_t); | |
| 122 | +extern void __pgd_error(const char *file, int line, pgd_t); | |
| 118 | 123 | |
| 119 | −#define pte_ERROR(pte) __pte_error(__FILE__, __LINE__, pte_val(pte)) | |
| 120 | −#define pmd_ERROR(pmd) __pmd_error(__FILE__, __LINE__, pmd_val(pmd)) | |
| 121 | −#define pgd_ERROR(pgd) __pgd_error(__FILE__, __LINE__, pgd_val(pgd)) | |
| 124 | +#define pte_ERROR(pte) __pte_error(__FILE__, __LINE__, pte) | |
| 125 | +#define pmd_ERROR(pmd) __pmd_error(__FILE__, __LINE__, pmd) | |
| 126 | +#define pgd_ERROR(pgd) __pgd_error(__FILE__, __LINE__, pgd) | |
| 122 | 127 | #endif /* !__ASSEMBLY__ */ |
| 123 | 128 | |
| 124 | 129 | #define PMD_SIZE (1UL << PMD_SHIFT) |
| @@ -133,8 +138,7 @@ extern void __pgd_error(const char *file, int line, unsigned long val); · 8 unmodified lines | ||
| 133 | 138 | */ |
| 134 | 139 | #define FIRST_USER_ADDRESS PAGE_SIZE |
| 135 | 140 | |
| 136 | −#define FIRST_USER_PGD_NR 1 | |
| 137 | −#define USER_PTRS_PER_PGD ((TASK_SIZE/PGDIR_SIZE) - FIRST_USER_PGD_NR) | |
| 141 | +#define USER_PTRS_PER_PGD (TASK_SIZE / PGDIR_SIZE) | |
| 138 | 142 | |
| 139 | 143 | /* |
| 140 | 144 | * section address mask and size definitions. |
| @@ -161,30 +165,30 @@ extern void __pgd_error(const char *file, int line, unsigned long val); · 20 unmodified lines | ||
| 161 | 165 | * The PTE table pointer refers to the hardware entries; the "Linux" |
| 162 | 166 | * entries are stored 1024 bytes below. |
| 163 | 167 | */ |
| 164 | −#define L_PTE_PRESENT (1 << 0) | |
| 165 | −#define L_PTE_YOUNG (1 << 1) | |
| 166 | −#define L_PTE_FILE (1 << 2) /* only when !PRESENT */ | |
| 167 | −#define L_PTE_DIRTY (1 << 6) | |
| 168 | −#define L_PTE_WRITE (1 << 7) | |
| 169 | −#define L_PTE_USER (1 << 8) | |
| 170 | −#define L_PTE_EXEC (1 << 9) | |
| 171 | −#define L_PTE_SHARED (1 << 10) /* shared(v6), coherent(xsc3) */ | |
| 168 | +#define L_PTE_PRESENT (_AT(pteval_t, 1) << 0) | |
| 169 | +#define L_PTE_YOUNG (_AT(pteval_t, 1) << 1) | |
| 170 | +#define L_PTE_FILE (_AT(pteval_t, 1) << 2) /* only when !PRESENT */ | |
| 171 | +#define L_PTE_DIRTY (_AT(pteval_t, 1) << 6) | |
| 172 | +#define L_PTE_RDONLY (_AT(pteval_t, 1) << 7) | |
| 173 | +#define L_PTE_USER (_AT(pteval_t, 1) << 8) | |
| 174 | +#define L_PTE_XN (_AT(pteval_t, 1) << 9) | |
| 175 | +#define L_PTE_SHARED (_AT(pteval_t, 1) << 10) /* shared(v6), coherent(xsc3) */ | |
| 172 | 176 | |
| 173 | 177 | /* |
| 174 | 178 | * These are the memory types, defined to be compatible with |
| 175 | 179 | * pre-ARMv6 CPUs cacheable and bufferable bits: XXCB |
| 176 | 180 | */ |
| 177 | −#define L_PTE_MT_UNCACHED (0x00 << 2) /* 0000 */ | |
| 178 | −#define L_PTE_MT_BUFFERABLE (0x01 << 2) /* 0001 */ | |
| 179 | −#define L_PTE_MT_WRITETHROUGH (0x02 << 2) /* 0010 */ | |
| 180 | −#define L_PTE_MT_WRITEBACK (0x03 << 2) /* 0011 */ | |
| 181 | −#define L_PTE_MT_MINICACHE (0x06 << 2) /* 0110 (sa1100, xscale) */ | |
| 182 | −#define L_PTE_MT_WRITEALLOC (0x07 << 2) /* 0111 */ | |
| 183 | −#define L_PTE_MT_DEV_SHARED (0x04 << 2) /* 0100 */ | |
| 184 | −#define L_PTE_MT_DEV_NONSHARED (0x0c << 2) /* 1100 */ | |
| 185 | −#define L_PTE_MT_DEV_WC (0x09 << 2) /* 1001 */ | |
| 186 | −#define L_PTE_MT_DEV_CACHED (0x0b << 2) /* 1011 */ | |
| 187 | −#define L_PTE_MT_MASK (0x0f << 2) | |
| 181 | +#define L_PTE_MT_UNCACHED (_AT(pteval_t, 0x00) << 2) /* 0000 */ | |
| 182 | +#define L_PTE_MT_BUFFERABLE (_AT(pteval_t, 0x01) << 2) /* 0001 */ | |
| 183 | +#define L_PTE_MT_WRITETHROUGH (_AT(pteval_t, 0x02) << 2) /* 0010 */ | |
| 184 | +#define L_PTE_MT_WRITEBACK (_AT(pteval_t, 0x03) << 2) /* 0011 */ | |
| 185 | +#define L_PTE_MT_MINICACHE (_AT(pteval_t, 0x06) << 2) /* 0110 (sa1100, xscale) */ | |
| 186 | +#define L_PTE_MT_WRITEALLOC (_AT(pteval_t, 0x07) << 2) /* 0111 */ | |
| 187 | +#define L_PTE_MT_DEV_SHARED (_AT(pteval_t, 0x04) << 2) /* 0100 */ | |
| 188 | +#define L_PTE_MT_DEV_NONSHARED (_AT(pteval_t, 0x0c) << 2) /* 1100 */ | |
| 189 | +#define L_PTE_MT_DEV_WC (_AT(pteval_t, 0x09) << 2) /* 1001 */ | |
| 190 | +#define L_PTE_MT_DEV_CACHED (_AT(pteval_t, 0x0b) << 2) /* 1011 */ | |
| 191 | +#define L_PTE_MT_MASK (_AT(pteval_t, 0x0f) << 2) | |
| 188 | 192 | |
| 189 | 193 | #ifndef __ASSEMBLY__ |
| 190 | 194 | |
| @@ -201,23 +205,44 @@ extern pgprot_t pgprot_kernel; · 10 unmodified lines | ||
| 201 | 205 | |
| 202 | 206 | #define _MOD_PROT(p, b) __pgprot(pgprot_val(p) | (b)) |
| 203 | 207 | |
| 204 | −#define PAGE_NONE pgprot_user | |
| 205 | −#define PAGE_SHARED _MOD_PROT(pgprot_user, L_PTE_USER | L_PTE_WRITE) | |
| 206 | −#define PAGE_SHARED_EXEC _MOD_PROT(pgprot_user, L_PTE_USER | L_PTE_WRITE | L_PTE_EXEC) | |
| 207 | −#define PAGE_COPY _MOD_PROT(pgprot_user, L_PTE_USER) | |
| 208 | −#define PAGE_COPY_EXEC _MOD_PROT(pgprot_user, L_PTE_USER | L_PTE_EXEC) | |
| 209 | −#define PAGE_READONLY _MOD_PROT(pgprot_user, L_PTE_USER) | |
| 210 | −#define PAGE_READONLY_EXEC _MOD_PROT(pgprot_user, L_PTE_USER | L_PTE_EXEC) | |
| 211 | −#define PAGE_KERNEL pgprot_kernel | |
| 212 | −#define PAGE_KERNEL_EXEC _MOD_PROT(pgprot_kernel, L_PTE_EXEC) | |
| 213 | − | |
| 214 | −#define __PAGE_NONE __pgprot(_L_PTE_DEFAULT) | |
| 215 | −#define __PAGE_SHARED __pgprot(_L_PTE_DEFAULT | L_PTE_USER | L_PTE_WRITE) | |
| 216 | −#define __PAGE_SHARED_EXEC __pgprot(_L_PTE_DEFAULT | L_PTE_USER | L_PTE_WRITE | L_PTE_EXEC) | |
| 217 | −#define __PAGE_COPY __pgprot(_L_PTE_DEFAULT | L_PTE_USER) | |
| 218 | −#define __PAGE_COPY_EXEC __pgprot(_L_PTE_DEFAULT | L_PTE_USER | L_PTE_EXEC) | |
| 219 | −#define __PAGE_READONLY __pgprot(_L_PTE_DEFAULT | L_PTE_USER) | |
| 220 | −#define __PAGE_READONLY_EXEC __pgprot(_L_PTE_DEFAULT | L_PTE_USER | L_PTE_EXEC) | |
| 208 | +#define PAGE_NONE _MOD_PROT(pgprot_user, L_PTE_XN | L_PTE_RDONLY) | |
| 209 | +#define PAGE_SHARED _MOD_PROT(pgprot_user, L_PTE_USER | L_PTE_XN) | |
| 210 | +#define PAGE_SHARED_EXEC _MOD_PROT(pgprot_user, L_PTE_USER) | |
| 211 | +#define PAGE_COPY _MOD_PROT(pgprot_user, L_PTE_USER | L_PTE_RDONLY | L_PTE_XN) | |
| 212 | +#define PAGE_COPY_EXEC _MOD_PROT(pgprot_user, L_PTE_USER | L_PTE_RDONLY) | |
| 213 | +#define PAGE_READONLY _MOD_PROT(pgprot_user, L_PTE_USER | L_PTE_RDONLY | L_PTE_XN) | |
| 214 | +#define PAGE_READONLY_EXEC _MOD_PROT(pgprot_user, L_PTE_USER | L_PTE_RDONLY) | |
| 215 | +#define PAGE_KERNEL _MOD_PROT(pgprot_kernel, L_PTE_XN) | |
| 216 | +#define PAGE_KERNEL_EXEC pgprot_kernel | |
| 217 | + | |
| 218 | +#define __PAGE_NONE __pgprot(_L_PTE_DEFAULT | L_PTE_RDONLY | L_PTE_XN) | |
| 219 | +#define __PAGE_SHARED __pgprot(_L_PTE_DEFAULT | L_PTE_USER | L_PTE_XN) | |
| 220 | +#define __PAGE_SHARED_EXEC __pgprot(_L_PTE_DEFAULT | L_PTE_USER) | |
| 221 | +#define __PAGE_COPY __pgprot(_L_PTE_DEFAULT | L_PTE_USER | L_PTE_RDONLY | L_PTE_XN) | |
| 222 | +#define __PAGE_COPY_EXEC __pgprot(_L_PTE_DEFAULT | L_PTE_USER | L_PTE_RDONLY) | |
| 223 | +#define __PAGE_READONLY __pgprot(_L_PTE_DEFAULT | L_PTE_USER | L_PTE_RDONLY | L_PTE_XN) | |
| 224 | +#define __PAGE_READONLY_EXEC __pgprot(_L_PTE_DEFAULT | L_PTE_USER | L_PTE_RDONLY) | |
| 225 | + | |
| 226 | +#define __pgprot_modify(prot,mask,bits) \ | |
| 227 | + __pgprot((pgprot_val(prot) & ~(mask)) | (bits)) | |
| 228 | + | |
| 229 | +#define pgprot_noncached(prot) \ | |
| 230 | + __pgprot_modify(prot, L_PTE_MT_MASK, L_PTE_MT_UNCACHED) | |
| 231 | + | |
| 232 | +#define pgprot_writecombine(prot) \ | |
| 233 | + __pgprot_modify(prot, L_PTE_MT_MASK, L_PTE_MT_BUFFERABLE) | |
| 234 | + | |
| 235 | +#ifdef CONFIG_ARM_DMA_MEM_BUFFERABLE | |
| 236 | +#define pgprot_dmacoherent(prot) \ | |
| 237 | + __pgprot_modify(prot, L_PTE_MT_MASK, L_PTE_MT_BUFFERABLE | L_PTE_XN) | |
| 238 | +#define __HAVE_PHYS_MEM_ACCESS_PROT | |
| 239 | +struct file; | |
| 240 | +extern pgprot_t phys_mem_access_prot(struct file *file, unsigned long pfn, | |
| 241 | + unsigned long size, pgprot_t vma_prot); | |
| 242 | +#else | |
| 243 | +#define pgprot_dmacoherent(prot) \ | |
| 244 | + __pgprot_modify(prot, L_PTE_MT_MASK, L_PTE_MT_UNCACHED | L_PTE_XN) | |
| 245 | +#endif | |
| 221 | 246 | |
| 222 | 247 | #endif /* __ASSEMBLY__ */ |
| 223 | 248 | |
| @@ -255,26 +280,84 @@ extern pgprot_t pgprot_kernel; · 31 unmodified lines | ||
| 255 | 280 | extern struct page *empty_zero_page; |
| 256 | 281 | #define ZERO_PAGE(vaddr) (empty_zero_page) |
| 257 | 282 | |
| 258 | −#define pte_pfn(pte) (pte_val(pte) >> PAGE_SHIFT) | |
| 259 | −#define pfn_pte(pfn,prot) (__pte(((pfn) << PAGE_SHIFT) | pgprot_val(prot))) | |
| 260 | 283 | |
| 261 | −#define pte_none(pte) (!pte_val(pte)) | |
| 262 | −#define pte_clear(mm,addr,ptep) set_pte_ext(ptep, __pte(0), 0) | |
| 263 | −#define pte_page(pte) (pfn_to_page(pte_pfn(pte))) | |
| 264 | −#define pte_offset_kernel(dir,addr) (pmd_page_vaddr(*(dir)) + __pte_index(addr)) | |
| 284 | +extern pgd_t swapper_pg_dir[PTRS_PER_PGD]; | |
| 285 | + | |
| 286 | +/* to find an entry in a page-table-directory */ | |
| 287 | +#define pgd_index(addr) ((addr) >> PGDIR_SHIFT) | |
| 288 | + | |
| 289 | +#define pgd_offset(mm, addr) ((mm)->pgd + pgd_index(addr)) | |
| 290 | + | |
| 291 | +/* to find an entry in a kernel page-table-directory */ | |
| 292 | +#define pgd_offset_k(addr) pgd_offset(&init_mm, addr) | |
| 293 | + | |
| 294 | +/* | |
| 295 | + * The "pgd_xxx()" functions here are trivial for a folded two-level | |
| 296 | + * setup: the pgd is never bad, and a pmd always exists (as it's folded | |
| 297 | + * into the pgd entry) | |
| 298 | + */ | |
| 299 | +#define pgd_none(pgd) (0) | |
| 300 | +#define pgd_bad(pgd) (0) | |
| 301 | +#define pgd_present(pgd) (1) | |
| 302 | +#define pgd_clear(pgdp) do { } while (0) | |
| 303 | +#define set_pgd(pgd,pgdp) do { } while (0) | |
| 304 | + | |
| 305 | + | |
| 306 | +/* Find an entry in the second-level page table.. */ | |
| 307 | +#define pmd_offset(dir, addr) ((pmd_t *)(dir)) | |
| 308 | + | |
| 309 | +#define pmd_none(pmd) (!pmd_val(pmd)) | |
| 310 | +#define pmd_present(pmd) (pmd_val(pmd)) | |
| 311 | +#define pmd_bad(pmd) (pmd_val(pmd) & 2) | |
| 312 | + | |
| 313 | +#define copy_pmd(pmdpd,pmdps) \ | |
| 314 | + do { \ | |
| 315 | + pmdpd[0] = pmdps[0]; \ | |
| 316 | + pmdpd[1] = pmdps[1]; \ | |
| 317 | + flush_pmd_entry(pmdpd); \ | |
| 318 | + } while (0) | |
| 319 | + | |
| 320 | +#define pmd_clear(pmdp) \ | |
| 321 | + do { \ | |
| 322 | + pmdp[0] = __pmd(0); \ | |
| 323 | + pmdp[1] = __pmd(0); \ | |
| 324 | + clean_pmd_entry(pmdp); \ | |
| 325 | + } while (0) | |
| 326 | + | |
| 327 | +static inline pte_t *pmd_page_vaddr(pmd_t pmd) | |
| 328 | +{ | |
| 329 | + return __va(pmd_val(pmd) & PAGE_MASK); | |
| 330 | +} | |
| 331 | + | |
| 332 | +#define pmd_page(pmd) pfn_to_page(__phys_to_pfn(pmd_val(pmd))) | |
| 333 | + | |
| 334 | +/* we don't need complex calculations here as the pmd is folded into the pgd */ | |
| 335 | +#define pmd_addr_end(addr,end) (end) | |
| 265 | 336 | |
| 266 | −#define pte_offset_map(dir,addr) (__pte_map(dir) + __pte_index(addr)) | |
| 267 | −#define pte_unmap(pte) __pte_unmap(pte) | |
| 268 | 337 | |
| 269 | 338 | #ifndef CONFIG_HIGHPTE |
| 270 | −#define __pte_map(dir) pmd_page_vaddr(*(dir)) | |
| 339 | +#define __pte_map(pmd) pmd_page_vaddr(*(pmd)) | |
| 271 | 340 | #define __pte_unmap(pte) do { } while (0) |
| 272 | 341 | #else |
| 273 | −#define __pte_map(dir) ((pte_t *)kmap_atomic(pmd_page(*(dir))) + PTRS_PER_PTE) | |
| 274 | −#define __pte_unmap(pte) kunmap_atomic((pte - PTRS_PER_PTE)) | |
| 342 | +#define __pte_map(pmd) (pte_t *)kmap_atomic(pmd_page(*(pmd))) | |
| 343 | +#define __pte_unmap(pte) kunmap_atomic(pte) | |
| 275 | 344 | #endif |
| 276 | 345 | |
| 346 | +#define pte_index(addr) (((addr) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1)) | |
| 347 | + | |
| 348 | +#define pte_offset_kernel(pmd,addr) (pmd_page_vaddr(*(pmd)) + pte_index(addr)) | |
| 349 | + | |
| 350 | +#define pte_offset_map(pmd,addr) (__pte_map(pmd) + pte_index(addr)) | |
| 351 | +#define pte_unmap(pte) __pte_unmap(pte) | |
| 352 | + | |
| 353 | +#define pte_pfn(pte) (pte_val(pte) >> PAGE_SHIFT) | |
| 354 | +#define pfn_pte(pfn,prot) __pte(((pfn) << PAGE_SHIFT) | pgprot_val(prot)) | |
| 355 | + | |
| 356 | +#define pte_page(pte) pfn_to_page(pte_pfn(pte)) | |
| 357 | +#define mk_pte(page,prot) pfn_pte(page_to_pfn(page), prot) | |
| 358 | + | |
| 277 | 359 | #define set_pte_ext(ptep,pte,ext) cpu_set_pte_ext(ptep,pte,ext) |
| 360 | +#define pte_clear(mm,addr,ptep) set_pte_ext(ptep, __pte(0), 0) | |
| 278 | 361 | |
| 279 | 362 | #if __LINUX_ARM_ARCH__ < 6 |
| 280 | 363 | static inline void __sync_icache_dcache(pte_t pteval) |
| @@ -295,15 +378,12 @@ static inline void set_pte_at(struct mm_struct *mm, unsigned long addr, · 14 unmodified lines | ||
| 295 | 378 | } |
| 296 | 379 | } |
| 297 | 380 | |
| 298 | −/* | |
| 299 | − * The following only work if pte_present() is true. | |
| 300 | − * Undefined behaviour if not.. | |
| 301 | − */ | |
| 381 | +#define pte_none(pte) (!pte_val(pte)) | |
| 302 | 382 | #define pte_present(pte) (pte_val(pte) & L_PTE_PRESENT) |
| 303 | −#define pte_write(pte) (pte_val(pte) & L_PTE_WRITE) | |
| 383 | +#define pte_write(pte) (!(pte_val(pte) & L_PTE_RDONLY)) | |
| 304 | 384 | #define pte_dirty(pte) (pte_val(pte) & L_PTE_DIRTY) |
| 305 | 385 | #define pte_young(pte) (pte_val(pte) & L_PTE_YOUNG) |
| 306 | −#define pte_exec(pte) (pte_val(pte) & L_PTE_EXEC) | |
| 386 | +#define pte_exec(pte) (!(pte_val(pte) & L_PTE_XN)) | |
| 307 | 387 | #define pte_special(pte) (0) |
| 308 | 388 | |
| 309 | 389 | #define pte_present_user(pte) \ |
| @@ -313,8 +393,8 @@ static inline void set_pte_at(struct mm_struct *mm, unsigned long addr, · 3 unmodified lines | ||
| 313 | 393 | #define PTE_BIT_FUNC(fn,op) \ |
| 314 | 394 | static inline pte_t pte_##fn(pte_t pte) { pte_val(pte) op; return pte; } |
| 315 | 395 | |
| 316 | −PTE_BIT_FUNC(wrprotect, &= ~L_PTE_WRITE); | |
| 317 | −PTE_BIT_FUNC(mkwrite, |= L_PTE_WRITE); | |
| 396 | +PTE_BIT_FUNC(wrprotect, |= L_PTE_RDONLY); | |
| 397 | +PTE_BIT_FUNC(mkwrite, &= ~L_PTE_RDONLY); | |
| 318 | 398 | PTE_BIT_FUNC(mkclean, &= ~L_PTE_DIRTY); |
| 319 | 399 | PTE_BIT_FUNC(mkdirty, |= L_PTE_DIRTY); |
| 320 | 400 | PTE_BIT_FUNC(mkold, &= ~L_PTE_YOUNG); |
| @@ -322,101 +402,13 @@ PTE_BIT_FUNC(mkyoung, |= L_PTE_YOUNG); · 1 unmodified line | ||
| 322 | 402 | |
| 323 | 403 | static inline pte_t pte_mkspecial(pte_t pte) { return pte; } |
| 324 | 404 | |
| 325 | −#define __pgprot_modify(prot,mask,bits) \ | |
| 326 | − __pgprot((pgprot_val(prot) & ~(mask)) | (bits)) | |
| 327 | − | |
| 328 | −/* | |
| 329 | − * Mark the prot value as uncacheable and unbufferable. | |
| 330 | − */ | |
| 331 | −#define pgprot_noncached(prot) \ | |
| 332 | − __pgprot_modify(prot, L_PTE_MT_MASK, L_PTE_MT_UNCACHED) | |
| 333 | −#define pgprot_writecombine(prot) \ | |
| 334 | − __pgprot_modify(prot, L_PTE_MT_MASK, L_PTE_MT_BUFFERABLE) | |
| 335 | −#ifdef CONFIG_ARM_DMA_MEM_BUFFERABLE | |
| 336 | −#define pgprot_dmacoherent(prot) \ | |
| 337 | − __pgprot_modify(prot, L_PTE_MT_MASK|L_PTE_EXEC, L_PTE_MT_BUFFERABLE) | |
| 338 | −#define __HAVE_PHYS_MEM_ACCESS_PROT | |
| 339 | −struct file; | |
| 340 | −extern pgprot_t phys_mem_access_prot(struct file *file, unsigned long pfn, | |
| 341 | − unsigned long size, pgprot_t vma_prot); | |
| 342 | −#else | |
| 343 | −#define pgprot_dmacoherent(prot) \ | |
| 344 | − __pgprot_modify(prot, L_PTE_MT_MASK|L_PTE_EXEC, L_PTE_MT_UNCACHED) | |
| 345 | −#endif | |
| 346 | − | |
| 347 | −#define pmd_none(pmd) (!pmd_val(pmd)) | |
| 348 | −#define pmd_present(pmd) (pmd_val(pmd)) | |
| 349 | −#define pmd_bad(pmd) (pmd_val(pmd) & 2) | |
| 350 | − | |
| 351 | −#define copy_pmd(pmdpd,pmdps) \ | |
| 352 | − do { \ | |
| 353 | − pmdpd[0] = pmdps[0]; \ | |
| 354 | − pmdpd[1] = pmdps[1]; \ | |
| 355 | − flush_pmd_entry(pmdpd); \ | |
| 356 | − } while (0) | |
| 357 | − | |
| 358 | −#define pmd_clear(pmdp) \ | |
| 359 | − do { \ | |
| 360 | − pmdp[0] = __pmd(0); \ | |
| 361 | − pmdp[1] = __pmd(0); \ | |
| 362 | − clean_pmd_entry(pmdp); \ | |
| 363 | − } while (0) | |
| 364 | − | |
| 365 | −static inline pte_t *pmd_page_vaddr(pmd_t pmd) | |
| 366 | −{ | |
| 367 | − unsigned long ptr; | |
| 368 | − | |
| 369 | − ptr = pmd_val(pmd) & ~(PTRS_PER_PTE * sizeof(void *) - 1); | |
| 370 | − ptr += PTRS_PER_PTE * sizeof(void *); | |
| 371 | − | |
| 372 | − return __va(ptr); | |
| 373 | −} | |
| 374 | − | |
| 375 | −#define pmd_page(pmd) pfn_to_page(__phys_to_pfn(pmd_val(pmd))) | |
| 376 | − | |
| 377 | −/* we don't need complex calculations here as the pmd is folded into the pgd */ | |
| 378 | −#define pmd_addr_end(addr,end) (end) | |
| 379 | − | |
| 380 | −/* | |
| 381 | − * Conversion functions: convert a page and protection to a page entry, | |
| 382 | − * and a page entry and page directory to the page they refer to. | |
| 383 | − */ | |
| 384 | −#define mk_pte(page,prot) pfn_pte(page_to_pfn(page),prot) | |
| 385 | − | |
| 386 | −/* | |
| 387 | − * The "pgd_xxx()" functions here are trivial for a folded two-level | |
| 388 | − * setup: the pgd is never bad, and a pmd always exists (as it's folded | |
| 389 | − * into the pgd entry) | |
| 390 | − */ | |
| 391 | −#define pgd_none(pgd) (0) | |
| 392 | −#define pgd_bad(pgd) (0) | |
| 393 | −#define pgd_present(pgd) (1) | |
| 394 | −#define pgd_clear(pgdp) do { } while (0) | |
| 395 | −#define set_pgd(pgd,pgdp) do { } while (0) | |
| 396 | − | |
| 397 | −/* to find an entry in a page-table-directory */ | |
| 398 | −#define pgd_index(addr) ((addr) >> PGDIR_SHIFT) | |
| 399 | − | |
| 400 | −#define pgd_offset(mm, addr) ((mm)->pgd+pgd_index(addr)) | |
| 401 | − | |
| 402 | −/* to find an entry in a kernel page-table-directory */ | |
| 403 | −#define pgd_offset_k(addr) pgd_offset(&init_mm, addr) | |
| 404 | − | |
| 405 | −/* Find an entry in the second-level page table.. */ | |
| 406 | −#define pmd_offset(dir, addr) ((pmd_t *)(dir)) | |
| 407 | − | |
| 408 | −/* Find an entry in the third-level page table.. */ | |
| 409 | −#define __pte_index(addr) (((addr) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1)) | |
| 410 | − | |
| 411 | 405 | static inline pte_t pte_modify(pte_t pte, pgprot_t newprot) |
| 412 | 406 | { |
| 413 | − const unsigned long mask = L_PTE_EXEC | L_PTE_WRITE | L_PTE_USER; | |
| 407 | + const pteval_t mask = L_PTE_XN | L_PTE_RDONLY | L_PTE_USER; | |
| 414 | 408 | pte_val(pte) = (pte_val(pte) & ~mask) | (pgprot_val(newprot) & mask); |
| 415 | 409 | return pte; |
| 416 | 410 | } |
| 417 | 411 | |
| 418 | −extern pgd_t swapper_pg_dir[PTRS_PER_PGD]; | |
| 419 | − | |
| 420 | 412 | /* |
| 421 | 413 | * Encode and decode a swap entry. Swap entries are stored in the Linux |
| 422 | 414 | * page tables as follows: |
| @@ -481,6 +473,9 @@ extern pgd_t swapper_pg_dir[PTRS_PER_PGD]; · 58 unmodified lines | ||
| 481 | 473 | |
| 482 | 474 | #define pgtable_cache_init() do { } while (0) |
| 483 | 475 | |
| 476 | +void identity_mapping_add(pgd_t *, unsigned long, unsigned long); | |
| 477 | +void identity_mapping_del(pgd_t *, unsigned long, unsigned long); | |
| 478 | + | |
| 484 | 479 | #endif /* !__ASSEMBLY__ */ |
| 485 | 480 | |
| 486 | 481 | #endif /* CONFIG_MMU */ |
| @@ -0,0 +1,120 @@ | ||
| 1 | +/* | |
| 2 | + * sched_clock.h: support for extending counters to full 64-bit ns counter | |
| 3 | + * | |
| 4 | + * This program is free software; you can redistribute it and/or modify | |
| 5 | + * it under the terms of the GNU General Public License version 2 as | |
| 6 | + * published by the Free Software Foundation. | |
| 7 | + */ | |
| 8 | +#ifndef ASM_SCHED_CLOCK | |
| 9 | +#define ASM_SCHED_CLOCK | |
| 10 | + | |
| 11 | +#include <linux/kernel.h> | |
| 12 | +#include <linux/types.h> | |
| 13 | + | |
| 14 | +struct clock_data { | |
| 15 | + u64 epoch_ns; | |
| 16 | + u32 epoch_cyc; | |
| 17 | + u32 epoch_cyc_copy; | |
| 18 | + u32 mult; | |
| 19 | + u32 shift; | |
| 20 | +}; | |
| 21 | + | |
| 22 | +#define DEFINE_CLOCK_DATA(name) struct clock_data name | |
| 23 | + | |
| 24 | +static inline u64 cyc_to_ns(u64 cyc, u32 mult, u32 shift) | |
| 25 | +{ | |
| 26 | + return (cyc * mult) >> shift; | |
| 27 | +} | |
| 28 | + | |
| 29 | +/* | |
| 30 | + * Atomically update the sched_clock epoch. Your update callback will | |
| 31 | + * be called from a timer before the counter wraps - read the current | |
| 32 | + * counter value, and call this function to safely move the epochs | |
| 33 | + * forward. Only use this from the update callback. | |
| 34 | + */ | |
| 35 | +static inline void update_sched_clock(struct clock_data *cd, u32 cyc, u32 mask) | |
| 36 | +{ | |
| 37 | + unsigned long flags; | |
| 38 | + u64 ns = cd->epoch_ns + | |
| 39 | + cyc_to_ns((cyc - cd->epoch_cyc) & mask, cd->mult, cd->shift); | |
| 40 | + | |
| 41 | + /* | |
| 42 | + * Write epoch_cyc and epoch_ns in a way that the update is | |
| 43 | + * detectable in cyc_to_fixed_sched_clock(). | |
| 44 | + */ | |
| 45 | + raw_local_irq_save(flags); | |
| 46 | + cd->epoch_cyc = cyc; | |
| 47 | + smp_wmb(); | |
| 48 | + cd->epoch_ns = ns; | |
| 49 | + smp_wmb(); | |
| 50 | + cd->epoch_cyc_copy = cyc; | |
| 51 | + raw_local_irq_restore(flags); | |
| 52 | +} | |
| 53 | + | |
| 54 | +/* | |
| 55 | + * If your clock rate is known at compile time, using this will allow | |
| 56 | + * you to optimize the mult/shift loads away. This is paired with | |
| 57 | + * init_fixed_sched_clock() to ensure that your mult/shift are correct. | |
| 58 | + */ | |
| 59 | +static inline unsigned long long cyc_to_fixed_sched_clock(struct clock_data *cd, | |
| 60 | + u32 cyc, u32 mask, u32 mult, u32 shift) | |
| 61 | +{ | |
| 62 | + u64 epoch_ns; | |
| 63 | + u32 epoch_cyc; | |
| 64 | + | |
| 65 | + /* | |
| 66 | + * Load the epoch_cyc and epoch_ns atomically. We do this by | |
| 67 | + * ensuring that we always write epoch_cyc, epoch_ns and | |
| 68 | + * epoch_cyc_copy in strict order, and read them in strict order. | |
| 69 | + * If epoch_cyc and epoch_cyc_copy are not equal, then we're in | |
| 70 | + * the middle of an update, and we should repeat the load. | |
| 71 | + */ | |
| 72 | + do { | |
| 73 | + epoch_cyc = cd->epoch_cyc; | |
| 74 | + smp_rmb(); | |
| 75 | + epoch_ns = cd->epoch_ns; | |
| 76 | + smp_rmb(); | |
| 77 | + } while (epoch_cyc != cd->epoch_cyc_copy); | |
| 78 | + | |
| 79 | + return epoch_ns + cyc_to_ns((cyc - epoch_cyc) & mask, mult, shift); | |
| 80 | +} | |
| 81 | + | |
| 82 | +/* | |
| 83 | + * Otherwise, you need to use this, which will obtain the mult/shift | |
| 84 | + * from the clock_data structure. Use init_sched_clock() with this. | |
| 85 | + */ | |
| 86 | +static inline unsigned long long cyc_to_sched_clock(struct clock_data *cd, | |
| 87 | + u32 cyc, u32 mask) | |
| 88 | +{ | |
| 89 | + return cyc_to_fixed_sched_clock(cd, cyc, mask, cd->mult, cd->shift); | |
| 90 | +} | |
| 91 | + | |
| 92 | +/* | |
| 93 | + * Initialize the clock data - calculate the appropriate multiplier | |
| 94 | + * and shift. Also setup a timer to ensure that the epoch is refreshed | |
| 95 | + * at the appropriate time interval, which will call your update | |
| 96 | + * handler. | |
| 97 | + */ | |
| 98 | +void init_sched_clock(struct clock_data *, void (*)(void), | |
| 99 | + unsigned int, unsigned long); | |
| 100 | + | |
| 101 | +/* | |
| 102 | + * Use this initialization function rather than init_sched_clock() if | |
| 103 | + * you're using cyc_to_fixed_sched_clock, which will warn if your | |
| 104 | + * constants are incorrect. | |
| 105 | + */ | |
| 106 | +static inline void init_fixed_sched_clock(struct clock_data *cd, | |
| 107 | + void (*update)(void), unsigned int bits, unsigned long rate, | |
| 108 | + u32 mult, u32 shift) | |
| 109 | +{ | |
| 110 | + init_sched_clock(cd, update, bits, rate); | |
| 111 | + if (cd->mult != mult || cd->shift != shift) { | |
| 112 | + pr_crit("sched_clock: wrong multiply/shift: %u>>%u vs calculated %u>>%u\n" | |
| 113 | + "sched_clock: fix multiply/shift to avoid scheduler hiccups\n", | |
| 114 | + mult, shift, cd->mult, cd->shift); | |
| 115 | + } | |
| 116 | +} | |
| 117 | + | |
| 118 | +extern void sched_clock_postinit(void); | |
| 119 | + | |
| 120 | +#endif | |
| @@ -33,27 +33,23 @@ struct seq_file; · 32 unmodified lines | ||
| 33 | 33 | /* |
| 34 | 34 | * generate IPI list text |
| 35 | 35 | */ |
| 36 | −extern void show_ipi_list(struct seq_file *p); | |
| 36 | +extern void show_ipi_list(struct seq_file *, int); | |
| 37 | 37 | |
| 38 | 38 | /* |
| 39 | 39 | * Called from assembly code, this handles an IPI. |
| 40 | 40 | */ |
| 41 | −asmlinkage void do_IPI(struct pt_regs *regs); | |
| 41 | +asmlinkage void do_IPI(int ipinr, struct pt_regs *regs); | |
| 42 | 42 | |
| 43 | 43 | /* |
| 44 | 44 | * Setup the set of possible CPUs (via set_cpu_possible) |
| 45 | 45 | */ |
| 46 | 46 | extern void smp_init_cpus(void); |
| 47 | 47 | |
| 48 | −/* | |
| 49 | − * Move global data into per-processor storage. | |
| 50 | − */ | |
| 51 | −extern void smp_store_cpu_info(unsigned int cpuid); | |
| 52 | 48 | |
| 53 | 49 | /* |
| 54 | 50 | * Raise an IPI cross call on CPUs in callmap. |
| 55 | 51 | */ |
| 56 | −extern void smp_cross_call(const struct cpumask *mask); | |
| 52 | +extern void smp_cross_call(const struct cpumask *mask, int ipi); | |
| 57 | 53 | |
| 58 | 54 | /* |
| 59 | 55 | * Boot a secondary CPU, and assign it the specified idle task. |
| @@ -72,6 +68,11 @@ asmlinkage void secondary_start_kernel(void); · 12 unmodified lines | ||
| 72 | 68 | */ |
| 73 | 69 | extern void platform_secondary_init(unsigned int cpu); |
| 74 | 70 | |
| 71 | +/* | |
| 72 | + * Initialize cpu_possible map, and enable coherency | |
| 73 | + */ | |
| 74 | +extern void platform_smp_prepare_cpus(unsigned int); | |
| 75 | + | |
| 75 | 76 | /* |
| 76 | 77 | * Initial data for bringing up a secondary CPU. |
| 77 | 78 | */ |
| @@ -97,6 +98,6 @@ extern void arch_send_call_function_ipi_mask(const struct cpumask *mask); · 19 unmodified lines | ||
| 97 | 98 | /* |
| 98 | 99 | * show local interrupt info |
| 99 | 100 | */ |
| 100 | −extern void show_local_irqs(struct seq_file *); | |
| 101 | +extern void show_local_irqs(struct seq_file *, int); | |
| 101 | 102 | |
| 102 | 103 | #endif /* ifndef __ASM_ARM_SMP_H */ |
| @@ -1,17 +0,0 @@ | ||
| 1 | −#ifndef ASMARM_SMP_MIDR_H | |
| 2 | −#define ASMARM_SMP_MIDR_H | |
| 3 | − | |
| 4 | −#define hard_smp_processor_id() \ | |
| 5 | − ({ \ | |
| 6 | − unsigned int cpunum; \ | |
| 7 | − __asm__("\n" \ | |
| 8 | − "1: mrc p15, 0, %0, c0, c0, 5\n" \ | |
| 9 | − " .pushsection \".alt.smp.init\", \"a\"\n"\ | |
| 10 | − " .long 1b\n" \ | |
| 11 | − " mov %0, #0\n" \ | |
| 12 | − " .popsection" \ | |
| 13 | − : "=r" (cpunum)); \ | |
| 14 | − cpunum &= 0x0F; \ | |
| 15 | − }) | |
| 16 | − | |
| 17 | −#endif | |
| @@ -22,7 +22,6 @@ struct clock_event_device; · 21 unmodified lines | ||
| 22 | 22 | |
| 23 | 23 | extern void __iomem *twd_base; |
| 24 | 24 | |
| 25 | −void twd_timer_stop(void); | |
| 26 | 25 | int twd_timer_ack(void); |
| 27 | 26 | void twd_timer_setup(struct clock_event_device *); |
| 28 | 27 | |
| @@ -63,6 +63,11 @@ · 62 unmodified lines | ||
| 63 | 63 | #include <asm/outercache.h> |
| 64 | 64 | |
| 65 | 65 | #define __exception __attribute__((section(".exception.text"))) |
| 66 | +#ifdef CONFIG_FUNCTION_GRAPH_TRACER | |
| 67 | +#define __exception_irq_entry __irq_entry | |
| 68 | +#else | |
| 69 | +#define __exception_irq_entry __exception | |
| 70 | +#endif | |
| 66 | 71 | |
| 67 | 72 | struct thread_info; |
| 68 | 73 | struct task_struct; |
| @@ -119,6 +124,13 @@ extern unsigned int user_debug; · 50 unmodified lines | ||
| 119 | 124 | #define vectors_high() (0) |
| 120 | 125 | #endif |
| 121 | 126 | |
| 127 | +#if __LINUX_ARM_ARCH__ >= 7 || \ | |
| 128 | + (__LINUX_ARM_ARCH__ == 6 && defined(CONFIG_CPU_32v6K)) | |
| 129 | +#define sev() __asm__ __volatile__ ("sev" : : : "memory") | |
| 130 | +#define wfe() __asm__ __volatile__ ("wfe" : : : "memory") | |
| 131 | +#define wfi() __asm__ __volatile__ ("wfi" : : : "memory") | |
| 132 | +#endif | |
| 133 | + | |
| 122 | 134 | #if __LINUX_ARM_ARCH__ >= 7 |
| 123 | 135 | #define isb() __asm__ __volatile__ ("isb" : : : "memory") |
| 124 | 136 | #define dsb() __asm__ __volatile__ ("dsb" : : : "memory") |
| @@ -18,16 +18,34 @@ · 17 unmodified lines | ||
| 18 | 18 | #define __ASMARM_TLB_H |
| 19 | 19 | |
| 20 | 20 | #include <asm/cacheflush.h> |
| 21 | −#include <asm/tlbflush.h> | |
| 22 | 21 | |
| 23 | 22 | #ifndef CONFIG_MMU |
| 24 | 23 | |
| 25 | 24 | #include <linux/pagemap.h> |
| 25 | + | |
| 26 | +#define tlb_flush(tlb) ((void) tlb) | |
| 27 | + | |
| 26 | 28 | #include <asm-generic/tlb.h> |
| 27 | 29 | |
| 28 | 30 | #else /* !CONFIG_MMU */ |
| 29 | 31 | |
| 32 | +#include <linux/swap.h> | |
| 30 | 33 | #include <asm/pgalloc.h> |
| 34 | +#include <asm/tlbflush.h> | |
| 35 | + | |
| 36 | +/* | |
| 37 | + * We need to delay page freeing for SMP as other CPUs can access pages | |
| 38 | + * which have been removed but not yet had their TLB entries invalidated. | |
| 39 | + * Also, as ARMv7 speculative prefetch can drag new entries into the TLB, | |
| 40 | + * we need to apply this same delaying tactic to ensure correct operation. | |
| 41 | + */ | |
| 42 | +#if defined(CONFIG_SMP) || defined(CONFIG_CPU_32v7) | |
| 43 | +#define tlb_fast_mode(tlb) 0 | |
| 44 | +#define FREE_PTE_NR 500 | |
| 45 | +#else | |
| 46 | +#define tlb_fast_mode(tlb) 1 | |
| 47 | +#define FREE_PTE_NR 0 | |
| 48 | +#endif | |
| 31 | 49 | |
| 32 | 50 | /* |
| 33 | 51 | * TLB handling. This allows us to remove pages from the page |
| @@ -36,12 +54,58 @@ · 2 unmodified lines | ||
| 36 | 54 | struct mmu_gather { |
| 37 | 55 | struct mm_struct *mm; |
| 38 | 56 | unsigned int fullmm; |
| 57 | + struct vm_area_struct *vma; | |
| 39 | 58 | unsigned long range_start; |
| 40 | 59 | unsigned long range_end; |
| 60 | + unsigned int nr; | |
| 61 | + struct page *pages[FREE_PTE_NR]; | |
| 41 | 62 | }; |
| 42 | 63 | |
| 43 | 64 | DECLARE_PER_CPU(struct mmu_gather, mmu_gathers); |
| 44 | 65 | |
| 66 | +/* | |
| 67 | + * This is unnecessarily complex. There's three ways the TLB shootdown | |
| 68 | + * code is used: | |
| 69 | + * 1. Unmapping a range of vmas. See zap_page_range(), unmap_region(). | |
| 70 | + * tlb->fullmm = 0, and tlb_start_vma/tlb_end_vma will be called. | |
| 71 | + * tlb->vma will be non-NULL. | |
| 72 | + * 2. Unmapping all vmas. See exit_mmap(). | |
| 73 | + * tlb->fullmm = 1, and tlb_start_vma/tlb_end_vma will be called. | |
| 74 | + * tlb->vma will be non-NULL. Additionally, page tables will be freed. | |
| 75 | + * 3. Unmapping argument pages. See shift_arg_pages(). | |
| 76 | + * tlb->fullmm = 0, but tlb_start_vma/tlb_end_vma will not be called. | |
| 77 | + * tlb->vma will be NULL. | |
| 78 | + */ | |
| 79 | +static inline void tlb_flush(struct mmu_gather *tlb) | |
| 80 | +{ | |
| 81 | + if (tlb->fullmm || !tlb->vma) | |
| 82 | + flush_tlb_mm(tlb->mm); | |
| 83 | + else if (tlb->range_end > 0) { | |
| 84 | + flush_tlb_range(tlb->vma, tlb->range_start, tlb->range_end); | |
| 85 | + tlb->range_start = TASK_SIZE; | |
| 86 | + tlb->range_end = 0; | |
| 87 | + } | |
| 88 | +} | |
| 89 | + | |
| 90 | +static inline void tlb_add_flush(struct mmu_gather *tlb, unsigned long addr) | |
| 91 | +{ | |
| 92 | + if (!tlb->fullmm) { | |
| 93 | + if (addr < tlb->range_start) | |
| 94 | + tlb->range_start = addr; | |
| 95 | + if (addr + PAGE_SIZE > tlb->range_end) | |
| 96 | + tlb->range_end = addr + PAGE_SIZE; | |
| 97 | + } | |
| 98 | +} | |
| 99 | + | |
| 100 | +static inline void tlb_flush_mmu(struct mmu_gather *tlb) | |
| 101 | +{ | |
| 102 | + tlb_flush(tlb); | |
| 103 | + if (!tlb_fast_mode(tlb)) { | |
| 104 | + free_pages_and_swap_cache(tlb->pages, tlb->nr); | |
| 105 | + tlb->nr = 0; | |
| 106 | + } | |
| 107 | +} | |
| 108 | + | |
| 45 | 109 | static inline struct mmu_gather * |
| 46 | 110 | tlb_gather_mmu(struct mm_struct *mm, unsigned int full_mm_flush) |
| 47 | 111 | { |
| @@ -49,6 +113,8 @@ tlb_gather_mmu(struct mm_struct *mm, unsigned int full_mm_flush) · 1 unmodified line | ||
| 49 | 113 | |
| 50 | 114 | tlb->mm = mm; |
| 51 | 115 | tlb->fullmm = full_mm_flush; |
| 116 | + tlb->vma = NULL; | |
| 117 | + tlb->nr = 0; | |
| 52 | 118 | |
| 53 | 119 | return tlb; |
| 54 | 120 | } |
| @@ -56,8 +122,7 @@ tlb_gather_mmu(struct mm_struct *mm, unsigned int full_mm_flush) · 1 unmodified line | ||
| 56 | 122 | static inline void |
| 57 | 123 | tlb_finish_mmu(struct mmu_gather *tlb, unsigned long start, unsigned long end) |
| 58 | 124 | { |
| 59 | − if (tlb->fullmm) | |
| 60 | − flush_tlb_mm(tlb->mm); | |
| 125 | + tlb_flush_mmu(tlb); | |
| 61 | 126 | |
| 62 | 127 | /* keep the page table cache within bounds */ |
| 63 | 128 | check_pgt_cache(); |
| @@ -71,12 +136,7 @@ tlb_finish_mmu(struct mmu_gather *tlb, unsigned long start, unsigned long end) · 7 unmodified lines | ||
| 71 | 136 | static inline void |
| 72 | 137 | tlb_remove_tlb_entry(struct mmu_gather *tlb, pte_t *ptep, unsigned long addr) |
| 73 | 138 | { |
| 74 | − if (!tlb->fullmm) { | |
| 75 | − if (addr < tlb->range_start) | |
| 76 | − tlb->range_start = addr; | |
| 77 | − if (addr + PAGE_SIZE > tlb->range_end) | |
| 78 | − tlb->range_end = addr + PAGE_SIZE; | |
| 79 | − } | |
| 139 | + tlb_add_flush(tlb, addr); | |
| 80 | 140 | } |
| 81 | 141 | |
| 82 | 142 | /* |
| @@ -89,6 +149,7 @@ tlb_start_vma(struct mmu_gather *tlb, struct vm_area_struct *vma) · 6 unmodified lines | ||
| 89 | 149 | { |
| 90 | 150 | if (!tlb->fullmm) { |
| 91 | 151 | flush_cache_range(vma, vma->vm_start, vma->vm_end); |
| 152 | + tlb->vma = vma; | |
| 92 | 153 | tlb->range_start = TASK_SIZE; |
| 93 | 154 | tlb->range_end = 0; |
| 94 | 155 | } |
| @@ -97,12 +158,30 @@ tlb_start_vma(struct mmu_gather *tlb, struct vm_area_struct *vma) · 2 unmodified lines | ||
| 97 | 158 | static inline void |
| 98 | 159 | tlb_end_vma(struct mmu_gather *tlb, struct vm_area_struct *vma) |
| 99 | 160 | { |
| 100 | − if (!tlb->fullmm && tlb->range_end > 0) | |
| 101 | − flush_tlb_range(vma, tlb->range_start, tlb->range_end); | |
| 161 | + if (!tlb->fullmm) | |
| 162 | + tlb_flush(tlb); | |
| 163 | +} | |
| 164 | + | |
| 165 | +static inline void tlb_remove_page(struct mmu_gather *tlb, struct page *page) | |
| 166 | +{ | |
| 167 | + if (tlb_fast_mode(tlb)) { | |
| 168 | + free_page_and_swap_cache(page); | |
| 169 | + } else { | |
| 170 | + tlb->pages[tlb->nr++] = page; | |
| 171 | + if (tlb->nr >= FREE_PTE_NR) | |
| 172 | + tlb_flush_mmu(tlb); | |
| 173 | + } | |
| 174 | +} | |
| 175 | + | |
| 176 | +static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t pte, | |
| 177 | + unsigned long addr) | |
| 178 | +{ | |
| 179 | + pgtable_page_dtor(pte); | |
| 180 | + tlb_add_flush(tlb, addr); | |
| 181 | + tlb_remove_page(tlb, pte); | |
| 102 | 182 | } |
| 103 | 183 | |
| 104 | −#define tlb_remove_page(tlb,page) free_page_and_swap_cache(page) | |
| 105 | −#define pte_free_tlb(tlb, ptep, addr) pte_free((tlb)->mm, ptep) | |
| 184 | +#define pte_free_tlb(tlb, ptep, addr) __pte_free_tlb(tlb, ptep, addr) | |
| 106 | 185 | #define pmd_free_tlb(tlb, pmdp, addr) pmd_free((tlb)->mm, pmdp) |
| 107 | 186 | |
| 108 | 187 | #define tlb_migrate_finish(mm) do { } while (0) |
| @@ -10,12 +10,7 @@ · 9 unmodified lines | ||
| 10 | 10 | #ifndef _ASMARM_TLBFLUSH_H |
| 11 | 11 | #define _ASMARM_TLBFLUSH_H |
| 12 | 12 | |
| 13 | − | |
| 14 | −#ifndef CONFIG_MMU | |
| 15 | − | |
| 16 | −#define tlb_flush(tlb) ((void) tlb) | |
| 17 | − | |
| 18 | −#else /* CONFIG_MMU */ | |
| 13 | +#ifdef CONFIG_MMU | |
| 19 | 14 | |
| 20 | 15 | #include <asm/glue.h> |
| 21 | 16 | |
| @@ -15,16 +15,37 @@ struct undef_hook { · 14 unmodified lines | ||
| 15 | 15 | void register_undef_hook(struct undef_hook *hook); |
| 16 | 16 | void unregister_undef_hook(struct undef_hook *hook); |
| 17 | 17 | |
| 18 | +#ifdef CONFIG_FUNCTION_GRAPH_TRACER | |
| 19 | +static inline int __in_irqentry_text(unsigned long ptr) | |
| 20 | +{ | |
| 21 | + extern char __irqentry_text_start[]; | |
| 22 | + extern char __irqentry_text_end[]; | |
| 23 | + | |
| 24 | + return ptr >= (unsigned long)&__irqentry_text_start && | |
| 25 | + ptr < (unsigned long)&__irqentry_text_end; | |
| 26 | +} | |
| 27 | +#else | |
| 28 | +static inline int __in_irqentry_text(unsigned long ptr) | |
| 29 | +{ | |
| 30 | + return 0; | |
| 31 | +} | |
| 32 | +#endif | |
| 33 | + | |
| 18 | 34 | static inline int in_exception_text(unsigned long ptr) |
| 19 | 35 | { |
| 20 | 36 | extern char __exception_text_start[]; |
| 21 | 37 | extern char __exception_text_end[]; |
| 38 | + int in; | |
| 22 | 39 | |
| 23 | − return ptr >= (unsigned long)&__exception_text_start && | |
| 24 | − ptr < (unsigned long)&__exception_text_end; | |
| 40 | + in = ptr >= (unsigned long)&__exception_text_start && | |
| 41 | + ptr < (unsigned long)&__exception_text_end; | |
| 42 | + | |
| 43 | + return in ? : __in_irqentry_text(ptr); | |
| 25 | 44 | } |
| 26 | 45 | |
| 27 | 46 | extern void __init early_trap_init(void); |
| 28 | 47 | extern void dump_backtrace_entry(unsigned long where, unsigned long from, unsigned long frame); |
| 29 | 48 | |
| 49 | +extern void *vectors_page; | |
| 50 | + | |
| 30 | 51 | #endif |
| @@ -227,7 +227,7 @@ do { \ · 226 unmodified lines | ||
| 227 | 227 | |
| 228 | 228 | #define __get_user_asm_byte(x,addr,err) \ |
| 229 | 229 | __asm__ __volatile__( \ |
| 230 | − "1: ldrbt %1,[%2]\n" \ | |
| 230 | + "1: " T(ldrb) " %1,[%2],#0\n" \ | |
| 231 | 231 | "2:\n" \ |
| 232 | 232 | " .pushsection .fixup,\"ax\"\n" \ |
| 233 | 233 | " .align 2\n" \ |
| @@ -263,7 +263,7 @@ do { \ · 29 unmodified lines | ||
| 263 | 263 | |
| 264 | 264 | #define __get_user_asm_word(x,addr,err) \ |
| 265 | 265 | __asm__ __volatile__( \ |
| 266 | − "1: ldrt %1,[%2]\n" \ | |
| 266 | + "1: " T(ldr) " %1,[%2],#0\n" \ | |
| 267 | 267 | "2:\n" \ |
| 268 | 268 | " .pushsection .fixup,\"ax\"\n" \ |
| 269 | 269 | " .align 2\n" \ |
| @@ -308,7 +308,7 @@ do { \ · 38 unmodified lines | ||
| 308 | 308 | |
| 309 | 309 | #define __put_user_asm_byte(x,__pu_addr,err) \ |
| 310 | 310 | __asm__ __volatile__( \ |
| 311 | − "1: strbt %1,[%2]\n" \ | |
| 311 | + "1: " T(strb) " %1,[%2],#0\n" \ | |
| 312 | 312 | "2:\n" \ |
| 313 | 313 | " .pushsection .fixup,\"ax\"\n" \ |
| 314 | 314 | " .align 2\n" \ |
| @@ -341,7 +341,7 @@ do { \ · 26 unmodified lines | ||
| 341 | 341 | |
| 342 | 342 | #define __put_user_asm_word(x,__pu_addr,err) \ |
| 343 | 343 | __asm__ __volatile__( \ |
| 344 | − "1: strt %1,[%2]\n" \ | |
| 344 | + "1: " T(str) " %1,[%2],#0\n" \ | |
| 345 | 345 | "2:\n" \ |
| 346 | 346 | " .pushsection .fixup,\"ax\"\n" \ |
| 347 | 347 | " .align 2\n" \ |
| @@ -366,10 +366,10 @@ do { \ · 18 unmodified lines | ||
| 366 | 366 | |
| 367 | 367 | #define __put_user_asm_dword(x,__pu_addr,err) \ |
| 368 | 368 | __asm__ __volatile__( \ |
| 369 | − ARM( "1: strt " __reg_oper1 ", [%1], #4\n" ) \ | |
| 370 | − ARM( "2: strt " __reg_oper0 ", [%1]\n" ) \ | |
| 371 | − THUMB( "1: strt " __reg_oper1 ", [%1]\n" ) \ | |
| 372 | − THUMB( "2: strt " __reg_oper0 ", [%1, #4]\n" ) \ | |
| 369 | + ARM( "1: " T(str) " " __reg_oper1 ", [%1], #4\n" ) \ | |
| 370 | + ARM( "2: " T(str) " " __reg_oper0 ", [%1]\n" ) \ | |
| 371 | + THUMB( "1: " T(str) " " __reg_oper1 ", [%1]\n" ) \ | |
| 372 | + THUMB( "2: " T(str) " " __reg_oper0 ", [%1, #4]\n" ) \ | |
| 373 | 373 | "3:\n" \ |
| 374 | 374 | " .pushsection .fixup,\"ax\"\n" \ |
| 375 | 375 | " .align 2\n" \ |
| @@ -5,7 +5,7 @@ · 4 unmodified lines | ||
| 5 | 5 | CPPFLAGS_vmlinux.lds := -DTEXT_OFFSET=$(TEXT_OFFSET) |
| 6 | 6 | AFLAGS_head.o := -DTEXT_OFFSET=$(TEXT_OFFSET) |
| 7 | 7 | |
| 8 | −ifdef CONFIG_DYNAMIC_FTRACE | |
| 8 | +ifdef CONFIG_FUNCTION_TRACER | |
| 9 | 9 | CFLAGS_REMOVE_ftrace.o = -pg |
| 10 | 10 | endif |
| 11 | 11 | |
| @@ -29,10 +29,12 @@ obj-$(CONFIG_MODULES) += armksyms.o module.o · 17 unmodified lines | ||
| 29 | 29 | obj-$(CONFIG_ARTHUR) += arthur.o |
| 30 | 30 | obj-$(CONFIG_ISA_DMA) += dma-isa.o |
| 31 | 31 | obj-$(CONFIG_PCI) += bios32.o isa.o |
| 32 | −obj-$(CONFIG_SMP) += smp.o | |
| 32 | +obj-$(CONFIG_HAVE_SCHED_CLOCK) += sched_clock.o | |
| 33 | +obj-$(CONFIG_SMP) += smp.o smp_tlb.o | |
| 33 | 34 | obj-$(CONFIG_HAVE_ARM_SCU) += smp_scu.o |
| 34 | 35 | obj-$(CONFIG_HAVE_ARM_TWD) += smp_twd.o |
| 35 | 36 | obj-$(CONFIG_DYNAMIC_FTRACE) += ftrace.o |
| 37 | +obj-$(CONFIG_FUNCTION_GRAPH_TRACER) += ftrace.o | |
| 36 | 38 | obj-$(CONFIG_KEXEC) += machine_kexec.o relocate_kernel.o |
| 37 | 39 | obj-$(CONFIG_KPROBES) += kprobes.o kprobes-decode.o |
| 38 | 40 | obj-$(CONFIG_ATAGS_PROC) += atags.o |
| @@ -42,6 +44,8 @@ obj-$(CONFIG_KGDB) += kgdb.o · 3 unmodified lines | ||
| 42 | 44 | obj-$(CONFIG_ARM_UNWIND) += unwind.o |
| 43 | 45 | obj-$(CONFIG_HAVE_TCM) += tcm.o |
| 44 | 46 | obj-$(CONFIG_CRASH_DUMP) += crash_dump.o |
| 47 | +obj-$(CONFIG_SWP_EMULATE) += swp_emulate.o | |
| 48 | +CFLAGS_swp_emulate.o := -Wa,-march=armv7-a | |
| 45 | 49 | obj-$(CONFIG_HAVE_HW_BREAKPOINT) += hw_breakpoint.o |
| 46 | 50 | |
| 47 | 51 | obj-$(CONFIG_CRUNCH) += crunch.o crunch-bits.o |
| @@ -50,6 +54,7 @@ AFLAGS_crunch-bits.o := -Wa,-mcpu=ep9312 · 2 unmodified lines | ||
| 50 | 54 | obj-$(CONFIG_CPU_XSCALE) += xscale-cp0.o |
| 51 | 55 | obj-$(CONFIG_CPU_XSC3) += xscale-cp0.o |
| 52 | 56 | obj-$(CONFIG_CPU_MOHAWK) += xscale-cp0.o |
| 57 | +obj-$(CONFIG_CPU_PJ4) += pj4-cp0.o | |
| 53 | 58 | obj-$(CONFIG_IWMMXT) += iwmmxt.o |
| 54 | 59 | obj-$(CONFIG_CPU_HAS_PMU) += pmu.o |
| 55 | 60 | obj-$(CONFIG_HW_PERF_EVENTS) += perf_event.o |
| @@ -443,40 +443,40 @@ static expansioncard_ops_t ecard_default_ops = { · 442 unmodified lines | ||
| 443 | 443 | * |
| 444 | 444 | * They are not meant to be called directly, but via enable/disable_irq. |
| 445 | 445 | */ |
| 446 | −static void ecard_irq_unmask(unsigned int irqnr) | |
| 446 | +static void ecard_irq_unmask(struct irq_data *d) | |
| 447 | 447 | { |
| 448 | − ecard_t *ec = slot_to_ecard(irqnr - 32); | |
| 448 | + ecard_t *ec = slot_to_ecard(d->irq - 32); | |
| 449 | 449 | |
| 450 | 450 | if (ec) { |
| 451 | 451 | if (!ec->ops) |
| 452 | 452 | ec->ops = &ecard_default_ops; |
| 453 | 453 | |
| 454 | 454 | if (ec->claimed && ec->ops->irqenable) |
| 455 | − ec->ops->irqenable(ec, irqnr); | |
| 455 | + ec->ops->irqenable(ec, d->irq); | |
| 456 | 456 | else |
| 457 | 457 | printk(KERN_ERR "ecard: rejecting request to " |
| 458 | − "enable IRQs for %d\n", irqnr); | |
| 458 | + "enable IRQs for %d\n", d->irq); | |
| 459 | 459 | } |
| 460 | 460 | } |
| 461 | 461 | |
| 462 | −static void ecard_irq_mask(unsigned int irqnr) | |
| 462 | +static void ecard_irq_mask(struct irq_data *d) | |
| 463 | 463 | { |
| 464 | − ecard_t *ec = slot_to_ecard(irqnr - 32); | |
| 464 | + ecard_t *ec = slot_to_ecard(d->irq - 32); | |
| 465 | 465 | |
| 466 | 466 | if (ec) { |
| 467 | 467 | if (!ec->ops) |
| 468 | 468 | ec->ops = &ecard_default_ops; |
| 469 | 469 | |
| 470 | 470 | if (ec->ops && ec->ops->irqdisable) |
| 471 | − ec->ops->irqdisable(ec, irqnr); | |
| 471 | + ec->ops->irqdisable(ec, d->irq); | |
| 472 | 472 | } |
| 473 | 473 | } |
| 474 | 474 | |
| 475 | 475 | static struct irq_chip ecard_chip = { |
| 476 | − .name = "ECARD", | |
| 477 | − .ack = ecard_irq_mask, | |
| 478 | − .mask = ecard_irq_mask, | |
| 479 | − .unmask = ecard_irq_unmask, | |
| 476 | + .name = "ECARD", | |
| 477 | + .irq_ack = ecard_irq_mask, | |
| 478 | + .irq_mask = ecard_irq_mask, | |
| 479 | + .irq_unmask = ecard_irq_unmask, | |
| 480 | 480 | }; |
| 481 | 481 | |
| 482 | 482 | void ecard_enablefiq(unsigned int fiqnr) |
| @@ -551,7 +551,7 @@ static void ecard_check_lockup(struct irq_desc *desc) · 68 unmodified lines | ||
| 551 | 551 | printk(KERN_ERR "\nInterrupt lockup detected - " |
| 552 | 552 | "disabling all expansion card interrupts\n"); |
| 553 | 553 | |
| 554 | − desc->chip->mask(IRQ_EXPANSIONCARD); | |
| 554 | + desc->irq_data.chip->irq_mask(&desc->irq_data); | |
| 555 | 555 | ecard_dump_irq_state(); |
| 556 | 556 | } |
| 557 | 557 | } else |
| @@ -574,7 +574,7 @@ ecard_irq_handler(unsigned int irq, struct irq_desc *desc) · 16 unmodified lines | ||
| 574 | 574 | ecard_t *ec; |
| 575 | 575 | int called = 0; |
| 576 | 576 | |
| 577 | − desc->chip->mask(irq); | |
| 577 | + desc->irq_data.chip->irq_mask(&desc->irq_data); | |
| 578 | 578 | for (ec = cards; ec; ec = ec->next) { |
| 579 | 579 | int pending; |
| 580 | 580 | |
| @@ -591,7 +591,7 @@ ecard_irq_handler(unsigned int irq, struct irq_desc *desc) · 10 unmodified lines | ||
| 591 | 591 | called ++; |
| 592 | 592 | } |
| 593 | 593 | } |
| 594 | − desc->chip->unmask(irq); | |
| 594 | + desc->irq_data.chip->irq_unmask(&desc->irq_data); | |
| 595 | 595 | |
| 596 | 596 | if (called == 0) |
| 597 | 597 | ecard_check_lockup(desc); |
| @@ -25,42 +25,22 @@ · 24 unmodified lines | ||
| 25 | 25 | #include <asm/tls.h> |
| 26 | 26 | |
| 27 | 27 | #include "entry-header.S" |
| 28 | +#include <asm/entry-macro-multi.S> | |
| 28 | 29 | |
| 29 | 30 | /* |
| 30 | 31 | * Interrupt handling. Preserves r7, r8, r9 |
| 31 | 32 | */ |
| 32 | 33 | .macro irq_handler |
| 33 | − get_irqnr_preamble r5, lr | |
| 34 | −1: get_irqnr_and_base r0, r6, r5, lr | |
| 35 | − movne r1, sp | |
| 36 | − @ | |
| 37 | − @ routine called with r0 = irq number, r1 = struct pt_regs * | |
| 38 | − @ | |
| 39 | − adrne lr, BSYM(1b) | |
| 40 | − bne asm_do_IRQ | |
| 41 | − | |
| 42 | −#ifdef CONFIG_SMP | |
| 43 | − /* | |
| 44 | − * XXX | |
| 45 | − * | |
| 46 | − * this macro assumes that irqstat (r6) and base (r5) are | |
| 47 | − * preserved from get_irqnr_and_base above | |
| 48 | − */ | |
| 49 | − ALT_SMP(test_for_ipi r0, r6, r5, lr) | |
| 50 | − ALT_UP_B(9997f) | |
| 51 | − movne r0, sp | |
| 52 | − adrne lr, BSYM(1b) | |
| 53 | − bne do_IPI | |
| 54 | − | |
| 55 | −#ifdef CONFIG_LOCAL_TIMERS | |
| 56 | − test_for_ltirq r0, r6, r5, lr | |
| 57 | − movne r0, sp | |
| 58 | − adrne lr, BSYM(1b) | |
| 59 | − bne do_local_timer | |
| 34 | +#ifdef CONFIG_MULTI_IRQ_HANDLER | |
| 35 | + ldr r5, =handle_arch_irq | |
| 36 | + mov r0, sp | |
| 37 | + ldr r5, [r5] | |
| 38 | + adr lr, BSYM(9997f) | |
| 39 | + teq r5, #0 | |
| 40 | + movne pc, r5 | |
| 60 | 41 | #endif |
| 42 | + arch_irq_handler_default | |
| 61 | 43 | 9997: |
| 62 | −#endif | |
| 63 | − | |
| 64 | 44 | .endm |
| 65 | 45 | |
| 66 | 46 | #ifdef CONFIG_KPROBES |
| @@ -198,6 +178,7 @@ __dabt_svc: · 131 unmodified lines | ||
| 198 | 178 | @ |
| 199 | 179 | @ set desired IRQ state, then call main handler |
| 200 | 180 | @ |
| 181 | + debug_entry r1 | |
| 201 | 182 | msr cpsr_c, r9 |
| 202 | 183 | mov r2, sp |
| 203 | 184 | bl do_DataAbort |
| @@ -324,6 +305,7 @@ __pabt_svc: · 120 unmodified lines | ||
| 324 | 305 | #else |
| 325 | 306 | bl CPU_PABORT_HANDLER |
| 326 | 307 | #endif |
| 308 | + debug_entry r1 | |
| 327 | 309 | msr cpsr_c, r9 @ Maybe enable interrupts |
| 328 | 310 | mov r2, sp @ regs |
| 329 | 311 | bl do_PrefetchAbort @ call abort handler |
| @@ -439,6 +421,7 @@ __dabt_usr: · 109 unmodified lines | ||
| 439 | 421 | @ |
| 440 | 422 | @ IRQs on, then call the main handler |
| 441 | 423 | @ |
| 424 | + debug_entry r1 | |
| 442 | 425 | enable_irq |
| 443 | 426 | mov r2, sp |
| 444 | 427 | adr lr, BSYM(ret_from_exception) |
| @@ -703,6 +686,7 @@ __pabt_usr: · 258 unmodified lines | ||
| 703 | 686 | #else |
| 704 | 687 | bl CPU_PABORT_HANDLER |
| 705 | 688 | #endif |
| 689 | + debug_entry r1 | |
| 706 | 690 | enable_irq @ Enable interrupts |
| 707 | 691 | mov r2, sp @ regs |
| 708 | 692 | bl do_PrefetchAbort @ call abort handler |
| @@ -735,7 +719,7 @@ ENTRY(__switch_to) · 26 unmodified lines | ||
| 735 | 719 | THUMB( stmia ip!, {r4 - sl, fp} ) @ Store most regs on stack |
| 736 | 720 | THUMB( str sp, [ip], #4 ) |
| 737 | 721 | THUMB( str lr, [ip], #4 ) |
| 738 | −#ifdef CONFIG_MMU | |
| 722 | +#ifdef CONFIG_CPU_USE_DOMAINS | |
| 739 | 723 | ldr r6, [r2, #TI_CPU_DOMAIN] |
| 740 | 724 | #endif |
| 741 | 725 | set_tls r3, r4, r5 |
| @@ -744,7 +728,7 @@ ENTRY(__switch_to) · 2 unmodified lines | ||
| 744 | 728 | ldr r8, =__stack_chk_guard |
| 745 | 729 | ldr r7, [r7, #TSK_STACK_CANARY] |
| 746 | 730 | #endif |
| 747 | −#ifdef CONFIG_MMU | |
| 731 | +#ifdef CONFIG_CPU_USE_DOMAINS | |
| 748 | 732 | mcr p15, 0, r6, c3, c0, 0 @ Set domain register |
| 749 | 733 | #endif |
| 750 | 734 | mov r5, r0 |
| @@ -842,7 +826,7 @@ __kuser_helper_start: · 91 unmodified lines | ||
| 842 | 826 | */ |
| 843 | 827 | |
| 844 | 828 | __kuser_memory_barrier: @ 0xffff0fa0 |
| 845 | − smp_dmb | |
| 829 | + smp_dmb arm | |
| 846 | 830 | usr_ret lr |
| 847 | 831 | |
| 848 | 832 | .align 5 |
| @@ -959,7 +943,7 @@ kuser_cmpxchg_fixup: · 110 unmodified lines | ||
| 959 | 943 | |
| 960 | 944 | #else |
| 961 | 945 | |
| 962 | − smp_dmb | |
| 946 | + smp_dmb arm | |
| 963 | 947 | 1: ldrex r3, [r2] |
| 964 | 948 | subs r3, r3, r0 |
| 965 | 949 | strexeq r3, r1, [r2] |
| @@ -1245,3 +1229,9 @@ cr_alignment: · 279 unmodified lines | ||
| 1245 | 1229 | .space 4 |
| 1246 | 1230 | cr_no_alignment: |
| 1247 | 1231 | .space 4 |
| 1232 | + | |
| 1233 | +#ifdef CONFIG_MULTI_IRQ_HANDLER | |
| 1234 | + .globl handle_arch_irq | |
| 1235 | +handle_arch_irq: | |
| 1236 | + .space 4 | |
| 1237 | +#endif | |
| @@ -147,98 +147,170 @@ ENDPROC(ret_from_fork) · 146 unmodified lines | ||
| 147 | 147 | #endif |
| 148 | 148 | #endif |
| 149 | 149 | |
| 150 | −#ifdef CONFIG_DYNAMIC_FTRACE | |
| 151 | −ENTRY(__gnu_mcount_nc) | |
| 152 | − mov ip, lr | |
| 153 | − ldmia sp!, {lr} | |
| 154 | − mov pc, ip | |
| 155 | −ENDPROC(__gnu_mcount_nc) | |
| 150 | +.macro __mcount suffix | |
| 151 | + mcount_enter | |
| 152 | + ldr r0, =ftrace_trace_function | |
| 153 | + ldr r2, [r0] | |
| 154 | + adr r0, .Lftrace_stub | |
| 155 | + cmp r0, r2 | |
| 156 | + bne 1f | |
| 157 | + | |
| 158 | +#ifdef CONFIG_FUNCTION_GRAPH_TRACER | |
| 159 | + ldr r1, =ftrace_graph_return | |
| 160 | + ldr r2, [r1] | |
| 161 | + cmp r0, r2 | |
| 162 | + bne ftrace_graph_caller\suffix | |
| 163 | + | |
| 164 | + ldr r1, =ftrace_graph_entry | |
| 165 | + ldr r2, [r1] | |
| 166 | + ldr r0, =ftrace_graph_entry_stub | |
| 167 | + cmp r0, r2 | |
| 168 | + bne ftrace_graph_caller\suffix | |
| 169 | +#endif | |
| 156 | 170 | |
| 157 | −ENTRY(ftrace_caller) | |
| 158 | − stmdb sp!, {r0-r3, lr} | |
| 159 | − mov r0, lr | |
| 171 | + mcount_exit | |
| 172 | + | |
| 173 | +1: mcount_get_lr r1 @ lr of instrumented func | |
| 174 | + mov r0, lr @ instrumented function | |
| 175 | + sub r0, r0, #MCOUNT_INSN_SIZE | |
| 176 | + adr lr, BSYM(2f) | |
| 177 | + mov pc, r2 | |
| 178 | +2: mcount_exit | |
| 179 | +.endm | |
| 180 | + | |
| 181 | +.macro __ftrace_caller suffix | |
| 182 | + mcount_enter | |
| 183 | + | |
| 184 | + mcount_get_lr r1 @ lr of instrumented func | |
| 185 | + mov r0, lr @ instrumented function | |
| 160 | 186 | sub r0, r0, #MCOUNT_INSN_SIZE |
| 161 | − ldr r1, [sp, #20] | |
| 162 | 187 | |
| 163 | − .global ftrace_call | |
| 164 | −ftrace_call: | |
| 188 | + .globl ftrace_call\suffix | |
| 189 | +ftrace_call\suffix: | |
| 165 | 190 | bl ftrace_stub |
| 166 | − ldmia sp!, {r0-r3, ip, lr} | |
| 167 | − mov pc, ip | |
| 168 | −ENDPROC(ftrace_caller) | |
| 191 | + | |
| 192 | +#ifdef CONFIG_FUNCTION_GRAPH_TRACER | |
| 193 | + .globl ftrace_graph_call\suffix | |
| 194 | +ftrace_graph_call\suffix: | |
| 195 | + mov r0, r0 | |
| 196 | +#endif | |
| 197 | + | |
| 198 | + mcount_exit | |
| 199 | +.endm | |
| 200 | + | |
| 201 | +.macro __ftrace_graph_caller | |
| 202 | + sub r0, fp, #4 @ &lr of instrumented routine (&parent) | |
| 203 | +#ifdef CONFIG_DYNAMIC_FTRACE | |
| 204 | + @ called from __ftrace_caller, saved in mcount_enter | |
| 205 | + ldr r1, [sp, #16] @ instrumented routine (func) | |
| 206 | +#else | |
| 207 | + @ called from __mcount, untouched in lr | |
| 208 | + mov r1, lr @ instrumented routine (func) | |
| 209 | +#endif | |
| 210 | + sub r1, r1, #MCOUNT_INSN_SIZE | |
| 211 | + mov r2, fp @ frame pointer | |
| 212 | + bl prepare_ftrace_return | |
| 213 | + mcount_exit | |
| 214 | +.endm | |
| 169 | 215 | |
| 170 | 216 | #ifdef CONFIG_OLD_MCOUNT |
| 217 | +/* | |
| 218 | + * mcount | |
| 219 | + */ | |
| 220 | + | |
| 221 | +.macro mcount_enter | |
| 222 | + stmdb sp!, {r0-r3, lr} | |
| 223 | +.endm | |
| 224 | + | |
| 225 | +.macro mcount_get_lr reg | |
| 226 | + ldr \reg, [fp, #-4] | |
| 227 | +.endm | |
| 228 | + | |
| 229 | +.macro mcount_exit | |
| 230 | + ldr lr, [fp, #-4] | |
| 231 | + ldmia sp!, {r0-r3, pc} | |
| 232 | +.endm | |
| 233 | + | |
| 171 | 234 | ENTRY(mcount) |
| 235 | +#ifdef CONFIG_DYNAMIC_FTRACE | |
| 172 | 236 | stmdb sp!, {lr} |
| 173 | 237 | ldr lr, [fp, #-4] |
| 174 | 238 | ldmia sp!, {pc} |
| 239 | +#else | |
| 240 | + __mcount _old | |
| 241 | +#endif | |
| 175 | 242 | ENDPROC(mcount) |
| 176 | 243 | |
| 244 | +#ifdef CONFIG_DYNAMIC_FTRACE | |
| 177 | 245 | ENTRY(ftrace_caller_old) |
| 178 | − stmdb sp!, {r0-r3, lr} | |
| 179 | − ldr r1, [fp, #-4] | |
| 180 | − mov r0, lr | |
| 181 | − sub r0, r0, #MCOUNT_INSN_SIZE | |
| 182 | − | |
| 183 | − .globl ftrace_call_old | |
| 184 | −ftrace_call_old: | |
| 185 | − bl ftrace_stub | |
| 186 | − ldr lr, [fp, #-4] @ restore lr | |
| 187 | − ldmia sp!, {r0-r3, pc} | |
| 246 | + __ftrace_caller _old | |
| 188 | 247 | ENDPROC(ftrace_caller_old) |
| 189 | 248 | #endif |
| 190 | 249 | |
| 191 | −#else | |
| 250 | +#ifdef CONFIG_FUNCTION_GRAPH_TRACER | |
| 251 | +ENTRY(ftrace_graph_caller_old) | |
| 252 | + __ftrace_graph_caller | |
| 253 | +ENDPROC(ftrace_graph_caller_old) | |
| 254 | +#endif | |
| 192 | 255 | |
| 193 | −ENTRY(__gnu_mcount_nc) | |
| 256 | +.purgem mcount_enter | |
| 257 | +.purgem mcount_get_lr | |
| 258 | +.purgem mcount_exit | |
| 259 | +#endif | |
| 260 | + | |
| 261 | +/* | |
| 262 | + * __gnu_mcount_nc | |
| 263 | + */ | |
| 264 | + | |
| 265 | +.macro mcount_enter | |
| 194 | 266 | stmdb sp!, {r0-r3, lr} |
| 195 | − ldr r0, =ftrace_trace_function | |
| 196 | − ldr r2, [r0] | |
| 197 | − adr r0, .Lftrace_stub | |
| 198 | − cmp r0, r2 | |
| 199 | − bne gnu_trace | |
| 267 | +.endm | |
| 268 | + | |
| 269 | +.macro mcount_get_lr reg | |
| 270 | + ldr \reg, [sp, #20] | |
| 271 | +.endm | |
| 272 | + | |
| 273 | +.macro mcount_exit | |
| 200 | 274 | ldmia sp!, {r0-r3, ip, lr} |
| 201 | 275 | mov pc, ip |
| 276 | +.endm | |
| 202 | 277 | |
| 203 | −gnu_trace: | |
| 204 | − ldr r1, [sp, #20] @ lr of instrumented routine | |
| 205 | − mov r0, lr | |
| 206 | − sub r0, r0, #MCOUNT_INSN_SIZE | |
| 207 | − adr lr, BSYM(1f) | |
| 208 | − mov pc, r2 | |
| 209 | −1: | |
| 210 | − ldmia sp!, {r0-r3, ip, lr} | |
| 278 | +ENTRY(__gnu_mcount_nc) | |
| 279 | +#ifdef CONFIG_DYNAMIC_FTRACE | |
| 280 | + mov ip, lr | |
| 281 | + ldmia sp!, {lr} | |
| 211 | 282 | mov pc, ip |
| 283 | +#else | |
| 284 | + __mcount | |
| 285 | +#endif | |
| 212 | 286 | ENDPROC(__gnu_mcount_nc) |
| 213 | 287 | |
| 214 | −#ifdef CONFIG_OLD_MCOUNT | |
| 215 | −/* | |
| 216 | − * This is under an ifdef in order to force link-time errors for people trying | |
| 217 | − * to build with !FRAME_POINTER with a GCC which doesn't use the new-style | |
| 218 | − * mcount. | |
| 219 | − */ | |
| 220 | −ENTRY(mcount) | |
| 221 | − stmdb sp!, {r0-r3, lr} | |
| 222 | − ldr r0, =ftrace_trace_function | |
| 223 | − ldr r2, [r0] | |
| 224 | − adr r0, ftrace_stub | |
| 225 | − cmp r0, r2 | |
| 226 | − bne trace | |
| 227 | − ldr lr, [fp, #-4] @ restore lr | |
| 228 | − ldmia sp!, {r0-r3, pc} | |
| 288 | +#ifdef CONFIG_DYNAMIC_FTRACE | |
| 289 | +ENTRY(ftrace_caller) | |
| 290 | + __ftrace_caller | |
| 291 | +ENDPROC(ftrace_caller) | |
| 292 | +#endif | |
| 229 | 293 | |
| 230 | −trace: | |
| 231 | − ldr r1, [fp, #-4] @ lr of instrumented routine | |
| 232 | − mov r0, lr | |
| 233 | − sub r0, r0, #MCOUNT_INSN_SIZE | |
| 234 | − mov lr, pc | |
| 235 | − mov pc, r2 | |
| 236 | − ldr lr, [fp, #-4] @ restore lr | |
| 237 | − ldmia sp!, {r0-r3, pc} | |
| 238 | −ENDPROC(mcount) | |
| 294 | +#ifdef CONFIG_FUNCTION_GRAPH_TRACER | |
| 295 | +ENTRY(ftrace_graph_caller) | |
| 296 | + __ftrace_graph_caller | |
| 297 | +ENDPROC(ftrace_graph_caller) | |
| 239 | 298 | #endif |
| 240 | 299 | |
| 241 | −#endif /* CONFIG_DYNAMIC_FTRACE */ | |
| 300 | +.purgem mcount_enter | |
| 301 | +.purgem mcount_get_lr | |
| 302 | +.purgem mcount_exit | |
| 303 | + | |
| 304 | +#ifdef CONFIG_FUNCTION_GRAPH_TRACER | |
| 305 | + .globl return_to_handler | |
| 306 | +return_to_handler: | |
| 307 | + stmdb sp!, {r0-r3} | |
| 308 | + mov r0, fp @ frame pointer | |
| 309 | + bl ftrace_return_to_handler | |
| 310 | + mov lr, r0 @ r0 has real ret addr | |
| 311 | + ldmia sp!, {r0-r3} | |
| 312 | + mov pc, lr | |
| 313 | +#endif | |
| 242 | 314 | |
| 243 | 315 | ENTRY(ftrace_stub) |
| 244 | 316 | .Lftrace_stub: |
| @@ -165,6 +165,25 @@ · 164 unmodified lines | ||
| 165 | 165 | .endm |
| 166 | 166 | #endif /* !CONFIG_THUMB2_KERNEL */ |
| 167 | 167 | |
| 168 | + @ | |
| 169 | + @ Debug exceptions are taken as prefetch or data aborts. | |
| 170 | + @ We must disable preemption during the handler so that | |
| 171 | + @ we can access the debug registers safely. | |
| 172 | + @ | |
| 173 | + .macro debug_entry, fsr | |
| 174 | +#if defined(CONFIG_HAVE_HW_BREAKPOINT) && defined(CONFIG_PREEMPT) | |
| 175 | + ldr r4, =0x40f @ mask out fsr.fs | |
| 176 | + and r5, r4, \fsr | |
| 177 | + cmp r5, #2 @ debug exception | |
| 178 | + bne 1f | |
| 179 | + get_thread_info r10 | |
| 180 | + ldr r6, [r10, #TI_PREEMPT] @ get preempt count | |
| 181 | + add r11, r6, #1 @ increment it | |
| 182 | + str r11, [r10, #TI_PREEMPT] | |
| 183 | +1: | |
| 184 | +#endif | |
| 185 | + .endm | |
| 186 | + | |
| 168 | 187 | /* |
| 169 | 188 | * These are the registers used in the syscall handler, and allow us to |
| 170 | 189 | * have in theory up to 7 arguments to a function - r0 to r6. |
| @@ -45,6 +45,7 @@ · 44 unmodified lines | ||
| 45 | 45 | #include <asm/fiq.h> |
| 46 | 46 | #include <asm/irq.h> |
| 47 | 47 | #include <asm/system.h> |
| 48 | +#include <asm/traps.h> | |
| 48 | 49 | |
| 49 | 50 | static unsigned long no_fiq_insn; |
| 50 | 51 | |
| @@ -67,17 +68,22 @@ static struct fiq_handler default_owner = { · 16 unmodified lines | ||
| 67 | 68 | |
| 68 | 69 | static struct fiq_handler *current_fiq = &default_owner; |
| 69 | 70 | |
| 70 | −int show_fiq_list(struct seq_file *p, void *v) | |
| 71 | +int show_fiq_list(struct seq_file *p, int prec) | |
| 71 | 72 | { |
| 72 | 73 | if (current_fiq != &default_owner) |
| 73 | − seq_printf(p, "FIQ: %s\n", current_fiq->name); | |
| 74 | + seq_printf(p, "%*s: %s\n", prec, "FIQ", | |
| 75 | + current_fiq->name); | |
| 74 | 76 | |
| 75 | 77 | return 0; |
| 76 | 78 | } |
| 77 | 79 | |
| 78 | 80 | void set_fiq_handler(void *start, unsigned int length) |
| 79 | 81 | { |
| 82 | +#if defined(CONFIG_CPU_USE_DOMAINS) | |
| 80 | 83 | memcpy((void *)0xffff001c, start, length); |
| 84 | +#else | |
| 85 | + memcpy(vectors_page + 0x1c, start, length); | |
| 86 | +#endif | |
| 81 | 87 | flush_icache_range(0xffff001c, 0xffff001c + length); |
| 82 | 88 | if (!vectors_high()) |
| 83 | 89 | flush_icache_range(0x1c, 0x1c + length); |
| @@ -24,6 +24,7 @@ · 23 unmodified lines | ||
| 24 | 24 | #define NOP 0xe8bd4000 /* pop {lr} */ |
| 25 | 25 | #endif |
| 26 | 26 | |
| 27 | +#ifdef CONFIG_DYNAMIC_FTRACE | |
| 27 | 28 | #ifdef CONFIG_OLD_MCOUNT |
| 28 | 29 | #define OLD_MCOUNT_ADDR ((unsigned long) mcount) |
| 29 | 30 | #define OLD_FTRACE_ADDR ((unsigned long) ftrace_caller_old) |
| @@ -59,9 +60,9 @@ static unsigned long adjust_address(struct dyn_ftrace *rec, unsigned long addr) · 29 unmodified lines | ||
| 59 | 60 | } |
| 60 | 61 | #endif |
| 61 | 62 | |
| 62 | −/* construct a branch (BL) instruction to addr */ | |
| 63 | 63 | #ifdef CONFIG_THUMB2_KERNEL |
| 64 | −static unsigned long ftrace_call_replace(unsigned long pc, unsigned long addr) | |
| 64 | +static unsigned long ftrace_gen_branch(unsigned long pc, unsigned long addr, | |
| 65 | + bool link) | |
| 65 | 66 | { |
| 66 | 67 | unsigned long s, j1, j2, i1, i2, imm10, imm11; |
| 67 | 68 | unsigned long first, second; |
| @@ -83,15 +84,22 @@ static unsigned long ftrace_call_replace(unsigned long pc, unsigned long addr) · 15 unmodified lines | ||
| 83 | 84 | j2 = (!i2) ^ s; |
| 84 | 85 | |
| 85 | 86 | first = 0xf000 | (s << 10) | imm10; |
| 86 | − second = 0xd000 | (j1 << 13) | (j2 << 11) | imm11; | |
| 87 | + second = 0x9000 | (j1 << 13) | (j2 << 11) | imm11; | |
| 88 | + if (link) | |
| 89 | + second |= 1 << 14; | |
| 87 | 90 | |
| 88 | 91 | return (second << 16) | first; |
| 89 | 92 | } |
| 90 | 93 | #else |
| 91 | −static unsigned long ftrace_call_replace(unsigned long pc, unsigned long addr) | |
| 94 | +static unsigned long ftrace_gen_branch(unsigned long pc, unsigned long addr, | |
| 95 | + bool link) | |
| 92 | 96 | { |
| 97 | + unsigned long opcode = 0xea000000; | |
| 93 | 98 | long offset; |
| 94 | 99 | |
| 100 | + if (link) | |
| 101 | + opcode |= 1 << 24; | |
| 102 | + | |
| 95 | 103 | offset = (long)addr - (long)(pc + 8); |
| 96 | 104 | if (unlikely(offset < -33554432 || offset > 33554428)) { |
| 97 | 105 | /* Can't generate branches that far (from ARM ARM). Ftrace |
| @@ -103,10 +111,15 @@ static unsigned long ftrace_call_replace(unsigned long pc, unsigned long addr) · 5 unmodified lines | ||
| 103 | 111 | |
| 104 | 112 | offset = (offset >> 2) & 0x00ffffff; |
| 105 | 113 | |
| 106 | − return 0xeb000000 | offset; | |
| 114 | + return opcode | offset; | |
| 107 | 115 | } |
| 108 | 116 | #endif |
| 109 | 117 | |
| 118 | +static unsigned long ftrace_call_replace(unsigned long pc, unsigned long addr) | |
| 119 | +{ | |
| 120 | + return ftrace_gen_branch(pc, addr, true); | |
| 121 | +} | |
| 122 | + | |
| 110 | 123 | static int ftrace_modify_code(unsigned long pc, unsigned long old, |
| 111 | 124 | unsigned long new) |
| 112 | 125 | { |
| @@ -193,3 +206,83 @@ int __init ftrace_dyn_arch_init(void *data) · 80 unmodified lines | ||
| 193 | 206 | |
| 194 | 207 | return 0; |
| 195 | 208 | } |
| 209 | +#endif /* CONFIG_DYNAMIC_FTRACE */ | |
| 210 | + | |
| 211 | +#ifdef CONFIG_FUNCTION_GRAPH_TRACER | |
| 212 | +void prepare_ftrace_return(unsigned long *parent, unsigned long self_addr, | |
| 213 | + unsigned long frame_pointer) | |
| 214 | +{ | |
| 215 | + unsigned long return_hooker = (unsigned long) &return_to_handler; | |
| 216 | + struct ftrace_graph_ent trace; | |
| 217 | + unsigned long old; | |
| 218 | + int err; | |
| 219 | + | |
| 220 | + if (unlikely(atomic_read(¤t->tracing_graph_pause))) | |
| 221 | + return; | |
| 222 | + | |
| 223 | + old = *parent; | |
| 224 | + *parent = return_hooker; | |
| 225 | + | |
| 226 | + err = ftrace_push_return_trace(old, self_addr, &trace.depth, | |
| 227 | + frame_pointer); | |
| 228 | + if (err == -EBUSY) { | |
| 229 | + *parent = old; | |
| 230 | + return; | |
| 231 | + } | |
| 232 | + | |
| 233 | + trace.func = self_addr; | |
| 234 | + | |
| 235 | + /* Only trace if the calling function expects to */ | |
| 236 | + if (!ftrace_graph_entry(&trace)) { | |
| 237 | + current->curr_ret_stack--; | |
| 238 | + *parent = old; | |
| 239 | + } | |
| 240 | +} | |
| 241 | + | |
| 242 | +#ifdef CONFIG_DYNAMIC_FTRACE | |
| 243 | +extern unsigned long ftrace_graph_call; | |
| 244 | +extern unsigned long ftrace_graph_call_old; | |
| 245 | +extern void ftrace_graph_caller_old(void); | |
| 246 | + | |
| 247 | +static int __ftrace_modify_caller(unsigned long *callsite, | |
| 248 | + void (*func) (void), bool enable) | |
| 249 | +{ | |
| 250 | + unsigned long caller_fn = (unsigned long) func; | |
| 251 | + unsigned long pc = (unsigned long) callsite; | |
| 252 | + unsigned long branch = ftrace_gen_branch(pc, caller_fn, false); | |
| 253 | + unsigned long nop = 0xe1a00000; /* mov r0, r0 */ | |
| 254 | + unsigned long old = enable ? nop : branch; | |
| 255 | + unsigned long new = enable ? branch : nop; | |
| 256 | + | |
| 257 | + return ftrace_modify_code(pc, old, new); | |
| 258 | +} | |
| 259 | + | |
| 260 | +static int ftrace_modify_graph_caller(bool enable) | |
| 261 | +{ | |
| 262 | + int ret; | |
| 263 | + | |
| 264 | + ret = __ftrace_modify_caller(&ftrace_graph_call, | |
| 265 | + ftrace_graph_caller, | |
| 266 | + enable); | |
| 267 | + | |
| 268 | +#ifdef CONFIG_OLD_MCOUNT | |
| 269 | + if (!ret) | |
| 270 | + ret = __ftrace_modify_caller(&ftrace_graph_call_old, | |
| 271 | + ftrace_graph_caller_old, | |
| 272 | + enable); | |
| 273 | +#endif | |
| 274 | + | |
| 275 | + return ret; | |
| 276 | +} | |
| 277 | + | |
| 278 | +int ftrace_enable_ftrace_graph_caller(void) | |
| 279 | +{ | |
| 280 | + return ftrace_modify_graph_caller(true); | |
| 281 | +} | |
| 282 | + | |
| 283 | +int ftrace_disable_ftrace_graph_caller(void) | |
| 284 | +{ | |
| 285 | + return ftrace_modify_graph_caller(false); | |
| 286 | +} | |
| 287 | +#endif /* CONFIG_DYNAMIC_FTRACE */ | |
| 288 | +#endif /* CONFIG_FUNCTION_GRAPH_TRACER */ | |
| @@ -60,6 +60,8 @@ str_a1: .asciz "\nError: unrecognized/unsupported machine ID (r1 = 0x" · 59 unmodified lines | ||
| 60 | 60 | str_a2: .asciz ").\n\nAvailable machine support:\n\nID (hex)\tNAME\n" |
| 61 | 61 | str_a3: .asciz "\nPlease check your kernel config and/or bootloader.\n" |
| 62 | 62 | .align |
| 63 | +#else | |
| 64 | + b __error | |
| 63 | 65 | #endif |
| 64 | 66 | |
| 65 | 67 | /* |
| @@ -91,6 +91,11 @@ ENTRY(stext) · 90 unmodified lines | ||
| 91 | 91 | movs r8, r5 @ invalid machine (r5=0)? |
| 92 | 92 | THUMB( it eq ) @ force fixup-able long branch encoding |
| 93 | 93 | beq __error_a @ yes, error 'a' |
| 94 | + | |
| 95 | + /* | |
| 96 | + * r1 = machine no, r2 = atags, | |
| 97 | + * r8 = machinfo, r9 = cpuid, r10 = procinfo | |
| 98 | + */ | |
| 94 | 99 | bl __vet_atags |
| 95 | 100 | #ifdef CONFIG_SMP_ON_UP |
| 96 | 101 | bl __fixup_smp |
| @@ -386,37 +391,32 @@ ENDPROC(__turn_mmu_on) · 289 unmodified lines | ||
| 386 | 391 | |
| 387 | 392 | |
| 388 | 393 | #ifdef CONFIG_SMP_ON_UP |
| 394 | + __INIT | |
| 389 | 395 | __fixup_smp: |
| 390 | − mov r7, #0x00070000 | |
| 391 | − orr r6, r7, #0xff000000 @ mask 0xff070000 | |
| 392 | − orr r7, r7, #0x41000000 @ val 0x41070000 | |
| 393 | − and r0, r9, r6 | |
| 394 | − teq r0, r7 @ ARM CPU and ARMv6/v7? | |
| 396 | + and r3, r9, #0x000f0000 @ architecture version | |
| 397 | + teq r3, #0x000f0000 @ CPU ID supported? | |
| 395 | 398 | bne __fixup_smp_on_up @ no, assume UP |
| 396 | 399 | |
| 397 | − orr r6, r6, #0x0000ff00 | |
| 398 | − orr r6, r6, #0x000000f0 @ mask 0xff07fff0 | |
| 399 | − orr r7, r7, #0x0000b000 | |
| 400 | − orr r7, r7, #0x00000020 @ val 0x4107b020 | |
| 401 | − and r0, r9, r6 | |
| 402 | − teq r0, r7 @ ARM 11MPCore? | |
| 400 | + bic r3, r9, #0x00ff0000 | |
| 401 | + bic r3, r3, #0x0000000f @ mask 0xff00fff0 | |
| 402 | + mov r4, #0x41000000 | |
| 403 | + orr r4, r4, #0x0000b000 | |
| 404 | + orr r4, r4, #0x00000020 @ val 0x4100b020 | |
| 405 | + teq r3, r4 @ ARM 11MPCore? | |
| 403 | 406 | moveq pc, lr @ yes, assume SMP |
| 404 | 407 | |
| 405 | 408 | mrc p15, 0, r0, c0, c0, 5 @ read MPIDR |
| 406 | − tst r0, #1 << 31 | |
| 407 | − movne pc, lr @ bit 31 => SMP | |
| 409 | + and r0, r0, #0xc0000000 @ multiprocessing extensions and | |
| 410 | + teq r0, #0x80000000 @ not part of a uniprocessor system? | |
| 411 | + moveq pc, lr @ yes, assume SMP | |
| 408 | 412 | |
| 409 | 413 | __fixup_smp_on_up: |
| 410 | 414 | adr r0, 1f |
| 411 | − ldmia r0, {r3, r6, r7} | |
| 415 | + ldmia r0, {r3 - r5} | |
| 412 | 416 | sub r3, r0, r3 |
| 413 | − add r6, r6, r3 | |
| 414 | − add r7, r7, r3 | |
| 415 | −2: cmp r6, r7 | |
| 416 | − ldmia r6!, {r0, r4} | |
| 417 | − strlo r4, [r0, r3] | |
| 418 | − blo 2b | |
| 419 | − mov pc, lr | |
| 417 | + add r4, r4, r3 | |
| 418 | + add r5, r5, r3 | |
| 419 | + b __do_fixup_smp_on_up | |
| 420 | 420 | ENDPROC(__fixup_smp) |
| 421 | 421 | |
| 422 | 422 | .align |
| @@ -430,7 +430,31 @@ smp_on_up: · 7 unmodified lines | ||
| 430 | 430 | ALT_SMP(.long 1) |
| 431 | 431 | ALT_UP(.long 0) |
| 432 | 432 | .popsection |
| 433 | +#endif | |
| 433 | 434 | |
| 435 | + .text | |
| 436 | +__do_fixup_smp_on_up: | |
| 437 | + cmp r4, r5 | |
| 438 | + movhs pc, lr | |
| 439 | + ldmia r4!, {r0, r6} | |
| 440 | + ARM( str r6, [r0, r3] ) | |
| 441 | + THUMB( add r0, r0, r3 ) | |
| 442 | +#ifdef __ARMEB__ | |
| 443 | + THUMB( mov r6, r6, ror #16 ) @ Convert word order for big-endian. | |
| 434 | 444 | #endif |
| 445 | + THUMB( strh r6, [r0], #2 ) @ For Thumb-2, store as two halfwords | |
| 446 | + THUMB( mov r6, r6, lsr #16 ) @ to be robust against misaligned r3. | |
| 447 | + THUMB( strh r6, [r0] ) | |
| 448 | + b __do_fixup_smp_on_up | |
| 449 | +ENDPROC(__do_fixup_smp_on_up) | |
| 450 | + | |
| 451 | +ENTRY(fixup_smp) | |
| 452 | + stmfd sp!, {r4 - r6, lr} | |
| 453 | + mov r4, r0 | |
| 454 | + add r5, r0, r1 | |
| 455 | + mov r3, #0 | |
| 456 | + bl __do_fixup_smp_on_up | |
| 457 | + ldmfd sp!, {r4 - r6, pc} | |
| 458 | +ENDPROC(fixup_smp) | |
| 435 | 459 | |
| 436 | 460 | #include "head-common.S" |
| @@ -24,6 +24,7 @@ · 23 unmodified lines | ||
| 24 | 24 | #define pr_fmt(fmt) "hw-breakpoint: " fmt |
| 25 | 25 | |
| 26 | 26 | #include <linux/errno.h> |
| 27 | +#include <linux/hardirq.h> | |
| 27 | 28 | #include <linux/perf_event.h> |
| 28 | 29 | #include <linux/hw_breakpoint.h> |
| 29 | 30 | #include <linux/smp.h> |
| @@ -44,6 +45,7 @@ static DEFINE_PER_CPU(struct perf_event *, wp_on_reg[ARM_MAX_WRP]); · 14 unmodified lines | ||
| 44 | 45 | |
| 45 | 46 | /* Number of BRP/WRP registers on this CPU. */ |
| 46 | 47 | static int core_num_brps; |
| 48 | +static int core_num_reserved_brps; | |
| 47 | 49 | static int core_num_wrps; |
| 48 | 50 | |
| 49 | 51 | /* Debug architecture version. */ |
| @@ -52,87 +54,6 @@ static u8 debug_arch; · 2 unmodified lines | ||
| 52 | 54 | /* Maximum supported watchpoint length. */ |
| 53 | 55 | static u8 max_watchpoint_len; |
| 54 | 56 | |
| 55 | −/* Determine number of BRP registers available. */ | |
| 56 | −static int get_num_brps(void) | |
| 57 | −{ | |
| 58 | − u32 didr; | |
| 59 | − ARM_DBG_READ(c0, 0, didr); | |
| 60 | − return ((didr >> 24) & 0xf) + 1; | |
| 61 | −} | |
| 62 | − | |
| 63 | −/* Determine number of WRP registers available. */ | |
| 64 | −static int get_num_wrps(void) | |
| 65 | −{ | |
| 66 | − /* | |
| 67 | − * FIXME: When a watchpoint fires, the only way to work out which | |
| 68 | − * watchpoint it was is by disassembling the faulting instruction | |
| 69 | − * and working out the address of the memory access. | |
| 70 | − * | |
| 71 | − * Furthermore, we can only do this if the watchpoint was precise | |
| 72 | − * since imprecise watchpoints prevent us from calculating register | |
| 73 | − * based addresses. | |
| 74 | − * | |
| 75 | − * For the time being, we only report 1 watchpoint register so we | |
| 76 | − * always know which watchpoint fired. In the future we can either | |
| 77 | − * add a disassembler and address generation emulator, or we can | |
| 78 | − * insert a check to see if the DFAR is set on watchpoint exception | |
| 79 | − * entry [the ARM ARM states that the DFAR is UNKNOWN, but | |
| 80 | − * experience shows that it is set on some implementations]. | |
| 81 | − */ | |
| 82 | − | |
| 83 | −#if 0 | |
| 84 | − u32 didr, wrps; | |
| 85 | − ARM_DBG_READ(c0, 0, didr); | |
| 86 | − return ((didr >> 28) & 0xf) + 1; | |
| 87 | −#endif | |
| 88 | − | |
| 89 | − return 1; | |
| 90 | −} | |
| 91 | − | |
| 92 | −int hw_breakpoint_slots(int type) | |
| 93 | −{ | |
| 94 | − /* | |
| 95 | − * We can be called early, so don't rely on | |
| 96 | − * our static variables being initialised. | |
| 97 | − */ | |
| 98 | − switch (type) { | |
| 99 | − case TYPE_INST: | |
| 100 | − return get_num_brps(); | |
| 101 | − case TYPE_DATA: | |
| 102 | − return get_num_wrps(); | |
| 103 | − default: | |
| 104 | − pr_warning("unknown slot type: %d\n", type); | |
| 105 | − return 0; | |
| 106 | − } | |
| 107 | −} | |
| 108 | − | |
| 109 | −/* Determine debug architecture. */ | |
| 110 | −static u8 get_debug_arch(void) | |
| 111 | −{ | |
| 112 | − u32 didr; | |
| 113 | − | |
| 114 | − /* Do we implement the extended CPUID interface? */ | |
| 115 | − if (((read_cpuid_id() >> 16) & 0xf) != 0xf) { | |
| 116 | − pr_warning("CPUID feature registers not supported. " | |
| 117 | − "Assuming v6 debug is present.\n"); | |
| 118 | − return ARM_DEBUG_ARCH_V6; | |
| 119 | − } | |
| 120 | − | |
| 121 | − ARM_DBG_READ(c0, 0, didr); | |
| 122 | − return (didr >> 16) & 0xf; | |
| 123 | −} | |
| 124 | − | |
| 125 | −/* Does this core support mismatch breakpoints? */ | |
| 126 | −static int core_has_mismatch_bps(void) | |
| 127 | −{ | |
| 128 | − return debug_arch >= ARM_DEBUG_ARCH_V7_ECP14 && core_num_brps > 1; | |
| 129 | −} | |
| 130 | − | |
| 131 | −u8 arch_get_debug_arch(void) | |
| 132 | −{ | |
| 133 | − return debug_arch; | |
| 134 | −} | |
| 135 | − | |
| 136 | 57 | #define READ_WB_REG_CASE(OP2, M, VAL) \ |
| 137 | 58 | case ((OP2 << 4) + M): \ |
| 138 | 59 | ARM_DBG_READ(c ## M, OP2, VAL); \ |
| @@ -210,6 +131,99 @@ static void write_wb_reg(int n, u32 val) · 71 unmodified lines | ||
| 210 | 131 | isb(); |
| 211 | 132 | } |
| 212 | 133 | |
| 134 | +/* Determine debug architecture. */ | |
| 135 | +static u8 get_debug_arch(void) | |
| 136 | +{ | |
| 137 | + u32 didr; | |
| 138 | + | |
| 139 | + /* Do we implement the extended CPUID interface? */ | |
| 140 | + if (WARN_ONCE((((read_cpuid_id() >> 16) & 0xf) != 0xf), | |
| 141 | + "CPUID feature registers not supported. " | |
| 142 | + "Assuming v6 debug is present.\n")) | |
| 143 | + return ARM_DEBUG_ARCH_V6; | |
| 144 | + | |
| 145 | + ARM_DBG_READ(c0, 0, didr); | |
| 146 | + return (didr >> 16) & 0xf; | |
| 147 | +} | |
| 148 | + | |
| 149 | +u8 arch_get_debug_arch(void) | |
| 150 | +{ | |
| 151 | + return debug_arch; | |
| 152 | +} | |
| 153 | + | |
| 154 | +static int debug_arch_supported(void) | |
| 155 | +{ | |
| 156 | + u8 arch = get_debug_arch(); | |
| 157 | + return arch >= ARM_DEBUG_ARCH_V6 && arch <= ARM_DEBUG_ARCH_V7_ECP14; | |
| 158 | +} | |
| 159 | + | |
| 160 | +/* Determine number of BRP register available. */ | |
| 161 | +static int get_num_brp_resources(void) | |
| 162 | +{ | |
| 163 | + u32 didr; | |
| 164 | + ARM_DBG_READ(c0, 0, didr); | |
| 165 | + return ((didr >> 24) & 0xf) + 1; | |
| 166 | +} | |
| 167 | + | |
| 168 | +/* Does this core support mismatch breakpoints? */ | |
| 169 | +static int core_has_mismatch_brps(void) | |
| 170 | +{ | |
| 171 | + return (get_debug_arch() >= ARM_DEBUG_ARCH_V7_ECP14 && | |
| 172 | + get_num_brp_resources() > 1); | |
| 173 | +} | |
| 174 | + | |
| 175 | +/* Determine number of usable WRPs available. */ | |
| 176 | +static int get_num_wrps(void) | |
| 177 | +{ | |
| 178 | + /* | |
| 179 | + * FIXME: When a watchpoint fires, the only way to work out which | |
| 180 | + * watchpoint it was is by disassembling the faulting instruction | |
| 181 | + * and working out the address of the memory access. | |
| 182 | + * | |
| 183 | + * Furthermore, we can only do this if the watchpoint was precise | |
| 184 | + * since imprecise watchpoints prevent us from calculating register | |
| 185 | + * based addresses. | |
| 186 | + * | |
| 187 | + * Providing we have more than 1 breakpoint register, we only report | |
| 188 | + * a single watchpoint register for the time being. This way, we always | |
| 189 | + * know which watchpoint fired. In the future we can either add a | |
| 190 | + * disassembler and address generation emulator, or we can insert a | |
| 191 | + * check to see if the DFAR is set on watchpoint exception entry | |
| 192 | + * [the ARM ARM states that the DFAR is UNKNOWN, but experience shows | |
| 193 | + * that it is set on some implementations]. | |
| 194 | + */ | |
| 195 | + | |
| 196 | +#if 0 | |
| 197 | + int wrps; | |
| 198 | + u32 didr; | |
| 199 | + ARM_DBG_READ(c0, 0, didr); | |
| 200 | + wrps = ((didr >> 28) & 0xf) + 1; | |
| 201 | +#endif | |
| 202 | + int wrps = 1; | |
| 203 | + | |
| 204 | + if (core_has_mismatch_brps() && wrps >= get_num_brp_resources()) | |
| 205 | + wrps = get_num_brp_resources() - 1; | |
| 206 | + | |
| 207 | + return wrps; | |
| 208 | +} | |
| 209 | + | |
| 210 | +/* We reserve one breakpoint for each watchpoint. */ | |
| 211 | +static int get_num_reserved_brps(void) | |
| 212 | +{ | |
| 213 | + if (core_has_mismatch_brps()) | |
| 214 | + return get_num_wrps(); | |
| 215 | + return 0; | |
| 216 | +} | |
| 217 | + | |
| 218 | +/* Determine number of usable BRPs available. */ | |
| 219 | +static int get_num_brps(void) | |
| 220 | +{ | |
| 221 | + int brps = get_num_brp_resources(); | |
| 222 | + if (core_has_mismatch_brps()) | |
| 223 | + brps -= get_num_reserved_brps(); | |
| 224 | + return brps; | |
| 225 | +} | |
| 226 | + | |
| 213 | 227 | /* |
| 214 | 228 | * In order to access the breakpoint/watchpoint control registers, |
| 215 | 229 | * we must be running in debug monitor mode. Unfortunately, we can |
| @@ -230,8 +244,12 @@ static int enable_monitor_mode(void) · 14 unmodified lines | ||
| 230 | 244 | goto out; |
| 231 | 245 | } |
| 232 | 246 | |
| 247 | + /* If monitor mode is already enabled, just return. */ | |
| 248 | + if (dscr & ARM_DSCR_MDBGEN) | |
| 249 | + goto out; | |
| 250 | + | |
| 233 | 251 | /* Write to the corresponding DSCR. */ |
| 234 | − switch (debug_arch) { | |
| 252 | + switch (get_debug_arch()) { | |
| 235 | 253 | case ARM_DEBUG_ARCH_V6: |
| 236 | 254 | case ARM_DEBUG_ARCH_V6_1: |
| 237 | 255 | ARM_DBG_WRITE(c1, 0, (dscr | ARM_DSCR_MDBGEN)); |
| @@ -246,15 +264,33 @@ static int enable_monitor_mode(void) · 8 unmodified lines | ||
| 246 | 264 | |
| 247 | 265 | /* Check that the write made it through. */ |
| 248 | 266 | ARM_DBG_READ(c1, 0, dscr); |
| 249 | − if (WARN_ONCE(!(dscr & ARM_DSCR_MDBGEN), | |
| 250 | − "failed to enable monitor mode.")) { | |
| 267 | + if (!(dscr & ARM_DSCR_MDBGEN)) | |
| 251 | 268 | ret = -EPERM; |
| 252 | − } | |
| 253 | 269 | |
| 254 | 270 | out: |
| 255 | 271 | return ret; |
| 256 | 272 | } |
| 257 | 273 | |
| 274 | +int hw_breakpoint_slots(int type) | |
| 275 | +{ | |
| 276 | + if (!debug_arch_supported()) | |
| 277 | + return 0; | |
| 278 | + | |
| 279 | + /* | |
| 280 | + * We can be called early, so don't rely on | |
| 281 | + * our static variables being initialised. | |
| 282 | + */ | |
| 283 | + switch (type) { | |
| 284 | + case TYPE_INST: | |
| 285 | + return get_num_brps(); | |
| 286 | + case TYPE_DATA: | |
| 287 | + return get_num_wrps(); | |
| 288 | + default: | |
| 289 | + pr_warning("unknown slot type: %d\n", type); | |
| 290 | + return 0; | |
| 291 | + } | |
| 292 | +} | |
| 293 | + | |
| 258 | 294 | /* |
| 259 | 295 | * Check if 8-bit byte-address select is available. |
| 260 | 296 | * This clobbers WRP 0. |
| @@ -268,9 +304,6 @@ static u8 get_max_wp_len(void) · 7 unmodified lines | ||
| 268 | 304 | if (debug_arch < ARM_DEBUG_ARCH_V7_ECP14) |
| 269 | 305 | goto out; |
| 270 | 306 | |
| 271 | − if (enable_monitor_mode()) | |
| 272 | − goto out; | |
| 273 | − | |
| 274 | 307 | memset(&ctrl, 0, sizeof(ctrl)); |
| 275 | 308 | ctrl.len = ARM_BREAKPOINT_LEN_8; |
| 276 | 309 | ctrl_reg = encode_ctrl_reg(ctrl); |
| @@ -289,23 +322,6 @@ u8 arch_get_max_wp_len(void) · 12 unmodified lines | ||
| 289 | 322 | return max_watchpoint_len; |
| 290 | 323 | } |
| 291 | 324 | |
| 292 | −/* | |
| 293 | − * Handler for reactivating a suspended watchpoint when the single | |
| 294 | − * step `mismatch' breakpoint is triggered. | |
| 295 | − */ | |
| 296 | −static void wp_single_step_handler(struct perf_event *bp, int unused, | |
| 297 | − struct perf_sample_data *data, | |
| 298 | − struct pt_regs *regs) | |
| 299 | −{ | |
| 300 | − perf_event_enable(counter_arch_bp(bp)->suspended_wp); | |
| 301 | − unregister_hw_breakpoint(bp); | |
| 302 | −} | |
| 303 | − | |
| 304 | −static int bp_is_single_step(struct perf_event *bp) | |
| 305 | −{ | |
| 306 | − return bp->overflow_handler == wp_single_step_handler; | |
| 307 | −} | |
| 308 | − | |
| 309 | 325 | /* |
| 310 | 326 | * Install a perf counter breakpoint. |
| 311 | 327 | */ |
| @@ -314,30 +330,41 @@ int arch_install_hw_breakpoint(struct perf_event *bp) · 2 unmodified lines | ||
| 314 | 330 | struct arch_hw_breakpoint *info = counter_arch_bp(bp); |
| 315 | 331 | struct perf_event **slot, **slots; |
| 316 | 332 | int i, max_slots, ctrl_base, val_base, ret = 0; |
| 333 | + u32 addr, ctrl; | |
| 317 | 334 | |
| 318 | 335 | /* Ensure that we are in monitor mode and halting mode is disabled. */ |
| 319 | 336 | ret = enable_monitor_mode(); |
| 320 | 337 | if (ret) |
| 321 | 338 | goto out; |
| 322 | 339 | |
| 340 | + addr = info->address; | |
| 341 | + ctrl = encode_ctrl_reg(info->ctrl) | 0x1; | |
| 342 | + | |
| 323 | 343 | if (info->ctrl.type == ARM_BREAKPOINT_EXECUTE) { |
| 324 | 344 | /* Breakpoint */ |
| 325 | 345 | ctrl_base = ARM_BASE_BCR; |
| 326 | 346 | val_base = ARM_BASE_BVR; |
| 327 | − slots = __get_cpu_var(bp_on_reg); | |
| 328 | − max_slots = core_num_brps - 1; | |
| 329 | − | |
| 330 | − if (bp_is_single_step(bp)) { | |
| 331 | − info->ctrl.mismatch = 1; | |
| 332 | − i = max_slots; | |
| 333 | − slots[i] = bp; | |
| 334 | − goto setup; | |
| 347 | + slots = (struct perf_event **)__get_cpu_var(bp_on_reg); | |
| 348 | + max_slots = core_num_brps; | |
| 349 | + if (info->step_ctrl.enabled) { | |
| 350 | + /* Override the breakpoint data with the step data. */ | |
| 351 | + addr = info->trigger & ~0x3; | |
| 352 | + ctrl = encode_ctrl_reg(info->step_ctrl); | |
| 335 | 353 | } |
| 336 | 354 | } else { |
| 337 | 355 | /* Watchpoint */ |
| 338 | − ctrl_base = ARM_BASE_WCR; | |
| 339 | − val_base = ARM_BASE_WVR; | |
| 340 | − slots = __get_cpu_var(wp_on_reg); | |
| 356 | + if (info->step_ctrl.enabled) { | |
| 357 | + /* Install into the reserved breakpoint region. */ | |
| 358 | + ctrl_base = ARM_BASE_BCR + core_num_brps; | |
| 359 | + val_base = ARM_BASE_BVR + core_num_brps; | |
| 360 | + /* Override the watchpoint data with the step data. */ | |
| 361 | + addr = info->trigger & ~0x3; | |
| 362 | + ctrl = encode_ctrl_reg(info->step_ctrl); | |
| 363 | + } else { | |
| 364 | + ctrl_base = ARM_BASE_WCR; | |
| 365 | + val_base = ARM_BASE_WVR; | |
| 366 | + } | |
| 367 | + slots = (struct perf_event **)__get_cpu_var(wp_on_reg); | |
| 341 | 368 | max_slots = core_num_wrps; |
| 342 | 369 | } |
| 343 | 370 | |
| @@ -355,12 +382,11 @@ int arch_install_hw_breakpoint(struct perf_event *bp) · 11 unmodified lines | ||
| 355 | 382 | goto out; |
| 356 | 383 | } |
| 357 | 384 | |
| 358 | −setup: | |
| 359 | 385 | /* Setup the address register. */ |
| 360 | − write_wb_reg(val_base + i, info->address); | |
| 386 | + write_wb_reg(val_base + i, addr); | |
| 361 | 387 | |
| 362 | 388 | /* Setup the control register. */ |
| 363 | − write_wb_reg(ctrl_base + i, encode_ctrl_reg(info->ctrl) | 0x1); | |
| 389 | + write_wb_reg(ctrl_base + i, ctrl); | |
| 364 | 390 | |
| 365 | 391 | out: |
| 366 | 392 | return ret; |
| @@ -375,18 +401,15 @@ void arch_uninstall_hw_breakpoint(struct perf_event *bp) · 8 unmodified lines | ||
| 375 | 401 | if (info->ctrl.type == ARM_BREAKPOINT_EXECUTE) { |
| 376 | 402 | /* Breakpoint */ |
| 377 | 403 | base = ARM_BASE_BCR; |
| 378 | − slots = __get_cpu_var(bp_on_reg); | |
| 379 | − max_slots = core_num_brps - 1; | |
| 380 | − | |
| 381 | − if (bp_is_single_step(bp)) { | |
| 382 | − i = max_slots; | |
| 383 | − slots[i] = NULL; | |
| 384 | − goto reset; | |
| 385 | − } | |
| 404 | + slots = (struct perf_event **)__get_cpu_var(bp_on_reg); | |
| 405 | + max_slots = core_num_brps; | |
| 386 | 406 | } else { |
| 387 | 407 | /* Watchpoint */ |
| 388 | − base = ARM_BASE_WCR; | |
| 389 | − slots = __get_cpu_var(wp_on_reg); | |
| 408 | + if (info->step_ctrl.enabled) | |
| 409 | + base = ARM_BASE_BCR + core_num_brps; | |
| 410 | + else | |
| 411 | + base = ARM_BASE_WCR; | |
| 412 | + slots = (struct perf_event **)__get_cpu_var(wp_on_reg); | |
| 390 | 413 | max_slots = core_num_wrps; |
| 391 | 414 | } |
| 392 | 415 | |
| @@ -403,7 +426,6 @@ void arch_uninstall_hw_breakpoint(struct perf_event *bp) · 10 unmodified lines | ||
| 403 | 426 | if (WARN_ONCE(i == max_slots, "Can't find any breakpoint slot")) |
| 404 | 427 | return; |
| 405 | 428 | |
| 406 | −reset: | |
| 407 | 429 | /* Reset the control register. */ |
| 408 | 430 | write_wb_reg(base + i, 0); |
| 409 | 431 | } |
| @@ -537,12 +559,23 @@ static int arch_build_bp_info(struct perf_event *bp) · 127 unmodified lines | ||
| 537 | 559 | return -EINVAL; |
| 538 | 560 | } |
| 539 | 561 | |
| 562 | + /* | |
| 563 | + * Breakpoints must be of length 2 (thumb) or 4 (ARM) bytes. | |
| 564 | + * Watchpoints can be of length 1, 2, 4 or 8 bytes if supported | |
| 565 | + * by the hardware and must be aligned to the appropriate number of | |
| 566 | + * bytes. | |
| 567 | + */ | |
| 568 | + if (info->ctrl.type == ARM_BREAKPOINT_EXECUTE && | |
| 569 | + info->ctrl.len != ARM_BREAKPOINT_LEN_2 && | |
| 570 | + info->ctrl.len != ARM_BREAKPOINT_LEN_4) | |
| 571 | + return -EINVAL; | |
| 572 | + | |
| 540 | 573 | /* Address */ |
| 541 | 574 | info->address = bp->attr.bp_addr; |
| 542 | 575 | |
| 543 | 576 | /* Privilege */ |
| 544 | 577 | info->ctrl.privilege = ARM_BREAKPOINT_USER; |
| 545 | − if (arch_check_bp_in_kernelspace(bp) && !bp_is_single_step(bp)) | |
| 578 | + if (arch_check_bp_in_kernelspace(bp)) | |
| 546 | 579 | info->ctrl.privilege |= ARM_BREAKPOINT_PRIV; |
| 547 | 580 | |
| 548 | 581 | /* Enabled? */ |
| @@ -561,7 +594,7 @@ int arch_validate_hwbkpt_settings(struct perf_event *bp) · 12 unmodified lines | ||
| 561 | 594 | { |
| 562 | 595 | struct arch_hw_breakpoint *info = counter_arch_bp(bp); |
| 563 | 596 | int ret = 0; |
| 564 | − u32 bytelen, max_len, offset, alignment_mask = 0x3; | |
| 597 | + u32 offset, alignment_mask = 0x3; | |
| 565 | 598 | |
| 566 | 599 | /* Build the arch_hw_breakpoint. */ |
| 567 | 600 | ret = arch_build_bp_info(bp); |
| @@ -571,84 +604,85 @@ int arch_validate_hwbkpt_settings(struct perf_event *bp) · 3 unmodified lines | ||
| 571 | 604 | /* Check address alignment. */ |
| 572 | 605 | if (info->ctrl.len == ARM_BREAKPOINT_LEN_8) |
| 573 | 606 | alignment_mask = 0x7; |
| 574 | − if (info->address & alignment_mask) { | |
| 575 | − /* | |
| 576 | − * Try to fix the alignment. This may result in a length | |
| 577 | − * that is too large, so we must check for that. | |
| 578 | − */ | |
| 579 | − bytelen = get_hbp_len(info->ctrl.len); | |
| 580 | − max_len = info->ctrl.type == ARM_BREAKPOINT_EXECUTE ? 4 : | |
| 581 | − max_watchpoint_len; | |
| 582 | − | |
| 583 | − if (max_len >= 8) | |
| 584 | − offset = info->address & 0x7; | |
| 585 | − else | |
| 586 | − offset = info->address & 0x3; | |
| 587 | − | |
| 588 | − if (bytelen > (1 << ((max_len - (offset + 1)) >> 1))) { | |
| 589 | − ret = -EFBIG; | |
| 590 | − goto out; | |
| 591 | − } | |
| 592 | − | |
| 593 | − info->ctrl.len <<= offset; | |
| 594 | − info->address &= ~offset; | |
| 595 | − | |
| 596 | − pr_debug("breakpoint alignment fixup: length = 0x%x, " | |
| 597 | − "address = 0x%x\n", info->ctrl.len, info->address); | |
| 607 | + offset = info->address & alignment_mask; | |
| 608 | + switch (offset) { | |
| 609 | + case 0: | |
| 610 | + /* Aligned */ | |
| 611 | + break; | |
| 612 | + case 1: | |
| 613 | + /* Allow single byte watchpoint. */ | |
| 614 | + if (info->ctrl.len == ARM_BREAKPOINT_LEN_1) | |
| 615 | + break; | |
| 616 | + case 2: | |
| 617 | + /* Allow halfword watchpoints and breakpoints. */ | |
| 618 | + if (info->ctrl.len == ARM_BREAKPOINT_LEN_2) | |
| 619 | + break; | |
| 620 | + default: | |
| 621 | + ret = -EINVAL; | |
| 622 | + goto out; | |
| 598 | 623 | } |
| 599 | 624 | |
| 625 | + info->address &= ~alignment_mask; | |
| 626 | + info->ctrl.len <<= offset; | |
| 627 | + | |
| 600 | 628 | /* |
| 601 | 629 | * Currently we rely on an overflow handler to take |
| 602 | 630 | * care of single-stepping the breakpoint when it fires. |
| 603 | 631 | * In the case of userspace breakpoints on a core with V7 debug, |
| 604 | − * we can use the mismatch feature as a poor-man's hardware single-step. | |
| 632 | + * we can use the mismatch feature as a poor-man's hardware | |
| 633 | + * single-step, but this only works for per-task breakpoints. | |
| 605 | 634 | */ |
| 606 | 635 | if (WARN_ONCE(!bp->overflow_handler && |
| 607 | − (arch_check_bp_in_kernelspace(bp) || !core_has_mismatch_bps()), | |
| 636 | + (arch_check_bp_in_kernelspace(bp) || !core_has_mismatch_brps() | |
| 637 | + || !bp->hw.bp_target), | |
| 608 | 638 | "overflow handler required but none found")) { |
| 609 | 639 | ret = -EINVAL; |
| 610 | − goto out; | |
| 611 | 640 | } |
| 612 | 641 | out: |
| 613 | 642 | return ret; |
| 614 | 643 | } |
| 615 | 644 | |
| 616 | −static void update_mismatch_flag(int idx, int flag) | |
| 645 | +/* | |
| 646 | + * Enable/disable single-stepping over the breakpoint bp at address addr. | |
| 647 | + */ | |
| 648 | +static void enable_single_step(struct perf_event *bp, u32 addr) | |
| 617 | 649 | { |
| 618 | − struct perf_event *bp = __get_cpu_var(bp_on_reg[idx]); | |
| 619 | − struct arch_hw_breakpoint *info; | |
| 620 | − | |
| 621 | − if (bp == NULL) | |
| 622 | − return; | |
| 650 | + struct arch_hw_breakpoint *info = counter_arch_bp(bp); | |
| 623 | 651 | |
| 624 | − info = counter_arch_bp(bp); | |
| 652 | + arch_uninstall_hw_breakpoint(bp); | |
| 653 | + info->step_ctrl.mismatch = 1; | |
| 654 | + info->step_ctrl.len = ARM_BREAKPOINT_LEN_4; | |
| 655 | + info->step_ctrl.type = ARM_BREAKPOINT_EXECUTE; | |
| 656 | + info->step_ctrl.privilege = info->ctrl.privilege; | |
| 657 | + info->step_ctrl.enabled = 1; | |
| 658 | + info->trigger = addr; | |
| 659 | + arch_install_hw_breakpoint(bp); | |
| 660 | +} | |
| 625 | 661 | |
| 626 | − /* Update the mismatch field to enter/exit `single-step' mode */ | |
| 627 | − if (!bp->overflow_handler && info->ctrl.mismatch != flag) { | |
| 628 | − info->ctrl.mismatch = flag; | |
| 629 | − write_wb_reg(ARM_BASE_BCR + idx, encode_ctrl_reg(info->ctrl) | 0x1); | |
| 630 | − } | |
| 662 | +static void disable_single_step(struct perf_event *bp) | |
| 663 | +{ | |
| 664 | + arch_uninstall_hw_breakpoint(bp); | |
| 665 | + counter_arch_bp(bp)->step_ctrl.enabled = 0; | |
| 666 | + arch_install_hw_breakpoint(bp); | |
| 631 | 667 | } |
| 632 | 668 | |
| 633 | 669 | static void watchpoint_handler(unsigned long unknown, struct pt_regs *regs) |
| 634 | 670 | { |
| 635 | 671 | int i; |
| 636 | − struct perf_event *bp, **slots = __get_cpu_var(wp_on_reg); | |
| 672 | + struct perf_event *wp, **slots; | |
| 637 | 673 | struct arch_hw_breakpoint *info; |
| 638 | − struct perf_event_attr attr; | |
| 674 | + | |
| 675 | + slots = (struct perf_event **)__get_cpu_var(wp_on_reg); | |
| 639 | 676 | |
| 640 | 677 | /* Without a disassembler, we can only handle 1 watchpoint. */ |
| 641 | 678 | BUG_ON(core_num_wrps > 1); |
| 642 | 679 | |
| 643 | − hw_breakpoint_init(&attr); | |
| 644 | − attr.bp_addr = regs->ARM_pc & ~0x3; | |
| 645 | − attr.bp_len = HW_BREAKPOINT_LEN_4; | |
| 646 | − attr.bp_type = HW_BREAKPOINT_X; | |
| 647 | − | |
| 648 | 680 | for (i = 0; i < core_num_wrps; ++i) { |
| 649 | 681 | rcu_read_lock(); |
| 650 | 682 | |
| 651 | − if (slots[i] == NULL) { | |
| 683 | + wp = slots[i]; | |
| 684 | + | |
| 685 | + if (wp == NULL) { | |
| 652 | 686 | rcu_read_unlock(); |
| 653 | 687 | continue; |
| 654 | 688 | } |
| @@ -658,24 +692,51 @@ static void watchpoint_handler(unsigned long unknown, struct pt_regs *regs) · 3 unmodified lines | ||
| 658 | 692 | * single watchpoint, we can set the trigger to the lowest |
| 659 | 693 | * possible faulting address. |
| 660 | 694 | */ |
| 661 | − info = counter_arch_bp(slots[i]); | |
| 662 | − info->trigger = slots[i]->attr.bp_addr; | |
| 695 | + info = counter_arch_bp(wp); | |
| 696 | + info->trigger = wp->attr.bp_addr; | |
| 663 | 697 | pr_debug("watchpoint fired: address = 0x%x\n", info->trigger); |
| 664 | − perf_bp_event(slots[i], regs); | |
| 698 | + perf_bp_event(wp, regs); | |
| 665 | 699 | |
| 666 | 700 | /* |
| 667 | 701 | * If no overflow handler is present, insert a temporary |
| 668 | 702 | * mismatch breakpoint so we can single-step over the |
| 669 | 703 | * watchpoint trigger. |
| 670 | 704 | */ |
| 671 | − if (!slots[i]->overflow_handler) { | |
| 672 | − bp = register_user_hw_breakpoint(&attr, | |
| 673 | − wp_single_step_handler, | |
| 674 | − current); | |
| 675 | − counter_arch_bp(bp)->suspended_wp = slots[i]; | |
| 676 | − perf_event_disable(slots[i]); | |
| 677 | − } | |
| 705 | + if (!wp->overflow_handler) | |
| 706 | + enable_single_step(wp, instruction_pointer(regs)); | |
| 707 | + | |
| 708 | + rcu_read_unlock(); | |
| 709 | + } | |
| 710 | +} | |
| 711 | + | |
| 712 | +static void watchpoint_single_step_handler(unsigned long pc) | |
| 713 | +{ | |
| 714 | + int i; | |
| 715 | + struct perf_event *wp, **slots; | |
| 716 | + struct arch_hw_breakpoint *info; | |
| 717 | + | |
| 718 | + slots = (struct perf_event **)__get_cpu_var(wp_on_reg); | |
| 719 | + | |
| 720 | + for (i = 0; i < core_num_reserved_brps; ++i) { | |
| 721 | + rcu_read_lock(); | |
| 722 | + | |
| 723 | + wp = slots[i]; | |
| 724 | + | |
| 725 | + if (wp == NULL) | |
| 726 | + goto unlock; | |
| 727 | + | |
| 728 | + info = counter_arch_bp(wp); | |
| 729 | + if (!info->step_ctrl.enabled) | |
| 730 | + goto unlock; | |
| 731 | + | |
| 732 | + /* | |
| 733 | + * Restore the original watchpoint if we've completed the | |
| 734 | + * single-step. | |
| 735 | + */ | |
| 736 | + if (info->trigger != pc) | |
| 737 | + disable_single_step(wp); | |
| 678 | 738 | |
| 739 | +unlock: | |
| 679 | 740 | rcu_read_unlock(); |
| 680 | 741 | } |
| 681 | 742 | } |
| @@ -683,62 +744,69 @@ static void watchpoint_handler(unsigned long unknown, struct pt_regs *regs) · 1 unmodified line | ||
| 683 | 744 | static void breakpoint_handler(unsigned long unknown, struct pt_regs *regs) |
| 684 | 745 | { |
| 685 | 746 | int i; |
| 686 | − int mismatch; | |
| 687 | 747 | u32 ctrl_reg, val, addr; |
| 688 | − struct perf_event *bp, **slots = __get_cpu_var(bp_on_reg); | |
| 748 | + struct perf_event *bp, **slots; | |
| 689 | 749 | struct arch_hw_breakpoint *info; |
| 690 | 750 | struct arch_hw_breakpoint_ctrl ctrl; |
| 691 | 751 | |
| 752 | + slots = (struct perf_event **)__get_cpu_var(bp_on_reg); | |
| 753 | + | |
| 692 | 754 | /* The exception entry code places the amended lr in the PC. */ |
| 693 | 755 | addr = regs->ARM_pc; |
| 694 | 756 | |
| 757 | + /* Check the currently installed breakpoints first. */ | |
| 695 | 758 | for (i = 0; i < core_num_brps; ++i) { |
| 696 | 759 | rcu_read_lock(); |
| 697 | 760 | |
| 698 | 761 | bp = slots[i]; |
| 699 | 762 | |
| 700 | − if (bp == NULL) { | |
| 701 | − rcu_read_unlock(); | |
| 702 | − continue; | |
| 703 | − } | |
| 763 | + if (bp == NULL) | |
| 764 | + goto unlock; | |
| 704 | 765 | |
| 705 | − mismatch = 0; | |
| 766 | + info = counter_arch_bp(bp); | |
| 706 | 767 | |
| 707 | 768 | /* Check if the breakpoint value matches. */ |
| 708 | 769 | val = read_wb_reg(ARM_BASE_BVR + i); |
| 709 | 770 | if (val != (addr & ~0x3)) |
| 710 | − goto unlock; | |
| 771 | + goto mismatch; | |
| 711 | 772 | |
| 712 | 773 | /* Possible match, check the byte address select to confirm. */ |
| 713 | 774 | ctrl_reg = read_wb_reg(ARM_BASE_BCR + i); |
| 714 | 775 | decode_ctrl_reg(ctrl_reg, &ctrl); |
| 715 | 776 | if ((1 << (addr & 0x3)) & ctrl.len) { |
| 716 | − mismatch = 1; | |
| 717 | − info = counter_arch_bp(bp); | |
| 718 | 777 | info->trigger = addr; |
| 719 | − } | |
| 720 | − | |
| 721 | −unlock: | |
| 722 | − if ((mismatch && !info->ctrl.mismatch) || bp_is_single_step(bp)) { | |
| 723 | 778 | pr_debug("breakpoint fired: address = 0x%x\n", addr); |
| 724 | 779 | perf_bp_event(bp, regs); |
| 780 | + if (!bp->overflow_handler) | |
| 781 | + enable_single_step(bp, addr); | |
| 782 | + goto unlock; | |
| 725 | 783 | } |
| 726 | 784 | |
| 727 | − update_mismatch_flag(i, mismatch); | |
| 785 | +mismatch: | |
| 786 | + /* If we're stepping a breakpoint, it can now be restored. */ | |
| 787 | + if (info->step_ctrl.enabled) | |
| 788 | + disable_single_step(bp); | |
| 789 | +unlock: | |
| 728 | 790 | rcu_read_unlock(); |
| 729 | 791 | } |
| 792 | + | |
| 793 | + /* Handle any pending watchpoint single-step breakpoints. */ | |
| 794 | + watchpoint_single_step_handler(addr); | |
| 730 | 795 | } |
| 731 | 796 | |
| 732 | 797 | /* |
| 733 | 798 | * Called from either the Data Abort Handler [watchpoint] or the |
| 734 | − * Prefetch Abort Handler [breakpoint]. | |
| 799 | + * Prefetch Abort Handler [breakpoint] with preemption disabled. | |
| 735 | 800 | */ |
| 736 | 801 | static int hw_breakpoint_pending(unsigned long addr, unsigned int fsr, |
| 737 | 802 | struct pt_regs *regs) |
| 738 | 803 | { |
| 739 | − int ret = 1; /* Unhandled fault. */ | |
| 804 | + int ret = 0; | |
| 740 | 805 | u32 dscr; |
| 741 | 806 | |
| 807 | + /* We must be called with preemption disabled. */ | |
| 808 | + WARN_ON(preemptible()); | |
| 809 | + | |
| 742 | 810 | /* We only handle watchpoints and hardware breakpoints. */ |
| 743 | 811 | ARM_DBG_READ(c1, 0, dscr); |
| 744 | 812 | |
| @@ -753,25 +821,47 @@ static int hw_breakpoint_pending(unsigned long addr, unsigned int fsr, · 8 unmodified lines | ||
| 753 | 821 | watchpoint_handler(addr, regs); |
| 754 | 822 | break; |
| 755 | 823 | default: |
| 756 | − goto out; | |
| 824 | + ret = 1; /* Unhandled fault. */ | |
| 757 | 825 | } |
| 758 | 826 | |
| 759 | − ret = 0; | |
| 760 | −out: | |
| 827 | + /* | |
| 828 | + * Re-enable preemption after it was disabled in the | |
| 829 | + * low-level exception handling code. | |
| 830 | + */ | |
| 831 | + preempt_enable(); | |
| 832 | + | |
| 761 | 833 | return ret; |
| 762 | 834 | } |
| 763 | 835 | |
| 764 | 836 | /* |
| 765 | 837 | * One-time initialisation. |
| 766 | 838 | */ |
| 767 | −static void __init reset_ctrl_regs(void *unused) | |
| 839 | +static void reset_ctrl_regs(void *unused) | |
| 768 | 840 | { |
| 769 | 841 | int i; |
| 770 | 842 | |
| 843 | + /* | |
| 844 | + * v7 debug contains save and restore registers so that debug state | |
| 845 | + * can be maintained across low-power modes without leaving the debug | |
| 846 | + * logic powered up. It is IMPLEMENTATION DEFINED whether we can access | |
| 847 | + * the debug registers out of reset, so we must unlock the OS Lock | |
| 848 | + * Access Register to avoid taking undefined instruction exceptions | |
| 849 | + * later on. | |
| 850 | + */ | |
| 851 | + if (debug_arch >= ARM_DEBUG_ARCH_V7_ECP14) { | |
| 852 | + /* | |
| 853 | + * Unconditionally clear the lock by writing a value | |
| 854 | + * other than 0xC5ACCE55 to the access register. | |
| 855 | + */ | |
| 856 | + asm volatile("mcr p14, 0, %0, c1, c0, 4" : : "r" (0)); | |
| 857 | + isb(); | |
| 858 | + } | |
| 859 | + | |
| 771 | 860 | if (enable_monitor_mode()) |
| 772 | 861 | return; |
| 773 | 862 | |
| 774 | − for (i = 0; i < core_num_brps; ++i) { | |
| 863 | + /* We must also reset any reserved registers. */ | |
| 864 | + for (i = 0; i < core_num_brps + core_num_reserved_brps; ++i) { | |
| 775 | 865 | write_wb_reg(ARM_BASE_BCR + i, 0UL); |
| 776 | 866 | write_wb_reg(ARM_BASE_BVR + i, 0UL); |
| 777 | 867 | } |
| @@ -782,45 +872,57 @@ static void __init reset_ctrl_regs(void *unused) · 4 unmodified lines | ||
| 782 | 872 | } |
| 783 | 873 | } |
| 784 | 874 | |
| 875 | +static int __cpuinit dbg_reset_notify(struct notifier_block *self, | |
| 876 | + unsigned long action, void *cpu) | |
| 877 | +{ | |
| 878 | + if (action == CPU_ONLINE) | |
| 879 | + smp_call_function_single((int)cpu, reset_ctrl_regs, NULL, 1); | |
| 880 | + return NOTIFY_OK; | |
| 881 | +} | |
| 882 | + | |
| 883 | +static struct notifier_block __cpuinitdata dbg_reset_nb = { | |
| 884 | + .notifier_call = dbg_reset_notify, | |
| 885 | +}; | |
| 886 | + | |
| 785 | 887 | static int __init arch_hw_breakpoint_init(void) |
| 786 | 888 | { |
| 787 | − int ret = 0; | |
| 788 | 889 | u32 dscr; |
| 789 | 890 | |
| 790 | 891 | debug_arch = get_debug_arch(); |
| 791 | 892 | |
| 792 | − if (debug_arch > ARM_DEBUG_ARCH_V7_ECP14) { | |
| 893 | + if (!debug_arch_supported()) { | |
| 793 | 894 | pr_info("debug architecture 0x%x unsupported.\n", debug_arch); |
| 794 | − ret = -ENODEV; | |
| 795 | − goto out; | |
| 895 | + return 0; | |
| 796 | 896 | } |
| 797 | 897 | |
| 798 | 898 | /* Determine how many BRPs/WRPs are available. */ |
| 799 | 899 | core_num_brps = get_num_brps(); |
| 900 | + core_num_reserved_brps = get_num_reserved_brps(); | |
| 800 | 901 | core_num_wrps = get_num_wrps(); |
| 801 | 902 | |
| 802 | 903 | pr_info("found %d breakpoint and %d watchpoint registers.\n", |
| 803 | − core_num_brps, core_num_wrps); | |
| 904 | + core_num_brps + core_num_reserved_brps, core_num_wrps); | |
| 905 | + | |
| 906 | + if (core_num_reserved_brps) | |
| 907 | + pr_info("%d breakpoint(s) reserved for watchpoint " | |
| 908 | + "single-step.\n", core_num_reserved_brps); | |
| 804 | 909 | |
| 805 | − if (core_has_mismatch_bps()) | |
| 806 | − pr_info("1 breakpoint reserved for watchpoint single-step.\n"); | |
| 910 | + /* | |
| 911 | + * Reset the breakpoint resources. We assume that a halting | |
| 912 | + * debugger will leave the world in a nice state for us. | |
| 913 | + */ | |
| 914 | + on_each_cpu(reset_ctrl_regs, NULL, 1); | |
| 807 | 915 | |
| 808 | 916 | ARM_DBG_READ(c1, 0, dscr); |
| 809 | 917 | if (dscr & ARM_DSCR_HDBGEN) { |
| 918 | + max_watchpoint_len = 4; | |
| 810 | 919 | pr_warning("halting debug mode enabled. Assuming maximum " |
| 811 | − "watchpoint size of 4 bytes."); | |
| 920 | + "watchpoint size of %u bytes.", max_watchpoint_len); | |
| 812 | 921 | } else { |
| 813 | 922 | /* Work out the maximum supported watchpoint length. */ |
| 814 | 923 | max_watchpoint_len = get_max_wp_len(); |
| 815 | 924 | pr_info("maximum watchpoint size is %u bytes.\n", |
| 816 | 925 | max_watchpoint_len); |
| 817 | − | |
| 818 | − /* | |
| 819 | − * Reset the breakpoint resources. We assume that a halting | |
| 820 | − * debugger will leave the world in a nice state for us. | |
| 821 | − */ | |
| 822 | − smp_call_function(reset_ctrl_regs, NULL, 1); | |
| 823 | − reset_ctrl_regs(NULL); | |
| 824 | 926 | } |
| 825 | 927 | |
| 826 | 928 | /* Register debug fault handler. */ |
| @@ -829,8 +931,9 @@ static int __init arch_hw_breakpoint_init(void) · 2 unmodified lines | ||
| 829 | 931 | hook_ifault_code(2, hw_breakpoint_pending, SIGTRAP, TRAP_HWBKPT, |
| 830 | 932 | "breakpoint debug exception"); |
| 831 | 933 | |
| 832 | −out: | |
| 833 | − return ret; | |
| 934 | + /* Register hotplug notifier. */ | |
| 935 | + register_cpu_notifier(&dbg_reset_nb); | |
| 936 | + return 0; | |
| 834 | 937 | } |
| 835 | 938 | arch_initcall(arch_hw_breakpoint_init); |
| 836 | 939 | |
| @@ -35,8 +35,10 @@ · 34 unmodified lines | ||
| 35 | 35 | #include <linux/list.h> |
| 36 | 36 | #include <linux/kallsyms.h> |
| 37 | 37 | #include <linux/proc_fs.h> |
| 38 | +#include <linux/ftrace.h> | |
| 38 | 39 | |
| 39 | 40 | #include <asm/system.h> |
| 41 | +#include <asm/mach/arch.h> | |
| 40 | 42 | #include <asm/mach/irq.h> |
| 41 | 43 | #include <asm/mach/time.h> |
| 42 | 44 | |
| @@ -47,8 +49,6 @@ · 4 unmodified lines | ||
| 47 | 49 | #define irq_finish(irq) do { } while (0) |
| 48 | 50 | #endif |
| 49 | 51 | |
| 50 | −unsigned int arch_nr_irqs; | |
| 51 | −void (*init_arch_irq)(void) __initdata = NULL; | |
| 52 | 52 | unsigned long irq_err_count; |
| 53 | 53 | |
| 54 | 54 | int show_interrupts(struct seq_file *p, void *v) |
| @@ -57,11 +57,20 @@ int show_interrupts(struct seq_file *p, void *v) · 2 unmodified lines | ||
| 57 | 57 | struct irq_desc *desc; |
| 58 | 58 | struct irqaction * action; |
| 59 | 59 | unsigned long flags; |
| 60 | + int prec, n; | |
| 61 | + | |
| 62 | + for (prec = 3, n = 1000; prec < 10 && n <= nr_irqs; prec++) | |
| 63 | + n *= 10; | |
| 64 | + | |
| 65 | +#ifdef CONFIG_SMP | |
| 66 | + if (prec < 4) | |
| 67 | + prec = 4; | |
| 68 | +#endif | |
| 60 | 69 | |
| 61 | 70 | if (i == 0) { |
| 62 | 71 | char cpuname[12]; |
| 63 | 72 | |
| 64 | − seq_printf(p, " "); | |
| 73 | + seq_printf(p, "%*s ", prec, ""); | |
| 65 | 74 | for_each_present_cpu(cpu) { |
| 66 | 75 | sprintf(cpuname, "CPU%d", cpu); |
| 67 | 76 | seq_printf(p, " %10s", cpuname); |
| @@ -76,10 +85,10 @@ int show_interrupts(struct seq_file *p, void *v) · 8 unmodified lines | ||
| 76 | 85 | if (!action) |
| 77 | 86 | goto unlock; |
| 78 | 87 | |
| 79 | − seq_printf(p, "%3d: ", i); | |
| 88 | + seq_printf(p, "%*d: ", prec, i); | |
| 80 | 89 | for_each_present_cpu(cpu) |
| 81 | 90 | seq_printf(p, "%10u ", kstat_irqs_cpu(i, cpu)); |
| 82 | − seq_printf(p, " %10s", desc->chip->name ? : "-"); | |
| 91 | + seq_printf(p, " %10s", desc->irq_data.chip->name ? : "-"); | |
| 83 | 92 | seq_printf(p, " %s", action->name); |
| 84 | 93 | for (action = action->next; action; action = action->next) |
| 85 | 94 | seq_printf(p, ", %s", action->name); |
| @@ -89,13 +98,15 @@ unlock: · 3 unmodified lines | ||
| 89 | 98 | raw_spin_unlock_irqrestore(&desc->lock, flags); |
| 90 | 99 | } else if (i == nr_irqs) { |
| 91 | 100 | #ifdef CONFIG_FIQ |
| 92 | − show_fiq_list(p, v); | |
| 101 | + show_fiq_list(p, prec); | |
| 93 | 102 | #endif |
| 94 | 103 | #ifdef CONFIG_SMP |
| 95 | − show_ipi_list(p); | |
| 96 | − show_local_irqs(p); | |
| 104 | + show_ipi_list(p, prec); | |
| 105 | +#endif | |
| 106 | +#ifdef CONFIG_LOCAL_TIMERS | |
| 107 | + show_local_irqs(p, prec); | |
| 97 | 108 | #endif |
| 98 | − seq_printf(p, "Err: %10lu\n", irq_err_count); | |
| 109 | + seq_printf(p, "%*s: %10lu\n", prec, "Err", irq_err_count); | |
| 99 | 110 | } |
| 100 | 111 | return 0; |
| 101 | 112 | } |
| @@ -105,7 +116,8 @@ unlock: · 3 unmodified lines | ||
| 105 | 116 | * come via this function. Instead, they should provide their |
| 106 | 117 | * own 'handler' |
| 107 | 118 | */ |
| 108 | −asmlinkage void __exception asm_do_IRQ(unsigned int irq, struct pt_regs *regs) | |
| 119 | +asmlinkage void __exception_irq_entry | |
| 120 | +asm_do_IRQ(unsigned int irq, struct pt_regs *regs) | |
| 109 | 121 | { |
| 110 | 122 | struct pt_regs *old_regs = set_irq_regs(regs); |
| 111 | 123 | |
| @@ -154,13 +166,13 @@ void set_irq_flags(unsigned int irq, unsigned int iflags) · 42 unmodified lines | ||
| 154 | 166 | |
| 155 | 167 | void __init init_IRQ(void) |
| 156 | 168 | { |
| 157 | − init_arch_irq(); | |
| 169 | + machine_desc->init_irq(); | |
| 158 | 170 | } |
| 159 | 171 | |
| 160 | 172 | #ifdef CONFIG_SPARSE_IRQ |
| 161 | 173 | int __init arch_probe_nr_irqs(void) |
| 162 | 174 | { |
| 163 | − nr_irqs = arch_nr_irqs ? arch_nr_irqs : NR_IRQS; | |
| 175 | + nr_irqs = machine_desc->nr_irqs ? machine_desc->nr_irqs : NR_IRQS; | |
| 164 | 176 | return nr_irqs; |
| 165 | 177 | } |
| 166 | 178 | #endif |
| @@ -169,10 +181,11 @@ int __init arch_probe_nr_irqs(void) · 2 unmodified lines | ||
| 169 | 181 | |
| 170 | 182 | static void route_irq(struct irq_desc *desc, unsigned int irq, unsigned int cpu) |
| 171 | 183 | { |
| 172 | − pr_debug("IRQ%u: moving from cpu%u to cpu%u\n", irq, desc->node, cpu); | |
| 184 | + pr_debug("IRQ%u: moving from cpu%u to cpu%u\n", irq, desc->irq_data.node, cpu); | |
| 173 | 185 | |
| 174 | 186 | raw_spin_lock_irq(&desc->lock); |
| 175 | − desc->chip->set_affinity(irq, cpumask_of(cpu)); | |
| 187 | + desc->irq_data.chip->irq_set_affinity(&desc->irq_data, | |
| 188 | + cpumask_of(cpu), false); | |
| 176 | 189 | raw_spin_unlock_irq(&desc->lock); |
| 177 | 190 | } |
| 178 | 191 | |
| @@ -187,16 +200,18 @@ void migrate_irqs(void) · 8 unmodified lines | ||
| 187 | 200 | struct irq_desc *desc; |
| 188 | 201 | |
| 189 | 202 | for_each_irq_desc(i, desc) { |
| 190 | − if (desc->node == cpu) { | |
| 191 | − unsigned int newcpu = cpumask_any_and(desc->affinity, | |
| 203 | + struct irq_data *d = &desc->irq_data; | |
| 204 | + | |
| 205 | + if (d->node == cpu) { | |
| 206 | + unsigned int newcpu = cpumask_any_and(d->affinity, | |
| 192 | 207 | cpu_online_mask); |
| 193 | 208 | if (newcpu >= nr_cpu_ids) { |
| 194 | 209 | if (printk_ratelimit()) |
| 195 | 210 | printk(KERN_INFO "IRQ%u no longer affine to CPU%u\n", |
| 196 | 211 | i, cpu); |
| 197 | 212 | |
| 198 | − cpumask_setall(desc->affinity); | |
| 199 | − newcpu = cpumask_any_and(desc->affinity, | |
| 213 | + cpumask_setall(d->affinity); | |
| 214 | + newcpu = cpumask_any_and(d->affinity, | |
| 200 | 215 | cpu_online_mask); |
| 201 | 216 | } |
| 202 | 217 | |
| @@ -19,6 +19,14 @@ · 18 unmodified lines | ||
| 19 | 19 | #include <asm/thread_info.h> |
| 20 | 20 | #include <asm/asm-offsets.h> |
| 21 | 21 | |
| 22 | +#if defined(CONFIG_CPU_PJ4) | |
| 23 | +#define PJ4(code...) code | |
| 24 | +#define XSC(code...) | |
| 25 | +#else | |
| 26 | +#define PJ4(code...) | |
| 27 | +#define XSC(code...) code | |
| 28 | +#endif | |
| 29 | + | |
| 22 | 30 | #define MMX_WR0 (0x00) |
| 23 | 31 | #define MMX_WR1 (0x08) |
| 24 | 32 | #define MMX_WR2 (0x10) |
| @@ -58,11 +66,17 @@ · 33 unmodified lines | ||
| 58 | 66 | |
| 59 | 67 | ENTRY(iwmmxt_task_enable) |
| 60 | 68 | |
| 61 | − mrc p15, 0, r2, c15, c1, 0 | |
| 62 | − tst r2, #0x3 @ CP0 and CP1 accessible? | |
| 69 | + XSC(mrc p15, 0, r2, c15, c1, 0) | |
| 70 | + PJ4(mrc p15, 0, r2, c1, c0, 2) | |
| 71 | + @ CP0 and CP1 accessible? | |
| 72 | + XSC(tst r2, #0x3) | |
| 73 | + PJ4(tst r2, #0xf) | |
| 63 | 74 | movne pc, lr @ if so no business here |
| 64 | − orr r2, r2, #0x3 @ enable access to CP0 and CP1 | |
| 65 | − mcr p15, 0, r2, c15, c1, 0 | |
| 75 | + @ enable access to CP0 and CP1 | |
| 76 | + XSC(orr r2, r2, #0x3) | |
| 77 | + XSC(mcr p15, 0, r2, c15, c1, 0) | |
| 78 | + PJ4(orr r2, r2, #0xf) | |
| 79 | + PJ4(mcr p15, 0, r2, c1, c0, 2) | |
| 66 | 80 | |
| 67 | 81 | ldr r3, =concan_owner |
| 68 | 82 | add r0, r10, #TI_IWMMXT_STATE @ get task Concan save area |
| @@ -179,17 +193,26 @@ ENTRY(iwmmxt_task_disable) · 110 unmodified lines | ||
| 179 | 193 | teqne r1, r2 @ or specified one? |
| 180 | 194 | bne 1f @ no: quit |
| 181 | 195 | |
| 182 | − mrc p15, 0, r4, c15, c1, 0 | |
| 183 | − orr r4, r4, #0x3 @ enable access to CP0 and CP1 | |
| 184 | − mcr p15, 0, r4, c15, c1, 0 | |
| 196 | + @ enable access to CP0 and CP1 | |
| 197 | + XSC(mrc p15, 0, r4, c15, c1, 0) | |
| 198 | + XSC(orr r4, r4, #0xf) | |
| 199 | + XSC(mcr p15, 0, r4, c15, c1, 0) | |
| 200 | + PJ4(mrc p15, 0, r4, c1, c0, 2) | |
| 201 | + PJ4(orr r4, r4, #0x3) | |
| 202 | + PJ4(mcr p15, 0, r4, c1, c0, 2) | |
| 203 | + | |
| 185 | 204 | mov r0, #0 @ nothing to load |
| 186 | 205 | str r0, [r3] @ no more current owner |
| 187 | 206 | mrc p15, 0, r2, c2, c0, 0 |
| 188 | 207 | mov r2, r2 @ cpwait |
| 189 | 208 | bl concan_save |
| 190 | 209 | |
| 191 | − bic r4, r4, #0x3 @ disable access to CP0 and CP1 | |
| 192 | − mcr p15, 0, r4, c15, c1, 0 | |
| 210 | + @ disable access to CP0 and CP1 | |
| 211 | + XSC(bic r4, r4, #0x3) | |
| 212 | + XSC(mcr p15, 0, r4, c15, c1, 0) | |
| 213 | + PJ4(bic r4, r4, #0xf) | |
| 214 | + PJ4(mcr p15, 0, r4, c1, c0, 2) | |
| 215 | + | |
| 193 | 216 | mrc p15, 0, r2, c2, c0, 0 |
| 194 | 217 | mov r2, r2 @ cpwait |
| 195 | 218 | |
| @@ -277,8 +300,11 @@ ENTRY(iwmmxt_task_restore) · 81 unmodified lines | ||
| 277 | 300 | */ |
| 278 | 301 | ENTRY(iwmmxt_task_switch) |
| 279 | 302 | |
| 280 | − mrc p15, 0, r1, c15, c1, 0 | |
| 281 | − tst r1, #0x3 @ CP0 and CP1 accessible? | |
| 303 | + XSC(mrc p15, 0, r1, c15, c1, 0) | |
| 304 | + PJ4(mrc p15, 0, r1, c1, c0, 2) | |
| 305 | + @ CP0 and CP1 accessible? | |
| 306 | + XSC(tst r1, #0x3) | |
| 307 | + PJ4(tst r1, #0xf) | |
| 282 | 308 | bne 1f @ yes: block them for next task |
| 283 | 309 | |
| 284 | 310 | ldr r2, =concan_owner |
| @@ -287,8 +313,11 @@ ENTRY(iwmmxt_task_switch) · 2 unmodified lines | ||
| 287 | 313 | teq r2, r3 @ next task owns it? |
| 288 | 314 | movne pc, lr @ no: leave Concan disabled |
| 289 | 315 | |
| 290 | −1: eor r1, r1, #3 @ flip Concan access | |
| 291 | − mcr p15, 0, r1, c15, c1, 0 | |
| 316 | +1: @ flip Conan access | |
| 317 | + XSC(eor r1, r1, #0x3) | |
| 318 | + XSC(mcr p15, 0, r1, c15, c1, 0) | |
| 319 | + PJ4(eor r1, r1, #0xf) | |
| 320 | + PJ4(mcr p15, 0, r1, c1, c0, 2) | |
| 292 | 321 | |
| 293 | 322 | mrc p15, 0, r1, c2, c0, 0 |
| 294 | 323 | sub pc, lr, r1, lsr #32 @ cpwait and return |
| @@ -1437,7 +1437,7 @@ arm_kprobe_decode_insn(kprobe_opcode_t insn, struct arch_specific_insn *asi) · 1436 unmodified lines | ||
| 1437 | 1437 | |
| 1438 | 1438 | return space_cccc_1100_010x(insn, asi); |
| 1439 | 1439 | |
| 1440 | − } else if ((insn & 0x0e000000) == 0x0c400000) { | |
| 1440 | + } else if ((insn & 0x0e000000) == 0x0c000000) { | |
| 1441 | 1441 | |
| 1442 | 1442 | return space_cccc_110x(insn, asi); |
| 1443 | 1443 | |
| @@ -23,6 +23,8 @@ extern unsigned long kexec_indirection_page; · 22 unmodified lines | ||
| 23 | 23 | extern unsigned long kexec_mach_type; |
| 24 | 24 | extern unsigned long kexec_boot_atags; |
| 25 | 25 | |
| 26 | +static atomic_t waiting_for_crash_ipi; | |
| 27 | + | |
| 26 | 28 | /* |
| 27 | 29 | * Provide a dummy crash_notes definition while crash dump arrives to arm. |
| 28 | 30 | * This prevents breakage of crash_notes attribute in kernel/ksysfs.c. |
| @@ -37,9 +39,37 @@ void machine_kexec_cleanup(struct kimage *image) · 8 unmodified lines | ||
| 37 | 39 | { |
| 38 | 40 | } |
| 39 | 41 | |
| 42 | +void machine_crash_nonpanic_core(void *unused) | |
| 43 | +{ | |
| 44 | + struct pt_regs regs; | |
| 45 | + | |
| 46 | + crash_setup_regs(®s, NULL); | |
| 47 | + printk(KERN_DEBUG "CPU %u will stop doing anything useful since another CPU has crashed\n", | |
| 48 | + smp_processor_id()); | |
| 49 | + crash_save_cpu(®s, smp_processor_id()); | |
| 50 | + flush_cache_all(); | |
| 51 | + | |
| 52 | + atomic_dec(&waiting_for_crash_ipi); | |
| 53 | + while (1) | |
| 54 | + cpu_relax(); | |
| 55 | +} | |
| 56 | + | |
| 40 | 57 | void machine_crash_shutdown(struct pt_regs *regs) |
| 41 | 58 | { |
| 59 | + unsigned long msecs; | |
| 60 | + | |
| 42 | 61 | local_irq_disable(); |
| 62 | + | |
| 63 | + atomic_set(&waiting_for_crash_ipi, num_online_cpus() - 1); | |
| 64 | + smp_call_function(machine_crash_nonpanic_core, NULL, false); | |
| 65 | + msecs = 1000; /* Wait at most a second for the other cpus to stop */ | |
| 66 | + while ((atomic_read(&waiting_for_crash_ipi) > 0) && msecs) { | |
| 67 | + mdelay(1); | |
| 68 | + msecs--; | |
| 69 | + } | |
| 70 | + if (atomic_read(&waiting_for_crash_ipi) > 0) | |
| 71 | + printk(KERN_WARNING "Non-crashing CPUs did not react to IPI\n"); | |
| 72 | + | |
| 43 | 73 | crash_save_cpu(regs, smp_processor_id()); |
| 44 | 74 | |
| 45 | 75 | printk(KERN_INFO "Loading crashdump kernel...\n"); |
| @@ -22,6 +22,7 @@ · 21 unmodified lines | ||
| 22 | 22 | |
| 23 | 23 | #include <asm/pgtable.h> |
| 24 | 24 | #include <asm/sections.h> |
| 25 | +#include <asm/smp_plat.h> | |
| 25 | 26 | #include <asm/unwind.h> |
| 26 | 27 | |
| 27 | 28 | #ifdef CONFIG_XIP_KERNEL |
| @@ -38,17 +39,9 @@ · 10 unmodified lines | ||
| 38 | 39 | #ifdef CONFIG_MMU |
| 39 | 40 | void *module_alloc(unsigned long size) |
| 40 | 41 | { |
| 41 | − struct vm_struct *area; | |
| 42 | − | |
| 43 | − size = PAGE_ALIGN(size); | |
| 44 | − if (!size) | |
| 45 | − return NULL; | |
| 46 | − | |
| 47 | − area = __get_vm_area(size, VM_ALLOC, MODULES_VADDR, MODULES_END); | |
| 48 | − if (!area) | |
| 49 | − return NULL; | |
| 50 | − | |
| 51 | − return __vmalloc_area(area, GFP_KERNEL, PAGE_KERNEL_EXEC); | |
| 42 | + return __vmalloc_node_range(size, 1, MODULES_VADDR, MODULES_END, | |
| 43 | + GFP_KERNEL, PAGE_KERNEL_EXEC, -1, | |
| 44 | + __builtin_return_address(0)); | |
| 52 | 45 | } |
| 53 | 46 | #else /* CONFIG_MMU */ |
| 54 | 47 | void *module_alloc(unsigned long size) |
| @@ -67,35 +60,6 @@ int module_frob_arch_sections(Elf_Ehdr *hdr, · 12 unmodified lines | ||
| 67 | 60 | char *secstrings, |
| 68 | 61 | struct module *mod) |
| 69 | 62 | { |
| 70 | −#ifdef CONFIG_ARM_UNWIND | |
| 71 | − Elf_Shdr *s, *sechdrs_end = sechdrs + hdr->e_shnum; | |
| 72 | − struct arm_unwind_mapping *maps = mod->arch.map; | |
| 73 | − | |
| 74 | − for (s = sechdrs; s < sechdrs_end; s++) { | |
| 75 | − char const *secname = secstrings + s->sh_name; | |
| 76 | − | |
| 77 | − if (strcmp(".ARM.exidx.init.text", secname) == 0) | |
| 78 | − maps[ARM_SEC_INIT].unw_sec = s; | |
| 79 | − else if (strcmp(".ARM.exidx.devinit.text", secname) == 0) | |
| 80 | − maps[ARM_SEC_DEVINIT].unw_sec = s; | |
| 81 | − else if (strcmp(".ARM.exidx", secname) == 0) | |
| 82 | − maps[ARM_SEC_CORE].unw_sec = s; | |
| 83 | − else if (strcmp(".ARM.exidx.exit.text", secname) == 0) | |
| 84 | − maps[ARM_SEC_EXIT].unw_sec = s; | |
| 85 | − else if (strcmp(".ARM.exidx.devexit.text", secname) == 0) | |
| 86 | − maps[ARM_SEC_DEVEXIT].unw_sec = s; | |
| 87 | − else if (strcmp(".init.text", secname) == 0) | |
| 88 | − maps[ARM_SEC_INIT].sec_text = s; | |
| 89 | − else if (strcmp(".devinit.text", secname) == 0) | |
| 90 | − maps[ARM_SEC_DEVINIT].sec_text = s; | |
| 91 | − else if (strcmp(".text", secname) == 0) | |
| 92 | − maps[ARM_SEC_CORE].sec_text = s; | |
| 93 | − else if (strcmp(".exit.text", secname) == 0) | |
| 94 | − maps[ARM_SEC_EXIT].sec_text = s; | |
| 95 | − else if (strcmp(".devexit.text", secname) == 0) | |
| 96 | − maps[ARM_SEC_DEVEXIT].sec_text = s; | |
| 97 | − } | |
| 98 | −#endif | |
| 99 | 63 | return 0; |
| 100 | 64 | } |
| 101 | 65 | |
| @@ -300,41 +264,88 @@ apply_relocate_add(Elf32_Shdr *sechdrs, const char *strtab, · 198 unmodified lines | ||
| 300 | 264 | return -ENOEXEC; |
| 301 | 265 | } |
| 302 | 266 | |
| 303 | −#ifdef CONFIG_ARM_UNWIND | |
| 304 | −static void register_unwind_tables(struct module *mod) | |
| 305 | −{ | |
| 306 | − int i; | |
| 307 | − for (i = 0; i < ARM_SEC_MAX; ++i) { | |
| 308 | − struct arm_unwind_mapping *map = &mod->arch.map[i]; | |
| 309 | − if (map->unw_sec && map->sec_text) | |
| 310 | − map->unwind = unwind_table_add(map->unw_sec->sh_addr, | |
| 311 | − map->unw_sec->sh_size, | |
| 312 | − map->sec_text->sh_addr, | |
| 313 | − map->sec_text->sh_size); | |
| 314 | − } | |
| 315 | −} | |
| 267 | +struct mod_unwind_map { | |
| 268 | + const Elf_Shdr *unw_sec; | |
| 269 | + const Elf_Shdr *txt_sec; | |
| 270 | +}; | |
| 316 | 271 | |
| 317 | −static void unregister_unwind_tables(struct module *mod) | |
| 272 | +static const Elf_Shdr *find_mod_section(const Elf32_Ehdr *hdr, | |
| 273 | + const Elf_Shdr *sechdrs, const char *name) | |
| 318 | 274 | { |
| 319 | − int i = ARM_SEC_MAX; | |
| 320 | − while (--i >= 0) | |
| 321 | − unwind_table_del(mod->arch.map[i].unwind); | |
| 275 | + const Elf_Shdr *s, *se; | |
| 276 | + const char *secstrs = (void *)hdr + sechdrs[hdr->e_shstrndx].sh_offset; | |
| 277 | + | |
| 278 | + for (s = sechdrs, se = sechdrs + hdr->e_shnum; s < se; s++) | |
| 279 | + if (strcmp(name, secstrs + s->sh_name) == 0) | |
| 280 | + return s; | |
| 281 | + | |
| 282 | + return NULL; | |
| 322 | 283 | } |
| 323 | −#else | |
| 324 | −static inline void register_unwind_tables(struct module *mod) { } | |
| 325 | −static inline void unregister_unwind_tables(struct module *mod) { } | |
| 326 | −#endif | |
| 327 | 284 | |
| 328 | −int | |
| 329 | −module_finalize(const Elf32_Ehdr *hdr, const Elf_Shdr *sechdrs, | |
| 330 | − struct module *module) | |
| 285 | +extern void fixup_smp(const void *, unsigned long); | |
| 286 | + | |
| 287 | +int module_finalize(const Elf32_Ehdr *hdr, const Elf_Shdr *sechdrs, | |
| 288 | + struct module *mod) | |
| 331 | 289 | { |
| 332 | − register_unwind_tables(module); | |
| 290 | + const Elf_Shdr * __maybe_unused s = NULL; | |
| 291 | +#ifdef CONFIG_ARM_UNWIND | |
| 292 | + const char *secstrs = (void *)hdr + sechdrs[hdr->e_shstrndx].sh_offset; | |
| 293 | + const Elf_Shdr *sechdrs_end = sechdrs + hdr->e_shnum; | |
| 294 | + struct mod_unwind_map maps[ARM_SEC_MAX]; | |
| 295 | + int i; | |
| 296 | + | |
| 297 | + memset(maps, 0, sizeof(maps)); | |
| 298 | + | |
| 299 | + for (s = sechdrs; s < sechdrs_end; s++) { | |
| 300 | + const char *secname = secstrs + s->sh_name; | |
| 301 | + | |
| 302 | + if (!(s->sh_flags & SHF_ALLOC)) | |
| 303 | + continue; | |
| 304 | + | |
| 305 | + if (strcmp(".ARM.exidx.init.text", secname) == 0) | |
| 306 | + maps[ARM_SEC_INIT].unw_sec = s; | |
| 307 | + else if (strcmp(".ARM.exidx.devinit.text", secname) == 0) | |
| 308 | + maps[ARM_SEC_DEVINIT].unw_sec = s; | |
| 309 | + else if (strcmp(".ARM.exidx", secname) == 0) | |
| 310 | + maps[ARM_SEC_CORE].unw_sec = s; | |
| 311 | + else if (strcmp(".ARM.exidx.exit.text", secname) == 0) | |
| 312 | + maps[ARM_SEC_EXIT].unw_sec = s; | |
| 313 | + else if (strcmp(".ARM.exidx.devexit.text", secname) == 0) | |
| 314 | + maps[ARM_SEC_DEVEXIT].unw_sec = s; | |
| 315 | + else if (strcmp(".init.text", secname) == 0) | |
| 316 | + maps[ARM_SEC_INIT].txt_sec = s; | |
| 317 | + else if (strcmp(".devinit.text", secname) == 0) | |
| 318 | + maps[ARM_SEC_DEVINIT].txt_sec = s; | |
| 319 | + else if (strcmp(".text", secname) == 0) | |
| 320 | + maps[ARM_SEC_CORE].txt_sec = s; | |
| 321 | + else if (strcmp(".exit.text", secname) == 0) | |
| 322 | + maps[ARM_SEC_EXIT].txt_sec = s; | |
| 323 | + else if (strcmp(".devexit.text", secname) == 0) | |
| 324 | + maps[ARM_SEC_DEVEXIT].txt_sec = s; | |
| 325 | + } | |
| 326 | + | |
| 327 | + for (i = 0; i < ARM_SEC_MAX; i++) | |
| 328 | + if (maps[i].unw_sec && maps[i].txt_sec) | |
| 329 | + mod->arch.unwind[i] = | |
| 330 | + unwind_table_add(maps[i].unw_sec->sh_addr, | |
| 331 | + maps[i].unw_sec->sh_size, | |
| 332 | + maps[i].txt_sec->sh_addr, | |
| 333 | + maps[i].txt_sec->sh_size); | |
| 334 | +#endif | |
| 335 | + s = find_mod_section(hdr, sechdrs, ".alt.smp.init"); | |
| 336 | + if (s && !is_smp()) | |
| 337 | + fixup_smp((void *)s->sh_addr, s->sh_size); | |
| 333 | 338 | return 0; |
| 334 | 339 | } |
| 335 | 340 | |
| 336 | 341 | void |
| 337 | 342 | module_arch_cleanup(struct module *mod) |
| 338 | 343 | { |
| 339 | − unregister_unwind_tables(mod); | |
| 344 | +#ifdef CONFIG_ARM_UNWIND | |
| 345 | + int i; | |
| 346 | + | |
| 347 | + for (i = 0; i < ARM_SEC_MAX; i++) | |
| 348 | + if (mod->arch.unwind[i]) | |
| 349 | + unwind_table_del(mod->arch.unwind[i]); | |
| 350 | +#endif | |
| 340 | 351 | } |
| @@ -4,9 +4,7 @@ · 3 unmodified lines | ||
| 4 | 4 | * ARM performance counter support. |
| 5 | 5 | * |
| 6 | 6 | * Copyright (C) 2009 picoChip Designs, Ltd., Jamie Iles |
| 7 | − * | |
| 8 | − * ARMv7 support: Jean Pihet <jpihet@mvista.com> | |
| 9 | − * 2010 (c) MontaVista Software, LLC. | |
| 7 | + * Copyright (C) 2010 ARM Ltd., Will Deacon <will.deacon@arm.com> | |
| 10 | 8 | * |
| 11 | 9 | * This code is based on the sparc64 perf event code, which is in turn based |
| 12 | 10 | * on the x86 code. Callchain code is based on the ARM OProfile backtrace |
| @@ -34,7 +32,7 @@ static struct platform_device *pmu_device; · 21 unmodified lines | ||
| 34 | 32 | * Hardware lock to serialize accesses to PMU registers. Needed for the |
| 35 | 33 | * read/modify/write sequences. |
| 36 | 34 | */ |
| 37 | −DEFINE_SPINLOCK(pmu_lock); | |
| 35 | +static DEFINE_RAW_SPINLOCK(pmu_lock); | |
| 38 | 36 | |
| 39 | 37 | /* |
| 40 | 38 | * ARMv6 supports a maximum of 3 events, starting from index 1. If we add |
| @@ -67,31 +65,25 @@ struct cpu_hw_events { · 26 unmodified lines | ||
| 67 | 65 | */ |
| 68 | 66 | unsigned long active_mask[BITS_TO_LONGS(ARMPMU_MAX_HWEVENTS)]; |
| 69 | 67 | }; |
| 70 | −DEFINE_PER_CPU(struct cpu_hw_events, cpu_hw_events); | |
| 71 | − | |
| 72 | −/* PMU names. */ | |
| 73 | −static const char *arm_pmu_names[] = { | |
| 74 | − [ARM_PERF_PMU_ID_XSCALE1] = "xscale1", | |
| 75 | − [ARM_PERF_PMU_ID_XSCALE2] = "xscale2", | |
| 76 | − [ARM_PERF_PMU_ID_V6] = "v6", | |
| 77 | − [ARM_PERF_PMU_ID_V6MP] = "v6mpcore", | |
| 78 | − [ARM_PERF_PMU_ID_CA8] = "ARMv7 Cortex-A8", | |
| 79 | − [ARM_PERF_PMU_ID_CA9] = "ARMv7 Cortex-A9", | |
| 80 | −}; | |
| 68 | +static DEFINE_PER_CPU(struct cpu_hw_events, cpu_hw_events); | |
| 81 | 69 | |
| 82 | 70 | struct arm_pmu { |
| 83 | 71 | enum arm_perf_pmu_ids id; |
| 72 | + const char *name; | |
| 84 | 73 | irqreturn_t (*handle_irq)(int irq_num, void *dev); |
| 85 | 74 | void (*enable)(struct hw_perf_event *evt, int idx); |
| 86 | 75 | void (*disable)(struct hw_perf_event *evt, int idx); |
| 87 | − int (*event_map)(int evt); | |
| 88 | − u64 (*raw_event)(u64); | |
| 89 | 76 | int (*get_event_idx)(struct cpu_hw_events *cpuc, |
| 90 | 77 | struct hw_perf_event *hwc); |
| 91 | 78 | u32 (*read_counter)(int idx); |
| 92 | 79 | void (*write_counter)(int idx, u32 val); |
| 93 | 80 | void (*start)(void); |
| 94 | 81 | void (*stop)(void); |
| 82 | + const unsigned (*cache_map)[PERF_COUNT_HW_CACHE_MAX] | |
| 83 | + [PERF_COUNT_HW_CACHE_OP_MAX] | |
| 84 | + [PERF_COUNT_HW_CACHE_RESULT_MAX]; | |
| 85 | + const unsigned (*event_map)[PERF_COUNT_HW_MAX]; | |
| 86 | + u32 raw_event_mask; | |
| 95 | 87 | int num_events; |
| 96 | 88 | u64 max_period; |
| 97 | 89 | }; |
| @@ -136,10 +128,6 @@ EXPORT_SYMBOL_GPL(perf_num_counters); · 38 unmodified lines | ||
| 136 | 128 | |
| 137 | 129 | #define CACHE_OP_UNSUPPORTED 0xFFFF |
| 138 | 130 | |
| 139 | −static unsigned armpmu_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] | |
| 140 | − [PERF_COUNT_HW_CACHE_OP_MAX] | |
| 141 | − [PERF_COUNT_HW_CACHE_RESULT_MAX]; | |
| 142 | − | |
| 143 | 131 | static int |
| 144 | 132 | armpmu_map_cache_event(u64 config) |
| 145 | 133 | { |
| @@ -157,7 +145,7 @@ armpmu_map_cache_event(u64 config) · 11 unmodified lines | ||
| 157 | 145 | if (cache_result >= PERF_COUNT_HW_CACHE_RESULT_MAX) |
| 158 | 146 | return -EINVAL; |
| 159 | 147 | |
| 160 | − ret = (int)armpmu_perf_cache_map[cache_type][cache_op][cache_result]; | |
| 148 | + ret = (int)(*armpmu->cache_map)[cache_type][cache_op][cache_result]; | |
| 161 | 149 | |
| 162 | 150 | if (ret == CACHE_OP_UNSUPPORTED) |
| 163 | 151 | return -ENOENT; |
| @@ -165,6 +153,19 @@ armpmu_map_cache_event(u64 config) · 1 unmodified line | ||
| 165 | 153 | return ret; |
| 166 | 154 | } |
| 167 | 155 | |
| 156 | +static int | |
| 157 | +armpmu_map_event(u64 config) | |
| 158 | +{ | |
| 159 | + int mapping = (*armpmu->event_map)[config]; | |
| 160 | + return mapping == HW_OP_UNSUPPORTED ? -EOPNOTSUPP : mapping; | |
| 161 | +} | |
| 162 | + | |
| 163 | +static int | |
| 164 | +armpmu_map_raw_event(u64 config) | |
| 165 | +{ | |
| 166 | + return (int)(config & armpmu->raw_event_mask); | |
| 167 | +} | |
| 168 | + | |
| 168 | 169 | static int |
| 169 | 170 | armpmu_event_set_period(struct perf_event *event, |
| 170 | 171 | struct hw_perf_event *hwc, |
| @@ -458,11 +459,11 @@ __hw_perf_event_init(struct perf_event *event) · 287 unmodified lines | ||
| 458 | 459 | |
| 459 | 460 | /* Decode the generic type into an ARM event identifier. */ |
| 460 | 461 | if (PERF_TYPE_HARDWARE == event->attr.type) { |
| 461 | − mapping = armpmu->event_map(event->attr.config); | |
| 462 | + mapping = armpmu_map_event(event->attr.config); | |
| 462 | 463 | } else if (PERF_TYPE_HW_CACHE == event->attr.type) { |
| 463 | 464 | mapping = armpmu_map_cache_event(event->attr.config); |
| 464 | 465 | } else if (PERF_TYPE_RAW == event->attr.type) { |
| 465 | − mapping = armpmu->raw_event(event->attr.config); | |
| 466 | + mapping = armpmu_map_raw_event(event->attr.config); | |
| 466 | 467 | } else { |
| 467 | 468 | pr_debug("event type %x not supported\n", event->attr.type); |
| 468 | 469 | return -EOPNOTSUPP; |
| @@ -603,2366 +604,10 @@ static struct pmu pmu = { · 134 unmodified lines | ||
| 603 | 604 | .read = armpmu_read, |
| 604 | 605 | }; |
| 605 | 606 | |
| 606 | −/* | |
| 607 | − * ARMv6 Performance counter handling code. | |
| 608 | − * | |
| 609 | − * ARMv6 has 2 configurable performance counters and a single cycle counter. | |
| 610 | − * They all share a single reset bit but can be written to zero so we can use | |
| 611 | − * that for a reset. | |
| 612 | − * | |
| 613 | − * The counters can't be individually enabled or disabled so when we remove | |
| 614 | − * one event and replace it with another we could get spurious counts from the | |
| 615 | − * wrong event. However, we can take advantage of the fact that the | |
| 616 | − * performance counters can export events to the event bus, and the event bus | |
| 617 | − * itself can be monitored. This requires that we *don't* export the events to | |
| 618 | − * the event bus. The procedure for disabling a configurable counter is: | |
| 619 | − * - change the counter to count the ETMEXTOUT[0] signal (0x20). This | |
| 620 | − * effectively stops the counter from counting. | |
| 621 | − * - disable the counter's interrupt generation (each counter has it's | |
| 622 | − * own interrupt enable bit). | |
| 623 | − * Once stopped, the counter value can be written as 0 to reset. | |
| 624 | − * | |
| 625 | − * To enable a counter: | |
| 626 | − * - enable the counter's interrupt generation. | |
| 627 | − * - set the new event type. | |
| 628 | − * | |
| 629 | − * Note: the dedicated cycle counter only counts cycles and can't be | |
| 630 | − * enabled/disabled independently of the others. When we want to disable the | |
| 631 | − * cycle counter, we have to just disable the interrupt reporting and start | |
| 632 | − * ignoring that counter. When re-enabling, we have to reset the value and | |
| 633 | − * enable the interrupt. | |
| 634 | − */ | |
| 635 | − | |
| 636 | −enum armv6_perf_types { | |
| 637 | − ARMV6_PERFCTR_ICACHE_MISS = 0x0, | |
| 638 | − ARMV6_PERFCTR_IBUF_STALL = 0x1, | |
| 639 | − ARMV6_PERFCTR_DDEP_STALL = 0x2, | |
| 640 | − ARMV6_PERFCTR_ITLB_MISS = 0x3, | |
| 641 | − ARMV6_PERFCTR_DTLB_MISS = 0x4, | |
| 642 | − ARMV6_PERFCTR_BR_EXEC = 0x5, | |
| 643 | − ARMV6_PERFCTR_BR_MISPREDICT = 0x6, | |
| 644 | − ARMV6_PERFCTR_INSTR_EXEC = 0x7, | |
| 645 | − ARMV6_PERFCTR_DCACHE_HIT = 0x9, | |
| 646 | − ARMV6_PERFCTR_DCACHE_ACCESS = 0xA, | |
| 647 | − ARMV6_PERFCTR_DCACHE_MISS = 0xB, | |
| 648 | − ARMV6_PERFCTR_DCACHE_WBACK = 0xC, | |
| 649 | − ARMV6_PERFCTR_SW_PC_CHANGE = 0xD, | |
| 650 | − ARMV6_PERFCTR_MAIN_TLB_MISS = 0xF, | |
| 651 | − ARMV6_PERFCTR_EXPL_D_ACCESS = 0x10, | |
| 652 | − ARMV6_PERFCTR_LSU_FULL_STALL = 0x11, | |
| 653 | − ARMV6_PERFCTR_WBUF_DRAINED = 0x12, | |
| 654 | − ARMV6_PERFCTR_CPU_CYCLES = 0xFF, | |
| 655 | − ARMV6_PERFCTR_NOP = 0x20, | |
| 656 | −}; | |
| 657 | − | |
| 658 | −enum armv6_counters { | |
| 659 | − ARMV6_CYCLE_COUNTER = 1, | |
| 660 | − ARMV6_COUNTER0, | |
| 661 | − ARMV6_COUNTER1, | |
| 662 | −}; | |
| 663 | − | |
| 664 | −/* | |
| 665 | − * The hardware events that we support. We do support cache operations but | |
| 666 | − * we have harvard caches and no way to combine instruction and data | |
| 667 | − * accesses/misses in hardware. | |
| 668 | − */ | |
| 669 | −static const unsigned armv6_perf_map[PERF_COUNT_HW_MAX] = { | |
| 670 | − [PERF_COUNT_HW_CPU_CYCLES] = ARMV6_PERFCTR_CPU_CYCLES, | |
| 671 | − [PERF_COUNT_HW_INSTRUCTIONS] = ARMV6_PERFCTR_INSTR_EXEC, | |
| 672 | − [PERF_COUNT_HW_CACHE_REFERENCES] = HW_OP_UNSUPPORTED, | |
| 673 | − [PERF_COUNT_HW_CACHE_MISSES] = HW_OP_UNSUPPORTED, | |
| 674 | − [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = ARMV6_PERFCTR_BR_EXEC, | |
| 675 | − [PERF_COUNT_HW_BRANCH_MISSES] = ARMV6_PERFCTR_BR_MISPREDICT, | |
| 676 | − [PERF_COUNT_HW_BUS_CYCLES] = HW_OP_UNSUPPORTED, | |
| 677 | −}; | |
| 678 | − | |
| 679 | −static const unsigned armv6_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] | |
| 680 | − [PERF_COUNT_HW_CACHE_OP_MAX] | |
| 681 | − [PERF_COUNT_HW_CACHE_RESULT_MAX] = { | |
| 682 | − [C(L1D)] = { | |
| 683 | − /* | |
| 684 | − * The performance counters don't differentiate between read | |
| 685 | − * and write accesses/misses so this isn't strictly correct, | |
| 686 | − * but it's the best we can do. Writes and reads get | |
| 687 | − * combined. | |
| 688 | − */ | |
| 689 | − [C(OP_READ)] = { | |
| 690 | − [C(RESULT_ACCESS)] = ARMV6_PERFCTR_DCACHE_ACCESS, | |
| 691 | − [C(RESULT_MISS)] = ARMV6_PERFCTR_DCACHE_MISS, | |
| 692 | − }, | |
| 693 | − [C(OP_WRITE)] = { | |
| 694 | − [C(RESULT_ACCESS)] = ARMV6_PERFCTR_DCACHE_ACCESS, | |
| 695 | − [C(RESULT_MISS)] = ARMV6_PERFCTR_DCACHE_MISS, | |
| 696 | − }, | |
| 697 | − [C(OP_PREFETCH)] = { | |
| 698 | − [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | |
| 699 | − [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, | |
| 700 | − }, | |
| 701 | − }, | |
| 702 | − [C(L1I)] = { | |
| 703 | − [C(OP_READ)] = { | |
| 704 | − [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | |
| 705 | − [C(RESULT_MISS)] = ARMV6_PERFCTR_ICACHE_MISS, | |
| 706 | − }, | |
| 707 | − [C(OP_WRITE)] = { | |
| 708 | − [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | |
| 709 | − [C(RESULT_MISS)] = ARMV6_PERFCTR_ICACHE_MISS, | |
| 710 | − }, | |
| 711 | − [C(OP_PREFETCH)] = { | |
| 712 | − [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | |
| 713 | − [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, | |
| 714 | − }, | |
| 715 | − }, | |
| 716 | − [C(LL)] = { | |
| 717 | − [C(OP_READ)] = { | |
| 718 | − [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | |
| 719 | − [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, | |
| 720 | − }, | |
| 721 | − [C(OP_WRITE)] = { | |
| 722 | − [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | |
| 723 | − [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, | |
| 724 | − }, | |
| 725 | − [C(OP_PREFETCH)] = { | |
| 726 | − [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | |
| 727 | − [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, | |
| 728 | − }, | |
| 729 | − }, | |
| 730 | − [C(DTLB)] = { | |
| 731 | − /* | |
| 732 | − * The ARM performance counters can count micro DTLB misses, | |
| 733 | − * micro ITLB misses and main TLB misses. There isn't an event | |
| 734 | − * for TLB misses, so use the micro misses here and if users | |
| 735 | − * want the main TLB misses they can use a raw counter. | |
| 736 | − */ | |
| 737 | − [C(OP_READ)] = { | |
| 738 | − [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | |
| 739 | − [C(RESULT_MISS)] = ARMV6_PERFCTR_DTLB_MISS, | |
| 740 | − }, | |
| 741 | − [C(OP_WRITE)] = { | |
| 742 | − [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | |
| 743 | − [C(RESULT_MISS)] = ARMV6_PERFCTR_DTLB_MISS, | |
| 744 | − }, | |
| 745 | − [C(OP_PREFETCH)] = { | |
| 746 | − [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | |
| 747 | − [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, | |
| 748 | − }, | |
| 749 | − }, | |
| 750 | − [C(ITLB)] = { | |
| 751 | − [C(OP_READ)] = { | |
| 752 | − [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | |
| 753 | − [C(RESULT_MISS)] = ARMV6_PERFCTR_ITLB_MISS, | |
| 754 | − }, | |
| 755 | − [C(OP_WRITE)] = { | |
| 756 | − [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | |
| 757 | − [C(RESULT_MISS)] = ARMV6_PERFCTR_ITLB_MISS, | |
| 758 | − }, | |
| 759 | − [C(OP_PREFETCH)] = { | |
| 760 | − [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | |
| 761 | − [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, | |
| 762 | − }, | |
| 763 | − }, | |
| 764 | − [C(BPU)] = { | |
| 765 | − [C(OP_READ)] = { | |
| 766 | − [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | |
| 767 | − [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, | |
| 768 | − }, | |
| 769 | − [C(OP_WRITE)] = { | |
| 770 | − [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | |
| 771 | − [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, | |
| 772 | − }, | |
| 773 | − [C(OP_PREFETCH)] = { | |
| 774 | − [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | |
| 775 | − [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, | |
| 776 | − }, | |
| 777 | − }, | |
| 778 | −}; | |
| 779 | − | |
| 780 | −enum armv6mpcore_perf_types { | |
| 781 | − ARMV6MPCORE_PERFCTR_ICACHE_MISS = 0x0, | |
| 782 | − ARMV6MPCORE_PERFCTR_IBUF_STALL = 0x1, | |
| 783 | − ARMV6MPCORE_PERFCTR_DDEP_STALL = 0x2, | |
| 784 | − ARMV6MPCORE_PERFCTR_ITLB_MISS = 0x3, | |
| 785 | − ARMV6MPCORE_PERFCTR_DTLB_MISS = 0x4, | |
| 786 | − ARMV6MPCORE_PERFCTR_BR_EXEC = 0x5, | |
| 787 | − ARMV6MPCORE_PERFCTR_BR_NOTPREDICT = 0x6, | |
| 788 | − ARMV6MPCORE_PERFCTR_BR_MISPREDICT = 0x7, | |
| 789 | − ARMV6MPCORE_PERFCTR_INSTR_EXEC = 0x8, | |
| 790 | − ARMV6MPCORE_PERFCTR_DCACHE_RDACCESS = 0xA, | |
| 791 | − ARMV6MPCORE_PERFCTR_DCACHE_RDMISS = 0xB, | |
| 792 | − ARMV6MPCORE_PERFCTR_DCACHE_WRACCESS = 0xC, | |
| 793 | − ARMV6MPCORE_PERFCTR_DCACHE_WRMISS = 0xD, | |
| 794 | − ARMV6MPCORE_PERFCTR_DCACHE_EVICTION = 0xE, | |
| 795 | − ARMV6MPCORE_PERFCTR_SW_PC_CHANGE = 0xF, | |
| 796 | − ARMV6MPCORE_PERFCTR_MAIN_TLB_MISS = 0x10, | |
| 797 | − ARMV6MPCORE_PERFCTR_EXPL_MEM_ACCESS = 0x11, | |
| 798 | − ARMV6MPCORE_PERFCTR_LSU_FULL_STALL = 0x12, | |
| 799 | − ARMV6MPCORE_PERFCTR_WBUF_DRAINED = 0x13, | |
| 800 | − ARMV6MPCORE_PERFCTR_CPU_CYCLES = 0xFF, | |
| 801 | −}; | |
| 802 | − | |
| 803 | −/* | |
| 804 | − * The hardware events that we support. We do support cache operations but | |
| 805 | − * we have harvard caches and no way to combine instruction and data | |
| 806 | − * accesses/misses in hardware. | |
| 807 | − */ | |
| 808 | −static const unsigned armv6mpcore_perf_map[PERF_COUNT_HW_MAX] = { | |
| 809 | − [PERF_COUNT_HW_CPU_CYCLES] = ARMV6MPCORE_PERFCTR_CPU_CYCLES, | |
| 810 | − [PERF_COUNT_HW_INSTRUCTIONS] = ARMV6MPCORE_PERFCTR_INSTR_EXEC, | |
| 811 | − [PERF_COUNT_HW_CACHE_REFERENCES] = HW_OP_UNSUPPORTED, | |
| 812 | − [PERF_COUNT_HW_CACHE_MISSES] = HW_OP_UNSUPPORTED, | |
| 813 | − [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = ARMV6MPCORE_PERFCTR_BR_EXEC, | |
| 814 | − [PERF_COUNT_HW_BRANCH_MISSES] = ARMV6MPCORE_PERFCTR_BR_MISPREDICT, | |
| 815 | − [PERF_COUNT_HW_BUS_CYCLES] = HW_OP_UNSUPPORTED, | |
| 816 | −}; | |
| 817 | − | |
| 818 | −static const unsigned armv6mpcore_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] | |
| 819 | − [PERF_COUNT_HW_CACHE_OP_MAX] | |
| 820 | − [PERF_COUNT_HW_CACHE_RESULT_MAX] = { | |
| 821 | − [C(L1D)] = { | |
| 822 | − [C(OP_READ)] = { | |
| 823 | − [C(RESULT_ACCESS)] = | |
| 824 | − ARMV6MPCORE_PERFCTR_DCACHE_RDACCESS, | |
| 825 | − [C(RESULT_MISS)] = | |
| 826 | − ARMV6MPCORE_PERFCTR_DCACHE_RDMISS, | |
| 827 | − }, | |
| 828 | − [C(OP_WRITE)] = { | |
| 829 | − [C(RESULT_ACCESS)] = | |
| 830 | − ARMV6MPCORE_PERFCTR_DCACHE_WRACCESS, | |
| 831 | − [C(RESULT_MISS)] = | |
| 832 | − ARMV6MPCORE_PERFCTR_DCACHE_WRMISS, | |
| 833 | − }, | |
| 834 | − [C(OP_PREFETCH)] = { | |
| 835 | − [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | |
| 836 | − [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, | |
| 837 | − }, | |
| 838 | − }, | |
| 839 | − [C(L1I)] = { | |
| 840 | − [C(OP_READ)] = { | |
| 841 | − [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | |
| 842 | − [C(RESULT_MISS)] = ARMV6MPCORE_PERFCTR_ICACHE_MISS, | |
| 843 | − }, | |
| 844 | − [C(OP_WRITE)] = { | |
| 845 | − [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | |
| 846 | − [C(RESULT_MISS)] = ARMV6MPCORE_PERFCTR_ICACHE_MISS, | |
| 847 | − }, | |
| 848 | − [C(OP_PREFETCH)] = { | |
| 849 | − [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | |
| 850 | − [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, | |
| 851 | − }, | |
| 852 | − }, | |
| 853 | − [C(LL)] = { | |
| 854 | − [C(OP_READ)] = { | |
| 855 | − [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | |
| 856 | − [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, | |
| 857 | − }, | |
| 858 | − [C(OP_WRITE)] = { | |
| 859 | − [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | |
| 860 | − [C(RESULT_MISS)] = CACHE_OP_UNSUPPORTED, | |
2235 more lines aren’t shown here.
This diff is large: its 673 lines aren’t shown here.
This diff is large: its 907 lines aren’t shown here.
This diff is large: its 808 lines aren’t shown here.
This diff is large: its 95 lines aren’t shown here.
This diff is large: its 43 lines aren’t shown here.
This diff is large: its 13 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 75 lines aren’t shown here.
This diff is large: its 173 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 657 lines aren’t shown here.
This diff is large: its 140 lines aren’t shown here.
This diff is large: its 62 lines aren’t shown here.
This diff is large: its 17 lines aren’t shown here.
This diff is large: its 268 lines aren’t shown here.
This diff is large: its 28 lines aren’t shown here.
This diff is large: its 62 lines aren’t shown here.
This diff is large: its 61 lines aren’t shown here.
This diff is large: its 16 lines aren’t shown here.
This diff is large: its 36 lines aren’t shown here.
This diff is large: its 64 lines aren’t shown here.
This diff is large: its 282 lines aren’t shown here.
This diff is large: its 35 lines aren’t shown here.
This diff is large: its 27 lines aren’t shown here.
This diff is large: its 12 lines aren’t shown here.
This diff is large: its 18 lines aren’t shown here.
This diff is large: its 20 lines aren’t shown here.
This diff is large: its 21 lines aren’t shown here.
This diff is large: its 275 lines aren’t shown here.
This diff is large: its 585 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 89 lines aren’t shown here.
This diff is large: its 34 lines aren’t shown here.
This diff is large: its 93 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 15 lines aren’t shown here.
This diff is large: its 54 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 18 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 83 lines aren’t shown here.
This diff is large: its 102 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 73 lines aren’t shown here.
This diff is large: its 16 lines aren’t shown here.
This diff is large: its 14 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 16 lines aren’t shown here.
This diff is large: its 76 lines aren’t shown here.
This diff is large: its 24 lines aren’t shown here.
This diff is large: its 78 lines aren’t shown here.
This diff is large: its 75 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 448 lines aren’t shown here.
This diff is large: its 18 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 65 lines aren’t shown here.
This diff is large: its 152 lines aren’t shown here.
This diff is large: its 22 lines aren’t shown here.
This diff is large: its 14 lines aren’t shown here.
This diff is large: its 13 lines aren’t shown here.
This diff is large: its 110 lines aren’t shown here.
This diff is large: its 14 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 73 lines aren’t shown here.
This diff is large: its 67 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 25 lines aren’t shown here.
This diff is large: its 52 lines aren’t shown here.
This diff is large: its 66 lines aren’t shown here.
This diff is large: its 37 lines aren’t shown here.
This diff is large: its 13 lines aren’t shown here.
This diff is large: its 6 lines aren’t shown here.
This diff is large: its 96 lines aren’t shown here.
This diff is large: its 18 lines aren’t shown here.
This diff is large: its 23 lines aren’t shown here.
This diff is large: its 17 lines aren’t shown here.
This diff is large: its 49 lines aren’t shown here.
This diff is large: its 213 lines aren’t shown here.
This diff is large: its 221 lines aren’t shown here.
This diff is large: its 28 lines aren’t shown here.
This diff is large: its 12 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 102 lines aren’t shown here.
This diff is large: its 28 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 80 lines aren’t shown here.
This diff is large: its 66 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 45 lines aren’t shown here.
This diff is large: its 85 lines aren’t shown here.
This diff is large: its 35 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 278 lines aren’t shown here.
This diff is large: its 27 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 10 lines aren’t shown here.
This diff is large: its 22 lines aren’t shown here.
This diff is large: its 19 lines aren’t shown here.
This diff is large: its 118 lines aren’t shown here.
This diff is large: its 21 lines aren’t shown here.
This diff is large: its 46 lines aren’t shown here.
This diff is large: its 78 lines aren’t shown here.
This diff is large: its 57 lines aren’t shown here.
This diff is large: its 554 lines aren’t shown here.
This diff is large: its 30 lines aren’t shown here.
This diff is large: its 13 lines aren’t shown here.
This diff is large: its 69 lines aren’t shown here.
This diff is large: its 38 lines aren’t shown here.
This diff is large: its 85 lines aren’t shown here.
This diff is large: its 73 lines aren’t shown here.
This diff is large: its 43 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 60 lines aren’t shown here.
This diff is large: its 92 lines aren’t shown here.
This diff is large: its 219 lines aren’t shown here.
This diff is large: its 60 lines aren’t shown here.
This diff is large: its 41 lines aren’t shown here.
This diff is large: its 117 lines aren’t shown here.
This diff is large: its 67 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 14 lines aren’t shown here.
This diff is large: its 37 lines aren’t shown here.
This diff is large: its 48 lines aren’t shown here.
This diff is large: its 37 lines aren’t shown here.
This diff is large: its 42 lines aren’t shown here.
This diff is large: its 18 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 48 lines aren’t shown here.
This diff is large: its 106 lines aren’t shown here.
This diff is large: its 10 lines aren’t shown here.
This diff is large: its 17 lines aren’t shown here.
This diff is large: its 112 lines aren’t shown here.
This diff is large: its 17 lines aren’t shown here.
This diff is large: its 10 lines aren’t shown here.
This diff is large: its 33 lines aren’t shown here.
This diff is large: its 10 lines aren’t shown here.
This diff is large: its 62 lines aren’t shown here.
This diff is large: its 141 lines aren’t shown here.
This diff is large: its 63 lines aren’t shown here.
This diff is large: its 48 lines aren’t shown here.
This diff is large: its 140 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 87 lines aren’t shown here.
This diff is large: its 162 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 10 lines aren’t shown here.
This diff is large: its 23 lines aren’t shown here.
This diff is large: its 25 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 37 lines aren’t shown here.
This diff is large: its 25 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 22 lines aren’t shown here.
This diff is large: its 107 lines aren’t shown here.
This diff is large: its 39 lines aren’t shown here.
This diff is large: its 72 lines aren’t shown here.
This diff is large: its 50 lines aren’t shown here.
This diff is large: its 95 lines aren’t shown here.
This diff is large: its 62 lines aren’t shown here.
This diff is large: its 12 lines aren’t shown here.
This diff is large: its 141 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 19 lines aren’t shown here.
This diff is large: its 52 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 205 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 349 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 42 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 109 lines aren’t shown here.
This diff is large: its 39 lines aren’t shown here.
This diff is large: its 56 lines aren’t shown here.
This diff is large: its 61 lines aren’t shown here.
This diff is large: its 16 lines aren’t shown here.
This diff is large: its 83 lines aren’t shown here.
This diff is large: its 43 lines aren’t shown here.
This diff is large: its 24 lines aren’t shown here.
This diff is large: its 46 lines aren’t shown here.
This diff is large: its 21 lines aren’t shown here.
This diff is large: its 61 lines aren’t shown here.
This diff is large: its 112 lines aren’t shown here.
This diff is large: its 298 lines aren’t shown here.
This diff is large: its 22 lines aren’t shown here.
This diff is large: its 83 lines aren’t shown here.
This diff is large: its 86 lines aren’t shown here.
This diff is large: its 571 lines aren’t shown here.
This diff is large: its 78 lines aren’t shown here.
This diff is large: its 20 lines aren’t shown here.
This diff is large: its 427 lines aren’t shown here.
This diff is large: its 109 lines aren’t shown here.
This diff is large: its 41 lines aren’t shown here.
This diff is large: its 92 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 28 lines aren’t shown here.
This diff is large: its 59 lines aren’t shown here.
This diff is large: its 14 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 21 lines aren’t shown here.
This diff is large: its 12 lines aren’t shown here.
This diff is large: its 22 lines aren’t shown here.
This diff is large: its 309 lines aren’t shown here.
This diff is large: its 18 lines aren’t shown here.
This diff is large: its 119 lines aren’t shown here.
This diff is large: its 81 lines aren’t shown here.
This diff is large: its 167 lines aren’t shown here.
This diff is large: its 40 lines aren’t shown here.
This diff is large: its 39 lines aren’t shown here.
This diff is large: its 288 lines aren’t shown here.
This diff is large: its 42 lines aren’t shown here.
This diff is large: its 110 lines aren’t shown here.
This diff is large: its 78 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 230 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 35 lines aren’t shown here.
This diff is large: its 6 lines aren’t shown here.
This diff is large: its 4 lines aren’t shown here.
This diff is large: its 309 lines aren’t shown here.
This diff is large: its 14 lines aren’t shown here.
This diff is large: its 202 lines aren’t shown here.
This diff is large: its 20 lines aren’t shown here.
This diff is large: its 28 lines aren’t shown here.
This diff is large: its 19 lines aren’t shown here.
This diff is large: its 64 lines aren’t shown here.
This diff is large: its 52 lines aren’t shown here.
This diff is large: its 68 lines aren’t shown here.
This diff is large: its 314 lines aren’t shown here.
This diff is large: its 15 lines aren’t shown here.
This diff is large: its 18 lines aren’t shown here.
This diff is large: its 56 lines aren’t shown here.
This diff is large: its 75 lines aren’t shown here.
This diff is large: its 13 lines aren’t shown here.
This diff is large: its 206 lines aren’t shown here.
This diff is large: its 48 lines aren’t shown here.
This diff is large: its 35 lines aren’t shown here.
This diff is large: its 26 lines aren’t shown here.
This diff is large: its 81 lines aren’t shown here.
This diff is large: its 92 lines aren’t shown here.
This diff is large: its 102 lines aren’t shown here.
This diff is large: its 147 lines aren’t shown here.
This diff is large: its 119 lines aren’t shown here.
This diff is large: its 26 lines aren’t shown here.
This diff is large: its 30 lines aren’t shown here.
This diff is large: its 74 lines aren’t shown here.
This diff is large: its 83 lines aren’t shown here.
This diff is large: its 59 lines aren’t shown here.
This diff is large: its 148 lines aren’t shown here.
This diff is large: its 20 lines aren’t shown here.
This diff is large: its 13 lines aren’t shown here.
This diff is large: its 76 lines aren’t shown here.
This diff is large: its 128 lines aren’t shown here.
This diff is large: its 198 lines aren’t shown here.
This diff is large: its 69 lines aren’t shown here.
This diff is large: its 214 lines aren’t shown here.
This diff is large: its 289 lines aren’t shown here.
This diff is large: its 159 lines aren’t shown here.
This diff is large: its 112 lines aren’t shown here.
This diff is large: its 112 lines aren’t shown here.
This diff is large: its 471 lines aren’t shown here.
This diff is large: its 159 lines aren’t shown here.
This diff is large: its 24 lines aren’t shown here.
This diff is large: its 30 lines aren’t shown here.
This diff is large: its 32 lines aren’t shown here.
This diff is large: its 27 lines aren’t shown here.
This diff is large: its 89 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 81 lines aren’t shown here.
This diff is large: its 40 lines aren’t shown here.
This diff is large: its 60 lines aren’t shown here.
This diff is large: its 105 lines aren’t shown here.
This diff is large: its 14 lines aren’t shown here.
This diff is large: its 67 lines aren’t shown here.
This diff is large: its 35 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 2 lines aren’t shown here.
This diff is large: its 536 lines aren’t shown here.
This diff is large: its 746 lines aren’t shown here.
This diff is large: its 199 lines aren’t shown here.
This diff is large: its 17 lines aren’t shown here.
This diff is large: its 21 lines aren’t shown here.
This diff is large: its 89 lines aren’t shown here.
This diff is large: its 7 lines aren’t shown here.
This diff is large: its 3 lines aren’t shown here.
This diff is large: its 41 lines aren’t shown here.
This diff is large: its 51 lines aren’t shown here.
This diff is large: its 328 lines aren’t shown here.
This diff is large: its 35 lines aren’t shown here.
This diff is large: its 82 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 63 lines aren’t shown here.
This diff is large: its 32 lines aren’t shown here.
This diff is large: its 39 lines aren’t shown here.
This diff is large: its 44 lines aren’t shown here.
This diff is large: its 42 lines aren’t shown here.
This diff is large: its 36 lines aren’t shown here.
This diff is large: its 30 lines aren’t shown here.
This diff is large: its 23 lines aren’t shown here.
This diff is large: its 356 lines aren’t shown here.
This diff is large: its 538 lines aren’t shown here.
This diff is large: its 166 lines aren’t shown here.
This diff is large: its 33 lines aren’t shown here.
This diff is large: its 25 lines aren’t shown here.
This diff is large: its 146 lines aren’t shown here.
This diff is large: its 189 lines aren’t shown here.
This diff is large: its 106 lines aren’t shown here.
This diff is large: its 28 lines aren’t shown here.
This diff is large: its 22 lines aren’t shown here.
This diff is large: its 77 lines aren’t shown here.
This diff is large: its 23 lines aren’t shown here.
This diff is large: its 102 lines aren’t shown here.
This diff is large: its 58 lines aren’t shown here.
This diff is large: its 159 lines aren’t shown here.
This diff is large: its 46 lines aren’t shown here.
This diff is large: its 46 lines aren’t shown here.
This diff is large: its 456 lines aren’t shown here.
This diff is large: its 664 lines aren’t shown here.
This diff is large: its 138 lines aren’t shown here.
This diff is large: its 297 lines aren’t shown here.
This diff is large: its 79 lines aren’t shown here.
This diff is large: its 19 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 75 lines aren’t shown here.
This diff is large: its 66 lines aren’t shown here.
This diff is large: its 20 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 40 lines aren’t shown here.
This diff is large: its 38 lines aren’t shown here.
This diff is large: its 38 lines aren’t shown here.
This diff is large: its 27 lines aren’t shown here.
This diff is large: its 237 lines aren’t shown here.
This diff is large: its 131 lines aren’t shown here.
This diff is large: its 116 lines aren’t shown here.
This diff is large: its 145 lines aren’t shown here.
This diff is large: its 142 lines aren’t shown here.
This diff is large: its 67 lines aren’t shown here.
This diff is large: its 56 lines aren’t shown here.
This diff is large: its 58 lines aren’t shown here.
This diff is large: its 45 lines aren’t shown here.
This diff is large: its 47 lines aren’t shown here.
This diff is large: its 47 lines aren’t shown here.
This diff is large: its 129 lines aren’t shown here.
This diff is large: its 87 lines aren’t shown here.
This diff is large: its 28 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 63 lines aren’t shown here.
This diff is large: its 18 lines aren’t shown here.
This diff is large: its 391 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 93 lines aren’t shown here.
This diff is large: its 100 lines aren’t shown here.
This diff is large: its 201 lines aren’t shown here.
This diff is large: its 263 lines aren’t shown here.
This diff is large: its 34 lines aren’t shown here.
This diff is large: its 43 lines aren’t shown here.
This diff is large: its 127 lines aren’t shown here.
This diff is large: its 117 lines aren’t shown here.
This diff is large: its 10 lines aren’t shown here.
This diff is large: its 22 lines aren’t shown here.
This diff is large: its 13 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 19 lines aren’t shown here.
This diff is large: its 18 lines aren’t shown here.
This diff is large: its 33 lines aren’t shown here.
This diff is large: its 152 lines aren’t shown here.
This diff is large: its 32 lines aren’t shown here.
This diff is large: its 134 lines aren’t shown here.
This diff is large: its 168 lines aren’t shown here.
This diff is large: its 30 lines aren’t shown here.
This diff is large: its 51 lines aren’t shown here.
This diff is large: its 30 lines aren’t shown here.
This diff is large: its 165 lines aren’t shown here.
This diff is large: its 117 lines aren’t shown here.
This diff is large: its 74 lines aren’t shown here.
This diff is large: its 39 lines aren’t shown here.
This diff is large: its 92 lines aren’t shown here.
This diff is large: its 75 lines aren’t shown here.
This diff is large: its 153 lines aren’t shown here.
This diff is large: its 10 lines aren’t shown here.
This diff is large: its 115 lines aren’t shown here.
This diff is large: its 317 lines aren’t shown here.
This diff is large: its 180 lines aren’t shown here.
This diff is large: its 30 lines aren’t shown here.
This diff is large: its 120 lines aren’t shown here.
This diff is large: its 136 lines aren’t shown here.
This diff is large: its 51 lines aren’t shown here.
This diff is large: its 20 lines aren’t shown here.
This diff is large: its 83 lines aren’t shown here.
This diff is large: its 76 lines aren’t shown here.
This diff is large: its 26 lines aren’t shown here.
This diff is large: its 121 lines aren’t shown here.
This diff is large: its 23 lines aren’t shown here.
This diff is large: its 185 lines aren’t shown here.
This diff is large: its 168 lines aren’t shown here.
This diff is large: its 25 lines aren’t shown here.
This diff is large: its 35 lines aren’t shown here.
This diff is large: its 169 lines aren’t shown here.
This diff is large: its 101 lines aren’t shown here.
This diff is large: its 151 lines aren’t shown here.
This diff is large: its 118 lines aren’t shown here.
This diff is large: its 47 lines aren’t shown here.
This diff is large: its 45 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 37 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 17 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 44 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 44 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 21 lines aren’t shown here.
This diff is large: its 434 lines aren’t shown here.
This diff is large: its 1224 lines aren’t shown here.
This diff is large: its 473 lines aren’t shown here.
This diff is large: its 87 lines aren’t shown here.
This diff is large: its 365 lines aren’t shown here.
This diff is large: its 342 lines aren’t shown here.
This diff is large: its 32 lines aren’t shown here.
This diff is large: its 25 lines aren’t shown here.
This diff is large: its 10 lines aren’t shown here.
This diff is large: its 69 lines aren’t shown here.
This diff is large: its 149 lines aren’t shown here.
This diff is large: its 262 lines aren’t shown here.
This diff is large: its 509 lines aren’t shown here.
This diff is large: its 472 lines aren’t shown here.
This diff is large: its 148 lines aren’t shown here.
This diff is large: its 53 lines aren’t shown here.
This diff is large: its 684 lines aren’t shown here.
This diff is large: its 63 lines aren’t shown here.
This diff is large: its 215 lines aren’t shown here.
This diff is large: its 32 lines aren’t shown here.
This diff is large: its 208 lines aren’t shown here.
This diff is large: its 87 lines aren’t shown here.
This diff is large: its 96 lines aren’t shown here.
This diff is large: its 159 lines aren’t shown here.
This diff is large: its 298 lines aren’t shown here.
This diff is large: its 109 lines aren’t shown here.
This diff is large: its 38 lines aren’t shown here.
This diff is large: its 105 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 48 lines aren’t shown here.
This diff is large: its 26 lines aren’t shown here.
This diff is large: its 13 lines aren’t shown here.
This diff is large: its 160 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 175 lines aren’t shown here.
This diff is large: its 65 lines aren’t shown here.
This diff is large: its 53 lines aren’t shown here.
This diff is large: its 848 lines aren’t shown here.
This diff is large: its 250 lines aren’t shown here.
This diff is large: its 18 lines aren’t shown here.
This diff is large: its 18 lines aren’t shown here.
This diff is large: its 36 lines aren’t shown here.
This diff is large: its 1626 lines aren’t shown here.
This diff is large: its 299 lines aren’t shown here.
This diff is large: its 34 lines aren’t shown here.
This diff is large: its 40 lines aren’t shown here.
This diff is large: its 120 lines aren’t shown here.
This diff is large: its 77 lines aren’t shown here.
This diff is large: its 929 lines aren’t shown here.
This diff is large: its 529 lines aren’t shown here.
This diff is large: its 570 lines aren’t shown here.
This diff is large: its 928 lines aren’t shown here.
This diff is large: its 1932 lines aren’t shown here.
This diff is large: its 73 lines aren’t shown here.
This diff is large: its 150 lines aren’t shown here.
This diff is large: its 280 lines aren’t shown here.
This diff is large: its 94 lines aren’t shown here.
This diff is large: its 108 lines aren’t shown here.
This diff is large: its 58 lines aren’t shown here.
This diff is large: its 55 lines aren’t shown here.
This diff is large: its 190 lines aren’t shown here.
This diff is large: its 89 lines aren’t shown here.
This diff is large: its 399 lines aren’t shown here.
This diff is large: its 641 lines aren’t shown here.
This diff is large: its 54 lines aren’t shown here.
This diff is large: its 18 lines aren’t shown here.
This diff is large: its 111 lines aren’t shown here.
This diff is large: its 735 lines aren’t shown here.
This diff is large: its 139 lines aren’t shown here.
This diff is large: its 242 lines aren’t shown here.
This diff is large: its 226 lines aren’t shown here.
This diff is large: its 124 lines aren’t shown here.
This diff is large: its 23 lines aren’t shown here.
This diff is large: its 82 lines aren’t shown here.
This diff is large: its 94 lines aren’t shown here.
This diff is large: its 219 lines aren’t shown here.
This diff is large: its 111 lines aren’t shown here.
This diff is large: its 603 lines aren’t shown here.
This diff is large: its 43 lines aren’t shown here.
This diff is large: its 46 lines aren’t shown here.
This diff is large: its 105 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 32 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 398 lines aren’t shown here.
This diff is large: its 109 lines aren’t shown here.
This diff is large: its 429 lines aren’t shown here.
This diff is large: its 104 lines aren’t shown here.
This diff is large: its 1133 lines aren’t shown here.
This diff is large: its 67 lines aren’t shown here.
This diff is large: its 26 lines aren’t shown here.
This diff is large: its 176 lines aren’t shown here.
This diff is large: its 178 lines aren’t shown here.
This diff is large: its 13 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 6 lines aren’t shown here.
This diff is large: its 20 lines aren’t shown here.
This diff is large: its 213 lines aren’t shown here.
This diff is large: its 1061 lines aren’t shown here.
This diff is large: its 60 lines aren’t shown here.
This diff is large: its 1029 lines aren’t shown here.
This diff is large: its 148 lines aren’t shown here.
This diff is large: its 23 lines aren’t shown here.
This diff is large: its 23 lines aren’t shown here.
This diff is large: its 22 lines aren’t shown here.
This diff is large: its 58 lines aren’t shown here.
This diff is large: its 173 lines aren’t shown here.
This diff is large: its 139 lines aren’t shown here.
This diff is large: its 28 lines aren’t shown here.
This diff is large: its 1573 lines aren’t shown here.
This diff is large: its 57 lines aren’t shown here.
This diff is large: its 18 lines aren’t shown here.
This diff is large: its 14 lines aren’t shown here.
This diff is large: its 5 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 328 lines aren’t shown here.
This diff is large: its 10 lines aren’t shown here.
This diff is large: its 104 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 62 lines aren’t shown here.
This diff is large: its 31 lines aren’t shown here.
This diff is large: its 165 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 65 lines aren’t shown here.
This diff is large: its 218 lines aren’t shown here.
This diff is large: its 51 lines aren’t shown here.
This diff is large: its 85 lines aren’t shown here.
This diff is large: its 15 lines aren’t shown here.
This diff is large: its 14 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 61 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 155 lines aren’t shown here.
This diff is large: its 61 lines aren’t shown here.
This diff is large: its 138 lines aren’t shown here.
This diff is large: its 106 lines aren’t shown here.
This diff is large: its 182 lines aren’t shown here.
This diff is large: its 56 lines aren’t shown here.
This diff is large: its 43 lines aren’t shown here.
This diff is large: its 40 lines aren’t shown here.
This diff is large: its 30 lines aren’t shown here.
This diff is large: its 327 lines aren’t shown here.
This diff is large: its 34 lines aren’t shown here.
This diff is large: its 54 lines aren’t shown here.
This diff is large: its 54 lines aren’t shown here.
This diff is large: its 89 lines aren’t shown here.
This diff is large: its 57 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 33 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 25 lines aren’t shown here.
This diff is large: its 18 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 49 lines aren’t shown here.
This diff is large: its 27 lines aren’t shown here.
This diff is large: its 31 lines aren’t shown here.
This diff is large: its 102 lines aren’t shown here.
This diff is large: its 98 lines aren’t shown here.
This diff is large: its 73 lines aren’t shown here.
This diff is large: its 16 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 75 lines aren’t shown here.
This diff is large: its 255 lines aren’t shown here.
This diff is large: its 25 lines aren’t shown here.
This diff is large: its 73 lines aren’t shown here.
This diff is large: its 77 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 68 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 300 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 18 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 23 lines aren’t shown here.
This diff is large: its 40 lines aren’t shown here.
This diff is large: its 27 lines aren’t shown here.
This diff is large: its 25 lines aren’t shown here.
This diff is large: its 188 lines aren’t shown here.
This diff is large: its 216 lines aren’t shown here.
This diff is large: its 378 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 309 lines aren’t shown here.
This diff is large: its 46 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 115 lines aren’t shown here.
This diff is large: its 19 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 79 lines aren’t shown here.
This diff is large: its 65 lines aren’t shown here.
This diff is large: its 40 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 81 lines aren’t shown here.
This diff is large: its 41 lines aren’t shown here.
This diff is large: its 28 lines aren’t shown here.
This diff is large: its 64 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 29 lines aren’t shown here.
This diff is large: its 25 lines aren’t shown here.
This diff is large: its 100 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 104 lines aren’t shown here.
This diff is large: its 51 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 113 lines aren’t shown here.
This diff is large: its 76 lines aren’t shown here.
This diff is large: its 17 lines aren’t shown here.
This diff is large: its 192 lines aren’t shown here.
This diff is large: its 28 lines aren’t shown here.
This diff is large: its 20 lines aren’t shown here.
This diff is large: its 19 lines aren’t shown here.
This diff is large: its 13 lines aren’t shown here.
This diff is large: its 21 lines aren’t shown here.
This diff is large: its 141 lines aren’t shown here.
This diff is large: its 58 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 123 lines aren’t shown here.
This diff is large: its 26 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 64 lines aren’t shown here.
This diff is large: its 152 lines aren’t shown here.
This diff is large: its 51 lines aren’t shown here.
This diff is large: its 19 lines aren’t shown here.
This diff is large: its 35 lines aren’t shown here.
This diff is large: its 62 lines aren’t shown here.
This diff is large: its 37 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 37 lines aren’t shown here.
This diff is large: its 17 lines aren’t shown here.
This diff is large: its 18 lines aren’t shown here.
This diff is large: its 188 lines aren’t shown here.
This diff is large: its 22 lines aren’t shown here.
This diff is large: its 28 lines aren’t shown here.
This diff is large: its 49 lines aren’t shown here.
This diff is large: its 146 lines aren’t shown here.
This diff is large: its 17 lines aren’t shown here.
This diff is large: its 81 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 35 lines aren’t shown here.
This diff is large: its 83 lines aren’t shown here.
This diff is large: its 99 lines aren’t shown here.
This diff is large: its 43 lines aren’t shown here.
This diff is large: its 17 lines aren’t shown here.
This diff is large: its 12 lines aren’t shown here.
This diff is large: its 73 lines aren’t shown here.
This diff is large: its 74 lines aren’t shown here.
This diff is large: its 196 lines aren’t shown here.
This diff is large: its 343 lines aren’t shown here.
This diff is large: its 118 lines aren’t shown here.
This diff is large: its 65 lines aren’t shown here.
This diff is large: its 16 lines aren’t shown here.
This diff is large: its 16 lines aren’t shown here.
This diff is large: its 37 lines aren’t shown here.
This diff is large: its 119 lines aren’t shown here.
This diff is large: its 231 lines aren’t shown here.
This diff is large: its 16 lines aren’t shown here.
This diff is large: its 16 lines aren’t shown here.
This diff is large: its 81 lines aren’t shown here.
This diff is large: its 12 lines aren’t shown here.
This diff is large: its 125 lines aren’t shown here.
This diff is large: its 16 lines aren’t shown here.
This diff is large: its 209 lines aren’t shown here.
This diff is large: its 19 lines aren’t shown here.
This diff is large: its 43 lines aren’t shown here.
This diff is large: its 43 lines aren’t shown here.
This diff is large: its 16 lines aren’t shown here.
This diff is large: its 202 lines aren’t shown here.
This diff is large: its 70 lines aren’t shown here.
This diff is large: its 21 lines aren’t shown here.
This diff is large: its 177 lines aren’t shown here.
This diff is large: its 64 lines aren’t shown here.
This diff is large: its 581 lines aren’t shown here.
This diff is large: its 365 lines aren’t shown here.
This diff is large: its 140 lines aren’t shown here.
This diff is large: its 188 lines aren’t shown here.
This diff is large: its 169 lines aren’t shown here.
This diff is large: its 113 lines aren’t shown here.
This diff is large: its 46 lines aren’t shown here.
This diff is large: its 75 lines aren’t shown here.
This diff is large: its 160 lines aren’t shown here.
This diff is large: its 112 lines aren’t shown here.
This diff is large: its 24 lines aren’t shown here.
This diff is large: its 31 lines aren’t shown here.
This diff is large: its 51 lines aren’t shown here.
This diff is large: its 25 lines aren’t shown here.
This diff is large: its 19 lines aren’t shown here.
This diff is large: its 123 lines aren’t shown here.
This diff is large: its 86 lines aren’t shown here.
This diff is large: its 111 lines aren’t shown here.
This diff is large: its 101 lines aren’t shown here.
This diff is large: its 101 lines aren’t shown here.
This diff is large: its 115 lines aren’t shown here.
This diff is large: its 137 lines aren’t shown here.
This diff is large: its 20 lines aren’t shown here.
This diff is large: its 17 lines aren’t shown here.
This diff is large: its 10 lines aren’t shown here.
This diff is large: its 10 lines aren’t shown here.
This diff is large: its 90 lines aren’t shown here.
This diff is large: its 148 lines aren’t shown here.
This diff is large: its 127 lines aren’t shown here.
This diff is large: its 13 lines aren’t shown here.
This diff is large: its 53 lines aren’t shown here.
This diff is large: its 178 lines aren’t shown here.
This diff is large: its 120 lines aren’t shown here.
This diff is large: its 36 lines aren’t shown here.
This diff is large: its 285 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 21 lines aren’t shown here.
This diff is large: its 72 lines aren’t shown here.
This diff is large: its 60 lines aren’t shown here.
This diff is large: its 76 lines aren’t shown here.
This diff is large: its 39 lines aren’t shown here.
This diff is large: its 492 lines aren’t shown here.
This diff is large: its 234 lines aren’t shown here.
This diff is large: its 16 lines aren’t shown here.
This diff is large: its 51 lines aren’t shown here.
This diff is large: its 1221 lines aren’t shown here.
This diff is large: its 10 lines aren’t shown here.
This diff is large: its 69 lines aren’t shown here.
This diff is large: its 10 lines aren’t shown here.
This diff is large: its 378 lines aren’t shown here.
This diff is large: its 19 lines aren’t shown here.
This diff is large: its 58 lines aren’t shown here.
This diff is large: its 28 lines aren’t shown here.
This diff is large: its 42 lines aren’t shown here.
This diff is large: its 30 lines aren’t shown here.
This diff is large: its 62 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 95 lines aren’t shown here.
This diff is large: its 95 lines aren’t shown here.
This diff is large: its 12 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 468 lines aren’t shown here.
This diff is large: its 17 lines aren’t shown here.
This diff is large: its 24 lines aren’t shown here.
This diff is large: its 66 lines aren’t shown here.
This diff is large: its 22 lines aren’t shown here.
This diff is large: its 66 lines aren’t shown here.
This diff is large: its 13 lines aren’t shown here.
This diff is large: its 269 lines aren’t shown here.
This diff is large: its 26 lines aren’t shown here.
This diff is large: its 2747 lines aren’t shown here.
This diff is large: its 71 lines aren’t shown here.
This diff is large: its 63 lines aren’t shown here.
This diff is large: its 80 lines aren’t shown here.
This diff is large: its 72 lines aren’t shown here.
This diff is large: its 431 lines aren’t shown here.
This diff is large: its 98 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 18 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 26 lines aren’t shown here.
This diff is large: its 18 lines aren’t shown here.
This diff is large: its 41 lines aren’t shown here.
This diff is large: its 49 lines aren’t shown here.
This diff is large: its 10 lines aren’t shown here.
This diff is large: its 94 lines aren’t shown here.
This diff is large: its 19 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 109 lines aren’t shown here.
This diff is large: its 111 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 80 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 62 lines aren’t shown here.
This diff is large: its 30 lines aren’t shown here.
This diff is large: its 24 lines aren’t shown here.
This diff is large: its 80 lines aren’t shown here.
This diff is large: its 73 lines aren’t shown here.
This diff is large: its 10 lines aren’t shown here.
This diff is large: its 73 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 10 lines aren’t shown here.
This diff is large: its 18 lines aren’t shown here.
This diff is large: its 59 lines aren’t shown here.
This diff is large: its 58 lines aren’t shown here.
This diff is large: its 24 lines aren’t shown here.
This diff is large: its 230 lines aren’t shown here.
This diff is large: its 174 lines aren’t shown here.
This diff is large: its 20 lines aren’t shown here.
This diff is large: its 111 lines aren’t shown here.
This diff is large: its 314 lines aren’t shown here.
This diff is large: its 16 lines aren’t shown here.
This diff is large: its 50 lines aren’t shown here.
This diff is large: its 40 lines aren’t shown here.
This diff is large: its 481 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 93 lines aren’t shown here.
This diff is large: its 203 lines aren’t shown here.
This diff is large: its 147 lines aren’t shown here.
This diff is large: its 212 lines aren’t shown here.
This diff is large: its 146 lines aren’t shown here.
This diff is large: its 83 lines aren’t shown here.
This diff is large: its 47 lines aren’t shown here.
This diff is large: its 67 lines aren’t shown here.
This diff is large: its 183 lines aren’t shown here.
This diff is large: its 99 lines aren’t shown here.
This diff is large: its 70 lines aren’t shown here.
This diff is large: its 121 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 44 lines aren’t shown here.
This diff is large: its 108 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 10 lines aren’t shown here.
This diff is large: its 26 lines aren’t shown here.
This diff is large: its 28 lines aren’t shown here.
This diff is large: its 81 lines aren’t shown here.
This diff is large: its 43 lines aren’t shown here.
This diff is large: its 121 lines aren’t shown here.
This diff is large: its 81 lines aren’t shown here.
This diff is large: its 39 lines aren’t shown here.
This diff is large: its 60 lines aren’t shown here.
File renamed without changes.
This diff is large: its 31 lines aren’t shown here.
This diff is large: its 26 lines aren’t shown here.
This diff is large: its 29 lines aren’t shown here.
This diff is large: its 26 lines aren’t shown here.
This diff is large: its 19 lines aren’t shown here.
This diff is large: its 53 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 19 lines aren’t shown here.
This diff is large: its 186 lines aren’t shown here.
This diff is large: its 235 lines aren’t shown here.
This diff is large: its 24 lines aren’t shown here.
This diff is large: its 80 lines aren’t shown here.
This diff is large: its 6 lines aren’t shown here.
This diff is large: its 6 lines aren’t shown here.
This diff is large: its 38 lines aren’t shown here.
This diff is large: its 129 lines aren’t shown here.
This diff is large: its 69 lines aren’t shown here.
This diff is large: its 16 lines aren’t shown here.
This diff is large: its 144 lines aren’t shown here.
This diff is large: its 40 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 57 lines aren’t shown here.
This diff is large: its 19 lines aren’t shown here.
This diff is large: its 98 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 14 lines aren’t shown here.
This diff is large: its 88 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 68 lines aren’t shown here.
This diff is large: its 13 lines aren’t shown here.
This diff is large: its 15 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 173 lines aren’t shown here.
This diff is large: its 84 lines aren’t shown here.
This diff is large: its 115 lines aren’t shown here.
This diff is large: its 86 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 46 lines aren’t shown here.
This diff is large: its 86 lines aren’t shown here.
This diff is large: its 78 lines aren’t shown here.
This diff is large: its 36 lines aren’t shown here.
This diff is large: its 14 lines aren’t shown here.
This diff is large: its 18 lines aren’t shown here.
This diff is large: its 89 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 45 lines aren’t shown here.
This diff is large: its 79 lines aren’t shown here.
This diff is large: its 26 lines aren’t shown here.
This diff is large: its 72 lines aren’t shown here.
This diff is large: its 36 lines aren’t shown here.
This diff is large: its 65 lines aren’t shown here.
This diff is large: its 57 lines aren’t shown here.
This diff is large: its 172 lines aren’t shown here.
This diff is large: its 53 lines aren’t shown here.
This diff is large: its 68 lines aren’t shown here.
This diff is large: its 68 lines aren’t shown here.
This diff is large: its 57 lines aren’t shown here.
This diff is large: its 82 lines aren’t shown here.
This diff is large: its 69 lines aren’t shown here.
This diff is large: its 42 lines aren’t shown here.
This diff is large: its 76 lines aren’t shown here.
This diff is large: its 42 lines aren’t shown here.
This diff is large: its 43 lines aren’t shown here.
This diff is large: its 65 lines aren’t shown here.
This diff is large: its 70 lines aren’t shown here.
This diff is large: its 73 lines aren’t shown here.
This diff is large: its 33 lines aren’t shown here.
This diff is large: its 70 lines aren’t shown here.
This diff is large: its 57 lines aren’t shown here.
This diff is large: its 51 lines aren’t shown here.
This diff is large: its 87 lines aren’t shown here.
This diff is large: its 71 lines aren’t shown here.
This diff is large: its 189 lines aren’t shown here.
This diff is large: its 19 lines aren’t shown here.
This diff is large: its 199 lines aren’t shown here.
This diff is large: its 37 lines aren’t shown here.
This diff is large: its 66 lines aren’t shown here.
This diff is large: its 224 lines aren’t shown here.
This diff is large: its 23 lines aren’t shown here.
This diff is large: its 12 lines aren’t shown here.
This diff is large: its 109 lines aren’t shown here.
This diff is large: its 14 lines aren’t shown here.
This diff is large: its 978 lines aren’t shown here.
This diff is large: its 1913 lines aren’t shown here.
This diff is large: its 326 lines aren’t shown here.
This diff is large: its 91 lines aren’t shown here.
This diff is large: its 29 lines aren’t shown here.
This diff is large: its 24 lines aren’t shown here.
This diff is large: its 192 lines aren’t shown here.
This diff is large: its 90 lines aren’t shown here.
This diff is large: its 93 lines aren’t shown here.
This diff is large: its 164 lines aren’t shown here.
This diff is large: its 171 lines aren’t shown here.
This diff is large: its 169 lines aren’t shown here.
This diff is large: its 119 lines aren’t shown here.
This diff is large: its 264 lines aren’t shown here.
This diff is large: its 286 lines aren’t shown here.
This diff is large: its 186 lines aren’t shown here.
This diff is large: its 354 lines aren’t shown here.
This diff is large: its 66 lines aren’t shown here.
This diff is large: its 81 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 64 lines aren’t shown here.
This diff is large: its 33 lines aren’t shown here.
This diff is large: its 51 lines aren’t shown here.
This diff is large: its 61 lines aren’t shown here.
This diff is large: its 30 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 29 lines aren’t shown here.
This diff is large: its 19 lines aren’t shown here.
This diff is large: its 137 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 240 lines aren’t shown here.
This diff is large: its 103 lines aren’t shown here.
This diff is large: its 15 lines aren’t shown here.
This diff is large: its 123 lines aren’t shown here.
This diff is large: its 88 lines aren’t shown here.
This diff is large: its 156 lines aren’t shown here.
This diff is large: its 47 lines aren’t shown here.
This diff is large: its 1412 lines aren’t shown here.
This diff is large: its 1207 lines aren’t shown here.
This diff is large: its 202 lines aren’t shown here.
This diff is large: its 38 lines aren’t shown here.
This diff is large: its 41 lines aren’t shown here.
This diff is large: its 18 lines aren’t shown here.
This diff is large: its 44 lines aren’t shown here.
This diff is large: its 255 lines aren’t shown here.
This diff is large: its 12 lines aren’t shown here.
This diff is large: its 73 lines aren’t shown here.
This diff is large: its 25 lines aren’t shown here.
This diff is large: its 20 lines aren’t shown here.
This diff is large: its 17 lines aren’t shown here.
This diff is large: its 26 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 56 lines aren’t shown here.
This diff is large: its 25 lines aren’t shown here.
This diff is large: its 28 lines aren’t shown here.
This diff is large: its 22 lines aren’t shown here.
This diff is large: its 69 lines aren’t shown here.
This diff is large: its 30 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 228 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 38 lines aren’t shown here.
This diff is large: its 34 lines aren’t shown here.
This diff is large: its 14 lines aren’t shown here.
This diff is large: its 246 lines aren’t shown here.
This diff is large: its 20 lines aren’t shown here.
This diff is large: its 23 lines aren’t shown here.
This diff is large: its 12 lines aren’t shown here.
This diff is large: its 31 lines aren’t shown here.
This diff is large: its 156 lines aren’t shown here.
This diff is large: its 62 lines aren’t shown here.
This diff is large: its 38 lines aren’t shown here.
This diff is large: its 190 lines aren’t shown here.
This diff is large: its 229 lines aren’t shown here.
This diff is large: its 88 lines aren’t shown here.
This diff is large: its 109 lines aren’t shown here.
This diff is large: its 35 lines aren’t shown here.
This diff is large: its 38 lines aren’t shown here.
This diff is large: its 90 lines aren’t shown here.
This diff is large: its 41 lines aren’t shown here.
This diff is large: its 93 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 80 lines aren’t shown here.
This diff is large: its 18 lines aren’t shown here.
This diff is large: its 17 lines aren’t shown here.
This diff is large: its 24 lines aren’t shown here.
This diff is large: its 13 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 42 lines aren’t shown here.
This diff is large: its 12 lines aren’t shown here.
This diff is large: its 34 lines aren’t shown here.
This diff is large: its 364 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 29 lines aren’t shown here.
This diff is large: its 14 lines aren’t shown here.
This diff is large: its 12 lines aren’t shown here.
This diff is large: its 35 lines aren’t shown here.
This diff is large: its 35 lines aren’t shown here.
This diff is large: its 54 lines aren’t shown here.
This diff is large: its 29 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 55 lines aren’t shown here.
This diff is large: its 152 lines aren’t shown here.
This diff is large: its 118 lines aren’t shown here.
This diff is large: its 18 lines aren’t shown here.
This diff is large: its 327 lines aren’t shown here.
This diff is large: its 26 lines aren’t shown here.
This diff is large: its 19 lines aren’t shown here.
This diff is large: its 103 lines aren’t shown here.
This diff is large: its 26 lines aren’t shown here.
This diff is large: its 6 lines aren’t shown here.
This diff is large: its 5 lines aren’t shown here.
This diff is large: its 49 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 35 lines aren’t shown here.
This diff is large: its 10 lines aren’t shown here.
This diff is large: its 47 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 31 lines aren’t shown here.
This diff is large: its 20 lines aren’t shown here.
This diff is large: its 49 lines aren’t shown here.
This diff is large: its 100 lines aren’t shown here.
This diff is large: its 68 lines aren’t shown here.
This diff is large: its 96 lines aren’t shown here.
This diff is large: its 28 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 142 lines aren’t shown here.
This diff is large: its 13 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 59 lines aren’t shown here.
This diff is large: its 21 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 97 lines aren’t shown here.
This diff is large: its 26 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 7 lines aren’t shown here.
This diff is large: its 65 lines aren’t shown here.
This diff is large: its 137 lines aren’t shown here.
This diff is large: its 48 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 97 lines aren’t shown here.
This diff is large: its 86 lines aren’t shown here.
This diff is large: its 86 lines aren’t shown here.
This diff is large: its 95 lines aren’t shown here.
This diff is large: its 86 lines aren’t shown here.
This diff is large: its 86 lines aren’t shown here.
This diff is large: its 111 lines aren’t shown here.
This diff is large: its 120 lines aren’t shown here.
This diff is large: its 154 lines aren’t shown here.
This diff is large: its 91 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 21 lines aren’t shown here.
This diff is large: its 19 lines aren’t shown here.
This diff is large: its 19 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 38 lines aren’t shown here.
This diff is large: its 23 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 114 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 122 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 92 lines aren’t shown here.
This diff is large: its 278 lines aren’t shown here.
This diff is large: its 10 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 10 lines aren’t shown here.
This diff is large: its 51 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 301 lines aren’t shown here.
This diff is large: its 10 lines aren’t shown here.
This diff is large: its 18 lines aren’t shown here.
This diff is large: its 62 lines aren’t shown here.
This diff is large: its 87 lines aren’t shown here.
This diff is large: its 26 lines aren’t shown here.
This diff is large: its 26 lines aren’t shown here.
This diff is large: its 26 lines aren’t shown here.
This diff is large: its 26 lines aren’t shown here.
This diff is large: its 26 lines aren’t shown here.
This diff is large: its 26 lines aren’t shown here.
This diff is large: its 26 lines aren’t shown here.
This diff is large: its 26 lines aren’t shown here.
This diff is large: its 26 lines aren’t shown here.
This diff is large: its 26 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 47 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 75 lines aren’t shown here.
This diff is large: its 42 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 15 lines aren’t shown here.
This diff is large: its 94 lines aren’t shown here.
This diff is large: its 87 lines aren’t shown here.
This diff is large: its 1052 lines aren’t shown here.
This diff is large: its 17 lines aren’t shown here.
This diff is large: its 17 lines aren’t shown here.
This diff is large: its 17 lines aren’t shown here.
This diff is large: its 1062 lines aren’t shown here.
This diff is large: its 1401 lines aren’t shown here.
This diff is large: its 1496 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 65 lines aren’t shown here.
This diff is large: its 59 lines aren’t shown here.
This diff is large: its 73 lines aren’t shown here.
This diff is large: its 73 lines aren’t shown here.
This diff is large: its 85 lines aren’t shown here.
This diff is large: its 60 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 15 lines aren’t shown here.
This diff is large: its 94 lines aren’t shown here.
This diff is large: its 68 lines aren’t shown here.
This diff is large: its 1105 lines aren’t shown here.
This diff is large: its 18 lines aren’t shown here.
This diff is large: its 18 lines aren’t shown here.
This diff is large: its 1114 lines aren’t shown here.
This diff is large: its 1406 lines aren’t shown here.
This diff is large: its 7 lines aren’t shown here.
This diff is large: its 7 lines aren’t shown here.
This diff is large: its 1507 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 65 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 62 lines aren’t shown here.
This diff is large: its 33 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 33 lines aren’t shown here.
This diff is large: its 72 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 15 lines aren’t shown here.
This diff is large: its 95 lines aren’t shown here.
This diff is large: its 44 lines aren’t shown here.
This diff is large: its 94 lines aren’t shown here.
This diff is large: its 163 lines aren’t shown here.
This diff is large: its 56 lines aren’t shown here.
This diff is large: its 7 lines aren’t shown here.
This diff is large: its 59 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 5 lines aren’t shown here.
This diff is large: its 42 lines aren’t shown here.
This diff is large: its 42 lines aren’t shown here.
This diff is large: its 419 lines aren’t shown here.
This diff is large: its 42 lines aren’t shown here.
This diff is large: its 18 lines aren’t shown here.
This diff is large: its 69 lines aren’t shown here.
This diff is large: its 42 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 15 lines aren’t shown here.
This diff is large: its 93 lines aren’t shown here.
This diff is large: its 57 lines aren’t shown here.
This diff is large: its 51 lines aren’t shown here.
This diff is large: its 17 lines aren’t shown here.
This diff is large: its 153 lines aren’t shown here.
This diff is large: its 17 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 59 lines aren’t shown here.
This diff is large: its 78 lines aren’t shown here.
This diff is large: its 32 lines aren’t shown here.
This diff is large: its 15 lines aren’t shown here.
This diff is large: its 94 lines aren’t shown here.
This diff is large: its 53 lines aren’t shown here.
This diff is large: its 542 lines aren’t shown here.
This diff is large: its 19 lines aren’t shown here.
This diff is large: its 1826 lines aren’t shown here.
This diff is large: its 2112 lines aren’t shown here.
This diff is large: its 10 lines aren’t shown here.
This diff is large: its 65 lines aren’t shown here.
This diff is large: its 118 lines aren’t shown here.
This diff is large: its 118 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 17 lines aren’t shown here.
This diff is large: its 79 lines aren’t shown here.
This diff is large: its 91 lines aren’t shown here.
This diff is large: its 22 lines aren’t shown here.
This diff is large: its 22 lines aren’t shown here.
This diff is large: its 22 lines aren’t shown here.
This diff is large: its 22 lines aren’t shown here.
This diff is large: its 22 lines aren’t shown here.
This diff is large: its 41 lines aren’t shown here.
This diff is large: its 19 lines aren’t shown here.
This diff is large: its 19 lines aren’t shown here.
This diff is large: its 19 lines aren’t shown here.
This diff is large: its 19 lines aren’t shown here.
This diff is large: its 19 lines aren’t shown here.
This diff is large: its 365 lines aren’t shown here.
This diff is large: its 16 lines aren’t shown here.
This diff is large: its 27 lines aren’t shown here.
This diff is large: its 71 lines aren’t shown here.
This diff is large: its 26 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 32 lines aren’t shown here.
This diff is large: its 10 lines aren’t shown here.
This diff is large: its 13 lines aren’t shown here.
This diff is large: its 15 lines aren’t shown here.
This diff is large: its 95 lines aren’t shown here.
This diff is large: its 45 lines aren’t shown here.
This diff is large: its 541 lines aren’t shown here.
This diff is large: its 454 lines aren’t shown here.
This diff is large: its 7 lines aren’t shown here.
This diff is large: its 57 lines aren’t shown here.
This diff is large: its 101 lines aren’t shown here.
This diff is large: its 27 lines aren’t shown here.
This diff is large: its 72 lines aren’t shown here.
This diff is large: its 18 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 57 lines aren’t shown here.
This diff is large: its 351 lines aren’t shown here.
This diff is large: its 28 lines aren’t shown here.
This diff is large: its 20 lines aren’t shown here.
This diff is large: its 62 lines aren’t shown here.
This diff is large: its 78 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 7 lines aren’t shown here.
This diff is large: its 20 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 23 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 20 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 95 lines aren’t shown here.
This diff is large: its 40 lines aren’t shown here.
This diff is large: its 12 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 12 lines aren’t shown here.
This diff is large: its 13 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 54 lines aren’t shown here.
This diff is large: its 14 lines aren’t shown here.
This diff is large: its 27 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 84 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 25 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 40 lines aren’t shown here.
This diff is large: its 98 lines aren’t shown here.
This diff is large: its 384 lines aren’t shown here.
This diff is large: its 138 lines aren’t shown here.
This diff is large: its 157 lines aren’t shown here.
This diff is large: its 160 lines aren’t shown here.
This diff is large: its 115 lines aren’t shown here.
This diff is large: its 387 lines aren’t shown here.
This diff is large: its 208 lines aren’t shown here.
This diff is large: its 34 lines aren’t shown here.
This diff is large: its 12 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 45 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 130 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 114 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 35 lines aren’t shown here.
This diff is large: its 52 lines aren’t shown here.
This diff is large: its 25 lines aren’t shown here.
This diff is large: its 24 lines aren’t shown here.
This diff is large: its 22 lines aren’t shown here.
This diff is large: its 24 lines aren’t shown here.
This diff is large: its 25 lines aren’t shown here.
This diff is large: its 95 lines aren’t shown here.
This diff is large: its 63 lines aren’t shown here.
This diff is large: its 48 lines aren’t shown here.
This diff is large: its 102 lines aren’t shown here.
This diff is large: its 62 lines aren’t shown here.
This diff is large: its 98 lines aren’t shown here.
This diff is large: its 38 lines aren’t shown here.
This diff is large: its 42 lines aren’t shown here.
This diff is large: its 151 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 59 lines aren’t shown here.
This diff is large: its 32 lines aren’t shown here.
This diff is large: its 35 lines aren’t shown here.
This diff is large: its 12 lines aren’t shown here.
This diff is large: its 7 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 54 lines aren’t shown here.
This diff is large: its 546 lines aren’t shown here.
This diff is large: its 15 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 237 lines aren’t shown here.
This diff is large: its 42 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 23 lines aren’t shown here.
This diff is large: its 110 lines aren’t shown here.
This diff is large: its 464 lines aren’t shown here.
This diff is large: its 13 lines aren’t shown here.
This diff is large: its 6 lines aren’t shown here.
This diff is large: its 106 lines aren’t shown here.
This diff is large: its 6 lines aren’t shown here.
This diff is large: its 58 lines aren’t shown here.
This diff is large: its 16 lines aren’t shown here.
This diff is large: its 34 lines aren’t shown here.
This diff is large: its 12 lines aren’t shown here.
File renamed without changes.
This diff is large: its 95 lines aren’t shown here.
This diff is large: its 26 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 26 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 18 lines aren’t shown here.
This diff is large: its 49 lines aren’t shown here.
This diff is large: its 120 lines aren’t shown here.
This diff is large: its 48 lines aren’t shown here.
This diff is large: its 34 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 28 lines aren’t shown here.
This diff is large: its 15 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 54 lines aren’t shown here.
This diff is large: its 10 lines aren’t shown here.
This diff is large: its 223 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 18 lines aren’t shown here.
This diff is large: its 79 lines aren’t shown here.
This diff is large: its 17 lines aren’t shown here.
This diff is large: its 43 lines aren’t shown here.
This diff is large: its 32 lines aren’t shown here.
This diff is large: its 28 lines aren’t shown here.
This diff is large: its 42 lines aren’t shown here.
This diff is large: its 14 lines aren’t shown here.
This diff is large: its 24 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 122 lines aren’t shown here.
This diff is large: its 61 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 89 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 51 lines aren’t shown here.
This diff is large: its 29 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 184 lines aren’t shown here.
This diff is large: its 98 lines aren’t shown here.
This diff is large: its 32 lines aren’t shown here.
This diff is large: its 61 lines aren’t shown here.
This diff is large: its 18 lines aren’t shown here.
This diff is large: its 78 lines aren’t shown here.
This diff is large: its 19 lines aren’t shown here.
This diff is large: its 59 lines aren’t shown here.
This diff is large: its 24 lines aren’t shown here.
This diff is large: its 57 lines aren’t shown here.
This diff is large: its 22 lines aren’t shown here.
This diff is large: its 39 lines aren’t shown here.
This diff is large: its 23 lines aren’t shown here.
This diff is large: its 37 lines aren’t shown here.
This diff is large: its 198 lines aren’t shown here.
This diff is large: its 188 lines aren’t shown here.
This diff is large: its 99 lines aren’t shown here.
This diff is large: its 119 lines aren’t shown here.
This diff is large: its 24 lines aren’t shown here.
This diff is large: its 58 lines aren’t shown here.
This diff is large: its 207 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 20 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 7 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 28 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 49 lines aren’t shown here.
This diff is large: its 234 lines aren’t shown here.
This diff is large: its 97 lines aren’t shown here.
This diff is large: its 24 lines aren’t shown here.
This diff is large: its 57 lines aren’t shown here.
This diff is large: its 27 lines aren’t shown here.
This diff is large: its 37 lines aren’t shown here.
This diff is large: its 33 lines aren’t shown here.
This diff is large: its 26 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 55 lines aren’t shown here.
This diff is large: its 10 lines aren’t shown here.
This diff is large: its 15 lines aren’t shown here.
This diff is large: its 29 lines aren’t shown here.
This diff is large: its 18 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 15 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 55 lines aren’t shown here.
This diff is large: its 87 lines aren’t shown here.
This diff is large: its 40 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 31 lines aren’t shown here.
This diff is large: its 14 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 16 lines aren’t shown here.
This diff is large: its 14 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 819 lines aren’t shown here.
This diff is large: its 158 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 16 lines aren’t shown here.
This diff is large: its 23 lines aren’t shown here.
This diff is large: its 49 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 35 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 10 lines aren’t shown here.
This diff is large: its 15 lines aren’t shown here.
This diff is large: its 33 lines aren’t shown here.
This diff is large: its 25 lines aren’t shown here.
This diff is large: its 113 lines aren’t shown here.
This diff is large: its 31 lines aren’t shown here.
This diff is large: its 36 lines aren’t shown here.
This diff is large: its 45 lines aren’t shown here.
This diff is large: its 245 lines aren’t shown here.
This diff is large: its 238 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 16 lines aren’t shown here.
This diff is large: its 296 lines aren’t shown here.
This diff is large: its 299 lines aren’t shown here.
This diff is large: its 262 lines aren’t shown here.
This diff is large: its 276 lines aren’t shown here.
This diff is large: its 15 lines aren’t shown here.
This diff is large: its 24 lines aren’t shown here.
This diff is large: its 261 lines aren’t shown here.
This diff is large: its 16 lines aren’t shown here.
This diff is large: its 298 lines aren’t shown here.
This diff is large: its 361 lines aren’t shown here.
This diff is large: its 252 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 27 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 19 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 36 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 18 lines aren’t shown here.
This diff is large: its 17 lines aren’t shown here.
This diff is large: its 35 lines aren’t shown here.
This diff is large: its 32 lines aren’t shown here.
This diff is large: its 13 lines aren’t shown here.
This diff is large: its 34 lines aren’t shown here.
This diff is large: its 17 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 29 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 55 lines aren’t shown here.
This diff is large: its 12 lines aren’t shown here.
This diff is large: its 67 lines aren’t shown here.
This diff is large: its 26 lines aren’t shown here.
This diff is large: its 19 lines aren’t shown here.
This diff is large: its 83 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 22 lines aren’t shown here.
This diff is large: its 16 lines aren’t shown here.
This diff is large: its 19 lines aren’t shown here.
This diff is large: its 16 lines aren’t shown here.
This diff is large: its 21 lines aren’t shown here.
This diff is large: its 15 lines aren’t shown here.
This diff is large: its 24 lines aren’t shown here.
This diff is large: its 10 lines aren’t shown here.
This diff is large: its 23 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 113 lines aren’t shown here.
This diff is large: its 13 lines aren’t shown here.
This diff is large: its 228 lines aren’t shown here.
This diff is large: its 100 lines aren’t shown here.
This diff is large: its 44 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 6 lines aren’t shown here.
This diff is large: its 27 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 31 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 35 lines aren’t shown here.
This diff is large: its 47 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 6 lines aren’t shown here.
This diff is large: its 621 lines aren’t shown here.
This diff is large: its 10 lines aren’t shown here.
This diff is large: its 17 lines aren’t shown here.
This diff is large: its 17 lines aren’t shown here.
This diff is large: its 6 lines aren’t shown here.
This diff is large: its 6 lines aren’t shown here.
This diff is large: its 6 lines aren’t shown here.
This diff is large: its 6 lines aren’t shown here.
This diff is large: its 6 lines aren’t shown here.
This diff is large: its 6 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 12 lines aren’t shown here.
This diff is large: its 42 lines aren’t shown here.
This diff is large: its 43 lines aren’t shown here.
This diff is large: its 22 lines aren’t shown here.
This diff is large: its 24 lines aren’t shown here.
This diff is large: its 90 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 40 lines aren’t shown here.
This diff is large: its 41 lines aren’t shown here.
This diff is large: its 31 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 50 lines aren’t shown here.
This diff is large: its 14 lines aren’t shown here.
This diff is large: its 37 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 26 lines aren’t shown here.
This diff is large: its 111 lines aren’t shown here.
This diff is large: its 26 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 30 lines aren’t shown here.
This diff is large: its 383 lines aren’t shown here.
This diff is large: its 17 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 27 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 27 lines aren’t shown here.
This diff is large: its 28 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 27 lines aren’t shown here.
This diff is large: its 27 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 25 lines aren’t shown here.
This diff is large: its 23 lines aren’t shown here.
This diff is large: its 27 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 27 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 56 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 32 lines aren’t shown here.
This diff is large: its 18 lines aren’t shown here.
This diff is large: its 17 lines aren’t shown here.
This diff is large: its 55 lines aren’t shown here.
This diff is large: its 10 lines aren’t shown here.
This diff is large: its 84 lines aren’t shown here.
This diff is large: its 70 lines aren’t shown here.
This diff is large: its 44 lines aren’t shown here.
This diff is large: its 12 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 25 lines aren’t shown here.
This diff is large: its 32 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 72 lines aren’t shown here.
This diff is large: its 47 lines aren’t shown here.
This diff is large: its 16 lines aren’t shown here.
This diff is large: its 13 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 37 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 108 lines aren’t shown here.
This diff is large: its 14 lines aren’t shown here.
This diff is large: its 76 lines aren’t shown here.
This diff is large: its 224 lines aren’t shown here.
This diff is large: its 327 lines aren’t shown here.
This diff is large: its 151 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 27 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 17 lines aren’t shown here.
This diff is large: its 134 lines aren’t shown here.
This diff is large: its 20 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 347 lines aren’t shown here.
This diff is large: its 30 lines aren’t shown here.
This diff is large: its 392 lines aren’t shown here.
This diff is large: its 20 lines aren’t shown here.
This diff is large: its 15 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 258 lines aren’t shown here.
This diff is large: its 6 lines aren’t shown here.
This diff is large: its 45 lines aren’t shown here.
This diff is large: its 117 lines aren’t shown here.
This diff is large: its 117 lines aren’t shown here.
This diff is large: its 100 lines aren’t shown here.
This diff is large: its 48 lines aren’t shown here.
This diff is large: its 48 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 31 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 17 lines aren’t shown here.
This diff is large: its 28 lines aren’t shown here.
This diff is large: its 25 lines aren’t shown here.
This diff is large: its 21 lines aren’t shown here.
This diff is large: its 46 lines aren’t shown here.
This diff is large: its 52 lines aren’t shown here.
This diff is large: its 6 lines aren’t shown here.
This diff is large: its 30 lines aren’t shown here.
This diff is large: its 62 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 81 lines aren’t shown here.
This diff is large: its 40 lines aren’t shown here.
This diff is large: its 19 lines aren’t shown here.
This diff is large: its 37 lines aren’t shown here.
This diff is large: its 52 lines aren’t shown here.
This diff is large: its 34 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 33 lines aren’t shown here.
This diff is large: its 79 lines aren’t shown here.
This diff is large: its 597 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 153 lines aren’t shown here.
This diff is large: its 317 lines aren’t shown here.
This diff is large: its 72 lines aren’t shown here.
This diff is large: its 758 lines aren’t shown here.
This diff is large: its 61 lines aren’t shown here.
This diff is large: its 56 lines aren’t shown here.
This diff is large: its 17 lines aren’t shown here.
This diff is large: its 108 lines aren’t shown here.
This diff is large: its 56 lines aren’t shown here.
This diff is large: its 430 lines aren’t shown here.
This diff is large: its 184 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 123 lines aren’t shown here.
This diff is large: its 41 lines aren’t shown here.
This diff is large: its 87 lines aren’t shown here.
This diff is large: its 18 lines aren’t shown here.
This diff is large: its 34 lines aren’t shown here.
This diff is large: its 21 lines aren’t shown here.
This diff is large: its 57 lines aren’t shown here.
This diff is large: its 16 lines aren’t shown here.
This diff is large: its 44 lines aren’t shown here.
This diff is large: its 90 lines aren’t shown here.
This diff is large: its 72 lines aren’t shown here.
This diff is large: its 10 lines aren’t shown here.
This diff is large: its 30 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 126 lines aren’t shown here.
This diff is large: its 16 lines aren’t shown here.
This diff is large: its 32 lines aren’t shown here.
This diff is large: its 6 lines aren’t shown here.
This diff is large: its 176 lines aren’t shown here.
This diff is large: its 126 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 47 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 32 lines aren’t shown here.
This diff is large: its 12 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 16 lines aren’t shown here.
This diff is large: its 90 lines aren’t shown here.
This diff is large: its 18 lines aren’t shown here.
This diff is large: its 16 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 62 lines aren’t shown here.
This diff is large: its 6 lines aren’t shown here.
This diff is large: its 84 lines aren’t shown here.
This diff is large: its 32 lines aren’t shown here.
This diff is large: its 20 lines aren’t shown here.
This diff is large: its 43 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 18 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 36 lines aren’t shown here.
This diff is large: its 18 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 21 lines aren’t shown here.
This diff is large: its 103 lines aren’t shown here.
This diff is large: its 134 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 42 lines aren’t shown here.
This diff is large: its 53 lines aren’t shown here.
This diff is large: its 16 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 53 lines aren’t shown here.
This diff is large: its 405 lines aren’t shown here.
This diff is large: its 32 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 36 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 36 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 20 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 282 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 27 lines aren’t shown here.
This diff is large: its 27 lines aren’t shown here.
This diff is large: its 29 lines aren’t shown here.
This diff is large: its 172 lines aren’t shown here.
This diff is large: its 6 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 21 lines aren’t shown here.
This diff is large: its 149 lines aren’t shown here.
This diff is large: its 44 lines aren’t shown here.
This diff is large: its 27 lines aren’t shown here.
This diff is large: its 37 lines aren’t shown here.
This diff is large: its 38 lines aren’t shown here.
This diff is large: its 37 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 72 lines aren’t shown here.
This diff is large: its 36 lines aren’t shown here.
This diff is large: its 36 lines aren’t shown here.
This diff is large: its 19 lines aren’t shown here.
This diff is large: its 27 lines aren’t shown here.
This diff is large: its 20 lines aren’t shown here.
This diff is large: its 25 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 6 lines aren’t shown here.
This diff is large: its 15 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 98 lines aren’t shown here.
This diff is large: its 36 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 6 lines aren’t shown here.
This diff is large: its 108 lines aren’t shown here.
This diff is large: its 80 lines aren’t shown here.
This diff is large: its 36 lines aren’t shown here.
This diff is large: its 72 lines aren’t shown here.
This diff is large: its 72 lines aren’t shown here.
This diff is large: its 27 lines aren’t shown here.
This diff is large: its 27 lines aren’t shown here.
This diff is large: its 90 lines aren’t shown here.
This diff is large: its 40 lines aren’t shown here.
This diff is large: its 54 lines aren’t shown here.
This diff is large: its 116 lines aren’t shown here.
This diff is large: its 27 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 181 lines aren’t shown here.
This diff is large: its 166 lines aren’t shown here.
This diff is large: its 44 lines aren’t shown here.
This diff is large: its 29 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 155 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 28 lines aren’t shown here.
This diff is large: its 14 lines aren’t shown here.
This diff is large: its 30 lines aren’t shown here.
This diff is large: its 73 lines aren’t shown here.
This diff is large: its 273 lines aren’t shown here.
This diff is large: its 138 lines aren’t shown here.
This diff is large: its 111 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 19 lines aren’t shown here.
This diff is large: its 20 lines aren’t shown here.
This diff is large: its 102 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 7 lines aren’t shown here.
This diff is large: its 18 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 7 lines aren’t shown here.
This diff is large: its 14 lines aren’t shown here.
This diff is large: its 13 lines aren’t shown here.
This diff is large: its 174 lines aren’t shown here.
This diff is large: its 22 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 6 lines aren’t shown here.
This diff is large: its 27 lines aren’t shown here.
This diff is large: its 46 lines aren’t shown here.
This diff is large: its 17 lines aren’t shown here.
This diff is large: its 16 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 12 lines aren’t shown here.
This diff is large: its 19 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 20 lines aren’t shown here.
This diff is large: its 13 lines aren’t shown here.
This diff is large: its 10 lines aren’t shown here.
This diff is large: its 26 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 54 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 26 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 82 lines aren’t shown here.
This diff is large: its 44 lines aren’t shown here.
This diff is large: its 20 lines aren’t shown here.
This diff is large: its 162 lines aren’t shown here.
This diff is large: its 66 lines aren’t shown here.
This diff is large: its 82 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 16 lines aren’t shown here.
This diff is large: its 19 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 15 lines aren’t shown here.
This diff is large: its 20 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 233 lines aren’t shown here.
This diff is large: its 19 lines aren’t shown here.
This diff is large: its 36 lines aren’t shown here.
This diff is large: its 25 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 2075 lines aren’t shown here.
This diff is large: its 668 lines aren’t shown here.
This diff is large: its 23 lines aren’t shown here.
This diff is large: its 24 lines aren’t shown here.
This diff is large: its 81 lines aren’t shown here.
This diff is large: its 21 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 13 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 50 lines aren’t shown here.
This diff is large: its 7 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 12 lines aren’t shown here.
This diff is large: its 14 lines aren’t shown here.
This diff is large: its 24 lines aren’t shown here.
This diff is large: its 52 lines aren’t shown here.
This diff is large: its 39 lines aren’t shown here.
This diff is large: its 19 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 17 lines aren’t shown here.
This diff is large: its 105 lines aren’t shown here.
This diff is large: its 244 lines aren’t shown here.
This diff is large: its 61 lines aren’t shown here.
This diff is large: its 21 lines aren’t shown here.
This diff is large: its 10 lines aren’t shown here.
This diff is large: its 13 lines aren’t shown here.
This diff is large: its 19 lines aren’t shown here.
This diff is large: its 76 lines aren’t shown here.
This diff is large: its 14 lines aren’t shown here.
This diff is large: its 10 lines aren’t shown here.
This diff is large: its 26 lines aren’t shown here.
This diff is large: its 30 lines aren’t shown here.
This diff is large: its 96 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 18 lines aren’t shown here.
This diff is large: its 27 lines aren’t shown here.
This diff is large: its 54 lines aren’t shown here.
This diff is large: its 17 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 205 lines aren’t shown here.
This diff is large: its 16 lines aren’t shown here.
This diff is large: its 86 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 16 lines aren’t shown here.
This diff is large: its 30 lines aren’t shown here.
This diff is large: its 212 lines aren’t shown here.
This diff is large: its 50 lines aren’t shown here.
This diff is large: its 24 lines aren’t shown here.
This diff is large: its 35 lines aren’t shown here.
This diff is large: its 2 lines aren’t shown here.
This diff is large: its 13 lines aren’t shown here.
This diff is large: its 12 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 59 lines aren’t shown here.
This diff is large: its 102 lines aren’t shown here.
This diff is large: its 23 lines aren’t shown here.
This diff is large: its 13 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 34 lines aren’t shown here.
This diff is large: its 45 lines aren’t shown here.
This diff is large: its 40 lines aren’t shown here.
This diff is large: its 37 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 129 lines aren’t shown here.
This diff is large: its 37 lines aren’t shown here.
This diff is large: its 102 lines aren’t shown here.
This diff is large: its 18 lines aren’t shown here.
This diff is large: its 220 lines aren’t shown here.
This diff is large: its 22 lines aren’t shown here.
This diff is large: its 120 lines aren’t shown here.
This diff is large: its 12 lines aren’t shown here.
This diff is large: its 374 lines aren’t shown here.
This diff is large: its 93 lines aren’t shown here.
This diff is large: its 259 lines aren’t shown here.
This diff is large: its 568 lines aren’t shown here.
This diff is large: its 188 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 18 lines aren’t shown here.
This diff is large: its 310 lines aren’t shown here.
This diff is large: its 26 lines aren’t shown here.
This diff is large: its 90 lines aren’t shown here.
This diff is large: its 221 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 71 lines aren’t shown here.
This diff is large: its 23 lines aren’t shown here.
This diff is large: its 239 lines aren’t shown here.
This diff is large: its 71 lines aren’t shown here.
This diff is large: its 51 lines aren’t shown here.
This diff is large: its 78 lines aren’t shown here.
This diff is large: its 667 lines aren’t shown here.
This diff is large: its 57 lines aren’t shown here.
This diff is large: its 63 lines aren’t shown here.
This diff is large: its 71 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 17 lines aren’t shown here.
This diff is large: its 17 lines aren’t shown here.
This diff is large: its 70 lines aren’t shown here.
This diff is large: its 45 lines aren’t shown here.
This diff is large: its 10 lines aren’t shown here.
This diff is large: its 227 lines aren’t shown here.
This diff is large: its 27 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 52 lines aren’t shown here.
This diff is large: its 40 lines aren’t shown here.
This diff is large: its 28 lines aren’t shown here.
This diff is large: its 206 lines aren’t shown here.
This diff is large: its 352 lines aren’t shown here.
This diff is large: its 34 lines aren’t shown here.
This diff is large: its 69 lines aren’t shown here.
This diff is large: its 25 lines aren’t shown here.
This diff is large: its 201 lines aren’t shown here.
This diff is large: its 12 lines aren’t shown here.
This diff is large: its 111 lines aren’t shown here.
This diff is large: its 193 lines aren’t shown here.
This diff is large: its 18 lines aren’t shown here.
This diff is large: its 18 lines aren’t shown here.
This diff is large: its 26 lines aren’t shown here.
This diff is large: its 34 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 37 lines aren’t shown here.
This diff is large: its 177 lines aren’t shown here.
This diff is large: its 27 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 32 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 208 lines aren’t shown here.
This diff is large: its 147 lines aren’t shown here.
This diff is large: its 76 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 29 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 15 lines aren’t shown here.
This diff is large: its 958 lines aren’t shown here.
This diff is large: its 34 lines aren’t shown here.
This diff is large: its 10 lines aren’t shown here.
This diff is large: its 741 lines aren’t shown here.
This diff is large: its 105 lines aren’t shown here.
This diff is large: its 319 lines aren’t shown here.
This diff is large: its 1605 lines aren’t shown here.
This diff is large: its 41 lines aren’t shown here.
This diff is large: its 471 lines aren’t shown here.
This diff is large: its 1097 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 122 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 141 lines aren’t shown here.
This diff is large: its 63 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 57 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 29 lines aren’t shown here.
This diff is large: its 343 lines aren’t shown here.
This diff is large: its 75 lines aren’t shown here.
This diff is large: its 87 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 16 lines aren’t shown here.
This diff is large: its 77 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 36 lines aren’t shown here.
This diff is large: its 19 lines aren’t shown here.
This diff is large: its 164 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 22 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 54 lines aren’t shown here.
This diff is large: its 27 lines aren’t shown here.
This diff is large: its 316 lines aren’t shown here.
This diff is large: its 62 lines aren’t shown here.
This diff is large: its 10 lines aren’t shown here.
This diff is large: its 44 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 2 lines aren’t shown here.
This diff is large: its 133 lines aren’t shown here.
This diff is large: its 2 lines aren’t shown here.
This diff is large: its 92 lines aren’t shown here.
This diff is large: its 4 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 669 lines aren’t shown here.
This diff is large: its 166 lines aren’t shown here.
This diff is large: its 5 lines aren’t shown here.
This diff is large: its 160 lines aren’t shown here.
This diff is large: its 184 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 35 lines aren’t shown here.
This diff is large: its 71 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 10 lines aren’t shown here.
This diff is large: its 81 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 380 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 523 lines aren’t shown here.
This diff is large: its 23 lines aren’t shown here.
This diff is large: its 28 lines aren’t shown here.
This diff is large: its 29 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 10 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 106 lines aren’t shown here.
This diff is large: its 21 lines aren’t shown here.
This diff is large: its 14 lines aren’t shown here.
This diff is large: its 17 lines aren’t shown here.
This diff is large: its 430 lines aren’t shown here.
This diff is large: its 631 lines aren’t shown here.
This diff is large: its 15 lines aren’t shown here.
This diff is large: its 62 lines aren’t shown here.
This diff is large: its 50 lines aren’t shown here.
This diff is large: its 484 lines aren’t shown here.
This diff is large: its 320 lines aren’t shown here.
This diff is large: its 633 lines aren’t shown here.
This diff is large: its 57 lines aren’t shown here.
This diff is large: its 94 lines aren’t shown here.
This diff is large: its 10 lines aren’t shown here.
This diff is large: its 14 lines aren’t shown here.
This diff is large: its 37 lines aren’t shown here.
This diff is large: its 38 lines aren’t shown here.
This diff is large: its 10 lines aren’t shown here.
This diff is large: its 15 lines aren’t shown here.
This diff is large: its 15 lines aren’t shown here.
This diff is large: its 15 lines aren’t shown here.
This diff is large: its 15 lines aren’t shown here.
This diff is large: its 15 lines aren’t shown here.
This diff is large: its 25 lines aren’t shown here.
This diff is large: its 38 lines aren’t shown here.
This diff is large: its 382 lines aren’t shown here.
This diff is large: its 13 lines aren’t shown here.
This diff is large: its 25 lines aren’t shown here.
This diff is large: its 32 lines aren’t shown here.
This diff is large: its 49 lines aren’t shown here.
This diff is large: its 16 lines aren’t shown here.
This diff is large: its 10 lines aren’t shown here.
This diff is large: its 526 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 77 lines aren’t shown here.
This diff is large: its 41 lines aren’t shown here.
This diff is large: its 18 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 42 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 55 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 27 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 126 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 29 lines aren’t shown here.
This diff is large: its 489 lines aren’t shown here.
This diff is large: its 93 lines aren’t shown here.
This diff is large: its 75 lines aren’t shown here.
This diff is large: its 55 lines aren’t shown here.
This diff is large: its 144 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 21 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 147 lines aren’t shown here.
This diff is large: its 639 lines aren’t shown here.
This diff is large: its 673 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 34 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 18 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 98 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 22 lines aren’t shown here.
This diff is large: its 50 lines aren’t shown here.
This diff is large: its 41 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 18 lines aren’t shown here.
This diff is large: its 19 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 22 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 18 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 50 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 36 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 26 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 17 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 318 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 608 lines aren’t shown here.
This diff is large: its 52 lines aren’t shown here.
This diff is large: its 36 lines aren’t shown here.
This diff is large: its 223 lines aren’t shown here.
This diff is large: its 37 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 19 lines aren’t shown here.
This diff is large: its 63 lines aren’t shown here.
This diff is large: its 13 lines aren’t shown here.
This diff is large: its 30 lines aren’t shown here.
This diff is large: its 21 lines aren’t shown here.
This diff is large: its 48 lines aren’t shown here.
This diff is large: its 123 lines aren’t shown here.
This diff is large: its 63 lines aren’t shown here.
This diff is large: its 223 lines aren’t shown here.
This diff is large: its 71 lines aren’t shown here.
This diff is large: its 18 lines aren’t shown here.
This diff is large: its 148 lines aren’t shown here.
This diff is large: its 114 lines aren’t shown here.
This diff is large: its 243 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 180 lines aren’t shown here.
This diff is large: its 86 lines aren’t shown here.
This diff is large: its 54 lines aren’t shown here.
This diff is large: its 12 lines aren’t shown here.
This diff is large: its 194 lines aren’t shown here.
This diff is large: its 83 lines aren’t shown here.
This diff is large: its 56 lines aren’t shown here.
This diff is large: its 67 lines aren’t shown here.
This diff is large: its 63 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 529 lines aren’t shown here.
This diff is large: its 17 lines aren’t shown here.
This diff is large: its 17 lines aren’t shown here.
This diff is large: its 47 lines aren’t shown here.
This diff is large: its 35 lines aren’t shown here.
This diff is large: its 292 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 114 lines aren’t shown here.
This diff is large: its 465 lines aren’t shown here.
This diff is large: its 296 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 50 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 18 lines aren’t shown here.
This diff is large: its 14 lines aren’t shown here.
This diff is large: its 12 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 91 lines aren’t shown here.
This diff is large: its 57 lines aren’t shown here.
This diff is large: its 151 lines aren’t shown here.
This diff is large: its 173 lines aren’t shown here.
This diff is large: its 39 lines aren’t shown here.
This diff is large: its 27 lines aren’t shown here.
This diff is large: its 420 lines aren’t shown here.
This diff is large: its 117 lines aren’t shown here.
This diff is large: its 37 lines aren’t shown here.
This diff is large: its 8 lines aren’t shown here.
This diff is large: its 6 lines aren’t shown here.
This diff is large: its 6 lines aren’t shown here.
This diff is large: its 20 lines aren’t shown here.
This diff is large: its 89 lines aren’t shown here.
This diff is large: its 11 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 9 lines aren’t shown here.
This diff is large: its 14 lines aren’t shown here.
This diff is larger than a page shows: the files after these aren’t listed. Clone the repository to see all of it.